diff --git a/artifacts/contracts/OrionConfig.sol/OrionConfig.json b/artifacts/contracts/OrionConfig.sol/OrionConfig.json index a6258fde..153437d2 100644 --- a/artifacts/contracts/OrionConfig.sol/OrionConfig.json +++ b/artifacts/contracts/OrionConfig.sol/OrionConfig.json @@ -597,8 +597,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f5ffd5b5060405161162538038061162583398101604081905261002e91610238565b816001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61006581610165565b506001600160a01b03811661008d5760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556005805461ffff60a01b1916610e0960a01b1790556040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa1580156100f9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061011d9190610269565b6001600160a01b0382165f908152600a60205260409020805460ff191660ff929092169190911790556101516006826101b4565b5061015d6008836101b4565b505050610290565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6101c8836001600160a01b0384166101d1565b90505b92915050565b5f81815260018301602052604081205461021657508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556101cb565b505f6101cb565b80516001600160a01b0381168114610233575f5ffd5b919050565b5f5f60408385031215610249575f5ffd5b6102528361021d565b91506102606020840161021d565b90509250929050565b5f60208284031215610279575f5ffd5b815160ff81168114610289575f5ffd5b9392505050565b6113888061029d5f395ff3fe608060405234801561000f575f5ffd5b5060043610610168575f3560e01c8063015df9931461016c5780630a8b78c7146101955780631dbc3c04146101aa5780632095b01e146101bd57806323a06a1c146101d0578063348ec5c8146101e35780633a0dad8e146101f65780633af32abf146102095780633ea7fbdb1461022c57806355fba94e1461023f578063567ba713146102525780635f2483681461027857806366e87e7f14610293578063715018a6146102a65780637158da7c146102ae578063785c7cf6146102c15780637a0cb784146102ec578063849ede23146102ff5780638771de87146103125780638da5cb5b146103255780638ee573ac1461032d578063b6dfcd8b1461034f578063c30dd72714610362578063d1717c7d14610375578063d86cd44e14610389578063e0876b441461039e578063ed04f218146103b1578063edcf9c1f146103c4578063f2fde38b146103cc578063f3cc6993146103df575b5f5ffd5b60055461017f906001600160a01b031681565b60405161018c9190611121565b60405180910390f35b6101a86101a3366004611150565b6103f4565b005b6101a86101b8366004611177565b61046f565b6101a86101cb366004611150565b61052c565b6101a86101de3660046111a8565b6105a7565b60025461017f906001600160a01b031681565b60035461017f906001600160a01b031681565b61021c610217366004611150565b61077a565b604051901515815260200161018c565b6101a861023a366004611150565b61078c565b6101a861024d366004611150565b61082c565b60055461026690600160a81b900460ff1681565b60405160ff909116815260200161018c565b610280610864565b60405161ffff909116815260200161018c565b6101a86102a13660046111e8565b610874565b6101a86108f1565b60015461017f906001600160a01b031681565b6102666102cf366004611150565b6001600160a01b03165f908152600a602052604090205460ff1690565b6101a86102fa366004611177565b610904565b60045461017f906001600160a01b031681565b61021c610320366004611150565b6109e6565b61017f6109f2565b61026661033b366004611150565b600a6020525f908152604090205460ff1681565b6101a861035d366004611150565b610a00565b6101a8610370366004611150565b610b6d565b60055461026690600160a01b900460ff1681565b610391610be8565b60405161018c9190611209565b61021c6103ac366004611150565b610c9b565b6103916103bf366004611254565b610cb8565b61021c610d94565b6101a86103da366004611150565b610ea5565b60055461028090600160b01b900461ffff1681565b6103fc610ee2565b6001600160a01b0381166104235760405163d92e233d60e01b815260040160405180910390fd5b6002546001600160a01b03161561044d57604051630ea075bf60e21b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b610477610ee2565b61047f610d94565b61049c576040516312aecd8160e01b815260040160405180910390fd5b5f60018260018111156104b1576104b161126d565b036104c8576104c1600d84610f14565b90506104d6565b6104d3600b84610f14565b90505b806104f457604051631a27eac360e11b815260040160405180910390fd5b6040516001600160a01b038416907fe47da341e0fc63816c1254f1c35425f69460f49342668d11c984ea56762b00d4905f90a2505050565b610534610ee2565b6001600160a01b03811661055b5760405163d92e233d60e01b815260040160405180910390fd5b6005546001600160a01b03161561058557604051630ea075bf60e21b815260040160405180910390fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6105af610ee2565b6105b7610d94565b6105d4576040516312aecd8160e01b815260040160405180910390fd5b5f6105e0600685610f2f565b90508061060057604051630ea075bf60e21b815260040160405180910390fd5b836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561063c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106609190611281565b6001600160a01b038581165f908152600a602052604090819020805460ff191660ff949094169390931790925560055491516302707eef60e51b8152911690634e0fdde0906106b590879087906004016112a1565b5f604051808303815f87803b1580156106cc575f5ffd5b505af11580156106de573d5f5f3e3d5ffd5b50506003546040516359017aa960e01b81526001600160a01b0390911692506359017aa9915061071490879086906004016112a1565b5f604051808303815f87803b15801561072b575f5ffd5b505af115801561073d573d5f5f3e3d5ffd5b50506040516001600160a01b03871692507fdcbd8d9d0373041250f6c25b6b7aeccb3e9ff291e510ef85bb9f8ac09ceb6f6491505f90a250505050565b5f610786600683610f43565b92915050565b610794610ee2565b61079c610d94565b6107b9576040516312aecd8160e01b815260040160405180910390fd5b6001600160a01b0381166107e05760405163d92e233d60e01b815260040160405180910390fd5b6004546001600160a01b03161561080a57604051630ea075bf60e21b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b610834610ee2565b5f610840600883610f2f565b90508061086057604051630ea075bf60e21b815260040160405180910390fd5b5050565b5f61086f6006610f57565b905090565b61087c610ee2565b610884610d94565b6108a1576040516312aecd8160e01b815260040160405180910390fd5b6005805461ffff60b01b1916600160b01b61ffff84811682029290921792839055604051920416907f6c0e50288cc602be5dd504ce35358e01341e3c4f93e2e02b5a030a59bfdb84e2905f90a250565b6108f9610ee2565b6109025f610f60565b565b6004546001600160a01b0316331461092f57604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b0382166109565760405163d92e233d60e01b815260040160405180910390fd5b5f600182600181111561096b5761096b61126d565b036109825761097b600d84610f2f565b9050610990565b61098d600b84610f2f565b90505b806109ae57604051630ea075bf60e21b815260040160405180910390fd5b6040516001600160a01b038416907f9a7094a648c0524f3d62b9167886d30be0e68cf53863fe556edda348f189445a905f90a2505050565b5f610786600883610f43565b5f546001600160a01b031690565b610a08610ee2565b610a10610d94565b610a2d576040516312aecd8160e01b815260040160405180910390fd5b5f610a39600683610f14565b905080610a64578160405163751dff9760e11b8152600401610a5b9190611121565b60405180910390fd5b6001600160a01b038083165f908152600a602052604090819020805460ff191690556005549051634386017560e01b8152911690634386017590610aac908590600401611121565b5f604051808303815f87803b158015610ac3575f5ffd5b505af1158015610ad5573d5f5f3e3d5ffd5b505060035460405163841181ef60e01b81526001600160a01b03909116925063841181ef9150610b09908590600401611121565b5f604051808303815f87803b158015610b20575f5ffd5b505af1158015610b32573d5f5f3e3d5ffd5b50506040516001600160a01b03851692507f952363a786fc6f24cfb955cd6207cf91ecee3a82a7dd0bc26891ff7647b5784c91505f90a25050565b610b75610ee2565b6001600160a01b038116610b9c5760405163d92e233d60e01b815260040160405180910390fd5b6003546001600160a01b031615610bc657604051630ea075bf60e21b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b60605f610bf56006610f57565b90508061ffff166001600160401b03811115610c1357610c136112bb565b604051908082528060200260200182016040528015610c3c578160200160208202803683370190505b5091505f5b8161ffff168161ffff161015610c9657610c60600661ffff8316610faf565b838261ffff1681518110610c7657610c766112cf565b6001600160a01b0390921660209283029190910190910152600101610c41565b505090565b5f610ca7600d83610f43565b806107865750610786600b83610f43565b60605f6001836001811115610ccf57610ccf61126d565b14610cdb57600b610cde565b600d5b90505f610cea82610f57565b90505f8161ffff166001600160401b03811115610d0957610d096112bb565b604051908082528060200260200182016040528015610d32578160200160208202803683370190505b5090505f5b8261ffff168161ffff161015610d8b57610d558461ffff8316610faf565b828261ffff1681518110610d6b57610d6b6112cf565b6001600160a01b0390921660209283029190910190910152600101610d37565b50949350505050565b5f8060035f9054906101000a90046001600160a01b03166001600160a01b031663055ad42e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610de6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e0a91906112e3565b6003811115610e1b57610e1b61126d565b14801561086f5750600254604080516302ad6a1760e11b815290515f926001600160a01b03169163055ad42e9160048083019260209291908290030181865afa158015610e6a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e8e9190611301565b6004811115610e9f57610e9f61126d565b14905090565b610ead610ee2565b6001600160a01b038116610ed6575f604051631e4fbdf760e01b8152600401610a5b9190611121565b610edf81610f60565b50565b33610eeb6109f2565b6001600160a01b031614610902573360405163118cdaa760e01b8152600401610a5b9190611121565b5f610f28836001600160a01b038416610fba565b9392505050565b5f610f28836001600160a01b03841661109d565b5f610f28836001600160a01b0384166110e4565b5f610786825490565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f610f2883836110fb565b5f8181526001830160205260408120548015611094575f610fdc60018361131f565b85549091505f90610fef9060019061131f565b905080821461104e575f865f01828154811061100d5761100d6112cf565b905f5260205f200154905080875f01848154811061102d5761102d6112cf565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061105f5761105f61133e565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610786565b5f915050610786565b5f6110a883836110e4565b6110dd57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610786565b505f610786565b5f9081526001919091016020526040902054151590565b5f825f018281548110611110576111106112cf565b905f5260205f200154905092915050565b6001600160a01b0391909116815260200190565b80356001600160a01b038116811461114b575f5ffd5b919050565b5f60208284031215611160575f5ffd5b610f2882611135565b80356002811061114b575f5ffd5b5f5f60408385031215611188575f5ffd5b61119183611135565b915061119f60208401611169565b90509250929050565b5f5f5f606084860312156111ba575f5ffd5b6111c384611135565b92506111d160208501611135565b91506111df60408501611135565b90509250925092565b5f602082840312156111f8575f5ffd5b813561ffff81168114610f28575f5ffd5b602080825282518282018190525f918401906040840190835b818110156112495783516001600160a01b0316835260209384019390920191600101611222565b509095945050505050565b5f60208284031215611264575f5ffd5b610f2882611169565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215611291575f5ffd5b815160ff81168114610f28575f5ffd5b6001600160a01b0392831681529116602082015260400190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156112f3575f5ffd5b815160048110610f28575f5ffd5b5f60208284031215611311575f5ffd5b815160058110610f28575f5ffd5b8181038181111561078657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea26469706673582212204dc23679a7cc2198ac36e311131fbce254a13fdb4f8938e8abd60064c4003add64736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610168575f3560e01c8063015df9931461016c5780630a8b78c7146101955780631dbc3c04146101aa5780632095b01e146101bd57806323a06a1c146101d0578063348ec5c8146101e35780633a0dad8e146101f65780633af32abf146102095780633ea7fbdb1461022c57806355fba94e1461023f578063567ba713146102525780635f2483681461027857806366e87e7f14610293578063715018a6146102a65780637158da7c146102ae578063785c7cf6146102c15780637a0cb784146102ec578063849ede23146102ff5780638771de87146103125780638da5cb5b146103255780638ee573ac1461032d578063b6dfcd8b1461034f578063c30dd72714610362578063d1717c7d14610375578063d86cd44e14610389578063e0876b441461039e578063ed04f218146103b1578063edcf9c1f146103c4578063f2fde38b146103cc578063f3cc6993146103df575b5f5ffd5b60055461017f906001600160a01b031681565b60405161018c9190611121565b60405180910390f35b6101a86101a3366004611150565b6103f4565b005b6101a86101b8366004611177565b61046f565b6101a86101cb366004611150565b61052c565b6101a86101de3660046111a8565b6105a7565b60025461017f906001600160a01b031681565b60035461017f906001600160a01b031681565b61021c610217366004611150565b61077a565b604051901515815260200161018c565b6101a861023a366004611150565b61078c565b6101a861024d366004611150565b61082c565b60055461026690600160a81b900460ff1681565b60405160ff909116815260200161018c565b610280610864565b60405161ffff909116815260200161018c565b6101a86102a13660046111e8565b610874565b6101a86108f1565b60015461017f906001600160a01b031681565b6102666102cf366004611150565b6001600160a01b03165f908152600a602052604090205460ff1690565b6101a86102fa366004611177565b610904565b60045461017f906001600160a01b031681565b61021c610320366004611150565b6109e6565b61017f6109f2565b61026661033b366004611150565b600a6020525f908152604090205460ff1681565b6101a861035d366004611150565b610a00565b6101a8610370366004611150565b610b6d565b60055461026690600160a01b900460ff1681565b610391610be8565b60405161018c9190611209565b61021c6103ac366004611150565b610c9b565b6103916103bf366004611254565b610cb8565b61021c610d94565b6101a86103da366004611150565b610ea5565b60055461028090600160b01b900461ffff1681565b6103fc610ee2565b6001600160a01b0381166104235760405163d92e233d60e01b815260040160405180910390fd5b6002546001600160a01b03161561044d57604051630ea075bf60e21b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b610477610ee2565b61047f610d94565b61049c576040516312aecd8160e01b815260040160405180910390fd5b5f60018260018111156104b1576104b161126d565b036104c8576104c1600d84610f14565b90506104d6565b6104d3600b84610f14565b90505b806104f457604051631a27eac360e11b815260040160405180910390fd5b6040516001600160a01b038416907fe47da341e0fc63816c1254f1c35425f69460f49342668d11c984ea56762b00d4905f90a2505050565b610534610ee2565b6001600160a01b03811661055b5760405163d92e233d60e01b815260040160405180910390fd5b6005546001600160a01b03161561058557604051630ea075bf60e21b815260040160405180910390fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6105af610ee2565b6105b7610d94565b6105d4576040516312aecd8160e01b815260040160405180910390fd5b5f6105e0600685610f2f565b90508061060057604051630ea075bf60e21b815260040160405180910390fd5b836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561063c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106609190611281565b6001600160a01b038581165f908152600a602052604090819020805460ff191660ff949094169390931790925560055491516302707eef60e51b8152911690634e0fdde0906106b590879087906004016112a1565b5f604051808303815f87803b1580156106cc575f5ffd5b505af11580156106de573d5f5f3e3d5ffd5b50506003546040516359017aa960e01b81526001600160a01b0390911692506359017aa9915061071490879086906004016112a1565b5f604051808303815f87803b15801561072b575f5ffd5b505af115801561073d573d5f5f3e3d5ffd5b50506040516001600160a01b03871692507fdcbd8d9d0373041250f6c25b6b7aeccb3e9ff291e510ef85bb9f8ac09ceb6f6491505f90a250505050565b5f610786600683610f43565b92915050565b610794610ee2565b61079c610d94565b6107b9576040516312aecd8160e01b815260040160405180910390fd5b6001600160a01b0381166107e05760405163d92e233d60e01b815260040160405180910390fd5b6004546001600160a01b03161561080a57604051630ea075bf60e21b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b610834610ee2565b5f610840600883610f2f565b90508061086057604051630ea075bf60e21b815260040160405180910390fd5b5050565b5f61086f6006610f57565b905090565b61087c610ee2565b610884610d94565b6108a1576040516312aecd8160e01b815260040160405180910390fd5b6005805461ffff60b01b1916600160b01b61ffff84811682029290921792839055604051920416907f6c0e50288cc602be5dd504ce35358e01341e3c4f93e2e02b5a030a59bfdb84e2905f90a250565b6108f9610ee2565b6109025f610f60565b565b6004546001600160a01b0316331461092f57604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b0382166109565760405163d92e233d60e01b815260040160405180910390fd5b5f600182600181111561096b5761096b61126d565b036109825761097b600d84610f2f565b9050610990565b61098d600b84610f2f565b90505b806109ae57604051630ea075bf60e21b815260040160405180910390fd5b6040516001600160a01b038416907f9a7094a648c0524f3d62b9167886d30be0e68cf53863fe556edda348f189445a905f90a2505050565b5f610786600883610f43565b5f546001600160a01b031690565b610a08610ee2565b610a10610d94565b610a2d576040516312aecd8160e01b815260040160405180910390fd5b5f610a39600683610f14565b905080610a64578160405163751dff9760e11b8152600401610a5b9190611121565b60405180910390fd5b6001600160a01b038083165f908152600a602052604090819020805460ff191690556005549051634386017560e01b8152911690634386017590610aac908590600401611121565b5f604051808303815f87803b158015610ac3575f5ffd5b505af1158015610ad5573d5f5f3e3d5ffd5b505060035460405163841181ef60e01b81526001600160a01b03909116925063841181ef9150610b09908590600401611121565b5f604051808303815f87803b158015610b20575f5ffd5b505af1158015610b32573d5f5f3e3d5ffd5b50506040516001600160a01b03851692507f952363a786fc6f24cfb955cd6207cf91ecee3a82a7dd0bc26891ff7647b5784c91505f90a25050565b610b75610ee2565b6001600160a01b038116610b9c5760405163d92e233d60e01b815260040160405180910390fd5b6003546001600160a01b031615610bc657604051630ea075bf60e21b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b60605f610bf56006610f57565b90508061ffff166001600160401b03811115610c1357610c136112bb565b604051908082528060200260200182016040528015610c3c578160200160208202803683370190505b5091505f5b8161ffff168161ffff161015610c9657610c60600661ffff8316610faf565b838261ffff1681518110610c7657610c766112cf565b6001600160a01b0390921660209283029190910190910152600101610c41565b505090565b5f610ca7600d83610f43565b806107865750610786600b83610f43565b60605f6001836001811115610ccf57610ccf61126d565b14610cdb57600b610cde565b600d5b90505f610cea82610f57565b90505f8161ffff166001600160401b03811115610d0957610d096112bb565b604051908082528060200260200182016040528015610d32578160200160208202803683370190505b5090505f5b8261ffff168161ffff161015610d8b57610d558461ffff8316610faf565b828261ffff1681518110610d6b57610d6b6112cf565b6001600160a01b0390921660209283029190910190910152600101610d37565b50949350505050565b5f8060035f9054906101000a90046001600160a01b03166001600160a01b031663055ad42e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610de6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e0a91906112e3565b6003811115610e1b57610e1b61126d565b14801561086f5750600254604080516302ad6a1760e11b815290515f926001600160a01b03169163055ad42e9160048083019260209291908290030181865afa158015610e6a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e8e9190611301565b6004811115610e9f57610e9f61126d565b14905090565b610ead610ee2565b6001600160a01b038116610ed6575f604051631e4fbdf760e01b8152600401610a5b9190611121565b610edf81610f60565b50565b33610eeb6109f2565b6001600160a01b031614610902573360405163118cdaa760e01b8152600401610a5b9190611121565b5f610f28836001600160a01b038416610fba565b9392505050565b5f610f28836001600160a01b03841661109d565b5f610f28836001600160a01b0384166110e4565b5f610786825490565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f610f2883836110fb565b5f8181526001830160205260408120548015611094575f610fdc60018361131f565b85549091505f90610fef9060019061131f565b905080821461104e575f865f01828154811061100d5761100d6112cf565b905f5260205f200154905080875f01848154811061102d5761102d6112cf565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061105f5761105f61133e565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610786565b5f915050610786565b5f6110a883836110e4565b6110dd57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610786565b505f610786565b5f9081526001919091016020526040902054151590565b5f825f018281548110611110576111106112cf565b905f5260205f200154905092915050565b6001600160a01b0391909116815260200190565b80356001600160a01b038116811461114b575f5ffd5b919050565b5f60208284031215611160575f5ffd5b610f2882611135565b80356002811061114b575f5ffd5b5f5f60408385031215611188575f5ffd5b61119183611135565b915061119f60208401611169565b90509250929050565b5f5f5f606084860312156111ba575f5ffd5b6111c384611135565b92506111d160208501611135565b91506111df60408501611135565b90509250925092565b5f602082840312156111f8575f5ffd5b813561ffff81168114610f28575f5ffd5b602080825282518282018190525f918401906040840190835b818110156112495783516001600160a01b0316835260209384019390920191600101611222565b509095945050505050565b5f60208284031215611264575f5ffd5b610f2882611169565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215611291575f5ffd5b815160ff81168114610f28575f5ffd5b6001600160a01b0392831681529116602082015260400190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156112f3575f5ffd5b815160048110610f28575f5ffd5b5f60208284031215611311575f5ffd5b815160058110610f28575f5ffd5b8181038181111561078657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea26469706673582212204dc23679a7cc2198ac36e311131fbce254a13fdb4f8938e8abd60064c4003add64736f6c634300081c0033", + "bytecode": "0x608060405234801561000f575f5ffd5b5060405161162538038061162583398101604081905261002e91610238565b816001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61006581610165565b506001600160a01b03811661008d5760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556005805461ffff60a01b1916610e0960a01b1790556040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa1580156100f9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061011d9190610269565b6001600160a01b0382165f908152600a60205260409020805460ff191660ff929092169190911790556101516006826101b4565b5061015d6008836101b4565b505050610290565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6101c8836001600160a01b0384166101d1565b90505b92915050565b5f81815260018301602052604081205461021657508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556101cb565b505f6101cb565b80516001600160a01b0381168114610233575f5ffd5b919050565b5f5f60408385031215610249575f5ffd5b6102528361021d565b91506102606020840161021d565b90509250929050565b5f60208284031215610279575f5ffd5b815160ff81168114610289575f5ffd5b9392505050565b6113888061029d5f395ff3fe608060405234801561000f575f5ffd5b5060043610610168575f3560e01c8063015df9931461016c5780630a8b78c7146101955780631dbc3c04146101aa5780632095b01e146101bd57806323a06a1c146101d0578063348ec5c8146101e35780633a0dad8e146101f65780633af32abf146102095780633ea7fbdb1461022c57806355fba94e1461023f578063567ba713146102525780635f2483681461027857806366e87e7f14610293578063715018a6146102a65780637158da7c146102ae578063785c7cf6146102c15780637a0cb784146102ec578063849ede23146102ff5780638771de87146103125780638da5cb5b146103255780638ee573ac1461032d578063b6dfcd8b1461034f578063c30dd72714610362578063d1717c7d14610375578063d86cd44e14610389578063e0876b441461039e578063ed04f218146103b1578063edcf9c1f146103c4578063f2fde38b146103cc578063f3cc6993146103df575b5f5ffd5b60055461017f906001600160a01b031681565b60405161018c9190611121565b60405180910390f35b6101a86101a3366004611150565b6103f4565b005b6101a86101b8366004611177565b61046f565b6101a86101cb366004611150565b61052c565b6101a86101de3660046111a8565b6105a7565b60025461017f906001600160a01b031681565b60035461017f906001600160a01b031681565b61021c610217366004611150565b61077a565b604051901515815260200161018c565b6101a861023a366004611150565b61078c565b6101a861024d366004611150565b61082c565b60055461026690600160a81b900460ff1681565b60405160ff909116815260200161018c565b610280610864565b60405161ffff909116815260200161018c565b6101a86102a13660046111e8565b610874565b6101a86108f1565b60015461017f906001600160a01b031681565b6102666102cf366004611150565b6001600160a01b03165f908152600a602052604090205460ff1690565b6101a86102fa366004611177565b610904565b60045461017f906001600160a01b031681565b61021c610320366004611150565b6109e6565b61017f6109f2565b61026661033b366004611150565b600a6020525f908152604090205460ff1681565b6101a861035d366004611150565b610a00565b6101a8610370366004611150565b610b6d565b60055461026690600160a01b900460ff1681565b610391610be8565b60405161018c9190611209565b61021c6103ac366004611150565b610c9b565b6103916103bf366004611254565b610cb8565b61021c610d94565b6101a86103da366004611150565b610ea5565b60055461028090600160b01b900461ffff1681565b6103fc610ee2565b6001600160a01b0381166104235760405163d92e233d60e01b815260040160405180910390fd5b6002546001600160a01b03161561044d57604051630ea075bf60e21b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b610477610ee2565b61047f610d94565b61049c576040516312aecd8160e01b815260040160405180910390fd5b5f60018260018111156104b1576104b161126d565b036104c8576104c1600d84610f14565b90506104d6565b6104d3600b84610f14565b90505b806104f457604051631a27eac360e11b815260040160405180910390fd5b6040516001600160a01b038416907fe47da341e0fc63816c1254f1c35425f69460f49342668d11c984ea56762b00d4905f90a2505050565b610534610ee2565b6001600160a01b03811661055b5760405163d92e233d60e01b815260040160405180910390fd5b6005546001600160a01b03161561058557604051630ea075bf60e21b815260040160405180910390fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6105af610ee2565b6105b7610d94565b6105d4576040516312aecd8160e01b815260040160405180910390fd5b5f6105e0600685610f2f565b90508061060057604051630ea075bf60e21b815260040160405180910390fd5b836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561063c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106609190611281565b6001600160a01b038581165f908152600a602052604090819020805460ff191660ff949094169390931790925560055491516302707eef60e51b8152911690634e0fdde0906106b590879087906004016112a1565b5f604051808303815f87803b1580156106cc575f5ffd5b505af11580156106de573d5f5f3e3d5ffd5b50506003546040516359017aa960e01b81526001600160a01b0390911692506359017aa9915061071490879086906004016112a1565b5f604051808303815f87803b15801561072b575f5ffd5b505af115801561073d573d5f5f3e3d5ffd5b50506040516001600160a01b03871692507fdcbd8d9d0373041250f6c25b6b7aeccb3e9ff291e510ef85bb9f8ac09ceb6f6491505f90a250505050565b5f610786600683610f43565b92915050565b610794610ee2565b61079c610d94565b6107b9576040516312aecd8160e01b815260040160405180910390fd5b6001600160a01b0381166107e05760405163d92e233d60e01b815260040160405180910390fd5b6004546001600160a01b03161561080a57604051630ea075bf60e21b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b610834610ee2565b5f610840600883610f2f565b90508061086057604051630ea075bf60e21b815260040160405180910390fd5b5050565b5f61086f6006610f57565b905090565b61087c610ee2565b610884610d94565b6108a1576040516312aecd8160e01b815260040160405180910390fd5b6005805461ffff60b01b1916600160b01b61ffff84811682029290921792839055604051920416907f6c0e50288cc602be5dd504ce35358e01341e3c4f93e2e02b5a030a59bfdb84e2905f90a250565b6108f9610ee2565b6109025f610f60565b565b6004546001600160a01b0316331461092f57604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b0382166109565760405163d92e233d60e01b815260040160405180910390fd5b5f600182600181111561096b5761096b61126d565b036109825761097b600d84610f2f565b9050610990565b61098d600b84610f2f565b90505b806109ae57604051630ea075bf60e21b815260040160405180910390fd5b6040516001600160a01b038416907f9a7094a648c0524f3d62b9167886d30be0e68cf53863fe556edda348f189445a905f90a2505050565b5f610786600883610f43565b5f546001600160a01b031690565b610a08610ee2565b610a10610d94565b610a2d576040516312aecd8160e01b815260040160405180910390fd5b5f610a39600683610f14565b905080610a64578160405163751dff9760e11b8152600401610a5b9190611121565b60405180910390fd5b6001600160a01b038083165f908152600a602052604090819020805460ff191690556005549051634386017560e01b8152911690634386017590610aac908590600401611121565b5f604051808303815f87803b158015610ac3575f5ffd5b505af1158015610ad5573d5f5f3e3d5ffd5b505060035460405163841181ef60e01b81526001600160a01b03909116925063841181ef9150610b09908590600401611121565b5f604051808303815f87803b158015610b20575f5ffd5b505af1158015610b32573d5f5f3e3d5ffd5b50506040516001600160a01b03851692507f952363a786fc6f24cfb955cd6207cf91ecee3a82a7dd0bc26891ff7647b5784c91505f90a25050565b610b75610ee2565b6001600160a01b038116610b9c5760405163d92e233d60e01b815260040160405180910390fd5b6003546001600160a01b031615610bc657604051630ea075bf60e21b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b60605f610bf56006610f57565b90508061ffff166001600160401b03811115610c1357610c136112bb565b604051908082528060200260200182016040528015610c3c578160200160208202803683370190505b5091505f5b8161ffff168161ffff161015610c9657610c60600661ffff8316610faf565b838261ffff1681518110610c7657610c766112cf565b6001600160a01b0390921660209283029190910190910152600101610c41565b505090565b5f610ca7600d83610f43565b806107865750610786600b83610f43565b60605f6001836001811115610ccf57610ccf61126d565b14610cdb57600b610cde565b600d5b90505f610cea82610f57565b90505f8161ffff166001600160401b03811115610d0957610d096112bb565b604051908082528060200260200182016040528015610d32578160200160208202803683370190505b5090505f5b8261ffff168161ffff161015610d8b57610d558461ffff8316610faf565b828261ffff1681518110610d6b57610d6b6112cf565b6001600160a01b0390921660209283029190910190910152600101610d37565b50949350505050565b5f8060035f9054906101000a90046001600160a01b03166001600160a01b031663055ad42e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610de6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e0a91906112e3565b6003811115610e1b57610e1b61126d565b14801561086f5750600254604080516302ad6a1760e11b815290515f926001600160a01b03169163055ad42e9160048083019260209291908290030181865afa158015610e6a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e8e9190611301565b6004811115610e9f57610e9f61126d565b14905090565b610ead610ee2565b6001600160a01b038116610ed6575f604051631e4fbdf760e01b8152600401610a5b9190611121565b610edf81610f60565b50565b33610eeb6109f2565b6001600160a01b031614610902573360405163118cdaa760e01b8152600401610a5b9190611121565b5f610f28836001600160a01b038416610fba565b9392505050565b5f610f28836001600160a01b03841661109d565b5f610f28836001600160a01b0384166110e4565b5f610786825490565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f610f2883836110fb565b5f8181526001830160205260408120548015611094575f610fdc60018361131f565b85549091505f90610fef9060019061131f565b905080821461104e575f865f01828154811061100d5761100d6112cf565b905f5260205f200154905080875f01848154811061102d5761102d6112cf565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061105f5761105f61133e565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610786565b5f915050610786565b5f6110a883836110e4565b6110dd57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610786565b505f610786565b5f9081526001919091016020526040902054151590565b5f825f018281548110611110576111106112cf565b905f5260205f200154905092915050565b6001600160a01b0391909116815260200190565b80356001600160a01b038116811461114b575f5ffd5b919050565b5f60208284031215611160575f5ffd5b610f2882611135565b80356002811061114b575f5ffd5b5f5f60408385031215611188575f5ffd5b61119183611135565b915061119f60208401611169565b90509250929050565b5f5f5f606084860312156111ba575f5ffd5b6111c384611135565b92506111d160208501611135565b91506111df60408501611135565b90509250925092565b5f602082840312156111f8575f5ffd5b813561ffff81168114610f28575f5ffd5b602080825282518282018190525f918401906040840190835b818110156112495783516001600160a01b0316835260209384019390920191600101611222565b509095945050505050565b5f60208284031215611264575f5ffd5b610f2882611169565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215611291575f5ffd5b815160ff81168114610f28575f5ffd5b6001600160a01b0392831681529116602082015260400190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156112f3575f5ffd5b815160048110610f28575f5ffd5b5f60208284031215611311575f5ffd5b815160058110610f28575f5ffd5b8181038181111561078657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea264697066735822122051d75bf3dc9d818597836675fcd8e425d2f09d6baec91a08658e6124de8da44f64736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610168575f3560e01c8063015df9931461016c5780630a8b78c7146101955780631dbc3c04146101aa5780632095b01e146101bd57806323a06a1c146101d0578063348ec5c8146101e35780633a0dad8e146101f65780633af32abf146102095780633ea7fbdb1461022c57806355fba94e1461023f578063567ba713146102525780635f2483681461027857806366e87e7f14610293578063715018a6146102a65780637158da7c146102ae578063785c7cf6146102c15780637a0cb784146102ec578063849ede23146102ff5780638771de87146103125780638da5cb5b146103255780638ee573ac1461032d578063b6dfcd8b1461034f578063c30dd72714610362578063d1717c7d14610375578063d86cd44e14610389578063e0876b441461039e578063ed04f218146103b1578063edcf9c1f146103c4578063f2fde38b146103cc578063f3cc6993146103df575b5f5ffd5b60055461017f906001600160a01b031681565b60405161018c9190611121565b60405180910390f35b6101a86101a3366004611150565b6103f4565b005b6101a86101b8366004611177565b61046f565b6101a86101cb366004611150565b61052c565b6101a86101de3660046111a8565b6105a7565b60025461017f906001600160a01b031681565b60035461017f906001600160a01b031681565b61021c610217366004611150565b61077a565b604051901515815260200161018c565b6101a861023a366004611150565b61078c565b6101a861024d366004611150565b61082c565b60055461026690600160a81b900460ff1681565b60405160ff909116815260200161018c565b610280610864565b60405161ffff909116815260200161018c565b6101a86102a13660046111e8565b610874565b6101a86108f1565b60015461017f906001600160a01b031681565b6102666102cf366004611150565b6001600160a01b03165f908152600a602052604090205460ff1690565b6101a86102fa366004611177565b610904565b60045461017f906001600160a01b031681565b61021c610320366004611150565b6109e6565b61017f6109f2565b61026661033b366004611150565b600a6020525f908152604090205460ff1681565b6101a861035d366004611150565b610a00565b6101a8610370366004611150565b610b6d565b60055461026690600160a01b900460ff1681565b610391610be8565b60405161018c9190611209565b61021c6103ac366004611150565b610c9b565b6103916103bf366004611254565b610cb8565b61021c610d94565b6101a86103da366004611150565b610ea5565b60055461028090600160b01b900461ffff1681565b6103fc610ee2565b6001600160a01b0381166104235760405163d92e233d60e01b815260040160405180910390fd5b6002546001600160a01b03161561044d57604051630ea075bf60e21b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b610477610ee2565b61047f610d94565b61049c576040516312aecd8160e01b815260040160405180910390fd5b5f60018260018111156104b1576104b161126d565b036104c8576104c1600d84610f14565b90506104d6565b6104d3600b84610f14565b90505b806104f457604051631a27eac360e11b815260040160405180910390fd5b6040516001600160a01b038416907fe47da341e0fc63816c1254f1c35425f69460f49342668d11c984ea56762b00d4905f90a2505050565b610534610ee2565b6001600160a01b03811661055b5760405163d92e233d60e01b815260040160405180910390fd5b6005546001600160a01b03161561058557604051630ea075bf60e21b815260040160405180910390fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6105af610ee2565b6105b7610d94565b6105d4576040516312aecd8160e01b815260040160405180910390fd5b5f6105e0600685610f2f565b90508061060057604051630ea075bf60e21b815260040160405180910390fd5b836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561063c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106609190611281565b6001600160a01b038581165f908152600a602052604090819020805460ff191660ff949094169390931790925560055491516302707eef60e51b8152911690634e0fdde0906106b590879087906004016112a1565b5f604051808303815f87803b1580156106cc575f5ffd5b505af11580156106de573d5f5f3e3d5ffd5b50506003546040516359017aa960e01b81526001600160a01b0390911692506359017aa9915061071490879086906004016112a1565b5f604051808303815f87803b15801561072b575f5ffd5b505af115801561073d573d5f5f3e3d5ffd5b50506040516001600160a01b03871692507fdcbd8d9d0373041250f6c25b6b7aeccb3e9ff291e510ef85bb9f8ac09ceb6f6491505f90a250505050565b5f610786600683610f43565b92915050565b610794610ee2565b61079c610d94565b6107b9576040516312aecd8160e01b815260040160405180910390fd5b6001600160a01b0381166107e05760405163d92e233d60e01b815260040160405180910390fd5b6004546001600160a01b03161561080a57604051630ea075bf60e21b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b610834610ee2565b5f610840600883610f2f565b90508061086057604051630ea075bf60e21b815260040160405180910390fd5b5050565b5f61086f6006610f57565b905090565b61087c610ee2565b610884610d94565b6108a1576040516312aecd8160e01b815260040160405180910390fd5b6005805461ffff60b01b1916600160b01b61ffff84811682029290921792839055604051920416907f6c0e50288cc602be5dd504ce35358e01341e3c4f93e2e02b5a030a59bfdb84e2905f90a250565b6108f9610ee2565b6109025f610f60565b565b6004546001600160a01b0316331461092f57604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b0382166109565760405163d92e233d60e01b815260040160405180910390fd5b5f600182600181111561096b5761096b61126d565b036109825761097b600d84610f2f565b9050610990565b61098d600b84610f2f565b90505b806109ae57604051630ea075bf60e21b815260040160405180910390fd5b6040516001600160a01b038416907f9a7094a648c0524f3d62b9167886d30be0e68cf53863fe556edda348f189445a905f90a2505050565b5f610786600883610f43565b5f546001600160a01b031690565b610a08610ee2565b610a10610d94565b610a2d576040516312aecd8160e01b815260040160405180910390fd5b5f610a39600683610f14565b905080610a64578160405163751dff9760e11b8152600401610a5b9190611121565b60405180910390fd5b6001600160a01b038083165f908152600a602052604090819020805460ff191690556005549051634386017560e01b8152911690634386017590610aac908590600401611121565b5f604051808303815f87803b158015610ac3575f5ffd5b505af1158015610ad5573d5f5f3e3d5ffd5b505060035460405163841181ef60e01b81526001600160a01b03909116925063841181ef9150610b09908590600401611121565b5f604051808303815f87803b158015610b20575f5ffd5b505af1158015610b32573d5f5f3e3d5ffd5b50506040516001600160a01b03851692507f952363a786fc6f24cfb955cd6207cf91ecee3a82a7dd0bc26891ff7647b5784c91505f90a25050565b610b75610ee2565b6001600160a01b038116610b9c5760405163d92e233d60e01b815260040160405180910390fd5b6003546001600160a01b031615610bc657604051630ea075bf60e21b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b60605f610bf56006610f57565b90508061ffff166001600160401b03811115610c1357610c136112bb565b604051908082528060200260200182016040528015610c3c578160200160208202803683370190505b5091505f5b8161ffff168161ffff161015610c9657610c60600661ffff8316610faf565b838261ffff1681518110610c7657610c766112cf565b6001600160a01b0390921660209283029190910190910152600101610c41565b505090565b5f610ca7600d83610f43565b806107865750610786600b83610f43565b60605f6001836001811115610ccf57610ccf61126d565b14610cdb57600b610cde565b600d5b90505f610cea82610f57565b90505f8161ffff166001600160401b03811115610d0957610d096112bb565b604051908082528060200260200182016040528015610d32578160200160208202803683370190505b5090505f5b8261ffff168161ffff161015610d8b57610d558461ffff8316610faf565b828261ffff1681518110610d6b57610d6b6112cf565b6001600160a01b0390921660209283029190910190910152600101610d37565b50949350505050565b5f8060035f9054906101000a90046001600160a01b03166001600160a01b031663055ad42e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610de6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e0a91906112e3565b6003811115610e1b57610e1b61126d565b14801561086f5750600254604080516302ad6a1760e11b815290515f926001600160a01b03169163055ad42e9160048083019260209291908290030181865afa158015610e6a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e8e9190611301565b6004811115610e9f57610e9f61126d565b14905090565b610ead610ee2565b6001600160a01b038116610ed6575f604051631e4fbdf760e01b8152600401610a5b9190611121565b610edf81610f60565b50565b33610eeb6109f2565b6001600160a01b031614610902573360405163118cdaa760e01b8152600401610a5b9190611121565b5f610f28836001600160a01b038416610fba565b9392505050565b5f610f28836001600160a01b03841661109d565b5f610f28836001600160a01b0384166110e4565b5f610786825490565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f610f2883836110fb565b5f8181526001830160205260408120548015611094575f610fdc60018361131f565b85549091505f90610fef9060019061131f565b905080821461104e575f865f01828154811061100d5761100d6112cf565b905f5260205f200154905080875f01848154811061102d5761102d6112cf565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061105f5761105f61133e565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610786565b5f915050610786565b5f6110a883836110e4565b6110dd57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610786565b505f610786565b5f9081526001919091016020526040902054151590565b5f825f018281548110611110576111106112cf565b905f5260205f200154905092915050565b6001600160a01b0391909116815260200190565b80356001600160a01b038116811461114b575f5ffd5b919050565b5f60208284031215611160575f5ffd5b610f2882611135565b80356002811061114b575f5ffd5b5f5f60408385031215611188575f5ffd5b61119183611135565b915061119f60208401611169565b90509250929050565b5f5f5f606084860312156111ba575f5ffd5b6111c384611135565b92506111d160208501611135565b91506111df60408501611135565b90509250925092565b5f602082840312156111f8575f5ffd5b813561ffff81168114610f28575f5ffd5b602080825282518282018190525f918401906040840190835b818110156112495783516001600160a01b0316835260209384019390920191600101611222565b509095945050505050565b5f60208284031215611264575f5ffd5b610f2882611169565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215611291575f5ffd5b815160ff81168114610f28575f5ffd5b6001600160a01b0392831681529116602082015260400190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156112f3575f5ffd5b815160048110610f28575f5ffd5b5f60208284031215611311575f5ffd5b815160058110610f28575f5ffd5b8181038181111561078657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea264697066735822122051d75bf3dc9d818597836675fcd8e425d2f09d6baec91a08658e6124de8da44f64736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/execution/OrionAssetERC4626ExecutionAdapter.sol/OrionAssetERC4626ExecutionAdapter.json b/artifacts/contracts/execution/OrionAssetERC4626ExecutionAdapter.sol/OrionAssetERC4626ExecutionAdapter.json index 5d65e494..a5173f48 100644 --- a/artifacts/contracts/execution/OrionAssetERC4626ExecutionAdapter.sol/OrionAssetERC4626ExecutionAdapter.json +++ b/artifacts/contracts/execution/OrionAssetERC4626ExecutionAdapter.sol/OrionAssetERC4626ExecutionAdapter.json @@ -27,7 +27,7 @@ }, { "inputs": [], - "name": "InvalidAddress", + "name": "InvalidAdapter", "type": "error" }, { @@ -155,10 +155,23 @@ ], "stateMutability": "view", "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "validateExecutionAdapter", + "outputs": [], + "stateMutability": "view", + "type": "function" } ], - "bytecode": "0x608060405234801561000f575f5ffd5b5060405161098f38038061098f83398101604081905261002e9161019b565b6001600160a01b0381166100555760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b03831690811790915560408051631c56369f60e21b81529051637158da7c916004808201926020929091908290030181865afa1580156100ab573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100cf919061019b565b600180546001600160a01b039283166001600160a01b031991821681179092556002805490911690911790555f5460408051631d06d6c760e11b815290519190921691633a0dad8e9160048083019260209291908290030181865afa15801561013a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061015e919061019b565b600380546001600160a01b0319166001600160a01b0392909216919091179055506101bd565b6001600160a01b0381168114610198575f5ffd5b50565b5f602082840312156101ab575f5ffd5b81516101b681610184565b9392505050565b6107c5806101ca5f395ff3fe608060405234801561000f575f5ffd5b5060043610610060575f3560e01c80633a0dad8e146100645780636c197ff51461008d5780637158da7c146100ae57806379502c55146100c1578063ad071f00146100d3578063cce7ec13146100e6575b5f5ffd5b600354610077906001600160a01b031681565b60405161008491906106c9565b60405180910390f35b6100a061009b3660046106f4565b6100f9565b604051908152602001610084565b600154610077906001600160a01b031681565b5f54610077906001600160a01b031681565b600254610077906001600160a01b031681565b6100a06100f43660046106f4565b610276565b6003545f906001600160a01b0316331461012657604051631a27eac360e11b815260040160405180910390fd5b826001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610180575060408051601f3d908101601f1916820190925261017d9181019061071e565b60015b61019d5760405163e6c4247b60e01b815260040160405180910390fd5b6001546001600160a01b038281169116146101cb5760405163e6c4247b60e01b815260040160405180910390fd5b50815f036101f75782604051636b30633560e01b81526004016101ee91906106c9565b60405180910390fd5b604051635d043b2960e11b8152600481018390523360248201819052604482015283906001600160a01b0382169063ba087652906064016020604051808303815f875af115801561024a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061026e9190610740565b949350505050565b6003545f906001600160a01b031633146102a357604051631a27eac360e11b815260040160405180910390fd5b826001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156102fd575060408051601f3d908101601f191682019092526102fa9181019061071e565b60015b61031a5760405163e6c4247b60e01b815260040160405180910390fd5b6001546001600160a01b038281169116146103485760405163e6c4247b60e01b815260040160405180910390fd5b50815f0361036b5782604051636b30633560e01b81526004016101ee91906106c9565b60405163b3d7f6b960e01b81526004810183905283906001600160a01b0382169063b3d7f6b990602401602060405180830381865afa1580156103b0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103d49190610740565b6002549092506103ef906001600160a01b0316333085610524565b600254610406906001600160a01b03168584610591565b604051636e553f6560e01b8152600481018390523060248201526001600160a01b03821690636e553f65906044016020604051808303815f875af1158015610450573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104749190610740565b5060025461048c906001600160a01b0316855f610591565b60405163a9059cbb60e01b81525f906001600160a01b0383169063a9059cbb906104bc9033908890600401610757565b6020604051808303815f875af11580156104d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fc9190610770565b90508061051c576040516312171d8360e31b815260040160405180910390fd5b505092915050565b6040516001600160a01b03848116602483015283811660448301526064820183905261058b9186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061061d565b50505050565b5f836001600160a01b031663095ea7b384846040516024016105b4929190610757565b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505090506105ed8482610680565b61058b5761061784856001600160a01b031663095ea7b3865f604051602401610559929190610757565b61058b84825b5f5f60205f8451602086015f885af18061063c576040513d5f823e3d81fd5b50505f513d91508115610653578060011415610660565b6001600160a01b0384163b155b1561058b5783604051635274afe760e01b81526004016101ee91906106c9565b5f5f5f5f60205f8651602088015f8a5af192503d91505f5190508280156106bf575081156106b157806001146106bf565b5f866001600160a01b03163b115b9695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146106f1575f5ffd5b50565b5f5f60408385031215610705575f5ffd5b8235610710816106dd565b946020939093013593505050565b5f6020828403121561072e575f5ffd5b8151610739816106dd565b9392505050565b5f60208284031215610750575f5ffd5b5051919050565b6001600160a01b03929092168252602082015260400190565b5f60208284031215610780575f5ffd5b81518015158114610739575f5ffdfea2646970667358221220c70ca0d5ebb3a797b3fe0d1d4ed70d5476868585f8373c2ca89aad2638323f3964736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610060575f3560e01c80633a0dad8e146100645780636c197ff51461008d5780637158da7c146100ae57806379502c55146100c1578063ad071f00146100d3578063cce7ec13146100e6575b5f5ffd5b600354610077906001600160a01b031681565b60405161008491906106c9565b60405180910390f35b6100a061009b3660046106f4565b6100f9565b604051908152602001610084565b600154610077906001600160a01b031681565b5f54610077906001600160a01b031681565b600254610077906001600160a01b031681565b6100a06100f43660046106f4565b610276565b6003545f906001600160a01b0316331461012657604051631a27eac360e11b815260040160405180910390fd5b826001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610180575060408051601f3d908101601f1916820190925261017d9181019061071e565b60015b61019d5760405163e6c4247b60e01b815260040160405180910390fd5b6001546001600160a01b038281169116146101cb5760405163e6c4247b60e01b815260040160405180910390fd5b50815f036101f75782604051636b30633560e01b81526004016101ee91906106c9565b60405180910390fd5b604051635d043b2960e11b8152600481018390523360248201819052604482015283906001600160a01b0382169063ba087652906064016020604051808303815f875af115801561024a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061026e9190610740565b949350505050565b6003545f906001600160a01b031633146102a357604051631a27eac360e11b815260040160405180910390fd5b826001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156102fd575060408051601f3d908101601f191682019092526102fa9181019061071e565b60015b61031a5760405163e6c4247b60e01b815260040160405180910390fd5b6001546001600160a01b038281169116146103485760405163e6c4247b60e01b815260040160405180910390fd5b50815f0361036b5782604051636b30633560e01b81526004016101ee91906106c9565b60405163b3d7f6b960e01b81526004810183905283906001600160a01b0382169063b3d7f6b990602401602060405180830381865afa1580156103b0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103d49190610740565b6002549092506103ef906001600160a01b0316333085610524565b600254610406906001600160a01b03168584610591565b604051636e553f6560e01b8152600481018390523060248201526001600160a01b03821690636e553f65906044016020604051808303815f875af1158015610450573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104749190610740565b5060025461048c906001600160a01b0316855f610591565b60405163a9059cbb60e01b81525f906001600160a01b0383169063a9059cbb906104bc9033908890600401610757565b6020604051808303815f875af11580156104d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fc9190610770565b90508061051c576040516312171d8360e31b815260040160405180910390fd5b505092915050565b6040516001600160a01b03848116602483015283811660448301526064820183905261058b9186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061061d565b50505050565b5f836001600160a01b031663095ea7b384846040516024016105b4929190610757565b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505090506105ed8482610680565b61058b5761061784856001600160a01b031663095ea7b3865f604051602401610559929190610757565b61058b84825b5f5f60205f8451602086015f885af18061063c576040513d5f823e3d81fd5b50505f513d91508115610653578060011415610660565b6001600160a01b0384163b155b1561058b5783604051635274afe760e01b81526004016101ee91906106c9565b5f5f5f5f60205f8651602088015f8a5af192503d91505f5190508280156106bf575081156106b157806001146106bf565b5f866001600160a01b03163b115b9695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146106f1575f5ffd5b50565b5f5f60408385031215610705575f5ffd5b8235610710816106dd565b946020939093013593505050565b5f6020828403121561072e575f5ffd5b8151610739816106dd565b9392505050565b5f60208284031215610750575f5ffd5b5051919050565b6001600160a01b03929092168252602082015260400190565b5f60208284031215610780575f5ffd5b81518015158114610739575f5ffdfea2646970667358221220c70ca0d5ebb3a797b3fe0d1d4ed70d5476868585f8373c2ca89aad2638323f3964736f6c634300081c0033", + "bytecode": "0x608060405234801561000f575f5ffd5b5060405161092538038061092583398101604081905261002e9161019b565b6001600160a01b0381166100555760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b03831690811790915560408051631c56369f60e21b81529051637158da7c916004808201926020929091908290030181865afa1580156100ab573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100cf919061019b565b600180546001600160a01b039283166001600160a01b031991821681179092556002805490911690911790555f5460408051631d06d6c760e11b815290519190921691633a0dad8e9160048083019260209291908290030181865afa15801561013a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061015e919061019b565b600380546001600160a01b0319166001600160a01b0392909216919091179055506101bd565b6001600160a01b0381168114610198575f5ffd5b50565b5f602082840312156101ab575f5ffd5b81516101b681610184565b9392505050565b61075b806101ca5f395ff3fe608060405234801561000f575f5ffd5b506004361061006b575f3560e01c80633a0dad8e1461006f5780633da7c9f6146100985780636c197ff5146100ad5780637158da7c146100ce57806379502c55146100e1578063ad071f00146100f3578063cce7ec1314610106575b5f5ffd5b600354610082906001600160a01b031681565b60405161008f9190610647565b60405180910390f35b6100ab6100a636600461066f565b610119565b005b6100c06100bb366004610691565b6101c3565b60405190815260200161008f565b600154610082906001600160a01b031681565b5f54610082906001600160a01b031681565b600254610082906001600160a01b031681565b6100c0610114366004610691565b61029a565b806001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610173575060408051601f3d908101601f19168201909252610170918101906106bb565b60015b6101905760405163fbf66df160e01b815260040160405180910390fd5b6001546001600160a01b038281169116146101be5760405163fbf66df160e01b815260040160405180910390fd5b505b50565b6003545f906001600160a01b031633146101f057604051631a27eac360e11b815260040160405180910390fd5b815f0361021b5782604051636b30633560e01b81526004016102129190610647565b60405180910390fd5b604051635d043b2960e11b8152600481018390523360248201819052604482015283906001600160a01b0382169063ba087652906064016020604051808303815f875af115801561026e573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061029291906106d6565b949350505050565b6003545f906001600160a01b031633146102c757604051631a27eac360e11b815260040160405180910390fd5b815f036102e95782604051636b30633560e01b81526004016102129190610647565b60405163b3d7f6b960e01b81526004810183905283906001600160a01b0382169063b3d7f6b990602401602060405180830381865afa15801561032e573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061035291906106d6565b60025490925061036d906001600160a01b03163330856104a2565b600254610384906001600160a01b0316858461050f565b604051636e553f6560e01b8152600481018390523060248201526001600160a01b03821690636e553f65906044016020604051808303815f875af11580156103ce573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103f291906106d6565b5060025461040a906001600160a01b0316855f61050f565b60405163a9059cbb60e01b81525f906001600160a01b0383169063a9059cbb9061043a90339088906004016106ed565b6020604051808303815f875af1158015610456573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061047a9190610706565b90508061049a576040516312171d8360e31b815260040160405180910390fd5b505092915050565b6040516001600160a01b0384811660248301528381166044830152606482018390526105099186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061059b565b50505050565b5f836001600160a01b031663095ea7b384846040516024016105329291906106ed565b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050905061056b84826105fe565b6105095761059584856001600160a01b031663095ea7b3865f6040516024016104d79291906106ed565b61050984825b5f5f60205f8451602086015f885af1806105ba576040513d5f823e3d81fd5b50505f513d915081156105d15780600114156105de565b6001600160a01b0384163b155b156105095783604051635274afe760e01b81526004016102129190610647565b5f5f5f5f60205f8651602088015f8a5af192503d91505f51905082801561063d5750811561062f578060011461063d565b5f866001600160a01b03163b115b9695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146101c0575f5ffd5b5f6020828403121561067f575f5ffd5b813561068a8161065b565b9392505050565b5f5f604083850312156106a2575f5ffd5b82356106ad8161065b565b946020939093013593505050565b5f602082840312156106cb575f5ffd5b815161068a8161065b565b5f602082840312156106e6575f5ffd5b5051919050565b6001600160a01b03929092168252602082015260400190565b5f60208284031215610716575f5ffd5b8151801515811461068a575f5ffdfea2646970667358221220358edde6e15383575dde682c6b0e07b9bfc4c5e19e774e1697d3fd1c32cee3a464736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061006b575f3560e01c80633a0dad8e1461006f5780633da7c9f6146100985780636c197ff5146100ad5780637158da7c146100ce57806379502c55146100e1578063ad071f00146100f3578063cce7ec1314610106575b5f5ffd5b600354610082906001600160a01b031681565b60405161008f9190610647565b60405180910390f35b6100ab6100a636600461066f565b610119565b005b6100c06100bb366004610691565b6101c3565b60405190815260200161008f565b600154610082906001600160a01b031681565b5f54610082906001600160a01b031681565b600254610082906001600160a01b031681565b6100c0610114366004610691565b61029a565b806001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610173575060408051601f3d908101601f19168201909252610170918101906106bb565b60015b6101905760405163fbf66df160e01b815260040160405180910390fd5b6001546001600160a01b038281169116146101be5760405163fbf66df160e01b815260040160405180910390fd5b505b50565b6003545f906001600160a01b031633146101f057604051631a27eac360e11b815260040160405180910390fd5b815f0361021b5782604051636b30633560e01b81526004016102129190610647565b60405180910390fd5b604051635d043b2960e11b8152600481018390523360248201819052604482015283906001600160a01b0382169063ba087652906064016020604051808303815f875af115801561026e573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061029291906106d6565b949350505050565b6003545f906001600160a01b031633146102c757604051631a27eac360e11b815260040160405180910390fd5b815f036102e95782604051636b30633560e01b81526004016102129190610647565b60405163b3d7f6b960e01b81526004810183905283906001600160a01b0382169063b3d7f6b990602401602060405180830381865afa15801561032e573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061035291906106d6565b60025490925061036d906001600160a01b03163330856104a2565b600254610384906001600160a01b0316858461050f565b604051636e553f6560e01b8152600481018390523060248201526001600160a01b03821690636e553f65906044016020604051808303815f875af11580156103ce573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103f291906106d6565b5060025461040a906001600160a01b0316855f61050f565b60405163a9059cbb60e01b81525f906001600160a01b0383169063a9059cbb9061043a90339088906004016106ed565b6020604051808303815f875af1158015610456573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061047a9190610706565b90508061049a576040516312171d8360e31b815260040160405180910390fd5b505092915050565b6040516001600160a01b0384811660248301528381166044830152606482018390526105099186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061059b565b50505050565b5f836001600160a01b031663095ea7b384846040516024016105329291906106ed565b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050905061056b84826105fe565b6105095761059584856001600160a01b031663095ea7b3865f6040516024016104d79291906106ed565b61050984825b5f5f60205f8451602086015f885af1806105ba576040513d5f823e3d81fd5b50505f513d915081156105d15780600114156105de565b6001600160a01b0384163b155b156105095783604051635274afe760e01b81526004016102129190610647565b5f5f5f5f60205f8651602088015f8a5af192503d91505f51905082801561063d5750811561062f578060011461063d565b5f866001600160a01b03163b115b9695505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146101c0575f5ffd5b5f6020828403121561067f575f5ffd5b813561068a8161065b565b9392505050565b5f5f604083850312156106a2575f5ffd5b82356106ad8161065b565b946020939093013593505050565b5f602082840312156106cb575f5ffd5b815161068a8161065b565b5f602082840312156106e6575f5ffd5b5051919050565b6001600160a01b03929092168252602082015260400190565b5f60208284031215610716575f5ffd5b8151801515811461068a575f5ffdfea2646970667358221220358edde6e15383575dde682c6b0e07b9bfc4c5e19e774e1697d3fd1c32cee3a464736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/factories/TransparentVaultFactory.sol/TransparentVaultFactory.json b/artifacts/contracts/factories/TransparentVaultFactory.sol/TransparentVaultFactory.json index 2e7e0aec..5b9831da 100644 --- a/artifacts/contracts/factories/TransparentVaultFactory.sol/TransparentVaultFactory.json +++ b/artifacts/contracts/factories/TransparentVaultFactory.sol/TransparentVaultFactory.json @@ -148,8 +148,8 @@ "type": "function" } ], - "bytecode": "0x6080604052348015600e575f5ffd5b50604051614fab380380614fab833981016040819052602b916074565b6001600160a01b03811660515760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0392909216919091179055609f565b5f602082840312156083575f5ffd5b81516001600160a01b03811681146098575f5ffd5b9392505050565b614eff806100ac5f395ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c8063341624941461003857806379502c5514610061575b5f5ffd5b61004b610046366004610347565b610073565b6040516100589190610408565b60405180910390f35b5f5461004b906001600160a01b031681565b5f8054604051638771de8760e01b815233916001600160a01b031690638771de87906100a3908490600401610408565b602060405180830381865afa1580156100be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e2919061041c565b6100ff57604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b038a166101265760405163d92e233d60e01b815260040160405180910390fd5b5f5f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610175573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610199919061041c565b6101b6576040516312aecd8160e01b815260040160405180910390fd5b5f818b5f5f9054906101000a90046001600160a01b03168c8c8c8c8c8c8c6040516101e0906102e0565b6101f39a9998979695949392919061046a565b604051809103905ff08015801561020c573d5f5f3e3d5ffd5b505f8054604051631e832de160e21b81529295508593506001600160a01b031691637a0cb78491610242918591906004016104fd565b5f604051808303815f87803b158015610259575f5ffd5b505af115801561026b573d5f5f3e3d5ffd5b505050508a6001600160a01b0316826001600160a01b0316846001600160a01b03167f91700e2f05ab5287673189803ecbe9609340db98196ee954ac9865daf4308d2d8d8d8d8d8d8d8d5f6040516102ca98979695949392919061051a565b60405180910390a4505098975050505050505050565b61494f8061057b83390190565b5f5f83601f8401126102fd575f5ffd5b5081356001600160401b03811115610313575f5ffd5b60208301915083602082850101111561032a575f5ffd5b9250929050565b803561ffff81168114610342575f5ffd5b919050565b5f5f5f5f5f5f5f5f60c0898b03121561035e575f5ffd5b88356001600160a01b0381168114610374575f5ffd5b975060208901356001600160401b0381111561038e575f5ffd5b61039a8b828c016102ed565b90985096505060408901356001600160401b038111156103b8575f5ffd5b6103c48b828c016102ed565b909650945050606089013560ff811681146103dd575f5ffd5b92506103eb60808a01610331565b91506103f960a08a01610331565b90509295985092959890939650565b6001600160a01b0391909116815260200190565b5f6020828403121561042c575f5ffd5b8151801515811461043b575f5ffd5b9392505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b038b811682528a8116602083015289166040820152610100606082018190525f9061049f908301898b610442565b82810360808401526104b281888a610442565b60ff9690961660a0840152505061ffff92831660c0820152911660e090910152979650505050505050565b600281106104f957634e487b7160e01b5f52602160045260245ffd5b9052565b6001600160a01b03831681526040810161043b60208301846104dd565b60c081525f61052d60c083018a8c610442565b828103602084015261054081898b610442565b91505060ff8616604083015261ffff8516606083015261ffff8416608083015261056d60a08301846104dd565b999850505050505050505056fe60c060405234801561000f575f5ffd5b5060405161494f38038061494f83398101604081905261002e916108b3565b8787878787878787856001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610072573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100969190610982565b858560036100a48382610a28565b5060046100b18282610a28565b5050505f5f6100c58361050660201b60201c565b91509150816100d55760126100d7565b805b60ff1660a05250506001600160a01b03908116608052600160055587166101115760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0386166101385760405163e6c4247b60e01b815260040160405180910390fd5b600680546001600160a01b03808b166001600160a01b031992831617909255600780548a841690831617905560088054928916929091168217905560408051630691d8b960e31b8152905163348ec5c8916004808201926020929091908290030181865afa1580156101ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d09190610982565b60095f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b0316633a0dad8e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610231573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102559190610982565b600a5f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b031663d1717c7d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102b6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102da9190610ae2565b600a60146101000a81548160ff021916908360ff1602179055505f600d819055505f6014819055505f6015819055505f866001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610346573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036a9190610982565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103c99190610ae2565b9050601260ff821611156103f057604051631c03248960e11b815260040160405180910390fd5b600460ff85161115610415576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff8416111561043c576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff83161115610463576040516317dbc4cb60e21b815260040160405180910390fd5b8360ff16600481111561047857610478610afb565b6017805460ff1916600183600481111561049457610494610afb565b02179055506017805461ffff84811663010000000264ffff00000019918716610100029190911664ffffffff0019909216919091171790556104d781600a610c06565b6018556104e26105dc565b5050505050505050506104f96106b160201b60201c565b5050505050505050610d26565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b0387169161054c91610c14565b5f60405180830381855afa9150503d805f8114610584576040519150601f19603f3d011682016040523d82523d5f602084013e610589565b606091505b509150915081801561059d57506020815110155b156105d0575f818060200190518101906105b79190610c2a565b905060ff81116105ce576001969095509350505050565b505b505f9485945092505050565b60085460408051636c366a2760e11b815290515f926001600160a01b03169163d86cd44e91600480830192869291908290030181865afa158015610622573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106499190810190610c41565b90505f5b81518110156106ad575f61068483838151811061066c5761066c610cf3565b6020026020010151600b61075e60201b90919060201c565b9050806106a457604051630ea075bf60e21b815260040160405180910390fd5b5060010161064d565b5050565b6007546001600160a01b03163b5f036106d057601f805460ff19169055565b6007546040516301ffc9a760e01b815263701a818560e01b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa92505050801561073b575060408051601f3d908101601f1916820190925261073891810190610d07565b60015b61074b57601f805460ff19169055565b601f805460ff1916911515919091179055565b5f610772836001600160a01b03841661077b565b90505b92915050565b5f8181526001830160205260408120546107c057508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610775565b505f610775565b6001600160a01b03811681146107db575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561081a5761081a6107de565b604052919050565b5f82601f830112610831575f5ffd5b81516001600160401b0381111561084a5761084a6107de565b61085d601f8201601f19166020016107f2565b818152846020838601011115610871575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b805160ff8116811461089d575f5ffd5b919050565b805161ffff8116811461089d575f5ffd5b5f5f5f5f5f5f5f5f610100898b0312156108cb575f5ffd5b88516108d6816107c7565b60208a01519098506108e7816107c7565b60408a01519097506108f8816107c7565b60608a01519096506001600160401b03811115610913575f5ffd5b61091f8b828c01610822565b60808b015190965090506001600160401b0381111561093c575f5ffd5b6109488b828c01610822565b94505061095760a08a0161088d565b925061096560c08a016108a2565b915061097360e08a016108a2565b90509295985092959890939650565b5f60208284031215610992575f5ffd5b815161099d816107c7565b9392505050565b600181811c908216806109b857607f821691505b6020821081036109d657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610a2357805f5260205f20601f840160051c81016020851015610a015750805b601f840160051c820191505b81811015610a20575f8155600101610a0d565b50505b505050565b81516001600160401b03811115610a4157610a416107de565b610a5581610a4f84546109a4565b846109dc565b6020601f821160018114610a87575f8315610a705750848201515b5f19600385901b1c1916600184901b178455610a20565b5f84815260208120601f198516915b82811015610ab65787850151825560209485019460019092019101610a96565b5084821015610ad357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60208284031215610af2575f5ffd5b6107728261088d565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b6001841115610b5e57808504811115610b4257610b42610b0f565b6001841615610b5057908102905b60019390931c928002610b27565b935093915050565b5f82610b7457506001610775565b81610b8057505f610775565b8160018114610b965760028114610ba057610bbc565b6001915050610775565b60ff841115610bb157610bb1610b0f565b50506001821b610775565b5060208310610133831016604e8410600b8410161715610bdf575081810a610775565b610beb5f198484610b23565b805f1904821115610bfe57610bfe610b0f565b029392505050565b5f61077260ff841683610b66565b5f82518060208501845e5f920191825250919050565b5f60208284031215610c3a575f5ffd5b5051919050565b5f60208284031215610c51575f5ffd5b81516001600160401b03811115610c66575f5ffd5b8201601f81018413610c76575f5ffd5b80516001600160401b03811115610c8f57610c8f6107de565b8060051b610c9f602082016107f2565b91825260208184018101929081019087841115610cba575f5ffd5b6020850194505b83851015610ce85784519250610cd6836107c7565b82825260209485019490910190610cc1565b979650505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610d17575f5ffd5b8151801515811461099d575f5ffd5b60805160a051613c0b610d445f395f50505f610e6a0152613c0b5ff3fe608060405234801561000f575f5ffd5b50600436106102b2575f3560e01c806301e1d114146102b657806303d44854146102cd57806306fdde03146102e257806307a2d13a146102f7578063095ea7b31461030a5780630a28a4771461032d5780630a605c6d146103405780630c6a62dd146103485780630d1e66671461035b5780630df571f71461036e578063105444941461038157806318160ddd1461039457806318c219491461039c5780631f52692b146103af57806323b872dd146103cf578063313ce567146103e2578063348ec5c8146103f757806338d52e0f1461040a5780633a0dad8e146104125780633ab6d27c14610425578063402d267d14610438578063493a6e211461044c5780634cdad5061461032d5780634e85b1351461045f5780635de3dfdc146104745780636e553f651461047f57806370a082311461048d5780637847ea53146104a057806379502c55146104c057806380ceebfe146104d35780638f5c9465146104e657806394bf804d1461047f57806395d89b411461050257806397ee11441461050a5780639908840c14610540578063a68a526714610549578063a9059cbb1461055c578063aa2f892d1461056f578063acdb3d5114610582578063b1bd7e2e1461058b578063b3d7f6b91461032d578063b460af941461059e578063b6eba653146105ac578063ba0876521461059e578063bdca9165146105c2578063c0b568e1146105cb578063c3f0d30e146105de578063c63d75b614610438578063c6e6f592146105f1578063ce96cb7714610604578063d1717c7d14610617578063d3d034581461062b578063d853365f14610641578063d905777e14610649578063dd62ed3e1461065c578063e51a85f61461066f578063e5e9719314610682578063e66f53b714610695578063ef8b30f71461032d578063f64c6f32146106a8575b5f5ffd5b600d545b6040519081526020015b60405180910390f35b6102e06102db36600461321f565b6106b0565b005b6102ea6107ea565b6040516102c4919061328e565b6102ba6103053660046132c3565b61087a565b61031d6103183660046132ee565b61088b565b60405190151581526020016102c4565b6102ba61033b3660046132c3565b6108a2565b6015546102ba565b6102e0610356366004613318565b6108bc565b6102e06103693660046132c3565b610967565b6102e061037c366004613333565b610bd8565b6102e061038f366004613393565b610c53565b6002546102ba565b6102e06103aa3660046132c3565b610d74565b6006546103c2906001600160a01b031681565b6040516102c491906133da565b61031d6103dd3660046133ee565b610e43565b60125b60405160ff90911681526020016102c4565b6009546103c2906001600160a01b031681565b6103c2610e68565b600a546103c2906001600160a01b031681565b6102e0610433366004613449565b610e8c565b6102ba610446366004613318565b505f1990565b6102e061045a3660046132c3565b611059565b6104676113a0565b6040516102c491906134d4565b601f5460ff1661031d565b6102ba61033b3660046134e6565b6102ba61049b366004613318565b6113b1565b6104ab6301e1338081565b60405163ffffffff90911681526020016102c4565b6008546103c2906001600160a01b031681565b6102ba6104e1366004613514565b6113cb565b6104ef61271081565b60405161ffff90911681526020016102c4565b6102ea61140b565b6017546018546105309160ff81169161ffff610100830481169263010000009004169084565b6040516102c49493929190613556565b6104ef61012c81565b6102ba610557366004613514565b61141a565b61031d61056a3660046132ee565b611449565b6102e061057d3660046132c3565b611456565b6102ba60165481565b6102e0610599366004613594565b61162f565b6102ba61033b3660046135d2565b6105b461185f565b6040516102c4929190613606565b6104ef610bb881565b6102e06105d93660046132c3565b6119b6565b6102e06105ec3660046132c3565b611b70565b6102ba6105ff3660046132c3565b611d64565b6102ba610612366004613318565b611d6f565b600a546103e590600160a01b900460ff1681565b610633611d82565b6040516102c4929190613664565b6103e5601281565b6102ba610657366004613318565b611eac565b6102ba61066a3660046136b0565b611eb6565b6102ba61067d3660046132c3565b611ee0565b6102e06106903660046132c3565b611f19565b6007546103c2906001600160a01b031681565b6014546102ba565b6006546001600160a01b031633146106db57604051631a27eac360e11b815260040160405180910390fd5b6106e5600b6121f1565b5f5b818110156107e5575f838383818110610702576107026136dc565b90506020020160208101906107179190613318565b600854604051633af32abf60e01b81529192506001600160a01b031690633af32abf906107489084906004016133da565b602060405180830381865afa158015610763573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061078791906136f0565b6107af578060405163751dff9760e11b81526004016107a691906133da565b60405180910390fd5b5f6107bb600b836121fa565b9050806107db57604051630ea075bf60e21b815260040160405180910390fd5b50506001016106e7565b505050565b6060600380546107f99061370f565b80601f01602080910402602001604051908101604052809291908181526020018280546108259061370f565b80156108705780601f1061084757610100808354040283529160200191610870565b820191905f5260205f20905b81548152906001019060200180831161085357829003601f168201915b5050505050905090565b5f610885825f61220e565b92915050565b5f3361089881858561224f565b5060019392505050565b5f60405163125ad87760e31b815260040160405180910390fd5b6006546001600160a01b031633146108e757604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b03811661090e5760405163e6c4247b60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b03831617905561093161225c565b6040516001600160a01b038216907f83293ffeebb677b167941693470018acf300605df266a35e9fdb66f24ff00fe0905f90a250565b61096f612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e391906136f0565b610a00576040516312aecd8160e01b815260040160405180910390fd5b805f03610a2957610a0f610e68565b604051636b30633560e01b81526004016107a691906133da565b5f610a32610e68565b6001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401610a5d91906133da565b602060405180830381865afa158015610a78573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9c9190613747565b905080821115610abf57604051632ca2f52b60e11b815260040160405180910390fd5b5f610ac8610e68565b600a546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92610afe92339290911690889060040161375e565b6020604051808303815f875af1158015610b1a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3e91906136f0565b905080610b5e576040516312171d8360e31b815260040160405180910390fd5b5f610b6a600e33612333565b9150610b85905033610b7c8684613796565b600e9190612359565b508360145f828254610b979190613796565b9091555050604051849033907f55896b30a78fc55b78937f8014dde3f0035e9d37a4f6ac36841fb8b62f7e2b13905f90a3505050610bd56001600555565b50565b6009546001600160a01b03163314610c0357604051631a27eac360e11b815260040160405180910390fd5b8015610c4f578060165f828254610c1a9190613796565b9091555050601654604051829084907f8b8789cf9157fe7b016901e4ed3a5d0971caa8b7c031da0b25638ccf65841b2a905f90a45b5050565b6009546001600160a01b03163314610c7e57604051631a27eac360e11b815260040160405180910390fd5b610c88601961236e565b815f5b8161ffff168161ffff161015610d1857610d0f85858361ffff16818110610cb457610cb46136dc565b610cca9260206040909202019081019150613318565b86868461ffff16818110610ce057610ce06136dc565b9050604002016020016020810190610cf891906137ba565b63ffffffff1660196123599092919063ffffffff16565b50600101610c8b565b50600d8290555f610d3060125b61030590600a6138b8565b601854909150811115610d435760188190555b60405183907f5e1ff954b5e5257e9ee5d4cb07059e8f5e69b1aaaf9911e5d8d90a6894de9c21905f90a25050505050565b6006546001600160a01b03163314610d9f57604051631a27eac360e11b815260040160405180910390fd5b805f03610dae57610a0f610e68565b601654811115610dd157604051632ca2f52b60e11b815260040160405180910390fd5b8060165f828254610de291906138c6565b9091555050600a5460405163741fca4b60e01b8152600481018390526001600160a01b039091169063741fca4b906024015f604051808303815f87803b158015610e2a575f5ffd5b505af1158015610e3c573d5f5f3e3d5ffd5b5050505050565b5f33610e50858285612377565b610e5b8585856123c8565b60019150505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6006546001600160a01b03163314610eb757604051631a27eac360e11b815260040160405180910390fd5b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f07573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f2b91906136f0565b610f48576040516312aecd8160e01b815260040160405180910390fd5b600460ff84161115610f6d576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff83161115610f94576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff82161115610fbb576040516317dbc4cb60e21b815260040160405180910390fd5b8260ff166004811115610fd057610fd0613542565b6017805460ff19166001836004811115610fec57610fec613542565b02179055506017805464ffffffff00191661010061ffff85811691820264ffff00000019169290921763010000009285169283021790925560405190919060ff8616907fd24f39e523bfa412fa391702710dc62e1c82d87a8e83228a37c42be1b4870f45905f90a4505050565b600a546001600160a01b0316331461108457604051631a27eac360e11b815260040160405180910390fd5b61108c612309565b5f6110976011612425565b90508063ffffffff165f036110ac5750611396565b5f8163ffffffff166001600160401b038111156110cb576110cb6138d9565b6040519080825280602002602001820160405280156110f4578160200160208202803683370190505b5090505f8263ffffffff166001600160401b03811115611116576111166138d9565b60405190808252806020026020018201604052801561113f578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff1610156111d9575f8061116e601163ffffffff8086169061242f16565b9150915081858463ffffffff168151811061118b5761118b6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff16815181106111c4576111c46136dc565b60209081029190910101525050600101611144565b505f601581905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa158015611228573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061124c91906138ed565b90505f5b8463ffffffff168163ffffffff161015611390575f848263ffffffff168151811061127d5761127d6136dc565b602002602001015190505f848363ffffffff16815181106112a0576112a06136dc565b602002602001015190506112be82601161243d90919063ffffffff16565b505f6112cb828a5f61141a565b90506112d73083612451565b600a54604051634adfc2e760e01b81526001600160a01b0390911690634adfc2e7906113099086908590600401613908565b5f604051808303815f87803b158015611320575f5ffd5b505af1158015611332573d5f5f3e3d5ffd5b5050604080518481526020810186905261ffff891693506001600160a01b038716925030917f215abfcd108b85fbee47f26fda2de66f90f14fa5fcaf0201698ad8ac9323545f910160405180910390a4505050806001019050611250565b50505050505b610bd56001600555565b60606113ac600b612485565b905090565b6001600160a01b03165f9081526020819052604090205490565b5f6114036113d7612491565b6113e290600a6138b8565b6002546113ef9190613796565b6113fa856001613796565b8691908561250d565b949350505050565b6060600480546107f99061370f565b5f611403611429846001613796565b611431612491565b61143c90600a6138b8565b6002546113fa9190613796565b5f336108988185856123c8565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ca91906136f0565b6114e7576040516312aecd8160e01b815260040160405180910390fd5b805f036115095730604051636b30633560e01b81526004016107a691906133da565b5f611513336113b1565b90508082111561153657604051632ca2f52b60e11b815260040160405180910390fd5b6040516323b872dd60e01b81525f9030906323b872dd9061155f9033908490889060040161375e565b6020604051808303815f875af115801561157b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061159f91906136f0565b9050806115bf576040516312171d8360e31b815260040160405180910390fd5b5f6115cb601133612333565b91506115e69050336115dd8684613796565b60119190612359565b508360155f8282546115f89190613796565b9091555050604051849033907f222dc200773fe9b45015bf792e8fee37d651e3590c215806a5042404b6d741d2905f90a350505050565b6007546001600160a01b0316331461165a57604051631a27eac360e11b815260040160405180910390fd5b601f5460ff161561167e576040516317dbc4cb60e21b815260040160405180910390fd5b5f81900361169f57604051631121aa8d60e01b815260040160405180910390fd5b6116a9601c61236e565b5f816001600160401b038111156116c2576116c26138d9565b6040519080825280602002602001820160405280156116eb578160200160208202803683370190505b5090505f82815b8161ffff168161ffff1610156117e9575f86868361ffff16818110611719576117196136dc565b61172f9260206040909202019081019150613318565b90505f87878461ffff16818110611748576117486136dc565b905060400201602001602081019061176091906137ba565b905081868461ffff1681518110611779576117796136dc565b6001600160a01b03909216602092830291909101909101525f6117a7601c8463ffffffff8086169061235916565b9050806117c957826040516346bdabe160e01b81526004016107a691906133da565b6117d963ffffffff831687613796565b95505050508060010190506116f2565b506117f38361254f565b600a60149054906101000a900460ff16600a61180f91906138b8565b821461182e57604051639006dd2760e01b815260040160405180910390fd5b60405133907f2d47a742b8d7df7c1fc5a9a631b206b364e6cb2722490759f63bb3ab14b132e0905f90a25050505050565b601f54606090819060ff161561187f576118776125c7565b915091509091565b5f61188a601c612425565b90508061ffff166001600160401b038111156118a8576118a86138d9565b6040519080825280602002602001820160405280156118d1578160200160208202803683370190505b5092508061ffff166001600160401b038111156118f0576118f06138d9565b604051908082528060200260200182016040528015611919578160200160208202803683370190505b5091505f5b8161ffff168161ffff1610156119b0575f8061193f601c61ffff851661242f565b9150915081868461ffff168151811061195a5761195a6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611991576119916136dc565b63ffffffff90921660209283029190910190910152505060010161191e565b50509091565b6119be612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a0e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3291906136f0565b611a4f576040516312aecd8160e01b815260040160405180910390fd5b805f03611a5e57610a0f610e68565b5f611a6a600e33612333565b91505081811015611a8e57604051632ca2f52b60e11b815260040160405180910390fd5b600a546040516351edffb160e01b81526001600160a01b03909116906351edffb190611ac09033908690600401613908565b5f604051808303815f87803b158015611ad7575f5ffd5b505af1158015611ae9573d5f5f3e3d5ffd5b505050505f8282611afa91906138c6565b9050805f03611b1457611b0e600e3361243d565b50611b22565b611b20600e3383612359565b505b8260145f828254611b3391906138c6565b9091555050604051839033907f96a9a6886cdf3047a125454218a23d3961fd3a78643123b248a9d106d0ac94fd905f90a35050610bd56001600555565b611b78612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bc8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bec91906136f0565b611c09576040516312aecd8160e01b815260040160405180910390fd5b805f03611c2b5730604051636b30633560e01b81526004016107a691906133da565b5f611c37601133612333565b91505081811015611c5b57604051632ca2f52b60e11b815260040160405180910390fd5b5f611c6683836138c6565b9050805f03611c8057611c7a60113361243d565b50611c8e565b611c8c60113383612359565b505b8260155f828254611c9f91906138c6565b909155505060405163a9059cbb60e01b81525f90309063a9059cbb90611ccb9033908890600401613908565b6020604051808303815f875af1158015611ce7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0b91906136f0565b905080611d2b576040516312171d8360e31b815260040160405180910390fd5b604051849033907f046d3e17087d323298991516e3fdec36fe1204d6bff7fb6e2b8eca77b80a22ad905f90a3505050610bd56001600555565b5f610885825f6127f9565b5f610885611d7c836113b1565b5f61220e565b6060805f611d906019612425565b90508061ffff166001600160401b03811115611dae57611dae6138d9565b604051908082528060200260200182016040528015611dd7578160200160208202803683370190505b5092508061ffff166001600160401b03811115611df657611df66138d9565b604051908082528060200260200182016040528015611e1f578160200160208202803683370190505b5091505f5b8161ffff168161ffff1610156119b0575f80611e45601961ffff851661242f565b9150915081868461ffff1681518110611e6057611e606136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611e9757611e976136dc565b60209081029190910101525050600101611e24565b5f610885826113b1565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b5f5f611eeb8361282b565b90505f611ef882856138c6565b90505f611f04826128f5565b9050611f108184613796565b95945050505050565b600a546001600160a01b03163314611f4457604051631a27eac360e11b815260040160405180910390fd5b611f4c612309565b5f611f57600e612425565b90508063ffffffff165f03611f6c5750611396565b5f8163ffffffff166001600160401b03811115611f8b57611f8b6138d9565b604051908082528060200260200182016040528015611fb4578160200160208202803683370190505b5090505f8263ffffffff166001600160401b03811115611fd657611fd66138d9565b604051908082528060200260200182016040528015611fff578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff161015612099575f8061202e600e63ffffffff8086169061242f16565b9150915081858463ffffffff168151811061204b5761204b6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff1681518110612084576120846136dc565b60209081029190910101525050600101612004565b505f601481905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa1580156120e8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061210c91906138ed565b90505f5b8463ffffffff168163ffffffff161015611390575f848263ffffffff168151811061213d5761213d6136dc565b602002602001015190505f848363ffffffff1681518110612160576121606136dc565b6020026020010151905061217e82600e61243d90919063ffffffff16565b505f61218b828a5f6113cb565b90506121978382612985565b604080518381526020810183905261ffff8716916001600160a01b0386169130917f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f6910160405180910390a4505050806001019050612110565b610bd5816129b9565b5f610e61836001600160a01b038416612a12565b5f610e6161221b600d5490565b612226906001613796565b61222e612491565b61223990600a6138b8565b6002546122469190613796565b8591908561250d565b6107e58383836001612a59565b6007546001600160a01b03163b5f0361227b57601f805460ff19169055565b6007546040516301ffc9a760e01b815263701a818560e01b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa9250505080156122e6575060408051601f3d908101601f191682019092526122e3918101906136f0565b60015b6122f657601f805460ff19169055565b601f805460ff1916911515919091179055565b60026005540361232c57604051633ee5aeb560e01b815260040160405180910390fd5b6002600555565b5f80808061234a866001600160a01b038716612b2b565b909450925050505b9250929050565b5f611403846001600160a01b03851684612b63565b610bd581612b7f565b5f6123828484611eb6565b90505f198110156123c257818110156123b457828183604051637dc7a0d960e11b81526004016107a693929190613921565b6123c284848484035f612a59565b50505050565b6001600160a01b0383166123f1575f604051634b637e8f60e11b81526004016107a691906133da565b6001600160a01b03821661241a575f60405163ec442f0560e01b81526004016107a691906133da565b6107e5838383612bc8565b5f61088582612cdb565b5f80808061234a8686612ce5565b5f610e61836001600160a01b038416612d0e565b6001600160a01b03821661247a575f604051634b637e8f60e11b81526004016107a691906133da565b610c4f825f83612bc8565b60605f610e6183612d2a565b5f5f61249b610e68565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124d6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124fa9190613942565b905061250781601261395d565b91505090565b5f61253a61251a83612d83565b801561253557505f848061253057612530613976565b868809115b151590565b612545868686612daf565b611f109190613796565b5f5b8151811015610c4f5761258782828151811061256f5761256f6136dc565b6020026020010151600b612e5f90919063ffffffff16565b6125bf5781818151811061259d5761259d6136dc565b602002602001015160405163751dff9760e11b81526004016107a691906133da565b600101612551565b6060805f306001600160a01b0316634e85b1356040518163ffffffff1660e01b81526004015f60405180830381865afa158015612606573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261262d9190810190613a04565b60075460405163701a818560e01b81529192505f916001600160a01b039091169063701a8185906126629085906004016134d4565b5f60405180830381865afa15801561267c573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126a39190810190613a98565b905080516001600160401b038111156126be576126be6138d9565b6040519080825280602002602001820160405280156126e7578160200160208202803683370190505b50935080516001600160401b03811115612703576127036138d9565b60405190808252806020026020018201604052801561272c578160200160208202803683370190505b5092505f5b81518161ffff1610156127f257818161ffff1681518110612754576127546136dc565b60200260200101515f0151858261ffff1681518110612775576127756136dc565b60200260200101906001600160a01b031690816001600160a01b031681525050818161ffff16815181106127ab576127ab6136dc565b602002602001015160200151848261ffff16815181106127cd576127cd6136dc565b63ffffffff909216602092830291909101909101526127eb81613b59565b9050612731565b5050509091565b5f610e61612805612491565b61281090600a6138b8565b60025461281d9190613796565b600d54612246906001613796565b6017545f906301000000900461ffff16810361284857505f919050565b6017545f90612865906301000000900461ffff1684612710612daf565b9050610e6160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128ba573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128de9190613b79565b829063ffffffff908116906301e1338090612daf16565b6017545f90610100900461ffff16810361291057505f919050565b5f6129276129206012600a6138b8565b845f61141a565b6017549091505f90819061293d9060ff16612e73565b915091508183101561295357505f949350505050565b6017545f9061296c90610100900461ffff168584612daf565b905061297b8187612710612daf565b9695505050505050565b6001600160a01b0382166129ae575f60405163ec442f0560e01b81526004016107a691906133da565b610c4f5f8383612bc8565b5f6129c2825490565b90505f5b81811015612a0b57826001015f845f0183815481106129e7576129e76136dc565b905f5260205f20015481526020019081526020015f205f90558060010190506129c6565b50505f9055565b5f612a1d8383612f5d565b612a5257508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610885565b505f610885565b6001600160a01b038416612a82575f60405163e602df0560e01b81526004016107a691906133da565b6001600160a01b038316612aab575f604051634a1406b160e11b81526004016107a691906133da565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156123c257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612b1d91815260200190565b60405180910390a350505050565b5f818152600283016020526040812054819080612b5857612b4c8585612f74565b92505f91506123529050565b600192509050612352565b5f82815260028401602052604081208290556114038484612f7f565b5f612b8982612cdb565b90505f5b81811015612bbe57600283015f612ba48584612f8a565b815260208101919091526040015f90812055600101612b8d565b50610c4f826121f1565b6001600160a01b038316612bf2578060025f828254612be79190613796565b90915550612c4f9050565b6001600160a01b0383165f9081526020819052604090205481811015612c315783818360405163391434e360e21b81526004016107a693929190613921565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216612c6b57600280548290039055612c89565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612cce91815260200190565b60405180910390a3505050565b5f61088582612f95565b5f8080612cf28585612f8a565b5f81815260029690960160205260409095205494959350505050565b5f8181526002830160205260408120819055610e618383612f9e565b6060815f01805480602002602001604051908101604052809291908181526020018280548015612d7757602002820191905f5260205f20905b815481526020019060010190808311612d63575b50505050509050919050565b5f6002826003811115612d9857612d98613542565b612da29190613b94565b60ff166001149050919050565b5f5f5f612dbc8686612fa9565b91509150815f03612de057838181612dd657612dd6613976565b0492505050610e61565b818411612df757612df76003851502601118612fc5565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f610e61836001600160a01b038416612f5d565b5f8080612e806012610d25565b90505f846004811115612e9557612e95613542565b03612ea557809250829150612f57565b6003846004811115612eb957612eb9613542565b03612ecb576018549250829150612f57565b6001846004811115612edf57612edf613542565b03612ef757612eed81612fd6565b9250809150612f57565b6002846004811115612f0b57612f0b613542565b03612f2357612f1981612fd6565b9250829150612f57565b6004846004811115612f3757612f37613542565b03612f5757601854612f5190612f4c83612fd6565b6130fc565b92508291505b50915091565b5f9081526001919091016020526040902054151590565b5f610e61838361310b565b5f610e618383612a12565b5f610e618383613116565b5f610885825490565b5f610e61838361313c565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f5f60085f9054906101000a90046001600160a01b03166001600160a01b031663f3cc69936040518163ffffffff1660e01b8152600401602060405180830381865afa158015613028573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061304c91906138ed565b61ffff1690505f6130e160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130ca9190613b79565b839063ffffffff908116906301e1338090612daf16565b90506114036130f282612710613796565b8590612710612daf565b5f828218828411028218610e61565b5f610e618383612f5d565b5f825f01828154811061312b5761312b6136dc565b905f5260205f200154905092915050565b5f8181526001830160205260408120548015613216575f61315e6001836138c6565b85549091505f90613171906001906138c6565b90508082146131d0575f865f01828154811061318f5761318f6136dc565b905f5260205f200154905080875f0184815481106131af576131af6136dc565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806131e1576131e1613bc1565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610885565b5f915050610885565b5f5f60208385031215613230575f5ffd5b82356001600160401b03811115613245575f5ffd5b8301601f81018513613255575f5ffd5b80356001600160401b0381111561326a575f5ffd5b8560208260051b840101111561327e575f5ffd5b6020919091019590945092505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156132d3575f5ffd5b5035919050565b6001600160a01b0381168114610bd5575f5ffd5b5f5f604083850312156132ff575f5ffd5b823561330a816132da565b946020939093013593505050565b5f60208284031215613328575f5ffd5b8135610e61816132da565b5f5f60408385031215613344575f5ffd5b50508035926020909101359150565b5f5f83601f840112613363575f5ffd5b5081356001600160401b03811115613379575f5ffd5b6020830191508360208260061b8501011115612352575f5ffd5b5f5f5f604084860312156133a5575f5ffd5b83356001600160401b038111156133ba575f5ffd5b6133c686828701613353565b909790965060209590950135949350505050565b6001600160a01b0391909116815260200190565b5f5f5f60608486031215613400575f5ffd5b833561340b816132da565b9250602084013561341b816132da565b929592945050506040919091013590565b60ff81168114610bd5575f5ffd5b61ffff81168114610bd5575f5ffd5b5f5f5f6060848603121561345b575f5ffd5b83356134668161342c565b925060208401356134768161343a565b915060408401356134868161343a565b809150509250925092565b5f8151808452602084019350602083015f5b828110156134ca5781516001600160a01b03168652602095860195909101906001016134a3565b5093949350505050565b602081525f610e616020830184613491565b5f5f604083850312156134f7575f5ffd5b823591506020830135613509816132da565b809150509250929050565b5f5f5f60608486031215613526575f5ffd5b8335925060208401359150604084013560048110613486575f5ffd5b634e487b7160e01b5f52602160045260245ffd5b608081016005861061357657634e487b7160e01b5f52602160045260245ffd5b94815261ffff93841660208201529190921660408201526060015290565b5f5f602083850312156135a5575f5ffd5b82356001600160401b038111156135ba575f5ffd5b6135c685828601613353565b90969095509350505050565b5f5f5f606084860312156135e4575f5ffd5b8335925060208401356135f6816132da565b91506040840135613486816132da565b604081525f6136186040830185613491565b82810360208401528084518083526020830191506020860192505f5b8181101561365857835163ffffffff16835260209384019390920191600101613634565b50909695505050505050565b604081525f6136766040830185613491565b82810360208401528084518083526020830191506020860192505f5b81811015613658578351835260209384019390920191600101613692565b5f5f604083850312156136c1575f5ffd5b82356136cc816132da565b91506020830135613509816132da565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613700575f5ffd5b81518015158114610e61575f5ffd5b600181811c9082168061372357607f821691505b60208210810361374157634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215613757575f5ffd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561088557610885613782565b63ffffffff81168114610bd5575f5ffd5b5f602082840312156137ca575f5ffd5b8135610e61816137a9565b6001815b6001841115613810578085048111156137f4576137f4613782565b600184161561380257908102905b60019390931c9280026137d9565b935093915050565b5f8261382657506001610885565b8161383257505f610885565b816001811461384857600281146138525761386e565b6001915050610885565b60ff84111561386357613863613782565b50506001821b610885565b5060208310610133831016604e8410600b8410161715613891575081810a610885565b61389d5f1984846137d5565b805f19048211156138b0576138b0613782565b029392505050565b5f610e6160ff841683613818565b8181038181111561088557610885613782565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156138fd575f5ffd5b8151610e618161343a565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b5f60208284031215613952575f5ffd5b8151610e618161342c565b60ff828116828216039081111561088557610885613782565b634e487b7160e01b5f52601260045260245ffd5b604080519081016001600160401b03811182821017156139ac576139ac6138d9565b60405290565b604051601f8201601f191681016001600160401b03811182821017156139da576139da6138d9565b604052919050565b5f6001600160401b038211156139fa576139fa6138d9565b5060051b60200190565b5f60208284031215613a14575f5ffd5b81516001600160401b03811115613a29575f5ffd5b8201601f81018413613a39575f5ffd5b8051613a4c613a47826139e2565b6139b2565b8082825260208201915060208360051b850101925086831115613a6d575f5ffd5b6020840193505b8284101561297b578351613a87816132da565b825260209384019390910190613a74565b5f60208284031215613aa8575f5ffd5b81516001600160401b03811115613abd575f5ffd5b8201601f81018413613acd575f5ffd5b8051613adb613a47826139e2565b8082825260208201915060208360061b850101925086831115613afc575f5ffd5b6020840193505b8284101561297b5760408488031215613b1a575f5ffd5b613b2261398a565b8451613b2d816132da565b81526020850151613b3d816137a9565b8060208301525080835250602082019150604084019350613b03565b5f61ffff821661ffff8103613b7057613b70613782565b60010192915050565b5f60208284031215613b89575f5ffd5b8151610e61816137a9565b5f60ff831680613bb257634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220c8e5b40e109f575781531ef89b26297cbc6aeecc383693fda6e6c6c96562a6ec64736f6c634300081c0033a264697066735822122027ef4225007531a710c9f5af4156dea4a31a2afd07dfe3edfd9c19812427b73764736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610034575f3560e01c8063341624941461003857806379502c5514610061575b5f5ffd5b61004b610046366004610347565b610073565b6040516100589190610408565b60405180910390f35b5f5461004b906001600160a01b031681565b5f8054604051638771de8760e01b815233916001600160a01b031690638771de87906100a3908490600401610408565b602060405180830381865afa1580156100be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e2919061041c565b6100ff57604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b038a166101265760405163d92e233d60e01b815260040160405180910390fd5b5f5f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610175573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610199919061041c565b6101b6576040516312aecd8160e01b815260040160405180910390fd5b5f818b5f5f9054906101000a90046001600160a01b03168c8c8c8c8c8c8c6040516101e0906102e0565b6101f39a9998979695949392919061046a565b604051809103905ff08015801561020c573d5f5f3e3d5ffd5b505f8054604051631e832de160e21b81529295508593506001600160a01b031691637a0cb78491610242918591906004016104fd565b5f604051808303815f87803b158015610259575f5ffd5b505af115801561026b573d5f5f3e3d5ffd5b505050508a6001600160a01b0316826001600160a01b0316846001600160a01b03167f91700e2f05ab5287673189803ecbe9609340db98196ee954ac9865daf4308d2d8d8d8d8d8d8d8d5f6040516102ca98979695949392919061051a565b60405180910390a4505098975050505050505050565b61494f8061057b83390190565b5f5f83601f8401126102fd575f5ffd5b5081356001600160401b03811115610313575f5ffd5b60208301915083602082850101111561032a575f5ffd5b9250929050565b803561ffff81168114610342575f5ffd5b919050565b5f5f5f5f5f5f5f5f60c0898b03121561035e575f5ffd5b88356001600160a01b0381168114610374575f5ffd5b975060208901356001600160401b0381111561038e575f5ffd5b61039a8b828c016102ed565b90985096505060408901356001600160401b038111156103b8575f5ffd5b6103c48b828c016102ed565b909650945050606089013560ff811681146103dd575f5ffd5b92506103eb60808a01610331565b91506103f960a08a01610331565b90509295985092959890939650565b6001600160a01b0391909116815260200190565b5f6020828403121561042c575f5ffd5b8151801515811461043b575f5ffd5b9392505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b038b811682528a8116602083015289166040820152610100606082018190525f9061049f908301898b610442565b82810360808401526104b281888a610442565b60ff9690961660a0840152505061ffff92831660c0820152911660e090910152979650505050505050565b600281106104f957634e487b7160e01b5f52602160045260245ffd5b9052565b6001600160a01b03831681526040810161043b60208301846104dd565b60c081525f61052d60c083018a8c610442565b828103602084015261054081898b610442565b91505060ff8616604083015261ffff8516606083015261ffff8416608083015261056d60a08301846104dd565b999850505050505050505056fe60c060405234801561000f575f5ffd5b5060405161494f38038061494f83398101604081905261002e916108b3565b8787878787878787856001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610072573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100969190610982565b858560036100a48382610a28565b5060046100b18282610a28565b5050505f5f6100c58361050660201b60201c565b91509150816100d55760126100d7565b805b60ff1660a05250506001600160a01b03908116608052600160055587166101115760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0386166101385760405163e6c4247b60e01b815260040160405180910390fd5b600680546001600160a01b03808b166001600160a01b031992831617909255600780548a841690831617905560088054928916929091168217905560408051630691d8b960e31b8152905163348ec5c8916004808201926020929091908290030181865afa1580156101ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d09190610982565b60095f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b0316633a0dad8e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610231573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102559190610982565b600a5f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b031663d1717c7d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102b6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102da9190610ae2565b600a60146101000a81548160ff021916908360ff1602179055505f600d819055505f6014819055505f6015819055505f866001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610346573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036a9190610982565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103c99190610ae2565b9050601260ff821611156103f057604051631c03248960e11b815260040160405180910390fd5b600460ff85161115610415576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff8416111561043c576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff83161115610463576040516317dbc4cb60e21b815260040160405180910390fd5b8360ff16600481111561047857610478610afb565b6017805460ff1916600183600481111561049457610494610afb565b02179055506017805461ffff84811663010000000264ffff00000019918716610100029190911664ffffffff0019909216919091171790556104d781600a610c06565b6018556104e26105dc565b5050505050505050506104f96106b160201b60201c565b5050505050505050610d26565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b0387169161054c91610c14565b5f60405180830381855afa9150503d805f8114610584576040519150601f19603f3d011682016040523d82523d5f602084013e610589565b606091505b509150915081801561059d57506020815110155b156105d0575f818060200190518101906105b79190610c2a565b905060ff81116105ce576001969095509350505050565b505b505f9485945092505050565b60085460408051636c366a2760e11b815290515f926001600160a01b03169163d86cd44e91600480830192869291908290030181865afa158015610622573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106499190810190610c41565b90505f5b81518110156106ad575f61068483838151811061066c5761066c610cf3565b6020026020010151600b61075e60201b90919060201c565b9050806106a457604051630ea075bf60e21b815260040160405180910390fd5b5060010161064d565b5050565b6007546001600160a01b03163b5f036106d057601f805460ff19169055565b6007546040516301ffc9a760e01b815263701a818560e01b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa92505050801561073b575060408051601f3d908101601f1916820190925261073891810190610d07565b60015b61074b57601f805460ff19169055565b601f805460ff1916911515919091179055565b5f610772836001600160a01b03841661077b565b90505b92915050565b5f8181526001830160205260408120546107c057508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610775565b505f610775565b6001600160a01b03811681146107db575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561081a5761081a6107de565b604052919050565b5f82601f830112610831575f5ffd5b81516001600160401b0381111561084a5761084a6107de565b61085d601f8201601f19166020016107f2565b818152846020838601011115610871575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b805160ff8116811461089d575f5ffd5b919050565b805161ffff8116811461089d575f5ffd5b5f5f5f5f5f5f5f5f610100898b0312156108cb575f5ffd5b88516108d6816107c7565b60208a01519098506108e7816107c7565b60408a01519097506108f8816107c7565b60608a01519096506001600160401b03811115610913575f5ffd5b61091f8b828c01610822565b60808b015190965090506001600160401b0381111561093c575f5ffd5b6109488b828c01610822565b94505061095760a08a0161088d565b925061096560c08a016108a2565b915061097360e08a016108a2565b90509295985092959890939650565b5f60208284031215610992575f5ffd5b815161099d816107c7565b9392505050565b600181811c908216806109b857607f821691505b6020821081036109d657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610a2357805f5260205f20601f840160051c81016020851015610a015750805b601f840160051c820191505b81811015610a20575f8155600101610a0d565b50505b505050565b81516001600160401b03811115610a4157610a416107de565b610a5581610a4f84546109a4565b846109dc565b6020601f821160018114610a87575f8315610a705750848201515b5f19600385901b1c1916600184901b178455610a20565b5f84815260208120601f198516915b82811015610ab65787850151825560209485019460019092019101610a96565b5084821015610ad357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60208284031215610af2575f5ffd5b6107728261088d565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b6001841115610b5e57808504811115610b4257610b42610b0f565b6001841615610b5057908102905b60019390931c928002610b27565b935093915050565b5f82610b7457506001610775565b81610b8057505f610775565b8160018114610b965760028114610ba057610bbc565b6001915050610775565b60ff841115610bb157610bb1610b0f565b50506001821b610775565b5060208310610133831016604e8410600b8410161715610bdf575081810a610775565b610beb5f198484610b23565b805f1904821115610bfe57610bfe610b0f565b029392505050565b5f61077260ff841683610b66565b5f82518060208501845e5f920191825250919050565b5f60208284031215610c3a575f5ffd5b5051919050565b5f60208284031215610c51575f5ffd5b81516001600160401b03811115610c66575f5ffd5b8201601f81018413610c76575f5ffd5b80516001600160401b03811115610c8f57610c8f6107de565b8060051b610c9f602082016107f2565b91825260208184018101929081019087841115610cba575f5ffd5b6020850194505b83851015610ce85784519250610cd6836107c7565b82825260209485019490910190610cc1565b979650505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610d17575f5ffd5b8151801515811461099d575f5ffd5b60805160a051613c0b610d445f395f50505f610e6a0152613c0b5ff3fe608060405234801561000f575f5ffd5b50600436106102b2575f3560e01c806301e1d114146102b657806303d44854146102cd57806306fdde03146102e257806307a2d13a146102f7578063095ea7b31461030a5780630a28a4771461032d5780630a605c6d146103405780630c6a62dd146103485780630d1e66671461035b5780630df571f71461036e578063105444941461038157806318160ddd1461039457806318c219491461039c5780631f52692b146103af57806323b872dd146103cf578063313ce567146103e2578063348ec5c8146103f757806338d52e0f1461040a5780633a0dad8e146104125780633ab6d27c14610425578063402d267d14610438578063493a6e211461044c5780634cdad5061461032d5780634e85b1351461045f5780635de3dfdc146104745780636e553f651461047f57806370a082311461048d5780637847ea53146104a057806379502c55146104c057806380ceebfe146104d35780638f5c9465146104e657806394bf804d1461047f57806395d89b411461050257806397ee11441461050a5780639908840c14610540578063a68a526714610549578063a9059cbb1461055c578063aa2f892d1461056f578063acdb3d5114610582578063b1bd7e2e1461058b578063b3d7f6b91461032d578063b460af941461059e578063b6eba653146105ac578063ba0876521461059e578063bdca9165146105c2578063c0b568e1146105cb578063c3f0d30e146105de578063c63d75b614610438578063c6e6f592146105f1578063ce96cb7714610604578063d1717c7d14610617578063d3d034581461062b578063d853365f14610641578063d905777e14610649578063dd62ed3e1461065c578063e51a85f61461066f578063e5e9719314610682578063e66f53b714610695578063ef8b30f71461032d578063f64c6f32146106a8575b5f5ffd5b600d545b6040519081526020015b60405180910390f35b6102e06102db36600461321f565b6106b0565b005b6102ea6107ea565b6040516102c4919061328e565b6102ba6103053660046132c3565b61087a565b61031d6103183660046132ee565b61088b565b60405190151581526020016102c4565b6102ba61033b3660046132c3565b6108a2565b6015546102ba565b6102e0610356366004613318565b6108bc565b6102e06103693660046132c3565b610967565b6102e061037c366004613333565b610bd8565b6102e061038f366004613393565b610c53565b6002546102ba565b6102e06103aa3660046132c3565b610d74565b6006546103c2906001600160a01b031681565b6040516102c491906133da565b61031d6103dd3660046133ee565b610e43565b60125b60405160ff90911681526020016102c4565b6009546103c2906001600160a01b031681565b6103c2610e68565b600a546103c2906001600160a01b031681565b6102e0610433366004613449565b610e8c565b6102ba610446366004613318565b505f1990565b6102e061045a3660046132c3565b611059565b6104676113a0565b6040516102c491906134d4565b601f5460ff1661031d565b6102ba61033b3660046134e6565b6102ba61049b366004613318565b6113b1565b6104ab6301e1338081565b60405163ffffffff90911681526020016102c4565b6008546103c2906001600160a01b031681565b6102ba6104e1366004613514565b6113cb565b6104ef61271081565b60405161ffff90911681526020016102c4565b6102ea61140b565b6017546018546105309160ff81169161ffff610100830481169263010000009004169084565b6040516102c49493929190613556565b6104ef61012c81565b6102ba610557366004613514565b61141a565b61031d61056a3660046132ee565b611449565b6102e061057d3660046132c3565b611456565b6102ba60165481565b6102e0610599366004613594565b61162f565b6102ba61033b3660046135d2565b6105b461185f565b6040516102c4929190613606565b6104ef610bb881565b6102e06105d93660046132c3565b6119b6565b6102e06105ec3660046132c3565b611b70565b6102ba6105ff3660046132c3565b611d64565b6102ba610612366004613318565b611d6f565b600a546103e590600160a01b900460ff1681565b610633611d82565b6040516102c4929190613664565b6103e5601281565b6102ba610657366004613318565b611eac565b6102ba61066a3660046136b0565b611eb6565b6102ba61067d3660046132c3565b611ee0565b6102e06106903660046132c3565b611f19565b6007546103c2906001600160a01b031681565b6014546102ba565b6006546001600160a01b031633146106db57604051631a27eac360e11b815260040160405180910390fd5b6106e5600b6121f1565b5f5b818110156107e5575f838383818110610702576107026136dc565b90506020020160208101906107179190613318565b600854604051633af32abf60e01b81529192506001600160a01b031690633af32abf906107489084906004016133da565b602060405180830381865afa158015610763573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061078791906136f0565b6107af578060405163751dff9760e11b81526004016107a691906133da565b60405180910390fd5b5f6107bb600b836121fa565b9050806107db57604051630ea075bf60e21b815260040160405180910390fd5b50506001016106e7565b505050565b6060600380546107f99061370f565b80601f01602080910402602001604051908101604052809291908181526020018280546108259061370f565b80156108705780601f1061084757610100808354040283529160200191610870565b820191905f5260205f20905b81548152906001019060200180831161085357829003601f168201915b5050505050905090565b5f610885825f61220e565b92915050565b5f3361089881858561224f565b5060019392505050565b5f60405163125ad87760e31b815260040160405180910390fd5b6006546001600160a01b031633146108e757604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b03811661090e5760405163e6c4247b60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b03831617905561093161225c565b6040516001600160a01b038216907f83293ffeebb677b167941693470018acf300605df266a35e9fdb66f24ff00fe0905f90a250565b61096f612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e391906136f0565b610a00576040516312aecd8160e01b815260040160405180910390fd5b805f03610a2957610a0f610e68565b604051636b30633560e01b81526004016107a691906133da565b5f610a32610e68565b6001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401610a5d91906133da565b602060405180830381865afa158015610a78573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9c9190613747565b905080821115610abf57604051632ca2f52b60e11b815260040160405180910390fd5b5f610ac8610e68565b600a546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92610afe92339290911690889060040161375e565b6020604051808303815f875af1158015610b1a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3e91906136f0565b905080610b5e576040516312171d8360e31b815260040160405180910390fd5b5f610b6a600e33612333565b9150610b85905033610b7c8684613796565b600e9190612359565b508360145f828254610b979190613796565b9091555050604051849033907f55896b30a78fc55b78937f8014dde3f0035e9d37a4f6ac36841fb8b62f7e2b13905f90a3505050610bd56001600555565b50565b6009546001600160a01b03163314610c0357604051631a27eac360e11b815260040160405180910390fd5b8015610c4f578060165f828254610c1a9190613796565b9091555050601654604051829084907f8b8789cf9157fe7b016901e4ed3a5d0971caa8b7c031da0b25638ccf65841b2a905f90a45b5050565b6009546001600160a01b03163314610c7e57604051631a27eac360e11b815260040160405180910390fd5b610c88601961236e565b815f5b8161ffff168161ffff161015610d1857610d0f85858361ffff16818110610cb457610cb46136dc565b610cca9260206040909202019081019150613318565b86868461ffff16818110610ce057610ce06136dc565b9050604002016020016020810190610cf891906137ba565b63ffffffff1660196123599092919063ffffffff16565b50600101610c8b565b50600d8290555f610d3060125b61030590600a6138b8565b601854909150811115610d435760188190555b60405183907f5e1ff954b5e5257e9ee5d4cb07059e8f5e69b1aaaf9911e5d8d90a6894de9c21905f90a25050505050565b6006546001600160a01b03163314610d9f57604051631a27eac360e11b815260040160405180910390fd5b805f03610dae57610a0f610e68565b601654811115610dd157604051632ca2f52b60e11b815260040160405180910390fd5b8060165f828254610de291906138c6565b9091555050600a5460405163741fca4b60e01b8152600481018390526001600160a01b039091169063741fca4b906024015f604051808303815f87803b158015610e2a575f5ffd5b505af1158015610e3c573d5f5f3e3d5ffd5b5050505050565b5f33610e50858285612377565b610e5b8585856123c8565b60019150505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6006546001600160a01b03163314610eb757604051631a27eac360e11b815260040160405180910390fd5b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f07573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f2b91906136f0565b610f48576040516312aecd8160e01b815260040160405180910390fd5b600460ff84161115610f6d576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff83161115610f94576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff82161115610fbb576040516317dbc4cb60e21b815260040160405180910390fd5b8260ff166004811115610fd057610fd0613542565b6017805460ff19166001836004811115610fec57610fec613542565b02179055506017805464ffffffff00191661010061ffff85811691820264ffff00000019169290921763010000009285169283021790925560405190919060ff8616907fd24f39e523bfa412fa391702710dc62e1c82d87a8e83228a37c42be1b4870f45905f90a4505050565b600a546001600160a01b0316331461108457604051631a27eac360e11b815260040160405180910390fd5b61108c612309565b5f6110976011612425565b90508063ffffffff165f036110ac5750611396565b5f8163ffffffff166001600160401b038111156110cb576110cb6138d9565b6040519080825280602002602001820160405280156110f4578160200160208202803683370190505b5090505f8263ffffffff166001600160401b03811115611116576111166138d9565b60405190808252806020026020018201604052801561113f578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff1610156111d9575f8061116e601163ffffffff8086169061242f16565b9150915081858463ffffffff168151811061118b5761118b6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff16815181106111c4576111c46136dc565b60209081029190910101525050600101611144565b505f601581905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa158015611228573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061124c91906138ed565b90505f5b8463ffffffff168163ffffffff161015611390575f848263ffffffff168151811061127d5761127d6136dc565b602002602001015190505f848363ffffffff16815181106112a0576112a06136dc565b602002602001015190506112be82601161243d90919063ffffffff16565b505f6112cb828a5f61141a565b90506112d73083612451565b600a54604051634adfc2e760e01b81526001600160a01b0390911690634adfc2e7906113099086908590600401613908565b5f604051808303815f87803b158015611320575f5ffd5b505af1158015611332573d5f5f3e3d5ffd5b5050604080518481526020810186905261ffff891693506001600160a01b038716925030917f215abfcd108b85fbee47f26fda2de66f90f14fa5fcaf0201698ad8ac9323545f910160405180910390a4505050806001019050611250565b50505050505b610bd56001600555565b60606113ac600b612485565b905090565b6001600160a01b03165f9081526020819052604090205490565b5f6114036113d7612491565b6113e290600a6138b8565b6002546113ef9190613796565b6113fa856001613796565b8691908561250d565b949350505050565b6060600480546107f99061370f565b5f611403611429846001613796565b611431612491565b61143c90600a6138b8565b6002546113fa9190613796565b5f336108988185856123c8565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ca91906136f0565b6114e7576040516312aecd8160e01b815260040160405180910390fd5b805f036115095730604051636b30633560e01b81526004016107a691906133da565b5f611513336113b1565b90508082111561153657604051632ca2f52b60e11b815260040160405180910390fd5b6040516323b872dd60e01b81525f9030906323b872dd9061155f9033908490889060040161375e565b6020604051808303815f875af115801561157b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061159f91906136f0565b9050806115bf576040516312171d8360e31b815260040160405180910390fd5b5f6115cb601133612333565b91506115e69050336115dd8684613796565b60119190612359565b508360155f8282546115f89190613796565b9091555050604051849033907f222dc200773fe9b45015bf792e8fee37d651e3590c215806a5042404b6d741d2905f90a350505050565b6007546001600160a01b0316331461165a57604051631a27eac360e11b815260040160405180910390fd5b601f5460ff161561167e576040516317dbc4cb60e21b815260040160405180910390fd5b5f81900361169f57604051631121aa8d60e01b815260040160405180910390fd5b6116a9601c61236e565b5f816001600160401b038111156116c2576116c26138d9565b6040519080825280602002602001820160405280156116eb578160200160208202803683370190505b5090505f82815b8161ffff168161ffff1610156117e9575f86868361ffff16818110611719576117196136dc565b61172f9260206040909202019081019150613318565b90505f87878461ffff16818110611748576117486136dc565b905060400201602001602081019061176091906137ba565b905081868461ffff1681518110611779576117796136dc565b6001600160a01b03909216602092830291909101909101525f6117a7601c8463ffffffff8086169061235916565b9050806117c957826040516346bdabe160e01b81526004016107a691906133da565b6117d963ffffffff831687613796565b95505050508060010190506116f2565b506117f38361254f565b600a60149054906101000a900460ff16600a61180f91906138b8565b821461182e57604051639006dd2760e01b815260040160405180910390fd5b60405133907f2d47a742b8d7df7c1fc5a9a631b206b364e6cb2722490759f63bb3ab14b132e0905f90a25050505050565b601f54606090819060ff161561187f576118776125c7565b915091509091565b5f61188a601c612425565b90508061ffff166001600160401b038111156118a8576118a86138d9565b6040519080825280602002602001820160405280156118d1578160200160208202803683370190505b5092508061ffff166001600160401b038111156118f0576118f06138d9565b604051908082528060200260200182016040528015611919578160200160208202803683370190505b5091505f5b8161ffff168161ffff1610156119b0575f8061193f601c61ffff851661242f565b9150915081868461ffff168151811061195a5761195a6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611991576119916136dc565b63ffffffff90921660209283029190910190910152505060010161191e565b50509091565b6119be612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a0e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3291906136f0565b611a4f576040516312aecd8160e01b815260040160405180910390fd5b805f03611a5e57610a0f610e68565b5f611a6a600e33612333565b91505081811015611a8e57604051632ca2f52b60e11b815260040160405180910390fd5b600a546040516351edffb160e01b81526001600160a01b03909116906351edffb190611ac09033908690600401613908565b5f604051808303815f87803b158015611ad7575f5ffd5b505af1158015611ae9573d5f5f3e3d5ffd5b505050505f8282611afa91906138c6565b9050805f03611b1457611b0e600e3361243d565b50611b22565b611b20600e3383612359565b505b8260145f828254611b3391906138c6565b9091555050604051839033907f96a9a6886cdf3047a125454218a23d3961fd3a78643123b248a9d106d0ac94fd905f90a35050610bd56001600555565b611b78612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bc8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bec91906136f0565b611c09576040516312aecd8160e01b815260040160405180910390fd5b805f03611c2b5730604051636b30633560e01b81526004016107a691906133da565b5f611c37601133612333565b91505081811015611c5b57604051632ca2f52b60e11b815260040160405180910390fd5b5f611c6683836138c6565b9050805f03611c8057611c7a60113361243d565b50611c8e565b611c8c60113383612359565b505b8260155f828254611c9f91906138c6565b909155505060405163a9059cbb60e01b81525f90309063a9059cbb90611ccb9033908890600401613908565b6020604051808303815f875af1158015611ce7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0b91906136f0565b905080611d2b576040516312171d8360e31b815260040160405180910390fd5b604051849033907f046d3e17087d323298991516e3fdec36fe1204d6bff7fb6e2b8eca77b80a22ad905f90a3505050610bd56001600555565b5f610885825f6127f9565b5f610885611d7c836113b1565b5f61220e565b6060805f611d906019612425565b90508061ffff166001600160401b03811115611dae57611dae6138d9565b604051908082528060200260200182016040528015611dd7578160200160208202803683370190505b5092508061ffff166001600160401b03811115611df657611df66138d9565b604051908082528060200260200182016040528015611e1f578160200160208202803683370190505b5091505f5b8161ffff168161ffff1610156119b0575f80611e45601961ffff851661242f565b9150915081868461ffff1681518110611e6057611e606136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611e9757611e976136dc565b60209081029190910101525050600101611e24565b5f610885826113b1565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b5f5f611eeb8361282b565b90505f611ef882856138c6565b90505f611f04826128f5565b9050611f108184613796565b95945050505050565b600a546001600160a01b03163314611f4457604051631a27eac360e11b815260040160405180910390fd5b611f4c612309565b5f611f57600e612425565b90508063ffffffff165f03611f6c5750611396565b5f8163ffffffff166001600160401b03811115611f8b57611f8b6138d9565b604051908082528060200260200182016040528015611fb4578160200160208202803683370190505b5090505f8263ffffffff166001600160401b03811115611fd657611fd66138d9565b604051908082528060200260200182016040528015611fff578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff161015612099575f8061202e600e63ffffffff8086169061242f16565b9150915081858463ffffffff168151811061204b5761204b6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff1681518110612084576120846136dc565b60209081029190910101525050600101612004565b505f601481905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa1580156120e8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061210c91906138ed565b90505f5b8463ffffffff168163ffffffff161015611390575f848263ffffffff168151811061213d5761213d6136dc565b602002602001015190505f848363ffffffff1681518110612160576121606136dc565b6020026020010151905061217e82600e61243d90919063ffffffff16565b505f61218b828a5f6113cb565b90506121978382612985565b604080518381526020810183905261ffff8716916001600160a01b0386169130917f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f6910160405180910390a4505050806001019050612110565b610bd5816129b9565b5f610e61836001600160a01b038416612a12565b5f610e6161221b600d5490565b612226906001613796565b61222e612491565b61223990600a6138b8565b6002546122469190613796565b8591908561250d565b6107e58383836001612a59565b6007546001600160a01b03163b5f0361227b57601f805460ff19169055565b6007546040516301ffc9a760e01b815263701a818560e01b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa9250505080156122e6575060408051601f3d908101601f191682019092526122e3918101906136f0565b60015b6122f657601f805460ff19169055565b601f805460ff1916911515919091179055565b60026005540361232c57604051633ee5aeb560e01b815260040160405180910390fd5b6002600555565b5f80808061234a866001600160a01b038716612b2b565b909450925050505b9250929050565b5f611403846001600160a01b03851684612b63565b610bd581612b7f565b5f6123828484611eb6565b90505f198110156123c257818110156123b457828183604051637dc7a0d960e11b81526004016107a693929190613921565b6123c284848484035f612a59565b50505050565b6001600160a01b0383166123f1575f604051634b637e8f60e11b81526004016107a691906133da565b6001600160a01b03821661241a575f60405163ec442f0560e01b81526004016107a691906133da565b6107e5838383612bc8565b5f61088582612cdb565b5f80808061234a8686612ce5565b5f610e61836001600160a01b038416612d0e565b6001600160a01b03821661247a575f604051634b637e8f60e11b81526004016107a691906133da565b610c4f825f83612bc8565b60605f610e6183612d2a565b5f5f61249b610e68565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124d6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124fa9190613942565b905061250781601261395d565b91505090565b5f61253a61251a83612d83565b801561253557505f848061253057612530613976565b868809115b151590565b612545868686612daf565b611f109190613796565b5f5b8151811015610c4f5761258782828151811061256f5761256f6136dc565b6020026020010151600b612e5f90919063ffffffff16565b6125bf5781818151811061259d5761259d6136dc565b602002602001015160405163751dff9760e11b81526004016107a691906133da565b600101612551565b6060805f306001600160a01b0316634e85b1356040518163ffffffff1660e01b81526004015f60405180830381865afa158015612606573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261262d9190810190613a04565b60075460405163701a818560e01b81529192505f916001600160a01b039091169063701a8185906126629085906004016134d4565b5f60405180830381865afa15801561267c573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126a39190810190613a98565b905080516001600160401b038111156126be576126be6138d9565b6040519080825280602002602001820160405280156126e7578160200160208202803683370190505b50935080516001600160401b03811115612703576127036138d9565b60405190808252806020026020018201604052801561272c578160200160208202803683370190505b5092505f5b81518161ffff1610156127f257818161ffff1681518110612754576127546136dc565b60200260200101515f0151858261ffff1681518110612775576127756136dc565b60200260200101906001600160a01b031690816001600160a01b031681525050818161ffff16815181106127ab576127ab6136dc565b602002602001015160200151848261ffff16815181106127cd576127cd6136dc565b63ffffffff909216602092830291909101909101526127eb81613b59565b9050612731565b5050509091565b5f610e61612805612491565b61281090600a6138b8565b60025461281d9190613796565b600d54612246906001613796565b6017545f906301000000900461ffff16810361284857505f919050565b6017545f90612865906301000000900461ffff1684612710612daf565b9050610e6160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128ba573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128de9190613b79565b829063ffffffff908116906301e1338090612daf16565b6017545f90610100900461ffff16810361291057505f919050565b5f6129276129206012600a6138b8565b845f61141a565b6017549091505f90819061293d9060ff16612e73565b915091508183101561295357505f949350505050565b6017545f9061296c90610100900461ffff168584612daf565b905061297b8187612710612daf565b9695505050505050565b6001600160a01b0382166129ae575f60405163ec442f0560e01b81526004016107a691906133da565b610c4f5f8383612bc8565b5f6129c2825490565b90505f5b81811015612a0b57826001015f845f0183815481106129e7576129e76136dc565b905f5260205f20015481526020019081526020015f205f90558060010190506129c6565b50505f9055565b5f612a1d8383612f5d565b612a5257508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610885565b505f610885565b6001600160a01b038416612a82575f60405163e602df0560e01b81526004016107a691906133da565b6001600160a01b038316612aab575f604051634a1406b160e11b81526004016107a691906133da565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156123c257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612b1d91815260200190565b60405180910390a350505050565b5f818152600283016020526040812054819080612b5857612b4c8585612f74565b92505f91506123529050565b600192509050612352565b5f82815260028401602052604081208290556114038484612f7f565b5f612b8982612cdb565b90505f5b81811015612bbe57600283015f612ba48584612f8a565b815260208101919091526040015f90812055600101612b8d565b50610c4f826121f1565b6001600160a01b038316612bf2578060025f828254612be79190613796565b90915550612c4f9050565b6001600160a01b0383165f9081526020819052604090205481811015612c315783818360405163391434e360e21b81526004016107a693929190613921565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216612c6b57600280548290039055612c89565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612cce91815260200190565b60405180910390a3505050565b5f61088582612f95565b5f8080612cf28585612f8a565b5f81815260029690960160205260409095205494959350505050565b5f8181526002830160205260408120819055610e618383612f9e565b6060815f01805480602002602001604051908101604052809291908181526020018280548015612d7757602002820191905f5260205f20905b815481526020019060010190808311612d63575b50505050509050919050565b5f6002826003811115612d9857612d98613542565b612da29190613b94565b60ff166001149050919050565b5f5f5f612dbc8686612fa9565b91509150815f03612de057838181612dd657612dd6613976565b0492505050610e61565b818411612df757612df76003851502601118612fc5565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f610e61836001600160a01b038416612f5d565b5f8080612e806012610d25565b90505f846004811115612e9557612e95613542565b03612ea557809250829150612f57565b6003846004811115612eb957612eb9613542565b03612ecb576018549250829150612f57565b6001846004811115612edf57612edf613542565b03612ef757612eed81612fd6565b9250809150612f57565b6002846004811115612f0b57612f0b613542565b03612f2357612f1981612fd6565b9250829150612f57565b6004846004811115612f3757612f37613542565b03612f5757601854612f5190612f4c83612fd6565b6130fc565b92508291505b50915091565b5f9081526001919091016020526040902054151590565b5f610e61838361310b565b5f610e618383612a12565b5f610e618383613116565b5f610885825490565b5f610e61838361313c565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f5f60085f9054906101000a90046001600160a01b03166001600160a01b031663f3cc69936040518163ffffffff1660e01b8152600401602060405180830381865afa158015613028573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061304c91906138ed565b61ffff1690505f6130e160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130ca9190613b79565b839063ffffffff908116906301e1338090612daf16565b90506114036130f282612710613796565b8590612710612daf565b5f828218828411028218610e61565b5f610e618383612f5d565b5f825f01828154811061312b5761312b6136dc565b905f5260205f200154905092915050565b5f8181526001830160205260408120548015613216575f61315e6001836138c6565b85549091505f90613171906001906138c6565b90508082146131d0575f865f01828154811061318f5761318f6136dc565b905f5260205f200154905080875f0184815481106131af576131af6136dc565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806131e1576131e1613bc1565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610885565b5f915050610885565b5f5f60208385031215613230575f5ffd5b82356001600160401b03811115613245575f5ffd5b8301601f81018513613255575f5ffd5b80356001600160401b0381111561326a575f5ffd5b8560208260051b840101111561327e575f5ffd5b6020919091019590945092505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156132d3575f5ffd5b5035919050565b6001600160a01b0381168114610bd5575f5ffd5b5f5f604083850312156132ff575f5ffd5b823561330a816132da565b946020939093013593505050565b5f60208284031215613328575f5ffd5b8135610e61816132da565b5f5f60408385031215613344575f5ffd5b50508035926020909101359150565b5f5f83601f840112613363575f5ffd5b5081356001600160401b03811115613379575f5ffd5b6020830191508360208260061b8501011115612352575f5ffd5b5f5f5f604084860312156133a5575f5ffd5b83356001600160401b038111156133ba575f5ffd5b6133c686828701613353565b909790965060209590950135949350505050565b6001600160a01b0391909116815260200190565b5f5f5f60608486031215613400575f5ffd5b833561340b816132da565b9250602084013561341b816132da565b929592945050506040919091013590565b60ff81168114610bd5575f5ffd5b61ffff81168114610bd5575f5ffd5b5f5f5f6060848603121561345b575f5ffd5b83356134668161342c565b925060208401356134768161343a565b915060408401356134868161343a565b809150509250925092565b5f8151808452602084019350602083015f5b828110156134ca5781516001600160a01b03168652602095860195909101906001016134a3565b5093949350505050565b602081525f610e616020830184613491565b5f5f604083850312156134f7575f5ffd5b823591506020830135613509816132da565b809150509250929050565b5f5f5f60608486031215613526575f5ffd5b8335925060208401359150604084013560048110613486575f5ffd5b634e487b7160e01b5f52602160045260245ffd5b608081016005861061357657634e487b7160e01b5f52602160045260245ffd5b94815261ffff93841660208201529190921660408201526060015290565b5f5f602083850312156135a5575f5ffd5b82356001600160401b038111156135ba575f5ffd5b6135c685828601613353565b90969095509350505050565b5f5f5f606084860312156135e4575f5ffd5b8335925060208401356135f6816132da565b91506040840135613486816132da565b604081525f6136186040830185613491565b82810360208401528084518083526020830191506020860192505f5b8181101561365857835163ffffffff16835260209384019390920191600101613634565b50909695505050505050565b604081525f6136766040830185613491565b82810360208401528084518083526020830191506020860192505f5b81811015613658578351835260209384019390920191600101613692565b5f5f604083850312156136c1575f5ffd5b82356136cc816132da565b91506020830135613509816132da565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613700575f5ffd5b81518015158114610e61575f5ffd5b600181811c9082168061372357607f821691505b60208210810361374157634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215613757575f5ffd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561088557610885613782565b63ffffffff81168114610bd5575f5ffd5b5f602082840312156137ca575f5ffd5b8135610e61816137a9565b6001815b6001841115613810578085048111156137f4576137f4613782565b600184161561380257908102905b60019390931c9280026137d9565b935093915050565b5f8261382657506001610885565b8161383257505f610885565b816001811461384857600281146138525761386e565b6001915050610885565b60ff84111561386357613863613782565b50506001821b610885565b5060208310610133831016604e8410600b8410161715613891575081810a610885565b61389d5f1984846137d5565b805f19048211156138b0576138b0613782565b029392505050565b5f610e6160ff841683613818565b8181038181111561088557610885613782565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156138fd575f5ffd5b8151610e618161343a565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b5f60208284031215613952575f5ffd5b8151610e618161342c565b60ff828116828216039081111561088557610885613782565b634e487b7160e01b5f52601260045260245ffd5b604080519081016001600160401b03811182821017156139ac576139ac6138d9565b60405290565b604051601f8201601f191681016001600160401b03811182821017156139da576139da6138d9565b604052919050565b5f6001600160401b038211156139fa576139fa6138d9565b5060051b60200190565b5f60208284031215613a14575f5ffd5b81516001600160401b03811115613a29575f5ffd5b8201601f81018413613a39575f5ffd5b8051613a4c613a47826139e2565b6139b2565b8082825260208201915060208360051b850101925086831115613a6d575f5ffd5b6020840193505b8284101561297b578351613a87816132da565b825260209384019390910190613a74565b5f60208284031215613aa8575f5ffd5b81516001600160401b03811115613abd575f5ffd5b8201601f81018413613acd575f5ffd5b8051613adb613a47826139e2565b8082825260208201915060208360061b850101925086831115613afc575f5ffd5b6020840193505b8284101561297b5760408488031215613b1a575f5ffd5b613b2261398a565b8451613b2d816132da565b81526020850151613b3d816137a9565b8060208301525080835250602082019150604084019350613b03565b5f61ffff821661ffff8103613b7057613b70613782565b60010192915050565b5f60208284031215613b89575f5ffd5b8151610e61816137a9565b5f60ff831680613bb257634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220c8e5b40e109f575781531ef89b26297cbc6aeecc383693fda6e6c6c96562a6ec64736f6c634300081c0033a264697066735822122027ef4225007531a710c9f5af4156dea4a31a2afd07dfe3edfd9c19812427b73764736f6c634300081c0033", + "bytecode": "0x6080604052348015600e575f5ffd5b50604051615311380380615311833981016040819052602b916074565b6001600160a01b03811660515760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0392909216919091179055609f565b5f602082840312156083575f5ffd5b81516001600160a01b03811681146098575f5ffd5b9392505050565b615265806100ac5f395ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c8063341624941461003857806379502c5514610061575b5f5ffd5b61004b610046366004610347565b610073565b6040516100589190610408565b60405180910390f35b5f5461004b906001600160a01b031681565b5f8054604051638771de8760e01b815233916001600160a01b031690638771de87906100a3908490600401610408565b602060405180830381865afa1580156100be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e2919061041c565b6100ff57604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b038a166101265760405163d92e233d60e01b815260040160405180910390fd5b5f5f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610175573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610199919061041c565b6101b6576040516312aecd8160e01b815260040160405180910390fd5b5f818b5f5f9054906101000a90046001600160a01b03168c8c8c8c8c8c8c6040516101e0906102e0565b6101f39a9998979695949392919061046a565b604051809103905ff08015801561020c573d5f5f3e3d5ffd5b505f8054604051631e832de160e21b81529295508593506001600160a01b031691637a0cb78491610242918591906004016104fd565b5f604051808303815f87803b158015610259575f5ffd5b505af115801561026b573d5f5f3e3d5ffd5b505050508a6001600160a01b0316826001600160a01b0316846001600160a01b03167f91700e2f05ab5287673189803ecbe9609340db98196ee954ac9865daf4308d2d8d8d8d8d8d8d8d5f6040516102ca98979695949392919061051a565b60405180910390a4505098975050505050505050565b614cb58061057b83390190565b5f5f83601f8401126102fd575f5ffd5b5081356001600160401b03811115610313575f5ffd5b60208301915083602082850101111561032a575f5ffd5b9250929050565b803561ffff81168114610342575f5ffd5b919050565b5f5f5f5f5f5f5f5f60c0898b03121561035e575f5ffd5b88356001600160a01b0381168114610374575f5ffd5b975060208901356001600160401b0381111561038e575f5ffd5b61039a8b828c016102ed565b90985096505060408901356001600160401b038111156103b8575f5ffd5b6103c48b828c016102ed565b909650945050606089013560ff811681146103dd575f5ffd5b92506103eb60808a01610331565b91506103f960a08a01610331565b90509295985092959890939650565b6001600160a01b0391909116815260200190565b5f6020828403121561042c575f5ffd5b8151801515811461043b575f5ffd5b9392505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b038b811682528a8116602083015289166040820152610100606082018190525f9061049f908301898b610442565b82810360808401526104b281888a610442565b60ff9690961660a0840152505061ffff92831660c0820152911660e090910152979650505050505050565b600281106104f957634e487b7160e01b5f52602160045260245ffd5b9052565b6001600160a01b03831681526040810161043b60208301846104dd565b60c081525f61052d60c083018a8c610442565b828103602084015261054081898b610442565b91505060ff8616604083015261ffff8516606083015261ffff8416608083015261056d60a08301846104dd565b999850505050505050505056fe60c060405234801561000f575f5ffd5b50604051614cb5380380614cb583398101604081905261002e916109aa565b8787878787878787856001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610072573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100969190610a79565b858560036100a48382610b1f565b5060046100b18282610b1f565b5050505f5f6100c58361057660201b60201c565b91509150816100d55760126100d7565b805b60ff1660a05250506001600160a01b03908116608052600160055587166101115760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0386166101385760405163e6c4247b60e01b815260040160405180910390fd5b600680546001600160a01b03808b166001600160a01b031992831617909255600780548a841690831617905560088054928916929091168217905560408051630691d8b960e31b8152905163348ec5c8916004808201926020929091908290030181865afa1580156101ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d09190610a79565b60095f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b0316633a0dad8e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610231573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102559190610a79565b600a5f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b031663d1717c7d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102b6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102da9190610bd9565b600a60146101000a81548160ff021916908360ff1602179055505f600d819055505f6014819055505f6015819055505f866001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610346573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036a9190610a79565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103c99190610bd9565b9050601260ff821611156103f057604051631c03248960e11b815260040160405180910390fd5b600460ff85161115610415576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff8416111561043c576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff83161115610463576040516317dbc4cb60e21b815260040160405180910390fd5b8360ff16600481111561047857610478610bf2565b6017805460ff1916600183600481111561049457610494610bf2565b02179055506017805461ffff84811663010000000264ffff00000019918716610100029190911664ffffffff0019909216919091171790556104d781600a610cfd565b6018556104e261064c565b50505050505050505061056960085f9054906101000a90046001600160a01b03166001600160a01b031663d86cd44e6040518163ffffffff1660e01b81526004015f60405180830381865afa15801561053d573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105649190810190610d0b565b610721565b5050505050505050610e68565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b038716916105bc91610dbd565b5f60405180830381855afa9150503d805f81146105f4576040519150601f19603f3d011682016040523d82523d5f602084013e6105f9565b606091505b509150915081801561060d57506020815110155b15610640575f818060200190518101906106279190610dd3565b905060ff811161063e576001969095509350505050565b505b505f9485945092505050565b60085460408051636c366a2760e11b815290515f926001600160a01b03169163d86cd44e91600480830192869291908290030181865afa158015610692573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106b99190810190610d0b565b90505f5b815181101561071d575f6106f48383815181106106dc576106dc610dea565b6020026020010151600b61085860201b90919060201c565b90508061071457604051630ea075bf60e21b815260040160405180910390fd5b506001016106bd565b5050565b6007546001600160a01b03163b5f0361074157601f805460ff1916905550565b6007546040516301ffc9a760e01b8152635b24e9f760e11b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa9250505080156107ac575060408051601f3d908101601f191682019092526107a991810190610dfe565b60015b6107c95760405163298febe360e01b815260040160405180910390fd5b801561083c57601f805460ff1916600117905560075460405163c653526b60e01b81526001600160a01b039091169063c653526b9061080c908590600401610e1d565b5f6040518083038186803b158015610822575f5ffd5b505afa158015610834573d5f5f3e3d5ffd5b505050505050565b60405163298febe360e01b815260040160405180910390fd5b50565b5f61086c836001600160a01b038416610875565b90505b92915050565b5f8181526001830160205260408120546108ba57508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561086f565b505f61086f565b6001600160a01b0381168114610855575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715610911576109116108d5565b604052919050565b5f82601f830112610928575f5ffd5b81516001600160401b03811115610941576109416108d5565b610954601f8201601f19166020016108e9565b818152846020838601011115610968575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b805160ff81168114610994575f5ffd5b919050565b805161ffff81168114610994575f5ffd5b5f5f5f5f5f5f5f5f610100898b0312156109c2575f5ffd5b88516109cd816108c1565b60208a01519098506109de816108c1565b60408a01519097506109ef816108c1565b60608a01519096506001600160401b03811115610a0a575f5ffd5b610a168b828c01610919565b60808b015190965090506001600160401b03811115610a33575f5ffd5b610a3f8b828c01610919565b945050610a4e60a08a01610984565b9250610a5c60c08a01610999565b9150610a6a60e08a01610999565b90509295985092959890939650565b5f60208284031215610a89575f5ffd5b8151610a94816108c1565b9392505050565b600181811c90821680610aaf57607f821691505b602082108103610acd57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610b1a57805f5260205f20601f840160051c81016020851015610af85750805b601f840160051c820191505b81811015610b17575f8155600101610b04565b50505b505050565b81516001600160401b03811115610b3857610b386108d5565b610b4c81610b468454610a9b565b84610ad3565b6020601f821160018114610b7e575f8315610b675750848201515b5f19600385901b1c1916600184901b178455610b17565b5f84815260208120601f198516915b82811015610bad5787850151825560209485019460019092019101610b8d565b5084821015610bca57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60208284031215610be9575f5ffd5b61086c82610984565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b6001841115610c5557808504811115610c3957610c39610c06565b6001841615610c4757908102905b60019390931c928002610c1e565b935093915050565b5f82610c6b5750600161086f565b81610c7757505f61086f565b8160018114610c8d5760028114610c9757610cb3565b600191505061086f565b60ff841115610ca857610ca8610c06565b50506001821b61086f565b5060208310610133831016604e8410600b8410161715610cd6575081810a61086f565b610ce25f198484610c1a565b805f1904821115610cf557610cf5610c06565b029392505050565b5f61086c60ff841683610c5d565b5f60208284031215610d1b575f5ffd5b81516001600160401b03811115610d30575f5ffd5b8201601f81018413610d40575f5ffd5b80516001600160401b03811115610d5957610d596108d5565b8060051b610d69602082016108e9565b91825260208184018101929081019087841115610d84575f5ffd5b6020850194505b83851015610db25784519250610da0836108c1565b82825260209485019490910190610d8b565b979650505050505050565b5f82518060208501845e5f920191825250919050565b5f60208284031215610de3575f5ffd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610e0e575f5ffd5b81518015158114610a94575f5ffd5b602080825282518282018190525f918401906040840190835b81811015610e5d5783516001600160a01b0316835260209384019390920191600101610e36565b509095945050505050565b60805160a051613e2f610e865f395f50505f610f750152613e2f5ff3fe608060405234801561000f575f5ffd5b50600436106102b2575f3560e01c806301e1d114146102b657806303d44854146102cd57806306fdde03146102e257806307a2d13a146102f7578063095ea7b31461030a5780630a28a4771461032d5780630a605c6d146103405780630c6a62dd146103485780630d1e66671461035b5780630df571f71461036e578063105444941461038157806318160ddd1461039457806318c219491461039c5780631f52692b146103af57806323b872dd146103cf578063313ce567146103e2578063348ec5c8146103f757806338d52e0f1461040a5780633a0dad8e146104125780633ab6d27c14610425578063402d267d14610438578063493a6e211461044c5780634cdad5061461032d5780634e85b1351461045f5780635de3dfdc146104745780636e553f651461047f57806370a082311461048d5780637847ea53146104a057806379502c55146104c057806380ceebfe146104d35780638f5c9465146104e657806394bf804d1461047f57806395d89b411461050257806397ee11441461050a5780639908840c14610540578063a68a526714610549578063a9059cbb1461055c578063aa2f892d1461056f578063acdb3d5114610582578063b1bd7e2e1461058b578063b3d7f6b91461032d578063b460af941461059e578063b6eba653146105ac578063ba0876521461059e578063bdca9165146105c2578063c0b568e1146105cb578063c3f0d30e146105de578063c63d75b614610438578063c6e6f592146105f1578063ce96cb7714610604578063d1717c7d14610617578063d3d034581461062b578063d853365f14610641578063d905777e14610649578063dd62ed3e1461065c578063e51a85f61461066f578063e5e9719314610682578063e66f53b714610695578063ef8b30f71461032d578063f64c6f32146106a8575b5f5ffd5b600d545b6040519081526020015b60405180910390f35b6102e06102db3660046133b6565b6106b0565b005b6102ea610893565b6040516102c49190613425565b6102ba61030536600461345a565b610923565b61031d610318366004613485565b610934565b60405190151581526020016102c4565b6102ba61033b36600461345a565b61094b565b6015546102ba565b6102e06103563660046134af565b610965565b6102e061036936600461345a565b610a72565b6102e061037c3660046134ca565b610ce3565b6102e061038f36600461352a565b610d5e565b6002546102ba565b6102e06103aa36600461345a565b610e7f565b6006546103c2906001600160a01b031681565b6040516102c49190613571565b61031d6103dd366004613585565b610f4e565b60125b60405160ff90911681526020016102c4565b6009546103c2906001600160a01b031681565b6103c2610f73565b600a546103c2906001600160a01b031681565b6102e06104333660046135e0565b610f97565b6102ba6104463660046134af565b505f1990565b6102e061045a36600461345a565b611164565b6104676114ab565b6040516102c4919061366b565b601f5460ff1661031d565b6102ba61033b36600461367d565b6102ba61049b3660046134af565b6114bc565b6104ab6301e1338081565b60405163ffffffff90911681526020016102c4565b6008546103c2906001600160a01b031681565b6102ba6104e13660046136ab565b6114d6565b6104ef61271081565b60405161ffff90911681526020016102c4565b6102ea611516565b6017546018546105309160ff81169161ffff610100830481169263010000009004169084565b6040516102c494939291906136ed565b6104ef61012c81565b6102ba6105573660046136ab565b611525565b61031d61056a366004613485565b611554565b6102e061057d36600461345a565b611561565b6102ba60165481565b6102e061059936600461372b565b61173a565b6102ba61033b366004613769565b6105b461196a565b6040516102c492919061379d565b6104ef610bb881565b6102e06105d936600461345a565b611ac1565b6102e06105ec36600461345a565b611c7b565b6102ba6105ff36600461345a565b611e6f565b6102ba6106123660046134af565b611e7a565b600a546103e590600160a01b900460ff1681565b610633611e8d565b6040516102c49291906137fb565b6103e5601281565b6102ba6106573660046134af565b611fb7565b6102ba61066a366004613847565b611fc1565b6102ba61067d36600461345a565b611feb565b6102e061069036600461345a565b612024565b6007546103c2906001600160a01b031681565b6014546102ba565b6006546001600160a01b031633146106db57604051631a27eac360e11b815260040160405180910390fd5b6106e5600b6122fc565b5f5b818110156107e5575f83838381811061070257610702613873565b905060200201602081019061071791906134af565b600854604051633af32abf60e01b81529192506001600160a01b031690633af32abf90610748908490600401613571565b602060405180830381865afa158015610763573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107879190613887565b6107af578060405163751dff9760e11b81526004016107a69190613571565b60405180910390fd5b5f6107bb600b83612305565b9050806107db57604051630ea075bf60e21b815260040160405180910390fd5b50506001016106e7565b50601f5460ff16156108505760075460405163c653526b60e01b81526001600160a01b039091169063c653526b9061082390859085906004016138a6565b5f6040518083038186803b158015610839575f5ffd5b505afa15801561084b573d5f5f3e3d5ffd5b505050505b81816040516108609291906138f2565b604051908190038120907fa975983c7a4dcf80477a447433240de322f36428f1b3864e50d7a45e14c68b66905f90a25050565b6060600380546108a290613933565b80601f01602080910402602001604051908101604052809291908181526020018280546108ce90613933565b80156109195780601f106108f057610100808354040283529160200191610919565b820191905f5260205f20905b8154815290600101906020018083116108fc57829003601f168201915b5050505050905090565b5f61092e825f612319565b92915050565b5f3361094181858561235a565b5060019392505050565b5f60405163125ad87760e31b815260040160405180910390fd5b6006546001600160a01b0316331461099057604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b0381166109b75760405163e6c4247b60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b03831617905560408051634e85b13560e01b81529051610a3c913091634e85b135916004808201925f929091908290030181865afa158015610a10573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a3791908101906139f9565b61236c565b6040516001600160a01b038216907f83293ffeebb677b167941693470018acf300605df266a35e9fdb66f24ff00fe0905f90a250565b610a7a6124a0565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aca573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aee9190613887565b610b0b576040516312aecd8160e01b815260040160405180910390fd5b805f03610b3457610b1a610f73565b604051636b30633560e01b81526004016107a69190613571565b5f610b3d610f73565b6001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401610b689190613571565b602060405180830381865afa158015610b83573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba79190613a8d565b905080821115610bca57604051632ca2f52b60e11b815260040160405180910390fd5b5f610bd3610f73565b600a546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92610c09923392909116908890600401613aa4565b6020604051808303815f875af1158015610c25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c499190613887565b905080610c69576040516312171d8360e31b815260040160405180910390fd5b5f610c75600e336124ca565b9150610c90905033610c878684613adc565b600e91906124f0565b508360145f828254610ca29190613adc565b9091555050604051849033907f55896b30a78fc55b78937f8014dde3f0035e9d37a4f6ac36841fb8b62f7e2b13905f90a3505050610ce06001600555565b50565b6009546001600160a01b03163314610d0e57604051631a27eac360e11b815260040160405180910390fd5b8015610d5a578060165f828254610d259190613adc565b9091555050601654604051829084907f8b8789cf9157fe7b016901e4ed3a5d0971caa8b7c031da0b25638ccf65841b2a905f90a45b5050565b6009546001600160a01b03163314610d8957604051631a27eac360e11b815260040160405180910390fd5b610d936019612505565b815f5b8161ffff168161ffff161015610e2357610e1a85858361ffff16818110610dbf57610dbf613873565b610dd592602060409092020190810191506134af565b86868461ffff16818110610deb57610deb613873565b9050604002016020016020810190610e039190613b00565b63ffffffff1660196124f09092919063ffffffff16565b50600101610d96565b50600d8290555f610e3b60125b61030590600a613bfe565b601854909150811115610e4e5760188190555b60405183907f5e1ff954b5e5257e9ee5d4cb07059e8f5e69b1aaaf9911e5d8d90a6894de9c21905f90a25050505050565b6006546001600160a01b03163314610eaa57604051631a27eac360e11b815260040160405180910390fd5b805f03610eb957610b1a610f73565b601654811115610edc57604051632ca2f52b60e11b815260040160405180910390fd5b8060165f828254610eed9190613c0c565b9091555050600a5460405163741fca4b60e01b8152600481018390526001600160a01b039091169063741fca4b906024015f604051808303815f87803b158015610f35575f5ffd5b505af1158015610f47573d5f5f3e3d5ffd5b5050505050565b5f33610f5b85828561250e565b610f6685858561255f565b60019150505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6006546001600160a01b03163314610fc257604051631a27eac360e11b815260040160405180910390fd5b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611012573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110369190613887565b611053576040516312aecd8160e01b815260040160405180910390fd5b600460ff84161115611078576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff8316111561109f576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff821611156110c6576040516317dbc4cb60e21b815260040160405180910390fd5b8260ff1660048111156110db576110db6136d9565b6017805460ff191660018360048111156110f7576110f76136d9565b02179055506017805464ffffffff00191661010061ffff85811691820264ffff00000019169290921763010000009285169283021790925560405190919060ff8616907fd24f39e523bfa412fa391702710dc62e1c82d87a8e83228a37c42be1b4870f45905f90a4505050565b600a546001600160a01b0316331461118f57604051631a27eac360e11b815260040160405180910390fd5b6111976124a0565b5f6111a260116125bc565b90508063ffffffff165f036111b757506114a1565b5f8163ffffffff166001600160401b038111156111d6576111d661396b565b6040519080825280602002602001820160405280156111ff578160200160208202803683370190505b5090505f8263ffffffff166001600160401b038111156112215761122161396b565b60405190808252806020026020018201604052801561124a578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff1610156112e4575f80611279601163ffffffff808616906125c616565b9150915081858463ffffffff168151811061129657611296613873565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff16815181106112cf576112cf613873565b6020908102919091010152505060010161124f565b505f601581905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa158015611333573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113579190613c1f565b90505f5b8463ffffffff168163ffffffff16101561149b575f848263ffffffff168151811061138857611388613873565b602002602001015190505f848363ffffffff16815181106113ab576113ab613873565b602002602001015190506113c98260116125d490919063ffffffff16565b505f6113d6828a5f611525565b90506113e230836125e8565b600a54604051634adfc2e760e01b81526001600160a01b0390911690634adfc2e7906114149086908590600401613c3a565b5f604051808303815f87803b15801561142b575f5ffd5b505af115801561143d573d5f5f3e3d5ffd5b5050604080518481526020810186905261ffff891693506001600160a01b038716925030917f215abfcd108b85fbee47f26fda2de66f90f14fa5fcaf0201698ad8ac9323545f910160405180910390a450505080600101905061135b565b50505050505b610ce06001600555565b60606114b7600b61261c565b905090565b6001600160a01b03165f9081526020819052604090205490565b5f61150e6114e2612628565b6114ed90600a613bfe565b6002546114fa9190613adc565b611505856001613adc565b869190856126a4565b949350505050565b6060600480546108a290613933565b5f61150e611534846001613adc565b61153c612628565b61154790600a613bfe565b6002546115059190613adc565b5f3361094181858561255f565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115b1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d59190613887565b6115f2576040516312aecd8160e01b815260040160405180910390fd5b805f036116145730604051636b30633560e01b81526004016107a69190613571565b5f61161e336114bc565b90508082111561164157604051632ca2f52b60e11b815260040160405180910390fd5b6040516323b872dd60e01b81525f9030906323b872dd9061166a90339084908890600401613aa4565b6020604051808303815f875af1158015611686573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116aa9190613887565b9050806116ca576040516312171d8360e31b815260040160405180910390fd5b5f6116d66011336124ca565b91506116f19050336116e88684613adc565b601191906124f0565b508360155f8282546117039190613adc565b9091555050604051849033907f222dc200773fe9b45015bf792e8fee37d651e3590c215806a5042404b6d741d2905f90a350505050565b6007546001600160a01b0316331461176557604051631a27eac360e11b815260040160405180910390fd5b601f5460ff1615611789576040516317dbc4cb60e21b815260040160405180910390fd5b5f8190036117aa57604051631121aa8d60e01b815260040160405180910390fd5b6117b4601c612505565b5f816001600160401b038111156117cd576117cd61396b565b6040519080825280602002602001820160405280156117f6578160200160208202803683370190505b5090505f82815b8161ffff168161ffff1610156118f4575f86868361ffff1681811061182457611824613873565b61183a92602060409092020190810191506134af565b90505f87878461ffff1681811061185357611853613873565b905060400201602001602081019061186b9190613b00565b905081868461ffff168151811061188457611884613873565b6001600160a01b03909216602092830291909101909101525f6118b2601c8463ffffffff808616906124f016565b9050806118d457826040516346bdabe160e01b81526004016107a69190613571565b6118e463ffffffff831687613adc565b95505050508060010190506117fd565b506118fe836126e6565b600a60149054906101000a900460ff16600a61191a9190613bfe565b821461193957604051639006dd2760e01b815260040160405180910390fd5b60405133907f2d47a742b8d7df7c1fc5a9a631b206b364e6cb2722490759f63bb3ab14b132e0905f90a25050505050565b601f54606090819060ff161561198a5761198261275e565b915091509091565b5f611995601c6125bc565b90508061ffff166001600160401b038111156119b3576119b361396b565b6040519080825280602002602001820160405280156119dc578160200160208202803683370190505b5092508061ffff166001600160401b038111156119fb576119fb61396b565b604051908082528060200260200182016040528015611a24578160200160208202803683370190505b5091505f5b8161ffff168161ffff161015611abb575f80611a4a601c61ffff85166125c6565b9150915081868461ffff1681518110611a6557611a65613873565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611a9c57611a9c613873565b63ffffffff909216602092830291909101909101525050600101611a29565b50509091565b611ac96124a0565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b19573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b3d9190613887565b611b5a576040516312aecd8160e01b815260040160405180910390fd5b805f03611b6957610b1a610f73565b5f611b75600e336124ca565b91505081811015611b9957604051632ca2f52b60e11b815260040160405180910390fd5b600a546040516351edffb160e01b81526001600160a01b03909116906351edffb190611bcb9033908690600401613c3a565b5f604051808303815f87803b158015611be2575f5ffd5b505af1158015611bf4573d5f5f3e3d5ffd5b505050505f8282611c059190613c0c565b9050805f03611c1f57611c19600e336125d4565b50611c2d565b611c2b600e33836124f0565b505b8260145f828254611c3e9190613c0c565b9091555050604051839033907f96a9a6886cdf3047a125454218a23d3961fd3a78643123b248a9d106d0ac94fd905f90a35050610ce06001600555565b611c836124a0565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cd3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cf79190613887565b611d14576040516312aecd8160e01b815260040160405180910390fd5b805f03611d365730604051636b30633560e01b81526004016107a69190613571565b5f611d426011336124ca565b91505081811015611d6657604051632ca2f52b60e11b815260040160405180910390fd5b5f611d718383613c0c565b9050805f03611d8b57611d856011336125d4565b50611d99565b611d97601133836124f0565b505b8260155f828254611daa9190613c0c565b909155505060405163a9059cbb60e01b81525f90309063a9059cbb90611dd69033908890600401613c3a565b6020604051808303815f875af1158015611df2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e169190613887565b905080611e36576040516312171d8360e31b815260040160405180910390fd5b604051849033907f046d3e17087d323298991516e3fdec36fe1204d6bff7fb6e2b8eca77b80a22ad905f90a3505050610ce06001600555565b5f61092e825f612990565b5f61092e611e87836114bc565b5f612319565b6060805f611e9b60196125bc565b90508061ffff166001600160401b03811115611eb957611eb961396b565b604051908082528060200260200182016040528015611ee2578160200160208202803683370190505b5092508061ffff166001600160401b03811115611f0157611f0161396b565b604051908082528060200260200182016040528015611f2a578160200160208202803683370190505b5091505f5b8161ffff168161ffff161015611abb575f80611f50601961ffff85166125c6565b9150915081868461ffff1681518110611f6b57611f6b613873565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611fa257611fa2613873565b60209081029190910101525050600101611f2f565b5f61092e826114bc565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b5f5f611ff6836129c2565b90505f6120038285613c0c565b90505f61200f82612a8c565b905061201b8184613adc565b95945050505050565b600a546001600160a01b0316331461204f57604051631a27eac360e11b815260040160405180910390fd5b6120576124a0565b5f612062600e6125bc565b90508063ffffffff165f0361207757506114a1565b5f8163ffffffff166001600160401b038111156120965761209661396b565b6040519080825280602002602001820160405280156120bf578160200160208202803683370190505b5090505f8263ffffffff166001600160401b038111156120e1576120e161396b565b60405190808252806020026020018201604052801561210a578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff1610156121a4575f80612139600e63ffffffff808616906125c616565b9150915081858463ffffffff168151811061215657612156613873565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff168151811061218f5761218f613873565b6020908102919091010152505060010161210f565b505f601481905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa1580156121f3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122179190613c1f565b90505f5b8463ffffffff168163ffffffff16101561149b575f848263ffffffff168151811061224857612248613873565b602002602001015190505f848363ffffffff168151811061226b5761226b613873565b6020026020010151905061228982600e6125d490919063ffffffff16565b505f612296828a5f6114d6565b90506122a28382612b1c565b604080518381526020810183905261ffff8716916001600160a01b0386169130917f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f6910160405180910390a450505080600101905061221b565b610ce081612b50565b5f610f6c836001600160a01b038416612ba9565b5f610f6c612326600d5490565b612331906001613adc565b612339612628565b61234490600a613bfe565b6002546123519190613adc565b859190856126a4565b6123678383836001612bf0565b505050565b6007546001600160a01b03163b5f0361238c57601f805460ff1916905550565b6007546040516301ffc9a760e01b8152635b24e9f760e11b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa9250505080156123f7575060408051601f3d908101601f191682019092526123f491810190613887565b60015b6124145760405163298febe360e01b815260040160405180910390fd5b801561248757601f805460ff1916600117905560075460405163c653526b60e01b81526001600160a01b039091169063c653526b9061245790859060040161366b565b5f6040518083038186803b15801561246d575f5ffd5b505afa15801561247f573d5f5f3e3d5ffd5b505050505050565b60405163298febe360e01b815260040160405180910390fd5b6002600554036124c357604051633ee5aeb560e01b815260040160405180910390fd5b6002600555565b5f8080806124e1866001600160a01b038716612cc2565b909450925050505b9250929050565b5f61150e846001600160a01b03851684612cfa565b610ce081612d16565b5f6125198484611fc1565b90505f19811015612559578181101561254b57828183604051637dc7a0d960e11b81526004016107a693929190613c53565b61255984848484035f612bf0565b50505050565b6001600160a01b038316612588575f604051634b637e8f60e11b81526004016107a69190613571565b6001600160a01b0382166125b1575f60405163ec442f0560e01b81526004016107a69190613571565b612367838383612d5f565b5f61092e82612e72565b5f8080806124e18686612e7c565b5f610f6c836001600160a01b038416612ea5565b6001600160a01b038216612611575f604051634b637e8f60e11b81526004016107a69190613571565b610d5a825f83612d5f565b60605f610f6c83612ec1565b5f5f612632610f73565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561266d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126919190613c74565b905061269e816012613c8f565b91505090565b5f6126d16126b183612f1a565b80156126cc57505f84806126c7576126c7613ca8565b868809115b151590565b6126dc868686612f46565b61201b9190613adc565b5f5b8151811015610d5a5761271e82828151811061270657612706613873565b6020026020010151600b612ff690919063ffffffff16565b6127565781818151811061273457612734613873565b602002602001015160405163751dff9760e11b81526004016107a69190613571565b6001016126e8565b6060805f306001600160a01b0316634e85b1356040518163ffffffff1660e01b81526004015f60405180830381865afa15801561279d573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526127c491908101906139f9565b60075460405163701a818560e01b81529192505f916001600160a01b039091169063701a8185906127f990859060040161366b565b5f60405180830381865afa158015612813573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261283a9190810190613cbc565b905080516001600160401b038111156128555761285561396b565b60405190808252806020026020018201604052801561287e578160200160208202803683370190505b50935080516001600160401b0381111561289a5761289a61396b565b6040519080825280602002602001820160405280156128c3578160200160208202803683370190505b5092505f5b81518161ffff16101561298957818161ffff16815181106128eb576128eb613873565b60200260200101515f0151858261ffff168151811061290c5761290c613873565b60200260200101906001600160a01b031690816001600160a01b031681525050818161ffff168151811061294257612942613873565b602002602001015160200151848261ffff168151811061296457612964613873565b63ffffffff9092166020928302919091019091015261298281613d7d565b90506128c8565b5050509091565b5f610f6c61299c612628565b6129a790600a613bfe565b6002546129b49190613adc565b600d54612351906001613adc565b6017545f906301000000900461ffff1681036129df57505f919050565b6017545f906129fc906301000000900461ffff1684612710612f46565b9050610f6c60095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a51573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a759190613d9d565b829063ffffffff908116906301e1338090612f4616565b6017545f90610100900461ffff168103612aa757505f919050565b5f612abe612ab76012600a613bfe565b845f611525565b6017549091505f908190612ad49060ff1661300a565b9150915081831015612aea57505f949350505050565b6017545f90612b0390610100900461ffff168584612f46565b9050612b128187612710612f46565b9695505050505050565b6001600160a01b038216612b45575f60405163ec442f0560e01b81526004016107a69190613571565b610d5a5f8383612d5f565b5f612b59825490565b90505f5b81811015612ba257826001015f845f018381548110612b7e57612b7e613873565b905f5260205f20015481526020019081526020015f205f9055806001019050612b5d565b50505f9055565b5f612bb483836130f4565b612be957508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561092e565b505f61092e565b6001600160a01b038416612c19575f60405163e602df0560e01b81526004016107a69190613571565b6001600160a01b038316612c42575f604051634a1406b160e11b81526004016107a69190613571565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561255957826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612cb491815260200190565b60405180910390a350505050565b5f818152600283016020526040812054819080612cef57612ce3858561310b565b92505f91506124e99050565b6001925090506124e9565b5f828152600284016020526040812082905561150e8484613116565b5f612d2082612e72565b90505f5b81811015612d5557600283015f612d3b8584613121565b815260208101919091526040015f90812055600101612d24565b50610d5a826122fc565b6001600160a01b038316612d89578060025f828254612d7e9190613adc565b90915550612de69050565b6001600160a01b0383165f9081526020819052604090205481811015612dc85783818360405163391434e360e21b81526004016107a693929190613c53565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216612e0257600280548290039055612e20565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612e6591815260200190565b60405180910390a3505050565b5f61092e8261312c565b5f8080612e898585613121565b5f81815260029690960160205260409095205494959350505050565b5f8181526002830160205260408120819055610f6c8383613135565b6060815f01805480602002602001604051908101604052809291908181526020018280548015612f0e57602002820191905f5260205f20905b815481526020019060010190808311612efa575b50505050509050919050565b5f6002826003811115612f2f57612f2f6136d9565b612f399190613db8565b60ff166001149050919050565b5f5f5f612f538686613140565b91509150815f03612f7757838181612f6d57612f6d613ca8565b0492505050610f6c565b818411612f8e57612f8e600385150260111861315c565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f610f6c836001600160a01b0384166130f4565b5f80806130176012610e30565b90505f84600481111561302c5761302c6136d9565b0361303c578092508291506130ee565b6003846004811115613050576130506136d9565b036130625760185492508291506130ee565b6001846004811115613076576130766136d9565b0361308e576130848161316d565b92508091506130ee565b60028460048111156130a2576130a26136d9565b036130ba576130b08161316d565b92508291506130ee565b60048460048111156130ce576130ce6136d9565b036130ee576018546130e8906130e38361316d565b613293565b92508291505b50915091565b5f9081526001919091016020526040902054151590565b5f610f6c83836132a2565b5f610f6c8383612ba9565b5f610f6c83836132ad565b5f61092e825490565b5f610f6c83836132d3565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f5f60085f9054906101000a90046001600160a01b03166001600160a01b031663f3cc69936040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131e39190613c1f565b61ffff1690505f61327860095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561323d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132619190613d9d565b839063ffffffff908116906301e1338090612f4616565b905061150e61328982612710613adc565b8590612710612f46565b5f828218828411028218610f6c565b5f610f6c83836130f4565b5f825f0182815481106132c2576132c2613873565b905f5260205f200154905092915050565b5f81815260018301602052604081205480156133ad575f6132f5600183613c0c565b85549091505f9061330890600190613c0c565b9050808214613367575f865f01828154811061332657613326613873565b905f5260205f200154905080875f01848154811061334657613346613873565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061337857613378613de5565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061092e565b5f91505061092e565b5f5f602083850312156133c7575f5ffd5b82356001600160401b038111156133dc575f5ffd5b8301601f810185136133ec575f5ffd5b80356001600160401b03811115613401575f5ffd5b8560208260051b8401011115613415575f5ffd5b6020919091019590945092505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f6020828403121561346a575f5ffd5b5035919050565b6001600160a01b0381168114610ce0575f5ffd5b5f5f60408385031215613496575f5ffd5b82356134a181613471565b946020939093013593505050565b5f602082840312156134bf575f5ffd5b8135610f6c81613471565b5f5f604083850312156134db575f5ffd5b50508035926020909101359150565b5f5f83601f8401126134fa575f5ffd5b5081356001600160401b03811115613510575f5ffd5b6020830191508360208260061b85010111156124e9575f5ffd5b5f5f5f6040848603121561353c575f5ffd5b83356001600160401b03811115613551575f5ffd5b61355d868287016134ea565b909790965060209590950135949350505050565b6001600160a01b0391909116815260200190565b5f5f5f60608486031215613597575f5ffd5b83356135a281613471565b925060208401356135b281613471565b929592945050506040919091013590565b60ff81168114610ce0575f5ffd5b61ffff81168114610ce0575f5ffd5b5f5f5f606084860312156135f2575f5ffd5b83356135fd816135c3565b9250602084013561360d816135d1565b9150604084013561361d816135d1565b809150509250925092565b5f8151808452602084019350602083015f5b828110156136615781516001600160a01b031686526020958601959091019060010161363a565b5093949350505050565b602081525f610f6c6020830184613628565b5f5f6040838503121561368e575f5ffd5b8235915060208301356136a081613471565b809150509250929050565b5f5f5f606084860312156136bd575f5ffd5b833592506020840135915060408401356004811061361d575f5ffd5b634e487b7160e01b5f52602160045260245ffd5b608081016005861061370d57634e487b7160e01b5f52602160045260245ffd5b94815261ffff93841660208201529190921660408201526060015290565b5f5f6020838503121561373c575f5ffd5b82356001600160401b03811115613751575f5ffd5b61375d858286016134ea565b90969095509350505050565b5f5f5f6060848603121561377b575f5ffd5b83359250602084013561378d81613471565b9150604084013561361d81613471565b604081525f6137af6040830185613628565b82810360208401528084518083526020830191506020860192505f5b818110156137ef57835163ffffffff168352602093840193909201916001016137cb565b50909695505050505050565b604081525f61380d6040830185613628565b82810360208401528084518083526020830191506020860192505f5b818110156137ef578351835260209384019390920191600101613829565b5f5f60408385031215613858575f5ffd5b823561386381613471565b915060208301356136a081613471565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613897575f5ffd5b81518015158114610f6c575f5ffd5b602080825281018290525f8360408301825b858110156138e85782356138cb81613471565b6001600160a01b03168252602092830192909101906001016138b8565b5095945050505050565b5f8184825b8581101561392857813561390a81613471565b6001600160a01b0316835260209283019291909101906001016138f7565b509095945050505050565b600181811c9082168061394757607f821691505b60208210810361396557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b03811182821017156139a1576139a161396b565b60405290565b604051601f8201601f191681016001600160401b03811182821017156139cf576139cf61396b565b604052919050565b5f6001600160401b038211156139ef576139ef61396b565b5060051b60200190565b5f60208284031215613a09575f5ffd5b81516001600160401b03811115613a1e575f5ffd5b8201601f81018413613a2e575f5ffd5b8051613a41613a3c826139d7565b6139a7565b8082825260208201915060208360051b850101925086831115613a62575f5ffd5b6020840193505b82841015612b12578351613a7c81613471565b825260209384019390910190613a69565b5f60208284031215613a9d575f5ffd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561092e5761092e613ac8565b63ffffffff81168114610ce0575f5ffd5b5f60208284031215613b10575f5ffd5b8135610f6c81613aef565b6001815b6001841115613b5657808504811115613b3a57613b3a613ac8565b6001841615613b4857908102905b60019390931c928002613b1f565b935093915050565b5f82613b6c5750600161092e565b81613b7857505f61092e565b8160018114613b8e5760028114613b9857613bb4565b600191505061092e565b60ff841115613ba957613ba9613ac8565b50506001821b61092e565b5060208310610133831016604e8410600b8410161715613bd7575081810a61092e565b613be35f198484613b1b565b805f1904821115613bf657613bf6613ac8565b029392505050565b5f610f6c60ff841683613b5e565b8181038181111561092e5761092e613ac8565b5f60208284031215613c2f575f5ffd5b8151610f6c816135d1565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b5f60208284031215613c84575f5ffd5b8151610f6c816135c3565b60ff828116828216039081111561092e5761092e613ac8565b634e487b7160e01b5f52601260045260245ffd5b5f60208284031215613ccc575f5ffd5b81516001600160401b03811115613ce1575f5ffd5b8201601f81018413613cf1575f5ffd5b8051613cff613a3c826139d7565b8082825260208201915060208360061b850101925086831115613d20575f5ffd5b6020840193505b82841015612b125760408488031215613d3e575f5ffd5b613d4661397f565b8451613d5181613471565b81526020850151613d6181613aef565b8060208301525080835250602082019150604084019350613d27565b5f61ffff821661ffff8103613d9457613d94613ac8565b60010192915050565b5f60208284031215613dad575f5ffd5b8151610f6c81613aef565b5f60ff831680613dd657634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b634e487b7160e01b5f52603160045260245ffdfea26469706673582212202adca4528e879ae5ae2b6f30561933d6f6e0ae2a6c32405ec1e4730bbd879e3964736f6c634300081c0033a26469706673582212200dab9341a4c113732e87304aaf644f47ba828aba8aba7e71b46fa23183f39bd464736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610034575f3560e01c8063341624941461003857806379502c5514610061575b5f5ffd5b61004b610046366004610347565b610073565b6040516100589190610408565b60405180910390f35b5f5461004b906001600160a01b031681565b5f8054604051638771de8760e01b815233916001600160a01b031690638771de87906100a3908490600401610408565b602060405180830381865afa1580156100be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e2919061041c565b6100ff57604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b038a166101265760405163d92e233d60e01b815260040160405180910390fd5b5f5f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610175573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610199919061041c565b6101b6576040516312aecd8160e01b815260040160405180910390fd5b5f818b5f5f9054906101000a90046001600160a01b03168c8c8c8c8c8c8c6040516101e0906102e0565b6101f39a9998979695949392919061046a565b604051809103905ff08015801561020c573d5f5f3e3d5ffd5b505f8054604051631e832de160e21b81529295508593506001600160a01b031691637a0cb78491610242918591906004016104fd565b5f604051808303815f87803b158015610259575f5ffd5b505af115801561026b573d5f5f3e3d5ffd5b505050508a6001600160a01b0316826001600160a01b0316846001600160a01b03167f91700e2f05ab5287673189803ecbe9609340db98196ee954ac9865daf4308d2d8d8d8d8d8d8d8d5f6040516102ca98979695949392919061051a565b60405180910390a4505098975050505050505050565b614cb58061057b83390190565b5f5f83601f8401126102fd575f5ffd5b5081356001600160401b03811115610313575f5ffd5b60208301915083602082850101111561032a575f5ffd5b9250929050565b803561ffff81168114610342575f5ffd5b919050565b5f5f5f5f5f5f5f5f60c0898b03121561035e575f5ffd5b88356001600160a01b0381168114610374575f5ffd5b975060208901356001600160401b0381111561038e575f5ffd5b61039a8b828c016102ed565b90985096505060408901356001600160401b038111156103b8575f5ffd5b6103c48b828c016102ed565b909650945050606089013560ff811681146103dd575f5ffd5b92506103eb60808a01610331565b91506103f960a08a01610331565b90509295985092959890939650565b6001600160a01b0391909116815260200190565b5f6020828403121561042c575f5ffd5b8151801515811461043b575f5ffd5b9392505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b038b811682528a8116602083015289166040820152610100606082018190525f9061049f908301898b610442565b82810360808401526104b281888a610442565b60ff9690961660a0840152505061ffff92831660c0820152911660e090910152979650505050505050565b600281106104f957634e487b7160e01b5f52602160045260245ffd5b9052565b6001600160a01b03831681526040810161043b60208301846104dd565b60c081525f61052d60c083018a8c610442565b828103602084015261054081898b610442565b91505060ff8616604083015261ffff8516606083015261ffff8416608083015261056d60a08301846104dd565b999850505050505050505056fe60c060405234801561000f575f5ffd5b50604051614cb5380380614cb583398101604081905261002e916109aa565b8787878787878787856001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610072573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100969190610a79565b858560036100a48382610b1f565b5060046100b18282610b1f565b5050505f5f6100c58361057660201b60201c565b91509150816100d55760126100d7565b805b60ff1660a05250506001600160a01b03908116608052600160055587166101115760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0386166101385760405163e6c4247b60e01b815260040160405180910390fd5b600680546001600160a01b03808b166001600160a01b031992831617909255600780548a841690831617905560088054928916929091168217905560408051630691d8b960e31b8152905163348ec5c8916004808201926020929091908290030181865afa1580156101ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d09190610a79565b60095f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b0316633a0dad8e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610231573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102559190610a79565b600a5f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b031663d1717c7d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102b6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102da9190610bd9565b600a60146101000a81548160ff021916908360ff1602179055505f600d819055505f6014819055505f6015819055505f866001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610346573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036a9190610a79565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103c99190610bd9565b9050601260ff821611156103f057604051631c03248960e11b815260040160405180910390fd5b600460ff85161115610415576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff8416111561043c576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff83161115610463576040516317dbc4cb60e21b815260040160405180910390fd5b8360ff16600481111561047857610478610bf2565b6017805460ff1916600183600481111561049457610494610bf2565b02179055506017805461ffff84811663010000000264ffff00000019918716610100029190911664ffffffff0019909216919091171790556104d781600a610cfd565b6018556104e261064c565b50505050505050505061056960085f9054906101000a90046001600160a01b03166001600160a01b031663d86cd44e6040518163ffffffff1660e01b81526004015f60405180830381865afa15801561053d573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105649190810190610d0b565b610721565b5050505050505050610e68565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b038716916105bc91610dbd565b5f60405180830381855afa9150503d805f81146105f4576040519150601f19603f3d011682016040523d82523d5f602084013e6105f9565b606091505b509150915081801561060d57506020815110155b15610640575f818060200190518101906106279190610dd3565b905060ff811161063e576001969095509350505050565b505b505f9485945092505050565b60085460408051636c366a2760e11b815290515f926001600160a01b03169163d86cd44e91600480830192869291908290030181865afa158015610692573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106b99190810190610d0b565b90505f5b815181101561071d575f6106f48383815181106106dc576106dc610dea565b6020026020010151600b61085860201b90919060201c565b90508061071457604051630ea075bf60e21b815260040160405180910390fd5b506001016106bd565b5050565b6007546001600160a01b03163b5f0361074157601f805460ff1916905550565b6007546040516301ffc9a760e01b8152635b24e9f760e11b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa9250505080156107ac575060408051601f3d908101601f191682019092526107a991810190610dfe565b60015b6107c95760405163298febe360e01b815260040160405180910390fd5b801561083c57601f805460ff1916600117905560075460405163c653526b60e01b81526001600160a01b039091169063c653526b9061080c908590600401610e1d565b5f6040518083038186803b158015610822575f5ffd5b505afa158015610834573d5f5f3e3d5ffd5b505050505050565b60405163298febe360e01b815260040160405180910390fd5b50565b5f61086c836001600160a01b038416610875565b90505b92915050565b5f8181526001830160205260408120546108ba57508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561086f565b505f61086f565b6001600160a01b0381168114610855575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715610911576109116108d5565b604052919050565b5f82601f830112610928575f5ffd5b81516001600160401b03811115610941576109416108d5565b610954601f8201601f19166020016108e9565b818152846020838601011115610968575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b805160ff81168114610994575f5ffd5b919050565b805161ffff81168114610994575f5ffd5b5f5f5f5f5f5f5f5f610100898b0312156109c2575f5ffd5b88516109cd816108c1565b60208a01519098506109de816108c1565b60408a01519097506109ef816108c1565b60608a01519096506001600160401b03811115610a0a575f5ffd5b610a168b828c01610919565b60808b015190965090506001600160401b03811115610a33575f5ffd5b610a3f8b828c01610919565b945050610a4e60a08a01610984565b9250610a5c60c08a01610999565b9150610a6a60e08a01610999565b90509295985092959890939650565b5f60208284031215610a89575f5ffd5b8151610a94816108c1565b9392505050565b600181811c90821680610aaf57607f821691505b602082108103610acd57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610b1a57805f5260205f20601f840160051c81016020851015610af85750805b601f840160051c820191505b81811015610b17575f8155600101610b04565b50505b505050565b81516001600160401b03811115610b3857610b386108d5565b610b4c81610b468454610a9b565b84610ad3565b6020601f821160018114610b7e575f8315610b675750848201515b5f19600385901b1c1916600184901b178455610b17565b5f84815260208120601f198516915b82811015610bad5787850151825560209485019460019092019101610b8d565b5084821015610bca57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60208284031215610be9575f5ffd5b61086c82610984565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b6001841115610c5557808504811115610c3957610c39610c06565b6001841615610c4757908102905b60019390931c928002610c1e565b935093915050565b5f82610c6b5750600161086f565b81610c7757505f61086f565b8160018114610c8d5760028114610c9757610cb3565b600191505061086f565b60ff841115610ca857610ca8610c06565b50506001821b61086f565b5060208310610133831016604e8410600b8410161715610cd6575081810a61086f565b610ce25f198484610c1a565b805f1904821115610cf557610cf5610c06565b029392505050565b5f61086c60ff841683610c5d565b5f60208284031215610d1b575f5ffd5b81516001600160401b03811115610d30575f5ffd5b8201601f81018413610d40575f5ffd5b80516001600160401b03811115610d5957610d596108d5565b8060051b610d69602082016108e9565b91825260208184018101929081019087841115610d84575f5ffd5b6020850194505b83851015610db25784519250610da0836108c1565b82825260209485019490910190610d8b565b979650505050505050565b5f82518060208501845e5f920191825250919050565b5f60208284031215610de3575f5ffd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610e0e575f5ffd5b81518015158114610a94575f5ffd5b602080825282518282018190525f918401906040840190835b81811015610e5d5783516001600160a01b0316835260209384019390920191600101610e36565b509095945050505050565b60805160a051613e2f610e865f395f50505f610f750152613e2f5ff3fe608060405234801561000f575f5ffd5b50600436106102b2575f3560e01c806301e1d114146102b657806303d44854146102cd57806306fdde03146102e257806307a2d13a146102f7578063095ea7b31461030a5780630a28a4771461032d5780630a605c6d146103405780630c6a62dd146103485780630d1e66671461035b5780630df571f71461036e578063105444941461038157806318160ddd1461039457806318c219491461039c5780631f52692b146103af57806323b872dd146103cf578063313ce567146103e2578063348ec5c8146103f757806338d52e0f1461040a5780633a0dad8e146104125780633ab6d27c14610425578063402d267d14610438578063493a6e211461044c5780634cdad5061461032d5780634e85b1351461045f5780635de3dfdc146104745780636e553f651461047f57806370a082311461048d5780637847ea53146104a057806379502c55146104c057806380ceebfe146104d35780638f5c9465146104e657806394bf804d1461047f57806395d89b411461050257806397ee11441461050a5780639908840c14610540578063a68a526714610549578063a9059cbb1461055c578063aa2f892d1461056f578063acdb3d5114610582578063b1bd7e2e1461058b578063b3d7f6b91461032d578063b460af941461059e578063b6eba653146105ac578063ba0876521461059e578063bdca9165146105c2578063c0b568e1146105cb578063c3f0d30e146105de578063c63d75b614610438578063c6e6f592146105f1578063ce96cb7714610604578063d1717c7d14610617578063d3d034581461062b578063d853365f14610641578063d905777e14610649578063dd62ed3e1461065c578063e51a85f61461066f578063e5e9719314610682578063e66f53b714610695578063ef8b30f71461032d578063f64c6f32146106a8575b5f5ffd5b600d545b6040519081526020015b60405180910390f35b6102e06102db3660046133b6565b6106b0565b005b6102ea610893565b6040516102c49190613425565b6102ba61030536600461345a565b610923565b61031d610318366004613485565b610934565b60405190151581526020016102c4565b6102ba61033b36600461345a565b61094b565b6015546102ba565b6102e06103563660046134af565b610965565b6102e061036936600461345a565b610a72565b6102e061037c3660046134ca565b610ce3565b6102e061038f36600461352a565b610d5e565b6002546102ba565b6102e06103aa36600461345a565b610e7f565b6006546103c2906001600160a01b031681565b6040516102c49190613571565b61031d6103dd366004613585565b610f4e565b60125b60405160ff90911681526020016102c4565b6009546103c2906001600160a01b031681565b6103c2610f73565b600a546103c2906001600160a01b031681565b6102e06104333660046135e0565b610f97565b6102ba6104463660046134af565b505f1990565b6102e061045a36600461345a565b611164565b6104676114ab565b6040516102c4919061366b565b601f5460ff1661031d565b6102ba61033b36600461367d565b6102ba61049b3660046134af565b6114bc565b6104ab6301e1338081565b60405163ffffffff90911681526020016102c4565b6008546103c2906001600160a01b031681565b6102ba6104e13660046136ab565b6114d6565b6104ef61271081565b60405161ffff90911681526020016102c4565b6102ea611516565b6017546018546105309160ff81169161ffff610100830481169263010000009004169084565b6040516102c494939291906136ed565b6104ef61012c81565b6102ba6105573660046136ab565b611525565b61031d61056a366004613485565b611554565b6102e061057d36600461345a565b611561565b6102ba60165481565b6102e061059936600461372b565b61173a565b6102ba61033b366004613769565b6105b461196a565b6040516102c492919061379d565b6104ef610bb881565b6102e06105d936600461345a565b611ac1565b6102e06105ec36600461345a565b611c7b565b6102ba6105ff36600461345a565b611e6f565b6102ba6106123660046134af565b611e7a565b600a546103e590600160a01b900460ff1681565b610633611e8d565b6040516102c49291906137fb565b6103e5601281565b6102ba6106573660046134af565b611fb7565b6102ba61066a366004613847565b611fc1565b6102ba61067d36600461345a565b611feb565b6102e061069036600461345a565b612024565b6007546103c2906001600160a01b031681565b6014546102ba565b6006546001600160a01b031633146106db57604051631a27eac360e11b815260040160405180910390fd5b6106e5600b6122fc565b5f5b818110156107e5575f83838381811061070257610702613873565b905060200201602081019061071791906134af565b600854604051633af32abf60e01b81529192506001600160a01b031690633af32abf90610748908490600401613571565b602060405180830381865afa158015610763573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107879190613887565b6107af578060405163751dff9760e11b81526004016107a69190613571565b60405180910390fd5b5f6107bb600b83612305565b9050806107db57604051630ea075bf60e21b815260040160405180910390fd5b50506001016106e7565b50601f5460ff16156108505760075460405163c653526b60e01b81526001600160a01b039091169063c653526b9061082390859085906004016138a6565b5f6040518083038186803b158015610839575f5ffd5b505afa15801561084b573d5f5f3e3d5ffd5b505050505b81816040516108609291906138f2565b604051908190038120907fa975983c7a4dcf80477a447433240de322f36428f1b3864e50d7a45e14c68b66905f90a25050565b6060600380546108a290613933565b80601f01602080910402602001604051908101604052809291908181526020018280546108ce90613933565b80156109195780601f106108f057610100808354040283529160200191610919565b820191905f5260205f20905b8154815290600101906020018083116108fc57829003601f168201915b5050505050905090565b5f61092e825f612319565b92915050565b5f3361094181858561235a565b5060019392505050565b5f60405163125ad87760e31b815260040160405180910390fd5b6006546001600160a01b0316331461099057604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b0381166109b75760405163e6c4247b60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b03831617905560408051634e85b13560e01b81529051610a3c913091634e85b135916004808201925f929091908290030181865afa158015610a10573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a3791908101906139f9565b61236c565b6040516001600160a01b038216907f83293ffeebb677b167941693470018acf300605df266a35e9fdb66f24ff00fe0905f90a250565b610a7a6124a0565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aca573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aee9190613887565b610b0b576040516312aecd8160e01b815260040160405180910390fd5b805f03610b3457610b1a610f73565b604051636b30633560e01b81526004016107a69190613571565b5f610b3d610f73565b6001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401610b689190613571565b602060405180830381865afa158015610b83573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba79190613a8d565b905080821115610bca57604051632ca2f52b60e11b815260040160405180910390fd5b5f610bd3610f73565b600a546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92610c09923392909116908890600401613aa4565b6020604051808303815f875af1158015610c25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c499190613887565b905080610c69576040516312171d8360e31b815260040160405180910390fd5b5f610c75600e336124ca565b9150610c90905033610c878684613adc565b600e91906124f0565b508360145f828254610ca29190613adc565b9091555050604051849033907f55896b30a78fc55b78937f8014dde3f0035e9d37a4f6ac36841fb8b62f7e2b13905f90a3505050610ce06001600555565b50565b6009546001600160a01b03163314610d0e57604051631a27eac360e11b815260040160405180910390fd5b8015610d5a578060165f828254610d259190613adc565b9091555050601654604051829084907f8b8789cf9157fe7b016901e4ed3a5d0971caa8b7c031da0b25638ccf65841b2a905f90a45b5050565b6009546001600160a01b03163314610d8957604051631a27eac360e11b815260040160405180910390fd5b610d936019612505565b815f5b8161ffff168161ffff161015610e2357610e1a85858361ffff16818110610dbf57610dbf613873565b610dd592602060409092020190810191506134af565b86868461ffff16818110610deb57610deb613873565b9050604002016020016020810190610e039190613b00565b63ffffffff1660196124f09092919063ffffffff16565b50600101610d96565b50600d8290555f610e3b60125b61030590600a613bfe565b601854909150811115610e4e5760188190555b60405183907f5e1ff954b5e5257e9ee5d4cb07059e8f5e69b1aaaf9911e5d8d90a6894de9c21905f90a25050505050565b6006546001600160a01b03163314610eaa57604051631a27eac360e11b815260040160405180910390fd5b805f03610eb957610b1a610f73565b601654811115610edc57604051632ca2f52b60e11b815260040160405180910390fd5b8060165f828254610eed9190613c0c565b9091555050600a5460405163741fca4b60e01b8152600481018390526001600160a01b039091169063741fca4b906024015f604051808303815f87803b158015610f35575f5ffd5b505af1158015610f47573d5f5f3e3d5ffd5b5050505050565b5f33610f5b85828561250e565b610f6685858561255f565b60019150505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6006546001600160a01b03163314610fc257604051631a27eac360e11b815260040160405180910390fd5b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611012573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110369190613887565b611053576040516312aecd8160e01b815260040160405180910390fd5b600460ff84161115611078576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff8316111561109f576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff821611156110c6576040516317dbc4cb60e21b815260040160405180910390fd5b8260ff1660048111156110db576110db6136d9565b6017805460ff191660018360048111156110f7576110f76136d9565b02179055506017805464ffffffff00191661010061ffff85811691820264ffff00000019169290921763010000009285169283021790925560405190919060ff8616907fd24f39e523bfa412fa391702710dc62e1c82d87a8e83228a37c42be1b4870f45905f90a4505050565b600a546001600160a01b0316331461118f57604051631a27eac360e11b815260040160405180910390fd5b6111976124a0565b5f6111a260116125bc565b90508063ffffffff165f036111b757506114a1565b5f8163ffffffff166001600160401b038111156111d6576111d661396b565b6040519080825280602002602001820160405280156111ff578160200160208202803683370190505b5090505f8263ffffffff166001600160401b038111156112215761122161396b565b60405190808252806020026020018201604052801561124a578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff1610156112e4575f80611279601163ffffffff808616906125c616565b9150915081858463ffffffff168151811061129657611296613873565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff16815181106112cf576112cf613873565b6020908102919091010152505060010161124f565b505f601581905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa158015611333573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113579190613c1f565b90505f5b8463ffffffff168163ffffffff16101561149b575f848263ffffffff168151811061138857611388613873565b602002602001015190505f848363ffffffff16815181106113ab576113ab613873565b602002602001015190506113c98260116125d490919063ffffffff16565b505f6113d6828a5f611525565b90506113e230836125e8565b600a54604051634adfc2e760e01b81526001600160a01b0390911690634adfc2e7906114149086908590600401613c3a565b5f604051808303815f87803b15801561142b575f5ffd5b505af115801561143d573d5f5f3e3d5ffd5b5050604080518481526020810186905261ffff891693506001600160a01b038716925030917f215abfcd108b85fbee47f26fda2de66f90f14fa5fcaf0201698ad8ac9323545f910160405180910390a450505080600101905061135b565b50505050505b610ce06001600555565b60606114b7600b61261c565b905090565b6001600160a01b03165f9081526020819052604090205490565b5f61150e6114e2612628565b6114ed90600a613bfe565b6002546114fa9190613adc565b611505856001613adc565b869190856126a4565b949350505050565b6060600480546108a290613933565b5f61150e611534846001613adc565b61153c612628565b61154790600a613bfe565b6002546115059190613adc565b5f3361094181858561255f565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115b1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d59190613887565b6115f2576040516312aecd8160e01b815260040160405180910390fd5b805f036116145730604051636b30633560e01b81526004016107a69190613571565b5f61161e336114bc565b90508082111561164157604051632ca2f52b60e11b815260040160405180910390fd5b6040516323b872dd60e01b81525f9030906323b872dd9061166a90339084908890600401613aa4565b6020604051808303815f875af1158015611686573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116aa9190613887565b9050806116ca576040516312171d8360e31b815260040160405180910390fd5b5f6116d66011336124ca565b91506116f19050336116e88684613adc565b601191906124f0565b508360155f8282546117039190613adc565b9091555050604051849033907f222dc200773fe9b45015bf792e8fee37d651e3590c215806a5042404b6d741d2905f90a350505050565b6007546001600160a01b0316331461176557604051631a27eac360e11b815260040160405180910390fd5b601f5460ff1615611789576040516317dbc4cb60e21b815260040160405180910390fd5b5f8190036117aa57604051631121aa8d60e01b815260040160405180910390fd5b6117b4601c612505565b5f816001600160401b038111156117cd576117cd61396b565b6040519080825280602002602001820160405280156117f6578160200160208202803683370190505b5090505f82815b8161ffff168161ffff1610156118f4575f86868361ffff1681811061182457611824613873565b61183a92602060409092020190810191506134af565b90505f87878461ffff1681811061185357611853613873565b905060400201602001602081019061186b9190613b00565b905081868461ffff168151811061188457611884613873565b6001600160a01b03909216602092830291909101909101525f6118b2601c8463ffffffff808616906124f016565b9050806118d457826040516346bdabe160e01b81526004016107a69190613571565b6118e463ffffffff831687613adc565b95505050508060010190506117fd565b506118fe836126e6565b600a60149054906101000a900460ff16600a61191a9190613bfe565b821461193957604051639006dd2760e01b815260040160405180910390fd5b60405133907f2d47a742b8d7df7c1fc5a9a631b206b364e6cb2722490759f63bb3ab14b132e0905f90a25050505050565b601f54606090819060ff161561198a5761198261275e565b915091509091565b5f611995601c6125bc565b90508061ffff166001600160401b038111156119b3576119b361396b565b6040519080825280602002602001820160405280156119dc578160200160208202803683370190505b5092508061ffff166001600160401b038111156119fb576119fb61396b565b604051908082528060200260200182016040528015611a24578160200160208202803683370190505b5091505f5b8161ffff168161ffff161015611abb575f80611a4a601c61ffff85166125c6565b9150915081868461ffff1681518110611a6557611a65613873565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611a9c57611a9c613873565b63ffffffff909216602092830291909101909101525050600101611a29565b50509091565b611ac96124a0565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b19573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b3d9190613887565b611b5a576040516312aecd8160e01b815260040160405180910390fd5b805f03611b6957610b1a610f73565b5f611b75600e336124ca565b91505081811015611b9957604051632ca2f52b60e11b815260040160405180910390fd5b600a546040516351edffb160e01b81526001600160a01b03909116906351edffb190611bcb9033908690600401613c3a565b5f604051808303815f87803b158015611be2575f5ffd5b505af1158015611bf4573d5f5f3e3d5ffd5b505050505f8282611c059190613c0c565b9050805f03611c1f57611c19600e336125d4565b50611c2d565b611c2b600e33836124f0565b505b8260145f828254611c3e9190613c0c565b9091555050604051839033907f96a9a6886cdf3047a125454218a23d3961fd3a78643123b248a9d106d0ac94fd905f90a35050610ce06001600555565b611c836124a0565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cd3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cf79190613887565b611d14576040516312aecd8160e01b815260040160405180910390fd5b805f03611d365730604051636b30633560e01b81526004016107a69190613571565b5f611d426011336124ca565b91505081811015611d6657604051632ca2f52b60e11b815260040160405180910390fd5b5f611d718383613c0c565b9050805f03611d8b57611d856011336125d4565b50611d99565b611d97601133836124f0565b505b8260155f828254611daa9190613c0c565b909155505060405163a9059cbb60e01b81525f90309063a9059cbb90611dd69033908890600401613c3a565b6020604051808303815f875af1158015611df2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e169190613887565b905080611e36576040516312171d8360e31b815260040160405180910390fd5b604051849033907f046d3e17087d323298991516e3fdec36fe1204d6bff7fb6e2b8eca77b80a22ad905f90a3505050610ce06001600555565b5f61092e825f612990565b5f61092e611e87836114bc565b5f612319565b6060805f611e9b60196125bc565b90508061ffff166001600160401b03811115611eb957611eb961396b565b604051908082528060200260200182016040528015611ee2578160200160208202803683370190505b5092508061ffff166001600160401b03811115611f0157611f0161396b565b604051908082528060200260200182016040528015611f2a578160200160208202803683370190505b5091505f5b8161ffff168161ffff161015611abb575f80611f50601961ffff85166125c6565b9150915081868461ffff1681518110611f6b57611f6b613873565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611fa257611fa2613873565b60209081029190910101525050600101611f2f565b5f61092e826114bc565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b5f5f611ff6836129c2565b90505f6120038285613c0c565b90505f61200f82612a8c565b905061201b8184613adc565b95945050505050565b600a546001600160a01b0316331461204f57604051631a27eac360e11b815260040160405180910390fd5b6120576124a0565b5f612062600e6125bc565b90508063ffffffff165f0361207757506114a1565b5f8163ffffffff166001600160401b038111156120965761209661396b565b6040519080825280602002602001820160405280156120bf578160200160208202803683370190505b5090505f8263ffffffff166001600160401b038111156120e1576120e161396b565b60405190808252806020026020018201604052801561210a578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff1610156121a4575f80612139600e63ffffffff808616906125c616565b9150915081858463ffffffff168151811061215657612156613873565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff168151811061218f5761218f613873565b6020908102919091010152505060010161210f565b505f601481905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa1580156121f3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122179190613c1f565b90505f5b8463ffffffff168163ffffffff16101561149b575f848263ffffffff168151811061224857612248613873565b602002602001015190505f848363ffffffff168151811061226b5761226b613873565b6020026020010151905061228982600e6125d490919063ffffffff16565b505f612296828a5f6114d6565b90506122a28382612b1c565b604080518381526020810183905261ffff8716916001600160a01b0386169130917f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f6910160405180910390a450505080600101905061221b565b610ce081612b50565b5f610f6c836001600160a01b038416612ba9565b5f610f6c612326600d5490565b612331906001613adc565b612339612628565b61234490600a613bfe565b6002546123519190613adc565b859190856126a4565b6123678383836001612bf0565b505050565b6007546001600160a01b03163b5f0361238c57601f805460ff1916905550565b6007546040516301ffc9a760e01b8152635b24e9f760e11b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa9250505080156123f7575060408051601f3d908101601f191682019092526123f491810190613887565b60015b6124145760405163298febe360e01b815260040160405180910390fd5b801561248757601f805460ff1916600117905560075460405163c653526b60e01b81526001600160a01b039091169063c653526b9061245790859060040161366b565b5f6040518083038186803b15801561246d575f5ffd5b505afa15801561247f573d5f5f3e3d5ffd5b505050505050565b60405163298febe360e01b815260040160405180910390fd5b6002600554036124c357604051633ee5aeb560e01b815260040160405180910390fd5b6002600555565b5f8080806124e1866001600160a01b038716612cc2565b909450925050505b9250929050565b5f61150e846001600160a01b03851684612cfa565b610ce081612d16565b5f6125198484611fc1565b90505f19811015612559578181101561254b57828183604051637dc7a0d960e11b81526004016107a693929190613c53565b61255984848484035f612bf0565b50505050565b6001600160a01b038316612588575f604051634b637e8f60e11b81526004016107a69190613571565b6001600160a01b0382166125b1575f60405163ec442f0560e01b81526004016107a69190613571565b612367838383612d5f565b5f61092e82612e72565b5f8080806124e18686612e7c565b5f610f6c836001600160a01b038416612ea5565b6001600160a01b038216612611575f604051634b637e8f60e11b81526004016107a69190613571565b610d5a825f83612d5f565b60605f610f6c83612ec1565b5f5f612632610f73565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561266d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126919190613c74565b905061269e816012613c8f565b91505090565b5f6126d16126b183612f1a565b80156126cc57505f84806126c7576126c7613ca8565b868809115b151590565b6126dc868686612f46565b61201b9190613adc565b5f5b8151811015610d5a5761271e82828151811061270657612706613873565b6020026020010151600b612ff690919063ffffffff16565b6127565781818151811061273457612734613873565b602002602001015160405163751dff9760e11b81526004016107a69190613571565b6001016126e8565b6060805f306001600160a01b0316634e85b1356040518163ffffffff1660e01b81526004015f60405180830381865afa15801561279d573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526127c491908101906139f9565b60075460405163701a818560e01b81529192505f916001600160a01b039091169063701a8185906127f990859060040161366b565b5f60405180830381865afa158015612813573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261283a9190810190613cbc565b905080516001600160401b038111156128555761285561396b565b60405190808252806020026020018201604052801561287e578160200160208202803683370190505b50935080516001600160401b0381111561289a5761289a61396b565b6040519080825280602002602001820160405280156128c3578160200160208202803683370190505b5092505f5b81518161ffff16101561298957818161ffff16815181106128eb576128eb613873565b60200260200101515f0151858261ffff168151811061290c5761290c613873565b60200260200101906001600160a01b031690816001600160a01b031681525050818161ffff168151811061294257612942613873565b602002602001015160200151848261ffff168151811061296457612964613873565b63ffffffff9092166020928302919091019091015261298281613d7d565b90506128c8565b5050509091565b5f610f6c61299c612628565b6129a790600a613bfe565b6002546129b49190613adc565b600d54612351906001613adc565b6017545f906301000000900461ffff1681036129df57505f919050565b6017545f906129fc906301000000900461ffff1684612710612f46565b9050610f6c60095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a51573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a759190613d9d565b829063ffffffff908116906301e1338090612f4616565b6017545f90610100900461ffff168103612aa757505f919050565b5f612abe612ab76012600a613bfe565b845f611525565b6017549091505f908190612ad49060ff1661300a565b9150915081831015612aea57505f949350505050565b6017545f90612b0390610100900461ffff168584612f46565b9050612b128187612710612f46565b9695505050505050565b6001600160a01b038216612b45575f60405163ec442f0560e01b81526004016107a69190613571565b610d5a5f8383612d5f565b5f612b59825490565b90505f5b81811015612ba257826001015f845f018381548110612b7e57612b7e613873565b905f5260205f20015481526020019081526020015f205f9055806001019050612b5d565b50505f9055565b5f612bb483836130f4565b612be957508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561092e565b505f61092e565b6001600160a01b038416612c19575f60405163e602df0560e01b81526004016107a69190613571565b6001600160a01b038316612c42575f604051634a1406b160e11b81526004016107a69190613571565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561255957826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612cb491815260200190565b60405180910390a350505050565b5f818152600283016020526040812054819080612cef57612ce3858561310b565b92505f91506124e99050565b6001925090506124e9565b5f828152600284016020526040812082905561150e8484613116565b5f612d2082612e72565b90505f5b81811015612d5557600283015f612d3b8584613121565b815260208101919091526040015f90812055600101612d24565b50610d5a826122fc565b6001600160a01b038316612d89578060025f828254612d7e9190613adc565b90915550612de69050565b6001600160a01b0383165f9081526020819052604090205481811015612dc85783818360405163391434e360e21b81526004016107a693929190613c53565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216612e0257600280548290039055612e20565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612e6591815260200190565b60405180910390a3505050565b5f61092e8261312c565b5f8080612e898585613121565b5f81815260029690960160205260409095205494959350505050565b5f8181526002830160205260408120819055610f6c8383613135565b6060815f01805480602002602001604051908101604052809291908181526020018280548015612f0e57602002820191905f5260205f20905b815481526020019060010190808311612efa575b50505050509050919050565b5f6002826003811115612f2f57612f2f6136d9565b612f399190613db8565b60ff166001149050919050565b5f5f5f612f538686613140565b91509150815f03612f7757838181612f6d57612f6d613ca8565b0492505050610f6c565b818411612f8e57612f8e600385150260111861315c565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f610f6c836001600160a01b0384166130f4565b5f80806130176012610e30565b90505f84600481111561302c5761302c6136d9565b0361303c578092508291506130ee565b6003846004811115613050576130506136d9565b036130625760185492508291506130ee565b6001846004811115613076576130766136d9565b0361308e576130848161316d565b92508091506130ee565b60028460048111156130a2576130a26136d9565b036130ba576130b08161316d565b92508291506130ee565b60048460048111156130ce576130ce6136d9565b036130ee576018546130e8906130e38361316d565b613293565b92508291505b50915091565b5f9081526001919091016020526040902054151590565b5f610f6c83836132a2565b5f610f6c8383612ba9565b5f610f6c83836132ad565b5f61092e825490565b5f610f6c83836132d3565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f5f60085f9054906101000a90046001600160a01b03166001600160a01b031663f3cc69936040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131e39190613c1f565b61ffff1690505f61327860095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561323d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132619190613d9d565b839063ffffffff908116906301e1338090612f4616565b905061150e61328982612710613adc565b8590612710612f46565b5f828218828411028218610f6c565b5f610f6c83836130f4565b5f825f0182815481106132c2576132c2613873565b905f5260205f200154905092915050565b5f81815260018301602052604081205480156133ad575f6132f5600183613c0c565b85549091505f9061330890600190613c0c565b9050808214613367575f865f01828154811061332657613326613873565b905f5260205f200154905080875f01848154811061334657613346613873565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061337857613378613de5565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061092e565b5f91505061092e565b5f5f602083850312156133c7575f5ffd5b82356001600160401b038111156133dc575f5ffd5b8301601f810185136133ec575f5ffd5b80356001600160401b03811115613401575f5ffd5b8560208260051b8401011115613415575f5ffd5b6020919091019590945092505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f6020828403121561346a575f5ffd5b5035919050565b6001600160a01b0381168114610ce0575f5ffd5b5f5f60408385031215613496575f5ffd5b82356134a181613471565b946020939093013593505050565b5f602082840312156134bf575f5ffd5b8135610f6c81613471565b5f5f604083850312156134db575f5ffd5b50508035926020909101359150565b5f5f83601f8401126134fa575f5ffd5b5081356001600160401b03811115613510575f5ffd5b6020830191508360208260061b85010111156124e9575f5ffd5b5f5f5f6040848603121561353c575f5ffd5b83356001600160401b03811115613551575f5ffd5b61355d868287016134ea565b909790965060209590950135949350505050565b6001600160a01b0391909116815260200190565b5f5f5f60608486031215613597575f5ffd5b83356135a281613471565b925060208401356135b281613471565b929592945050506040919091013590565b60ff81168114610ce0575f5ffd5b61ffff81168114610ce0575f5ffd5b5f5f5f606084860312156135f2575f5ffd5b83356135fd816135c3565b9250602084013561360d816135d1565b9150604084013561361d816135d1565b809150509250925092565b5f8151808452602084019350602083015f5b828110156136615781516001600160a01b031686526020958601959091019060010161363a565b5093949350505050565b602081525f610f6c6020830184613628565b5f5f6040838503121561368e575f5ffd5b8235915060208301356136a081613471565b809150509250929050565b5f5f5f606084860312156136bd575f5ffd5b833592506020840135915060408401356004811061361d575f5ffd5b634e487b7160e01b5f52602160045260245ffd5b608081016005861061370d57634e487b7160e01b5f52602160045260245ffd5b94815261ffff93841660208201529190921660408201526060015290565b5f5f6020838503121561373c575f5ffd5b82356001600160401b03811115613751575f5ffd5b61375d858286016134ea565b90969095509350505050565b5f5f5f6060848603121561377b575f5ffd5b83359250602084013561378d81613471565b9150604084013561361d81613471565b604081525f6137af6040830185613628565b82810360208401528084518083526020830191506020860192505f5b818110156137ef57835163ffffffff168352602093840193909201916001016137cb565b50909695505050505050565b604081525f61380d6040830185613628565b82810360208401528084518083526020830191506020860192505f5b818110156137ef578351835260209384019390920191600101613829565b5f5f60408385031215613858575f5ffd5b823561386381613471565b915060208301356136a081613471565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613897575f5ffd5b81518015158114610f6c575f5ffd5b602080825281018290525f8360408301825b858110156138e85782356138cb81613471565b6001600160a01b03168252602092830192909101906001016138b8565b5095945050505050565b5f8184825b8581101561392857813561390a81613471565b6001600160a01b0316835260209283019291909101906001016138f7565b509095945050505050565b600181811c9082168061394757607f821691505b60208210810361396557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b03811182821017156139a1576139a161396b565b60405290565b604051601f8201601f191681016001600160401b03811182821017156139cf576139cf61396b565b604052919050565b5f6001600160401b038211156139ef576139ef61396b565b5060051b60200190565b5f60208284031215613a09575f5ffd5b81516001600160401b03811115613a1e575f5ffd5b8201601f81018413613a2e575f5ffd5b8051613a41613a3c826139d7565b6139a7565b8082825260208201915060208360051b850101925086831115613a62575f5ffd5b6020840193505b82841015612b12578351613a7c81613471565b825260209384019390910190613a69565b5f60208284031215613a9d575f5ffd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561092e5761092e613ac8565b63ffffffff81168114610ce0575f5ffd5b5f60208284031215613b10575f5ffd5b8135610f6c81613aef565b6001815b6001841115613b5657808504811115613b3a57613b3a613ac8565b6001841615613b4857908102905b60019390931c928002613b1f565b935093915050565b5f82613b6c5750600161092e565b81613b7857505f61092e565b8160018114613b8e5760028114613b9857613bb4565b600191505061092e565b60ff841115613ba957613ba9613ac8565b50506001821b61092e565b5060208310610133831016604e8410600b8410161715613bd7575081810a61092e565b613be35f198484613b1b565b805f1904821115613bf657613bf6613ac8565b029392505050565b5f610f6c60ff841683613b5e565b8181038181111561092e5761092e613ac8565b5f60208284031215613c2f575f5ffd5b8151610f6c816135d1565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b5f60208284031215613c84575f5ffd5b8151610f6c816135c3565b60ff828116828216039081111561092e5761092e613ac8565b634e487b7160e01b5f52601260045260245ffd5b5f60208284031215613ccc575f5ffd5b81516001600160401b03811115613ce1575f5ffd5b8201601f81018413613cf1575f5ffd5b8051613cff613a3c826139d7565b8082825260208201915060208360061b850101925086831115613d20575f5ffd5b6020840193505b82841015612b125760408488031215613d3e575f5ffd5b613d4661397f565b8451613d5181613471565b81526020850151613d6181613aef565b8060208301525080835250602082019150604084019350613d27565b5f61ffff821661ffff8103613d9457613d94613ac8565b60010192915050565b5f60208284031215613dad575f5ffd5b8151610f6c81613aef565b5f60ff831680613dd657634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b634e487b7160e01b5f52603160045260245ffdfea26469706673582212202adca4528e879ae5ae2b6f30561933d6f6e0ae2a6c32405ec1e4730bbd879e3964736f6c634300081c0033a26469706673582212200dab9341a4c113732e87304aaf644f47ba828aba8aba7e71b46fa23183f39bd464736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/interfaces/IExecutionAdapter.sol/IExecutionAdapter.json b/artifacts/contracts/interfaces/IExecutionAdapter.sol/IExecutionAdapter.json index e3fa8aec..b44a79c9 100644 --- a/artifacts/contracts/interfaces/IExecutionAdapter.sol/IExecutionAdapter.json +++ b/artifacts/contracts/interfaces/IExecutionAdapter.sol/IExecutionAdapter.json @@ -50,6 +50,19 @@ ], "stateMutability": "nonpayable", "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "validateExecutionAdapter", + "outputs": [], + "stateMutability": "view", + "type": "function" } ], "bytecode": "0x", diff --git a/artifacts/contracts/interfaces/IOrionStrategy.sol/IOrionStrategy.json b/artifacts/contracts/interfaces/IOrionStrategy.sol/IOrionStrategy.json index 40b9b87d..fd48e4df 100644 --- a/artifacts/contracts/interfaces/IOrionStrategy.sol/IOrionStrategy.json +++ b/artifacts/contracts/interfaces/IOrionStrategy.sol/IOrionStrategy.json @@ -33,6 +33,19 @@ ], "stateMutability": "view", "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "vaultWhitelistedAssets", + "type": "address[]" + } + ], + "name": "validateStrategy", + "outputs": [], + "stateMutability": "view", + "type": "function" } ], "bytecode": "0x", diff --git a/artifacts/contracts/interfaces/IOrionTransparentVault.sol/IOrionTransparentVault.json b/artifacts/contracts/interfaces/IOrionTransparentVault.sol/IOrionTransparentVault.json index cd944667..20e07ff5 100644 --- a/artifacts/contracts/interfaces/IOrionTransparentVault.sol/IOrionTransparentVault.json +++ b/artifacts/contracts/interfaces/IOrionTransparentVault.sol/IOrionTransparentVault.json @@ -302,6 +302,19 @@ "name": "Transfer", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address[]", + "name": "assets", + "type": "address[]" + } + ], + "name": "VaultWhitelistUpdated", + "type": "event" + }, { "anonymous": false, "inputs": [ diff --git a/artifacts/contracts/interfaces/IOrionVault.sol/IOrionVault.json b/artifacts/contracts/interfaces/IOrionVault.sol/IOrionVault.json index d105e9b7..40e843be 100644 --- a/artifacts/contracts/interfaces/IOrionVault.sol/IOrionVault.json +++ b/artifacts/contracts/interfaces/IOrionVault.sol/IOrionVault.json @@ -302,6 +302,19 @@ "name": "Transfer", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address[]", + "name": "assets", + "type": "address[]" + } + ], + "name": "VaultWhitelistUpdated", + "type": "event" + }, { "anonymous": false, "inputs": [ diff --git a/artifacts/contracts/interfaces/IPriceAdapter.sol/IPriceAdapter.json b/artifacts/contracts/interfaces/IPriceAdapter.sol/IPriceAdapter.json index 8f8371aa..af241dfc 100644 --- a/artifacts/contracts/interfaces/IPriceAdapter.sol/IPriceAdapter.json +++ b/artifacts/contracts/interfaces/IPriceAdapter.sol/IPriceAdapter.json @@ -26,6 +26,25 @@ ], "stateMutability": "view", "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "validatePriceAdapter", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" } ], "bytecode": "0x", diff --git a/artifacts/contracts/libraries/ErrorsLib.sol/ErrorsLib.json b/artifacts/contracts/libraries/ErrorsLib.sol/ErrorsLib.json index 8f9e7d6e..56059139 100644 --- a/artifacts/contracts/libraries/ErrorsLib.sol/ErrorsLib.json +++ b/artifacts/contracts/libraries/ErrorsLib.sol/ErrorsLib.json @@ -29,6 +29,11 @@ "name": "InsufficientAmount", "type": "error" }, + { + "inputs": [], + "name": "InvalidAdapter", + "type": "error" + }, { "inputs": [], "name": "InvalidAddress", @@ -39,11 +44,21 @@ "name": "InvalidArguments", "type": "error" }, + { + "inputs": [], + "name": "InvalidCuratorContract", + "type": "error" + }, { "inputs": [], "name": "InvalidState", "type": "error" }, + { + "inputs": [], + "name": "InvalidStrategy", + "type": "error" + }, { "inputs": [], "name": "InvalidTotalWeight", @@ -112,8 +127,8 @@ "type": "error" } ], - "bytecode": "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212201147fa50f7bbbde98ecda8acfb57db7beef6af65b145b7ee8f55f1b4b42f3b1564736f6c634300081c0033", - "deployedBytecode": "0x730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212201147fa50f7bbbde98ecda8acfb57db7beef6af65b145b7ee8f55f1b4b42f3b1564736f6c634300081c0033", + "bytecode": "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212209f522da08d058515f871960c88121128e93cc3af270df67773313f62ce3b330264736f6c634300081c0033", + "deployedBytecode": "0x730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212209f522da08d058515f871960c88121128e93cc3af270df67773313f62ce3b330264736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/mocks/MockExecutionAdapter.sol/MockExecutionAdapter.json b/artifacts/contracts/mocks/MockExecutionAdapter.sol/MockExecutionAdapter.json index 3e2c8d73..dcff104b 100644 --- a/artifacts/contracts/mocks/MockExecutionAdapter.sol/MockExecutionAdapter.json +++ b/artifacts/contracts/mocks/MockExecutionAdapter.sol/MockExecutionAdapter.json @@ -12,12 +12,12 @@ "inputs": [ { "internalType": "address", - "name": "asset", + "name": "", "type": "address" }, { "internalType": "uint256", - "name": "sharesAmount", + "name": "", "type": "uint256" } ], @@ -29,19 +29,19 @@ "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "pure", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "asset", + "name": "", "type": "address" }, { "internalType": "uint256", - "name": "sharesAmount", + "name": "", "type": "uint256" } ], @@ -53,12 +53,25 @@ "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "validateExecutionAdapter", + "outputs": [], + "stateMutability": "pure", "type": "function" } ], - "bytecode": "0x6080604052348015600e575f5ffd5b5060c680601a5f395ff3fe6080604052348015600e575f5ffd5b50600436106030575f3560e01c80636c197ff5146034578063cce7ec13146034575b5f5ffd5b604b603f366004605d565b5064e8d4a51000919050565b60405190815260200160405180910390f35b5f5f60408385031215606d575f5ffd5b82356001600160a01b03811681146082575f5ffd5b94602093909301359350505056fea26469706673582212209a1a0f8b2b358d429bcc2937309050d3ac73a6a6326d7d3e50cc05a5758dfa8d64736f6c634300081c0033", - "deployedBytecode": "0x6080604052348015600e575f5ffd5b50600436106030575f3560e01c80636c197ff5146034578063cce7ec13146034575b5f5ffd5b604b603f366004605d565b5064e8d4a51000919050565b60405190815260200160405180910390f35b5f5f60408385031215606d575f5ffd5b82356001600160a01b03811681146082575f5ffd5b94602093909301359350505056fea26469706673582212209a1a0f8b2b358d429bcc2937309050d3ac73a6a6326d7d3e50cc05a5758dfa8d64736f6c634300081c0033", + "bytecode": "0x6080604052348015600e575f5ffd5b506101098061001c5f395ff3fe6080604052348015600e575f5ffd5b5060043610603a575f3560e01c80633da7c9f614603e5780636c197ff514604e578063cce7ec1314604e575b5f5ffd5b604c60493660046091565b50565b005b6065605936600460ae565b5064e8d4a51000919050565b60405190815260200160405180910390f35b80356001600160a01b0381168114608c575f5ffd5b919050565b5f6020828403121560a0575f5ffd5b60a7826077565b9392505050565b5f5f6040838503121560be575f5ffd5b60c5836077565b94602093909301359350505056fea26469706673582212206cd22a648e0164454f3e647cc243ee46fe078bc8582074cd1ea0b03b1df23ec764736f6c634300081c0033", + "deployedBytecode": "0x6080604052348015600e575f5ffd5b5060043610603a575f3560e01c80633da7c9f614603e5780636c197ff514604e578063cce7ec1314604e575b5f5ffd5b604c60493660046091565b50565b005b6065605936600460ae565b5064e8d4a51000919050565b60405190815260200160405180910390f35b80356001600160a01b0381168114608c575f5ffd5b919050565b5f6020828403121560a0575f5ffd5b60a7826077565b9392505050565b5f5f6040838503121560be575f5ffd5b60c5836077565b94602093909301359350505056fea26469706673582212206cd22a648e0164454f3e647cc243ee46fe078bc8582074cd1ea0b03b1df23ec764736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/mocks/MockPriceAdapter.sol/MockPriceAdapter.json b/artifacts/contracts/mocks/MockPriceAdapter.sol/MockPriceAdapter.json index 6cbdefe8..d7e510b4 100644 --- a/artifacts/contracts/mocks/MockPriceAdapter.sol/MockPriceAdapter.json +++ b/artifacts/contracts/mocks/MockPriceAdapter.sol/MockPriceAdapter.json @@ -31,10 +31,29 @@ ], "stateMutability": "view", "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "validatePriceAdapter", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" } ], - "bytecode": "0x6080604052348015600e575f5ffd5b5061018b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806372279ba11461002d575b5f5ffd5b61004061003b3660046100c9565b61005b565b6040805192835260ff90911660208301520160405180910390f35b5f8080606461006b60014361010a565b60408051914060208301524290820152606086811b6001600160601b03191690820152607401604051602081830303815290604052805190602001205f1c6100b39190610123565b6100be906001610142565b94600e945092505050565b5f602082840312156100d9575f5ffd5b81356001600160a01b03811681146100ef575f5ffd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561011d5761011d6100f6565b92915050565b5f8261013d57634e487b7160e01b5f52601260045260245ffd5b500690565b8082018082111561011d5761011d6100f656fea264697066735822122067f48b84030ff85d6303bbbc7a074a546326723a6b709214c224ba3627518f3d64736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806372279ba11461002d575b5f5ffd5b61004061003b3660046100c9565b61005b565b6040805192835260ff90911660208301520160405180910390f35b5f8080606461006b60014361010a565b60408051914060208301524290820152606086811b6001600160601b03191690820152607401604051602081830303815290604052805190602001205f1c6100b39190610123565b6100be906001610142565b94600e945092505050565b5f602082840312156100d9575f5ffd5b81356001600160a01b03811681146100ef575f5ffd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561011d5761011d6100f6565b92915050565b5f8261013d57634e487b7160e01b5f52601260045260245ffd5b500690565b8082018082111561011d5761011d6100f656fea264697066735822122067f48b84030ff85d6303bbbc7a074a546326723a6b709214c224ba3627518f3d64736f6c634300081c0033", + "bytecode": "0x6080604052348015600e575f5ffd5b506101bb8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c80636ab8bdef1461003857806372279ba114610061575b5f5ffd5b61004c6100463660046100f9565b50600190565b60405190151581526020015b60405180910390f35b61007461006f3660046100f9565b61008b565b6040805192835260ff909116602083015201610058565b5f8080606461009b60014361013a565b60408051914060208301524290820152606086811b6001600160601b03191690820152607401604051602081830303815290604052805190602001205f1c6100e39190610153565b6100ee906001610172565b94600e945092505050565b5f60208284031215610109575f5ffd5b81356001600160a01b038116811461011f575f5ffd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561014d5761014d610126565b92915050565b5f8261016d57634e487b7160e01b5f52601260045260245ffd5b500690565b8082018082111561014d5761014d61012656fea264697066735822122074ccd0188617606e63c9abe9c4911cd4c992b35460642ac43f3c2088431f5db864736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610034575f3560e01c80636ab8bdef1461003857806372279ba114610061575b5f5ffd5b61004c6100463660046100f9565b50600190565b60405190151581526020015b60405180910390f35b61007461006f3660046100f9565b61008b565b6040805192835260ff909116602083015201610058565b5f8080606461009b60014361013a565b60408051914060208301524290820152606086811b6001600160601b03191690820152607401604051602081830303815290604052805190602001205f1c6100e39190610153565b6100ee906001610172565b94600e945092505050565b5f60208284031215610109575f5ffd5b81356001600160a01b038116811461011f575f5ffd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561014d5761014d610126565b92915050565b5f8261016d57634e487b7160e01b5f52601260045260245ffd5b500690565b8082018082111561014d5761014d61012656fea264697066735822122074ccd0188617606e63c9abe9c4911cd4c992b35460642ac43f3c2088431f5db864736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/orchestrators/InternalStatesOrchestrator.sol/InternalStatesOrchestrator.json b/artifacts/contracts/orchestrators/InternalStatesOrchestrator.sol/InternalStatesOrchestrator.json index 2e1f462b..585c3c74 100644 --- a/artifacts/contracts/orchestrators/InternalStatesOrchestrator.sol/InternalStatesOrchestrator.json +++ b/artifacts/contracts/orchestrators/InternalStatesOrchestrator.sol/InternalStatesOrchestrator.json @@ -646,8 +646,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f5ffd5b50604051613a42380380613a4283398101604081905261002e916104b6565b826001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61006581610450565b50600180556001600160a01b0382166100915760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381166100b85760405163d92e233d60e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0384169081179091556040805163015df99360e01b8152905163015df993916004808201926020929091908290030181865afa15801561010f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101339190610500565b600580546001600160a01b0319166001600160a01b039283161790556003546040805163d1717c7d60e01b81529051919092169163d1717c7d9160048083019260209291908290030181865afa15801561018f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101b39190610522565b6101be90600a61063b565b60075560035460408051631c56369f60e21b815290516001600160a01b0390921691637158da7c916004808201926020929091908290030181865afa158015610209573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061022d9190610500565b600880546001600160a01b0319166001600160a01b03928316908117909155600354604051633c2e3e7b60e11b815260048101929092529091169063785c7cf690602401602060405180830381865afa15801561028c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102b09190610522565b600860146101000a81548160ff021916908360ff16021790555060035f9054906101000a90046001600160a01b03166001600160a01b031663567ba7136040518163ffffffff1660e01b8152600401602060405180830381865afa15801561031a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061033e9190610522565b61034990600a61063b565b6006556016805462ff0000191662010000179055600280546001600160a01b038084166001600160a01b03199092169190911790915560035460408051631d06d6c760e11b815290519190921691633a0dad8e9160048281019260209291908290030181865afa1580156103bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103e39190610500565b600480546001600160a01b0319166001600160a01b0392909216919091179055601480546201518063ffffffff1990911681179091556104239042610649565b60155550506016805464ffff00ffff19169055506008805463ffffffff60a81b191690555f60185561065c565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146104b3575f5ffd5b50565b5f5f5f606084860312156104c8575f5ffd5b83516104d38161049f565b60208501519093506104e48161049f565b60408501519092506104f58161049f565b809150509250925092565b5f60208284031215610510575f5ffd5b815161051b8161049f565b9392505050565b5f60208284031215610532575f5ffd5b815160ff8116811461051b575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156105915780850481111561057557610575610542565b600184161561058357908102905b60019390931c92800261055a565b935093915050565b5f826105a757506001610635565b816105b357505f610635565b81600181146105c957600281146105d3576105ef565b6001915050610635565b60ff8411156105e4576105e4610542565b50506001821b610635565b5060208310610133831016604e8410600b8410161715610612575081810a610635565b61061e5f198484610556565b805f190482111561063157610631610542565b0290505b92915050565b5f61051b60ff841683610599565b8082018082111561063557610635610542565b6133d9806106695f395ff3fe608060405234801561000f575f5ffd5b506004361061019f575f3560e01c8063055ad42e146101a35780630844697d146101cd57806308af604d146101f5578063132b1c921461021a57806314b19c5a1461025057806314b5d07f1461025e57806325a760c2146102735780632b0088b4146102875780632e2dc43e146102905780633a0dad8e146102aa5780634585e33b146102ca5780634ff0876a146102dd5780635488cd621461030257806358fac65b146103165780635dc228a0146103295780636e04ff0d1461033c5780636ff041531461035d5780637060444514610372578063715018a6146103855780637158da7c1461038d57806379502c55146103a05780637b103999146103b35780637cdabf0a146103c6578063800f9fad146103d95780638da5cb5b146103e25780638f5c9465146103ea578063b8b2af7c146103f3578063ba96ff1114610408578063c18e2a5c1461041b578063ca1f32f114610424578063e2638ff11461042d578063e2c4aaec14610455578063e6c3efd914610468578063eeb393c91461047b578063f2fde38b1461048e575b5f5ffd5b6016546101b7906301000000900460ff1681565b6040516101c49190612ace565b60405180910390f35b6008546101e290600160b81b900461ffff1681565b60405161ffff90911681526020016101c4565b6016546102089062010000900460ff1681565b60405160ff90911681526020016101c4565b610242610228366004612afc565b6001600160a01b03165f908152600f602052604090205490565b6040519081526020016101c4565b6016546101e29061ffff1681565b61027161026c366004612afc565b6104a1565b005b60085461020890600160a01b900460ff1681565b61024260075481565b6102986105aa565b6040516101c496959493929190612b8a565b6004546102bd906001600160a01b031681565b6040516101c49190612c0b565b6102716102d8366004612c1f565b610826565b6014546102ed9063ffffffff1681565b60405163ffffffff90911681526020016101c4565b60165461020890600160201b900460ff1681565b6102bd610324366004612c8b565b610969565b6002546102bd906001600160a01b031681565b61034f61034a366004612c1f565b610991565b6040516101c4929190612ca2565b610365610c0f565b6040516101c49190612ce0565b610271610380366004612c8b565b610ca9565b610271610d10565b6008546102bd906001600160a01b031681565b6003546102bd906001600160a01b031681565b6005546102bd906001600160a01b031681565b6102716103d4366004612d08565b610d23565b61024260095481565b6102bd610e2a565b6101e261271081565b6008546101e290600160a81b900461ffff1681565b610242610416366004612afc565b610e38565b61024260185481565b61024260065481565b61024261043b366004612afc565b6001600160a01b03165f908152600e602052604090205490565b610271610463366004612c8b565b610e91565b610271610476366004612d47565b610f04565b610271610489366004612d73565b610fde565b61027161049c366004612afc565b6110c5565b6104a9611108565b6001600160a01b0381166104d05760405163d92e233d60e01b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610520573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105449190612d8e565b610561576040516312aecd8160e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f6cc7ebdb6c8c53291c5ae16148cab9b049d23bf5bde5632900b40edff56fcb43905f90a250565b606080808080805f6016546301000000900460ff1660048111156105d0576105d0612aba565b146105ee576040516312aecd8160e01b815260040160405180910390fd5b5f600a60080180548060200260200160405190810160405280929190818152602001828054801561064657602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610628575b505050505090505f5f6106588361113a565b915091508161ffff166001600160401b0381111561067857610678612dad565b6040519080825280602002602001820160405280156106a1578160200160208202803683370190505b5098508161ffff166001600160401b038111156106c0576106c0612dad565b6040519080825280602002602001820160405280156106e9578160200160208202803683370190505b5097508061ffff166001600160401b0381111561070857610708612dad565b604051908082528060200260200182016040528015610731578160200160208202803683370190505b5096508061ffff166001600160401b0381111561075057610750612dad565b604051908082528060200260200182016040528015610779578160200160208202803683370190505b5095508161ffff166001600160401b0381111561079857610798612dad565b6040519080825280602002602001820160405280156107c1578160200160208202803683370190505b5094508061ffff166001600160401b038111156107e0576107e0612dad565b604051908082528060200260200182016040528015610809578160200160208202803683370190505b50935061081b838a8a888b8b8a6111db565b505050909192939495565b61082e610e2a565b6001600160a01b0316336001600160a01b03161415801561085a57506002546001600160a01b03163314155b156108785760405163ea8e4eb560e01b815260040160405180910390fd5b6108806113be565b60058110156108a2576040516317dbc4cb60e21b815260040160405180910390fd5b5f806108b083850185612dc1565b90925090506341659aab60e01b6001600160e01b03198316016108da576108d56113e8565b61095a565b636ce38ed360e11b6001600160e01b03198316016108fb576108d581611584565b6292a80f60e51b6001600160e01b031983160161091a576108d5611d35565b6265e66b60e01b6001600160e01b031983160161093a576108d581611f42565b63c4b3cef760e01b6001600160e01b031983160161095a5761095a61244b565b505061096560018055565b5050565b60178181548110610978575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f606060035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109e4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a089190612d8e565b8015610a15575060155442115b15610a6757600191507fbe9a655586dceb82dfa0af992b5d8ae7fa45053cb7fd6f141f541da7572978c75f604051602001610a51929190612e04565b6040516020818303038152906040529050610c08565b60016016546301000000900460ff166004811115610a8757610a87612aba565b03610ad257600191507f2638e25a856cbfe28e0ae1857cb597cc2ceb873ce579b7d93c2258e45a754481601660049054906101000a900460ff16604051602001610a51929190612e04565b60026016546301000000900460ff166004811115610af257610af2612aba565b03610b2e57600191507fedaafe206508e00f40674bb87dda745bccfe8a3f3f6d6eaaf6db5f44021a1c135f604051602001610a51929190612e04565b60036016546301000000900460ff166004811115610b4e57610b4e612aba565b03610b9957600191507fff9a199536c068c55c334e40ebfa355733f79152332d6586d615c5bb37fd5c17601660049054906101000a900460ff16604051602001610a51929190612e04565b60046016546301000000900460ff166004811115610bb957610bb9612aba565b03610bf557600191507f3b4c310984a9fe486c05a56b52659c09d4bf9f3ef9b799ad52ee29a7d805741e5f604051602001610a51929190612e04565b505060408051602081019091525f808252905b9250929050565b60605f6016546301000000900460ff166004811115610c3057610c30612aba565b14610c4e576040516312aecd8160e01b815260040160405180910390fd5b6012805460408051602080840282018101909252828152929190830182828015610c9f57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610c81575b5050505050905090565b6004546001600160a01b03163314610cd45760405163ea8e4eb560e01b815260040160405180910390fd5b600954811115610cf757604051632ca2f52b60e11b815260040160405180910390fd5b8060095f828254610d089190612e35565b909155505050565b610d18611108565b610d215f612617565b565b610d2b611108565b60328261ffff161180610d4357506107d08161ffff16115b15610d61576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610db1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dd59190612d8e565b610df2576040516312aecd8160e01b815260040160405180910390fd5b6008805463ffffffff60a81b1916600160a81b61ffff9485160261ffff60b81b191617600160b81b9290931691909102919091179055565b5f546001600160a01b031690565b5f806016546301000000900460ff166004811115610e5857610e58612aba565b14610e76576040516312aecd8160e01b815260040160405180910390fd5b506001600160a01b03165f908152600a602052604090205490565b6004546001600160a01b03163314610ebc5760405163ea8e4eb560e01b815260040160405180910390fd5b5f811315610ee0578060185f828254610ed59190612e4e565b90915550610f019050565b5f811215610f0157610ef181612e61565b60185f828254610d089190612e35565b50565b610f0c611108565b8060ff165f03610f2f576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f7f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fa39190612d8e565b610fc0576040516312aecd8160e01b815260040160405180910390fd5b6016805460ff909216620100000262ff000019909216919091179055565b610fe6611108565b8063ffffffff165f0361100c576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561105c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110809190612d8e565b61109d576040516312aecd8160e01b815260040160405180910390fd5b6014805463ffffffff191663ffffffff83169081179091556110bf9042612e4e565b60155550565b6110cd611108565b6001600160a01b0381166110ff575f604051631e4fbdf760e01b81526004016110f69190612c0b565b60405180910390fd5b610f0181612617565b33611111610e2a565b6001600160a01b031614610d21573360405163118cdaa760e01b81526004016110f69190612c0b565b80515f908190815b8161ffff168161ffff1610156111d4575f858261ffff168151811061116957611169612e7b565b6020908102919091018101516001600160a01b0381165f9081526010909252604090912054909150156111a25761119f85612e8f565b94505b6001600160a01b0381165f90815260116020526040902054156111cb576111c884612e8f565b93505b50600101611142565b5050915091565b86515f80805b8361ffff168161ffff1610156113b1575f8b8261ffff168151811061120857611208612e7b565b6020908102919091018101516001600160a01b0381165f90815260108352604080822054601190945290205490925081156112ed57828d8761ffff168151811061125457611254612e7b565b60200260200101906001600160a01b031690816001600160a01b031681525050818c8761ffff168151811061128b5761128b612e7b565b6020908102919091018101919091526001600160a01b0384165f908152600a90915260409020546006546112c0918491612666565b8b8761ffff16815181106112d6576112d6612e7b565b60209081029190910101526112ea86612e8f565b95505b80156113a357828a8661ffff168151811061130a5761130a612e7b565b60200260200101906001600160a01b031690816001600160a01b03168152505080898661ffff168151811061134157611341612e7b565b6020908102919091018101919091526001600160a01b0384165f908152600a9091526040902054600654611376918391612666565b888661ffff168151811061138c5761138c612e7b565b60209081029190910101526113a085612e8f565b94505b5050508060010190506111e1565b5050505050505050505050565b6002600154036113e157604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b6015544211158061146a575060035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611444573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114689190612d8e565b155b156114885760405163085de62560e01b815260040160405180910390fd5b5f5b60125461ffff8216101561153d575f600a6008018261ffff16815481106114b3576114b3612e7b565b5f9182526020808320909101546001600160a01b03168252600a81526040808320839055600b8252808320839055600c8252808320839055600e8252808320839055600f8252808320839055600d8252808320839055601082528083208390556011825280832083905560139091529020805460ff191690555061153681612e8f565b905061148a565b5061154960125f612a8c565b611551612717565b60175415610d215760145461156c9063ffffffff1642612e4e565b6015556016805463ff00000019166301000000179055565b60016016546301000000900460ff1660048111156115a4576115a4612aba565b146115c25760405163baf3f0f760e01b815260040160405180910390fd5b601680546004906115dc90600160201b900460ff16612eaf565b91906101000a81548160ff021916908360ff1602179055505f601660029054906101000a900460ff16826116109190612ec4565b60165460ff91821692505f9161162d916201000090041683612ee7565b60175490915061ffff82161180611649575060175461ffff8216145b1561166757506017546016805464ffff000000191663020000001790555b815b8161ffff168161ffff161015611d2f575f60178261ffff168154811061169157611691612e7b565b905f5260205f20015f9054906101000a90046001600160a01b031690505f5f826001600160a01b031663d3d034586040518163ffffffff1660e01b81526004015f60405180830381865afa1580156116eb573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117129190810190612fc6565b90925090505f805b83518161ffff1610156119fe575f848261ffff168151811061173e5761173e612e7b565b602002602001015190505f848361ffff168151811061175f5761175f612e7b565b6020026020010151905080600a6001015f846001600160a01b03166001600160a01b031681526020019081526020015f205f82825461179e9190612e4e565b90915550506001600160a01b0382165f9081526013602052604090205460ff16611922576008546001600160a01b039081169083160361189a5760085461187d906117f490600160a01b900460ff16600a613167565b600860149054906101000a900460ff1660035f9054906101000a90046001600160a01b03166001600160a01b031663567ba7136040518163ffffffff1660e01b8152600401602060405180830381865afa158015611854573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118789190613175565b612970565b6001600160a01b0383165f908152600a6020526040902055611922565b6005546040516341976e0960e01b81526001600160a01b03909116906341976e09906118ca908590600401612c0b565b602060405180830381865afa1580156118e5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119099190613190565b6001600160a01b0383165f908152600a60205260409020555b6001600160a01b0382165f908152600a60205260408120546006549091906119d2906119519084908690612666565b600354604051633c2e3e7b60e11b81526001600160a01b039091169063785c7cf690611981908990600401612c0b565b602060405180830381865afa15801561199c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119c09190613175565b600854600160a01b900460ff16612970565b90506119de8187612e4e565b95506119e9846129da565b50505050806119f790612e8f565b905061171a565b506008545f90611a1c90600160a81b900461ffff1683612710612666565b601454909150611a3d90829063ffffffff908116906301e133809061266616565b90508060095f828254611a509190612e4e565b90915550611a6090508183612e35565b60405163728d42fb60e11b8152600481018290529092505f906001600160a01b0387169063e51a85f690602401602060405180830381865afa158015611aa8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611acc9190613190565b9050611ad88184612e35565b6008549093505f90611af890600160b81b900461ffff1683612710612666565b90508060095f828254611b0b9190612e4e565b90915550611b1b90508183612e35565b601654604051630df571f760e01b815261ffff9091166004820152602481018290529092506001600160a01b03881690630df571f7906044015f604051808303815f87803b158015611b6b575f5ffd5b505af1158015611b7d573d5f5f3e3d5ffd5b505050505f876001600160a01b031663a68a5267896001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bcd573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bf19190613190565b875f6040518463ffffffff1660e01b8152600401611c11939291906131a7565b602060405180830381865afa158015611c2c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c509190613190565b6001600160a01b0389165f908152600e602052604090208690559050611c768186612e35565b94505f886001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cb5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cd99190613190565b6001600160a01b038a165f908152600f602052604090208790559050611cff8187612e4e565b6001600160a01b039099165f908152600c6020526040902098909855505060019096019550611669945050505050565b50505050565b60026016546301000000900460ff166004811115611d5557611d55612aba565b14611d735760405163baf3f0f760e01b815260040160405180910390fd5b6016805463ff000000191663030000001790556017545f805b8261ffff168161ffff161015611df0575f60178261ffff1681548110611db457611db4612e7b565b5f9182526020808320909101546001600160a01b0316808352600c909152604090912054909150611de59084612e4e565b925050600101611d8c565b50600480546040805163dab26e3b60e01b815290515f93611e67936001600160a01b03169263dab26e3b92818301926020928290030181865afa158015611e39573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e5d9190613190565b8390612710612666565b9050806018541115611e7857505050565b5f60185482611e879190612e35565b90505f5b8461ffff168161ffff161015611f25575f60178261ffff1681548110611eb357611eb3612e7b565b5f9182526020808320909101546001600160a01b0316808352600c909152604082205490925090611ee5858389612666565b6001600160a01b0384165f908152600c6020526040812080549293508392909190611f11908490612e35565b909155505060019093019250611e8b915050565b508060185f828254611f379190612e4e565b909155505050505050565b60036016546301000000900460ff166004811115611f6257611f62612aba565b14611f805760405163baf3f0f760e01b815260040160405180910390fd5b60168054600490611f9a90600160201b900460ff16612eaf565b91906101000a81548160ff021916908360ff1602179055505f601660029054906101000a900460ff1682611fce9190612ec4565b60165460ff91821692505f91611feb916201000090041683612ee7565b60175490915061ffff82161180612007575060175461ffff8216145b1561202557506017546016805464ffff000000191663040000001790555b815b8161ffff168161ffff161015611d2f575f60178261ffff168154811061204f5761204f612e7b565b905f5260205f20015f9054906101000a90046001600160a01b031690505f5f826001600160a01b031663b6eba6536040518163ffffffff1660e01b81526004015f60405180830381865afa1580156120a9573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120d091908101906131d3565b6001600160a01b0385165f908152600c6020526040812054835193955091935090916001600160401b0381111561210957612109612dad565b60405190808252806020026020018201604052801561214d57816020015b604080518082019091525f80825260208201528152602001906001900390816121275790505b5090505f5b84518161ffff1610156123df575f858261ffff168151811061217657612176612e7b565b602002602001015190505f858361ffff168151811061219757612197612e7b565b6020908102919091018101516001600160a01b0384165f908152601390925260409091205490915060ff1661229d576008546001600160a01b0390811690831603612215576008546121f8906117f490600160a01b900460ff16600a613167565b6001600160a01b0383165f908152600a602052604090205561229d565b6005546040516341976e0960e01b81526001600160a01b03909116906341976e0990612245908590600401612c0b565b602060405180830381865afa158015612260573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122849190613190565b6001600160a01b0383165f908152600a60205260409020555b6001600160a01b0382165f908152600a602052604081205460065460075491929161233f916122e59185906122de908c9063ffffffff808b16919061266616565b9190612666565b600854600354604051633c2e3e7b60e11b8152600160a01b90920460ff16916001600160a01b039091169063785c7cf690612324908a90600401612c0b565b602060405180830381865afa158015611854573d5f5f3e3d5ffd5b90506040518060400160405280856001600160a01b031681526020018263ffffffff16815250868661ffff168151811061237b5761237b612e7b565b602002602001018190525080600a6003015f866001600160a01b03166001600160a01b031681526020019081526020015f205f8282546123bb9190612e4e565b909155506123ca9050846129da565b50505050806123d890612e8f565b9050612152565b50604051630415112560e21b81526001600160a01b0386169063105444949061240e908490869060040161328c565b5f604051808303815f87803b158015612425575f5ffd5b505af1158015612437573d5f5f3e3d5ffd5b505050505050505050806001019050612027565b60046016546301000000900460ff16600481111561246b5761246b612aba565b146124895760405163baf3f0f760e01b815260040160405180910390fd5b5f600a6008018054806020026020016040519081016040528092919081815260200182805480156124e157602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116124c3575b505083519394505f925050505b8161ffff168161ffff1610156125ac575f838261ffff168151811061251557612515612e7b565b6020908102919091018101516001600160a01b0381165f908152600b8352604080822054600d90945290205490925080821115612573576125568183612e35565b6001600160a01b0384165f9081526010602052604090205561259e565b8181111561259e576125858282612e35565b6001600160a01b0384165f908152601160205260409020555b5050508060010190506124ee565b506016805463ff00000019811682555f906125ca9061ffff16612e8f565b82546101009290920a61ffff8181021990931691831602179091556016546040519116907f0bc12479581640d161e016cef21aa834cb6d6326bbc0d8445e58d56403adf2dc905f90a25050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f5f5f6126738686612a5f565b91509150815f036126975783818161268d5761268d6132f3565b0492505050612710565b8184116126ae576126ae6003851502601118612a7b565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150505b9392505050565b600354604051631da09e4360e31b81525f916001600160a01b03169063ed04f21890612747908490600401613307565b5f60405180830381865afa158015612761573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612788919081019061331b565b905061279560175f612a8c565b5f5b81518161ffff161015610965575f828261ffff16815181106127bb576127bb612e7b565b60200260200101519050806001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa158015612801573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128259190613190565b15801561288f5750806001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612869573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061288d9190613190565b155b1561289a5750612960565b5f816001600160a01b031663b6eba6536040518163ffffffff1660e01b81526004015f60405180830381865afa1580156128d6573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526128fd91908101906131d3565b50905080515f0361290f575050612960565b50601780546001810182555f919091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c150180546001600160a01b0319166001600160a01b03929092169190911790555b61296981612e8f565b9050612797565b5f8260ff168260ff1611156129a5576129898383613354565b61299490600a613167565b61299e908561336d565b9050612710565b8260ff168260ff1610156129d2576129bd8284613354565b6129c890600a613167565b61299e9085613384565b509192915050565b6001600160a01b0381165f9081526013602052604090205460ff16610f01576012805460018181019092557fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0384166001600160a01b031990911681179091555f908152601360205260409020805460ff1916909117905550565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5080545f8255905f5260205f2090810190610f0191905b80821115612ab6575f8155600101612aa3565b5090565b634e487b7160e01b5f52602160045260245ffd5b6020810160058310612ae257612ae2612aba565b91905290565b6001600160a01b0381168114610f01575f5ffd5b5f60208284031215612b0c575f5ffd5b813561271081612ae8565b5f8151808452602084019350602083015f5b82811015612b505781516001600160a01b0316865260209586019590910190600101612b29565b5093949350505050565b5f8151808452602084019350602083015f5b82811015612b50578151865260209586019590910190600101612b6c565b60c081525f612b9c60c0830189612b17565b8281036020840152612bae8189612b5a565b90508281036040840152612bc28188612b17565b90508281036060840152612bd68187612b5a565b90508281036080840152612bea8186612b5a565b905082810360a0840152612bfe8185612b5a565b9998505050505050505050565b6001600160a01b0391909116815260200190565b5f5f60208385031215612c30575f5ffd5b82356001600160401b03811115612c45575f5ffd5b8301601f81018513612c55575f5ffd5b80356001600160401b03811115612c6a575f5ffd5b856020828401011115612c7b575f5ffd5b6020919091019590945092505050565b5f60208284031215612c9b575f5ffd5b5035919050565b8215158152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b602081525f6127106020830184612b17565b803561ffff81168114612d03575f5ffd5b919050565b5f5f60408385031215612d19575f5ffd5b612d2283612cf2565b9150612d3060208401612cf2565b90509250929050565b60ff81168114610f01575f5ffd5b5f60208284031215612d57575f5ffd5b813561271081612d39565b63ffffffff81168114610f01575f5ffd5b5f60208284031215612d83575f5ffd5b813561271081612d62565b5f60208284031215612d9e575f5ffd5b81518015158114612710575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215612dd2575f5ffd5b82356001600160e01b031981168114612de9575f5ffd5b91506020830135612df981612d39565b809150509250929050565b6001600160e01b031992909216825260ff16602082015260400190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115612e4857612e48612e21565b92915050565b80820180821115612e4857612e48612e21565b5f600160ff1b8201612e7557612e75612e21565b505f0390565b634e487b7160e01b5f52603260045260245ffd5b5f61ffff821661ffff8103612ea657612ea6612e21565b60010192915050565b5f60ff821660ff8103612ea657612ea6612e21565b60ff8181168382160290811690818114612ee057612ee0612e21565b5092915050565b61ffff8181168382160190811115612e4857612e48612e21565b604051601f8201601f191681016001600160401b0381118282101715612f2957612f29612dad565b604052919050565b5f6001600160401b03821115612f4957612f49612dad565b5060051b60200190565b5f82601f830112612f62575f5ffd5b8151612f75612f7082612f31565b612f01565b8082825260208201915060208360051b860101925085831115612f96575f5ffd5b602085015b83811015612fbc578051612fae81612ae8565b835260209283019201612f9b565b5095945050505050565b5f5f60408385031215612fd7575f5ffd5b82516001600160401b03811115612fec575f5ffd5b612ff885828601612f53565b602085015190935090506001600160401b03811115613015575f5ffd5b8301601f81018513613025575f5ffd5b8051613033612f7082612f31565b8082825260208201915060208360051b850101925087831115613054575f5ffd5b6020840193505b8284101561307657835182526020938401939091019061305b565b809450505050509250929050565b6001815b60018411156130bf578085048111156130a3576130a3612e21565b60018416156130b157908102905b60019390931c928002613088565b935093915050565b5f826130d557506001612e48565b816130e157505f612e48565b81600181146130f757600281146131015761311d565b6001915050612e48565b60ff84111561311257613112612e21565b50506001821b612e48565b5060208310610133831016604e8410600b8410161715613140575081810a612e48565b61314c5f198484613084565b805f190482111561315f5761315f612e21565b029392505050565b5f61271060ff8416836130c7565b5f60208284031215613185575f5ffd5b815161271081612d39565b5f602082840312156131a0575f5ffd5b5051919050565b8381526020810183905260608101600483106131c5576131c5612aba565b826040830152949350505050565b5f5f604083850312156131e4575f5ffd5b82516001600160401b038111156131f9575f5ffd5b61320585828601612f53565b602085015190935090506001600160401b03811115613222575f5ffd5b8301601f81018513613232575f5ffd5b8051613240612f7082612f31565b8082825260208201915060208360051b850101925087831115613261575f5ffd5b6020840193505b8284101561307657835161327b81612d62565b825260209384019390910190613268565b604080825283519082018190525f9060208501906060840190835b818110156132e057835180516001600160a01b0316845260209081015163ffffffff1681850152909301926040909201916001016132a7565b5050602093909301939093525092915050565b634e487b7160e01b5f52601260045260245ffd5b6020810160028310612ae257612ae2612aba565b5f6020828403121561332b575f5ffd5b81516001600160401b03811115613340575f5ffd5b61334c84828501612f53565b949350505050565b60ff8281168282160390811115612e4857612e48612e21565b8082028115828204841417612e4857612e48612e21565b5f8261339e57634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212200f413788e8220fcbfa7a2e0261e604e5057a03bf734a9f9f6d94d6fda921639b64736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061019f575f3560e01c8063055ad42e146101a35780630844697d146101cd57806308af604d146101f5578063132b1c921461021a57806314b19c5a1461025057806314b5d07f1461025e57806325a760c2146102735780632b0088b4146102875780632e2dc43e146102905780633a0dad8e146102aa5780634585e33b146102ca5780634ff0876a146102dd5780635488cd621461030257806358fac65b146103165780635dc228a0146103295780636e04ff0d1461033c5780636ff041531461035d5780637060444514610372578063715018a6146103855780637158da7c1461038d57806379502c55146103a05780637b103999146103b35780637cdabf0a146103c6578063800f9fad146103d95780638da5cb5b146103e25780638f5c9465146103ea578063b8b2af7c146103f3578063ba96ff1114610408578063c18e2a5c1461041b578063ca1f32f114610424578063e2638ff11461042d578063e2c4aaec14610455578063e6c3efd914610468578063eeb393c91461047b578063f2fde38b1461048e575b5f5ffd5b6016546101b7906301000000900460ff1681565b6040516101c49190612ace565b60405180910390f35b6008546101e290600160b81b900461ffff1681565b60405161ffff90911681526020016101c4565b6016546102089062010000900460ff1681565b60405160ff90911681526020016101c4565b610242610228366004612afc565b6001600160a01b03165f908152600f602052604090205490565b6040519081526020016101c4565b6016546101e29061ffff1681565b61027161026c366004612afc565b6104a1565b005b60085461020890600160a01b900460ff1681565b61024260075481565b6102986105aa565b6040516101c496959493929190612b8a565b6004546102bd906001600160a01b031681565b6040516101c49190612c0b565b6102716102d8366004612c1f565b610826565b6014546102ed9063ffffffff1681565b60405163ffffffff90911681526020016101c4565b60165461020890600160201b900460ff1681565b6102bd610324366004612c8b565b610969565b6002546102bd906001600160a01b031681565b61034f61034a366004612c1f565b610991565b6040516101c4929190612ca2565b610365610c0f565b6040516101c49190612ce0565b610271610380366004612c8b565b610ca9565b610271610d10565b6008546102bd906001600160a01b031681565b6003546102bd906001600160a01b031681565b6005546102bd906001600160a01b031681565b6102716103d4366004612d08565b610d23565b61024260095481565b6102bd610e2a565b6101e261271081565b6008546101e290600160a81b900461ffff1681565b610242610416366004612afc565b610e38565b61024260185481565b61024260065481565b61024261043b366004612afc565b6001600160a01b03165f908152600e602052604090205490565b610271610463366004612c8b565b610e91565b610271610476366004612d47565b610f04565b610271610489366004612d73565b610fde565b61027161049c366004612afc565b6110c5565b6104a9611108565b6001600160a01b0381166104d05760405163d92e233d60e01b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610520573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105449190612d8e565b610561576040516312aecd8160e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f6cc7ebdb6c8c53291c5ae16148cab9b049d23bf5bde5632900b40edff56fcb43905f90a250565b606080808080805f6016546301000000900460ff1660048111156105d0576105d0612aba565b146105ee576040516312aecd8160e01b815260040160405180910390fd5b5f600a60080180548060200260200160405190810160405280929190818152602001828054801561064657602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610628575b505050505090505f5f6106588361113a565b915091508161ffff166001600160401b0381111561067857610678612dad565b6040519080825280602002602001820160405280156106a1578160200160208202803683370190505b5098508161ffff166001600160401b038111156106c0576106c0612dad565b6040519080825280602002602001820160405280156106e9578160200160208202803683370190505b5097508061ffff166001600160401b0381111561070857610708612dad565b604051908082528060200260200182016040528015610731578160200160208202803683370190505b5096508061ffff166001600160401b0381111561075057610750612dad565b604051908082528060200260200182016040528015610779578160200160208202803683370190505b5095508161ffff166001600160401b0381111561079857610798612dad565b6040519080825280602002602001820160405280156107c1578160200160208202803683370190505b5094508061ffff166001600160401b038111156107e0576107e0612dad565b604051908082528060200260200182016040528015610809578160200160208202803683370190505b50935061081b838a8a888b8b8a6111db565b505050909192939495565b61082e610e2a565b6001600160a01b0316336001600160a01b03161415801561085a57506002546001600160a01b03163314155b156108785760405163ea8e4eb560e01b815260040160405180910390fd5b6108806113be565b60058110156108a2576040516317dbc4cb60e21b815260040160405180910390fd5b5f806108b083850185612dc1565b90925090506341659aab60e01b6001600160e01b03198316016108da576108d56113e8565b61095a565b636ce38ed360e11b6001600160e01b03198316016108fb576108d581611584565b6292a80f60e51b6001600160e01b031983160161091a576108d5611d35565b6265e66b60e01b6001600160e01b031983160161093a576108d581611f42565b63c4b3cef760e01b6001600160e01b031983160161095a5761095a61244b565b505061096560018055565b5050565b60178181548110610978575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f606060035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109e4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a089190612d8e565b8015610a15575060155442115b15610a6757600191507fbe9a655586dceb82dfa0af992b5d8ae7fa45053cb7fd6f141f541da7572978c75f604051602001610a51929190612e04565b6040516020818303038152906040529050610c08565b60016016546301000000900460ff166004811115610a8757610a87612aba565b03610ad257600191507f2638e25a856cbfe28e0ae1857cb597cc2ceb873ce579b7d93c2258e45a754481601660049054906101000a900460ff16604051602001610a51929190612e04565b60026016546301000000900460ff166004811115610af257610af2612aba565b03610b2e57600191507fedaafe206508e00f40674bb87dda745bccfe8a3f3f6d6eaaf6db5f44021a1c135f604051602001610a51929190612e04565b60036016546301000000900460ff166004811115610b4e57610b4e612aba565b03610b9957600191507fff9a199536c068c55c334e40ebfa355733f79152332d6586d615c5bb37fd5c17601660049054906101000a900460ff16604051602001610a51929190612e04565b60046016546301000000900460ff166004811115610bb957610bb9612aba565b03610bf557600191507f3b4c310984a9fe486c05a56b52659c09d4bf9f3ef9b799ad52ee29a7d805741e5f604051602001610a51929190612e04565b505060408051602081019091525f808252905b9250929050565b60605f6016546301000000900460ff166004811115610c3057610c30612aba565b14610c4e576040516312aecd8160e01b815260040160405180910390fd5b6012805460408051602080840282018101909252828152929190830182828015610c9f57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610c81575b5050505050905090565b6004546001600160a01b03163314610cd45760405163ea8e4eb560e01b815260040160405180910390fd5b600954811115610cf757604051632ca2f52b60e11b815260040160405180910390fd5b8060095f828254610d089190612e35565b909155505050565b610d18611108565b610d215f612617565b565b610d2b611108565b60328261ffff161180610d4357506107d08161ffff16115b15610d61576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610db1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dd59190612d8e565b610df2576040516312aecd8160e01b815260040160405180910390fd5b6008805463ffffffff60a81b1916600160a81b61ffff9485160261ffff60b81b191617600160b81b9290931691909102919091179055565b5f546001600160a01b031690565b5f806016546301000000900460ff166004811115610e5857610e58612aba565b14610e76576040516312aecd8160e01b815260040160405180910390fd5b506001600160a01b03165f908152600a602052604090205490565b6004546001600160a01b03163314610ebc5760405163ea8e4eb560e01b815260040160405180910390fd5b5f811315610ee0578060185f828254610ed59190612e4e565b90915550610f019050565b5f811215610f0157610ef181612e61565b60185f828254610d089190612e35565b50565b610f0c611108565b8060ff165f03610f2f576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f7f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fa39190612d8e565b610fc0576040516312aecd8160e01b815260040160405180910390fd5b6016805460ff909216620100000262ff000019909216919091179055565b610fe6611108565b8063ffffffff165f0361100c576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561105c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110809190612d8e565b61109d576040516312aecd8160e01b815260040160405180910390fd5b6014805463ffffffff191663ffffffff83169081179091556110bf9042612e4e565b60155550565b6110cd611108565b6001600160a01b0381166110ff575f604051631e4fbdf760e01b81526004016110f69190612c0b565b60405180910390fd5b610f0181612617565b33611111610e2a565b6001600160a01b031614610d21573360405163118cdaa760e01b81526004016110f69190612c0b565b80515f908190815b8161ffff168161ffff1610156111d4575f858261ffff168151811061116957611169612e7b565b6020908102919091018101516001600160a01b0381165f9081526010909252604090912054909150156111a25761119f85612e8f565b94505b6001600160a01b0381165f90815260116020526040902054156111cb576111c884612e8f565b93505b50600101611142565b5050915091565b86515f80805b8361ffff168161ffff1610156113b1575f8b8261ffff168151811061120857611208612e7b565b6020908102919091018101516001600160a01b0381165f90815260108352604080822054601190945290205490925081156112ed57828d8761ffff168151811061125457611254612e7b565b60200260200101906001600160a01b031690816001600160a01b031681525050818c8761ffff168151811061128b5761128b612e7b565b6020908102919091018101919091526001600160a01b0384165f908152600a90915260409020546006546112c0918491612666565b8b8761ffff16815181106112d6576112d6612e7b565b60209081029190910101526112ea86612e8f565b95505b80156113a357828a8661ffff168151811061130a5761130a612e7b565b60200260200101906001600160a01b031690816001600160a01b03168152505080898661ffff168151811061134157611341612e7b565b6020908102919091018101919091526001600160a01b0384165f908152600a9091526040902054600654611376918391612666565b888661ffff168151811061138c5761138c612e7b565b60209081029190910101526113a085612e8f565b94505b5050508060010190506111e1565b5050505050505050505050565b6002600154036113e157604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b6015544211158061146a575060035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611444573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114689190612d8e565b155b156114885760405163085de62560e01b815260040160405180910390fd5b5f5b60125461ffff8216101561153d575f600a6008018261ffff16815481106114b3576114b3612e7b565b5f9182526020808320909101546001600160a01b03168252600a81526040808320839055600b8252808320839055600c8252808320839055600e8252808320839055600f8252808320839055600d8252808320839055601082528083208390556011825280832083905560139091529020805460ff191690555061153681612e8f565b905061148a565b5061154960125f612a8c565b611551612717565b60175415610d215760145461156c9063ffffffff1642612e4e565b6015556016805463ff00000019166301000000179055565b60016016546301000000900460ff1660048111156115a4576115a4612aba565b146115c25760405163baf3f0f760e01b815260040160405180910390fd5b601680546004906115dc90600160201b900460ff16612eaf565b91906101000a81548160ff021916908360ff1602179055505f601660029054906101000a900460ff16826116109190612ec4565b60165460ff91821692505f9161162d916201000090041683612ee7565b60175490915061ffff82161180611649575060175461ffff8216145b1561166757506017546016805464ffff000000191663020000001790555b815b8161ffff168161ffff161015611d2f575f60178261ffff168154811061169157611691612e7b565b905f5260205f20015f9054906101000a90046001600160a01b031690505f5f826001600160a01b031663d3d034586040518163ffffffff1660e01b81526004015f60405180830381865afa1580156116eb573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117129190810190612fc6565b90925090505f805b83518161ffff1610156119fe575f848261ffff168151811061173e5761173e612e7b565b602002602001015190505f848361ffff168151811061175f5761175f612e7b565b6020026020010151905080600a6001015f846001600160a01b03166001600160a01b031681526020019081526020015f205f82825461179e9190612e4e565b90915550506001600160a01b0382165f9081526013602052604090205460ff16611922576008546001600160a01b039081169083160361189a5760085461187d906117f490600160a01b900460ff16600a613167565b600860149054906101000a900460ff1660035f9054906101000a90046001600160a01b03166001600160a01b031663567ba7136040518163ffffffff1660e01b8152600401602060405180830381865afa158015611854573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118789190613175565b612970565b6001600160a01b0383165f908152600a6020526040902055611922565b6005546040516341976e0960e01b81526001600160a01b03909116906341976e09906118ca908590600401612c0b565b602060405180830381865afa1580156118e5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119099190613190565b6001600160a01b0383165f908152600a60205260409020555b6001600160a01b0382165f908152600a60205260408120546006549091906119d2906119519084908690612666565b600354604051633c2e3e7b60e11b81526001600160a01b039091169063785c7cf690611981908990600401612c0b565b602060405180830381865afa15801561199c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119c09190613175565b600854600160a01b900460ff16612970565b90506119de8187612e4e565b95506119e9846129da565b50505050806119f790612e8f565b905061171a565b506008545f90611a1c90600160a81b900461ffff1683612710612666565b601454909150611a3d90829063ffffffff908116906301e133809061266616565b90508060095f828254611a509190612e4e565b90915550611a6090508183612e35565b60405163728d42fb60e11b8152600481018290529092505f906001600160a01b0387169063e51a85f690602401602060405180830381865afa158015611aa8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611acc9190613190565b9050611ad88184612e35565b6008549093505f90611af890600160b81b900461ffff1683612710612666565b90508060095f828254611b0b9190612e4e565b90915550611b1b90508183612e35565b601654604051630df571f760e01b815261ffff9091166004820152602481018290529092506001600160a01b03881690630df571f7906044015f604051808303815f87803b158015611b6b575f5ffd5b505af1158015611b7d573d5f5f3e3d5ffd5b505050505f876001600160a01b031663a68a5267896001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bcd573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bf19190613190565b875f6040518463ffffffff1660e01b8152600401611c11939291906131a7565b602060405180830381865afa158015611c2c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c509190613190565b6001600160a01b0389165f908152600e602052604090208690559050611c768186612e35565b94505f886001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cb5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cd99190613190565b6001600160a01b038a165f908152600f602052604090208790559050611cff8187612e4e565b6001600160a01b039099165f908152600c6020526040902098909855505060019096019550611669945050505050565b50505050565b60026016546301000000900460ff166004811115611d5557611d55612aba565b14611d735760405163baf3f0f760e01b815260040160405180910390fd5b6016805463ff000000191663030000001790556017545f805b8261ffff168161ffff161015611df0575f60178261ffff1681548110611db457611db4612e7b565b5f9182526020808320909101546001600160a01b0316808352600c909152604090912054909150611de59084612e4e565b925050600101611d8c565b50600480546040805163dab26e3b60e01b815290515f93611e67936001600160a01b03169263dab26e3b92818301926020928290030181865afa158015611e39573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e5d9190613190565b8390612710612666565b9050806018541115611e7857505050565b5f60185482611e879190612e35565b90505f5b8461ffff168161ffff161015611f25575f60178261ffff1681548110611eb357611eb3612e7b565b5f9182526020808320909101546001600160a01b0316808352600c909152604082205490925090611ee5858389612666565b6001600160a01b0384165f908152600c6020526040812080549293508392909190611f11908490612e35565b909155505060019093019250611e8b915050565b508060185f828254611f379190612e4e565b909155505050505050565b60036016546301000000900460ff166004811115611f6257611f62612aba565b14611f805760405163baf3f0f760e01b815260040160405180910390fd5b60168054600490611f9a90600160201b900460ff16612eaf565b91906101000a81548160ff021916908360ff1602179055505f601660029054906101000a900460ff1682611fce9190612ec4565b60165460ff91821692505f91611feb916201000090041683612ee7565b60175490915061ffff82161180612007575060175461ffff8216145b1561202557506017546016805464ffff000000191663040000001790555b815b8161ffff168161ffff161015611d2f575f60178261ffff168154811061204f5761204f612e7b565b905f5260205f20015f9054906101000a90046001600160a01b031690505f5f826001600160a01b031663b6eba6536040518163ffffffff1660e01b81526004015f60405180830381865afa1580156120a9573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120d091908101906131d3565b6001600160a01b0385165f908152600c6020526040812054835193955091935090916001600160401b0381111561210957612109612dad565b60405190808252806020026020018201604052801561214d57816020015b604080518082019091525f80825260208201528152602001906001900390816121275790505b5090505f5b84518161ffff1610156123df575f858261ffff168151811061217657612176612e7b565b602002602001015190505f858361ffff168151811061219757612197612e7b565b6020908102919091018101516001600160a01b0384165f908152601390925260409091205490915060ff1661229d576008546001600160a01b0390811690831603612215576008546121f8906117f490600160a01b900460ff16600a613167565b6001600160a01b0383165f908152600a602052604090205561229d565b6005546040516341976e0960e01b81526001600160a01b03909116906341976e0990612245908590600401612c0b565b602060405180830381865afa158015612260573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122849190613190565b6001600160a01b0383165f908152600a60205260409020555b6001600160a01b0382165f908152600a602052604081205460065460075491929161233f916122e59185906122de908c9063ffffffff808b16919061266616565b9190612666565b600854600354604051633c2e3e7b60e11b8152600160a01b90920460ff16916001600160a01b039091169063785c7cf690612324908a90600401612c0b565b602060405180830381865afa158015611854573d5f5f3e3d5ffd5b90506040518060400160405280856001600160a01b031681526020018263ffffffff16815250868661ffff168151811061237b5761237b612e7b565b602002602001018190525080600a6003015f866001600160a01b03166001600160a01b031681526020019081526020015f205f8282546123bb9190612e4e565b909155506123ca9050846129da565b50505050806123d890612e8f565b9050612152565b50604051630415112560e21b81526001600160a01b0386169063105444949061240e908490869060040161328c565b5f604051808303815f87803b158015612425575f5ffd5b505af1158015612437573d5f5f3e3d5ffd5b505050505050505050806001019050612027565b60046016546301000000900460ff16600481111561246b5761246b612aba565b146124895760405163baf3f0f760e01b815260040160405180910390fd5b5f600a6008018054806020026020016040519081016040528092919081815260200182805480156124e157602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116124c3575b505083519394505f925050505b8161ffff168161ffff1610156125ac575f838261ffff168151811061251557612515612e7b565b6020908102919091018101516001600160a01b0381165f908152600b8352604080822054600d90945290205490925080821115612573576125568183612e35565b6001600160a01b0384165f9081526010602052604090205561259e565b8181111561259e576125858282612e35565b6001600160a01b0384165f908152601160205260409020555b5050508060010190506124ee565b506016805463ff00000019811682555f906125ca9061ffff16612e8f565b82546101009290920a61ffff8181021990931691831602179091556016546040519116907f0bc12479581640d161e016cef21aa834cb6d6326bbc0d8445e58d56403adf2dc905f90a25050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f5f5f6126738686612a5f565b91509150815f036126975783818161268d5761268d6132f3565b0492505050612710565b8184116126ae576126ae6003851502601118612a7b565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150505b9392505050565b600354604051631da09e4360e31b81525f916001600160a01b03169063ed04f21890612747908490600401613307565b5f60405180830381865afa158015612761573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612788919081019061331b565b905061279560175f612a8c565b5f5b81518161ffff161015610965575f828261ffff16815181106127bb576127bb612e7b565b60200260200101519050806001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa158015612801573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128259190613190565b15801561288f5750806001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612869573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061288d9190613190565b155b1561289a5750612960565b5f816001600160a01b031663b6eba6536040518163ffffffff1660e01b81526004015f60405180830381865afa1580156128d6573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526128fd91908101906131d3565b50905080515f0361290f575050612960565b50601780546001810182555f919091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c150180546001600160a01b0319166001600160a01b03929092169190911790555b61296981612e8f565b9050612797565b5f8260ff168260ff1611156129a5576129898383613354565b61299490600a613167565b61299e908561336d565b9050612710565b8260ff168260ff1610156129d2576129bd8284613354565b6129c890600a613167565b61299e9085613384565b509192915050565b6001600160a01b0381165f9081526013602052604090205460ff16610f01576012805460018181019092557fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0384166001600160a01b031990911681179091555f908152601360205260409020805460ff1916909117905550565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5080545f8255905f5260205f2090810190610f0191905b80821115612ab6575f8155600101612aa3565b5090565b634e487b7160e01b5f52602160045260245ffd5b6020810160058310612ae257612ae2612aba565b91905290565b6001600160a01b0381168114610f01575f5ffd5b5f60208284031215612b0c575f5ffd5b813561271081612ae8565b5f8151808452602084019350602083015f5b82811015612b505781516001600160a01b0316865260209586019590910190600101612b29565b5093949350505050565b5f8151808452602084019350602083015f5b82811015612b50578151865260209586019590910190600101612b6c565b60c081525f612b9c60c0830189612b17565b8281036020840152612bae8189612b5a565b90508281036040840152612bc28188612b17565b90508281036060840152612bd68187612b5a565b90508281036080840152612bea8186612b5a565b905082810360a0840152612bfe8185612b5a565b9998505050505050505050565b6001600160a01b0391909116815260200190565b5f5f60208385031215612c30575f5ffd5b82356001600160401b03811115612c45575f5ffd5b8301601f81018513612c55575f5ffd5b80356001600160401b03811115612c6a575f5ffd5b856020828401011115612c7b575f5ffd5b6020919091019590945092505050565b5f60208284031215612c9b575f5ffd5b5035919050565b8215158152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b602081525f6127106020830184612b17565b803561ffff81168114612d03575f5ffd5b919050565b5f5f60408385031215612d19575f5ffd5b612d2283612cf2565b9150612d3060208401612cf2565b90509250929050565b60ff81168114610f01575f5ffd5b5f60208284031215612d57575f5ffd5b813561271081612d39565b63ffffffff81168114610f01575f5ffd5b5f60208284031215612d83575f5ffd5b813561271081612d62565b5f60208284031215612d9e575f5ffd5b81518015158114612710575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215612dd2575f5ffd5b82356001600160e01b031981168114612de9575f5ffd5b91506020830135612df981612d39565b809150509250929050565b6001600160e01b031992909216825260ff16602082015260400190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115612e4857612e48612e21565b92915050565b80820180821115612e4857612e48612e21565b5f600160ff1b8201612e7557612e75612e21565b505f0390565b634e487b7160e01b5f52603260045260245ffd5b5f61ffff821661ffff8103612ea657612ea6612e21565b60010192915050565b5f60ff821660ff8103612ea657612ea6612e21565b60ff8181168382160290811690818114612ee057612ee0612e21565b5092915050565b61ffff8181168382160190811115612e4857612e48612e21565b604051601f8201601f191681016001600160401b0381118282101715612f2957612f29612dad565b604052919050565b5f6001600160401b03821115612f4957612f49612dad565b5060051b60200190565b5f82601f830112612f62575f5ffd5b8151612f75612f7082612f31565b612f01565b8082825260208201915060208360051b860101925085831115612f96575f5ffd5b602085015b83811015612fbc578051612fae81612ae8565b835260209283019201612f9b565b5095945050505050565b5f5f60408385031215612fd7575f5ffd5b82516001600160401b03811115612fec575f5ffd5b612ff885828601612f53565b602085015190935090506001600160401b03811115613015575f5ffd5b8301601f81018513613025575f5ffd5b8051613033612f7082612f31565b8082825260208201915060208360051b850101925087831115613054575f5ffd5b6020840193505b8284101561307657835182526020938401939091019061305b565b809450505050509250929050565b6001815b60018411156130bf578085048111156130a3576130a3612e21565b60018416156130b157908102905b60019390931c928002613088565b935093915050565b5f826130d557506001612e48565b816130e157505f612e48565b81600181146130f757600281146131015761311d565b6001915050612e48565b60ff84111561311257613112612e21565b50506001821b612e48565b5060208310610133831016604e8410600b8410161715613140575081810a612e48565b61314c5f198484613084565b805f190482111561315f5761315f612e21565b029392505050565b5f61271060ff8416836130c7565b5f60208284031215613185575f5ffd5b815161271081612d39565b5f602082840312156131a0575f5ffd5b5051919050565b8381526020810183905260608101600483106131c5576131c5612aba565b826040830152949350505050565b5f5f604083850312156131e4575f5ffd5b82516001600160401b038111156131f9575f5ffd5b61320585828601612f53565b602085015190935090506001600160401b03811115613222575f5ffd5b8301601f81018513613232575f5ffd5b8051613240612f7082612f31565b8082825260208201915060208360051b850101925087831115613261575f5ffd5b6020840193505b8284101561307657835161327b81612d62565b825260209384019390910190613268565b604080825283519082018190525f9060208501906060840190835b818110156132e057835180516001600160a01b0316845260209081015163ffffffff1681850152909301926040909201916001016132a7565b5050602093909301939093525092915050565b634e487b7160e01b5f52601260045260245ffd5b6020810160028310612ae257612ae2612aba565b5f6020828403121561332b575f5ffd5b81516001600160401b03811115613340575f5ffd5b61334c84828501612f53565b949350505050565b60ff8281168282160390811115612e4857612e48612e21565b8082028115828204841417612e4857612e48612e21565b5f8261339e57634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212200f413788e8220fcbfa7a2e0261e604e5057a03bf734a9f9f6d94d6fda921639b64736f6c634300081c0033", + "bytecode": "0x608060405234801561000f575f5ffd5b50604051613a43380380613a4383398101604081905261002e916104b6565b826001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61006581610450565b50600180556001600160a01b0382166100915760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381166100b85760405163d92e233d60e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0384169081179091556040805163015df99360e01b8152905163015df993916004808201926020929091908290030181865afa15801561010f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101339190610500565b600580546001600160a01b0319166001600160a01b039283161790556003546040805163d1717c7d60e01b81529051919092169163d1717c7d9160048083019260209291908290030181865afa15801561018f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101b39190610522565b6101be90600a61063b565b60075560035460408051631c56369f60e21b815290516001600160a01b0390921691637158da7c916004808201926020929091908290030181865afa158015610209573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061022d9190610500565b600880546001600160a01b0319166001600160a01b03928316908117909155600354604051633c2e3e7b60e11b815260048101929092529091169063785c7cf690602401602060405180830381865afa15801561028c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102b09190610522565b600860146101000a81548160ff021916908360ff16021790555060035f9054906101000a90046001600160a01b03166001600160a01b031663567ba7136040518163ffffffff1660e01b8152600401602060405180830381865afa15801561031a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061033e9190610522565b61034990600a61063b565b6006556016805462ff0000191662010000179055600280546001600160a01b038084166001600160a01b03199092169190911790915560035460408051631d06d6c760e11b815290519190921691633a0dad8e9160048281019260209291908290030181865afa1580156103bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103e39190610500565b600480546001600160a01b0319166001600160a01b0392909216919091179055601480546201518063ffffffff1990911681179091556104239042610649565b60155550506016805464ffff00ffff19169055506008805463ffffffff60a81b191690555f60185561065c565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146104b3575f5ffd5b50565b5f5f5f606084860312156104c8575f5ffd5b83516104d38161049f565b60208501519093506104e48161049f565b60408501519092506104f58161049f565b809150509250925092565b5f60208284031215610510575f5ffd5b815161051b8161049f565b9392505050565b5f60208284031215610532575f5ffd5b815160ff8116811461051b575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156105915780850481111561057557610575610542565b600184161561058357908102905b60019390931c92800261055a565b935093915050565b5f826105a757506001610635565b816105b357505f610635565b81600181146105c957600281146105d3576105ef565b6001915050610635565b60ff8411156105e4576105e4610542565b50506001821b610635565b5060208310610133831016604e8410600b8410161715610612575081810a610635565b61061e5f198484610556565b805f190482111561063157610631610542565b0290505b92915050565b5f61051b60ff841683610599565b8082018082111561063557610635610542565b6133da806106695f395ff3fe608060405234801561000f575f5ffd5b506004361061019f575f3560e01c8063055ad42e146101a35780630844697d146101cd57806308af604d146101f5578063132b1c921461021a57806314b19c5a1461025057806314b5d07f1461025e57806325a760c2146102735780632b0088b4146102875780632e2dc43e146102905780633a0dad8e146102aa5780634585e33b146102ca5780634ff0876a146102dd5780635488cd621461030257806358fac65b146103165780635dc228a0146103295780636e04ff0d1461033c5780636ff041531461035d5780637060444514610372578063715018a6146103855780637158da7c1461038d57806379502c55146103a05780637b103999146103b35780637cdabf0a146103c6578063800f9fad146103d95780638da5cb5b146103e25780638f5c9465146103ea578063b8b2af7c146103f3578063ba96ff1114610408578063c18e2a5c1461041b578063ca1f32f114610424578063e2638ff11461042d578063e2c4aaec14610455578063e6c3efd914610468578063eeb393c91461047b578063f2fde38b1461048e575b5f5ffd5b6016546101b7906301000000900460ff1681565b6040516101c49190612acf565b60405180910390f35b6008546101e290600160b81b900461ffff1681565b60405161ffff90911681526020016101c4565b6016546102089062010000900460ff1681565b60405160ff90911681526020016101c4565b610242610228366004612afd565b6001600160a01b03165f908152600f602052604090205490565b6040519081526020016101c4565b6016546101e29061ffff1681565b61027161026c366004612afd565b6104a1565b005b60085461020890600160a01b900460ff1681565b61024260075481565b6102986105aa565b6040516101c496959493929190612b8b565b6004546102bd906001600160a01b031681565b6040516101c49190612c0c565b6102716102d8366004612c20565b610826565b6014546102ed9063ffffffff1681565b60405163ffffffff90911681526020016101c4565b60165461020890600160201b900460ff1681565b6102bd610324366004612c8c565b610969565b6002546102bd906001600160a01b031681565b61034f61034a366004612c20565b610991565b6040516101c4929190612ca3565b610365610c0f565b6040516101c49190612ce1565b610271610380366004612c8c565b610ca9565b610271610d10565b6008546102bd906001600160a01b031681565b6003546102bd906001600160a01b031681565b6005546102bd906001600160a01b031681565b6102716103d4366004612d09565b610d23565b61024260095481565b6102bd610e2a565b6101e261271081565b6008546101e290600160a81b900461ffff1681565b610242610416366004612afd565b610e38565b61024260185481565b61024260065481565b61024261043b366004612afd565b6001600160a01b03165f908152600e602052604090205490565b610271610463366004612c8c565b610e91565b610271610476366004612d48565b610f04565b610271610489366004612d74565b610fde565b61027161049c366004612afd565b6110c5565b6104a9611108565b6001600160a01b0381166104d05760405163d92e233d60e01b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610520573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105449190612d8f565b610561576040516312aecd8160e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f6cc7ebdb6c8c53291c5ae16148cab9b049d23bf5bde5632900b40edff56fcb43905f90a250565b606080808080805f6016546301000000900460ff1660048111156105d0576105d0612abb565b146105ee576040516312aecd8160e01b815260040160405180910390fd5b5f600a60080180548060200260200160405190810160405280929190818152602001828054801561064657602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610628575b505050505090505f5f6106588361113a565b915091508161ffff166001600160401b0381111561067857610678612dae565b6040519080825280602002602001820160405280156106a1578160200160208202803683370190505b5098508161ffff166001600160401b038111156106c0576106c0612dae565b6040519080825280602002602001820160405280156106e9578160200160208202803683370190505b5097508061ffff166001600160401b0381111561070857610708612dae565b604051908082528060200260200182016040528015610731578160200160208202803683370190505b5096508061ffff166001600160401b0381111561075057610750612dae565b604051908082528060200260200182016040528015610779578160200160208202803683370190505b5095508161ffff166001600160401b0381111561079857610798612dae565b6040519080825280602002602001820160405280156107c1578160200160208202803683370190505b5094508061ffff166001600160401b038111156107e0576107e0612dae565b604051908082528060200260200182016040528015610809578160200160208202803683370190505b50935061081b838a8a888b8b8a6111db565b505050909192939495565b61082e610e2a565b6001600160a01b0316336001600160a01b03161415801561085a57506002546001600160a01b03163314155b156108785760405163ea8e4eb560e01b815260040160405180910390fd5b6108806113be565b60058110156108a2576040516317dbc4cb60e21b815260040160405180910390fd5b5f806108b083850185612dc2565b90925090506341659aab60e01b6001600160e01b03198316016108da576108d56113e8565b61095a565b636ce38ed360e11b6001600160e01b03198316016108fb576108d581611584565b6292a80f60e51b6001600160e01b031983160161091a576108d5611d35565b6265e66b60e01b6001600160e01b031983160161093a576108d581611f42565b63c4b3cef760e01b6001600160e01b031983160161095a5761095a61244b565b505061096560018055565b5050565b60178181548110610978575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f606060035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109e4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a089190612d8f565b8015610a15575060155442115b15610a6757600191507fbe9a655586dceb82dfa0af992b5d8ae7fa45053cb7fd6f141f541da7572978c75f604051602001610a51929190612e05565b6040516020818303038152906040529050610c08565b60016016546301000000900460ff166004811115610a8757610a87612abb565b03610ad257600191507f2638e25a856cbfe28e0ae1857cb597cc2ceb873ce579b7d93c2258e45a754481601660049054906101000a900460ff16604051602001610a51929190612e05565b60026016546301000000900460ff166004811115610af257610af2612abb565b03610b2e57600191507fedaafe206508e00f40674bb87dda745bccfe8a3f3f6d6eaaf6db5f44021a1c135f604051602001610a51929190612e05565b60036016546301000000900460ff166004811115610b4e57610b4e612abb565b03610b9957600191507fff9a199536c068c55c334e40ebfa355733f79152332d6586d615c5bb37fd5c17601660049054906101000a900460ff16604051602001610a51929190612e05565b60046016546301000000900460ff166004811115610bb957610bb9612abb565b03610bf557600191507f3b4c310984a9fe486c05a56b52659c09d4bf9f3ef9b799ad52ee29a7d805741e5f604051602001610a51929190612e05565b505060408051602081019091525f808252905b9250929050565b60605f6016546301000000900460ff166004811115610c3057610c30612abb565b14610c4e576040516312aecd8160e01b815260040160405180910390fd5b6012805460408051602080840282018101909252828152929190830182828015610c9f57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610c81575b5050505050905090565b6004546001600160a01b03163314610cd45760405163ea8e4eb560e01b815260040160405180910390fd5b600954811115610cf757604051632ca2f52b60e11b815260040160405180910390fd5b8060095f828254610d089190612e36565b909155505050565b610d18611108565b610d215f612617565b565b610d2b611108565b60328261ffff161180610d4357506107d08161ffff16115b15610d61576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610db1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dd59190612d8f565b610df2576040516312aecd8160e01b815260040160405180910390fd5b6008805463ffffffff60a81b1916600160a81b61ffff9485160261ffff60b81b191617600160b81b9290931691909102919091179055565b5f546001600160a01b031690565b5f806016546301000000900460ff166004811115610e5857610e58612abb565b14610e76576040516312aecd8160e01b815260040160405180910390fd5b506001600160a01b03165f908152600a602052604090205490565b6004546001600160a01b03163314610ebc5760405163ea8e4eb560e01b815260040160405180910390fd5b5f811315610ee0578060185f828254610ed59190612e4f565b90915550610f019050565b5f811215610f0157610ef181612e62565b60185f828254610d089190612e36565b50565b610f0c611108565b8060ff165f03610f2f576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f7f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fa39190612d8f565b610fc0576040516312aecd8160e01b815260040160405180910390fd5b6016805460ff909216620100000262ff000019909216919091179055565b610fe6611108565b8063ffffffff165f0361100c576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561105c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110809190612d8f565b61109d576040516312aecd8160e01b815260040160405180910390fd5b6014805463ffffffff191663ffffffff83169081179091556110bf9042612e4f565b60155550565b6110cd611108565b6001600160a01b0381166110ff575f604051631e4fbdf760e01b81526004016110f69190612c0c565b60405180910390fd5b610f0181612617565b33611111610e2a565b6001600160a01b031614610d21573360405163118cdaa760e01b81526004016110f69190612c0c565b80515f908190815b8161ffff168161ffff1610156111d4575f858261ffff168151811061116957611169612e7c565b6020908102919091018101516001600160a01b0381165f9081526010909252604090912054909150156111a25761119f85612e90565b94505b6001600160a01b0381165f90815260116020526040902054156111cb576111c884612e90565b93505b50600101611142565b5050915091565b86515f80805b8361ffff168161ffff1610156113b1575f8b8261ffff168151811061120857611208612e7c565b6020908102919091018101516001600160a01b0381165f90815260108352604080822054601190945290205490925081156112ed57828d8761ffff168151811061125457611254612e7c565b60200260200101906001600160a01b031690816001600160a01b031681525050818c8761ffff168151811061128b5761128b612e7c565b6020908102919091018101919091526001600160a01b0384165f908152600a90915260409020546006546112c0918491612666565b8b8761ffff16815181106112d6576112d6612e7c565b60209081029190910101526112ea86612e90565b95505b80156113a357828a8661ffff168151811061130a5761130a612e7c565b60200260200101906001600160a01b031690816001600160a01b03168152505080898661ffff168151811061134157611341612e7c565b6020908102919091018101919091526001600160a01b0384165f908152600a9091526040902054600654611376918391612666565b888661ffff168151811061138c5761138c612e7c565b60209081029190910101526113a085612e90565b94505b5050508060010190506111e1565b5050505050505050505050565b6002600154036113e157604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b6015544211158061146a575060035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611444573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114689190612d8f565b155b156114885760405163085de62560e01b815260040160405180910390fd5b5f5b60125461ffff8216101561153d575f600a6008018261ffff16815481106114b3576114b3612e7c565b5f9182526020808320909101546001600160a01b03168252600a81526040808320839055600b8252808320839055600c8252808320839055600e8252808320839055600f8252808320839055600d8252808320839055601082528083208390556011825280832083905560139091529020805460ff191690555061153681612e90565b905061148a565b5061154960125f612a8d565b611551612717565b60175415610d215760145461156c9063ffffffff1642612e4f565b6015556016805463ff00000019166301000000179055565b60016016546301000000900460ff1660048111156115a4576115a4612abb565b146115c25760405163baf3f0f760e01b815260040160405180910390fd5b601680546004906115dc90600160201b900460ff16612eb0565b91906101000a81548160ff021916908360ff1602179055505f601660029054906101000a900460ff16826116109190612ec5565b60165460ff91821692505f9161162d916201000090041683612ee8565b60175490915061ffff82161180611649575060175461ffff8216145b1561166757506017546016805464ffff000000191663020000001790555b815b8161ffff168161ffff161015611d2f575f60178261ffff168154811061169157611691612e7c565b905f5260205f20015f9054906101000a90046001600160a01b031690505f5f826001600160a01b031663d3d034586040518163ffffffff1660e01b81526004015f60405180830381865afa1580156116eb573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117129190810190612fc7565b90925090505f805b83518161ffff1610156119fe575f848261ffff168151811061173e5761173e612e7c565b602002602001015190505f848361ffff168151811061175f5761175f612e7c565b6020026020010151905080600a6001015f846001600160a01b03166001600160a01b031681526020019081526020015f205f82825461179e9190612e4f565b90915550506001600160a01b0382165f9081526013602052604090205460ff16611922576008546001600160a01b039081169083160361189a5760085461187d906117f490600160a01b900460ff16600a613168565b600860149054906101000a900460ff1660035f9054906101000a90046001600160a01b03166001600160a01b031663567ba7136040518163ffffffff1660e01b8152600401602060405180830381865afa158015611854573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118789190613176565b612971565b6001600160a01b0383165f908152600a6020526040902055611922565b6005546040516341976e0960e01b81526001600160a01b03909116906341976e09906118ca908590600401612c0c565b602060405180830381865afa1580156118e5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119099190613191565b6001600160a01b0383165f908152600a60205260409020555b6001600160a01b0382165f908152600a60205260408120546006549091906119d2906119519084908690612666565b600354604051633c2e3e7b60e11b81526001600160a01b039091169063785c7cf690611981908990600401612c0c565b602060405180830381865afa15801561199c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119c09190613176565b600854600160a01b900460ff16612971565b90506119de8187612e4f565b95506119e9846129db565b50505050806119f790612e90565b905061171a565b506008545f90611a1c90600160a81b900461ffff1683612710612666565b601454909150611a3d90829063ffffffff908116906301e133809061266616565b90508060095f828254611a509190612e4f565b90915550611a6090508183612e36565b60405163728d42fb60e11b8152600481018290529092505f906001600160a01b0387169063e51a85f690602401602060405180830381865afa158015611aa8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611acc9190613191565b9050611ad88184612e36565b6008549093505f90611af890600160b81b900461ffff1683612710612666565b90508060095f828254611b0b9190612e4f565b90915550611b1b90508183612e36565b601654604051630df571f760e01b815261ffff9091166004820152602481018290529092506001600160a01b03881690630df571f7906044015f604051808303815f87803b158015611b6b575f5ffd5b505af1158015611b7d573d5f5f3e3d5ffd5b505050505f876001600160a01b031663a68a5267896001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bcd573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bf19190613191565b875f6040518463ffffffff1660e01b8152600401611c11939291906131a8565b602060405180830381865afa158015611c2c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c509190613191565b6001600160a01b0389165f908152600e602052604090208690559050611c768186612e36565b94505f886001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cb5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cd99190613191565b6001600160a01b038a165f908152600f602052604090208790559050611cff8187612e4f565b6001600160a01b039099165f908152600c6020526040902098909855505060019096019550611669945050505050565b50505050565b60026016546301000000900460ff166004811115611d5557611d55612abb565b14611d735760405163baf3f0f760e01b815260040160405180910390fd5b6016805463ff000000191663030000001790556017545f805b8261ffff168161ffff161015611df0575f60178261ffff1681548110611db457611db4612e7c565b5f9182526020808320909101546001600160a01b0316808352600c909152604090912054909150611de59084612e4f565b925050600101611d8c565b50600480546040805163dab26e3b60e01b815290515f93611e67936001600160a01b03169263dab26e3b92818301926020928290030181865afa158015611e39573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e5d9190613191565b8390612710612666565b9050806018541115611e7857505050565b5f60185482611e879190612e36565b90505f5b8461ffff168161ffff161015611f25575f60178261ffff1681548110611eb357611eb3612e7c565b5f9182526020808320909101546001600160a01b0316808352600c909152604082205490925090611ee5858389612666565b6001600160a01b0384165f908152600c6020526040812080549293508392909190611f11908490612e36565b909155505060019093019250611e8b915050565b508060185f828254611f379190612e4f565b909155505050505050565b60036016546301000000900460ff166004811115611f6257611f62612abb565b14611f805760405163baf3f0f760e01b815260040160405180910390fd5b60168054600490611f9a90600160201b900460ff16612eb0565b91906101000a81548160ff021916908360ff1602179055505f601660029054906101000a900460ff1682611fce9190612ec5565b60165460ff91821692505f91611feb916201000090041683612ee8565b60175490915061ffff82161180612007575060175461ffff8216145b1561202557506017546016805464ffff000000191663040000001790555b815b8161ffff168161ffff161015611d2f575f60178261ffff168154811061204f5761204f612e7c565b905f5260205f20015f9054906101000a90046001600160a01b031690505f5f826001600160a01b031663b6eba6536040518163ffffffff1660e01b81526004015f60405180830381865afa1580156120a9573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120d091908101906131d4565b6001600160a01b0385165f908152600c6020526040812054835193955091935090916001600160401b0381111561210957612109612dae565b60405190808252806020026020018201604052801561214d57816020015b604080518082019091525f80825260208201528152602001906001900390816121275790505b5090505f5b84518161ffff1610156123df575f858261ffff168151811061217657612176612e7c565b602002602001015190505f858361ffff168151811061219757612197612e7c565b6020908102919091018101516001600160a01b0384165f908152601390925260409091205490915060ff1661229d576008546001600160a01b0390811690831603612215576008546121f8906117f490600160a01b900460ff16600a613168565b6001600160a01b0383165f908152600a602052604090205561229d565b6005546040516341976e0960e01b81526001600160a01b03909116906341976e0990612245908590600401612c0c565b602060405180830381865afa158015612260573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122849190613191565b6001600160a01b0383165f908152600a60205260409020555b6001600160a01b0382165f908152600a602052604081205460065460075491929161233f916122e59185906122de908c9063ffffffff808b16919061266616565b9190612666565b600854600354604051633c2e3e7b60e11b8152600160a01b90920460ff16916001600160a01b039091169063785c7cf690612324908a90600401612c0c565b602060405180830381865afa158015611854573d5f5f3e3d5ffd5b90506040518060400160405280856001600160a01b031681526020018263ffffffff16815250868661ffff168151811061237b5761237b612e7c565b602002602001018190525080600a6003015f866001600160a01b03166001600160a01b031681526020019081526020015f205f8282546123bb9190612e4f565b909155506123ca9050846129db565b50505050806123d890612e90565b9050612152565b50604051630415112560e21b81526001600160a01b0386169063105444949061240e908490869060040161328d565b5f604051808303815f87803b158015612425575f5ffd5b505af1158015612437573d5f5f3e3d5ffd5b505050505050505050806001019050612027565b60046016546301000000900460ff16600481111561246b5761246b612abb565b146124895760405163baf3f0f760e01b815260040160405180910390fd5b5f600a6008018054806020026020016040519081016040528092919081815260200182805480156124e157602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116124c3575b505083519394505f925050505b8161ffff168161ffff1610156125ac575f838261ffff168151811061251557612515612e7c565b6020908102919091018101516001600160a01b0381165f908152600b8352604080822054600d90945290205490925080821115612573576125568183612e36565b6001600160a01b0384165f9081526010602052604090205561259e565b8181111561259e576125858282612e36565b6001600160a01b0384165f908152601160205260409020555b5050508060010190506124ee565b506016805463ff00000019811682555f906125ca9061ffff16612e90565b82546101009290920a61ffff8181021990931691831602179091556016546040519116907f0bc12479581640d161e016cef21aa834cb6d6326bbc0d8445e58d56403adf2dc905f90a25050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f5f5f6126738686612a60565b91509150815f036126975783818161268d5761268d6132f4565b0492505050612710565b8184116126ae576126ae6003851502601118612a7c565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150505b9392505050565b600354604051631da09e4360e31b81525f916001600160a01b03169063ed04f21890612747908490600401613308565b5f60405180830381865afa158015612761573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612788919081019061331c565b905061279560175f612a8d565b5f5b81518161ffff161015610965575f828261ffff16815181106127bb576127bb612e7c565b60200260200101519050806001600160a01b03166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa158015612801573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128259190613191565b816001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa158015612861573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128859190613191565b61288f9190612e4f565b5f0361289b5750612961565b5f816001600160a01b031663b6eba6536040518163ffffffff1660e01b81526004015f60405180830381865afa1580156128d7573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526128fe91908101906131d4565b50905080515f03612910575050612961565b50601780546001810182555f919091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c150180546001600160a01b0319166001600160a01b03929092169190911790555b61296a81612e90565b9050612797565b5f8260ff168260ff1611156129a65761298a8383613355565b61299590600a613168565b61299f908561336e565b9050612710565b8260ff168260ff1610156129d3576129be8284613355565b6129c990600a613168565b61299f9085613385565b509192915050565b6001600160a01b0381165f9081526013602052604090205460ff16610f01576012805460018181019092557fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0384166001600160a01b031990911681179091555f908152601360205260409020805460ff1916909117905550565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5080545f8255905f5260205f2090810190610f0191905b80821115612ab7575f8155600101612aa4565b5090565b634e487b7160e01b5f52602160045260245ffd5b6020810160058310612ae357612ae3612abb565b91905290565b6001600160a01b0381168114610f01575f5ffd5b5f60208284031215612b0d575f5ffd5b813561271081612ae9565b5f8151808452602084019350602083015f5b82811015612b515781516001600160a01b0316865260209586019590910190600101612b2a565b5093949350505050565b5f8151808452602084019350602083015f5b82811015612b51578151865260209586019590910190600101612b6d565b60c081525f612b9d60c0830189612b18565b8281036020840152612baf8189612b5b565b90508281036040840152612bc38188612b18565b90508281036060840152612bd78187612b5b565b90508281036080840152612beb8186612b5b565b905082810360a0840152612bff8185612b5b565b9998505050505050505050565b6001600160a01b0391909116815260200190565b5f5f60208385031215612c31575f5ffd5b82356001600160401b03811115612c46575f5ffd5b8301601f81018513612c56575f5ffd5b80356001600160401b03811115612c6b575f5ffd5b856020828401011115612c7c575f5ffd5b6020919091019590945092505050565b5f60208284031215612c9c575f5ffd5b5035919050565b8215158152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b602081525f6127106020830184612b18565b803561ffff81168114612d04575f5ffd5b919050565b5f5f60408385031215612d1a575f5ffd5b612d2383612cf3565b9150612d3160208401612cf3565b90509250929050565b60ff81168114610f01575f5ffd5b5f60208284031215612d58575f5ffd5b813561271081612d3a565b63ffffffff81168114610f01575f5ffd5b5f60208284031215612d84575f5ffd5b813561271081612d63565b5f60208284031215612d9f575f5ffd5b81518015158114612710575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215612dd3575f5ffd5b82356001600160e01b031981168114612dea575f5ffd5b91506020830135612dfa81612d3a565b809150509250929050565b6001600160e01b031992909216825260ff16602082015260400190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115612e4957612e49612e22565b92915050565b80820180821115612e4957612e49612e22565b5f600160ff1b8201612e7657612e76612e22565b505f0390565b634e487b7160e01b5f52603260045260245ffd5b5f61ffff821661ffff8103612ea757612ea7612e22565b60010192915050565b5f60ff821660ff8103612ea757612ea7612e22565b60ff8181168382160290811690818114612ee157612ee1612e22565b5092915050565b61ffff8181168382160190811115612e4957612e49612e22565b604051601f8201601f191681016001600160401b0381118282101715612f2a57612f2a612dae565b604052919050565b5f6001600160401b03821115612f4a57612f4a612dae565b5060051b60200190565b5f82601f830112612f63575f5ffd5b8151612f76612f7182612f32565b612f02565b8082825260208201915060208360051b860101925085831115612f97575f5ffd5b602085015b83811015612fbd578051612faf81612ae9565b835260209283019201612f9c565b5095945050505050565b5f5f60408385031215612fd8575f5ffd5b82516001600160401b03811115612fed575f5ffd5b612ff985828601612f54565b602085015190935090506001600160401b03811115613016575f5ffd5b8301601f81018513613026575f5ffd5b8051613034612f7182612f32565b8082825260208201915060208360051b850101925087831115613055575f5ffd5b6020840193505b8284101561307757835182526020938401939091019061305c565b809450505050509250929050565b6001815b60018411156130c0578085048111156130a4576130a4612e22565b60018416156130b257908102905b60019390931c928002613089565b935093915050565b5f826130d657506001612e49565b816130e257505f612e49565b81600181146130f857600281146131025761311e565b6001915050612e49565b60ff84111561311357613113612e22565b50506001821b612e49565b5060208310610133831016604e8410600b8410161715613141575081810a612e49565b61314d5f198484613085565b805f190482111561316057613160612e22565b029392505050565b5f61271060ff8416836130c8565b5f60208284031215613186575f5ffd5b815161271081612d3a565b5f602082840312156131a1575f5ffd5b5051919050565b8381526020810183905260608101600483106131c6576131c6612abb565b826040830152949350505050565b5f5f604083850312156131e5575f5ffd5b82516001600160401b038111156131fa575f5ffd5b61320685828601612f54565b602085015190935090506001600160401b03811115613223575f5ffd5b8301601f81018513613233575f5ffd5b8051613241612f7182612f32565b8082825260208201915060208360051b850101925087831115613262575f5ffd5b6020840193505b8284101561307757835161327c81612d63565b825260209384019390910190613269565b604080825283519082018190525f9060208501906060840190835b818110156132e157835180516001600160a01b0316845260209081015163ffffffff1681850152909301926040909201916001016132a8565b5050602093909301939093525092915050565b634e487b7160e01b5f52601260045260245ffd5b6020810160028310612ae357612ae3612abb565b5f6020828403121561332c575f5ffd5b81516001600160401b03811115613341575f5ffd5b61334d84828501612f54565b949350505050565b60ff8281168282160390811115612e4957612e49612e22565b8082028115828204841417612e4957612e49612e22565b5f8261339f57634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220867a11c0198cc70c325b79a42b7a9c41a224487e71dec7bd6218fde325409a6e64736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061019f575f3560e01c8063055ad42e146101a35780630844697d146101cd57806308af604d146101f5578063132b1c921461021a57806314b19c5a1461025057806314b5d07f1461025e57806325a760c2146102735780632b0088b4146102875780632e2dc43e146102905780633a0dad8e146102aa5780634585e33b146102ca5780634ff0876a146102dd5780635488cd621461030257806358fac65b146103165780635dc228a0146103295780636e04ff0d1461033c5780636ff041531461035d5780637060444514610372578063715018a6146103855780637158da7c1461038d57806379502c55146103a05780637b103999146103b35780637cdabf0a146103c6578063800f9fad146103d95780638da5cb5b146103e25780638f5c9465146103ea578063b8b2af7c146103f3578063ba96ff1114610408578063c18e2a5c1461041b578063ca1f32f114610424578063e2638ff11461042d578063e2c4aaec14610455578063e6c3efd914610468578063eeb393c91461047b578063f2fde38b1461048e575b5f5ffd5b6016546101b7906301000000900460ff1681565b6040516101c49190612acf565b60405180910390f35b6008546101e290600160b81b900461ffff1681565b60405161ffff90911681526020016101c4565b6016546102089062010000900460ff1681565b60405160ff90911681526020016101c4565b610242610228366004612afd565b6001600160a01b03165f908152600f602052604090205490565b6040519081526020016101c4565b6016546101e29061ffff1681565b61027161026c366004612afd565b6104a1565b005b60085461020890600160a01b900460ff1681565b61024260075481565b6102986105aa565b6040516101c496959493929190612b8b565b6004546102bd906001600160a01b031681565b6040516101c49190612c0c565b6102716102d8366004612c20565b610826565b6014546102ed9063ffffffff1681565b60405163ffffffff90911681526020016101c4565b60165461020890600160201b900460ff1681565b6102bd610324366004612c8c565b610969565b6002546102bd906001600160a01b031681565b61034f61034a366004612c20565b610991565b6040516101c4929190612ca3565b610365610c0f565b6040516101c49190612ce1565b610271610380366004612c8c565b610ca9565b610271610d10565b6008546102bd906001600160a01b031681565b6003546102bd906001600160a01b031681565b6005546102bd906001600160a01b031681565b6102716103d4366004612d09565b610d23565b61024260095481565b6102bd610e2a565b6101e261271081565b6008546101e290600160a81b900461ffff1681565b610242610416366004612afd565b610e38565b61024260185481565b61024260065481565b61024261043b366004612afd565b6001600160a01b03165f908152600e602052604090205490565b610271610463366004612c8c565b610e91565b610271610476366004612d48565b610f04565b610271610489366004612d74565b610fde565b61027161049c366004612afd565b6110c5565b6104a9611108565b6001600160a01b0381166104d05760405163d92e233d60e01b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610520573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105449190612d8f565b610561576040516312aecd8160e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f6cc7ebdb6c8c53291c5ae16148cab9b049d23bf5bde5632900b40edff56fcb43905f90a250565b606080808080805f6016546301000000900460ff1660048111156105d0576105d0612abb565b146105ee576040516312aecd8160e01b815260040160405180910390fd5b5f600a60080180548060200260200160405190810160405280929190818152602001828054801561064657602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610628575b505050505090505f5f6106588361113a565b915091508161ffff166001600160401b0381111561067857610678612dae565b6040519080825280602002602001820160405280156106a1578160200160208202803683370190505b5098508161ffff166001600160401b038111156106c0576106c0612dae565b6040519080825280602002602001820160405280156106e9578160200160208202803683370190505b5097508061ffff166001600160401b0381111561070857610708612dae565b604051908082528060200260200182016040528015610731578160200160208202803683370190505b5096508061ffff166001600160401b0381111561075057610750612dae565b604051908082528060200260200182016040528015610779578160200160208202803683370190505b5095508161ffff166001600160401b0381111561079857610798612dae565b6040519080825280602002602001820160405280156107c1578160200160208202803683370190505b5094508061ffff166001600160401b038111156107e0576107e0612dae565b604051908082528060200260200182016040528015610809578160200160208202803683370190505b50935061081b838a8a888b8b8a6111db565b505050909192939495565b61082e610e2a565b6001600160a01b0316336001600160a01b03161415801561085a57506002546001600160a01b03163314155b156108785760405163ea8e4eb560e01b815260040160405180910390fd5b6108806113be565b60058110156108a2576040516317dbc4cb60e21b815260040160405180910390fd5b5f806108b083850185612dc2565b90925090506341659aab60e01b6001600160e01b03198316016108da576108d56113e8565b61095a565b636ce38ed360e11b6001600160e01b03198316016108fb576108d581611584565b6292a80f60e51b6001600160e01b031983160161091a576108d5611d35565b6265e66b60e01b6001600160e01b031983160161093a576108d581611f42565b63c4b3cef760e01b6001600160e01b031983160161095a5761095a61244b565b505061096560018055565b5050565b60178181548110610978575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f606060035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109e4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a089190612d8f565b8015610a15575060155442115b15610a6757600191507fbe9a655586dceb82dfa0af992b5d8ae7fa45053cb7fd6f141f541da7572978c75f604051602001610a51929190612e05565b6040516020818303038152906040529050610c08565b60016016546301000000900460ff166004811115610a8757610a87612abb565b03610ad257600191507f2638e25a856cbfe28e0ae1857cb597cc2ceb873ce579b7d93c2258e45a754481601660049054906101000a900460ff16604051602001610a51929190612e05565b60026016546301000000900460ff166004811115610af257610af2612abb565b03610b2e57600191507fedaafe206508e00f40674bb87dda745bccfe8a3f3f6d6eaaf6db5f44021a1c135f604051602001610a51929190612e05565b60036016546301000000900460ff166004811115610b4e57610b4e612abb565b03610b9957600191507fff9a199536c068c55c334e40ebfa355733f79152332d6586d615c5bb37fd5c17601660049054906101000a900460ff16604051602001610a51929190612e05565b60046016546301000000900460ff166004811115610bb957610bb9612abb565b03610bf557600191507f3b4c310984a9fe486c05a56b52659c09d4bf9f3ef9b799ad52ee29a7d805741e5f604051602001610a51929190612e05565b505060408051602081019091525f808252905b9250929050565b60605f6016546301000000900460ff166004811115610c3057610c30612abb565b14610c4e576040516312aecd8160e01b815260040160405180910390fd5b6012805460408051602080840282018101909252828152929190830182828015610c9f57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610c81575b5050505050905090565b6004546001600160a01b03163314610cd45760405163ea8e4eb560e01b815260040160405180910390fd5b600954811115610cf757604051632ca2f52b60e11b815260040160405180910390fd5b8060095f828254610d089190612e36565b909155505050565b610d18611108565b610d215f612617565b565b610d2b611108565b60328261ffff161180610d4357506107d08161ffff16115b15610d61576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610db1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dd59190612d8f565b610df2576040516312aecd8160e01b815260040160405180910390fd5b6008805463ffffffff60a81b1916600160a81b61ffff9485160261ffff60b81b191617600160b81b9290931691909102919091179055565b5f546001600160a01b031690565b5f806016546301000000900460ff166004811115610e5857610e58612abb565b14610e76576040516312aecd8160e01b815260040160405180910390fd5b506001600160a01b03165f908152600a602052604090205490565b6004546001600160a01b03163314610ebc5760405163ea8e4eb560e01b815260040160405180910390fd5b5f811315610ee0578060185f828254610ed59190612e4f565b90915550610f019050565b5f811215610f0157610ef181612e62565b60185f828254610d089190612e36565b50565b610f0c611108565b8060ff165f03610f2f576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f7f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fa39190612d8f565b610fc0576040516312aecd8160e01b815260040160405180910390fd5b6016805460ff909216620100000262ff000019909216919091179055565b610fe6611108565b8063ffffffff165f0361100c576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561105c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110809190612d8f565b61109d576040516312aecd8160e01b815260040160405180910390fd5b6014805463ffffffff191663ffffffff83169081179091556110bf9042612e4f565b60155550565b6110cd611108565b6001600160a01b0381166110ff575f604051631e4fbdf760e01b81526004016110f69190612c0c565b60405180910390fd5b610f0181612617565b33611111610e2a565b6001600160a01b031614610d21573360405163118cdaa760e01b81526004016110f69190612c0c565b80515f908190815b8161ffff168161ffff1610156111d4575f858261ffff168151811061116957611169612e7c565b6020908102919091018101516001600160a01b0381165f9081526010909252604090912054909150156111a25761119f85612e90565b94505b6001600160a01b0381165f90815260116020526040902054156111cb576111c884612e90565b93505b50600101611142565b5050915091565b86515f80805b8361ffff168161ffff1610156113b1575f8b8261ffff168151811061120857611208612e7c565b6020908102919091018101516001600160a01b0381165f90815260108352604080822054601190945290205490925081156112ed57828d8761ffff168151811061125457611254612e7c565b60200260200101906001600160a01b031690816001600160a01b031681525050818c8761ffff168151811061128b5761128b612e7c565b6020908102919091018101919091526001600160a01b0384165f908152600a90915260409020546006546112c0918491612666565b8b8761ffff16815181106112d6576112d6612e7c565b60209081029190910101526112ea86612e90565b95505b80156113a357828a8661ffff168151811061130a5761130a612e7c565b60200260200101906001600160a01b031690816001600160a01b03168152505080898661ffff168151811061134157611341612e7c565b6020908102919091018101919091526001600160a01b0384165f908152600a9091526040902054600654611376918391612666565b888661ffff168151811061138c5761138c612e7c565b60209081029190910101526113a085612e90565b94505b5050508060010190506111e1565b5050505050505050505050565b6002600154036113e157604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b6015544211158061146a575060035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611444573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114689190612d8f565b155b156114885760405163085de62560e01b815260040160405180910390fd5b5f5b60125461ffff8216101561153d575f600a6008018261ffff16815481106114b3576114b3612e7c565b5f9182526020808320909101546001600160a01b03168252600a81526040808320839055600b8252808320839055600c8252808320839055600e8252808320839055600f8252808320839055600d8252808320839055601082528083208390556011825280832083905560139091529020805460ff191690555061153681612e90565b905061148a565b5061154960125f612a8d565b611551612717565b60175415610d215760145461156c9063ffffffff1642612e4f565b6015556016805463ff00000019166301000000179055565b60016016546301000000900460ff1660048111156115a4576115a4612abb565b146115c25760405163baf3f0f760e01b815260040160405180910390fd5b601680546004906115dc90600160201b900460ff16612eb0565b91906101000a81548160ff021916908360ff1602179055505f601660029054906101000a900460ff16826116109190612ec5565b60165460ff91821692505f9161162d916201000090041683612ee8565b60175490915061ffff82161180611649575060175461ffff8216145b1561166757506017546016805464ffff000000191663020000001790555b815b8161ffff168161ffff161015611d2f575f60178261ffff168154811061169157611691612e7c565b905f5260205f20015f9054906101000a90046001600160a01b031690505f5f826001600160a01b031663d3d034586040518163ffffffff1660e01b81526004015f60405180830381865afa1580156116eb573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117129190810190612fc7565b90925090505f805b83518161ffff1610156119fe575f848261ffff168151811061173e5761173e612e7c565b602002602001015190505f848361ffff168151811061175f5761175f612e7c565b6020026020010151905080600a6001015f846001600160a01b03166001600160a01b031681526020019081526020015f205f82825461179e9190612e4f565b90915550506001600160a01b0382165f9081526013602052604090205460ff16611922576008546001600160a01b039081169083160361189a5760085461187d906117f490600160a01b900460ff16600a613168565b600860149054906101000a900460ff1660035f9054906101000a90046001600160a01b03166001600160a01b031663567ba7136040518163ffffffff1660e01b8152600401602060405180830381865afa158015611854573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118789190613176565b612971565b6001600160a01b0383165f908152600a6020526040902055611922565b6005546040516341976e0960e01b81526001600160a01b03909116906341976e09906118ca908590600401612c0c565b602060405180830381865afa1580156118e5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119099190613191565b6001600160a01b0383165f908152600a60205260409020555b6001600160a01b0382165f908152600a60205260408120546006549091906119d2906119519084908690612666565b600354604051633c2e3e7b60e11b81526001600160a01b039091169063785c7cf690611981908990600401612c0c565b602060405180830381865afa15801561199c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119c09190613176565b600854600160a01b900460ff16612971565b90506119de8187612e4f565b95506119e9846129db565b50505050806119f790612e90565b905061171a565b506008545f90611a1c90600160a81b900461ffff1683612710612666565b601454909150611a3d90829063ffffffff908116906301e133809061266616565b90508060095f828254611a509190612e4f565b90915550611a6090508183612e36565b60405163728d42fb60e11b8152600481018290529092505f906001600160a01b0387169063e51a85f690602401602060405180830381865afa158015611aa8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611acc9190613191565b9050611ad88184612e36565b6008549093505f90611af890600160b81b900461ffff1683612710612666565b90508060095f828254611b0b9190612e4f565b90915550611b1b90508183612e36565b601654604051630df571f760e01b815261ffff9091166004820152602481018290529092506001600160a01b03881690630df571f7906044015f604051808303815f87803b158015611b6b575f5ffd5b505af1158015611b7d573d5f5f3e3d5ffd5b505050505f876001600160a01b031663a68a5267896001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bcd573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bf19190613191565b875f6040518463ffffffff1660e01b8152600401611c11939291906131a8565b602060405180830381865afa158015611c2c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c509190613191565b6001600160a01b0389165f908152600e602052604090208690559050611c768186612e36565b94505f886001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cb5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cd99190613191565b6001600160a01b038a165f908152600f602052604090208790559050611cff8187612e4f565b6001600160a01b039099165f908152600c6020526040902098909855505060019096019550611669945050505050565b50505050565b60026016546301000000900460ff166004811115611d5557611d55612abb565b14611d735760405163baf3f0f760e01b815260040160405180910390fd5b6016805463ff000000191663030000001790556017545f805b8261ffff168161ffff161015611df0575f60178261ffff1681548110611db457611db4612e7c565b5f9182526020808320909101546001600160a01b0316808352600c909152604090912054909150611de59084612e4f565b925050600101611d8c565b50600480546040805163dab26e3b60e01b815290515f93611e67936001600160a01b03169263dab26e3b92818301926020928290030181865afa158015611e39573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e5d9190613191565b8390612710612666565b9050806018541115611e7857505050565b5f60185482611e879190612e36565b90505f5b8461ffff168161ffff161015611f25575f60178261ffff1681548110611eb357611eb3612e7c565b5f9182526020808320909101546001600160a01b0316808352600c909152604082205490925090611ee5858389612666565b6001600160a01b0384165f908152600c6020526040812080549293508392909190611f11908490612e36565b909155505060019093019250611e8b915050565b508060185f828254611f379190612e4f565b909155505050505050565b60036016546301000000900460ff166004811115611f6257611f62612abb565b14611f805760405163baf3f0f760e01b815260040160405180910390fd5b60168054600490611f9a90600160201b900460ff16612eb0565b91906101000a81548160ff021916908360ff1602179055505f601660029054906101000a900460ff1682611fce9190612ec5565b60165460ff91821692505f91611feb916201000090041683612ee8565b60175490915061ffff82161180612007575060175461ffff8216145b1561202557506017546016805464ffff000000191663040000001790555b815b8161ffff168161ffff161015611d2f575f60178261ffff168154811061204f5761204f612e7c565b905f5260205f20015f9054906101000a90046001600160a01b031690505f5f826001600160a01b031663b6eba6536040518163ffffffff1660e01b81526004015f60405180830381865afa1580156120a9573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120d091908101906131d4565b6001600160a01b0385165f908152600c6020526040812054835193955091935090916001600160401b0381111561210957612109612dae565b60405190808252806020026020018201604052801561214d57816020015b604080518082019091525f80825260208201528152602001906001900390816121275790505b5090505f5b84518161ffff1610156123df575f858261ffff168151811061217657612176612e7c565b602002602001015190505f858361ffff168151811061219757612197612e7c565b6020908102919091018101516001600160a01b0384165f908152601390925260409091205490915060ff1661229d576008546001600160a01b0390811690831603612215576008546121f8906117f490600160a01b900460ff16600a613168565b6001600160a01b0383165f908152600a602052604090205561229d565b6005546040516341976e0960e01b81526001600160a01b03909116906341976e0990612245908590600401612c0c565b602060405180830381865afa158015612260573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122849190613191565b6001600160a01b0383165f908152600a60205260409020555b6001600160a01b0382165f908152600a602052604081205460065460075491929161233f916122e59185906122de908c9063ffffffff808b16919061266616565b9190612666565b600854600354604051633c2e3e7b60e11b8152600160a01b90920460ff16916001600160a01b039091169063785c7cf690612324908a90600401612c0c565b602060405180830381865afa158015611854573d5f5f3e3d5ffd5b90506040518060400160405280856001600160a01b031681526020018263ffffffff16815250868661ffff168151811061237b5761237b612e7c565b602002602001018190525080600a6003015f866001600160a01b03166001600160a01b031681526020019081526020015f205f8282546123bb9190612e4f565b909155506123ca9050846129db565b50505050806123d890612e90565b9050612152565b50604051630415112560e21b81526001600160a01b0386169063105444949061240e908490869060040161328d565b5f604051808303815f87803b158015612425575f5ffd5b505af1158015612437573d5f5f3e3d5ffd5b505050505050505050806001019050612027565b60046016546301000000900460ff16600481111561246b5761246b612abb565b146124895760405163baf3f0f760e01b815260040160405180910390fd5b5f600a6008018054806020026020016040519081016040528092919081815260200182805480156124e157602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116124c3575b505083519394505f925050505b8161ffff168161ffff1610156125ac575f838261ffff168151811061251557612515612e7c565b6020908102919091018101516001600160a01b0381165f908152600b8352604080822054600d90945290205490925080821115612573576125568183612e36565b6001600160a01b0384165f9081526010602052604090205561259e565b8181111561259e576125858282612e36565b6001600160a01b0384165f908152601160205260409020555b5050508060010190506124ee565b506016805463ff00000019811682555f906125ca9061ffff16612e90565b82546101009290920a61ffff8181021990931691831602179091556016546040519116907f0bc12479581640d161e016cef21aa834cb6d6326bbc0d8445e58d56403adf2dc905f90a25050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f5f5f6126738686612a60565b91509150815f036126975783818161268d5761268d6132f4565b0492505050612710565b8184116126ae576126ae6003851502601118612a7c565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150505b9392505050565b600354604051631da09e4360e31b81525f916001600160a01b03169063ed04f21890612747908490600401613308565b5f60405180830381865afa158015612761573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612788919081019061331c565b905061279560175f612a8d565b5f5b81518161ffff161015610965575f828261ffff16815181106127bb576127bb612e7c565b60200260200101519050806001600160a01b03166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa158015612801573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128259190613191565b816001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa158015612861573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128859190613191565b61288f9190612e4f565b5f0361289b5750612961565b5f816001600160a01b031663b6eba6536040518163ffffffff1660e01b81526004015f60405180830381865afa1580156128d7573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526128fe91908101906131d4565b50905080515f03612910575050612961565b50601780546001810182555f919091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c150180546001600160a01b0319166001600160a01b03929092169190911790555b61296a81612e90565b9050612797565b5f8260ff168260ff1611156129a65761298a8383613355565b61299590600a613168565b61299f908561336e565b9050612710565b8260ff168260ff1610156129d3576129be8284613355565b6129c990600a613168565b61299f9085613385565b509192915050565b6001600160a01b0381165f9081526013602052604090205460ff16610f01576012805460018181019092557fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0384166001600160a01b031990911681179091555f908152601360205260409020805460ff1916909117905550565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5080545f8255905f5260205f2090810190610f0191905b80821115612ab7575f8155600101612aa4565b5090565b634e487b7160e01b5f52602160045260245ffd5b6020810160058310612ae357612ae3612abb565b91905290565b6001600160a01b0381168114610f01575f5ffd5b5f60208284031215612b0d575f5ffd5b813561271081612ae9565b5f8151808452602084019350602083015f5b82811015612b515781516001600160a01b0316865260209586019590910190600101612b2a565b5093949350505050565b5f8151808452602084019350602083015f5b82811015612b51578151865260209586019590910190600101612b6d565b60c081525f612b9d60c0830189612b18565b8281036020840152612baf8189612b5b565b90508281036040840152612bc38188612b18565b90508281036060840152612bd78187612b5b565b90508281036080840152612beb8186612b5b565b905082810360a0840152612bff8185612b5b565b9998505050505050505050565b6001600160a01b0391909116815260200190565b5f5f60208385031215612c31575f5ffd5b82356001600160401b03811115612c46575f5ffd5b8301601f81018513612c56575f5ffd5b80356001600160401b03811115612c6b575f5ffd5b856020828401011115612c7c575f5ffd5b6020919091019590945092505050565b5f60208284031215612c9c575f5ffd5b5035919050565b8215158152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b602081525f6127106020830184612b18565b803561ffff81168114612d04575f5ffd5b919050565b5f5f60408385031215612d1a575f5ffd5b612d2383612cf3565b9150612d3160208401612cf3565b90509250929050565b60ff81168114610f01575f5ffd5b5f60208284031215612d58575f5ffd5b813561271081612d3a565b63ffffffff81168114610f01575f5ffd5b5f60208284031215612d84575f5ffd5b813561271081612d63565b5f60208284031215612d9f575f5ffd5b81518015158114612710575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215612dd3575f5ffd5b82356001600160e01b031981168114612dea575f5ffd5b91506020830135612dfa81612d3a565b809150509250929050565b6001600160e01b031992909216825260ff16602082015260400190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115612e4957612e49612e22565b92915050565b80820180821115612e4957612e49612e22565b5f600160ff1b8201612e7657612e76612e22565b505f0390565b634e487b7160e01b5f52603260045260245ffd5b5f61ffff821661ffff8103612ea757612ea7612e22565b60010192915050565b5f60ff821660ff8103612ea757612ea7612e22565b60ff8181168382160290811690818114612ee157612ee1612e22565b5092915050565b61ffff8181168382160190811115612e4957612e49612e22565b604051601f8201601f191681016001600160401b0381118282101715612f2a57612f2a612dae565b604052919050565b5f6001600160401b03821115612f4a57612f4a612dae565b5060051b60200190565b5f82601f830112612f63575f5ffd5b8151612f76612f7182612f32565b612f02565b8082825260208201915060208360051b860101925085831115612f97575f5ffd5b602085015b83811015612fbd578051612faf81612ae9565b835260209283019201612f9c565b5095945050505050565b5f5f60408385031215612fd8575f5ffd5b82516001600160401b03811115612fed575f5ffd5b612ff985828601612f54565b602085015190935090506001600160401b03811115613016575f5ffd5b8301601f81018513613026575f5ffd5b8051613034612f7182612f32565b8082825260208201915060208360051b850101925087831115613055575f5ffd5b6020840193505b8284101561307757835182526020938401939091019061305c565b809450505050509250929050565b6001815b60018411156130c0578085048111156130a4576130a4612e22565b60018416156130b257908102905b60019390931c928002613089565b935093915050565b5f826130d657506001612e49565b816130e257505f612e49565b81600181146130f857600281146131025761311e565b6001915050612e49565b60ff84111561311357613113612e22565b50506001821b612e49565b5060208310610133831016604e8410600b8410161715613141575081810a612e49565b61314d5f198484613085565b805f190482111561316057613160612e22565b029392505050565b5f61271060ff8416836130c8565b5f60208284031215613186575f5ffd5b815161271081612d3a565b5f602082840312156131a1575f5ffd5b5051919050565b8381526020810183905260608101600483106131c6576131c6612abb565b826040830152949350505050565b5f5f604083850312156131e5575f5ffd5b82516001600160401b038111156131fa575f5ffd5b61320685828601612f54565b602085015190935090506001600160401b03811115613223575f5ffd5b8301601f81018513613233575f5ffd5b8051613241612f7182612f32565b8082825260208201915060208360051b850101925087831115613262575f5ffd5b6020840193505b8284101561307757835161327c81612d63565b825260209384019390910190613269565b604080825283519082018190525f9060208501906060840190835b818110156132e157835180516001600160a01b0316845260209081015163ffffffff1681850152909301926040909201916001016132a8565b5050602093909301939093525092915050565b634e487b7160e01b5f52601260045260245ffd5b6020810160028310612ae357612ae3612abb565b5f6020828403121561332c575f5ffd5b81516001600160401b03811115613341575f5ffd5b61334d84828501612f54565b949350505050565b60ff8281168282160390811115612e4957612e49612e22565b8082028115828204841417612e4957612e49612e22565b5f8261339f57634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220867a11c0198cc70c325b79a42b7a9c41a224487e71dec7bd6218fde325409a6e64736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/orchestrators/LiquidityOrchestrator.sol/LiquidityOrchestrator.json b/artifacts/contracts/orchestrators/LiquidityOrchestrator.sol/LiquidityOrchestrator.json index ab6d43ca..6ae2738a 100644 --- a/artifacts/contracts/orchestrators/LiquidityOrchestrator.sol/LiquidityOrchestrator.json +++ b/artifacts/contracts/orchestrators/LiquidityOrchestrator.sol/LiquidityOrchestrator.json @@ -669,8 +669,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f5ffd5b50604051612d1f380380612d1f83398101604081905261002e916101e3565b826001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161017d565b50600180556001600160a01b0382166100915760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381166100b85760405163d92e233d60e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b03841690811790915560408051631c56369f60e21b81529051637158da7c916004808201926020929091908290030181865afa15801561010f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610133919061022d565b600580546001600160a01b03199081166001600160a01b0393841617909155600280549091169290911691909117905550506007805464ffffffffff19166201000017905561024f565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101e0575f5ffd5b50565b5f5f5f606084860312156101f5575f5ffd5b8351610200816101cc565b6020850151909350610211816101cc565b6040850151909250610222816101cc565b809150509250925092565b5f6020828403121561023d575f5ffd5b8151610248816101cc565b9392505050565b612ac38061025c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610194575f3560e01c806301c621c114610198578063055ad42e146101ad57806309f2e19c146101d75780630a861f2a146101f75780630a8b78c71461020a57806314b5d07f1461021d5780633369921a14610230578063348ec5c8146102475780633af2a8c01461025a5780633e765a9e1461026d5780634585e33b146102805780634adfc2e71461029357806351edffb1146102a657806352e899fd146102b95780635488cd62146102cc57806357be01c1146102f257806359017aa9146103055780635dc228a0146103185780636e04ff0d1461032b578063715018a61461034c5780637158da7c14610354578063741fca4b1461036757806376d58e1a1461037a57806379502c551461038d5780638157c1ab146103a0578063841181ef146103b35780638a0b0d38146103c65780638da5cb5b146103d9578063bc504975146103e1578063be1b26a4146103f4578063d3f3506d14610407578063dab26e3b1461042f578063ee6713df14610438578063f2fde38b14610459575b5f5ffd5b6101ab6101a6366004612416565b61046c565b005b6007546101c1906301000000900460ff1681565b6040516101ce9190612441565b60405180910390f35b6101ea6101e5366004612416565b610599565b6040516101ce919061245b565b6101ab610205366004612416565b6105c1565b6101ab610218366004612483565b61081d565b6101ab61022b366004612483565b610898565b610239600f5481565b6040519081526020016101ce565b6004546101ea906001600160a01b031681565b6101ab610268366004612416565b6109a1565b61023961027b366004612416565b610a82565b6101ab61028e3660046124a5565b610aa1565b6101ab6102a1366004612511565b610bea565b6101ab6102b4366004612511565b610cd5565b6102396102c7366004612416565b610d61565b6007546102e090600160201b900460ff1681565b60405160ff90911681526020016101ce565b6007546102e09062010000900460ff1681565b6101ab61031336600461253b565b610d70565b6002546101ea906001600160a01b031681565b61033e6103393660046124a5565b610e19565b6040516101ce929190612572565b6101ab6110ae565b6005546101ea906001600160a01b031681565b6101ab610375366004612416565b6110c1565b6101ab610388366004612416565b611278565b6003546101ea906001600160a01b031681565b6101ea6103ae366004612416565b611431565b6101ab6103c1366004612483565b611440565b6101ab6103d43660046125c5565b6114d1565b6101ea6115ab565b6102396103ef366004612416565b6115b9565b610239610402366004612416565b6115c8565b6101ea610415366004612483565b60066020525f90815260409020546001600160a01b031681565b61023960085481565b6007546104469061ffff1681565b60405161ffff90911681526020016101ce565b6101ab610467366004612483565b6115d7565b610474611614565b805f036104aa57600554604051636b30633560e01b81526104a1916001600160a01b03169060040161245b565b60405180910390fd5b60048054604051637060444560e01b81529182018390526001600160a01b0316906370604445906024015f604051808303815f87803b1580156104eb575f5ffd5b505af11580156104fd573d5f5f3e3d5ffd5b505060055460405163a9059cbb60e01b81525f93506001600160a01b03909116915063a9059cbb9061053590339086906004016125de565b6020604051808303815f875af1158015610551573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061057591906125f7565b905080610595576040516312171d8360e31b815260040160405180910390fd5b5050565b600c81815481106105a8575f80fd5b5f918252602090912001546001600160a01b0316905081565b6105c9611614565b805f036105f657600554604051636b30633560e01b81526104a1916001600160a01b03169060040161245b565b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610646573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061066a91906125f7565b610687576040516312aecd8160e01b815260040160405180910390fd5b5f60045f9054906101000a90046001600160a01b03166001600160a01b031663c18e2a5c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fc9190612616565b90508082111561071f57604051632ca2f52b60e11b815260040160405180910390fd5b6004546001600160a01b031663e2c4aaec61073984612641565b6040518263ffffffff1660e01b815260040161075791815260200190565b5f604051808303815f87803b15801561076e575f5ffd5b505af1158015610780573d5f5f3e3d5ffd5b505060055460405163a9059cbb60e01b81525f93506001600160a01b03909116915063a9059cbb906107b890339087906004016125de565b6020604051808303815f875af11580156107d4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f891906125f7565b905080610818576040516312171d8360e31b815260040160405180910390fd5b505050565b610825611614565b6001600160a01b03811661084c5760405163d92e233d60e01b815260040160405180910390fd5b6004546001600160a01b03161561087657604051630ea075bf60e21b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6108a0611614565b6001600160a01b0381166108c75760405163d92e233d60e01b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610917573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061093b91906125f7565b610958576040516312aecd8160e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f6cc7ebdb6c8c53291c5ae16148cab9b049d23bf5bde5632900b40edff56fcb43905f90a250565b6109a9611614565b805f036109c9576040516317dbc4cb60e21b815260040160405180910390fd5b6101f48111156109ec576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a6091906125f7565b610a7d576040516312aecd8160e01b815260040160405180910390fd5b600855565b600e8181548110610a91575f80fd5b5f91825260209091200154905081565b610aa96115ab565b6001600160a01b0316336001600160a01b031614158015610ad557506002546001600160a01b03163314155b15610af35760405163ea8e4eb560e01b815260040160405180910390fd5b610afb611646565b6005811015610b1d576040516317dbc4cb60e21b815260040160405180910390fd5b5f80610b2b8385018561265b565b90925090506341659aab60e01b6001600160e01b0319831601610b5557610b50611670565b610bb7565b63100597e960e31b6001600160e01b0319831601610b7657610b50816118a8565b63302c6bef60e21b6001600160e01b0319831601610b9757610b5081611a35565b6301c7bbc160e21b6001600160e01b0319831601610bb757610bb7611c2d565b6040517ff0094b59b7bc92e9fc611b14b5d3a34fe02530ac9bcf36c2c6f10147c3030c12905f90a1505061059560018055565b600354604051633821dad160e21b81526001600160a01b039091169063e0876b4490610c1a90339060040161245b565b602060405180830381865afa158015610c35573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c5991906125f7565b610c765760405163ea8e4eb560e01b815260040160405180910390fd5b805f03610ca357600554604051636b30633560e01b81526104a1916001600160a01b03169060040161245b565b60055460405163a9059cbb60e01b81525f916001600160a01b03169063a9059cbb906107b890869086906004016125de565b600354604051633821dad160e21b81526001600160a01b039091169063e0876b4490610d0590339060040161245b565b602060405180830381865afa158015610d20573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d4491906125f7565b610ca35760405163ea8e4eb560e01b815260040160405180910390fd5b600b8181548110610a91575f80fd5b6003546001600160a01b03163314610d9b5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0382161580610db857506001600160a01b038116155b15610dd65760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038281165f8181526006602052604080822080546001600160a01b0319169486169485179055515f516020612a6e5f395f51905f529190a35050565b5f606060035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e6c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9091906125f7565b8015610f1057506007546004805460408051630a58ce2d60e11b8152905161ffff909416936001600160a01b03909216926314b19c5a9282820192602092908290030181865afa158015610ee6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f0a919061269a565b61ffff16115b15610f6257600191507fbe9a655586dceb82dfa0af992b5d8ae7fa45053cb7fd6f141f541da7572978c75f604051602001610f4c9291906126bb565b60405160208183030381529060405290506110a7565b60016007546301000000900460ff166003811115610f8257610f8261242d565b03610fcd57600191507f7fd340b8241a93f6a116f506d6171d4f585588564d777e1192babae55184f691600760049054906101000a900460ff16604051602001610f4c9291906126bb565b60026007546301000000900460ff166003811115610fed57610fed61242d565b0361103857600191507f3f4e50448465d8594e91c1038b22f277808696956455dacacb66f00f4df0b3a2600760049054906101000a900460ff16604051602001610f4c9291906126bb565b60036007546301000000900460ff1660038111156110585761105861242d565b0361109457600191507ff8e110fcda2d74b2e1ced72f8e94b4510c922b70f786fd1064147a762fd812605f604051602001610f4c9291906126bb565b505060408051602081019091525f808252905b9250929050565b6110b6611614565b6110bf5f611e23565b565b600354604051633821dad160e21b815233916001600160a01b03169063e0876b44906110f190849060040161245b565b602060405180830381865afa15801561110c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113091906125f7565b61114d5760405163ea8e4eb560e01b815260040160405180910390fd5b815f0361117a57600554604051636b30633560e01b81526104a1916001600160a01b03169060040161245b565b5f816001600160a01b0316631f52692b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111b7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111db91906126d8565b60055460405163a9059cbb60e01b81529192505f916001600160a01b039091169063a9059cbb9061121290859088906004016125de565b6020604051808303815f875af115801561122e573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061125291906125f7565b905080611272576040516312171d8360e31b815260040160405180910390fd5b50505050565b611280611614565b805f036112ad57600554604051636b30633560e01b81526104a1916001600160a01b03169060040161245b565b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112fd573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132191906125f7565b61133e576040516312aecd8160e01b815260040160405180910390fd5b6005546040516323b872dd60e01b8152336004820152306024820152604481018390525f916001600160a01b0316906323b872dd906064016020604051808303815f875af1158015611392573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113b691906125f7565b9050806113d6576040516312171d8360e31b815260040160405180910390fd5b600480546040516338b12abb60e21b81529182018490526001600160a01b03169063e2c4aaec906024015f604051808303815f87803b158015611417575f5ffd5b505af1158015611429573d5f5f3e3d5ffd5b505050505050565b600981815481106105a8575f80fd5b6003546001600160a01b0316331461146b5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0381166114925760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381165f8181526006602052604080822080546001600160a01b0319169055519091905f516020612a6e5f395f51905f52908390a350565b6114d9611614565b8060ff165f036114fc576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561154c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061157091906125f7565b61158d576040516312aecd8160e01b815260040160405180910390fd5b6007805460ff909216620100000262ff000019909216919091179055565b5f546001600160a01b031690565b600d8181548110610a91575f80fd5b600a8181548110610a91575f80fd5b6115df611614565b6001600160a01b038116611608575f604051631e4fbdf760e01b81526004016104a1919061245b565b61161181611e23565b50565b3361161d6115ab565b6001600160a01b0316146110bf573360405163118cdaa760e01b81526004016104a1919061245b565b60026001540361166957604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b5f60045f9054906101000a90046001600160a01b03166001600160a01b03166314b19c5a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116c1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116e5919061269a565b6007549091506116fa9061ffff1660016126f3565b61ffff168161ffff16101561170c5750565b6007805461ffff191661ffff831617905561172860095f61234b565b611733600a5f61234b565b61173e600c5f61234b565b611749600d5f61234b565b611754600b5f61234b565b61175f600e5f61234b565b5f600f8190556004805460408051631716e21f60e11b815290516001600160a01b0390921693632e2dc43e938281019391928290030181865afa1580156117a8573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117cf9190810190612847565b60095f600a5f600c5f600d5f600b5f600e5f8c91905090805190602001906117f8929190612366565b50508a5161180b919060208d0190612366565b5050895161181e919060208c0190612366565b50508851611831919060208b01906123af565b50508751611844919060208a0190612366565b50508651611857919060208901906123af565b50506007805463ff0000001916630100000017905550506009545f039250611611915050576007805463ff00000019166302000000179055600c545f0361161157506007805463ff00000019169055565b60016007546301000000900460ff1660038111156118c8576118c861242d565b146118e65760405163baf3f0f760e01b815260040160405180910390fd5b6007805460049061190090600160201b900460ff16612957565b91906101000a81548160ff021916908360ff1602179055505f600760029054906101000a900460ff16826119349190612975565b60075460ff91821692505f916119519162010000900416836126f3565b60095490915061ffff8216118061196d575060095461ffff8216145b1561198b57506009546007805464ffff000000191663020000001790555b815b8161ffff168161ffff161015611272575f60098261ffff16815481106119b5576119b5612998565b5f918252602090912001546005546001600160a01b0391821692501681036119dd5750611a2d565b5f600a8361ffff16815481106119f5576119f5612998565b905f5260205f2001549050611a2a8282600b8661ffff1681548110611a1c57611a1c612998565b905f5260205f200154611e72565b50505b60010161198d565b60026007546301000000900460ff166003811115611a5557611a5561242d565b14611a735760405163baf3f0f760e01b815260040160405180910390fd5b60078054600490611a8d90600160201b900460ff16612957565b91906101000a81548160ff021916908360ff1602179055505f600760029054906101000a900460ff1682611ac19190612975565b60075460ff91821692505f91611ade9162010000900416836126f3565b600c5490915061ffff82161180611afa5750600c5461ffff8216145b15611b185750600c546007805464ffff000000191663030000001790555b815b8161ffff168161ffff161015611bc2575f600c8261ffff1681548110611b4257611b42612998565b5f918252602090912001546005546001600160a01b039182169250168103611b6a5750611bba565b5f600d8361ffff1681548110611b8257611b82612998565b905f5260205f2001549050611bb78282600e8661ffff1681548110611ba957611ba9612998565b905f5260205f200154612020565b50505b600101611b1a565b50600c5461ffff8216036108185760048054600f546040516338b12abb60e21b8152928301526001600160a01b03169063e2c4aaec906024015f604051808303815f87803b158015611c12575f5ffd5b505af1158015611c24573d5f5f3e3d5ffd5b50505050505050565b60036007546301000000900460ff166003811115611c4d57611c4d61242d565b14611c6b5760405163baf3f0f760e01b815260040160405180910390fd5b6007805463ff00000019169055600354604051631da09e4360e31b81525f916001600160a01b03169063ed04f21890611ca89084906004016129ac565b5f60405180830381865afa158015611cc2573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ce991908101906129c0565b90505f5b81518161ffff161015610595575f828261ffff1681518110611d1157611d11612998565b6020908102919091010151600480546040516309958e4960e11b81529293505f926001600160a01b039091169163132b1c9291611d509186910161245b565b602060405180830381865afa158015611d6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d8f9190612616565b6004805460405163e2638ff160e01b81529293505f926001600160a01b039091169163e2638ff191611dc39187910161245b565b602060405180830381865afa158015611dde573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e029190612616565b9050611e0f8383836121c2565b50505080611e1c906129f9565b9050611ced565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038084165f908152600660205260409020541680611eaa57604051635048c2af60e11b815260040160405180910390fd5b60405163095ea7b360e01b81526001600160a01b0385169063095ea7b390611ed89084905f906004016125de565b6020604051808303815f875af1158015611ef4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f1891906125f7565b5060405163095ea7b360e01b81526001600160a01b0385169063095ea7b390611f4790849087906004016125de565b6020604051808303815f875af1158015611f63573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f8791906125f7565b50604051636c197ff560e01b81525f906001600160a01b03831690636c197ff590611fb890889088906004016125de565b6020604051808303815f875af1158015611fd4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff89190612616565b90506120048382612a10565b600f5f8282546120149190612a2f565b90915550505050505050565b6001600160a01b038084165f90815260066020526040902054168061205857604051635048c2af60e11b815260040160405180910390fd5b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b39061208a9084905f906004016125de565b6020604051808303815f875af11580156120a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120ca91906125f7565b506005546001600160a01b031663095ea7b3826120e8856002612a56565b6040518363ffffffff1660e01b81526004016121059291906125de565b6020604051808303815f875af1158015612121573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061214591906125f7565b5060405163cce7ec1360e01b81525f906001600160a01b0383169063cce7ec139061217690889088906004016125de565b6020604051808303815f875af1158015612192573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121b69190612616565b90506120048184612a10565b5f8390505f816001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa158015612203573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122279190612616565b90505f826001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612266573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061228a9190612616565b905081156122e85760405163e5e9719360e01b8152600481018690526001600160a01b0384169063e5e97193906024015f604051808303815f87803b1580156122d1575f5ffd5b505af11580156122e3573d5f5f3e3d5ffd5b505050505b80156114295760405163493a6e2160e01b8152600481018590526001600160a01b0384169063493a6e21906024015f604051808303815f87803b15801561232d575f5ffd5b505af115801561233f573d5f5f3e3d5ffd5b50505050505050505050565b5080545f8255905f5260205f20908101906116119190612402565b828054828255905f5260205f2090810192821561239f579160200282015b8281111561239f578251825591602001919060010190612384565b506123ab929150612402565b5090565b828054828255905f5260205f2090810192821561239f579160200282015b8281111561239f57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906123cd565b5b808211156123ab575f8155600101612403565b5f60208284031215612426575f5ffd5b5035919050565b634e487b7160e01b5f52602160045260245ffd5b60208101600483106124555761245561242d565b91905290565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114611611575f5ffd5b5f60208284031215612493575f5ffd5b813561249e8161246f565b9392505050565b5f5f602083850312156124b6575f5ffd5b82356001600160401b038111156124cb575f5ffd5b8301601f810185136124db575f5ffd5b80356001600160401b038111156124f0575f5ffd5b856020828401011115612501575f5ffd5b6020919091019590945092505050565b5f5f60408385031215612522575f5ffd5b823561252d8161246f565b946020939093013593505050565b5f5f6040838503121561254c575f5ffd5b82356125578161246f565b915060208301356125678161246f565b809150509250929050565b8215158152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b803560ff811681146125c0575f5ffd5b919050565b5f602082840312156125d5575f5ffd5b61249e826125b0565b6001600160a01b03929092168252602082015260400190565b5f60208284031215612607575f5ffd5b8151801515811461249e575f5ffd5b5f60208284031215612626575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b82016126555761265561262d565b505f0390565b5f5f6040838503121561266c575f5ffd5b82356001600160e01b031981168114612683575f5ffd5b9150612691602084016125b0565b90509250929050565b5f602082840312156126aa575f5ffd5b815161ffff8116811461249e575f5ffd5b6001600160e01b031992909216825260ff16602082015260400190565b5f602082840312156126e8575f5ffd5b815161249e8161246f565b61ffff818116838216019081111561270d5761270d61262d565b92915050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561274f5761274f612713565b604052919050565b5f6001600160401b0382111561276f5761276f612713565b5060051b60200190565b5f82601f830112612788575f5ffd5b815161279b61279682612757565b612727565b8082825260208201915060208360051b8601019250858311156127bc575f5ffd5b602085015b838110156127e25780516127d48161246f565b8352602092830192016127c1565b5095945050505050565b5f82601f8301126127fb575f5ffd5b815161280961279682612757565b8082825260208201915060208360051b86010192508583111561282a575f5ffd5b602085015b838110156127e257805183526020928301920161282f565b5f5f5f5f5f5f60c0878903121561285c575f5ffd5b86516001600160401b03811115612871575f5ffd5b61287d89828a01612779565b602089015190975090506001600160401b0381111561289a575f5ffd5b6128a689828a016127ec565b604089015190965090506001600160401b038111156128c3575f5ffd5b6128cf89828a01612779565b606089015190955090506001600160401b038111156128ec575f5ffd5b6128f889828a016127ec565b608089015190945090506001600160401b03811115612915575f5ffd5b61292189828a016127ec565b60a089015190935090506001600160401b0381111561293e575f5ffd5b61294a89828a016127ec565b9150509295509295509295565b5f60ff821660ff810361296c5761296c61262d565b60010192915050565b60ff81811683821602908116908181146129915761299161262d565b5092915050565b634e487b7160e01b5f52603260045260245ffd5b60208101600283106124555761245561242d565b5f602082840312156129d0575f5ffd5b81516001600160401b038111156129e5575f5ffd5b6129f184828501612779565b949350505050565b5f61ffff821661ffff810361296c5761296c61262d565b8181035f8312801583831316838312821617156129915761299161262d565b8082018281125f831280158216821582161715612a4e57612a4e61262d565b505092915050565b808202811582820484141761270d5761270d61262d56fe2f2727c7b3d9ee55de5c114f0cb7997ac7251a4cbfca4f2b2dc6969d86cce4f4a2646970667358221220f4b8e0cc8055d112aa2130513aff423d3c0ddfd6da749b78d53afa30c24b6b2864736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610194575f3560e01c806301c621c114610198578063055ad42e146101ad57806309f2e19c146101d75780630a861f2a146101f75780630a8b78c71461020a57806314b5d07f1461021d5780633369921a14610230578063348ec5c8146102475780633af2a8c01461025a5780633e765a9e1461026d5780634585e33b146102805780634adfc2e71461029357806351edffb1146102a657806352e899fd146102b95780635488cd62146102cc57806357be01c1146102f257806359017aa9146103055780635dc228a0146103185780636e04ff0d1461032b578063715018a61461034c5780637158da7c14610354578063741fca4b1461036757806376d58e1a1461037a57806379502c551461038d5780638157c1ab146103a0578063841181ef146103b35780638a0b0d38146103c65780638da5cb5b146103d9578063bc504975146103e1578063be1b26a4146103f4578063d3f3506d14610407578063dab26e3b1461042f578063ee6713df14610438578063f2fde38b14610459575b5f5ffd5b6101ab6101a6366004612416565b61046c565b005b6007546101c1906301000000900460ff1681565b6040516101ce9190612441565b60405180910390f35b6101ea6101e5366004612416565b610599565b6040516101ce919061245b565b6101ab610205366004612416565b6105c1565b6101ab610218366004612483565b61081d565b6101ab61022b366004612483565b610898565b610239600f5481565b6040519081526020016101ce565b6004546101ea906001600160a01b031681565b6101ab610268366004612416565b6109a1565b61023961027b366004612416565b610a82565b6101ab61028e3660046124a5565b610aa1565b6101ab6102a1366004612511565b610bea565b6101ab6102b4366004612511565b610cd5565b6102396102c7366004612416565b610d61565b6007546102e090600160201b900460ff1681565b60405160ff90911681526020016101ce565b6007546102e09062010000900460ff1681565b6101ab61031336600461253b565b610d70565b6002546101ea906001600160a01b031681565b61033e6103393660046124a5565b610e19565b6040516101ce929190612572565b6101ab6110ae565b6005546101ea906001600160a01b031681565b6101ab610375366004612416565b6110c1565b6101ab610388366004612416565b611278565b6003546101ea906001600160a01b031681565b6101ea6103ae366004612416565b611431565b6101ab6103c1366004612483565b611440565b6101ab6103d43660046125c5565b6114d1565b6101ea6115ab565b6102396103ef366004612416565b6115b9565b610239610402366004612416565b6115c8565b6101ea610415366004612483565b60066020525f90815260409020546001600160a01b031681565b61023960085481565b6007546104469061ffff1681565b60405161ffff90911681526020016101ce565b6101ab610467366004612483565b6115d7565b610474611614565b805f036104aa57600554604051636b30633560e01b81526104a1916001600160a01b03169060040161245b565b60405180910390fd5b60048054604051637060444560e01b81529182018390526001600160a01b0316906370604445906024015f604051808303815f87803b1580156104eb575f5ffd5b505af11580156104fd573d5f5f3e3d5ffd5b505060055460405163a9059cbb60e01b81525f93506001600160a01b03909116915063a9059cbb9061053590339086906004016125de565b6020604051808303815f875af1158015610551573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061057591906125f7565b905080610595576040516312171d8360e31b815260040160405180910390fd5b5050565b600c81815481106105a8575f80fd5b5f918252602090912001546001600160a01b0316905081565b6105c9611614565b805f036105f657600554604051636b30633560e01b81526104a1916001600160a01b03169060040161245b565b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610646573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061066a91906125f7565b610687576040516312aecd8160e01b815260040160405180910390fd5b5f60045f9054906101000a90046001600160a01b03166001600160a01b031663c18e2a5c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fc9190612616565b90508082111561071f57604051632ca2f52b60e11b815260040160405180910390fd5b6004546001600160a01b031663e2c4aaec61073984612641565b6040518263ffffffff1660e01b815260040161075791815260200190565b5f604051808303815f87803b15801561076e575f5ffd5b505af1158015610780573d5f5f3e3d5ffd5b505060055460405163a9059cbb60e01b81525f93506001600160a01b03909116915063a9059cbb906107b890339087906004016125de565b6020604051808303815f875af11580156107d4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f891906125f7565b905080610818576040516312171d8360e31b815260040160405180910390fd5b505050565b610825611614565b6001600160a01b03811661084c5760405163d92e233d60e01b815260040160405180910390fd5b6004546001600160a01b03161561087657604051630ea075bf60e21b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6108a0611614565b6001600160a01b0381166108c75760405163d92e233d60e01b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610917573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061093b91906125f7565b610958576040516312aecd8160e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f6cc7ebdb6c8c53291c5ae16148cab9b049d23bf5bde5632900b40edff56fcb43905f90a250565b6109a9611614565b805f036109c9576040516317dbc4cb60e21b815260040160405180910390fd5b6101f48111156109ec576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a6091906125f7565b610a7d576040516312aecd8160e01b815260040160405180910390fd5b600855565b600e8181548110610a91575f80fd5b5f91825260209091200154905081565b610aa96115ab565b6001600160a01b0316336001600160a01b031614158015610ad557506002546001600160a01b03163314155b15610af35760405163ea8e4eb560e01b815260040160405180910390fd5b610afb611646565b6005811015610b1d576040516317dbc4cb60e21b815260040160405180910390fd5b5f80610b2b8385018561265b565b90925090506341659aab60e01b6001600160e01b0319831601610b5557610b50611670565b610bb7565b63100597e960e31b6001600160e01b0319831601610b7657610b50816118a8565b63302c6bef60e21b6001600160e01b0319831601610b9757610b5081611a35565b6301c7bbc160e21b6001600160e01b0319831601610bb757610bb7611c2d565b6040517ff0094b59b7bc92e9fc611b14b5d3a34fe02530ac9bcf36c2c6f10147c3030c12905f90a1505061059560018055565b600354604051633821dad160e21b81526001600160a01b039091169063e0876b4490610c1a90339060040161245b565b602060405180830381865afa158015610c35573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c5991906125f7565b610c765760405163ea8e4eb560e01b815260040160405180910390fd5b805f03610ca357600554604051636b30633560e01b81526104a1916001600160a01b03169060040161245b565b60055460405163a9059cbb60e01b81525f916001600160a01b03169063a9059cbb906107b890869086906004016125de565b600354604051633821dad160e21b81526001600160a01b039091169063e0876b4490610d0590339060040161245b565b602060405180830381865afa158015610d20573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d4491906125f7565b610ca35760405163ea8e4eb560e01b815260040160405180910390fd5b600b8181548110610a91575f80fd5b6003546001600160a01b03163314610d9b5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0382161580610db857506001600160a01b038116155b15610dd65760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038281165f8181526006602052604080822080546001600160a01b0319169486169485179055515f516020612a6e5f395f51905f529190a35050565b5f606060035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e6c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9091906125f7565b8015610f1057506007546004805460408051630a58ce2d60e11b8152905161ffff909416936001600160a01b03909216926314b19c5a9282820192602092908290030181865afa158015610ee6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f0a919061269a565b61ffff16115b15610f6257600191507fbe9a655586dceb82dfa0af992b5d8ae7fa45053cb7fd6f141f541da7572978c75f604051602001610f4c9291906126bb565b60405160208183030381529060405290506110a7565b60016007546301000000900460ff166003811115610f8257610f8261242d565b03610fcd57600191507f7fd340b8241a93f6a116f506d6171d4f585588564d777e1192babae55184f691600760049054906101000a900460ff16604051602001610f4c9291906126bb565b60026007546301000000900460ff166003811115610fed57610fed61242d565b0361103857600191507f3f4e50448465d8594e91c1038b22f277808696956455dacacb66f00f4df0b3a2600760049054906101000a900460ff16604051602001610f4c9291906126bb565b60036007546301000000900460ff1660038111156110585761105861242d565b0361109457600191507ff8e110fcda2d74b2e1ced72f8e94b4510c922b70f786fd1064147a762fd812605f604051602001610f4c9291906126bb565b505060408051602081019091525f808252905b9250929050565b6110b6611614565b6110bf5f611e23565b565b600354604051633821dad160e21b815233916001600160a01b03169063e0876b44906110f190849060040161245b565b602060405180830381865afa15801561110c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113091906125f7565b61114d5760405163ea8e4eb560e01b815260040160405180910390fd5b815f0361117a57600554604051636b30633560e01b81526104a1916001600160a01b03169060040161245b565b5f816001600160a01b0316631f52692b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111b7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111db91906126d8565b60055460405163a9059cbb60e01b81529192505f916001600160a01b039091169063a9059cbb9061121290859088906004016125de565b6020604051808303815f875af115801561122e573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061125291906125f7565b905080611272576040516312171d8360e31b815260040160405180910390fd5b50505050565b611280611614565b805f036112ad57600554604051636b30633560e01b81526104a1916001600160a01b03169060040161245b565b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112fd573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132191906125f7565b61133e576040516312aecd8160e01b815260040160405180910390fd5b6005546040516323b872dd60e01b8152336004820152306024820152604481018390525f916001600160a01b0316906323b872dd906064016020604051808303815f875af1158015611392573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113b691906125f7565b9050806113d6576040516312171d8360e31b815260040160405180910390fd5b600480546040516338b12abb60e21b81529182018490526001600160a01b03169063e2c4aaec906024015f604051808303815f87803b158015611417575f5ffd5b505af1158015611429573d5f5f3e3d5ffd5b505050505050565b600981815481106105a8575f80fd5b6003546001600160a01b0316331461146b5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0381166114925760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381165f8181526006602052604080822080546001600160a01b0319169055519091905f516020612a6e5f395f51905f52908390a350565b6114d9611614565b8060ff165f036114fc576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561154c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061157091906125f7565b61158d576040516312aecd8160e01b815260040160405180910390fd5b6007805460ff909216620100000262ff000019909216919091179055565b5f546001600160a01b031690565b600d8181548110610a91575f80fd5b600a8181548110610a91575f80fd5b6115df611614565b6001600160a01b038116611608575f604051631e4fbdf760e01b81526004016104a1919061245b565b61161181611e23565b50565b3361161d6115ab565b6001600160a01b0316146110bf573360405163118cdaa760e01b81526004016104a1919061245b565b60026001540361166957604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b5f60045f9054906101000a90046001600160a01b03166001600160a01b03166314b19c5a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116c1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116e5919061269a565b6007549091506116fa9061ffff1660016126f3565b61ffff168161ffff16101561170c5750565b6007805461ffff191661ffff831617905561172860095f61234b565b611733600a5f61234b565b61173e600c5f61234b565b611749600d5f61234b565b611754600b5f61234b565b61175f600e5f61234b565b5f600f8190556004805460408051631716e21f60e11b815290516001600160a01b0390921693632e2dc43e938281019391928290030181865afa1580156117a8573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117cf9190810190612847565b60095f600a5f600c5f600d5f600b5f600e5f8c91905090805190602001906117f8929190612366565b50508a5161180b919060208d0190612366565b5050895161181e919060208c0190612366565b50508851611831919060208b01906123af565b50508751611844919060208a0190612366565b50508651611857919060208901906123af565b50506007805463ff0000001916630100000017905550506009545f039250611611915050576007805463ff00000019166302000000179055600c545f0361161157506007805463ff00000019169055565b60016007546301000000900460ff1660038111156118c8576118c861242d565b146118e65760405163baf3f0f760e01b815260040160405180910390fd5b6007805460049061190090600160201b900460ff16612957565b91906101000a81548160ff021916908360ff1602179055505f600760029054906101000a900460ff16826119349190612975565b60075460ff91821692505f916119519162010000900416836126f3565b60095490915061ffff8216118061196d575060095461ffff8216145b1561198b57506009546007805464ffff000000191663020000001790555b815b8161ffff168161ffff161015611272575f60098261ffff16815481106119b5576119b5612998565b5f918252602090912001546005546001600160a01b0391821692501681036119dd5750611a2d565b5f600a8361ffff16815481106119f5576119f5612998565b905f5260205f2001549050611a2a8282600b8661ffff1681548110611a1c57611a1c612998565b905f5260205f200154611e72565b50505b60010161198d565b60026007546301000000900460ff166003811115611a5557611a5561242d565b14611a735760405163baf3f0f760e01b815260040160405180910390fd5b60078054600490611a8d90600160201b900460ff16612957565b91906101000a81548160ff021916908360ff1602179055505f600760029054906101000a900460ff1682611ac19190612975565b60075460ff91821692505f91611ade9162010000900416836126f3565b600c5490915061ffff82161180611afa5750600c5461ffff8216145b15611b185750600c546007805464ffff000000191663030000001790555b815b8161ffff168161ffff161015611bc2575f600c8261ffff1681548110611b4257611b42612998565b5f918252602090912001546005546001600160a01b039182169250168103611b6a5750611bba565b5f600d8361ffff1681548110611b8257611b82612998565b905f5260205f2001549050611bb78282600e8661ffff1681548110611ba957611ba9612998565b905f5260205f200154612020565b50505b600101611b1a565b50600c5461ffff8216036108185760048054600f546040516338b12abb60e21b8152928301526001600160a01b03169063e2c4aaec906024015f604051808303815f87803b158015611c12575f5ffd5b505af1158015611c24573d5f5f3e3d5ffd5b50505050505050565b60036007546301000000900460ff166003811115611c4d57611c4d61242d565b14611c6b5760405163baf3f0f760e01b815260040160405180910390fd5b6007805463ff00000019169055600354604051631da09e4360e31b81525f916001600160a01b03169063ed04f21890611ca89084906004016129ac565b5f60405180830381865afa158015611cc2573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ce991908101906129c0565b90505f5b81518161ffff161015610595575f828261ffff1681518110611d1157611d11612998565b6020908102919091010151600480546040516309958e4960e11b81529293505f926001600160a01b039091169163132b1c9291611d509186910161245b565b602060405180830381865afa158015611d6b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d8f9190612616565b6004805460405163e2638ff160e01b81529293505f926001600160a01b039091169163e2638ff191611dc39187910161245b565b602060405180830381865afa158015611dde573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e029190612616565b9050611e0f8383836121c2565b50505080611e1c906129f9565b9050611ced565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038084165f908152600660205260409020541680611eaa57604051635048c2af60e11b815260040160405180910390fd5b60405163095ea7b360e01b81526001600160a01b0385169063095ea7b390611ed89084905f906004016125de565b6020604051808303815f875af1158015611ef4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f1891906125f7565b5060405163095ea7b360e01b81526001600160a01b0385169063095ea7b390611f4790849087906004016125de565b6020604051808303815f875af1158015611f63573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f8791906125f7565b50604051636c197ff560e01b81525f906001600160a01b03831690636c197ff590611fb890889088906004016125de565b6020604051808303815f875af1158015611fd4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff89190612616565b90506120048382612a10565b600f5f8282546120149190612a2f565b90915550505050505050565b6001600160a01b038084165f90815260066020526040902054168061205857604051635048c2af60e11b815260040160405180910390fd5b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b39061208a9084905f906004016125de565b6020604051808303815f875af11580156120a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120ca91906125f7565b506005546001600160a01b031663095ea7b3826120e8856002612a56565b6040518363ffffffff1660e01b81526004016121059291906125de565b6020604051808303815f875af1158015612121573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061214591906125f7565b5060405163cce7ec1360e01b81525f906001600160a01b0383169063cce7ec139061217690889088906004016125de565b6020604051808303815f875af1158015612192573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121b69190612616565b90506120048184612a10565b5f8390505f816001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa158015612203573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122279190612616565b90505f826001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612266573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061228a9190612616565b905081156122e85760405163e5e9719360e01b8152600481018690526001600160a01b0384169063e5e97193906024015f604051808303815f87803b1580156122d1575f5ffd5b505af11580156122e3573d5f5f3e3d5ffd5b505050505b80156114295760405163493a6e2160e01b8152600481018590526001600160a01b0384169063493a6e21906024015f604051808303815f87803b15801561232d575f5ffd5b505af115801561233f573d5f5f3e3d5ffd5b50505050505050505050565b5080545f8255905f5260205f20908101906116119190612402565b828054828255905f5260205f2090810192821561239f579160200282015b8281111561239f578251825591602001919060010190612384565b506123ab929150612402565b5090565b828054828255905f5260205f2090810192821561239f579160200282015b8281111561239f57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906123cd565b5b808211156123ab575f8155600101612403565b5f60208284031215612426575f5ffd5b5035919050565b634e487b7160e01b5f52602160045260245ffd5b60208101600483106124555761245561242d565b91905290565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114611611575f5ffd5b5f60208284031215612493575f5ffd5b813561249e8161246f565b9392505050565b5f5f602083850312156124b6575f5ffd5b82356001600160401b038111156124cb575f5ffd5b8301601f810185136124db575f5ffd5b80356001600160401b038111156124f0575f5ffd5b856020828401011115612501575f5ffd5b6020919091019590945092505050565b5f5f60408385031215612522575f5ffd5b823561252d8161246f565b946020939093013593505050565b5f5f6040838503121561254c575f5ffd5b82356125578161246f565b915060208301356125678161246f565b809150509250929050565b8215158152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b803560ff811681146125c0575f5ffd5b919050565b5f602082840312156125d5575f5ffd5b61249e826125b0565b6001600160a01b03929092168252602082015260400190565b5f60208284031215612607575f5ffd5b8151801515811461249e575f5ffd5b5f60208284031215612626575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b82016126555761265561262d565b505f0390565b5f5f6040838503121561266c575f5ffd5b82356001600160e01b031981168114612683575f5ffd5b9150612691602084016125b0565b90509250929050565b5f602082840312156126aa575f5ffd5b815161ffff8116811461249e575f5ffd5b6001600160e01b031992909216825260ff16602082015260400190565b5f602082840312156126e8575f5ffd5b815161249e8161246f565b61ffff818116838216019081111561270d5761270d61262d565b92915050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561274f5761274f612713565b604052919050565b5f6001600160401b0382111561276f5761276f612713565b5060051b60200190565b5f82601f830112612788575f5ffd5b815161279b61279682612757565b612727565b8082825260208201915060208360051b8601019250858311156127bc575f5ffd5b602085015b838110156127e25780516127d48161246f565b8352602092830192016127c1565b5095945050505050565b5f82601f8301126127fb575f5ffd5b815161280961279682612757565b8082825260208201915060208360051b86010192508583111561282a575f5ffd5b602085015b838110156127e257805183526020928301920161282f565b5f5f5f5f5f5f60c0878903121561285c575f5ffd5b86516001600160401b03811115612871575f5ffd5b61287d89828a01612779565b602089015190975090506001600160401b0381111561289a575f5ffd5b6128a689828a016127ec565b604089015190965090506001600160401b038111156128c3575f5ffd5b6128cf89828a01612779565b606089015190955090506001600160401b038111156128ec575f5ffd5b6128f889828a016127ec565b608089015190945090506001600160401b03811115612915575f5ffd5b61292189828a016127ec565b60a089015190935090506001600160401b0381111561293e575f5ffd5b61294a89828a016127ec565b9150509295509295509295565b5f60ff821660ff810361296c5761296c61262d565b60010192915050565b60ff81811683821602908116908181146129915761299161262d565b5092915050565b634e487b7160e01b5f52603260045260245ffd5b60208101600283106124555761245561242d565b5f602082840312156129d0575f5ffd5b81516001600160401b038111156129e5575f5ffd5b6129f184828501612779565b949350505050565b5f61ffff821661ffff810361296c5761296c61262d565b8181035f8312801583831316838312821617156129915761299161262d565b8082018281125f831280158216821582161715612a4e57612a4e61262d565b505092915050565b808202811582820484141761270d5761270d61262d56fe2f2727c7b3d9ee55de5c114f0cb7997ac7251a4cbfca4f2b2dc6969d86cce4f4a2646970667358221220f4b8e0cc8055d112aa2130513aff423d3c0ddfd6da749b78d53afa30c24b6b2864736f6c634300081c0033", + "bytecode": "0x608060405234801561000f575f5ffd5b50604051612d77380380612d7783398101604081905261002e916101e3565b826001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161017d565b50600180556001600160a01b0382166100915760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381166100b85760405163d92e233d60e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b03841690811790915560408051631c56369f60e21b81529051637158da7c916004808201926020929091908290030181865afa15801561010f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610133919061022d565b600580546001600160a01b03199081166001600160a01b0393841617909155600280549091169290911691909117905550506007805464ffffffffff19166201000017905561024f565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101e0575f5ffd5b50565b5f5f5f606084860312156101f5575f5ffd5b8351610200816101cc565b6020850151909350610211816101cc565b6040850151909250610222816101cc565b809150509250925092565b5f6020828403121561023d575f5ffd5b8151610248816101cc565b9392505050565b612b1b8061025c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610194575f3560e01c806301c621c114610198578063055ad42e146101ad57806309f2e19c146101d75780630a861f2a146101f75780630a8b78c71461020a57806314b5d07f1461021d5780633369921a14610230578063348ec5c8146102475780633af2a8c01461025a5780633e765a9e1461026d5780634585e33b146102805780634adfc2e71461029357806351edffb1146102a657806352e899fd146102b95780635488cd62146102cc57806357be01c1146102f257806359017aa9146103055780635dc228a0146103185780636e04ff0d1461032b578063715018a61461034c5780637158da7c14610354578063741fca4b1461036757806376d58e1a1461037a57806379502c551461038d5780638157c1ab146103a0578063841181ef146103b35780638a0b0d38146103c65780638da5cb5b146103d9578063bc504975146103e1578063be1b26a4146103f4578063d3f3506d14610407578063dab26e3b1461042f578063ee6713df14610438578063f2fde38b14610459575b5f5ffd5b6101ab6101a636600461246e565b61046c565b005b6007546101c1906301000000900460ff1681565b6040516101ce9190612499565b60405180910390f35b6101ea6101e536600461246e565b610599565b6040516101ce91906124b3565b6101ab61020536600461246e565b6105c1565b6101ab6102183660046124db565b61081d565b6101ab61022b3660046124db565b610898565b610239600f5481565b6040519081526020016101ce565b6004546101ea906001600160a01b031681565b6101ab61026836600461246e565b6109a1565b61023961027b36600461246e565b610a82565b6101ab61028e3660046124fd565b610aa1565b6101ab6102a1366004612569565b610bea565b6101ab6102b4366004612569565b610cd5565b6102396102c736600461246e565b610d61565b6007546102e090600160201b900460ff1681565b60405160ff90911681526020016101ce565b6007546102e09062010000900460ff1681565b6101ab610313366004612593565b610d70565b6002546101ea906001600160a01b031681565b61033e6103393660046124fd565b610e71565b6040516101ce9291906125ca565b6101ab611106565b6005546101ea906001600160a01b031681565b6101ab61037536600461246e565b611119565b6101ab61038836600461246e565b6112d0565b6003546101ea906001600160a01b031681565b6101ea6103ae36600461246e565b611489565b6101ab6103c13660046124db565b611498565b6101ab6103d436600461261d565b611529565b6101ea611603565b6102396103ef36600461246e565b611611565b61023961040236600461246e565b611620565b6101ea6104153660046124db565b60066020525f90815260409020546001600160a01b031681565b61023960085481565b6007546104469061ffff1681565b60405161ffff90911681526020016101ce565b6101ab6104673660046124db565b61162f565b61047461166c565b805f036104aa57600554604051636b30633560e01b81526104a1916001600160a01b0316906004016124b3565b60405180910390fd5b60048054604051637060444560e01b81529182018390526001600160a01b0316906370604445906024015f604051808303815f87803b1580156104eb575f5ffd5b505af11580156104fd573d5f5f3e3d5ffd5b505060055460405163a9059cbb60e01b81525f93506001600160a01b03909116915063a9059cbb906105359033908690600401612636565b6020604051808303815f875af1158015610551573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610575919061264f565b905080610595576040516312171d8360e31b815260040160405180910390fd5b5050565b600c81815481106105a8575f80fd5b5f918252602090912001546001600160a01b0316905081565b6105c961166c565b805f036105f657600554604051636b30633560e01b81526104a1916001600160a01b0316906004016124b3565b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610646573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061066a919061264f565b610687576040516312aecd8160e01b815260040160405180910390fd5b5f60045f9054906101000a90046001600160a01b03166001600160a01b031663c18e2a5c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fc919061266e565b90508082111561071f57604051632ca2f52b60e11b815260040160405180910390fd5b6004546001600160a01b031663e2c4aaec61073984612699565b6040518263ffffffff1660e01b815260040161075791815260200190565b5f604051808303815f87803b15801561076e575f5ffd5b505af1158015610780573d5f5f3e3d5ffd5b505060055460405163a9059cbb60e01b81525f93506001600160a01b03909116915063a9059cbb906107b89033908790600401612636565b6020604051808303815f875af11580156107d4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f8919061264f565b905080610818576040516312171d8360e31b815260040160405180910390fd5b505050565b61082561166c565b6001600160a01b03811661084c5760405163d92e233d60e01b815260040160405180910390fd5b6004546001600160a01b03161561087657604051630ea075bf60e21b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6108a061166c565b6001600160a01b0381166108c75760405163d92e233d60e01b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610917573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061093b919061264f565b610958576040516312aecd8160e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f6cc7ebdb6c8c53291c5ae16148cab9b049d23bf5bde5632900b40edff56fcb43905f90a250565b6109a961166c565b805f036109c9576040516317dbc4cb60e21b815260040160405180910390fd5b6101f48111156109ec576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a60919061264f565b610a7d576040516312aecd8160e01b815260040160405180910390fd5b600855565b600e8181548110610a91575f80fd5b5f91825260209091200154905081565b610aa9611603565b6001600160a01b0316336001600160a01b031614158015610ad557506002546001600160a01b03163314155b15610af35760405163ea8e4eb560e01b815260040160405180910390fd5b610afb61169e565b6005811015610b1d576040516317dbc4cb60e21b815260040160405180910390fd5b5f80610b2b838501856126b3565b90925090506341659aab60e01b6001600160e01b0319831601610b5557610b506116c8565b610bb7565b63100597e960e31b6001600160e01b0319831601610b7657610b5081611900565b63302c6bef60e21b6001600160e01b0319831601610b9757610b5081611a8d565b6301c7bbc160e21b6001600160e01b0319831601610bb757610bb7611c85565b6040517ff0094b59b7bc92e9fc611b14b5d3a34fe02530ac9bcf36c2c6f10147c3030c12905f90a1505061059560018055565b600354604051633821dad160e21b81526001600160a01b039091169063e0876b4490610c1a9033906004016124b3565b602060405180830381865afa158015610c35573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c59919061264f565b610c765760405163ea8e4eb560e01b815260040160405180910390fd5b805f03610ca357600554604051636b30633560e01b81526104a1916001600160a01b0316906004016124b3565b60055460405163a9059cbb60e01b81525f916001600160a01b03169063a9059cbb906107b89086908690600401612636565b600354604051633821dad160e21b81526001600160a01b039091169063e0876b4490610d059033906004016124b3565b602060405180830381865afa158015610d20573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d44919061264f565b610ca35760405163ea8e4eb560e01b815260040160405180910390fd5b600b8181548110610a91575f80fd5b6003546001600160a01b03163314610d9b5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0382161580610db857506001600160a01b038116155b15610dd65760405163d92e233d60e01b815260040160405180910390fd5b604051631ed3e4fb60e11b81526001600160a01b03821690633da7c9f690610e029085906004016124b3565b5f6040518083038186803b158015610e18575f5ffd5b505afa158015610e2a573d5f5f3e3d5ffd5b505050506001600160a01b038281165f8181526006602052604080822080546001600160a01b0319169486169485179055515f516020612ac65f395f51905f529190a35050565b5f606060035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ec4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee8919061264f565b8015610f6857506007546004805460408051630a58ce2d60e11b8152905161ffff909416936001600160a01b03909216926314b19c5a9282820192602092908290030181865afa158015610f3e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6291906126f2565b61ffff16115b15610fba57600191507fbe9a655586dceb82dfa0af992b5d8ae7fa45053cb7fd6f141f541da7572978c75f604051602001610fa4929190612713565b60405160208183030381529060405290506110ff565b60016007546301000000900460ff166003811115610fda57610fda612485565b0361102557600191507f7fd340b8241a93f6a116f506d6171d4f585588564d777e1192babae55184f691600760049054906101000a900460ff16604051602001610fa4929190612713565b60026007546301000000900460ff16600381111561104557611045612485565b0361109057600191507f3f4e50448465d8594e91c1038b22f277808696956455dacacb66f00f4df0b3a2600760049054906101000a900460ff16604051602001610fa4929190612713565b60036007546301000000900460ff1660038111156110b0576110b0612485565b036110ec57600191507ff8e110fcda2d74b2e1ced72f8e94b4510c922b70f786fd1064147a762fd812605f604051602001610fa4929190612713565b505060408051602081019091525f808252905b9250929050565b61110e61166c565b6111175f611e7b565b565b600354604051633821dad160e21b815233916001600160a01b03169063e0876b44906111499084906004016124b3565b602060405180830381865afa158015611164573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611188919061264f565b6111a55760405163ea8e4eb560e01b815260040160405180910390fd5b815f036111d257600554604051636b30633560e01b81526104a1916001600160a01b0316906004016124b3565b5f816001600160a01b0316631f52692b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112339190612730565b60055460405163a9059cbb60e01b81529192505f916001600160a01b039091169063a9059cbb9061126a9085908890600401612636565b6020604051808303815f875af1158015611286573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112aa919061264f565b9050806112ca576040516312171d8360e31b815260040160405180910390fd5b50505050565b6112d861166c565b805f0361130557600554604051636b30633560e01b81526104a1916001600160a01b0316906004016124b3565b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611355573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611379919061264f565b611396576040516312aecd8160e01b815260040160405180910390fd5b6005546040516323b872dd60e01b8152336004820152306024820152604481018390525f916001600160a01b0316906323b872dd906064016020604051808303815f875af11580156113ea573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140e919061264f565b90508061142e576040516312171d8360e31b815260040160405180910390fd5b600480546040516338b12abb60e21b81529182018490526001600160a01b03169063e2c4aaec906024015f604051808303815f87803b15801561146f575f5ffd5b505af1158015611481573d5f5f3e3d5ffd5b505050505050565b600981815481106105a8575f80fd5b6003546001600160a01b031633146114c35760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0381166114ea5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381165f8181526006602052604080822080546001600160a01b0319169055519091905f516020612ac65f395f51905f52908390a350565b61153161166c565b8060ff165f03611554576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115a4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115c8919061264f565b6115e5576040516312aecd8160e01b815260040160405180910390fd5b6007805460ff909216620100000262ff000019909216919091179055565b5f546001600160a01b031690565b600d8181548110610a91575f80fd5b600a8181548110610a91575f80fd5b61163761166c565b6001600160a01b038116611660575f604051631e4fbdf760e01b81526004016104a191906124b3565b61166981611e7b565b50565b33611675611603565b6001600160a01b031614611117573360405163118cdaa760e01b81526004016104a191906124b3565b6002600154036116c157604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b5f60045f9054906101000a90046001600160a01b03166001600160a01b03166314b19c5a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611719573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061173d91906126f2565b6007549091506117529061ffff16600161274b565b61ffff168161ffff1610156117645750565b6007805461ffff191661ffff831617905561178060095f6123a3565b61178b600a5f6123a3565b611796600c5f6123a3565b6117a1600d5f6123a3565b6117ac600b5f6123a3565b6117b7600e5f6123a3565b5f600f8190556004805460408051631716e21f60e11b815290516001600160a01b0390921693632e2dc43e938281019391928290030181865afa158015611800573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611827919081019061289f565b60095f600a5f600c5f600d5f600b5f600e5f8c91905090805190602001906118509291906123be565b50508a51611863919060208d01906123be565b50508951611876919060208c01906123be565b50508851611889919060208b0190612407565b5050875161189c919060208a01906123be565b505086516118af91906020890190612407565b50506007805463ff0000001916630100000017905550506009545f039250611669915050576007805463ff00000019166302000000179055600c545f0361166957506007805463ff00000019169055565b60016007546301000000900460ff16600381111561192057611920612485565b1461193e5760405163baf3f0f760e01b815260040160405180910390fd5b6007805460049061195890600160201b900460ff166129af565b91906101000a81548160ff021916908360ff1602179055505f600760029054906101000a900460ff168261198c91906129cd565b60075460ff91821692505f916119a991620100009004168361274b565b60095490915061ffff821611806119c5575060095461ffff8216145b156119e357506009546007805464ffff000000191663020000001790555b815b8161ffff168161ffff1610156112ca575f60098261ffff1681548110611a0d57611a0d6129f0565b5f918252602090912001546005546001600160a01b039182169250168103611a355750611a85565b5f600a8361ffff1681548110611a4d57611a4d6129f0565b905f5260205f2001549050611a828282600b8661ffff1681548110611a7457611a746129f0565b905f5260205f200154611eca565b50505b6001016119e5565b60026007546301000000900460ff166003811115611aad57611aad612485565b14611acb5760405163baf3f0f760e01b815260040160405180910390fd5b60078054600490611ae590600160201b900460ff166129af565b91906101000a81548160ff021916908360ff1602179055505f600760029054906101000a900460ff1682611b1991906129cd565b60075460ff91821692505f91611b3691620100009004168361274b565b600c5490915061ffff82161180611b525750600c5461ffff8216145b15611b705750600c546007805464ffff000000191663030000001790555b815b8161ffff168161ffff161015611c1a575f600c8261ffff1681548110611b9a57611b9a6129f0565b5f918252602090912001546005546001600160a01b039182169250168103611bc25750611c12565b5f600d8361ffff1681548110611bda57611bda6129f0565b905f5260205f2001549050611c0f8282600e8661ffff1681548110611c0157611c016129f0565b905f5260205f200154612078565b50505b600101611b72565b50600c5461ffff8216036108185760048054600f546040516338b12abb60e21b8152928301526001600160a01b03169063e2c4aaec906024015f604051808303815f87803b158015611c6a575f5ffd5b505af1158015611c7c573d5f5f3e3d5ffd5b50505050505050565b60036007546301000000900460ff166003811115611ca557611ca5612485565b14611cc35760405163baf3f0f760e01b815260040160405180910390fd5b6007805463ff00000019169055600354604051631da09e4360e31b81525f916001600160a01b03169063ed04f21890611d00908490600401612a04565b5f60405180830381865afa158015611d1a573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d419190810190612a18565b90505f5b81518161ffff161015610595575f828261ffff1681518110611d6957611d696129f0565b6020908102919091010151600480546040516309958e4960e11b81529293505f926001600160a01b039091169163132b1c9291611da8918691016124b3565b602060405180830381865afa158015611dc3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de7919061266e565b6004805460405163e2638ff160e01b81529293505f926001600160a01b039091169163e2638ff191611e1b918791016124b3565b602060405180830381865afa158015611e36573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e5a919061266e565b9050611e6783838361221a565b50505080611e7490612a51565b9050611d45565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038084165f908152600660205260409020541680611f0257604051635048c2af60e11b815260040160405180910390fd5b60405163095ea7b360e01b81526001600160a01b0385169063095ea7b390611f309084905f90600401612636565b6020604051808303815f875af1158015611f4c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f70919061264f565b5060405163095ea7b360e01b81526001600160a01b0385169063095ea7b390611f9f9084908790600401612636565b6020604051808303815f875af1158015611fbb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fdf919061264f565b50604051636c197ff560e01b81525f906001600160a01b03831690636c197ff5906120109088908890600401612636565b6020604051808303815f875af115801561202c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612050919061266e565b905061205c8382612a68565b600f5f82825461206c9190612a87565b90915550505050505050565b6001600160a01b038084165f9081526006602052604090205416806120b057604051635048c2af60e11b815260040160405180910390fd5b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906120e29084905f90600401612636565b6020604051808303815f875af11580156120fe573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612122919061264f565b506005546001600160a01b031663095ea7b382612140856002612aae565b6040518363ffffffff1660e01b815260040161215d929190612636565b6020604051808303815f875af1158015612179573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061219d919061264f565b5060405163cce7ec1360e01b81525f906001600160a01b0383169063cce7ec13906121ce9088908890600401612636565b6020604051808303815f875af11580156121ea573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061220e919061266e565b905061205c8184612a68565b5f8390505f816001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa15801561225b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061227f919061266e565b90505f826001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122e2919061266e565b905081156123405760405163e5e9719360e01b8152600481018690526001600160a01b0384169063e5e97193906024015f604051808303815f87803b158015612329575f5ffd5b505af115801561233b573d5f5f3e3d5ffd5b505050505b80156114815760405163493a6e2160e01b8152600481018590526001600160a01b0384169063493a6e21906024015f604051808303815f87803b158015612385575f5ffd5b505af1158015612397573d5f5f3e3d5ffd5b50505050505050505050565b5080545f8255905f5260205f2090810190611669919061245a565b828054828255905f5260205f209081019282156123f7579160200282015b828111156123f75782518255916020019190600101906123dc565b5061240392915061245a565b5090565b828054828255905f5260205f209081019282156123f7579160200282015b828111156123f757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612425565b5b80821115612403575f815560010161245b565b5f6020828403121561247e575f5ffd5b5035919050565b634e487b7160e01b5f52602160045260245ffd5b60208101600483106124ad576124ad612485565b91905290565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114611669575f5ffd5b5f602082840312156124eb575f5ffd5b81356124f6816124c7565b9392505050565b5f5f6020838503121561250e575f5ffd5b82356001600160401b03811115612523575f5ffd5b8301601f81018513612533575f5ffd5b80356001600160401b03811115612548575f5ffd5b856020828401011115612559575f5ffd5b6020919091019590945092505050565b5f5f6040838503121561257a575f5ffd5b8235612585816124c7565b946020939093013593505050565b5f5f604083850312156125a4575f5ffd5b82356125af816124c7565b915060208301356125bf816124c7565b809150509250929050565b8215158152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b803560ff81168114612618575f5ffd5b919050565b5f6020828403121561262d575f5ffd5b6124f682612608565b6001600160a01b03929092168252602082015260400190565b5f6020828403121561265f575f5ffd5b815180151581146124f6575f5ffd5b5f6020828403121561267e575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b82016126ad576126ad612685565b505f0390565b5f5f604083850312156126c4575f5ffd5b82356001600160e01b0319811681146126db575f5ffd5b91506126e960208401612608565b90509250929050565b5f60208284031215612702575f5ffd5b815161ffff811681146124f6575f5ffd5b6001600160e01b031992909216825260ff16602082015260400190565b5f60208284031215612740575f5ffd5b81516124f6816124c7565b61ffff818116838216019081111561276557612765612685565b92915050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156127a7576127a761276b565b604052919050565b5f6001600160401b038211156127c7576127c761276b565b5060051b60200190565b5f82601f8301126127e0575f5ffd5b81516127f36127ee826127af565b61277f565b8082825260208201915060208360051b860101925085831115612814575f5ffd5b602085015b8381101561283a57805161282c816124c7565b835260209283019201612819565b5095945050505050565b5f82601f830112612853575f5ffd5b81516128616127ee826127af565b8082825260208201915060208360051b860101925085831115612882575f5ffd5b602085015b8381101561283a578051835260209283019201612887565b5f5f5f5f5f5f60c087890312156128b4575f5ffd5b86516001600160401b038111156128c9575f5ffd5b6128d589828a016127d1565b602089015190975090506001600160401b038111156128f2575f5ffd5b6128fe89828a01612844565b604089015190965090506001600160401b0381111561291b575f5ffd5b61292789828a016127d1565b606089015190955090506001600160401b03811115612944575f5ffd5b61295089828a01612844565b608089015190945090506001600160401b0381111561296d575f5ffd5b61297989828a01612844565b60a089015190935090506001600160401b03811115612996575f5ffd5b6129a289828a01612844565b9150509295509295509295565b5f60ff821660ff81036129c4576129c4612685565b60010192915050565b60ff81811683821602908116908181146129e9576129e9612685565b5092915050565b634e487b7160e01b5f52603260045260245ffd5b60208101600283106124ad576124ad612485565b5f60208284031215612a28575f5ffd5b81516001600160401b03811115612a3d575f5ffd5b612a49848285016127d1565b949350505050565b5f61ffff821661ffff81036129c4576129c4612685565b8181035f8312801583831316838312821617156129e9576129e9612685565b8082018281125f831280158216821582161715612aa657612aa6612685565b505092915050565b80820281158282048414176127655761276561268556fe2f2727c7b3d9ee55de5c114f0cb7997ac7251a4cbfca4f2b2dc6969d86cce4f4a2646970667358221220b4d3c450839684dfbd2ebc2753acd3292b49848f85789d0123d8b5c7d755211b64736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610194575f3560e01c806301c621c114610198578063055ad42e146101ad57806309f2e19c146101d75780630a861f2a146101f75780630a8b78c71461020a57806314b5d07f1461021d5780633369921a14610230578063348ec5c8146102475780633af2a8c01461025a5780633e765a9e1461026d5780634585e33b146102805780634adfc2e71461029357806351edffb1146102a657806352e899fd146102b95780635488cd62146102cc57806357be01c1146102f257806359017aa9146103055780635dc228a0146103185780636e04ff0d1461032b578063715018a61461034c5780637158da7c14610354578063741fca4b1461036757806376d58e1a1461037a57806379502c551461038d5780638157c1ab146103a0578063841181ef146103b35780638a0b0d38146103c65780638da5cb5b146103d9578063bc504975146103e1578063be1b26a4146103f4578063d3f3506d14610407578063dab26e3b1461042f578063ee6713df14610438578063f2fde38b14610459575b5f5ffd5b6101ab6101a636600461246e565b61046c565b005b6007546101c1906301000000900460ff1681565b6040516101ce9190612499565b60405180910390f35b6101ea6101e536600461246e565b610599565b6040516101ce91906124b3565b6101ab61020536600461246e565b6105c1565b6101ab6102183660046124db565b61081d565b6101ab61022b3660046124db565b610898565b610239600f5481565b6040519081526020016101ce565b6004546101ea906001600160a01b031681565b6101ab61026836600461246e565b6109a1565b61023961027b36600461246e565b610a82565b6101ab61028e3660046124fd565b610aa1565b6101ab6102a1366004612569565b610bea565b6101ab6102b4366004612569565b610cd5565b6102396102c736600461246e565b610d61565b6007546102e090600160201b900460ff1681565b60405160ff90911681526020016101ce565b6007546102e09062010000900460ff1681565b6101ab610313366004612593565b610d70565b6002546101ea906001600160a01b031681565b61033e6103393660046124fd565b610e71565b6040516101ce9291906125ca565b6101ab611106565b6005546101ea906001600160a01b031681565b6101ab61037536600461246e565b611119565b6101ab61038836600461246e565b6112d0565b6003546101ea906001600160a01b031681565b6101ea6103ae36600461246e565b611489565b6101ab6103c13660046124db565b611498565b6101ab6103d436600461261d565b611529565b6101ea611603565b6102396103ef36600461246e565b611611565b61023961040236600461246e565b611620565b6101ea6104153660046124db565b60066020525f90815260409020546001600160a01b031681565b61023960085481565b6007546104469061ffff1681565b60405161ffff90911681526020016101ce565b6101ab6104673660046124db565b61162f565b61047461166c565b805f036104aa57600554604051636b30633560e01b81526104a1916001600160a01b0316906004016124b3565b60405180910390fd5b60048054604051637060444560e01b81529182018390526001600160a01b0316906370604445906024015f604051808303815f87803b1580156104eb575f5ffd5b505af11580156104fd573d5f5f3e3d5ffd5b505060055460405163a9059cbb60e01b81525f93506001600160a01b03909116915063a9059cbb906105359033908690600401612636565b6020604051808303815f875af1158015610551573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610575919061264f565b905080610595576040516312171d8360e31b815260040160405180910390fd5b5050565b600c81815481106105a8575f80fd5b5f918252602090912001546001600160a01b0316905081565b6105c961166c565b805f036105f657600554604051636b30633560e01b81526104a1916001600160a01b0316906004016124b3565b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610646573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061066a919061264f565b610687576040516312aecd8160e01b815260040160405180910390fd5b5f60045f9054906101000a90046001600160a01b03166001600160a01b031663c18e2a5c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fc919061266e565b90508082111561071f57604051632ca2f52b60e11b815260040160405180910390fd5b6004546001600160a01b031663e2c4aaec61073984612699565b6040518263ffffffff1660e01b815260040161075791815260200190565b5f604051808303815f87803b15801561076e575f5ffd5b505af1158015610780573d5f5f3e3d5ffd5b505060055460405163a9059cbb60e01b81525f93506001600160a01b03909116915063a9059cbb906107b89033908790600401612636565b6020604051808303815f875af11580156107d4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f8919061264f565b905080610818576040516312171d8360e31b815260040160405180910390fd5b505050565b61082561166c565b6001600160a01b03811661084c5760405163d92e233d60e01b815260040160405180910390fd5b6004546001600160a01b03161561087657604051630ea075bf60e21b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6108a061166c565b6001600160a01b0381166108c75760405163d92e233d60e01b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610917573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061093b919061264f565b610958576040516312aecd8160e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f6cc7ebdb6c8c53291c5ae16148cab9b049d23bf5bde5632900b40edff56fcb43905f90a250565b6109a961166c565b805f036109c9576040516317dbc4cb60e21b815260040160405180910390fd5b6101f48111156109ec576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a60919061264f565b610a7d576040516312aecd8160e01b815260040160405180910390fd5b600855565b600e8181548110610a91575f80fd5b5f91825260209091200154905081565b610aa9611603565b6001600160a01b0316336001600160a01b031614158015610ad557506002546001600160a01b03163314155b15610af35760405163ea8e4eb560e01b815260040160405180910390fd5b610afb61169e565b6005811015610b1d576040516317dbc4cb60e21b815260040160405180910390fd5b5f80610b2b838501856126b3565b90925090506341659aab60e01b6001600160e01b0319831601610b5557610b506116c8565b610bb7565b63100597e960e31b6001600160e01b0319831601610b7657610b5081611900565b63302c6bef60e21b6001600160e01b0319831601610b9757610b5081611a8d565b6301c7bbc160e21b6001600160e01b0319831601610bb757610bb7611c85565b6040517ff0094b59b7bc92e9fc611b14b5d3a34fe02530ac9bcf36c2c6f10147c3030c12905f90a1505061059560018055565b600354604051633821dad160e21b81526001600160a01b039091169063e0876b4490610c1a9033906004016124b3565b602060405180830381865afa158015610c35573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c59919061264f565b610c765760405163ea8e4eb560e01b815260040160405180910390fd5b805f03610ca357600554604051636b30633560e01b81526104a1916001600160a01b0316906004016124b3565b60055460405163a9059cbb60e01b81525f916001600160a01b03169063a9059cbb906107b89086908690600401612636565b600354604051633821dad160e21b81526001600160a01b039091169063e0876b4490610d059033906004016124b3565b602060405180830381865afa158015610d20573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d44919061264f565b610ca35760405163ea8e4eb560e01b815260040160405180910390fd5b600b8181548110610a91575f80fd5b6003546001600160a01b03163314610d9b5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0382161580610db857506001600160a01b038116155b15610dd65760405163d92e233d60e01b815260040160405180910390fd5b604051631ed3e4fb60e11b81526001600160a01b03821690633da7c9f690610e029085906004016124b3565b5f6040518083038186803b158015610e18575f5ffd5b505afa158015610e2a573d5f5f3e3d5ffd5b505050506001600160a01b038281165f8181526006602052604080822080546001600160a01b0319169486169485179055515f516020612ac65f395f51905f529190a35050565b5f606060035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ec4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee8919061264f565b8015610f6857506007546004805460408051630a58ce2d60e11b8152905161ffff909416936001600160a01b03909216926314b19c5a9282820192602092908290030181865afa158015610f3e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6291906126f2565b61ffff16115b15610fba57600191507fbe9a655586dceb82dfa0af992b5d8ae7fa45053cb7fd6f141f541da7572978c75f604051602001610fa4929190612713565b60405160208183030381529060405290506110ff565b60016007546301000000900460ff166003811115610fda57610fda612485565b0361102557600191507f7fd340b8241a93f6a116f506d6171d4f585588564d777e1192babae55184f691600760049054906101000a900460ff16604051602001610fa4929190612713565b60026007546301000000900460ff16600381111561104557611045612485565b0361109057600191507f3f4e50448465d8594e91c1038b22f277808696956455dacacb66f00f4df0b3a2600760049054906101000a900460ff16604051602001610fa4929190612713565b60036007546301000000900460ff1660038111156110b0576110b0612485565b036110ec57600191507ff8e110fcda2d74b2e1ced72f8e94b4510c922b70f786fd1064147a762fd812605f604051602001610fa4929190612713565b505060408051602081019091525f808252905b9250929050565b61110e61166c565b6111175f611e7b565b565b600354604051633821dad160e21b815233916001600160a01b03169063e0876b44906111499084906004016124b3565b602060405180830381865afa158015611164573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611188919061264f565b6111a55760405163ea8e4eb560e01b815260040160405180910390fd5b815f036111d257600554604051636b30633560e01b81526104a1916001600160a01b0316906004016124b3565b5f816001600160a01b0316631f52692b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112339190612730565b60055460405163a9059cbb60e01b81529192505f916001600160a01b039091169063a9059cbb9061126a9085908890600401612636565b6020604051808303815f875af1158015611286573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112aa919061264f565b9050806112ca576040516312171d8360e31b815260040160405180910390fd5b50505050565b6112d861166c565b805f0361130557600554604051636b30633560e01b81526104a1916001600160a01b0316906004016124b3565b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611355573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611379919061264f565b611396576040516312aecd8160e01b815260040160405180910390fd5b6005546040516323b872dd60e01b8152336004820152306024820152604481018390525f916001600160a01b0316906323b872dd906064016020604051808303815f875af11580156113ea573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140e919061264f565b90508061142e576040516312171d8360e31b815260040160405180910390fd5b600480546040516338b12abb60e21b81529182018490526001600160a01b03169063e2c4aaec906024015f604051808303815f87803b15801561146f575f5ffd5b505af1158015611481573d5f5f3e3d5ffd5b505050505050565b600981815481106105a8575f80fd5b6003546001600160a01b031633146114c35760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0381166114ea5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381165f8181526006602052604080822080546001600160a01b0319169055519091905f516020612ac65f395f51905f52908390a350565b61153161166c565b8060ff165f03611554576040516317dbc4cb60e21b815260040160405180910390fd5b60035f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115a4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115c8919061264f565b6115e5576040516312aecd8160e01b815260040160405180910390fd5b6007805460ff909216620100000262ff000019909216919091179055565b5f546001600160a01b031690565b600d8181548110610a91575f80fd5b600a8181548110610a91575f80fd5b61163761166c565b6001600160a01b038116611660575f604051631e4fbdf760e01b81526004016104a191906124b3565b61166981611e7b565b50565b33611675611603565b6001600160a01b031614611117573360405163118cdaa760e01b81526004016104a191906124b3565b6002600154036116c157604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b5f60045f9054906101000a90046001600160a01b03166001600160a01b03166314b19c5a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611719573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061173d91906126f2565b6007549091506117529061ffff16600161274b565b61ffff168161ffff1610156117645750565b6007805461ffff191661ffff831617905561178060095f6123a3565b61178b600a5f6123a3565b611796600c5f6123a3565b6117a1600d5f6123a3565b6117ac600b5f6123a3565b6117b7600e5f6123a3565b5f600f8190556004805460408051631716e21f60e11b815290516001600160a01b0390921693632e2dc43e938281019391928290030181865afa158015611800573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611827919081019061289f565b60095f600a5f600c5f600d5f600b5f600e5f8c91905090805190602001906118509291906123be565b50508a51611863919060208d01906123be565b50508951611876919060208c01906123be565b50508851611889919060208b0190612407565b5050875161189c919060208a01906123be565b505086516118af91906020890190612407565b50506007805463ff0000001916630100000017905550506009545f039250611669915050576007805463ff00000019166302000000179055600c545f0361166957506007805463ff00000019169055565b60016007546301000000900460ff16600381111561192057611920612485565b1461193e5760405163baf3f0f760e01b815260040160405180910390fd5b6007805460049061195890600160201b900460ff166129af565b91906101000a81548160ff021916908360ff1602179055505f600760029054906101000a900460ff168261198c91906129cd565b60075460ff91821692505f916119a991620100009004168361274b565b60095490915061ffff821611806119c5575060095461ffff8216145b156119e357506009546007805464ffff000000191663020000001790555b815b8161ffff168161ffff1610156112ca575f60098261ffff1681548110611a0d57611a0d6129f0565b5f918252602090912001546005546001600160a01b039182169250168103611a355750611a85565b5f600a8361ffff1681548110611a4d57611a4d6129f0565b905f5260205f2001549050611a828282600b8661ffff1681548110611a7457611a746129f0565b905f5260205f200154611eca565b50505b6001016119e5565b60026007546301000000900460ff166003811115611aad57611aad612485565b14611acb5760405163baf3f0f760e01b815260040160405180910390fd5b60078054600490611ae590600160201b900460ff166129af565b91906101000a81548160ff021916908360ff1602179055505f600760029054906101000a900460ff1682611b1991906129cd565b60075460ff91821692505f91611b3691620100009004168361274b565b600c5490915061ffff82161180611b525750600c5461ffff8216145b15611b705750600c546007805464ffff000000191663030000001790555b815b8161ffff168161ffff161015611c1a575f600c8261ffff1681548110611b9a57611b9a6129f0565b5f918252602090912001546005546001600160a01b039182169250168103611bc25750611c12565b5f600d8361ffff1681548110611bda57611bda6129f0565b905f5260205f2001549050611c0f8282600e8661ffff1681548110611c0157611c016129f0565b905f5260205f200154612078565b50505b600101611b72565b50600c5461ffff8216036108185760048054600f546040516338b12abb60e21b8152928301526001600160a01b03169063e2c4aaec906024015f604051808303815f87803b158015611c6a575f5ffd5b505af1158015611c7c573d5f5f3e3d5ffd5b50505050505050565b60036007546301000000900460ff166003811115611ca557611ca5612485565b14611cc35760405163baf3f0f760e01b815260040160405180910390fd5b6007805463ff00000019169055600354604051631da09e4360e31b81525f916001600160a01b03169063ed04f21890611d00908490600401612a04565b5f60405180830381865afa158015611d1a573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d419190810190612a18565b90505f5b81518161ffff161015610595575f828261ffff1681518110611d6957611d696129f0565b6020908102919091010151600480546040516309958e4960e11b81529293505f926001600160a01b039091169163132b1c9291611da8918691016124b3565b602060405180830381865afa158015611dc3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de7919061266e565b6004805460405163e2638ff160e01b81529293505f926001600160a01b039091169163e2638ff191611e1b918791016124b3565b602060405180830381865afa158015611e36573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e5a919061266e565b9050611e6783838361221a565b50505080611e7490612a51565b9050611d45565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038084165f908152600660205260409020541680611f0257604051635048c2af60e11b815260040160405180910390fd5b60405163095ea7b360e01b81526001600160a01b0385169063095ea7b390611f309084905f90600401612636565b6020604051808303815f875af1158015611f4c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f70919061264f565b5060405163095ea7b360e01b81526001600160a01b0385169063095ea7b390611f9f9084908790600401612636565b6020604051808303815f875af1158015611fbb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fdf919061264f565b50604051636c197ff560e01b81525f906001600160a01b03831690636c197ff5906120109088908890600401612636565b6020604051808303815f875af115801561202c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612050919061266e565b905061205c8382612a68565b600f5f82825461206c9190612a87565b90915550505050505050565b6001600160a01b038084165f9081526006602052604090205416806120b057604051635048c2af60e11b815260040160405180910390fd5b60055460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906120e29084905f90600401612636565b6020604051808303815f875af11580156120fe573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612122919061264f565b506005546001600160a01b031663095ea7b382612140856002612aae565b6040518363ffffffff1660e01b815260040161215d929190612636565b6020604051808303815f875af1158015612179573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061219d919061264f565b5060405163cce7ec1360e01b81525f906001600160a01b0383169063cce7ec13906121ce9088908890600401612636565b6020604051808303815f875af11580156121ea573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061220e919061266e565b905061205c8184612a68565b5f8390505f816001600160a01b031663f64c6f326040518163ffffffff1660e01b8152600401602060405180830381865afa15801561225b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061227f919061266e565b90505f826001600160a01b0316630a605c6d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122e2919061266e565b905081156123405760405163e5e9719360e01b8152600481018690526001600160a01b0384169063e5e97193906024015f604051808303815f87803b158015612329575f5ffd5b505af115801561233b573d5f5f3e3d5ffd5b505050505b80156114815760405163493a6e2160e01b8152600481018590526001600160a01b0384169063493a6e21906024015f604051808303815f87803b158015612385575f5ffd5b505af1158015612397573d5f5f3e3d5ffd5b50505050505050505050565b5080545f8255905f5260205f2090810190611669919061245a565b828054828255905f5260205f209081019282156123f7579160200282015b828111156123f75782518255916020019190600101906123dc565b5061240392915061245a565b5090565b828054828255905f5260205f209081019282156123f7579160200282015b828111156123f757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612425565b5b80821115612403575f815560010161245b565b5f6020828403121561247e575f5ffd5b5035919050565b634e487b7160e01b5f52602160045260245ffd5b60208101600483106124ad576124ad612485565b91905290565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114611669575f5ffd5b5f602082840312156124eb575f5ffd5b81356124f6816124c7565b9392505050565b5f5f6020838503121561250e575f5ffd5b82356001600160401b03811115612523575f5ffd5b8301601f81018513612533575f5ffd5b80356001600160401b03811115612548575f5ffd5b856020828401011115612559575f5ffd5b6020919091019590945092505050565b5f5f6040838503121561257a575f5ffd5b8235612585816124c7565b946020939093013593505050565b5f5f604083850312156125a4575f5ffd5b82356125af816124c7565b915060208301356125bf816124c7565b809150509250929050565b8215158152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b803560ff81168114612618575f5ffd5b919050565b5f6020828403121561262d575f5ffd5b6124f682612608565b6001600160a01b03929092168252602082015260400190565b5f6020828403121561265f575f5ffd5b815180151581146124f6575f5ffd5b5f6020828403121561267e575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b82016126ad576126ad612685565b505f0390565b5f5f604083850312156126c4575f5ffd5b82356001600160e01b0319811681146126db575f5ffd5b91506126e960208401612608565b90509250929050565b5f60208284031215612702575f5ffd5b815161ffff811681146124f6575f5ffd5b6001600160e01b031992909216825260ff16602082015260400190565b5f60208284031215612740575f5ffd5b81516124f6816124c7565b61ffff818116838216019081111561276557612765612685565b92915050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156127a7576127a761276b565b604052919050565b5f6001600160401b038211156127c7576127c761276b565b5060051b60200190565b5f82601f8301126127e0575f5ffd5b81516127f36127ee826127af565b61277f565b8082825260208201915060208360051b860101925085831115612814575f5ffd5b602085015b8381101561283a57805161282c816124c7565b835260209283019201612819565b5095945050505050565b5f82601f830112612853575f5ffd5b81516128616127ee826127af565b8082825260208201915060208360051b860101925085831115612882575f5ffd5b602085015b8381101561283a578051835260209283019201612887565b5f5f5f5f5f5f60c087890312156128b4575f5ffd5b86516001600160401b038111156128c9575f5ffd5b6128d589828a016127d1565b602089015190975090506001600160401b038111156128f2575f5ffd5b6128fe89828a01612844565b604089015190965090506001600160401b0381111561291b575f5ffd5b61292789828a016127d1565b606089015190955090506001600160401b03811115612944575f5ffd5b61295089828a01612844565b608089015190945090506001600160401b0381111561296d575f5ffd5b61297989828a01612844565b60a089015190935090506001600160401b03811115612996575f5ffd5b6129a289828a01612844565b9150509295509295509295565b5f60ff821660ff81036129c4576129c4612685565b60010192915050565b60ff81811683821602908116908181146129e9576129e9612685565b5092915050565b634e487b7160e01b5f52603260045260245ffd5b60208101600283106124ad576124ad612485565b5f60208284031215612a28575f5ffd5b81516001600160401b03811115612a3d575f5ffd5b612a49848285016127d1565b949350505050565b5f61ffff821661ffff81036129c4576129c4612685565b8181035f8312801583831316838312821617156129e9576129e9612685565b8082018281125f831280158216821582161715612aa657612aa6612685565b505092915050565b80820281158282048414176127655761276561268556fe2f2727c7b3d9ee55de5c114f0cb7997ac7251a4cbfca4f2b2dc6969d86cce4f4a2646970667358221220b4d3c450839684dfbd2ebc2753acd3292b49848f85789d0123d8b5c7d755211b64736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/price/OrionAssetERC4626PriceAdapter.sol/OrionAssetERC4626PriceAdapter.json b/artifacts/contracts/price/OrionAssetERC4626PriceAdapter.sol/OrionAssetERC4626PriceAdapter.json index 37f861c8..a6bcd83f 100644 --- a/artifacts/contracts/price/OrionAssetERC4626PriceAdapter.sol/OrionAssetERC4626PriceAdapter.json +++ b/artifacts/contracts/price/OrionAssetERC4626PriceAdapter.sol/OrionAssetERC4626PriceAdapter.json @@ -16,7 +16,7 @@ }, { "inputs": [], - "name": "InvalidAddress", + "name": "InvalidAdapter", "type": "error" }, { @@ -86,10 +86,29 @@ ], "stateMutability": "view", "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "validatePriceAdapter", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" } ], - "bytecode": "0x608060405234801561000f575f5ffd5b5060405161061638038061061683398101604081905261002e91610182565b6001600160a01b0381166100555760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b03831690811790915560408051631c56369f60e21b81529051637158da7c916004808201926020929091908290030181865afa1580156100ab573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100cf9190610182565b600180546001600160a01b0319166001600160a01b039290921691821790556040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa158015610127573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061014b91906101a4565b600160146101000a81548160ff021916908360ff160217905550506101c4565b6001600160a01b038116811461017f575f5ffd5b50565b5f60208284031215610192575f5ffd5b815161019d8161016b565b9392505050565b5f602082840312156101b4575f5ffd5b815160ff8116811461019d575f5ffd5b610445806101d15f395ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c80637158da7c1461004e57806372279ba11461007e57806379502c55146100a85780639a32c207146100ba575b5f5ffd5b600154610061906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61009161008c366004610294565b6100e0565b6040805192835260ff909116602083015201610075565b5f54610061906001600160a01b031681565b6001546100ce90600160a01b900460ff1681565b60405160ff9091168152602001610075565b5f5f826001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561013c575060408051601f3d908101601f19168201909252610139918101906102b6565b60015b6101595760405163e6c4247b60e01b815260040160405180910390fd5b6001546001600160a01b038281169116146101875760405163e6c4247b60e01b815260040160405180910390fd5b505f836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e991906102d1565b90505f6101f782600a6103ea565b6040516303d1689d60e11b8152600481018290529091505f906001600160a01b038716906307a2d13a90602401602060405180830381865afa15801561023f573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061026391906103f8565b6001549097600160a01b90910460ff169650945050505050565b6001600160a01b0381168114610291575f5ffd5b50565b5f602082840312156102a4575f5ffd5b81356102af8161027d565b9392505050565b5f602082840312156102c6575f5ffd5b81516102af8161027d565b5f602082840312156102e1575f5ffd5b815160ff811681146102af575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b600184111561034057808504811115610324576103246102f1565b600184161561033257908102905b60019390931c928002610309565b935093915050565b5f82610356575060016103e4565b8161036257505f6103e4565b816001811461037857600281146103825761039e565b60019150506103e4565b60ff841115610393576103936102f1565b50506001821b6103e4565b5060208310610133831016604e8410600b84101617156103c1575081810a6103e4565b6103cd5f198484610305565b805f19048211156103e0576103e06102f1565b0290505b92915050565b5f6102af60ff841683610348565b5f60208284031215610408575f5ffd5b505191905056fea2646970667358221220466071d29d15aaff9da084ed6c9143100e30e8502a7581a7b9ce0b4384e6899464736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061004a575f3560e01c80637158da7c1461004e57806372279ba11461007e57806379502c55146100a85780639a32c207146100ba575b5f5ffd5b600154610061906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61009161008c366004610294565b6100e0565b6040805192835260ff909116602083015201610075565b5f54610061906001600160a01b031681565b6001546100ce90600160a01b900460ff1681565b60405160ff9091168152602001610075565b5f5f826001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561013c575060408051601f3d908101601f19168201909252610139918101906102b6565b60015b6101595760405163e6c4247b60e01b815260040160405180910390fd5b6001546001600160a01b038281169116146101875760405163e6c4247b60e01b815260040160405180910390fd5b505f836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e991906102d1565b90505f6101f782600a6103ea565b6040516303d1689d60e11b8152600481018290529091505f906001600160a01b038716906307a2d13a90602401602060405180830381865afa15801561023f573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061026391906103f8565b6001549097600160a01b90910460ff169650945050505050565b6001600160a01b0381168114610291575f5ffd5b50565b5f602082840312156102a4575f5ffd5b81356102af8161027d565b9392505050565b5f602082840312156102c6575f5ffd5b81516102af8161027d565b5f602082840312156102e1575f5ffd5b815160ff811681146102af575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b600184111561034057808504811115610324576103246102f1565b600184161561033257908102905b60019390931c928002610309565b935093915050565b5f82610356575060016103e4565b8161036257505f6103e4565b816001811461037857600281146103825761039e565b60019150506103e4565b60ff841115610393576103936102f1565b50506001821b6103e4565b5060208310610133831016604e8410600b84101617156103c1575081810a6103e4565b6103cd5f198484610305565b805f19048211156103e0576103e06102f1565b0290505b92915050565b5f6102af60ff841683610348565b5f60208284031215610408575f5ffd5b505191905056fea2646970667358221220466071d29d15aaff9da084ed6c9143100e30e8502a7581a7b9ce0b4384e6899464736f6c634300081c0033", + "bytecode": "0x608060405234801561000f575f5ffd5b5060405161064d38038061064d83398101604081905261002e91610182565b6001600160a01b0381166100555760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b03831690811790915560408051631c56369f60e21b81529051637158da7c916004808201926020929091908290030181865afa1580156100ab573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100cf9190610182565b600180546001600160a01b0319166001600160a01b039290921691821790556040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa158015610127573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061014b91906101a4565b600160146101000a81548160ff021916908360ff160217905550506101c4565b6001600160a01b038116811461017f575f5ffd5b50565b5f60208284031215610192575f5ffd5b815161019d8161016b565b9392505050565b5f602082840312156101b4575f5ffd5b815160ff8116811461019d575f5ffd5b61047c806101d15f395ff3fe608060405234801561000f575f5ffd5b5060043610610055575f3560e01c80636ab8bdef146100595780637158da7c1461008157806372279ba1146100ac57806379502c55146100d65780639a32c207146100e8575b5f5ffd5b61006c6100673660046102cb565b61010e565b60405190151581526020015b60405180910390f35b600154610094906001600160a01b031681565b6040516001600160a01b039091168152602001610078565b6100bf6100ba3660046102cb565b6101bd565b6040805192835260ff909116602083015201610078565b5f54610094906001600160a01b031681565b6001546100fc90600160a01b900460ff1681565b60405160ff9091168152602001610078565b5f816001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610169575060408051601f3d908101601f19168201909252610166918101906102ed565b60015b6101865760405163fbf66df160e01b815260040160405180910390fd5b6001546001600160a01b038281169116146101b45760405163fbf66df160e01b815260040160405180910390fd5b50506001919050565b5f5f5f836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101fc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102209190610308565b90505f61022e82600a610421565b6040516303d1689d60e11b8152600481018290529091505f906001600160a01b038716906307a2d13a90602401602060405180830381865afa158015610276573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061029a919061042f565b6001549097600160a01b90910460ff169650945050505050565b6001600160a01b03811681146102c8575f5ffd5b50565b5f602082840312156102db575f5ffd5b81356102e6816102b4565b9392505050565b5f602082840312156102fd575f5ffd5b81516102e6816102b4565b5f60208284031215610318575f5ffd5b815160ff811681146102e6575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156103775780850481111561035b5761035b610328565b600184161561036957908102905b60019390931c928002610340565b935093915050565b5f8261038d5750600161041b565b8161039957505f61041b565b81600181146103af57600281146103b9576103d5565b600191505061041b565b60ff8411156103ca576103ca610328565b50506001821b61041b565b5060208310610133831016604e8410600b84101617156103f8575081810a61041b565b6104045f19848461033c565b805f190482111561041757610417610328565b0290505b92915050565b5f6102e660ff84168361037f565b5f6020828403121561043f575f5ffd5b505191905056fea2646970667358221220e06d27b60da844851eacaa762aab9c01a6623f879b0459957d02290d0a8e83fd64736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610055575f3560e01c80636ab8bdef146100595780637158da7c1461008157806372279ba1146100ac57806379502c55146100d65780639a32c207146100e8575b5f5ffd5b61006c6100673660046102cb565b61010e565b60405190151581526020015b60405180910390f35b600154610094906001600160a01b031681565b6040516001600160a01b039091168152602001610078565b6100bf6100ba3660046102cb565b6101bd565b6040805192835260ff909116602083015201610078565b5f54610094906001600160a01b031681565b6001546100fc90600160a01b900460ff1681565b60405160ff9091168152602001610078565b5f816001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610169575060408051601f3d908101601f19168201909252610166918101906102ed565b60015b6101865760405163fbf66df160e01b815260040160405180910390fd5b6001546001600160a01b038281169116146101b45760405163fbf66df160e01b815260040160405180910390fd5b50506001919050565b5f5f5f836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101fc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102209190610308565b90505f61022e82600a610421565b6040516303d1689d60e11b8152600481018290529091505f906001600160a01b038716906307a2d13a90602401602060405180830381865afa158015610276573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061029a919061042f565b6001549097600160a01b90910460ff169650945050505050565b6001600160a01b03811681146102c8575f5ffd5b50565b5f602082840312156102db575f5ffd5b81356102e6816102b4565b9392505050565b5f602082840312156102fd575f5ffd5b81516102e6816102b4565b5f60208284031215610318575f5ffd5b815160ff811681146102e6575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156103775780850481111561035b5761035b610328565b600184161561036957908102905b60019390931c928002610340565b935093915050565b5f8261038d5750600161041b565b8161039957505f61041b565b81600181146103af57600281146103b9576103d5565b600191505061041b565b60ff8411156103ca576103ca610328565b50506001821b61041b565b5060208310610133831016604e8410600b84101617156103f8575081810a61041b565b6104045f19848461033c565b805f190482111561041757610417610328565b0290505b92915050565b5f6102e660ff84168361037f565b5f6020828403121561043f575f5ffd5b505191905056fea2646970667358221220e06d27b60da844851eacaa762aab9c01a6623f879b0459957d02290d0a8e83fd64736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/price/PriceAdapterRegistry.sol/PriceAdapterRegistry.json b/artifacts/contracts/price/PriceAdapterRegistry.sol/PriceAdapterRegistry.json index f52376b1..bd2b7d8d 100644 --- a/artifacts/contracts/price/PriceAdapterRegistry.sol/PriceAdapterRegistry.json +++ b/artifacts/contracts/price/PriceAdapterRegistry.sol/PriceAdapterRegistry.json @@ -24,6 +24,11 @@ "name": "AdapterNotSet", "type": "error" }, + { + "inputs": [], + "name": "InvalidAdapter", + "type": "error" + }, { "inputs": [], "name": "NotAuthorized", @@ -223,8 +228,8 @@ "type": "function" } ], - "bytecode": "0x608060405234801561000f575f5ffd5b5060405161093038038061093083398101604081905261002e916101ba565b816001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61006581610150565b506001600160a01b03821661008d5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381166100b45760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040805163567ba71360e01b8152905163567ba713916004808201926020929091908290030181865afa15801561010b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061012f91906101eb565b600160146101000a81548160ff021916908360ff1602179055505050610212565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146101b5575f5ffd5b919050565b5f5f604083850312156101cb575f5ffd5b6101d48361019f565b91506101e26020840161019f565b90509250929050565b5f602082840312156101fb575f5ffd5b815160ff8116811461020b575f5ffd5b9392505050565b6107118061021f5f395ff3fe608060405234801561000f575f5ffd5b5060043610610081575f3560e01c806341976e091461008557806343860175146100ab5780634e0fdde0146100c0578063567ba713146100d3578063715018a6146100f95780638da5cb5b14610101578063c2b7a3e614610116578063d6c318711461013e578063f2fde38b14610151575b5f5ffd5b6100986100933660046104d3565b610164565b6040519081526020015b60405180910390f35b6100be6100b93660046104d3565b610231565b005b6100be6100ce3660046104ee565b6102c2565b6001546100e790600160a01b900460ff1681565b60405160ff90911681526020016100a2565b6100be61036b565b61010961037e565b6040516100a29190610525565b6101096101243660046104d3565b60026020525f90815260409020546001600160a01b031681565b600154610109906001600160a01b031681565b6100be61015f3660046104d3565b61038c565b6001600160a01b038082165f908152600260205260408120549091168061019e57604051635048c2af60e11b815260040160405180910390fd5b5f5f826001600160a01b03166372279ba1866040518263ffffffff1660e01b81526004016101cc9190610525565b6040805180830381865afa1580156101e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061020a9190610539565b915091506102288282600160149054906101000a900460ff166103d2565b95945050505050565b6001546001600160a01b0316331461025c5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0381166102835760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381165f8181526002602052604080822080546001600160a01b0319169055519091905f5160206106bc5f395f51905f52908390a350565b6001546001600160a01b031633146102ed5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b038216158061030a57506001600160a01b038116155b156103285760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038281165f8181526002602052604080822080546001600160a01b0319169486169485179055515f5160206106bc5f395f51905f529190a35050565b61037361043e565b61037c5f610470565b565b5f546001600160a01b031690565b61039461043e565b6001600160a01b0381166103c6575f604051631e4fbdf760e01b81526004016103bd9190610525565b60405180910390fd5b6103cf81610470565b50565b5f8260ff168260ff161115610407576103eb8383610575565b6103f690600a610677565b6104009085610685565b9050610437565b8260ff168260ff1610156104345761041f8284610575565b61042a90600a610677565b610400908561069c565b50825b9392505050565b3361044761037e565b6001600160a01b03161461037c573360405163118cdaa760e01b81526004016103bd9190610525565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103cf575f5ffd5b5f602082840312156104e3575f5ffd5b8135610437816104bf565b5f5f604083850312156104ff575f5ffd5b823561050a816104bf565b9150602083013561051a816104bf565b809150509250929050565b6001600160a01b0391909116815260200190565b5f5f6040838503121561054a575f5ffd5b82519150602083015160ff8116811461051a575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561058e5761058e610561565b92915050565b6001815b60018411156105cf578085048111156105b3576105b3610561565b60018416156105c157908102905b60019390931c928002610598565b935093915050565b5f826105e55750600161058e565b816105f157505f61058e565b816001811461060757600281146106115761062d565b600191505061058e565b60ff84111561062257610622610561565b50506001821b61058e565b5060208310610133831016604e8410600b8410161715610650575081810a61058e565b61065c5f198484610594565b805f190482111561066f5761066f610561565b029392505050565b5f61043760ff8416836105d7565b808202811582820484141761058e5761058e610561565b5f826106b657634e487b7160e01b5f52601260045260245ffd5b50049056fe53a93b0b200b6adfbf749bc775b2872ba3ff61fb09c81a53a5d0c4723c169f25a26469706673582212203a80a8bcc1ed1a844ee9073ac48c4d5c9b4afb5feb49b6c5d29c6af534f461bc64736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610081575f3560e01c806341976e091461008557806343860175146100ab5780634e0fdde0146100c0578063567ba713146100d3578063715018a6146100f95780638da5cb5b14610101578063c2b7a3e614610116578063d6c318711461013e578063f2fde38b14610151575b5f5ffd5b6100986100933660046104d3565b610164565b6040519081526020015b60405180910390f35b6100be6100b93660046104d3565b610231565b005b6100be6100ce3660046104ee565b6102c2565b6001546100e790600160a01b900460ff1681565b60405160ff90911681526020016100a2565b6100be61036b565b61010961037e565b6040516100a29190610525565b6101096101243660046104d3565b60026020525f90815260409020546001600160a01b031681565b600154610109906001600160a01b031681565b6100be61015f3660046104d3565b61038c565b6001600160a01b038082165f908152600260205260408120549091168061019e57604051635048c2af60e11b815260040160405180910390fd5b5f5f826001600160a01b03166372279ba1866040518263ffffffff1660e01b81526004016101cc9190610525565b6040805180830381865afa1580156101e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061020a9190610539565b915091506102288282600160149054906101000a900460ff166103d2565b95945050505050565b6001546001600160a01b0316331461025c5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0381166102835760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381165f8181526002602052604080822080546001600160a01b0319169055519091905f5160206106bc5f395f51905f52908390a350565b6001546001600160a01b031633146102ed5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b038216158061030a57506001600160a01b038116155b156103285760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038281165f8181526002602052604080822080546001600160a01b0319169486169485179055515f5160206106bc5f395f51905f529190a35050565b61037361043e565b61037c5f610470565b565b5f546001600160a01b031690565b61039461043e565b6001600160a01b0381166103c6575f604051631e4fbdf760e01b81526004016103bd9190610525565b60405180910390fd5b6103cf81610470565b50565b5f8260ff168260ff161115610407576103eb8383610575565b6103f690600a610677565b6104009085610685565b9050610437565b8260ff168260ff1610156104345761041f8284610575565b61042a90600a610677565b610400908561069c565b50825b9392505050565b3361044761037e565b6001600160a01b03161461037c573360405163118cdaa760e01b81526004016103bd9190610525565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103cf575f5ffd5b5f602082840312156104e3575f5ffd5b8135610437816104bf565b5f5f604083850312156104ff575f5ffd5b823561050a816104bf565b9150602083013561051a816104bf565b809150509250929050565b6001600160a01b0391909116815260200190565b5f5f6040838503121561054a575f5ffd5b82519150602083015160ff8116811461051a575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561058e5761058e610561565b92915050565b6001815b60018411156105cf578085048111156105b3576105b3610561565b60018416156105c157908102905b60019390931c928002610598565b935093915050565b5f826105e55750600161058e565b816105f157505f61058e565b816001811461060757600281146106115761062d565b600191505061058e565b60ff84111561062257610622610561565b50506001821b61058e565b5060208310610133831016604e8410600b8410161715610650575081810a61058e565b61065c5f198484610594565b805f190482111561066f5761066f610561565b029392505050565b5f61043760ff8416836105d7565b808202811582820484141761058e5761058e610561565b5f826106b657634e487b7160e01b5f52601260045260245ffd5b50049056fe53a93b0b200b6adfbf749bc775b2872ba3ff61fb09c81a53a5d0c4723c169f25a26469706673582212203a80a8bcc1ed1a844ee9073ac48c4d5c9b4afb5feb49b6c5d29c6af534f461bc64736f6c634300081c0033", + "bytecode": "0x608060405234801561000f575f5ffd5b506040516109d73803806109d783398101604081905261002e916101ba565b816001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61006581610150565b506001600160a01b03821661008d5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381166100b45760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040805163567ba71360e01b8152905163567ba713916004808201926020929091908290030181865afa15801561010b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061012f91906101eb565b600160146101000a81548160ff021916908360ff1602179055505050610212565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146101b5575f5ffd5b919050565b5f5f604083850312156101cb575f5ffd5b6101d48361019f565b91506101e26020840161019f565b90509250929050565b5f602082840312156101fb575f5ffd5b815160ff8116811461020b575f5ffd5b9392505050565b6107b88061021f5f395ff3fe608060405234801561000f575f5ffd5b5060043610610081575f3560e01c806341976e091461008557806343860175146100ab5780634e0fdde0146100c0578063567ba713146100d3578063715018a6146100f95780638da5cb5b14610101578063c2b7a3e614610116578063d6c318711461013e578063f2fde38b14610151575b5f5ffd5b61009861009336600461055b565b610164565b6040519081526020015b60405180910390f35b6100be6100b936600461055b565b610231565b005b6100be6100ce366004610576565b6102c2565b6001546100e790600160a01b900460ff1681565b60405160ff90911681526020016100a2565b6100be6103f3565b610109610406565b6040516100a291906105ad565b61010961012436600461055b565b60026020525f90815260409020546001600160a01b031681565b600154610109906001600160a01b031681565b6100be61015f36600461055b565b610414565b6001600160a01b038082165f908152600260205260408120549091168061019e57604051635048c2af60e11b815260040160405180910390fd5b5f5f826001600160a01b03166372279ba1866040518263ffffffff1660e01b81526004016101cc91906105ad565b6040805180830381865afa1580156101e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061020a91906105c1565b915091506102288282600160149054906101000a900460ff1661045a565b95945050505050565b6001546001600160a01b0316331461025c5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0381166102835760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381165f8181526002602052604080822080546001600160a01b0319169055519091905f5160206107635f395f51905f52908390a350565b6001546001600160a01b031633146102ed5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b038216158061030a57506001600160a01b038116155b156103285760405163d92e233d60e01b815260040160405180910390fd5b604051636ab8bdef60e01b81526001600160a01b03821690636ab8bdef906103549085906004016105ad565b602060405180830381865afa15801561036f573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039391906105e9565b6103b05760405163fbf66df160e01b815260040160405180910390fd5b6001600160a01b038281165f8181526002602052604080822080546001600160a01b0319169486169485179055515f5160206107635f395f51905f529190a35050565b6103fb6104c6565b6104045f6104f8565b565b5f546001600160a01b031690565b61041c6104c6565b6001600160a01b03811661044e575f604051631e4fbdf760e01b815260040161044591906105ad565b60405180910390fd5b610457816104f8565b50565b5f8260ff168260ff16111561048f57610473838361061c565b61047e90600a61071e565b610488908561072c565b90506104bf565b8260ff168260ff1610156104bc576104a7828461061c565b6104b290600a61071e565b6104889085610743565b50825b9392505050565b336104cf610406565b6001600160a01b031614610404573360405163118cdaa760e01b815260040161044591906105ad565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610457575f5ffd5b5f6020828403121561056b575f5ffd5b81356104bf81610547565b5f5f60408385031215610587575f5ffd5b823561059281610547565b915060208301356105a281610547565b809150509250929050565b6001600160a01b0391909116815260200190565b5f5f604083850312156105d2575f5ffd5b82519150602083015160ff811681146105a2575f5ffd5b5f602082840312156105f9575f5ffd5b815180151581146104bf575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561063557610635610608565b92915050565b6001815b60018411156106765780850481111561065a5761065a610608565b600184161561066857908102905b60019390931c92800261063f565b935093915050565b5f8261068c57506001610635565b8161069857505f610635565b81600181146106ae57600281146106b8576106d4565b6001915050610635565b60ff8411156106c9576106c9610608565b50506001821b610635565b5060208310610133831016604e8410600b84101617156106f7575081810a610635565b6107035f19848461063b565b805f190482111561071657610716610608565b029392505050565b5f6104bf60ff84168361067e565b808202811582820484141761063557610635610608565b5f8261075d57634e487b7160e01b5f52601260045260245ffd5b50049056fe53a93b0b200b6adfbf749bc775b2872ba3ff61fb09c81a53a5d0c4723c169f25a26469706673582212203e1c4dda9f17b52a0de460497aa5a3ec8fe74c934a41c14d6b43db94088ac24164736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610081575f3560e01c806341976e091461008557806343860175146100ab5780634e0fdde0146100c0578063567ba713146100d3578063715018a6146100f95780638da5cb5b14610101578063c2b7a3e614610116578063d6c318711461013e578063f2fde38b14610151575b5f5ffd5b61009861009336600461055b565b610164565b6040519081526020015b60405180910390f35b6100be6100b936600461055b565b610231565b005b6100be6100ce366004610576565b6102c2565b6001546100e790600160a01b900460ff1681565b60405160ff90911681526020016100a2565b6100be6103f3565b610109610406565b6040516100a291906105ad565b61010961012436600461055b565b60026020525f90815260409020546001600160a01b031681565b600154610109906001600160a01b031681565b6100be61015f36600461055b565b610414565b6001600160a01b038082165f908152600260205260408120549091168061019e57604051635048c2af60e11b815260040160405180910390fd5b5f5f826001600160a01b03166372279ba1866040518263ffffffff1660e01b81526004016101cc91906105ad565b6040805180830381865afa1580156101e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061020a91906105c1565b915091506102288282600160149054906101000a900460ff1661045a565b95945050505050565b6001546001600160a01b0316331461025c5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b0381166102835760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381165f8181526002602052604080822080546001600160a01b0319169055519091905f5160206107635f395f51905f52908390a350565b6001546001600160a01b031633146102ed5760405163ea8e4eb560e01b815260040160405180910390fd5b6001600160a01b038216158061030a57506001600160a01b038116155b156103285760405163d92e233d60e01b815260040160405180910390fd5b604051636ab8bdef60e01b81526001600160a01b03821690636ab8bdef906103549085906004016105ad565b602060405180830381865afa15801561036f573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039391906105e9565b6103b05760405163fbf66df160e01b815260040160405180910390fd5b6001600160a01b038281165f8181526002602052604080822080546001600160a01b0319169486169485179055515f5160206107635f395f51905f529190a35050565b6103fb6104c6565b6104045f6104f8565b565b5f546001600160a01b031690565b61041c6104c6565b6001600160a01b03811661044e575f604051631e4fbdf760e01b815260040161044591906105ad565b60405180910390fd5b610457816104f8565b50565b5f8260ff168260ff16111561048f57610473838361061c565b61047e90600a61071e565b610488908561072c565b90506104bf565b8260ff168260ff1610156104bc576104a7828461061c565b6104b290600a61071e565b6104889085610743565b50825b9392505050565b336104cf610406565b6001600160a01b031614610404573360405163118cdaa760e01b815260040161044591906105ad565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610457575f5ffd5b5f6020828403121561056b575f5ffd5b81356104bf81610547565b5f5f60408385031215610587575f5ffd5b823561059281610547565b915060208301356105a281610547565b809150509250929050565b6001600160a01b0391909116815260200190565b5f5f604083850312156105d2575f5ffd5b82519150602083015160ff811681146105a2575f5ffd5b5f602082840312156105f9575f5ffd5b815180151581146104bf575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561063557610635610608565b92915050565b6001815b60018411156106765780850481111561065a5761065a610608565b600184161561066857908102905b60019390931c92800261063f565b935093915050565b5f8261068c57506001610635565b8161069857505f610635565b81600181146106ae57600281146106b8576106d4565b6001915050610635565b60ff8411156106c9576106c9610608565b50506001821b610635565b5060208310610133831016604e8410600b84101617156106f7575081810a610635565b6107035f19848461063b565b805f190482111561071657610716610608565b029392505050565b5f6104bf60ff84168361067e565b808202811582820484141761063557610635610608565b5f8261075d57634e487b7160e01b5f52601260045260245ffd5b50049056fe53a93b0b200b6adfbf749bc775b2872ba3ff61fb09c81a53a5d0c4723c169f25a26469706673582212203e1c4dda9f17b52a0de460497aa5a3ec8fe74c934a41c14d6b43db94088ac24164736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/strategies/KBestTvlWeightedAverage.sol/KBestTvlWeightedAverage.json b/artifacts/contracts/strategies/KBestTvlWeightedAverage.sol/KBestTvlWeightedAverage.json index aff9eced..a00459e9 100644 --- a/artifacts/contracts/strategies/KBestTvlWeightedAverage.sol/KBestTvlWeightedAverage.json +++ b/artifacts/contracts/strategies/KBestTvlWeightedAverage.sol/KBestTvlWeightedAverage.json @@ -16,14 +16,19 @@ "type": "address" }, { - "internalType": "uint8", + "internalType": "uint16", "name": "_k", - "type": "uint8" + "type": "uint16" } ], "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [], + "name": "InvalidStrategy", + "type": "error" + }, { "inputs": [ { @@ -119,9 +124,9 @@ "name": "k", "outputs": [ { - "internalType": "uint8", + "internalType": "uint16", "name": "", - "type": "uint8" + "type": "uint16" } ], "stateMutability": "view", @@ -182,19 +187,32 @@ { "inputs": [ { - "internalType": "uint8", + "internalType": "uint16", "name": "kNew", - "type": "uint8" + "type": "uint16" } ], "name": "updateParameters", "outputs": [], "stateMutability": "nonpayable", "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "vaultWhitelistedAssets", + "type": "address[]" + } + ], + "name": "validateStrategy", + "outputs": [], + "stateMutability": "view", + "type": "function" } ], - "bytecode": "0x608060405234801561000f575f5ffd5b50604051610dfd380380610dfd83398101604081905261002e9161012a565b826001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b610065816100c0565b506001600160a01b03821661008d5760405163d92e233d60e01b815260040160405180910390fd5b6001805460ff909216600160a01b026001600160a81b03199092166001600160a01b039093169290921717905550610173565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114610125575f5ffd5b919050565b5f5f5f6060848603121561013c575f5ffd5b6101458461010f565b92506101536020850161010f565b9150604084015160ff81168114610168575f5ffd5b809150509250925092565b610c7d806101805f395ff3fe608060405234801561000f575f5ffd5b5060043610610076575f3560e01c806301ffc9a71461007a578063701a8185146100a2578063715018a6146100c257806379502c55146100cc5780638da5cb5b146100ec578063b4f40c61146100f4578063cbe307a21461011a578063f2fde38b1461012d575b5f5ffd5b61008d6100883660046108f8565b610140565b60405190151581526020015b60405180910390f35b6100b56100b036600461091f565b610176565b604051610099919061098e565b6100ca6101d1565b005b6001546100df906001600160a01b031681565b60405161009991906109eb565b6100df6101e4565b60015461010890600160a01b900460ff1681565b60405160ff9091168152602001610099565b6100ca610128366004610a0d565b6101f2565b6100ca61013b366004610a28565b61021a565b5f6001600160e01b0319821663701a818560e01b148061017057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060815f610185858380610260565b6001549091505f906101a59060ff600160a01b9091048116908516610372565b90505f5f6101b68888868887610384565b915091506101c58282856105c8565b98975050505050505050565b6101d9610877565b6101e25f6108a9565b565b5f546001600160a01b031690565b6101fa610877565b6001805460ff909216600160a01b0260ff60a01b19909216919091179055565b610222610877565b6001600160a01b038116610254575f604051631e4fbdf760e01b815260040161024b91906109eb565b60405180910390fd5b61025d816108a9565b50565b60608160ff166001600160401b0381111561027d5761027d610a4e565b6040519080825280602002602001820160405280156102a6578160200160208202803683370190505b5090505f5b8260ff168160ff16101561036a5784848260ff168181106102ce576102ce610a62565b90506020020160208101906102e39190610a28565b6001600160a01b03166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa15801561031e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103429190610a76565b828260ff168151811061035757610357610a62565b60209081029190910101526001016102ab565b509392505050565b5f8282188284100282185b9392505050565b6060808260ff166001600160401b038111156103a2576103a2610a4e565b6040519080825280602002602001820160405280156103cb578160200160208202803683370190505b5091508260ff166001600160401b038111156103e9576103e9610a4e565b604051908082528060200260200182016040528015610412578160200160208202803683370190505b5090505f8460ff166001600160401b0381111561043157610431610a4e565b60405190808252806020026020018201604052801561045a578160200160208202803683370190505b5090505f5b8460ff168160ff1610156105bc575f80805b8860ff168160ff1610156104f757848160ff168151811061049457610494610a62565b60200260200101511580156104c45750828a8260ff16815181106104ba576104ba610a62565b6020026020010151115b156104ef57898160ff16815181106104de576104de610a62565b602002602001015192508060ff1691505b600101610471565b50600184828151811061050c5761050c610a62565b911515602092830291909101909101528a8a8281811061052e5761052e610a62565b90506020020160208101906105439190610a28565b868460ff168151811061055857610558610a62565b60200260200101906001600160a01b031690816001600160a01b03168152505088818151811061058a5761058a610a62565b6020026020010151858460ff16815181106105a7576105a7610a62565b6020908102919091010152505060010161045f565b50509550959350505050565b60605f805b8360ff168160ff16101561060d57848160ff16815181106105f0576105f0610a62565b6020026020010151826106039190610aa1565b91506001016105cd565b506001546040805163d1717c7d60e01b815290515f926001600160a01b03169163d1717c7d9160048083019260209291908290030181865afa158015610655573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106799190610ab4565b61068490600a610bb2565b90508360ff166001600160401b038111156106a1576106a1610a4e565b6040519080825280602002602001820160405280156106e557816020015b604080518082019091525f80825260208201528152602001906001900390816106bf5790505b5092505f805b8560ff168160ff1610156107aa575f848463ffffffff16898460ff168151811061071757610717610a62565b60200260200101516107299190610bc0565b6107339190610bd7565b905060405180604001604052808a8460ff168151811061075557610755610a62565b60200260200101516001600160a01b031681526020018263ffffffff16815250868360ff168151811061078a5761078a610a62565b602090810291909101015261079f8184610bf6565b9250506001016106eb565b508163ffffffff168163ffffffff16101561080e576107c98183610c12565b846107d5600188610c2e565b60ff16815181106107e8576107e8610a62565b60200260200101516020018181516108009190610bf6565b63ffffffff1690525061086d565b8163ffffffff168163ffffffff16111561086d5761082c8282610c12565b84610838600188610c2e565b60ff168151811061084b5761084b610a62565b60200260200101516020018181516108639190610c12565b63ffffffff169052505b5050509392505050565b336108806101e4565b6001600160a01b0316146101e2573360405163118cdaa760e01b815260040161024b91906109eb565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610908575f5ffd5b81356001600160e01b03198116811461037d575f5ffd5b5f5f60208385031215610930575f5ffd5b82356001600160401b03811115610945575f5ffd5b8301601f81018513610955575f5ffd5b80356001600160401b0381111561096a575f5ffd5b8560208260051b840101111561097e575f5ffd5b6020919091019590945092505050565b602080825282518282018190525f918401906040840190835b818110156109e057835180516001600160a01b0316845260209081015163ffffffff1681850152909301926040909201916001016109a7565b509095945050505050565b6001600160a01b0391909116815260200190565b60ff8116811461025d575f5ffd5b5f60208284031215610a1d575f5ffd5b813561037d816109ff565b5f60208284031215610a38575f5ffd5b81356001600160a01b038116811461037d575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610a86575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561017057610170610a8d565b5f60208284031215610ac4575f5ffd5b815161037d816109ff565b6001815b6001841115610b0a57808504811115610aee57610aee610a8d565b6001841615610afc57908102905b60019390931c928002610ad3565b935093915050565b5f82610b2057506001610170565b81610b2c57505f610170565b8160018114610b425760028114610b4c57610b68565b6001915050610170565b60ff841115610b5d57610b5d610a8d565b50506001821b610170565b5060208310610133831016604e8410600b8410161715610b8b575081810a610170565b610b975f198484610acf565b805f1904821115610baa57610baa610a8d565b029392505050565b5f61037d60ff841683610b12565b808202811582820484141761017057610170610a8d565b5f82610bf157634e487b7160e01b5f52601260045260245ffd5b500490565b63ffffffff818116838216019081111561017057610170610a8d565b63ffffffff828116828216039081111561017057610170610a8d565b60ff828116828216039081111561017057610170610a8d56fea2646970667358221220e5df41c3afe31b9e292dd2319a3be313c4974ddfdda82dce04edd726e2826aa464736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610076575f3560e01c806301ffc9a71461007a578063701a8185146100a2578063715018a6146100c257806379502c55146100cc5780638da5cb5b146100ec578063b4f40c61146100f4578063cbe307a21461011a578063f2fde38b1461012d575b5f5ffd5b61008d6100883660046108f8565b610140565b60405190151581526020015b60405180910390f35b6100b56100b036600461091f565b610176565b604051610099919061098e565b6100ca6101d1565b005b6001546100df906001600160a01b031681565b60405161009991906109eb565b6100df6101e4565b60015461010890600160a01b900460ff1681565b60405160ff9091168152602001610099565b6100ca610128366004610a0d565b6101f2565b6100ca61013b366004610a28565b61021a565b5f6001600160e01b0319821663701a818560e01b148061017057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060815f610185858380610260565b6001549091505f906101a59060ff600160a01b9091048116908516610372565b90505f5f6101b68888868887610384565b915091506101c58282856105c8565b98975050505050505050565b6101d9610877565b6101e25f6108a9565b565b5f546001600160a01b031690565b6101fa610877565b6001805460ff909216600160a01b0260ff60a01b19909216919091179055565b610222610877565b6001600160a01b038116610254575f604051631e4fbdf760e01b815260040161024b91906109eb565b60405180910390fd5b61025d816108a9565b50565b60608160ff166001600160401b0381111561027d5761027d610a4e565b6040519080825280602002602001820160405280156102a6578160200160208202803683370190505b5090505f5b8260ff168160ff16101561036a5784848260ff168181106102ce576102ce610a62565b90506020020160208101906102e39190610a28565b6001600160a01b03166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa15801561031e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103429190610a76565b828260ff168151811061035757610357610a62565b60209081029190910101526001016102ab565b509392505050565b5f8282188284100282185b9392505050565b6060808260ff166001600160401b038111156103a2576103a2610a4e565b6040519080825280602002602001820160405280156103cb578160200160208202803683370190505b5091508260ff166001600160401b038111156103e9576103e9610a4e565b604051908082528060200260200182016040528015610412578160200160208202803683370190505b5090505f8460ff166001600160401b0381111561043157610431610a4e565b60405190808252806020026020018201604052801561045a578160200160208202803683370190505b5090505f5b8460ff168160ff1610156105bc575f80805b8860ff168160ff1610156104f757848160ff168151811061049457610494610a62565b60200260200101511580156104c45750828a8260ff16815181106104ba576104ba610a62565b6020026020010151115b156104ef57898160ff16815181106104de576104de610a62565b602002602001015192508060ff1691505b600101610471565b50600184828151811061050c5761050c610a62565b911515602092830291909101909101528a8a8281811061052e5761052e610a62565b90506020020160208101906105439190610a28565b868460ff168151811061055857610558610a62565b60200260200101906001600160a01b031690816001600160a01b03168152505088818151811061058a5761058a610a62565b6020026020010151858460ff16815181106105a7576105a7610a62565b6020908102919091010152505060010161045f565b50509550959350505050565b60605f805b8360ff168160ff16101561060d57848160ff16815181106105f0576105f0610a62565b6020026020010151826106039190610aa1565b91506001016105cd565b506001546040805163d1717c7d60e01b815290515f926001600160a01b03169163d1717c7d9160048083019260209291908290030181865afa158015610655573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106799190610ab4565b61068490600a610bb2565b90508360ff166001600160401b038111156106a1576106a1610a4e565b6040519080825280602002602001820160405280156106e557816020015b604080518082019091525f80825260208201528152602001906001900390816106bf5790505b5092505f805b8560ff168160ff1610156107aa575f848463ffffffff16898460ff168151811061071757610717610a62565b60200260200101516107299190610bc0565b6107339190610bd7565b905060405180604001604052808a8460ff168151811061075557610755610a62565b60200260200101516001600160a01b031681526020018263ffffffff16815250868360ff168151811061078a5761078a610a62565b602090810291909101015261079f8184610bf6565b9250506001016106eb565b508163ffffffff168163ffffffff16101561080e576107c98183610c12565b846107d5600188610c2e565b60ff16815181106107e8576107e8610a62565b60200260200101516020018181516108009190610bf6565b63ffffffff1690525061086d565b8163ffffffff168163ffffffff16111561086d5761082c8282610c12565b84610838600188610c2e565b60ff168151811061084b5761084b610a62565b60200260200101516020018181516108639190610c12565b63ffffffff169052505b5050509392505050565b336108806101e4565b6001600160a01b0316146101e2573360405163118cdaa760e01b815260040161024b91906109eb565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610908575f5ffd5b81356001600160e01b03198116811461037d575f5ffd5b5f5f60208385031215610930575f5ffd5b82356001600160401b03811115610945575f5ffd5b8301601f81018513610955575f5ffd5b80356001600160401b0381111561096a575f5ffd5b8560208260051b840101111561097e575f5ffd5b6020919091019590945092505050565b602080825282518282018190525f918401906040840190835b818110156109e057835180516001600160a01b0316845260209081015163ffffffff1681850152909301926040909201916001016109a7565b509095945050505050565b6001600160a01b0391909116815260200190565b60ff8116811461025d575f5ffd5b5f60208284031215610a1d575f5ffd5b813561037d816109ff565b5f60208284031215610a38575f5ffd5b81356001600160a01b038116811461037d575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610a86575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561017057610170610a8d565b5f60208284031215610ac4575f5ffd5b815161037d816109ff565b6001815b6001841115610b0a57808504811115610aee57610aee610a8d565b6001841615610afc57908102905b60019390931c928002610ad3565b935093915050565b5f82610b2057506001610170565b81610b2c57505f610170565b8160018114610b425760028114610b4c57610b68565b6001915050610170565b60ff841115610b5d57610b5d610a8d565b50506001821b610170565b5060208310610133831016604e8410600b8410161715610b8b575081810a610170565b610b975f198484610acf565b805f1904821115610baa57610baa610a8d565b029392505050565b5f61037d60ff841683610b12565b808202811582820484141761017057610170610a8d565b5f82610bf157634e487b7160e01b5f52601260045260245ffd5b500490565b63ffffffff818116838216019081111561017057610170610a8d565b63ffffffff828116828216039081111561017057610170610a8d565b60ff828116828216039081111561017057610170610a8d56fea2646970667358221220e5df41c3afe31b9e292dd2319a3be313c4974ddfdda82dce04edd726e2826aa464736f6c634300081c0033", + "bytecode": "0x608060405234801561000f575f5ffd5b50604051610feb380380610feb83398101604081905261002e9161012b565b826001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b610065816100c1565b506001600160a01b03821661008d5760405163d92e233d60e01b815260040160405180910390fd5b6001805461ffff909216600160a01b026001600160b01b03199092166001600160a01b039093169290921717905550610175565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114610126575f5ffd5b919050565b5f5f5f6060848603121561013d575f5ffd5b61014684610110565b925061015460208501610110565b9150604084015161ffff8116811461016a575f5ffd5b809150509250925092565b610e69806101825f395ff3fe608060405234801561000f575f5ffd5b5060043610610081575f3560e01c806301ffc9a7146100855780632fc12f41146100ad578063701a8185146100c2578063715018a6146100e257806379502c55146100ea5780638da5cb5b1461010a578063b4f40c6114610112578063c653526b1461013a578063f2fde38b1461014d575b5f5ffd5b610098610093366004610ac2565b610160565b60405190151581526020015b60405180910390f35b6100c06100bb366004610ae9565b610196565b005b6100d56100d0366004610b0a565b6101c0565b6040516100a49190610b79565b6100c061021c565b6001546100fd906001600160a01b031681565b6040516100a49190610bd6565b6100fd61022f565b60015461012790600160a01b900461ffff1681565b60405161ffff90911681526020016100a4565b6100c0610148366004610b0a565b61023d565b6100c061015b366004610bfe565b6103c7565b5f6001600160e01b03198216635b24e9f760e11b148061019057506301ffc9a760e01b6001600160e01b03198316145b92915050565b61019e61040d565b6001805461ffff909216600160a01b0261ffff60a01b19909216919091179055565b6060815f6101cf85838061043f565b6001549091505f906101f09061ffff600160a01b9091048116908516610556565b90505f5f6102018888868887610568565b915091506102108282856107b9565b98975050505050505050565b61022461040d565b61022d5f610a73565b565b5f546001600160a01b031690565b805f805b8261ffff168161ffff1610156103c0575f85858361ffff1681811061026857610268610c19565b905060200201602081019061027d9190610bfe565b9050806001600160a01b03166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156102d9575060408051601f3d908101601f191682019092526102d691810190610c2d565b60015b6102f657604051632711b74d60e11b815260040160405180910390fd5b50806001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610351575060408051601f3d908101601f1916820190925261034e91810190610c44565b60015b61036e57604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b038416610384578093506103b6565b836001600160a01b0316816001600160a01b0316146103b657604051632711b74d60e11b815260040160405180910390fd5b5050600101610241565b5050505050565b6103cf61040d565b6001600160a01b038116610401575f604051631e4fbdf760e01b81526004016103f89190610bd6565b60405180910390fd5b61040a81610a73565b50565b3361041661022f565b6001600160a01b03161461022d573360405163118cdaa760e01b81526004016103f89190610bd6565b60608161ffff166001600160401b0381111561045d5761045d610c5f565b604051908082528060200260200182016040528015610486578160200160208202803683370190505b5090505f5b8261ffff168161ffff16101561054e5784848261ffff168181106104b1576104b1610c19565b90506020020160208101906104c69190610bfe565b6001600160a01b03166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105259190610c2d565b828261ffff168151811061053b5761053b610c19565b602090810291909101015260010161048b565b509392505050565b5f8282188284100282185b9392505050565b6060808261ffff166001600160401b0381111561058757610587610c5f565b6040519080825280602002602001820160405280156105b0578160200160208202803683370190505b5091508261ffff166001600160401b038111156105cf576105cf610c5f565b6040519080825280602002602001820160405280156105f8578160200160208202803683370190505b5090505f8461ffff166001600160401b0381111561061857610618610c5f565b604051908082528060200260200182016040528015610641578160200160208202803683370190505b5090505f5b8461ffff168161ffff1610156107ad575f80805b8861ffff168161ffff1610156106e657848161ffff168151811061068057610680610c19565b60200260200101511580156106b15750828a8261ffff16815181106106a7576106a7610c19565b6020026020010151115b156106de57898161ffff16815181106106cc576106cc610c19565b602002602001015192508061ffff1691505b60010161065a565b5060018482815181106106fb576106fb610c19565b911515602092830291909101909101528a8a8281811061071d5761071d610c19565b90506020020160208101906107329190610bfe565b868461ffff168151811061074857610748610c19565b60200260200101906001600160a01b031690816001600160a01b03168152505088818151811061077a5761077a610c19565b6020026020010151858461ffff168151811061079857610798610c19565b60209081029190910101525050600101610646565b50509550959350505050565b60605f805b8361ffff168161ffff16101561080157848161ffff16815181106107e4576107e4610c19565b6020026020010151826107f79190610c87565b91506001016107be565b506001546040805163d1717c7d60e01b815290515f926001600160a01b03169163d1717c7d9160048083019260209291908290030181865afa158015610849573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061086d9190610c9a565b61087890600a610d9d565b90508361ffff166001600160401b0381111561089657610896610c5f565b6040519080825280602002602001820160405280156108da57816020015b604080518082019091525f80825260208201528152602001906001900390816108b45790505b5092505f805b8561ffff168161ffff1610156109a4575f848463ffffffff16898461ffff168151811061090f5761090f610c19565b60200260200101516109219190610dab565b61092b9190610dc2565b905060405180604001604052808a8461ffff168151811061094e5761094e610c19565b60200260200101516001600160a01b031681526020018263ffffffff16815250868361ffff168151811061098457610984610c19565b60209081029190910101526109998184610de1565b9250506001016108e0565b508163ffffffff168163ffffffff161015610a09576109c38183610dfd565b846109cf600188610e19565b61ffff16815181106109e3576109e3610c19565b60200260200101516020018181516109fb9190610de1565b63ffffffff16905250610a69565b8163ffffffff168163ffffffff161115610a6957610a278282610dfd565b84610a33600188610e19565b61ffff1681518110610a4757610a47610c19565b6020026020010151602001818151610a5f9190610dfd565b63ffffffff169052505b5050509392505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610ad2575f5ffd5b81356001600160e01b031981168114610561575f5ffd5b5f60208284031215610af9575f5ffd5b813561ffff81168114610561575f5ffd5b5f5f60208385031215610b1b575f5ffd5b82356001600160401b03811115610b30575f5ffd5b8301601f81018513610b40575f5ffd5b80356001600160401b03811115610b55575f5ffd5b8560208260051b8401011115610b69575f5ffd5b6020919091019590945092505050565b602080825282518282018190525f918401906040840190835b81811015610bcb57835180516001600160a01b0316845260209081015163ffffffff168185015290930192604090920191600101610b92565b509095945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b038116811461040a575f5ffd5b5f60208284031215610c0e575f5ffd5b813561056181610bea565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610c3d575f5ffd5b5051919050565b5f60208284031215610c54575f5ffd5b815161056181610bea565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561019057610190610c73565b5f60208284031215610caa575f5ffd5b815160ff81168114610561575f5ffd5b6001815b6001841115610cf557808504811115610cd957610cd9610c73565b6001841615610ce757908102905b60019390931c928002610cbe565b935093915050565b5f82610d0b57506001610190565b81610d1757505f610190565b8160018114610d2d5760028114610d3757610d53565b6001915050610190565b60ff841115610d4857610d48610c73565b50506001821b610190565b5060208310610133831016604e8410600b8410161715610d76575081810a610190565b610d825f198484610cba565b805f1904821115610d9557610d95610c73565b029392505050565b5f61056160ff841683610cfd565b808202811582820484141761019057610190610c73565b5f82610ddc57634e487b7160e01b5f52601260045260245ffd5b500490565b63ffffffff818116838216019081111561019057610190610c73565b63ffffffff828116828216039081111561019057610190610c73565b61ffff828116828216039081111561019057610190610c7356fea2646970667358221220f329c2f32ecca83e547abab833be8bdcc502ef2aae7db4da41345e6cb0dafe4264736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610081575f3560e01c806301ffc9a7146100855780632fc12f41146100ad578063701a8185146100c2578063715018a6146100e257806379502c55146100ea5780638da5cb5b1461010a578063b4f40c6114610112578063c653526b1461013a578063f2fde38b1461014d575b5f5ffd5b610098610093366004610ac2565b610160565b60405190151581526020015b60405180910390f35b6100c06100bb366004610ae9565b610196565b005b6100d56100d0366004610b0a565b6101c0565b6040516100a49190610b79565b6100c061021c565b6001546100fd906001600160a01b031681565b6040516100a49190610bd6565b6100fd61022f565b60015461012790600160a01b900461ffff1681565b60405161ffff90911681526020016100a4565b6100c0610148366004610b0a565b61023d565b6100c061015b366004610bfe565b6103c7565b5f6001600160e01b03198216635b24e9f760e11b148061019057506301ffc9a760e01b6001600160e01b03198316145b92915050565b61019e61040d565b6001805461ffff909216600160a01b0261ffff60a01b19909216919091179055565b6060815f6101cf85838061043f565b6001549091505f906101f09061ffff600160a01b9091048116908516610556565b90505f5f6102018888868887610568565b915091506102108282856107b9565b98975050505050505050565b61022461040d565b61022d5f610a73565b565b5f546001600160a01b031690565b805f805b8261ffff168161ffff1610156103c0575f85858361ffff1681811061026857610268610c19565b905060200201602081019061027d9190610bfe565b9050806001600160a01b03166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156102d9575060408051601f3d908101601f191682019092526102d691810190610c2d565b60015b6102f657604051632711b74d60e11b815260040160405180910390fd5b50806001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610351575060408051601f3d908101601f1916820190925261034e91810190610c44565b60015b61036e57604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b038416610384578093506103b6565b836001600160a01b0316816001600160a01b0316146103b657604051632711b74d60e11b815260040160405180910390fd5b5050600101610241565b5050505050565b6103cf61040d565b6001600160a01b038116610401575f604051631e4fbdf760e01b81526004016103f89190610bd6565b60405180910390fd5b61040a81610a73565b50565b3361041661022f565b6001600160a01b03161461022d573360405163118cdaa760e01b81526004016103f89190610bd6565b60608161ffff166001600160401b0381111561045d5761045d610c5f565b604051908082528060200260200182016040528015610486578160200160208202803683370190505b5090505f5b8261ffff168161ffff16101561054e5784848261ffff168181106104b1576104b1610c19565b90506020020160208101906104c69190610bfe565b6001600160a01b03166301e1d1146040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105259190610c2d565b828261ffff168151811061053b5761053b610c19565b602090810291909101015260010161048b565b509392505050565b5f8282188284100282185b9392505050565b6060808261ffff166001600160401b0381111561058757610587610c5f565b6040519080825280602002602001820160405280156105b0578160200160208202803683370190505b5091508261ffff166001600160401b038111156105cf576105cf610c5f565b6040519080825280602002602001820160405280156105f8578160200160208202803683370190505b5090505f8461ffff166001600160401b0381111561061857610618610c5f565b604051908082528060200260200182016040528015610641578160200160208202803683370190505b5090505f5b8461ffff168161ffff1610156107ad575f80805b8861ffff168161ffff1610156106e657848161ffff168151811061068057610680610c19565b60200260200101511580156106b15750828a8261ffff16815181106106a7576106a7610c19565b6020026020010151115b156106de57898161ffff16815181106106cc576106cc610c19565b602002602001015192508061ffff1691505b60010161065a565b5060018482815181106106fb576106fb610c19565b911515602092830291909101909101528a8a8281811061071d5761071d610c19565b90506020020160208101906107329190610bfe565b868461ffff168151811061074857610748610c19565b60200260200101906001600160a01b031690816001600160a01b03168152505088818151811061077a5761077a610c19565b6020026020010151858461ffff168151811061079857610798610c19565b60209081029190910101525050600101610646565b50509550959350505050565b60605f805b8361ffff168161ffff16101561080157848161ffff16815181106107e4576107e4610c19565b6020026020010151826107f79190610c87565b91506001016107be565b506001546040805163d1717c7d60e01b815290515f926001600160a01b03169163d1717c7d9160048083019260209291908290030181865afa158015610849573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061086d9190610c9a565b61087890600a610d9d565b90508361ffff166001600160401b0381111561089657610896610c5f565b6040519080825280602002602001820160405280156108da57816020015b604080518082019091525f80825260208201528152602001906001900390816108b45790505b5092505f805b8561ffff168161ffff1610156109a4575f848463ffffffff16898461ffff168151811061090f5761090f610c19565b60200260200101516109219190610dab565b61092b9190610dc2565b905060405180604001604052808a8461ffff168151811061094e5761094e610c19565b60200260200101516001600160a01b031681526020018263ffffffff16815250868361ffff168151811061098457610984610c19565b60209081029190910101526109998184610de1565b9250506001016108e0565b508163ffffffff168163ffffffff161015610a09576109c38183610dfd565b846109cf600188610e19565b61ffff16815181106109e3576109e3610c19565b60200260200101516020018181516109fb9190610de1565b63ffffffff16905250610a69565b8163ffffffff168163ffffffff161115610a6957610a278282610dfd565b84610a33600188610e19565b61ffff1681518110610a4757610a47610c19565b6020026020010151602001818151610a5f9190610dfd565b63ffffffff169052505b5050509392505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610ad2575f5ffd5b81356001600160e01b031981168114610561575f5ffd5b5f60208284031215610af9575f5ffd5b813561ffff81168114610561575f5ffd5b5f5f60208385031215610b1b575f5ffd5b82356001600160401b03811115610b30575f5ffd5b8301601f81018513610b40575f5ffd5b80356001600160401b03811115610b55575f5ffd5b8560208260051b8401011115610b69575f5ffd5b6020919091019590945092505050565b602080825282518282018190525f918401906040840190835b81811015610bcb57835180516001600160a01b0316845260209081015163ffffffff168185015290930192604090920191600101610b92565b509095945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b038116811461040a575f5ffd5b5f60208284031215610c0e575f5ffd5b813561056181610bea565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610c3d575f5ffd5b5051919050565b5f60208284031215610c54575f5ffd5b815161056181610bea565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561019057610190610c73565b5f60208284031215610caa575f5ffd5b815160ff81168114610561575f5ffd5b6001815b6001841115610cf557808504811115610cd957610cd9610c73565b6001841615610ce757908102905b60019390931c928002610cbe565b935093915050565b5f82610d0b57506001610190565b81610d1757505f610190565b8160018114610d2d5760028114610d3757610d53565b6001915050610190565b60ff841115610d4857610d48610c73565b50506001821b610190565b5060208310610133831016604e8410600b8410161715610d76575081810a610190565b610d825f198484610cba565b805f1904821115610d9557610d95610c73565b029392505050565b5f61056160ff841683610cfd565b808202811582820484141761019057610190610c73565b5f82610ddc57634e487b7160e01b5f52601260045260245ffd5b500490565b63ffffffff818116838216019081111561019057610190610c73565b63ffffffff828116828216039081111561019057610190610c73565b61ffff828116828216039081111561019057610190610c7356fea2646970667358221220f329c2f32ecca83e547abab833be8bdcc502ef2aae7db4da41345e6cb0dafe4264736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/test/UtilitiesLibTest.sol/UtilitiesLibTest.json b/artifacts/contracts/test/UtilitiesLibTest.sol/UtilitiesLibTest.json new file mode 100644 index 00000000..ae795397 --- /dev/null +++ b/artifacts/contracts/test/UtilitiesLibTest.sol/UtilitiesLibTest.json @@ -0,0 +1,40 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "UtilitiesLibTest", + "sourceName": "contracts/test/UtilitiesLibTest.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "fromDecimals", + "type": "uint8" + }, + { + "internalType": "uint8", + "name": "toDecimals", + "type": "uint8" + } + ], + "name": "convertDecimals", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x6080604052348015600e575f5ffd5b506102b08061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c80636ae649051461002d575b5f5ffd5b61004061003b3660046100e7565b610052565b60405190815260200160405180910390f35b5f61005e848484610068565b90505b9392505050565b5f8260ff168260ff16111561009d576100818383610134565b61008c90600a610236565b6100969085610244565b9050610061565b8260ff168260ff1610156100ca576100b58284610134565b6100c090600a610236565b610096908561025b565b509192915050565b803560ff811681146100e2575f5ffd5b919050565b5f5f5f606084860312156100f9575f5ffd5b83359250610109602085016100d2565b9150610117604085016100d2565b90509250925092565b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561014d5761014d610120565b92915050565b6001815b600184111561018e5780850481111561017257610172610120565b600184161561018057908102905b60019390931c928002610157565b935093915050565b5f826101a45750600161014d565b816101b057505f61014d565b81600181146101c657600281146101d0576101ec565b600191505061014d565b60ff8411156101e1576101e1610120565b50506001821b61014d565b5060208310610133831016604e8410600b841016171561020f575081810a61014d565b61021b5f198484610153565b805f190482111561022e5761022e610120565b029392505050565b5f61006160ff841683610196565b808202811582820484141761014d5761014d610120565b5f8261027557634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212208bc08842139c3b27f619a53f027dae900a98869ba508c3f45f952430de61e67064736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b5060043610610029575f3560e01c80636ae649051461002d575b5f5ffd5b61004061003b3660046100e7565b610052565b60405190815260200160405180910390f35b5f61005e848484610068565b90505b9392505050565b5f8260ff168260ff16111561009d576100818383610134565b61008c90600a610236565b6100969085610244565b9050610061565b8260ff168260ff1610156100ca576100b58284610134565b6100c090600a610236565b610096908561025b565b509192915050565b803560ff811681146100e2575f5ffd5b919050565b5f5f5f606084860312156100f9575f5ffd5b83359250610109602085016100d2565b9150610117604085016100d2565b90509250925092565b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561014d5761014d610120565b92915050565b6001815b600184111561018e5780850481111561017257610172610120565b600184161561018057908102905b60019390931c928002610157565b935093915050565b5f826101a45750600161014d565b816101b057505f61014d565b81600181146101c657600281146101d0576101ec565b600191505061014d565b60ff8411156101e1576101e1610120565b50506001821b61014d565b5060208310610133831016604e8410600b841016171561020f575081810a61014d565b61021b5f198484610153565b805f190482111561022e5761022e610120565b029392505050565b5f61006160ff841683610196565b808202811582820484141761014d5761014d610120565b5f8261027557634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212208bc08842139c3b27f619a53f027dae900a98869ba508c3f45f952430de61e67064736f6c634300081c0033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/artifacts/contracts/vaults/OrionTransparentVault.sol/OrionTransparentVault.json b/artifacts/contracts/vaults/OrionTransparentVault.sol/OrionTransparentVault.json index 99134187..28088e12 100644 --- a/artifacts/contracts/vaults/OrionTransparentVault.sol/OrionTransparentVault.json +++ b/artifacts/contracts/vaults/OrionTransparentVault.sol/OrionTransparentVault.json @@ -250,6 +250,11 @@ "name": "InvalidArguments", "type": "error" }, + { + "inputs": [], + "name": "InvalidCuratorContract", + "type": "error" + }, { "inputs": [], "name": "InvalidTotalWeight", @@ -632,6 +637,19 @@ "name": "VaultStateUpdated", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address[]", + "name": "assets", + "type": "address[]" + } + ], + "name": "VaultWhitelistUpdated", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -1726,8 +1744,8 @@ "type": "function" } ], - "bytecode": "0x60c060405234801561000f575f5ffd5b5060405161494f38038061494f83398101604081905261002e916108b3565b8787878787878787856001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610072573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100969190610982565b858560036100a48382610a28565b5060046100b18282610a28565b5050505f5f6100c58361050660201b60201c565b91509150816100d55760126100d7565b805b60ff1660a05250506001600160a01b03908116608052600160055587166101115760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0386166101385760405163e6c4247b60e01b815260040160405180910390fd5b600680546001600160a01b03808b166001600160a01b031992831617909255600780548a841690831617905560088054928916929091168217905560408051630691d8b960e31b8152905163348ec5c8916004808201926020929091908290030181865afa1580156101ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d09190610982565b60095f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b0316633a0dad8e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610231573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102559190610982565b600a5f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b031663d1717c7d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102b6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102da9190610ae2565b600a60146101000a81548160ff021916908360ff1602179055505f600d819055505f6014819055505f6015819055505f866001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610346573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036a9190610982565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103c99190610ae2565b9050601260ff821611156103f057604051631c03248960e11b815260040160405180910390fd5b600460ff85161115610415576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff8416111561043c576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff83161115610463576040516317dbc4cb60e21b815260040160405180910390fd5b8360ff16600481111561047857610478610afb565b6017805460ff1916600183600481111561049457610494610afb565b02179055506017805461ffff84811663010000000264ffff00000019918716610100029190911664ffffffff0019909216919091171790556104d781600a610c06565b6018556104e26105dc565b5050505050505050506104f96106b160201b60201c565b5050505050505050610d26565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b0387169161054c91610c14565b5f60405180830381855afa9150503d805f8114610584576040519150601f19603f3d011682016040523d82523d5f602084013e610589565b606091505b509150915081801561059d57506020815110155b156105d0575f818060200190518101906105b79190610c2a565b905060ff81116105ce576001969095509350505050565b505b505f9485945092505050565b60085460408051636c366a2760e11b815290515f926001600160a01b03169163d86cd44e91600480830192869291908290030181865afa158015610622573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106499190810190610c41565b90505f5b81518110156106ad575f61068483838151811061066c5761066c610cf3565b6020026020010151600b61075e60201b90919060201c565b9050806106a457604051630ea075bf60e21b815260040160405180910390fd5b5060010161064d565b5050565b6007546001600160a01b03163b5f036106d057601f805460ff19169055565b6007546040516301ffc9a760e01b815263701a818560e01b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa92505050801561073b575060408051601f3d908101601f1916820190925261073891810190610d07565b60015b61074b57601f805460ff19169055565b601f805460ff1916911515919091179055565b5f610772836001600160a01b03841661077b565b90505b92915050565b5f8181526001830160205260408120546107c057508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610775565b505f610775565b6001600160a01b03811681146107db575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561081a5761081a6107de565b604052919050565b5f82601f830112610831575f5ffd5b81516001600160401b0381111561084a5761084a6107de565b61085d601f8201601f19166020016107f2565b818152846020838601011115610871575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b805160ff8116811461089d575f5ffd5b919050565b805161ffff8116811461089d575f5ffd5b5f5f5f5f5f5f5f5f610100898b0312156108cb575f5ffd5b88516108d6816107c7565b60208a01519098506108e7816107c7565b60408a01519097506108f8816107c7565b60608a01519096506001600160401b03811115610913575f5ffd5b61091f8b828c01610822565b60808b015190965090506001600160401b0381111561093c575f5ffd5b6109488b828c01610822565b94505061095760a08a0161088d565b925061096560c08a016108a2565b915061097360e08a016108a2565b90509295985092959890939650565b5f60208284031215610992575f5ffd5b815161099d816107c7565b9392505050565b600181811c908216806109b857607f821691505b6020821081036109d657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610a2357805f5260205f20601f840160051c81016020851015610a015750805b601f840160051c820191505b81811015610a20575f8155600101610a0d565b50505b505050565b81516001600160401b03811115610a4157610a416107de565b610a5581610a4f84546109a4565b846109dc565b6020601f821160018114610a87575f8315610a705750848201515b5f19600385901b1c1916600184901b178455610a20565b5f84815260208120601f198516915b82811015610ab65787850151825560209485019460019092019101610a96565b5084821015610ad357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60208284031215610af2575f5ffd5b6107728261088d565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b6001841115610b5e57808504811115610b4257610b42610b0f565b6001841615610b5057908102905b60019390931c928002610b27565b935093915050565b5f82610b7457506001610775565b81610b8057505f610775565b8160018114610b965760028114610ba057610bbc565b6001915050610775565b60ff841115610bb157610bb1610b0f565b50506001821b610775565b5060208310610133831016604e8410600b8410161715610bdf575081810a610775565b610beb5f198484610b23565b805f1904821115610bfe57610bfe610b0f565b029392505050565b5f61077260ff841683610b66565b5f82518060208501845e5f920191825250919050565b5f60208284031215610c3a575f5ffd5b5051919050565b5f60208284031215610c51575f5ffd5b81516001600160401b03811115610c66575f5ffd5b8201601f81018413610c76575f5ffd5b80516001600160401b03811115610c8f57610c8f6107de565b8060051b610c9f602082016107f2565b91825260208184018101929081019087841115610cba575f5ffd5b6020850194505b83851015610ce85784519250610cd6836107c7565b82825260209485019490910190610cc1565b979650505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610d17575f5ffd5b8151801515811461099d575f5ffd5b60805160a051613c0b610d445f395f50505f610e6a0152613c0b5ff3fe608060405234801561000f575f5ffd5b50600436106102b2575f3560e01c806301e1d114146102b657806303d44854146102cd57806306fdde03146102e257806307a2d13a146102f7578063095ea7b31461030a5780630a28a4771461032d5780630a605c6d146103405780630c6a62dd146103485780630d1e66671461035b5780630df571f71461036e578063105444941461038157806318160ddd1461039457806318c219491461039c5780631f52692b146103af57806323b872dd146103cf578063313ce567146103e2578063348ec5c8146103f757806338d52e0f1461040a5780633a0dad8e146104125780633ab6d27c14610425578063402d267d14610438578063493a6e211461044c5780634cdad5061461032d5780634e85b1351461045f5780635de3dfdc146104745780636e553f651461047f57806370a082311461048d5780637847ea53146104a057806379502c55146104c057806380ceebfe146104d35780638f5c9465146104e657806394bf804d1461047f57806395d89b411461050257806397ee11441461050a5780639908840c14610540578063a68a526714610549578063a9059cbb1461055c578063aa2f892d1461056f578063acdb3d5114610582578063b1bd7e2e1461058b578063b3d7f6b91461032d578063b460af941461059e578063b6eba653146105ac578063ba0876521461059e578063bdca9165146105c2578063c0b568e1146105cb578063c3f0d30e146105de578063c63d75b614610438578063c6e6f592146105f1578063ce96cb7714610604578063d1717c7d14610617578063d3d034581461062b578063d853365f14610641578063d905777e14610649578063dd62ed3e1461065c578063e51a85f61461066f578063e5e9719314610682578063e66f53b714610695578063ef8b30f71461032d578063f64c6f32146106a8575b5f5ffd5b600d545b6040519081526020015b60405180910390f35b6102e06102db36600461321f565b6106b0565b005b6102ea6107ea565b6040516102c4919061328e565b6102ba6103053660046132c3565b61087a565b61031d6103183660046132ee565b61088b565b60405190151581526020016102c4565b6102ba61033b3660046132c3565b6108a2565b6015546102ba565b6102e0610356366004613318565b6108bc565b6102e06103693660046132c3565b610967565b6102e061037c366004613333565b610bd8565b6102e061038f366004613393565b610c53565b6002546102ba565b6102e06103aa3660046132c3565b610d74565b6006546103c2906001600160a01b031681565b6040516102c491906133da565b61031d6103dd3660046133ee565b610e43565b60125b60405160ff90911681526020016102c4565b6009546103c2906001600160a01b031681565b6103c2610e68565b600a546103c2906001600160a01b031681565b6102e0610433366004613449565b610e8c565b6102ba610446366004613318565b505f1990565b6102e061045a3660046132c3565b611059565b6104676113a0565b6040516102c491906134d4565b601f5460ff1661031d565b6102ba61033b3660046134e6565b6102ba61049b366004613318565b6113b1565b6104ab6301e1338081565b60405163ffffffff90911681526020016102c4565b6008546103c2906001600160a01b031681565b6102ba6104e1366004613514565b6113cb565b6104ef61271081565b60405161ffff90911681526020016102c4565b6102ea61140b565b6017546018546105309160ff81169161ffff610100830481169263010000009004169084565b6040516102c49493929190613556565b6104ef61012c81565b6102ba610557366004613514565b61141a565b61031d61056a3660046132ee565b611449565b6102e061057d3660046132c3565b611456565b6102ba60165481565b6102e0610599366004613594565b61162f565b6102ba61033b3660046135d2565b6105b461185f565b6040516102c4929190613606565b6104ef610bb881565b6102e06105d93660046132c3565b6119b6565b6102e06105ec3660046132c3565b611b70565b6102ba6105ff3660046132c3565b611d64565b6102ba610612366004613318565b611d6f565b600a546103e590600160a01b900460ff1681565b610633611d82565b6040516102c4929190613664565b6103e5601281565b6102ba610657366004613318565b611eac565b6102ba61066a3660046136b0565b611eb6565b6102ba61067d3660046132c3565b611ee0565b6102e06106903660046132c3565b611f19565b6007546103c2906001600160a01b031681565b6014546102ba565b6006546001600160a01b031633146106db57604051631a27eac360e11b815260040160405180910390fd5b6106e5600b6121f1565b5f5b818110156107e5575f838383818110610702576107026136dc565b90506020020160208101906107179190613318565b600854604051633af32abf60e01b81529192506001600160a01b031690633af32abf906107489084906004016133da565b602060405180830381865afa158015610763573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061078791906136f0565b6107af578060405163751dff9760e11b81526004016107a691906133da565b60405180910390fd5b5f6107bb600b836121fa565b9050806107db57604051630ea075bf60e21b815260040160405180910390fd5b50506001016106e7565b505050565b6060600380546107f99061370f565b80601f01602080910402602001604051908101604052809291908181526020018280546108259061370f565b80156108705780601f1061084757610100808354040283529160200191610870565b820191905f5260205f20905b81548152906001019060200180831161085357829003601f168201915b5050505050905090565b5f610885825f61220e565b92915050565b5f3361089881858561224f565b5060019392505050565b5f60405163125ad87760e31b815260040160405180910390fd5b6006546001600160a01b031633146108e757604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b03811661090e5760405163e6c4247b60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b03831617905561093161225c565b6040516001600160a01b038216907f83293ffeebb677b167941693470018acf300605df266a35e9fdb66f24ff00fe0905f90a250565b61096f612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e391906136f0565b610a00576040516312aecd8160e01b815260040160405180910390fd5b805f03610a2957610a0f610e68565b604051636b30633560e01b81526004016107a691906133da565b5f610a32610e68565b6001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401610a5d91906133da565b602060405180830381865afa158015610a78573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9c9190613747565b905080821115610abf57604051632ca2f52b60e11b815260040160405180910390fd5b5f610ac8610e68565b600a546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92610afe92339290911690889060040161375e565b6020604051808303815f875af1158015610b1a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3e91906136f0565b905080610b5e576040516312171d8360e31b815260040160405180910390fd5b5f610b6a600e33612333565b9150610b85905033610b7c8684613796565b600e9190612359565b508360145f828254610b979190613796565b9091555050604051849033907f55896b30a78fc55b78937f8014dde3f0035e9d37a4f6ac36841fb8b62f7e2b13905f90a3505050610bd56001600555565b50565b6009546001600160a01b03163314610c0357604051631a27eac360e11b815260040160405180910390fd5b8015610c4f578060165f828254610c1a9190613796565b9091555050601654604051829084907f8b8789cf9157fe7b016901e4ed3a5d0971caa8b7c031da0b25638ccf65841b2a905f90a45b5050565b6009546001600160a01b03163314610c7e57604051631a27eac360e11b815260040160405180910390fd5b610c88601961236e565b815f5b8161ffff168161ffff161015610d1857610d0f85858361ffff16818110610cb457610cb46136dc565b610cca9260206040909202019081019150613318565b86868461ffff16818110610ce057610ce06136dc565b9050604002016020016020810190610cf891906137ba565b63ffffffff1660196123599092919063ffffffff16565b50600101610c8b565b50600d8290555f610d3060125b61030590600a6138b8565b601854909150811115610d435760188190555b60405183907f5e1ff954b5e5257e9ee5d4cb07059e8f5e69b1aaaf9911e5d8d90a6894de9c21905f90a25050505050565b6006546001600160a01b03163314610d9f57604051631a27eac360e11b815260040160405180910390fd5b805f03610dae57610a0f610e68565b601654811115610dd157604051632ca2f52b60e11b815260040160405180910390fd5b8060165f828254610de291906138c6565b9091555050600a5460405163741fca4b60e01b8152600481018390526001600160a01b039091169063741fca4b906024015f604051808303815f87803b158015610e2a575f5ffd5b505af1158015610e3c573d5f5f3e3d5ffd5b5050505050565b5f33610e50858285612377565b610e5b8585856123c8565b60019150505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6006546001600160a01b03163314610eb757604051631a27eac360e11b815260040160405180910390fd5b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f07573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f2b91906136f0565b610f48576040516312aecd8160e01b815260040160405180910390fd5b600460ff84161115610f6d576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff83161115610f94576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff82161115610fbb576040516317dbc4cb60e21b815260040160405180910390fd5b8260ff166004811115610fd057610fd0613542565b6017805460ff19166001836004811115610fec57610fec613542565b02179055506017805464ffffffff00191661010061ffff85811691820264ffff00000019169290921763010000009285169283021790925560405190919060ff8616907fd24f39e523bfa412fa391702710dc62e1c82d87a8e83228a37c42be1b4870f45905f90a4505050565b600a546001600160a01b0316331461108457604051631a27eac360e11b815260040160405180910390fd5b61108c612309565b5f6110976011612425565b90508063ffffffff165f036110ac5750611396565b5f8163ffffffff166001600160401b038111156110cb576110cb6138d9565b6040519080825280602002602001820160405280156110f4578160200160208202803683370190505b5090505f8263ffffffff166001600160401b03811115611116576111166138d9565b60405190808252806020026020018201604052801561113f578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff1610156111d9575f8061116e601163ffffffff8086169061242f16565b9150915081858463ffffffff168151811061118b5761118b6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff16815181106111c4576111c46136dc565b60209081029190910101525050600101611144565b505f601581905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa158015611228573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061124c91906138ed565b90505f5b8463ffffffff168163ffffffff161015611390575f848263ffffffff168151811061127d5761127d6136dc565b602002602001015190505f848363ffffffff16815181106112a0576112a06136dc565b602002602001015190506112be82601161243d90919063ffffffff16565b505f6112cb828a5f61141a565b90506112d73083612451565b600a54604051634adfc2e760e01b81526001600160a01b0390911690634adfc2e7906113099086908590600401613908565b5f604051808303815f87803b158015611320575f5ffd5b505af1158015611332573d5f5f3e3d5ffd5b5050604080518481526020810186905261ffff891693506001600160a01b038716925030917f215abfcd108b85fbee47f26fda2de66f90f14fa5fcaf0201698ad8ac9323545f910160405180910390a4505050806001019050611250565b50505050505b610bd56001600555565b60606113ac600b612485565b905090565b6001600160a01b03165f9081526020819052604090205490565b5f6114036113d7612491565b6113e290600a6138b8565b6002546113ef9190613796565b6113fa856001613796565b8691908561250d565b949350505050565b6060600480546107f99061370f565b5f611403611429846001613796565b611431612491565b61143c90600a6138b8565b6002546113fa9190613796565b5f336108988185856123c8565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ca91906136f0565b6114e7576040516312aecd8160e01b815260040160405180910390fd5b805f036115095730604051636b30633560e01b81526004016107a691906133da565b5f611513336113b1565b90508082111561153657604051632ca2f52b60e11b815260040160405180910390fd5b6040516323b872dd60e01b81525f9030906323b872dd9061155f9033908490889060040161375e565b6020604051808303815f875af115801561157b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061159f91906136f0565b9050806115bf576040516312171d8360e31b815260040160405180910390fd5b5f6115cb601133612333565b91506115e69050336115dd8684613796565b60119190612359565b508360155f8282546115f89190613796565b9091555050604051849033907f222dc200773fe9b45015bf792e8fee37d651e3590c215806a5042404b6d741d2905f90a350505050565b6007546001600160a01b0316331461165a57604051631a27eac360e11b815260040160405180910390fd5b601f5460ff161561167e576040516317dbc4cb60e21b815260040160405180910390fd5b5f81900361169f57604051631121aa8d60e01b815260040160405180910390fd5b6116a9601c61236e565b5f816001600160401b038111156116c2576116c26138d9565b6040519080825280602002602001820160405280156116eb578160200160208202803683370190505b5090505f82815b8161ffff168161ffff1610156117e9575f86868361ffff16818110611719576117196136dc565b61172f9260206040909202019081019150613318565b90505f87878461ffff16818110611748576117486136dc565b905060400201602001602081019061176091906137ba565b905081868461ffff1681518110611779576117796136dc565b6001600160a01b03909216602092830291909101909101525f6117a7601c8463ffffffff8086169061235916565b9050806117c957826040516346bdabe160e01b81526004016107a691906133da565b6117d963ffffffff831687613796565b95505050508060010190506116f2565b506117f38361254f565b600a60149054906101000a900460ff16600a61180f91906138b8565b821461182e57604051639006dd2760e01b815260040160405180910390fd5b60405133907f2d47a742b8d7df7c1fc5a9a631b206b364e6cb2722490759f63bb3ab14b132e0905f90a25050505050565b601f54606090819060ff161561187f576118776125c7565b915091509091565b5f61188a601c612425565b90508061ffff166001600160401b038111156118a8576118a86138d9565b6040519080825280602002602001820160405280156118d1578160200160208202803683370190505b5092508061ffff166001600160401b038111156118f0576118f06138d9565b604051908082528060200260200182016040528015611919578160200160208202803683370190505b5091505f5b8161ffff168161ffff1610156119b0575f8061193f601c61ffff851661242f565b9150915081868461ffff168151811061195a5761195a6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611991576119916136dc565b63ffffffff90921660209283029190910190910152505060010161191e565b50509091565b6119be612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a0e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3291906136f0565b611a4f576040516312aecd8160e01b815260040160405180910390fd5b805f03611a5e57610a0f610e68565b5f611a6a600e33612333565b91505081811015611a8e57604051632ca2f52b60e11b815260040160405180910390fd5b600a546040516351edffb160e01b81526001600160a01b03909116906351edffb190611ac09033908690600401613908565b5f604051808303815f87803b158015611ad7575f5ffd5b505af1158015611ae9573d5f5f3e3d5ffd5b505050505f8282611afa91906138c6565b9050805f03611b1457611b0e600e3361243d565b50611b22565b611b20600e3383612359565b505b8260145f828254611b3391906138c6565b9091555050604051839033907f96a9a6886cdf3047a125454218a23d3961fd3a78643123b248a9d106d0ac94fd905f90a35050610bd56001600555565b611b78612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bc8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bec91906136f0565b611c09576040516312aecd8160e01b815260040160405180910390fd5b805f03611c2b5730604051636b30633560e01b81526004016107a691906133da565b5f611c37601133612333565b91505081811015611c5b57604051632ca2f52b60e11b815260040160405180910390fd5b5f611c6683836138c6565b9050805f03611c8057611c7a60113361243d565b50611c8e565b611c8c60113383612359565b505b8260155f828254611c9f91906138c6565b909155505060405163a9059cbb60e01b81525f90309063a9059cbb90611ccb9033908890600401613908565b6020604051808303815f875af1158015611ce7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0b91906136f0565b905080611d2b576040516312171d8360e31b815260040160405180910390fd5b604051849033907f046d3e17087d323298991516e3fdec36fe1204d6bff7fb6e2b8eca77b80a22ad905f90a3505050610bd56001600555565b5f610885825f6127f9565b5f610885611d7c836113b1565b5f61220e565b6060805f611d906019612425565b90508061ffff166001600160401b03811115611dae57611dae6138d9565b604051908082528060200260200182016040528015611dd7578160200160208202803683370190505b5092508061ffff166001600160401b03811115611df657611df66138d9565b604051908082528060200260200182016040528015611e1f578160200160208202803683370190505b5091505f5b8161ffff168161ffff1610156119b0575f80611e45601961ffff851661242f565b9150915081868461ffff1681518110611e6057611e606136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611e9757611e976136dc565b60209081029190910101525050600101611e24565b5f610885826113b1565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b5f5f611eeb8361282b565b90505f611ef882856138c6565b90505f611f04826128f5565b9050611f108184613796565b95945050505050565b600a546001600160a01b03163314611f4457604051631a27eac360e11b815260040160405180910390fd5b611f4c612309565b5f611f57600e612425565b90508063ffffffff165f03611f6c5750611396565b5f8163ffffffff166001600160401b03811115611f8b57611f8b6138d9565b604051908082528060200260200182016040528015611fb4578160200160208202803683370190505b5090505f8263ffffffff166001600160401b03811115611fd657611fd66138d9565b604051908082528060200260200182016040528015611fff578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff161015612099575f8061202e600e63ffffffff8086169061242f16565b9150915081858463ffffffff168151811061204b5761204b6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff1681518110612084576120846136dc565b60209081029190910101525050600101612004565b505f601481905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa1580156120e8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061210c91906138ed565b90505f5b8463ffffffff168163ffffffff161015611390575f848263ffffffff168151811061213d5761213d6136dc565b602002602001015190505f848363ffffffff1681518110612160576121606136dc565b6020026020010151905061217e82600e61243d90919063ffffffff16565b505f61218b828a5f6113cb565b90506121978382612985565b604080518381526020810183905261ffff8716916001600160a01b0386169130917f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f6910160405180910390a4505050806001019050612110565b610bd5816129b9565b5f610e61836001600160a01b038416612a12565b5f610e6161221b600d5490565b612226906001613796565b61222e612491565b61223990600a6138b8565b6002546122469190613796565b8591908561250d565b6107e58383836001612a59565b6007546001600160a01b03163b5f0361227b57601f805460ff19169055565b6007546040516301ffc9a760e01b815263701a818560e01b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa9250505080156122e6575060408051601f3d908101601f191682019092526122e3918101906136f0565b60015b6122f657601f805460ff19169055565b601f805460ff1916911515919091179055565b60026005540361232c57604051633ee5aeb560e01b815260040160405180910390fd5b6002600555565b5f80808061234a866001600160a01b038716612b2b565b909450925050505b9250929050565b5f611403846001600160a01b03851684612b63565b610bd581612b7f565b5f6123828484611eb6565b90505f198110156123c257818110156123b457828183604051637dc7a0d960e11b81526004016107a693929190613921565b6123c284848484035f612a59565b50505050565b6001600160a01b0383166123f1575f604051634b637e8f60e11b81526004016107a691906133da565b6001600160a01b03821661241a575f60405163ec442f0560e01b81526004016107a691906133da565b6107e5838383612bc8565b5f61088582612cdb565b5f80808061234a8686612ce5565b5f610e61836001600160a01b038416612d0e565b6001600160a01b03821661247a575f604051634b637e8f60e11b81526004016107a691906133da565b610c4f825f83612bc8565b60605f610e6183612d2a565b5f5f61249b610e68565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124d6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124fa9190613942565b905061250781601261395d565b91505090565b5f61253a61251a83612d83565b801561253557505f848061253057612530613976565b868809115b151590565b612545868686612daf565b611f109190613796565b5f5b8151811015610c4f5761258782828151811061256f5761256f6136dc565b6020026020010151600b612e5f90919063ffffffff16565b6125bf5781818151811061259d5761259d6136dc565b602002602001015160405163751dff9760e11b81526004016107a691906133da565b600101612551565b6060805f306001600160a01b0316634e85b1356040518163ffffffff1660e01b81526004015f60405180830381865afa158015612606573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261262d9190810190613a04565b60075460405163701a818560e01b81529192505f916001600160a01b039091169063701a8185906126629085906004016134d4565b5f60405180830381865afa15801561267c573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126a39190810190613a98565b905080516001600160401b038111156126be576126be6138d9565b6040519080825280602002602001820160405280156126e7578160200160208202803683370190505b50935080516001600160401b03811115612703576127036138d9565b60405190808252806020026020018201604052801561272c578160200160208202803683370190505b5092505f5b81518161ffff1610156127f257818161ffff1681518110612754576127546136dc565b60200260200101515f0151858261ffff1681518110612775576127756136dc565b60200260200101906001600160a01b031690816001600160a01b031681525050818161ffff16815181106127ab576127ab6136dc565b602002602001015160200151848261ffff16815181106127cd576127cd6136dc565b63ffffffff909216602092830291909101909101526127eb81613b59565b9050612731565b5050509091565b5f610e61612805612491565b61281090600a6138b8565b60025461281d9190613796565b600d54612246906001613796565b6017545f906301000000900461ffff16810361284857505f919050565b6017545f90612865906301000000900461ffff1684612710612daf565b9050610e6160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128ba573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128de9190613b79565b829063ffffffff908116906301e1338090612daf16565b6017545f90610100900461ffff16810361291057505f919050565b5f6129276129206012600a6138b8565b845f61141a565b6017549091505f90819061293d9060ff16612e73565b915091508183101561295357505f949350505050565b6017545f9061296c90610100900461ffff168584612daf565b905061297b8187612710612daf565b9695505050505050565b6001600160a01b0382166129ae575f60405163ec442f0560e01b81526004016107a691906133da565b610c4f5f8383612bc8565b5f6129c2825490565b90505f5b81811015612a0b57826001015f845f0183815481106129e7576129e76136dc565b905f5260205f20015481526020019081526020015f205f90558060010190506129c6565b50505f9055565b5f612a1d8383612f5d565b612a5257508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610885565b505f610885565b6001600160a01b038416612a82575f60405163e602df0560e01b81526004016107a691906133da565b6001600160a01b038316612aab575f604051634a1406b160e11b81526004016107a691906133da565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156123c257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612b1d91815260200190565b60405180910390a350505050565b5f818152600283016020526040812054819080612b5857612b4c8585612f74565b92505f91506123529050565b600192509050612352565b5f82815260028401602052604081208290556114038484612f7f565b5f612b8982612cdb565b90505f5b81811015612bbe57600283015f612ba48584612f8a565b815260208101919091526040015f90812055600101612b8d565b50610c4f826121f1565b6001600160a01b038316612bf2578060025f828254612be79190613796565b90915550612c4f9050565b6001600160a01b0383165f9081526020819052604090205481811015612c315783818360405163391434e360e21b81526004016107a693929190613921565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216612c6b57600280548290039055612c89565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612cce91815260200190565b60405180910390a3505050565b5f61088582612f95565b5f8080612cf28585612f8a565b5f81815260029690960160205260409095205494959350505050565b5f8181526002830160205260408120819055610e618383612f9e565b6060815f01805480602002602001604051908101604052809291908181526020018280548015612d7757602002820191905f5260205f20905b815481526020019060010190808311612d63575b50505050509050919050565b5f6002826003811115612d9857612d98613542565b612da29190613b94565b60ff166001149050919050565b5f5f5f612dbc8686612fa9565b91509150815f03612de057838181612dd657612dd6613976565b0492505050610e61565b818411612df757612df76003851502601118612fc5565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f610e61836001600160a01b038416612f5d565b5f8080612e806012610d25565b90505f846004811115612e9557612e95613542565b03612ea557809250829150612f57565b6003846004811115612eb957612eb9613542565b03612ecb576018549250829150612f57565b6001846004811115612edf57612edf613542565b03612ef757612eed81612fd6565b9250809150612f57565b6002846004811115612f0b57612f0b613542565b03612f2357612f1981612fd6565b9250829150612f57565b6004846004811115612f3757612f37613542565b03612f5757601854612f5190612f4c83612fd6565b6130fc565b92508291505b50915091565b5f9081526001919091016020526040902054151590565b5f610e61838361310b565b5f610e618383612a12565b5f610e618383613116565b5f610885825490565b5f610e61838361313c565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f5f60085f9054906101000a90046001600160a01b03166001600160a01b031663f3cc69936040518163ffffffff1660e01b8152600401602060405180830381865afa158015613028573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061304c91906138ed565b61ffff1690505f6130e160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130ca9190613b79565b839063ffffffff908116906301e1338090612daf16565b90506114036130f282612710613796565b8590612710612daf565b5f828218828411028218610e61565b5f610e618383612f5d565b5f825f01828154811061312b5761312b6136dc565b905f5260205f200154905092915050565b5f8181526001830160205260408120548015613216575f61315e6001836138c6565b85549091505f90613171906001906138c6565b90508082146131d0575f865f01828154811061318f5761318f6136dc565b905f5260205f200154905080875f0184815481106131af576131af6136dc565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806131e1576131e1613bc1565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610885565b5f915050610885565b5f5f60208385031215613230575f5ffd5b82356001600160401b03811115613245575f5ffd5b8301601f81018513613255575f5ffd5b80356001600160401b0381111561326a575f5ffd5b8560208260051b840101111561327e575f5ffd5b6020919091019590945092505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156132d3575f5ffd5b5035919050565b6001600160a01b0381168114610bd5575f5ffd5b5f5f604083850312156132ff575f5ffd5b823561330a816132da565b946020939093013593505050565b5f60208284031215613328575f5ffd5b8135610e61816132da565b5f5f60408385031215613344575f5ffd5b50508035926020909101359150565b5f5f83601f840112613363575f5ffd5b5081356001600160401b03811115613379575f5ffd5b6020830191508360208260061b8501011115612352575f5ffd5b5f5f5f604084860312156133a5575f5ffd5b83356001600160401b038111156133ba575f5ffd5b6133c686828701613353565b909790965060209590950135949350505050565b6001600160a01b0391909116815260200190565b5f5f5f60608486031215613400575f5ffd5b833561340b816132da565b9250602084013561341b816132da565b929592945050506040919091013590565b60ff81168114610bd5575f5ffd5b61ffff81168114610bd5575f5ffd5b5f5f5f6060848603121561345b575f5ffd5b83356134668161342c565b925060208401356134768161343a565b915060408401356134868161343a565b809150509250925092565b5f8151808452602084019350602083015f5b828110156134ca5781516001600160a01b03168652602095860195909101906001016134a3565b5093949350505050565b602081525f610e616020830184613491565b5f5f604083850312156134f7575f5ffd5b823591506020830135613509816132da565b809150509250929050565b5f5f5f60608486031215613526575f5ffd5b8335925060208401359150604084013560048110613486575f5ffd5b634e487b7160e01b5f52602160045260245ffd5b608081016005861061357657634e487b7160e01b5f52602160045260245ffd5b94815261ffff93841660208201529190921660408201526060015290565b5f5f602083850312156135a5575f5ffd5b82356001600160401b038111156135ba575f5ffd5b6135c685828601613353565b90969095509350505050565b5f5f5f606084860312156135e4575f5ffd5b8335925060208401356135f6816132da565b91506040840135613486816132da565b604081525f6136186040830185613491565b82810360208401528084518083526020830191506020860192505f5b8181101561365857835163ffffffff16835260209384019390920191600101613634565b50909695505050505050565b604081525f6136766040830185613491565b82810360208401528084518083526020830191506020860192505f5b81811015613658578351835260209384019390920191600101613692565b5f5f604083850312156136c1575f5ffd5b82356136cc816132da565b91506020830135613509816132da565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613700575f5ffd5b81518015158114610e61575f5ffd5b600181811c9082168061372357607f821691505b60208210810361374157634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215613757575f5ffd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561088557610885613782565b63ffffffff81168114610bd5575f5ffd5b5f602082840312156137ca575f5ffd5b8135610e61816137a9565b6001815b6001841115613810578085048111156137f4576137f4613782565b600184161561380257908102905b60019390931c9280026137d9565b935093915050565b5f8261382657506001610885565b8161383257505f610885565b816001811461384857600281146138525761386e565b6001915050610885565b60ff84111561386357613863613782565b50506001821b610885565b5060208310610133831016604e8410600b8410161715613891575081810a610885565b61389d5f1984846137d5565b805f19048211156138b0576138b0613782565b029392505050565b5f610e6160ff841683613818565b8181038181111561088557610885613782565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156138fd575f5ffd5b8151610e618161343a565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b5f60208284031215613952575f5ffd5b8151610e618161342c565b60ff828116828216039081111561088557610885613782565b634e487b7160e01b5f52601260045260245ffd5b604080519081016001600160401b03811182821017156139ac576139ac6138d9565b60405290565b604051601f8201601f191681016001600160401b03811182821017156139da576139da6138d9565b604052919050565b5f6001600160401b038211156139fa576139fa6138d9565b5060051b60200190565b5f60208284031215613a14575f5ffd5b81516001600160401b03811115613a29575f5ffd5b8201601f81018413613a39575f5ffd5b8051613a4c613a47826139e2565b6139b2565b8082825260208201915060208360051b850101925086831115613a6d575f5ffd5b6020840193505b8284101561297b578351613a87816132da565b825260209384019390910190613a74565b5f60208284031215613aa8575f5ffd5b81516001600160401b03811115613abd575f5ffd5b8201601f81018413613acd575f5ffd5b8051613adb613a47826139e2565b8082825260208201915060208360061b850101925086831115613afc575f5ffd5b6020840193505b8284101561297b5760408488031215613b1a575f5ffd5b613b2261398a565b8451613b2d816132da565b81526020850151613b3d816137a9565b8060208301525080835250602082019150604084019350613b03565b5f61ffff821661ffff8103613b7057613b70613782565b60010192915050565b5f60208284031215613b89575f5ffd5b8151610e61816137a9565b5f60ff831680613bb257634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220c8e5b40e109f575781531ef89b26297cbc6aeecc383693fda6e6c6c96562a6ec64736f6c634300081c0033", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b50600436106102b2575f3560e01c806301e1d114146102b657806303d44854146102cd57806306fdde03146102e257806307a2d13a146102f7578063095ea7b31461030a5780630a28a4771461032d5780630a605c6d146103405780630c6a62dd146103485780630d1e66671461035b5780630df571f71461036e578063105444941461038157806318160ddd1461039457806318c219491461039c5780631f52692b146103af57806323b872dd146103cf578063313ce567146103e2578063348ec5c8146103f757806338d52e0f1461040a5780633a0dad8e146104125780633ab6d27c14610425578063402d267d14610438578063493a6e211461044c5780634cdad5061461032d5780634e85b1351461045f5780635de3dfdc146104745780636e553f651461047f57806370a082311461048d5780637847ea53146104a057806379502c55146104c057806380ceebfe146104d35780638f5c9465146104e657806394bf804d1461047f57806395d89b411461050257806397ee11441461050a5780639908840c14610540578063a68a526714610549578063a9059cbb1461055c578063aa2f892d1461056f578063acdb3d5114610582578063b1bd7e2e1461058b578063b3d7f6b91461032d578063b460af941461059e578063b6eba653146105ac578063ba0876521461059e578063bdca9165146105c2578063c0b568e1146105cb578063c3f0d30e146105de578063c63d75b614610438578063c6e6f592146105f1578063ce96cb7714610604578063d1717c7d14610617578063d3d034581461062b578063d853365f14610641578063d905777e14610649578063dd62ed3e1461065c578063e51a85f61461066f578063e5e9719314610682578063e66f53b714610695578063ef8b30f71461032d578063f64c6f32146106a8575b5f5ffd5b600d545b6040519081526020015b60405180910390f35b6102e06102db36600461321f565b6106b0565b005b6102ea6107ea565b6040516102c4919061328e565b6102ba6103053660046132c3565b61087a565b61031d6103183660046132ee565b61088b565b60405190151581526020016102c4565b6102ba61033b3660046132c3565b6108a2565b6015546102ba565b6102e0610356366004613318565b6108bc565b6102e06103693660046132c3565b610967565b6102e061037c366004613333565b610bd8565b6102e061038f366004613393565b610c53565b6002546102ba565b6102e06103aa3660046132c3565b610d74565b6006546103c2906001600160a01b031681565b6040516102c491906133da565b61031d6103dd3660046133ee565b610e43565b60125b60405160ff90911681526020016102c4565b6009546103c2906001600160a01b031681565b6103c2610e68565b600a546103c2906001600160a01b031681565b6102e0610433366004613449565b610e8c565b6102ba610446366004613318565b505f1990565b6102e061045a3660046132c3565b611059565b6104676113a0565b6040516102c491906134d4565b601f5460ff1661031d565b6102ba61033b3660046134e6565b6102ba61049b366004613318565b6113b1565b6104ab6301e1338081565b60405163ffffffff90911681526020016102c4565b6008546103c2906001600160a01b031681565b6102ba6104e1366004613514565b6113cb565b6104ef61271081565b60405161ffff90911681526020016102c4565b6102ea61140b565b6017546018546105309160ff81169161ffff610100830481169263010000009004169084565b6040516102c49493929190613556565b6104ef61012c81565b6102ba610557366004613514565b61141a565b61031d61056a3660046132ee565b611449565b6102e061057d3660046132c3565b611456565b6102ba60165481565b6102e0610599366004613594565b61162f565b6102ba61033b3660046135d2565b6105b461185f565b6040516102c4929190613606565b6104ef610bb881565b6102e06105d93660046132c3565b6119b6565b6102e06105ec3660046132c3565b611b70565b6102ba6105ff3660046132c3565b611d64565b6102ba610612366004613318565b611d6f565b600a546103e590600160a01b900460ff1681565b610633611d82565b6040516102c4929190613664565b6103e5601281565b6102ba610657366004613318565b611eac565b6102ba61066a3660046136b0565b611eb6565b6102ba61067d3660046132c3565b611ee0565b6102e06106903660046132c3565b611f19565b6007546103c2906001600160a01b031681565b6014546102ba565b6006546001600160a01b031633146106db57604051631a27eac360e11b815260040160405180910390fd5b6106e5600b6121f1565b5f5b818110156107e5575f838383818110610702576107026136dc565b90506020020160208101906107179190613318565b600854604051633af32abf60e01b81529192506001600160a01b031690633af32abf906107489084906004016133da565b602060405180830381865afa158015610763573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061078791906136f0565b6107af578060405163751dff9760e11b81526004016107a691906133da565b60405180910390fd5b5f6107bb600b836121fa565b9050806107db57604051630ea075bf60e21b815260040160405180910390fd5b50506001016106e7565b505050565b6060600380546107f99061370f565b80601f01602080910402602001604051908101604052809291908181526020018280546108259061370f565b80156108705780601f1061084757610100808354040283529160200191610870565b820191905f5260205f20905b81548152906001019060200180831161085357829003601f168201915b5050505050905090565b5f610885825f61220e565b92915050565b5f3361089881858561224f565b5060019392505050565b5f60405163125ad87760e31b815260040160405180910390fd5b6006546001600160a01b031633146108e757604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b03811661090e5760405163e6c4247b60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b03831617905561093161225c565b6040516001600160a01b038216907f83293ffeebb677b167941693470018acf300605df266a35e9fdb66f24ff00fe0905f90a250565b61096f612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e391906136f0565b610a00576040516312aecd8160e01b815260040160405180910390fd5b805f03610a2957610a0f610e68565b604051636b30633560e01b81526004016107a691906133da565b5f610a32610e68565b6001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401610a5d91906133da565b602060405180830381865afa158015610a78573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9c9190613747565b905080821115610abf57604051632ca2f52b60e11b815260040160405180910390fd5b5f610ac8610e68565b600a546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92610afe92339290911690889060040161375e565b6020604051808303815f875af1158015610b1a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3e91906136f0565b905080610b5e576040516312171d8360e31b815260040160405180910390fd5b5f610b6a600e33612333565b9150610b85905033610b7c8684613796565b600e9190612359565b508360145f828254610b979190613796565b9091555050604051849033907f55896b30a78fc55b78937f8014dde3f0035e9d37a4f6ac36841fb8b62f7e2b13905f90a3505050610bd56001600555565b50565b6009546001600160a01b03163314610c0357604051631a27eac360e11b815260040160405180910390fd5b8015610c4f578060165f828254610c1a9190613796565b9091555050601654604051829084907f8b8789cf9157fe7b016901e4ed3a5d0971caa8b7c031da0b25638ccf65841b2a905f90a45b5050565b6009546001600160a01b03163314610c7e57604051631a27eac360e11b815260040160405180910390fd5b610c88601961236e565b815f5b8161ffff168161ffff161015610d1857610d0f85858361ffff16818110610cb457610cb46136dc565b610cca9260206040909202019081019150613318565b86868461ffff16818110610ce057610ce06136dc565b9050604002016020016020810190610cf891906137ba565b63ffffffff1660196123599092919063ffffffff16565b50600101610c8b565b50600d8290555f610d3060125b61030590600a6138b8565b601854909150811115610d435760188190555b60405183907f5e1ff954b5e5257e9ee5d4cb07059e8f5e69b1aaaf9911e5d8d90a6894de9c21905f90a25050505050565b6006546001600160a01b03163314610d9f57604051631a27eac360e11b815260040160405180910390fd5b805f03610dae57610a0f610e68565b601654811115610dd157604051632ca2f52b60e11b815260040160405180910390fd5b8060165f828254610de291906138c6565b9091555050600a5460405163741fca4b60e01b8152600481018390526001600160a01b039091169063741fca4b906024015f604051808303815f87803b158015610e2a575f5ffd5b505af1158015610e3c573d5f5f3e3d5ffd5b5050505050565b5f33610e50858285612377565b610e5b8585856123c8565b60019150505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6006546001600160a01b03163314610eb757604051631a27eac360e11b815260040160405180910390fd5b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f07573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f2b91906136f0565b610f48576040516312aecd8160e01b815260040160405180910390fd5b600460ff84161115610f6d576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff83161115610f94576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff82161115610fbb576040516317dbc4cb60e21b815260040160405180910390fd5b8260ff166004811115610fd057610fd0613542565b6017805460ff19166001836004811115610fec57610fec613542565b02179055506017805464ffffffff00191661010061ffff85811691820264ffff00000019169290921763010000009285169283021790925560405190919060ff8616907fd24f39e523bfa412fa391702710dc62e1c82d87a8e83228a37c42be1b4870f45905f90a4505050565b600a546001600160a01b0316331461108457604051631a27eac360e11b815260040160405180910390fd5b61108c612309565b5f6110976011612425565b90508063ffffffff165f036110ac5750611396565b5f8163ffffffff166001600160401b038111156110cb576110cb6138d9565b6040519080825280602002602001820160405280156110f4578160200160208202803683370190505b5090505f8263ffffffff166001600160401b03811115611116576111166138d9565b60405190808252806020026020018201604052801561113f578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff1610156111d9575f8061116e601163ffffffff8086169061242f16565b9150915081858463ffffffff168151811061118b5761118b6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff16815181106111c4576111c46136dc565b60209081029190910101525050600101611144565b505f601581905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa158015611228573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061124c91906138ed565b90505f5b8463ffffffff168163ffffffff161015611390575f848263ffffffff168151811061127d5761127d6136dc565b602002602001015190505f848363ffffffff16815181106112a0576112a06136dc565b602002602001015190506112be82601161243d90919063ffffffff16565b505f6112cb828a5f61141a565b90506112d73083612451565b600a54604051634adfc2e760e01b81526001600160a01b0390911690634adfc2e7906113099086908590600401613908565b5f604051808303815f87803b158015611320575f5ffd5b505af1158015611332573d5f5f3e3d5ffd5b5050604080518481526020810186905261ffff891693506001600160a01b038716925030917f215abfcd108b85fbee47f26fda2de66f90f14fa5fcaf0201698ad8ac9323545f910160405180910390a4505050806001019050611250565b50505050505b610bd56001600555565b60606113ac600b612485565b905090565b6001600160a01b03165f9081526020819052604090205490565b5f6114036113d7612491565b6113e290600a6138b8565b6002546113ef9190613796565b6113fa856001613796565b8691908561250d565b949350505050565b6060600480546107f99061370f565b5f611403611429846001613796565b611431612491565b61143c90600a6138b8565b6002546113fa9190613796565b5f336108988185856123c8565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ca91906136f0565b6114e7576040516312aecd8160e01b815260040160405180910390fd5b805f036115095730604051636b30633560e01b81526004016107a691906133da565b5f611513336113b1565b90508082111561153657604051632ca2f52b60e11b815260040160405180910390fd5b6040516323b872dd60e01b81525f9030906323b872dd9061155f9033908490889060040161375e565b6020604051808303815f875af115801561157b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061159f91906136f0565b9050806115bf576040516312171d8360e31b815260040160405180910390fd5b5f6115cb601133612333565b91506115e69050336115dd8684613796565b60119190612359565b508360155f8282546115f89190613796565b9091555050604051849033907f222dc200773fe9b45015bf792e8fee37d651e3590c215806a5042404b6d741d2905f90a350505050565b6007546001600160a01b0316331461165a57604051631a27eac360e11b815260040160405180910390fd5b601f5460ff161561167e576040516317dbc4cb60e21b815260040160405180910390fd5b5f81900361169f57604051631121aa8d60e01b815260040160405180910390fd5b6116a9601c61236e565b5f816001600160401b038111156116c2576116c26138d9565b6040519080825280602002602001820160405280156116eb578160200160208202803683370190505b5090505f82815b8161ffff168161ffff1610156117e9575f86868361ffff16818110611719576117196136dc565b61172f9260206040909202019081019150613318565b90505f87878461ffff16818110611748576117486136dc565b905060400201602001602081019061176091906137ba565b905081868461ffff1681518110611779576117796136dc565b6001600160a01b03909216602092830291909101909101525f6117a7601c8463ffffffff8086169061235916565b9050806117c957826040516346bdabe160e01b81526004016107a691906133da565b6117d963ffffffff831687613796565b95505050508060010190506116f2565b506117f38361254f565b600a60149054906101000a900460ff16600a61180f91906138b8565b821461182e57604051639006dd2760e01b815260040160405180910390fd5b60405133907f2d47a742b8d7df7c1fc5a9a631b206b364e6cb2722490759f63bb3ab14b132e0905f90a25050505050565b601f54606090819060ff161561187f576118776125c7565b915091509091565b5f61188a601c612425565b90508061ffff166001600160401b038111156118a8576118a86138d9565b6040519080825280602002602001820160405280156118d1578160200160208202803683370190505b5092508061ffff166001600160401b038111156118f0576118f06138d9565b604051908082528060200260200182016040528015611919578160200160208202803683370190505b5091505f5b8161ffff168161ffff1610156119b0575f8061193f601c61ffff851661242f565b9150915081868461ffff168151811061195a5761195a6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611991576119916136dc565b63ffffffff90921660209283029190910190910152505060010161191e565b50509091565b6119be612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a0e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3291906136f0565b611a4f576040516312aecd8160e01b815260040160405180910390fd5b805f03611a5e57610a0f610e68565b5f611a6a600e33612333565b91505081811015611a8e57604051632ca2f52b60e11b815260040160405180910390fd5b600a546040516351edffb160e01b81526001600160a01b03909116906351edffb190611ac09033908690600401613908565b5f604051808303815f87803b158015611ad7575f5ffd5b505af1158015611ae9573d5f5f3e3d5ffd5b505050505f8282611afa91906138c6565b9050805f03611b1457611b0e600e3361243d565b50611b22565b611b20600e3383612359565b505b8260145f828254611b3391906138c6565b9091555050604051839033907f96a9a6886cdf3047a125454218a23d3961fd3a78643123b248a9d106d0ac94fd905f90a35050610bd56001600555565b611b78612309565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bc8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bec91906136f0565b611c09576040516312aecd8160e01b815260040160405180910390fd5b805f03611c2b5730604051636b30633560e01b81526004016107a691906133da565b5f611c37601133612333565b91505081811015611c5b57604051632ca2f52b60e11b815260040160405180910390fd5b5f611c6683836138c6565b9050805f03611c8057611c7a60113361243d565b50611c8e565b611c8c60113383612359565b505b8260155f828254611c9f91906138c6565b909155505060405163a9059cbb60e01b81525f90309063a9059cbb90611ccb9033908890600401613908565b6020604051808303815f875af1158015611ce7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0b91906136f0565b905080611d2b576040516312171d8360e31b815260040160405180910390fd5b604051849033907f046d3e17087d323298991516e3fdec36fe1204d6bff7fb6e2b8eca77b80a22ad905f90a3505050610bd56001600555565b5f610885825f6127f9565b5f610885611d7c836113b1565b5f61220e565b6060805f611d906019612425565b90508061ffff166001600160401b03811115611dae57611dae6138d9565b604051908082528060200260200182016040528015611dd7578160200160208202803683370190505b5092508061ffff166001600160401b03811115611df657611df66138d9565b604051908082528060200260200182016040528015611e1f578160200160208202803683370190505b5091505f5b8161ffff168161ffff1610156119b0575f80611e45601961ffff851661242f565b9150915081868461ffff1681518110611e6057611e606136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611e9757611e976136dc565b60209081029190910101525050600101611e24565b5f610885826113b1565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b5f5f611eeb8361282b565b90505f611ef882856138c6565b90505f611f04826128f5565b9050611f108184613796565b95945050505050565b600a546001600160a01b03163314611f4457604051631a27eac360e11b815260040160405180910390fd5b611f4c612309565b5f611f57600e612425565b90508063ffffffff165f03611f6c5750611396565b5f8163ffffffff166001600160401b03811115611f8b57611f8b6138d9565b604051908082528060200260200182016040528015611fb4578160200160208202803683370190505b5090505f8263ffffffff166001600160401b03811115611fd657611fd66138d9565b604051908082528060200260200182016040528015611fff578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff161015612099575f8061202e600e63ffffffff8086169061242f16565b9150915081858463ffffffff168151811061204b5761204b6136dc565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff1681518110612084576120846136dc565b60209081029190910101525050600101612004565b505f601481905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa1580156120e8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061210c91906138ed565b90505f5b8463ffffffff168163ffffffff161015611390575f848263ffffffff168151811061213d5761213d6136dc565b602002602001015190505f848363ffffffff1681518110612160576121606136dc565b6020026020010151905061217e82600e61243d90919063ffffffff16565b505f61218b828a5f6113cb565b90506121978382612985565b604080518381526020810183905261ffff8716916001600160a01b0386169130917f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f6910160405180910390a4505050806001019050612110565b610bd5816129b9565b5f610e61836001600160a01b038416612a12565b5f610e6161221b600d5490565b612226906001613796565b61222e612491565b61223990600a6138b8565b6002546122469190613796565b8591908561250d565b6107e58383836001612a59565b6007546001600160a01b03163b5f0361227b57601f805460ff19169055565b6007546040516301ffc9a760e01b815263701a818560e01b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa9250505080156122e6575060408051601f3d908101601f191682019092526122e3918101906136f0565b60015b6122f657601f805460ff19169055565b601f805460ff1916911515919091179055565b60026005540361232c57604051633ee5aeb560e01b815260040160405180910390fd5b6002600555565b5f80808061234a866001600160a01b038716612b2b565b909450925050505b9250929050565b5f611403846001600160a01b03851684612b63565b610bd581612b7f565b5f6123828484611eb6565b90505f198110156123c257818110156123b457828183604051637dc7a0d960e11b81526004016107a693929190613921565b6123c284848484035f612a59565b50505050565b6001600160a01b0383166123f1575f604051634b637e8f60e11b81526004016107a691906133da565b6001600160a01b03821661241a575f60405163ec442f0560e01b81526004016107a691906133da565b6107e5838383612bc8565b5f61088582612cdb565b5f80808061234a8686612ce5565b5f610e61836001600160a01b038416612d0e565b6001600160a01b03821661247a575f604051634b637e8f60e11b81526004016107a691906133da565b610c4f825f83612bc8565b60605f610e6183612d2a565b5f5f61249b610e68565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124d6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124fa9190613942565b905061250781601261395d565b91505090565b5f61253a61251a83612d83565b801561253557505f848061253057612530613976565b868809115b151590565b612545868686612daf565b611f109190613796565b5f5b8151811015610c4f5761258782828151811061256f5761256f6136dc565b6020026020010151600b612e5f90919063ffffffff16565b6125bf5781818151811061259d5761259d6136dc565b602002602001015160405163751dff9760e11b81526004016107a691906133da565b600101612551565b6060805f306001600160a01b0316634e85b1356040518163ffffffff1660e01b81526004015f60405180830381865afa158015612606573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261262d9190810190613a04565b60075460405163701a818560e01b81529192505f916001600160a01b039091169063701a8185906126629085906004016134d4565b5f60405180830381865afa15801561267c573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126a39190810190613a98565b905080516001600160401b038111156126be576126be6138d9565b6040519080825280602002602001820160405280156126e7578160200160208202803683370190505b50935080516001600160401b03811115612703576127036138d9565b60405190808252806020026020018201604052801561272c578160200160208202803683370190505b5092505f5b81518161ffff1610156127f257818161ffff1681518110612754576127546136dc565b60200260200101515f0151858261ffff1681518110612775576127756136dc565b60200260200101906001600160a01b031690816001600160a01b031681525050818161ffff16815181106127ab576127ab6136dc565b602002602001015160200151848261ffff16815181106127cd576127cd6136dc565b63ffffffff909216602092830291909101909101526127eb81613b59565b9050612731565b5050509091565b5f610e61612805612491565b61281090600a6138b8565b60025461281d9190613796565b600d54612246906001613796565b6017545f906301000000900461ffff16810361284857505f919050565b6017545f90612865906301000000900461ffff1684612710612daf565b9050610e6160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128ba573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128de9190613b79565b829063ffffffff908116906301e1338090612daf16565b6017545f90610100900461ffff16810361291057505f919050565b5f6129276129206012600a6138b8565b845f61141a565b6017549091505f90819061293d9060ff16612e73565b915091508183101561295357505f949350505050565b6017545f9061296c90610100900461ffff168584612daf565b905061297b8187612710612daf565b9695505050505050565b6001600160a01b0382166129ae575f60405163ec442f0560e01b81526004016107a691906133da565b610c4f5f8383612bc8565b5f6129c2825490565b90505f5b81811015612a0b57826001015f845f0183815481106129e7576129e76136dc565b905f5260205f20015481526020019081526020015f205f90558060010190506129c6565b50505f9055565b5f612a1d8383612f5d565b612a5257508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610885565b505f610885565b6001600160a01b038416612a82575f60405163e602df0560e01b81526004016107a691906133da565b6001600160a01b038316612aab575f604051634a1406b160e11b81526004016107a691906133da565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156123c257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612b1d91815260200190565b60405180910390a350505050565b5f818152600283016020526040812054819080612b5857612b4c8585612f74565b92505f91506123529050565b600192509050612352565b5f82815260028401602052604081208290556114038484612f7f565b5f612b8982612cdb565b90505f5b81811015612bbe57600283015f612ba48584612f8a565b815260208101919091526040015f90812055600101612b8d565b50610c4f826121f1565b6001600160a01b038316612bf2578060025f828254612be79190613796565b90915550612c4f9050565b6001600160a01b0383165f9081526020819052604090205481811015612c315783818360405163391434e360e21b81526004016107a693929190613921565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216612c6b57600280548290039055612c89565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612cce91815260200190565b60405180910390a3505050565b5f61088582612f95565b5f8080612cf28585612f8a565b5f81815260029690960160205260409095205494959350505050565b5f8181526002830160205260408120819055610e618383612f9e565b6060815f01805480602002602001604051908101604052809291908181526020018280548015612d7757602002820191905f5260205f20905b815481526020019060010190808311612d63575b50505050509050919050565b5f6002826003811115612d9857612d98613542565b612da29190613b94565b60ff166001149050919050565b5f5f5f612dbc8686612fa9565b91509150815f03612de057838181612dd657612dd6613976565b0492505050610e61565b818411612df757612df76003851502601118612fc5565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f610e61836001600160a01b038416612f5d565b5f8080612e806012610d25565b90505f846004811115612e9557612e95613542565b03612ea557809250829150612f57565b6003846004811115612eb957612eb9613542565b03612ecb576018549250829150612f57565b6001846004811115612edf57612edf613542565b03612ef757612eed81612fd6565b9250809150612f57565b6002846004811115612f0b57612f0b613542565b03612f2357612f1981612fd6565b9250829150612f57565b6004846004811115612f3757612f37613542565b03612f5757601854612f5190612f4c83612fd6565b6130fc565b92508291505b50915091565b5f9081526001919091016020526040902054151590565b5f610e61838361310b565b5f610e618383612a12565b5f610e618383613116565b5f610885825490565b5f610e61838361313c565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f5f60085f9054906101000a90046001600160a01b03166001600160a01b031663f3cc69936040518163ffffffff1660e01b8152600401602060405180830381865afa158015613028573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061304c91906138ed565b61ffff1690505f6130e160095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130ca9190613b79565b839063ffffffff908116906301e1338090612daf16565b90506114036130f282612710613796565b8590612710612daf565b5f828218828411028218610e61565b5f610e618383612f5d565b5f825f01828154811061312b5761312b6136dc565b905f5260205f200154905092915050565b5f8181526001830160205260408120548015613216575f61315e6001836138c6565b85549091505f90613171906001906138c6565b90508082146131d0575f865f01828154811061318f5761318f6136dc565b905f5260205f200154905080875f0184815481106131af576131af6136dc565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806131e1576131e1613bc1565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610885565b5f915050610885565b5f5f60208385031215613230575f5ffd5b82356001600160401b03811115613245575f5ffd5b8301601f81018513613255575f5ffd5b80356001600160401b0381111561326a575f5ffd5b8560208260051b840101111561327e575f5ffd5b6020919091019590945092505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156132d3575f5ffd5b5035919050565b6001600160a01b0381168114610bd5575f5ffd5b5f5f604083850312156132ff575f5ffd5b823561330a816132da565b946020939093013593505050565b5f60208284031215613328575f5ffd5b8135610e61816132da565b5f5f60408385031215613344575f5ffd5b50508035926020909101359150565b5f5f83601f840112613363575f5ffd5b5081356001600160401b03811115613379575f5ffd5b6020830191508360208260061b8501011115612352575f5ffd5b5f5f5f604084860312156133a5575f5ffd5b83356001600160401b038111156133ba575f5ffd5b6133c686828701613353565b909790965060209590950135949350505050565b6001600160a01b0391909116815260200190565b5f5f5f60608486031215613400575f5ffd5b833561340b816132da565b9250602084013561341b816132da565b929592945050506040919091013590565b60ff81168114610bd5575f5ffd5b61ffff81168114610bd5575f5ffd5b5f5f5f6060848603121561345b575f5ffd5b83356134668161342c565b925060208401356134768161343a565b915060408401356134868161343a565b809150509250925092565b5f8151808452602084019350602083015f5b828110156134ca5781516001600160a01b03168652602095860195909101906001016134a3565b5093949350505050565b602081525f610e616020830184613491565b5f5f604083850312156134f7575f5ffd5b823591506020830135613509816132da565b809150509250929050565b5f5f5f60608486031215613526575f5ffd5b8335925060208401359150604084013560048110613486575f5ffd5b634e487b7160e01b5f52602160045260245ffd5b608081016005861061357657634e487b7160e01b5f52602160045260245ffd5b94815261ffff93841660208201529190921660408201526060015290565b5f5f602083850312156135a5575f5ffd5b82356001600160401b038111156135ba575f5ffd5b6135c685828601613353565b90969095509350505050565b5f5f5f606084860312156135e4575f5ffd5b8335925060208401356135f6816132da565b91506040840135613486816132da565b604081525f6136186040830185613491565b82810360208401528084518083526020830191506020860192505f5b8181101561365857835163ffffffff16835260209384019390920191600101613634565b50909695505050505050565b604081525f6136766040830185613491565b82810360208401528084518083526020830191506020860192505f5b81811015613658578351835260209384019390920191600101613692565b5f5f604083850312156136c1575f5ffd5b82356136cc816132da565b91506020830135613509816132da565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613700575f5ffd5b81518015158114610e61575f5ffd5b600181811c9082168061372357607f821691505b60208210810361374157634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215613757575f5ffd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561088557610885613782565b63ffffffff81168114610bd5575f5ffd5b5f602082840312156137ca575f5ffd5b8135610e61816137a9565b6001815b6001841115613810578085048111156137f4576137f4613782565b600184161561380257908102905b60019390931c9280026137d9565b935093915050565b5f8261382657506001610885565b8161383257505f610885565b816001811461384857600281146138525761386e565b6001915050610885565b60ff84111561386357613863613782565b50506001821b610885565b5060208310610133831016604e8410600b8410161715613891575081810a610885565b61389d5f1984846137d5565b805f19048211156138b0576138b0613782565b029392505050565b5f610e6160ff841683613818565b8181038181111561088557610885613782565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156138fd575f5ffd5b8151610e618161343a565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b5f60208284031215613952575f5ffd5b8151610e618161342c565b60ff828116828216039081111561088557610885613782565b634e487b7160e01b5f52601260045260245ffd5b604080519081016001600160401b03811182821017156139ac576139ac6138d9565b60405290565b604051601f8201601f191681016001600160401b03811182821017156139da576139da6138d9565b604052919050565b5f6001600160401b038211156139fa576139fa6138d9565b5060051b60200190565b5f60208284031215613a14575f5ffd5b81516001600160401b03811115613a29575f5ffd5b8201601f81018413613a39575f5ffd5b8051613a4c613a47826139e2565b6139b2565b8082825260208201915060208360051b850101925086831115613a6d575f5ffd5b6020840193505b8284101561297b578351613a87816132da565b825260209384019390910190613a74565b5f60208284031215613aa8575f5ffd5b81516001600160401b03811115613abd575f5ffd5b8201601f81018413613acd575f5ffd5b8051613adb613a47826139e2565b8082825260208201915060208360061b850101925086831115613afc575f5ffd5b6020840193505b8284101561297b5760408488031215613b1a575f5ffd5b613b2261398a565b8451613b2d816132da565b81526020850151613b3d816137a9565b8060208301525080835250602082019150604084019350613b03565b5f61ffff821661ffff8103613b7057613b70613782565b60010192915050565b5f60208284031215613b89575f5ffd5b8151610e61816137a9565b5f60ff831680613bb257634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220c8e5b40e109f575781531ef89b26297cbc6aeecc383693fda6e6c6c96562a6ec64736f6c634300081c0033", + "bytecode": "0x60c060405234801561000f575f5ffd5b50604051614cb5380380614cb583398101604081905261002e916109aa565b8787878787878787856001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610072573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100969190610a79565b858560036100a48382610b1f565b5060046100b18282610b1f565b5050505f5f6100c58361057660201b60201c565b91509150816100d55760126100d7565b805b60ff1660a05250506001600160a01b03908116608052600160055587166101115760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0386166101385760405163e6c4247b60e01b815260040160405180910390fd5b600680546001600160a01b03808b166001600160a01b031992831617909255600780548a841690831617905560088054928916929091168217905560408051630691d8b960e31b8152905163348ec5c8916004808201926020929091908290030181865afa1580156101ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d09190610a79565b60095f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b0316633a0dad8e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610231573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102559190610a79565b600a5f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b031663d1717c7d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102b6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102da9190610bd9565b600a60146101000a81548160ff021916908360ff1602179055505f600d819055505f6014819055505f6015819055505f866001600160a01b0316637158da7c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610346573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036a9190610a79565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103c99190610bd9565b9050601260ff821611156103f057604051631c03248960e11b815260040160405180910390fd5b600460ff85161115610415576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff8416111561043c576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff83161115610463576040516317dbc4cb60e21b815260040160405180910390fd5b8360ff16600481111561047857610478610bf2565b6017805460ff1916600183600481111561049457610494610bf2565b02179055506017805461ffff84811663010000000264ffff00000019918716610100029190911664ffffffff0019909216919091171790556104d781600a610cfd565b6018556104e261064c565b50505050505050505061056960085f9054906101000a90046001600160a01b03166001600160a01b031663d86cd44e6040518163ffffffff1660e01b81526004015f60405180830381865afa15801561053d573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105649190810190610d0b565b610721565b5050505050505050610e68565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b038716916105bc91610dbd565b5f60405180830381855afa9150503d805f81146105f4576040519150601f19603f3d011682016040523d82523d5f602084013e6105f9565b606091505b509150915081801561060d57506020815110155b15610640575f818060200190518101906106279190610dd3565b905060ff811161063e576001969095509350505050565b505b505f9485945092505050565b60085460408051636c366a2760e11b815290515f926001600160a01b03169163d86cd44e91600480830192869291908290030181865afa158015610692573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106b99190810190610d0b565b90505f5b815181101561071d575f6106f48383815181106106dc576106dc610dea565b6020026020010151600b61085860201b90919060201c565b90508061071457604051630ea075bf60e21b815260040160405180910390fd5b506001016106bd565b5050565b6007546001600160a01b03163b5f0361074157601f805460ff1916905550565b6007546040516301ffc9a760e01b8152635b24e9f760e11b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa9250505080156107ac575060408051601f3d908101601f191682019092526107a991810190610dfe565b60015b6107c95760405163298febe360e01b815260040160405180910390fd5b801561083c57601f805460ff1916600117905560075460405163c653526b60e01b81526001600160a01b039091169063c653526b9061080c908590600401610e1d565b5f6040518083038186803b158015610822575f5ffd5b505afa158015610834573d5f5f3e3d5ffd5b505050505050565b60405163298febe360e01b815260040160405180910390fd5b50565b5f61086c836001600160a01b038416610875565b90505b92915050565b5f8181526001830160205260408120546108ba57508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561086f565b505f61086f565b6001600160a01b0381168114610855575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715610911576109116108d5565b604052919050565b5f82601f830112610928575f5ffd5b81516001600160401b03811115610941576109416108d5565b610954601f8201601f19166020016108e9565b818152846020838601011115610968575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b805160ff81168114610994575f5ffd5b919050565b805161ffff81168114610994575f5ffd5b5f5f5f5f5f5f5f5f610100898b0312156109c2575f5ffd5b88516109cd816108c1565b60208a01519098506109de816108c1565b60408a01519097506109ef816108c1565b60608a01519096506001600160401b03811115610a0a575f5ffd5b610a168b828c01610919565b60808b015190965090506001600160401b03811115610a33575f5ffd5b610a3f8b828c01610919565b945050610a4e60a08a01610984565b9250610a5c60c08a01610999565b9150610a6a60e08a01610999565b90509295985092959890939650565b5f60208284031215610a89575f5ffd5b8151610a94816108c1565b9392505050565b600181811c90821680610aaf57607f821691505b602082108103610acd57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610b1a57805f5260205f20601f840160051c81016020851015610af85750805b601f840160051c820191505b81811015610b17575f8155600101610b04565b50505b505050565b81516001600160401b03811115610b3857610b386108d5565b610b4c81610b468454610a9b565b84610ad3565b6020601f821160018114610b7e575f8315610b675750848201515b5f19600385901b1c1916600184901b178455610b17565b5f84815260208120601f198516915b82811015610bad5787850151825560209485019460019092019101610b8d565b5084821015610bca57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60208284031215610be9575f5ffd5b61086c82610984565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b6001841115610c5557808504811115610c3957610c39610c06565b6001841615610c4757908102905b60019390931c928002610c1e565b935093915050565b5f82610c6b5750600161086f565b81610c7757505f61086f565b8160018114610c8d5760028114610c9757610cb3565b600191505061086f565b60ff841115610ca857610ca8610c06565b50506001821b61086f565b5060208310610133831016604e8410600b8410161715610cd6575081810a61086f565b610ce25f198484610c1a565b805f1904821115610cf557610cf5610c06565b029392505050565b5f61086c60ff841683610c5d565b5f60208284031215610d1b575f5ffd5b81516001600160401b03811115610d30575f5ffd5b8201601f81018413610d40575f5ffd5b80516001600160401b03811115610d5957610d596108d5565b8060051b610d69602082016108e9565b91825260208184018101929081019087841115610d84575f5ffd5b6020850194505b83851015610db25784519250610da0836108c1565b82825260209485019490910190610d8b565b979650505050505050565b5f82518060208501845e5f920191825250919050565b5f60208284031215610de3575f5ffd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610e0e575f5ffd5b81518015158114610a94575f5ffd5b602080825282518282018190525f918401906040840190835b81811015610e5d5783516001600160a01b0316835260209384019390920191600101610e36565b509095945050505050565b60805160a051613e2f610e865f395f50505f610f750152613e2f5ff3fe608060405234801561000f575f5ffd5b50600436106102b2575f3560e01c806301e1d114146102b657806303d44854146102cd57806306fdde03146102e257806307a2d13a146102f7578063095ea7b31461030a5780630a28a4771461032d5780630a605c6d146103405780630c6a62dd146103485780630d1e66671461035b5780630df571f71461036e578063105444941461038157806318160ddd1461039457806318c219491461039c5780631f52692b146103af57806323b872dd146103cf578063313ce567146103e2578063348ec5c8146103f757806338d52e0f1461040a5780633a0dad8e146104125780633ab6d27c14610425578063402d267d14610438578063493a6e211461044c5780634cdad5061461032d5780634e85b1351461045f5780635de3dfdc146104745780636e553f651461047f57806370a082311461048d5780637847ea53146104a057806379502c55146104c057806380ceebfe146104d35780638f5c9465146104e657806394bf804d1461047f57806395d89b411461050257806397ee11441461050a5780639908840c14610540578063a68a526714610549578063a9059cbb1461055c578063aa2f892d1461056f578063acdb3d5114610582578063b1bd7e2e1461058b578063b3d7f6b91461032d578063b460af941461059e578063b6eba653146105ac578063ba0876521461059e578063bdca9165146105c2578063c0b568e1146105cb578063c3f0d30e146105de578063c63d75b614610438578063c6e6f592146105f1578063ce96cb7714610604578063d1717c7d14610617578063d3d034581461062b578063d853365f14610641578063d905777e14610649578063dd62ed3e1461065c578063e51a85f61461066f578063e5e9719314610682578063e66f53b714610695578063ef8b30f71461032d578063f64c6f32146106a8575b5f5ffd5b600d545b6040519081526020015b60405180910390f35b6102e06102db3660046133b6565b6106b0565b005b6102ea610893565b6040516102c49190613425565b6102ba61030536600461345a565b610923565b61031d610318366004613485565b610934565b60405190151581526020016102c4565b6102ba61033b36600461345a565b61094b565b6015546102ba565b6102e06103563660046134af565b610965565b6102e061036936600461345a565b610a72565b6102e061037c3660046134ca565b610ce3565b6102e061038f36600461352a565b610d5e565b6002546102ba565b6102e06103aa36600461345a565b610e7f565b6006546103c2906001600160a01b031681565b6040516102c49190613571565b61031d6103dd366004613585565b610f4e565b60125b60405160ff90911681526020016102c4565b6009546103c2906001600160a01b031681565b6103c2610f73565b600a546103c2906001600160a01b031681565b6102e06104333660046135e0565b610f97565b6102ba6104463660046134af565b505f1990565b6102e061045a36600461345a565b611164565b6104676114ab565b6040516102c4919061366b565b601f5460ff1661031d565b6102ba61033b36600461367d565b6102ba61049b3660046134af565b6114bc565b6104ab6301e1338081565b60405163ffffffff90911681526020016102c4565b6008546103c2906001600160a01b031681565b6102ba6104e13660046136ab565b6114d6565b6104ef61271081565b60405161ffff90911681526020016102c4565b6102ea611516565b6017546018546105309160ff81169161ffff610100830481169263010000009004169084565b6040516102c494939291906136ed565b6104ef61012c81565b6102ba6105573660046136ab565b611525565b61031d61056a366004613485565b611554565b6102e061057d36600461345a565b611561565b6102ba60165481565b6102e061059936600461372b565b61173a565b6102ba61033b366004613769565b6105b461196a565b6040516102c492919061379d565b6104ef610bb881565b6102e06105d936600461345a565b611ac1565b6102e06105ec36600461345a565b611c7b565b6102ba6105ff36600461345a565b611e6f565b6102ba6106123660046134af565b611e7a565b600a546103e590600160a01b900460ff1681565b610633611e8d565b6040516102c49291906137fb565b6103e5601281565b6102ba6106573660046134af565b611fb7565b6102ba61066a366004613847565b611fc1565b6102ba61067d36600461345a565b611feb565b6102e061069036600461345a565b612024565b6007546103c2906001600160a01b031681565b6014546102ba565b6006546001600160a01b031633146106db57604051631a27eac360e11b815260040160405180910390fd5b6106e5600b6122fc565b5f5b818110156107e5575f83838381811061070257610702613873565b905060200201602081019061071791906134af565b600854604051633af32abf60e01b81529192506001600160a01b031690633af32abf90610748908490600401613571565b602060405180830381865afa158015610763573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107879190613887565b6107af578060405163751dff9760e11b81526004016107a69190613571565b60405180910390fd5b5f6107bb600b83612305565b9050806107db57604051630ea075bf60e21b815260040160405180910390fd5b50506001016106e7565b50601f5460ff16156108505760075460405163c653526b60e01b81526001600160a01b039091169063c653526b9061082390859085906004016138a6565b5f6040518083038186803b158015610839575f5ffd5b505afa15801561084b573d5f5f3e3d5ffd5b505050505b81816040516108609291906138f2565b604051908190038120907fa975983c7a4dcf80477a447433240de322f36428f1b3864e50d7a45e14c68b66905f90a25050565b6060600380546108a290613933565b80601f01602080910402602001604051908101604052809291908181526020018280546108ce90613933565b80156109195780601f106108f057610100808354040283529160200191610919565b820191905f5260205f20905b8154815290600101906020018083116108fc57829003601f168201915b5050505050905090565b5f61092e825f612319565b92915050565b5f3361094181858561235a565b5060019392505050565b5f60405163125ad87760e31b815260040160405180910390fd5b6006546001600160a01b0316331461099057604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b0381166109b75760405163e6c4247b60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b03831617905560408051634e85b13560e01b81529051610a3c913091634e85b135916004808201925f929091908290030181865afa158015610a10573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a3791908101906139f9565b61236c565b6040516001600160a01b038216907f83293ffeebb677b167941693470018acf300605df266a35e9fdb66f24ff00fe0905f90a250565b610a7a6124a0565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aca573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aee9190613887565b610b0b576040516312aecd8160e01b815260040160405180910390fd5b805f03610b3457610b1a610f73565b604051636b30633560e01b81526004016107a69190613571565b5f610b3d610f73565b6001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401610b689190613571565b602060405180830381865afa158015610b83573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba79190613a8d565b905080821115610bca57604051632ca2f52b60e11b815260040160405180910390fd5b5f610bd3610f73565b600a546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92610c09923392909116908890600401613aa4565b6020604051808303815f875af1158015610c25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c499190613887565b905080610c69576040516312171d8360e31b815260040160405180910390fd5b5f610c75600e336124ca565b9150610c90905033610c878684613adc565b600e91906124f0565b508360145f828254610ca29190613adc565b9091555050604051849033907f55896b30a78fc55b78937f8014dde3f0035e9d37a4f6ac36841fb8b62f7e2b13905f90a3505050610ce06001600555565b50565b6009546001600160a01b03163314610d0e57604051631a27eac360e11b815260040160405180910390fd5b8015610d5a578060165f828254610d259190613adc565b9091555050601654604051829084907f8b8789cf9157fe7b016901e4ed3a5d0971caa8b7c031da0b25638ccf65841b2a905f90a45b5050565b6009546001600160a01b03163314610d8957604051631a27eac360e11b815260040160405180910390fd5b610d936019612505565b815f5b8161ffff168161ffff161015610e2357610e1a85858361ffff16818110610dbf57610dbf613873565b610dd592602060409092020190810191506134af565b86868461ffff16818110610deb57610deb613873565b9050604002016020016020810190610e039190613b00565b63ffffffff1660196124f09092919063ffffffff16565b50600101610d96565b50600d8290555f610e3b60125b61030590600a613bfe565b601854909150811115610e4e5760188190555b60405183907f5e1ff954b5e5257e9ee5d4cb07059e8f5e69b1aaaf9911e5d8d90a6894de9c21905f90a25050505050565b6006546001600160a01b03163314610eaa57604051631a27eac360e11b815260040160405180910390fd5b805f03610eb957610b1a610f73565b601654811115610edc57604051632ca2f52b60e11b815260040160405180910390fd5b8060165f828254610eed9190613c0c565b9091555050600a5460405163741fca4b60e01b8152600481018390526001600160a01b039091169063741fca4b906024015f604051808303815f87803b158015610f35575f5ffd5b505af1158015610f47573d5f5f3e3d5ffd5b5050505050565b5f33610f5b85828561250e565b610f6685858561255f565b60019150505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6006546001600160a01b03163314610fc257604051631a27eac360e11b815260040160405180910390fd5b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611012573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110369190613887565b611053576040516312aecd8160e01b815260040160405180910390fd5b600460ff84161115611078576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff8316111561109f576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff821611156110c6576040516317dbc4cb60e21b815260040160405180910390fd5b8260ff1660048111156110db576110db6136d9565b6017805460ff191660018360048111156110f7576110f76136d9565b02179055506017805464ffffffff00191661010061ffff85811691820264ffff00000019169290921763010000009285169283021790925560405190919060ff8616907fd24f39e523bfa412fa391702710dc62e1c82d87a8e83228a37c42be1b4870f45905f90a4505050565b600a546001600160a01b0316331461118f57604051631a27eac360e11b815260040160405180910390fd5b6111976124a0565b5f6111a260116125bc565b90508063ffffffff165f036111b757506114a1565b5f8163ffffffff166001600160401b038111156111d6576111d661396b565b6040519080825280602002602001820160405280156111ff578160200160208202803683370190505b5090505f8263ffffffff166001600160401b038111156112215761122161396b565b60405190808252806020026020018201604052801561124a578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff1610156112e4575f80611279601163ffffffff808616906125c616565b9150915081858463ffffffff168151811061129657611296613873565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff16815181106112cf576112cf613873565b6020908102919091010152505060010161124f565b505f601581905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa158015611333573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113579190613c1f565b90505f5b8463ffffffff168163ffffffff16101561149b575f848263ffffffff168151811061138857611388613873565b602002602001015190505f848363ffffffff16815181106113ab576113ab613873565b602002602001015190506113c98260116125d490919063ffffffff16565b505f6113d6828a5f611525565b90506113e230836125e8565b600a54604051634adfc2e760e01b81526001600160a01b0390911690634adfc2e7906114149086908590600401613c3a565b5f604051808303815f87803b15801561142b575f5ffd5b505af115801561143d573d5f5f3e3d5ffd5b5050604080518481526020810186905261ffff891693506001600160a01b038716925030917f215abfcd108b85fbee47f26fda2de66f90f14fa5fcaf0201698ad8ac9323545f910160405180910390a450505080600101905061135b565b50505050505b610ce06001600555565b60606114b7600b61261c565b905090565b6001600160a01b03165f9081526020819052604090205490565b5f61150e6114e2612628565b6114ed90600a613bfe565b6002546114fa9190613adc565b611505856001613adc565b869190856126a4565b949350505050565b6060600480546108a290613933565b5f61150e611534846001613adc565b61153c612628565b61154790600a613bfe565b6002546115059190613adc565b5f3361094181858561255f565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115b1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d59190613887565b6115f2576040516312aecd8160e01b815260040160405180910390fd5b805f036116145730604051636b30633560e01b81526004016107a69190613571565b5f61161e336114bc565b90508082111561164157604051632ca2f52b60e11b815260040160405180910390fd5b6040516323b872dd60e01b81525f9030906323b872dd9061166a90339084908890600401613aa4565b6020604051808303815f875af1158015611686573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116aa9190613887565b9050806116ca576040516312171d8360e31b815260040160405180910390fd5b5f6116d66011336124ca565b91506116f19050336116e88684613adc565b601191906124f0565b508360155f8282546117039190613adc565b9091555050604051849033907f222dc200773fe9b45015bf792e8fee37d651e3590c215806a5042404b6d741d2905f90a350505050565b6007546001600160a01b0316331461176557604051631a27eac360e11b815260040160405180910390fd5b601f5460ff1615611789576040516317dbc4cb60e21b815260040160405180910390fd5b5f8190036117aa57604051631121aa8d60e01b815260040160405180910390fd5b6117b4601c612505565b5f816001600160401b038111156117cd576117cd61396b565b6040519080825280602002602001820160405280156117f6578160200160208202803683370190505b5090505f82815b8161ffff168161ffff1610156118f4575f86868361ffff1681811061182457611824613873565b61183a92602060409092020190810191506134af565b90505f87878461ffff1681811061185357611853613873565b905060400201602001602081019061186b9190613b00565b905081868461ffff168151811061188457611884613873565b6001600160a01b03909216602092830291909101909101525f6118b2601c8463ffffffff808616906124f016565b9050806118d457826040516346bdabe160e01b81526004016107a69190613571565b6118e463ffffffff831687613adc565b95505050508060010190506117fd565b506118fe836126e6565b600a60149054906101000a900460ff16600a61191a9190613bfe565b821461193957604051639006dd2760e01b815260040160405180910390fd5b60405133907f2d47a742b8d7df7c1fc5a9a631b206b364e6cb2722490759f63bb3ab14b132e0905f90a25050505050565b601f54606090819060ff161561198a5761198261275e565b915091509091565b5f611995601c6125bc565b90508061ffff166001600160401b038111156119b3576119b361396b565b6040519080825280602002602001820160405280156119dc578160200160208202803683370190505b5092508061ffff166001600160401b038111156119fb576119fb61396b565b604051908082528060200260200182016040528015611a24578160200160208202803683370190505b5091505f5b8161ffff168161ffff161015611abb575f80611a4a601c61ffff85166125c6565b9150915081868461ffff1681518110611a6557611a65613873565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611a9c57611a9c613873565b63ffffffff909216602092830291909101909101525050600101611a29565b50509091565b611ac96124a0565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b19573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b3d9190613887565b611b5a576040516312aecd8160e01b815260040160405180910390fd5b805f03611b6957610b1a610f73565b5f611b75600e336124ca565b91505081811015611b9957604051632ca2f52b60e11b815260040160405180910390fd5b600a546040516351edffb160e01b81526001600160a01b03909116906351edffb190611bcb9033908690600401613c3a565b5f604051808303815f87803b158015611be2575f5ffd5b505af1158015611bf4573d5f5f3e3d5ffd5b505050505f8282611c059190613c0c565b9050805f03611c1f57611c19600e336125d4565b50611c2d565b611c2b600e33836124f0565b505b8260145f828254611c3e9190613c0c565b9091555050604051839033907f96a9a6886cdf3047a125454218a23d3961fd3a78643123b248a9d106d0ac94fd905f90a35050610ce06001600555565b611c836124a0565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cd3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cf79190613887565b611d14576040516312aecd8160e01b815260040160405180910390fd5b805f03611d365730604051636b30633560e01b81526004016107a69190613571565b5f611d426011336124ca565b91505081811015611d6657604051632ca2f52b60e11b815260040160405180910390fd5b5f611d718383613c0c565b9050805f03611d8b57611d856011336125d4565b50611d99565b611d97601133836124f0565b505b8260155f828254611daa9190613c0c565b909155505060405163a9059cbb60e01b81525f90309063a9059cbb90611dd69033908890600401613c3a565b6020604051808303815f875af1158015611df2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e169190613887565b905080611e36576040516312171d8360e31b815260040160405180910390fd5b604051849033907f046d3e17087d323298991516e3fdec36fe1204d6bff7fb6e2b8eca77b80a22ad905f90a3505050610ce06001600555565b5f61092e825f612990565b5f61092e611e87836114bc565b5f612319565b6060805f611e9b60196125bc565b90508061ffff166001600160401b03811115611eb957611eb961396b565b604051908082528060200260200182016040528015611ee2578160200160208202803683370190505b5092508061ffff166001600160401b03811115611f0157611f0161396b565b604051908082528060200260200182016040528015611f2a578160200160208202803683370190505b5091505f5b8161ffff168161ffff161015611abb575f80611f50601961ffff85166125c6565b9150915081868461ffff1681518110611f6b57611f6b613873565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611fa257611fa2613873565b60209081029190910101525050600101611f2f565b5f61092e826114bc565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b5f5f611ff6836129c2565b90505f6120038285613c0c565b90505f61200f82612a8c565b905061201b8184613adc565b95945050505050565b600a546001600160a01b0316331461204f57604051631a27eac360e11b815260040160405180910390fd5b6120576124a0565b5f612062600e6125bc565b90508063ffffffff165f0361207757506114a1565b5f8163ffffffff166001600160401b038111156120965761209661396b565b6040519080825280602002602001820160405280156120bf578160200160208202803683370190505b5090505f8263ffffffff166001600160401b038111156120e1576120e161396b565b60405190808252806020026020018201604052801561210a578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff1610156121a4575f80612139600e63ffffffff808616906125c616565b9150915081858463ffffffff168151811061215657612156613873565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff168151811061218f5761218f613873565b6020908102919091010152505060010161210f565b505f601481905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa1580156121f3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122179190613c1f565b90505f5b8463ffffffff168163ffffffff16101561149b575f848263ffffffff168151811061224857612248613873565b602002602001015190505f848363ffffffff168151811061226b5761226b613873565b6020026020010151905061228982600e6125d490919063ffffffff16565b505f612296828a5f6114d6565b90506122a28382612b1c565b604080518381526020810183905261ffff8716916001600160a01b0386169130917f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f6910160405180910390a450505080600101905061221b565b610ce081612b50565b5f610f6c836001600160a01b038416612ba9565b5f610f6c612326600d5490565b612331906001613adc565b612339612628565b61234490600a613bfe565b6002546123519190613adc565b859190856126a4565b6123678383836001612bf0565b505050565b6007546001600160a01b03163b5f0361238c57601f805460ff1916905550565b6007546040516301ffc9a760e01b8152635b24e9f760e11b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa9250505080156123f7575060408051601f3d908101601f191682019092526123f491810190613887565b60015b6124145760405163298febe360e01b815260040160405180910390fd5b801561248757601f805460ff1916600117905560075460405163c653526b60e01b81526001600160a01b039091169063c653526b9061245790859060040161366b565b5f6040518083038186803b15801561246d575f5ffd5b505afa15801561247f573d5f5f3e3d5ffd5b505050505050565b60405163298febe360e01b815260040160405180910390fd5b6002600554036124c357604051633ee5aeb560e01b815260040160405180910390fd5b6002600555565b5f8080806124e1866001600160a01b038716612cc2565b909450925050505b9250929050565b5f61150e846001600160a01b03851684612cfa565b610ce081612d16565b5f6125198484611fc1565b90505f19811015612559578181101561254b57828183604051637dc7a0d960e11b81526004016107a693929190613c53565b61255984848484035f612bf0565b50505050565b6001600160a01b038316612588575f604051634b637e8f60e11b81526004016107a69190613571565b6001600160a01b0382166125b1575f60405163ec442f0560e01b81526004016107a69190613571565b612367838383612d5f565b5f61092e82612e72565b5f8080806124e18686612e7c565b5f610f6c836001600160a01b038416612ea5565b6001600160a01b038216612611575f604051634b637e8f60e11b81526004016107a69190613571565b610d5a825f83612d5f565b60605f610f6c83612ec1565b5f5f612632610f73565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561266d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126919190613c74565b905061269e816012613c8f565b91505090565b5f6126d16126b183612f1a565b80156126cc57505f84806126c7576126c7613ca8565b868809115b151590565b6126dc868686612f46565b61201b9190613adc565b5f5b8151811015610d5a5761271e82828151811061270657612706613873565b6020026020010151600b612ff690919063ffffffff16565b6127565781818151811061273457612734613873565b602002602001015160405163751dff9760e11b81526004016107a69190613571565b6001016126e8565b6060805f306001600160a01b0316634e85b1356040518163ffffffff1660e01b81526004015f60405180830381865afa15801561279d573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526127c491908101906139f9565b60075460405163701a818560e01b81529192505f916001600160a01b039091169063701a8185906127f990859060040161366b565b5f60405180830381865afa158015612813573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261283a9190810190613cbc565b905080516001600160401b038111156128555761285561396b565b60405190808252806020026020018201604052801561287e578160200160208202803683370190505b50935080516001600160401b0381111561289a5761289a61396b565b6040519080825280602002602001820160405280156128c3578160200160208202803683370190505b5092505f5b81518161ffff16101561298957818161ffff16815181106128eb576128eb613873565b60200260200101515f0151858261ffff168151811061290c5761290c613873565b60200260200101906001600160a01b031690816001600160a01b031681525050818161ffff168151811061294257612942613873565b602002602001015160200151848261ffff168151811061296457612964613873565b63ffffffff9092166020928302919091019091015261298281613d7d565b90506128c8565b5050509091565b5f610f6c61299c612628565b6129a790600a613bfe565b6002546129b49190613adc565b600d54612351906001613adc565b6017545f906301000000900461ffff1681036129df57505f919050565b6017545f906129fc906301000000900461ffff1684612710612f46565b9050610f6c60095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a51573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a759190613d9d565b829063ffffffff908116906301e1338090612f4616565b6017545f90610100900461ffff168103612aa757505f919050565b5f612abe612ab76012600a613bfe565b845f611525565b6017549091505f908190612ad49060ff1661300a565b9150915081831015612aea57505f949350505050565b6017545f90612b0390610100900461ffff168584612f46565b9050612b128187612710612f46565b9695505050505050565b6001600160a01b038216612b45575f60405163ec442f0560e01b81526004016107a69190613571565b610d5a5f8383612d5f565b5f612b59825490565b90505f5b81811015612ba257826001015f845f018381548110612b7e57612b7e613873565b905f5260205f20015481526020019081526020015f205f9055806001019050612b5d565b50505f9055565b5f612bb483836130f4565b612be957508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561092e565b505f61092e565b6001600160a01b038416612c19575f60405163e602df0560e01b81526004016107a69190613571565b6001600160a01b038316612c42575f604051634a1406b160e11b81526004016107a69190613571565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561255957826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612cb491815260200190565b60405180910390a350505050565b5f818152600283016020526040812054819080612cef57612ce3858561310b565b92505f91506124e99050565b6001925090506124e9565b5f828152600284016020526040812082905561150e8484613116565b5f612d2082612e72565b90505f5b81811015612d5557600283015f612d3b8584613121565b815260208101919091526040015f90812055600101612d24565b50610d5a826122fc565b6001600160a01b038316612d89578060025f828254612d7e9190613adc565b90915550612de69050565b6001600160a01b0383165f9081526020819052604090205481811015612dc85783818360405163391434e360e21b81526004016107a693929190613c53565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216612e0257600280548290039055612e20565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612e6591815260200190565b60405180910390a3505050565b5f61092e8261312c565b5f8080612e898585613121565b5f81815260029690960160205260409095205494959350505050565b5f8181526002830160205260408120819055610f6c8383613135565b6060815f01805480602002602001604051908101604052809291908181526020018280548015612f0e57602002820191905f5260205f20905b815481526020019060010190808311612efa575b50505050509050919050565b5f6002826003811115612f2f57612f2f6136d9565b612f399190613db8565b60ff166001149050919050565b5f5f5f612f538686613140565b91509150815f03612f7757838181612f6d57612f6d613ca8565b0492505050610f6c565b818411612f8e57612f8e600385150260111861315c565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f610f6c836001600160a01b0384166130f4565b5f80806130176012610e30565b90505f84600481111561302c5761302c6136d9565b0361303c578092508291506130ee565b6003846004811115613050576130506136d9565b036130625760185492508291506130ee565b6001846004811115613076576130766136d9565b0361308e576130848161316d565b92508091506130ee565b60028460048111156130a2576130a26136d9565b036130ba576130b08161316d565b92508291506130ee565b60048460048111156130ce576130ce6136d9565b036130ee576018546130e8906130e38361316d565b613293565b92508291505b50915091565b5f9081526001919091016020526040902054151590565b5f610f6c83836132a2565b5f610f6c8383612ba9565b5f610f6c83836132ad565b5f61092e825490565b5f610f6c83836132d3565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f5f60085f9054906101000a90046001600160a01b03166001600160a01b031663f3cc69936040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131e39190613c1f565b61ffff1690505f61327860095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561323d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132619190613d9d565b839063ffffffff908116906301e1338090612f4616565b905061150e61328982612710613adc565b8590612710612f46565b5f828218828411028218610f6c565b5f610f6c83836130f4565b5f825f0182815481106132c2576132c2613873565b905f5260205f200154905092915050565b5f81815260018301602052604081205480156133ad575f6132f5600183613c0c565b85549091505f9061330890600190613c0c565b9050808214613367575f865f01828154811061332657613326613873565b905f5260205f200154905080875f01848154811061334657613346613873565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061337857613378613de5565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061092e565b5f91505061092e565b5f5f602083850312156133c7575f5ffd5b82356001600160401b038111156133dc575f5ffd5b8301601f810185136133ec575f5ffd5b80356001600160401b03811115613401575f5ffd5b8560208260051b8401011115613415575f5ffd5b6020919091019590945092505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f6020828403121561346a575f5ffd5b5035919050565b6001600160a01b0381168114610ce0575f5ffd5b5f5f60408385031215613496575f5ffd5b82356134a181613471565b946020939093013593505050565b5f602082840312156134bf575f5ffd5b8135610f6c81613471565b5f5f604083850312156134db575f5ffd5b50508035926020909101359150565b5f5f83601f8401126134fa575f5ffd5b5081356001600160401b03811115613510575f5ffd5b6020830191508360208260061b85010111156124e9575f5ffd5b5f5f5f6040848603121561353c575f5ffd5b83356001600160401b03811115613551575f5ffd5b61355d868287016134ea565b909790965060209590950135949350505050565b6001600160a01b0391909116815260200190565b5f5f5f60608486031215613597575f5ffd5b83356135a281613471565b925060208401356135b281613471565b929592945050506040919091013590565b60ff81168114610ce0575f5ffd5b61ffff81168114610ce0575f5ffd5b5f5f5f606084860312156135f2575f5ffd5b83356135fd816135c3565b9250602084013561360d816135d1565b9150604084013561361d816135d1565b809150509250925092565b5f8151808452602084019350602083015f5b828110156136615781516001600160a01b031686526020958601959091019060010161363a565b5093949350505050565b602081525f610f6c6020830184613628565b5f5f6040838503121561368e575f5ffd5b8235915060208301356136a081613471565b809150509250929050565b5f5f5f606084860312156136bd575f5ffd5b833592506020840135915060408401356004811061361d575f5ffd5b634e487b7160e01b5f52602160045260245ffd5b608081016005861061370d57634e487b7160e01b5f52602160045260245ffd5b94815261ffff93841660208201529190921660408201526060015290565b5f5f6020838503121561373c575f5ffd5b82356001600160401b03811115613751575f5ffd5b61375d858286016134ea565b90969095509350505050565b5f5f5f6060848603121561377b575f5ffd5b83359250602084013561378d81613471565b9150604084013561361d81613471565b604081525f6137af6040830185613628565b82810360208401528084518083526020830191506020860192505f5b818110156137ef57835163ffffffff168352602093840193909201916001016137cb565b50909695505050505050565b604081525f61380d6040830185613628565b82810360208401528084518083526020830191506020860192505f5b818110156137ef578351835260209384019390920191600101613829565b5f5f60408385031215613858575f5ffd5b823561386381613471565b915060208301356136a081613471565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613897575f5ffd5b81518015158114610f6c575f5ffd5b602080825281018290525f8360408301825b858110156138e85782356138cb81613471565b6001600160a01b03168252602092830192909101906001016138b8565b5095945050505050565b5f8184825b8581101561392857813561390a81613471565b6001600160a01b0316835260209283019291909101906001016138f7565b509095945050505050565b600181811c9082168061394757607f821691505b60208210810361396557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b03811182821017156139a1576139a161396b565b60405290565b604051601f8201601f191681016001600160401b03811182821017156139cf576139cf61396b565b604052919050565b5f6001600160401b038211156139ef576139ef61396b565b5060051b60200190565b5f60208284031215613a09575f5ffd5b81516001600160401b03811115613a1e575f5ffd5b8201601f81018413613a2e575f5ffd5b8051613a41613a3c826139d7565b6139a7565b8082825260208201915060208360051b850101925086831115613a62575f5ffd5b6020840193505b82841015612b12578351613a7c81613471565b825260209384019390910190613a69565b5f60208284031215613a9d575f5ffd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561092e5761092e613ac8565b63ffffffff81168114610ce0575f5ffd5b5f60208284031215613b10575f5ffd5b8135610f6c81613aef565b6001815b6001841115613b5657808504811115613b3a57613b3a613ac8565b6001841615613b4857908102905b60019390931c928002613b1f565b935093915050565b5f82613b6c5750600161092e565b81613b7857505f61092e565b8160018114613b8e5760028114613b9857613bb4565b600191505061092e565b60ff841115613ba957613ba9613ac8565b50506001821b61092e565b5060208310610133831016604e8410600b8410161715613bd7575081810a61092e565b613be35f198484613b1b565b805f1904821115613bf657613bf6613ac8565b029392505050565b5f610f6c60ff841683613b5e565b8181038181111561092e5761092e613ac8565b5f60208284031215613c2f575f5ffd5b8151610f6c816135d1565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b5f60208284031215613c84575f5ffd5b8151610f6c816135c3565b60ff828116828216039081111561092e5761092e613ac8565b634e487b7160e01b5f52601260045260245ffd5b5f60208284031215613ccc575f5ffd5b81516001600160401b03811115613ce1575f5ffd5b8201601f81018413613cf1575f5ffd5b8051613cff613a3c826139d7565b8082825260208201915060208360061b850101925086831115613d20575f5ffd5b6020840193505b82841015612b125760408488031215613d3e575f5ffd5b613d4661397f565b8451613d5181613471565b81526020850151613d6181613aef565b8060208301525080835250602082019150604084019350613d27565b5f61ffff821661ffff8103613d9457613d94613ac8565b60010192915050565b5f60208284031215613dad575f5ffd5b8151610f6c81613aef565b5f60ff831680613dd657634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b634e487b7160e01b5f52603160045260245ffdfea26469706673582212202adca4528e879ae5ae2b6f30561933d6f6e0ae2a6c32405ec1e4730bbd879e3964736f6c634300081c0033", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b50600436106102b2575f3560e01c806301e1d114146102b657806303d44854146102cd57806306fdde03146102e257806307a2d13a146102f7578063095ea7b31461030a5780630a28a4771461032d5780630a605c6d146103405780630c6a62dd146103485780630d1e66671461035b5780630df571f71461036e578063105444941461038157806318160ddd1461039457806318c219491461039c5780631f52692b146103af57806323b872dd146103cf578063313ce567146103e2578063348ec5c8146103f757806338d52e0f1461040a5780633a0dad8e146104125780633ab6d27c14610425578063402d267d14610438578063493a6e211461044c5780634cdad5061461032d5780634e85b1351461045f5780635de3dfdc146104745780636e553f651461047f57806370a082311461048d5780637847ea53146104a057806379502c55146104c057806380ceebfe146104d35780638f5c9465146104e657806394bf804d1461047f57806395d89b411461050257806397ee11441461050a5780639908840c14610540578063a68a526714610549578063a9059cbb1461055c578063aa2f892d1461056f578063acdb3d5114610582578063b1bd7e2e1461058b578063b3d7f6b91461032d578063b460af941461059e578063b6eba653146105ac578063ba0876521461059e578063bdca9165146105c2578063c0b568e1146105cb578063c3f0d30e146105de578063c63d75b614610438578063c6e6f592146105f1578063ce96cb7714610604578063d1717c7d14610617578063d3d034581461062b578063d853365f14610641578063d905777e14610649578063dd62ed3e1461065c578063e51a85f61461066f578063e5e9719314610682578063e66f53b714610695578063ef8b30f71461032d578063f64c6f32146106a8575b5f5ffd5b600d545b6040519081526020015b60405180910390f35b6102e06102db3660046133b6565b6106b0565b005b6102ea610893565b6040516102c49190613425565b6102ba61030536600461345a565b610923565b61031d610318366004613485565b610934565b60405190151581526020016102c4565b6102ba61033b36600461345a565b61094b565b6015546102ba565b6102e06103563660046134af565b610965565b6102e061036936600461345a565b610a72565b6102e061037c3660046134ca565b610ce3565b6102e061038f36600461352a565b610d5e565b6002546102ba565b6102e06103aa36600461345a565b610e7f565b6006546103c2906001600160a01b031681565b6040516102c49190613571565b61031d6103dd366004613585565b610f4e565b60125b60405160ff90911681526020016102c4565b6009546103c2906001600160a01b031681565b6103c2610f73565b600a546103c2906001600160a01b031681565b6102e06104333660046135e0565b610f97565b6102ba6104463660046134af565b505f1990565b6102e061045a36600461345a565b611164565b6104676114ab565b6040516102c4919061366b565b601f5460ff1661031d565b6102ba61033b36600461367d565b6102ba61049b3660046134af565b6114bc565b6104ab6301e1338081565b60405163ffffffff90911681526020016102c4565b6008546103c2906001600160a01b031681565b6102ba6104e13660046136ab565b6114d6565b6104ef61271081565b60405161ffff90911681526020016102c4565b6102ea611516565b6017546018546105309160ff81169161ffff610100830481169263010000009004169084565b6040516102c494939291906136ed565b6104ef61012c81565b6102ba6105573660046136ab565b611525565b61031d61056a366004613485565b611554565b6102e061057d36600461345a565b611561565b6102ba60165481565b6102e061059936600461372b565b61173a565b6102ba61033b366004613769565b6105b461196a565b6040516102c492919061379d565b6104ef610bb881565b6102e06105d936600461345a565b611ac1565b6102e06105ec36600461345a565b611c7b565b6102ba6105ff36600461345a565b611e6f565b6102ba6106123660046134af565b611e7a565b600a546103e590600160a01b900460ff1681565b610633611e8d565b6040516102c49291906137fb565b6103e5601281565b6102ba6106573660046134af565b611fb7565b6102ba61066a366004613847565b611fc1565b6102ba61067d36600461345a565b611feb565b6102e061069036600461345a565b612024565b6007546103c2906001600160a01b031681565b6014546102ba565b6006546001600160a01b031633146106db57604051631a27eac360e11b815260040160405180910390fd5b6106e5600b6122fc565b5f5b818110156107e5575f83838381811061070257610702613873565b905060200201602081019061071791906134af565b600854604051633af32abf60e01b81529192506001600160a01b031690633af32abf90610748908490600401613571565b602060405180830381865afa158015610763573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107879190613887565b6107af578060405163751dff9760e11b81526004016107a69190613571565b60405180910390fd5b5f6107bb600b83612305565b9050806107db57604051630ea075bf60e21b815260040160405180910390fd5b50506001016106e7565b50601f5460ff16156108505760075460405163c653526b60e01b81526001600160a01b039091169063c653526b9061082390859085906004016138a6565b5f6040518083038186803b158015610839575f5ffd5b505afa15801561084b573d5f5f3e3d5ffd5b505050505b81816040516108609291906138f2565b604051908190038120907fa975983c7a4dcf80477a447433240de322f36428f1b3864e50d7a45e14c68b66905f90a25050565b6060600380546108a290613933565b80601f01602080910402602001604051908101604052809291908181526020018280546108ce90613933565b80156109195780601f106108f057610100808354040283529160200191610919565b820191905f5260205f20905b8154815290600101906020018083116108fc57829003601f168201915b5050505050905090565b5f61092e825f612319565b92915050565b5f3361094181858561235a565b5060019392505050565b5f60405163125ad87760e31b815260040160405180910390fd5b6006546001600160a01b0316331461099057604051631a27eac360e11b815260040160405180910390fd5b6001600160a01b0381166109b75760405163e6c4247b60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b03831617905560408051634e85b13560e01b81529051610a3c913091634e85b135916004808201925f929091908290030181865afa158015610a10573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a3791908101906139f9565b61236c565b6040516001600160a01b038216907f83293ffeebb677b167941693470018acf300605df266a35e9fdb66f24ff00fe0905f90a250565b610a7a6124a0565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aca573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aee9190613887565b610b0b576040516312aecd8160e01b815260040160405180910390fd5b805f03610b3457610b1a610f73565b604051636b30633560e01b81526004016107a69190613571565b5f610b3d610f73565b6001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401610b689190613571565b602060405180830381865afa158015610b83573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba79190613a8d565b905080821115610bca57604051632ca2f52b60e11b815260040160405180910390fd5b5f610bd3610f73565b600a546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92610c09923392909116908890600401613aa4565b6020604051808303815f875af1158015610c25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c499190613887565b905080610c69576040516312171d8360e31b815260040160405180910390fd5b5f610c75600e336124ca565b9150610c90905033610c878684613adc565b600e91906124f0565b508360145f828254610ca29190613adc565b9091555050604051849033907f55896b30a78fc55b78937f8014dde3f0035e9d37a4f6ac36841fb8b62f7e2b13905f90a3505050610ce06001600555565b50565b6009546001600160a01b03163314610d0e57604051631a27eac360e11b815260040160405180910390fd5b8015610d5a578060165f828254610d259190613adc565b9091555050601654604051829084907f8b8789cf9157fe7b016901e4ed3a5d0971caa8b7c031da0b25638ccf65841b2a905f90a45b5050565b6009546001600160a01b03163314610d8957604051631a27eac360e11b815260040160405180910390fd5b610d936019612505565b815f5b8161ffff168161ffff161015610e2357610e1a85858361ffff16818110610dbf57610dbf613873565b610dd592602060409092020190810191506134af565b86868461ffff16818110610deb57610deb613873565b9050604002016020016020810190610e039190613b00565b63ffffffff1660196124f09092919063ffffffff16565b50600101610d96565b50600d8290555f610e3b60125b61030590600a613bfe565b601854909150811115610e4e5760188190555b60405183907f5e1ff954b5e5257e9ee5d4cb07059e8f5e69b1aaaf9911e5d8d90a6894de9c21905f90a25050505050565b6006546001600160a01b03163314610eaa57604051631a27eac360e11b815260040160405180910390fd5b805f03610eb957610b1a610f73565b601654811115610edc57604051632ca2f52b60e11b815260040160405180910390fd5b8060165f828254610eed9190613c0c565b9091555050600a5460405163741fca4b60e01b8152600481018390526001600160a01b039091169063741fca4b906024015f604051808303815f87803b158015610f35575f5ffd5b505af1158015610f47573d5f5f3e3d5ffd5b5050505050565b5f33610f5b85828561250e565b610f6685858561255f565b60019150505b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6006546001600160a01b03163314610fc257604051631a27eac360e11b815260040160405180910390fd5b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611012573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110369190613887565b611053576040516312aecd8160e01b815260040160405180910390fd5b600460ff84161115611078576040516317dbc4cb60e21b815260040160405180910390fd5b610bb861ffff8316111561109f576040516317dbc4cb60e21b815260040160405180910390fd5b61012c61ffff821611156110c6576040516317dbc4cb60e21b815260040160405180910390fd5b8260ff1660048111156110db576110db6136d9565b6017805460ff191660018360048111156110f7576110f76136d9565b02179055506017805464ffffffff00191661010061ffff85811691820264ffff00000019169290921763010000009285169283021790925560405190919060ff8616907fd24f39e523bfa412fa391702710dc62e1c82d87a8e83228a37c42be1b4870f45905f90a4505050565b600a546001600160a01b0316331461118f57604051631a27eac360e11b815260040160405180910390fd5b6111976124a0565b5f6111a260116125bc565b90508063ffffffff165f036111b757506114a1565b5f8163ffffffff166001600160401b038111156111d6576111d661396b565b6040519080825280602002602001820160405280156111ff578160200160208202803683370190505b5090505f8263ffffffff166001600160401b038111156112215761122161396b565b60405190808252806020026020018201604052801561124a578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff1610156112e4575f80611279601163ffffffff808616906125c616565b9150915081858463ffffffff168151811061129657611296613873565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff16815181106112cf576112cf613873565b6020908102919091010152505060010161124f565b505f601581905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa158015611333573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113579190613c1f565b90505f5b8463ffffffff168163ffffffff16101561149b575f848263ffffffff168151811061138857611388613873565b602002602001015190505f848363ffffffff16815181106113ab576113ab613873565b602002602001015190506113c98260116125d490919063ffffffff16565b505f6113d6828a5f611525565b90506113e230836125e8565b600a54604051634adfc2e760e01b81526001600160a01b0390911690634adfc2e7906114149086908590600401613c3a565b5f604051808303815f87803b15801561142b575f5ffd5b505af115801561143d573d5f5f3e3d5ffd5b5050604080518481526020810186905261ffff891693506001600160a01b038716925030917f215abfcd108b85fbee47f26fda2de66f90f14fa5fcaf0201698ad8ac9323545f910160405180910390a450505080600101905061135b565b50505050505b610ce06001600555565b60606114b7600b61261c565b905090565b6001600160a01b03165f9081526020819052604090205490565b5f61150e6114e2612628565b6114ed90600a613bfe565b6002546114fa9190613adc565b611505856001613adc565b869190856126a4565b949350505050565b6060600480546108a290613933565b5f61150e611534846001613adc565b61153c612628565b61154790600a613bfe565b6002546115059190613adc565b5f3361094181858561255f565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115b1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d59190613887565b6115f2576040516312aecd8160e01b815260040160405180910390fd5b805f036116145730604051636b30633560e01b81526004016107a69190613571565b5f61161e336114bc565b90508082111561164157604051632ca2f52b60e11b815260040160405180910390fd5b6040516323b872dd60e01b81525f9030906323b872dd9061166a90339084908890600401613aa4565b6020604051808303815f875af1158015611686573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116aa9190613887565b9050806116ca576040516312171d8360e31b815260040160405180910390fd5b5f6116d66011336124ca565b91506116f19050336116e88684613adc565b601191906124f0565b508360155f8282546117039190613adc565b9091555050604051849033907f222dc200773fe9b45015bf792e8fee37d651e3590c215806a5042404b6d741d2905f90a350505050565b6007546001600160a01b0316331461176557604051631a27eac360e11b815260040160405180910390fd5b601f5460ff1615611789576040516317dbc4cb60e21b815260040160405180910390fd5b5f8190036117aa57604051631121aa8d60e01b815260040160405180910390fd5b6117b4601c612505565b5f816001600160401b038111156117cd576117cd61396b565b6040519080825280602002602001820160405280156117f6578160200160208202803683370190505b5090505f82815b8161ffff168161ffff1610156118f4575f86868361ffff1681811061182457611824613873565b61183a92602060409092020190810191506134af565b90505f87878461ffff1681811061185357611853613873565b905060400201602001602081019061186b9190613b00565b905081868461ffff168151811061188457611884613873565b6001600160a01b03909216602092830291909101909101525f6118b2601c8463ffffffff808616906124f016565b9050806118d457826040516346bdabe160e01b81526004016107a69190613571565b6118e463ffffffff831687613adc565b95505050508060010190506117fd565b506118fe836126e6565b600a60149054906101000a900460ff16600a61191a9190613bfe565b821461193957604051639006dd2760e01b815260040160405180910390fd5b60405133907f2d47a742b8d7df7c1fc5a9a631b206b364e6cb2722490759f63bb3ab14b132e0905f90a25050505050565b601f54606090819060ff161561198a5761198261275e565b915091509091565b5f611995601c6125bc565b90508061ffff166001600160401b038111156119b3576119b361396b565b6040519080825280602002602001820160405280156119dc578160200160208202803683370190505b5092508061ffff166001600160401b038111156119fb576119fb61396b565b604051908082528060200260200182016040528015611a24578160200160208202803683370190505b5091505f5b8161ffff168161ffff161015611abb575f80611a4a601c61ffff85166125c6565b9150915081868461ffff1681518110611a6557611a65613873565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611a9c57611a9c613873565b63ffffffff909216602092830291909101909101525050600101611a29565b50509091565b611ac96124a0565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b19573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b3d9190613887565b611b5a576040516312aecd8160e01b815260040160405180910390fd5b805f03611b6957610b1a610f73565b5f611b75600e336124ca565b91505081811015611b9957604051632ca2f52b60e11b815260040160405180910390fd5b600a546040516351edffb160e01b81526001600160a01b03909116906351edffb190611bcb9033908690600401613c3a565b5f604051808303815f87803b158015611be2575f5ffd5b505af1158015611bf4573d5f5f3e3d5ffd5b505050505f8282611c059190613c0c565b9050805f03611c1f57611c19600e336125d4565b50611c2d565b611c2b600e33836124f0565b505b8260145f828254611c3e9190613c0c565b9091555050604051839033907f96a9a6886cdf3047a125454218a23d3961fd3a78643123b248a9d106d0ac94fd905f90a35050610ce06001600555565b611c836124a0565b60085f9054906101000a90046001600160a01b03166001600160a01b031663edcf9c1f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cd3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cf79190613887565b611d14576040516312aecd8160e01b815260040160405180910390fd5b805f03611d365730604051636b30633560e01b81526004016107a69190613571565b5f611d426011336124ca565b91505081811015611d6657604051632ca2f52b60e11b815260040160405180910390fd5b5f611d718383613c0c565b9050805f03611d8b57611d856011336125d4565b50611d99565b611d97601133836124f0565b505b8260155f828254611daa9190613c0c565b909155505060405163a9059cbb60e01b81525f90309063a9059cbb90611dd69033908890600401613c3a565b6020604051808303815f875af1158015611df2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e169190613887565b905080611e36576040516312171d8360e31b815260040160405180910390fd5b604051849033907f046d3e17087d323298991516e3fdec36fe1204d6bff7fb6e2b8eca77b80a22ad905f90a3505050610ce06001600555565b5f61092e825f612990565b5f61092e611e87836114bc565b5f612319565b6060805f611e9b60196125bc565b90508061ffff166001600160401b03811115611eb957611eb961396b565b604051908082528060200260200182016040528015611ee2578160200160208202803683370190505b5092508061ffff166001600160401b03811115611f0157611f0161396b565b604051908082528060200260200182016040528015611f2a578160200160208202803683370190505b5091505f5b8161ffff168161ffff161015611abb575f80611f50601961ffff85166125c6565b9150915081868461ffff1681518110611f6b57611f6b613873565b60200260200101906001600160a01b031690816001600160a01b03168152505080858461ffff1681518110611fa257611fa2613873565b60209081029190910101525050600101611f2f565b5f61092e826114bc565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b5f5f611ff6836129c2565b90505f6120038285613c0c565b90505f61200f82612a8c565b905061201b8184613adc565b95945050505050565b600a546001600160a01b0316331461204f57604051631a27eac360e11b815260040160405180910390fd5b6120576124a0565b5f612062600e6125bc565b90508063ffffffff165f0361207757506114a1565b5f8163ffffffff166001600160401b038111156120965761209661396b565b6040519080825280602002602001820160405280156120bf578160200160208202803683370190505b5090505f8263ffffffff166001600160401b038111156120e1576120e161396b565b60405190808252806020026020018201604052801561210a578160200160208202803683370190505b5090505f5b8363ffffffff168163ffffffff1610156121a4575f80612139600e63ffffffff808616906125c616565b9150915081858463ffffffff168151811061215657612156613873565b60200260200101906001600160a01b031690816001600160a01b03168152505080848463ffffffff168151811061218f5761218f613873565b6020908102919091010152505060010161210f565b505f601481905560095460408051630a58ce2d60e11b815290516001600160a01b03909216916314b19c5a916004808201926020929091908290030181865afa1580156121f3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122179190613c1f565b90505f5b8463ffffffff168163ffffffff16101561149b575f848263ffffffff168151811061224857612248613873565b602002602001015190505f848363ffffffff168151811061226b5761226b613873565b6020026020010151905061228982600e6125d490919063ffffffff16565b505f612296828a5f6114d6565b90506122a28382612b1c565b604080518381526020810183905261ffff8716916001600160a01b0386169130917f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f6910160405180910390a450505080600101905061221b565b610ce081612b50565b5f610f6c836001600160a01b038416612ba9565b5f610f6c612326600d5490565b612331906001613adc565b612339612628565b61234490600a613bfe565b6002546123519190613adc565b859190856126a4565b6123678383836001612bf0565b505050565b6007546001600160a01b03163b5f0361238c57601f805460ff1916905550565b6007546040516301ffc9a760e01b8152635b24e9f760e11b60048201526001600160a01b03909116906301ffc9a790602401602060405180830381865afa9250505080156123f7575060408051601f3d908101601f191682019092526123f491810190613887565b60015b6124145760405163298febe360e01b815260040160405180910390fd5b801561248757601f805460ff1916600117905560075460405163c653526b60e01b81526001600160a01b039091169063c653526b9061245790859060040161366b565b5f6040518083038186803b15801561246d575f5ffd5b505afa15801561247f573d5f5f3e3d5ffd5b505050505050565b60405163298febe360e01b815260040160405180910390fd5b6002600554036124c357604051633ee5aeb560e01b815260040160405180910390fd5b6002600555565b5f8080806124e1866001600160a01b038716612cc2565b909450925050505b9250929050565b5f61150e846001600160a01b03851684612cfa565b610ce081612d16565b5f6125198484611fc1565b90505f19811015612559578181101561254b57828183604051637dc7a0d960e11b81526004016107a693929190613c53565b61255984848484035f612bf0565b50505050565b6001600160a01b038316612588575f604051634b637e8f60e11b81526004016107a69190613571565b6001600160a01b0382166125b1575f60405163ec442f0560e01b81526004016107a69190613571565b612367838383612d5f565b5f61092e82612e72565b5f8080806124e18686612e7c565b5f610f6c836001600160a01b038416612ea5565b6001600160a01b038216612611575f604051634b637e8f60e11b81526004016107a69190613571565b610d5a825f83612d5f565b60605f610f6c83612ec1565b5f5f612632610f73565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561266d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126919190613c74565b905061269e816012613c8f565b91505090565b5f6126d16126b183612f1a565b80156126cc57505f84806126c7576126c7613ca8565b868809115b151590565b6126dc868686612f46565b61201b9190613adc565b5f5b8151811015610d5a5761271e82828151811061270657612706613873565b6020026020010151600b612ff690919063ffffffff16565b6127565781818151811061273457612734613873565b602002602001015160405163751dff9760e11b81526004016107a69190613571565b6001016126e8565b6060805f306001600160a01b0316634e85b1356040518163ffffffff1660e01b81526004015f60405180830381865afa15801561279d573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526127c491908101906139f9565b60075460405163701a818560e01b81529192505f916001600160a01b039091169063701a8185906127f990859060040161366b565b5f60405180830381865afa158015612813573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261283a9190810190613cbc565b905080516001600160401b038111156128555761285561396b565b60405190808252806020026020018201604052801561287e578160200160208202803683370190505b50935080516001600160401b0381111561289a5761289a61396b565b6040519080825280602002602001820160405280156128c3578160200160208202803683370190505b5092505f5b81518161ffff16101561298957818161ffff16815181106128eb576128eb613873565b60200260200101515f0151858261ffff168151811061290c5761290c613873565b60200260200101906001600160a01b031690816001600160a01b031681525050818161ffff168151811061294257612942613873565b602002602001015160200151848261ffff168151811061296457612964613873565b63ffffffff9092166020928302919091019091015261298281613d7d565b90506128c8565b5050509091565b5f610f6c61299c612628565b6129a790600a613bfe565b6002546129b49190613adc565b600d54612351906001613adc565b6017545f906301000000900461ffff1681036129df57505f919050565b6017545f906129fc906301000000900461ffff1684612710612f46565b9050610f6c60095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a51573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a759190613d9d565b829063ffffffff908116906301e1338090612f4616565b6017545f90610100900461ffff168103612aa757505f919050565b5f612abe612ab76012600a613bfe565b845f611525565b6017549091505f908190612ad49060ff1661300a565b9150915081831015612aea57505f949350505050565b6017545f90612b0390610100900461ffff168584612f46565b9050612b128187612710612f46565b9695505050505050565b6001600160a01b038216612b45575f60405163ec442f0560e01b81526004016107a69190613571565b610d5a5f8383612d5f565b5f612b59825490565b90505f5b81811015612ba257826001015f845f018381548110612b7e57612b7e613873565b905f5260205f20015481526020019081526020015f205f9055806001019050612b5d565b50505f9055565b5f612bb483836130f4565b612be957508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561092e565b505f61092e565b6001600160a01b038416612c19575f60405163e602df0560e01b81526004016107a69190613571565b6001600160a01b038316612c42575f604051634a1406b160e11b81526004016107a69190613571565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561255957826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612cb491815260200190565b60405180910390a350505050565b5f818152600283016020526040812054819080612cef57612ce3858561310b565b92505f91506124e99050565b6001925090506124e9565b5f828152600284016020526040812082905561150e8484613116565b5f612d2082612e72565b90505f5b81811015612d5557600283015f612d3b8584613121565b815260208101919091526040015f90812055600101612d24565b50610d5a826122fc565b6001600160a01b038316612d89578060025f828254612d7e9190613adc565b90915550612de69050565b6001600160a01b0383165f9081526020819052604090205481811015612dc85783818360405163391434e360e21b81526004016107a693929190613c53565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216612e0257600280548290039055612e20565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612e6591815260200190565b60405180910390a3505050565b5f61092e8261312c565b5f8080612e898585613121565b5f81815260029690960160205260409095205494959350505050565b5f8181526002830160205260408120819055610f6c8383613135565b6060815f01805480602002602001604051908101604052809291908181526020018280548015612f0e57602002820191905f5260205f20905b815481526020019060010190808311612efa575b50505050509050919050565b5f6002826003811115612f2f57612f2f6136d9565b612f399190613db8565b60ff166001149050919050565b5f5f5f612f538686613140565b91509150815f03612f7757838181612f6d57612f6d613ca8565b0492505050610f6c565b818411612f8e57612f8e600385150260111861315c565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f610f6c836001600160a01b0384166130f4565b5f80806130176012610e30565b90505f84600481111561302c5761302c6136d9565b0361303c578092508291506130ee565b6003846004811115613050576130506136d9565b036130625760185492508291506130ee565b6001846004811115613076576130766136d9565b0361308e576130848161316d565b92508091506130ee565b60028460048111156130a2576130a26136d9565b036130ba576130b08161316d565b92508291506130ee565b60048460048111156130ce576130ce6136d9565b036130ee576018546130e8906130e38361316d565b613293565b92508291505b50915091565b5f9081526001919091016020526040902054151590565b5f610f6c83836132a2565b5f610f6c8383612ba9565b5f610f6c83836132ad565b5f61092e825490565b5f610f6c83836132d3565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f5f60085f9054906101000a90046001600160a01b03166001600160a01b031663f3cc69936040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131e39190613c1f565b61ffff1690505f61327860095f9054906101000a90046001600160a01b03166001600160a01b0316634ff0876a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561323d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132619190613d9d565b839063ffffffff908116906301e1338090612f4616565b905061150e61328982612710613adc565b8590612710612f46565b5f828218828411028218610f6c565b5f610f6c83836130f4565b5f825f0182815481106132c2576132c2613873565b905f5260205f200154905092915050565b5f81815260018301602052604081205480156133ad575f6132f5600183613c0c565b85549091505f9061330890600190613c0c565b9050808214613367575f865f01828154811061332657613326613873565b905f5260205f200154905080875f01848154811061334657613346613873565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061337857613378613de5565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061092e565b5f91505061092e565b5f5f602083850312156133c7575f5ffd5b82356001600160401b038111156133dc575f5ffd5b8301601f810185136133ec575f5ffd5b80356001600160401b03811115613401575f5ffd5b8560208260051b8401011115613415575f5ffd5b6020919091019590945092505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f6020828403121561346a575f5ffd5b5035919050565b6001600160a01b0381168114610ce0575f5ffd5b5f5f60408385031215613496575f5ffd5b82356134a181613471565b946020939093013593505050565b5f602082840312156134bf575f5ffd5b8135610f6c81613471565b5f5f604083850312156134db575f5ffd5b50508035926020909101359150565b5f5f83601f8401126134fa575f5ffd5b5081356001600160401b03811115613510575f5ffd5b6020830191508360208260061b85010111156124e9575f5ffd5b5f5f5f6040848603121561353c575f5ffd5b83356001600160401b03811115613551575f5ffd5b61355d868287016134ea565b909790965060209590950135949350505050565b6001600160a01b0391909116815260200190565b5f5f5f60608486031215613597575f5ffd5b83356135a281613471565b925060208401356135b281613471565b929592945050506040919091013590565b60ff81168114610ce0575f5ffd5b61ffff81168114610ce0575f5ffd5b5f5f5f606084860312156135f2575f5ffd5b83356135fd816135c3565b9250602084013561360d816135d1565b9150604084013561361d816135d1565b809150509250925092565b5f8151808452602084019350602083015f5b828110156136615781516001600160a01b031686526020958601959091019060010161363a565b5093949350505050565b602081525f610f6c6020830184613628565b5f5f6040838503121561368e575f5ffd5b8235915060208301356136a081613471565b809150509250929050565b5f5f5f606084860312156136bd575f5ffd5b833592506020840135915060408401356004811061361d575f5ffd5b634e487b7160e01b5f52602160045260245ffd5b608081016005861061370d57634e487b7160e01b5f52602160045260245ffd5b94815261ffff93841660208201529190921660408201526060015290565b5f5f6020838503121561373c575f5ffd5b82356001600160401b03811115613751575f5ffd5b61375d858286016134ea565b90969095509350505050565b5f5f5f6060848603121561377b575f5ffd5b83359250602084013561378d81613471565b9150604084013561361d81613471565b604081525f6137af6040830185613628565b82810360208401528084518083526020830191506020860192505f5b818110156137ef57835163ffffffff168352602093840193909201916001016137cb565b50909695505050505050565b604081525f61380d6040830185613628565b82810360208401528084518083526020830191506020860192505f5b818110156137ef578351835260209384019390920191600101613829565b5f5f60408385031215613858575f5ffd5b823561386381613471565b915060208301356136a081613471565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613897575f5ffd5b81518015158114610f6c575f5ffd5b602080825281018290525f8360408301825b858110156138e85782356138cb81613471565b6001600160a01b03168252602092830192909101906001016138b8565b5095945050505050565b5f8184825b8581101561392857813561390a81613471565b6001600160a01b0316835260209283019291909101906001016138f7565b509095945050505050565b600181811c9082168061394757607f821691505b60208210810361396557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b03811182821017156139a1576139a161396b565b60405290565b604051601f8201601f191681016001600160401b03811182821017156139cf576139cf61396b565b604052919050565b5f6001600160401b038211156139ef576139ef61396b565b5060051b60200190565b5f60208284031215613a09575f5ffd5b81516001600160401b03811115613a1e575f5ffd5b8201601f81018413613a2e575f5ffd5b8051613a41613a3c826139d7565b6139a7565b8082825260208201915060208360051b850101925086831115613a62575f5ffd5b6020840193505b82841015612b12578351613a7c81613471565b825260209384019390910190613a69565b5f60208284031215613a9d575f5ffd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561092e5761092e613ac8565b63ffffffff81168114610ce0575f5ffd5b5f60208284031215613b10575f5ffd5b8135610f6c81613aef565b6001815b6001841115613b5657808504811115613b3a57613b3a613ac8565b6001841615613b4857908102905b60019390931c928002613b1f565b935093915050565b5f82613b6c5750600161092e565b81613b7857505f61092e565b8160018114613b8e5760028114613b9857613bb4565b600191505061092e565b60ff841115613ba957613ba9613ac8565b50506001821b61092e565b5060208310610133831016604e8410600b8410161715613bd7575081810a61092e565b613be35f198484613b1b565b805f1904821115613bf657613bf6613ac8565b029392505050565b5f610f6c60ff841683613b5e565b8181038181111561092e5761092e613ac8565b5f60208284031215613c2f575f5ffd5b8151610f6c816135d1565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b5f60208284031215613c84575f5ffd5b8151610f6c816135c3565b60ff828116828216039081111561092e5761092e613ac8565b634e487b7160e01b5f52601260045260245ffd5b5f60208284031215613ccc575f5ffd5b81516001600160401b03811115613ce1575f5ffd5b8201601f81018413613cf1575f5ffd5b8051613cff613a3c826139d7565b8082825260208201915060208360061b850101925086831115613d20575f5ffd5b6020840193505b82841015612b125760408488031215613d3e575f5ffd5b613d4661397f565b8451613d5181613471565b81526020850151613d6181613aef565b8060208301525080835250602082019150604084019350613d27565b5f61ffff821661ffff8103613d9457613d94613ac8565b60010192915050565b5f60208284031215613dad575f5ffd5b8151610f6c81613aef565b5f60ff831680613dd657634e487b7160e01b5f52601260045260245ffd5b8060ff84160691505092915050565b634e487b7160e01b5f52603160045260245ffdfea26469706673582212202adca4528e879ae5ae2b6f30561933d6f6e0ae2a6c32405ec1e4730bbd879e3964736f6c634300081c0033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/vaults/OrionVault.sol/OrionVault.json b/artifacts/contracts/vaults/OrionVault.sol/OrionVault.json index 746f0375..bb4a86d1 100644 --- a/artifacts/contracts/vaults/OrionVault.sol/OrionVault.json +++ b/artifacts/contracts/vaults/OrionVault.sol/OrionVault.json @@ -224,17 +224,6 @@ "name": "SystemNotIdle", "type": "error" }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - } - ], - "name": "TokenNotWhitelisted", - "type": "error" - }, { "inputs": [], "name": "TransferFailed", @@ -539,6 +528,19 @@ "name": "Transfer", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address[]", + "name": "assets", + "type": "address[]" + } + ], + "name": "VaultWhitelistUpdated", + "type": "event" + }, { "anonymous": false, "inputs": [ diff --git a/contracts/execution/OrionAssetERC4626ExecutionAdapter.sol b/contracts/execution/OrionAssetERC4626ExecutionAdapter.sol index d2ed1591..05ae55ad 100644 --- a/contracts/execution/OrionAssetERC4626ExecutionAdapter.sol +++ b/contracts/execution/OrionAssetERC4626ExecutionAdapter.sol @@ -46,16 +46,21 @@ contract OrionAssetERC4626ExecutionAdapter is IExecutionAdapter { liquidityOrchestrator = config.liquidityOrchestrator(); } + /// @notice Validates that the given asset is compatible with this adapter + /// @param asset The address of the asset to validate + function validateExecutionAdapter(address asset) external view override { + try IERC4626(asset).asset() returns (address vaultUnderlyingAsset) { + if (vaultUnderlyingAsset != underlyingAsset) revert ErrorsLib.InvalidAdapter(); + } catch { + revert ErrorsLib.InvalidAdapter(); // Adapter not valid for this vault + } + } + /// @inheritdoc IExecutionAdapter function sell( address vaultAsset, uint256 sharesAmount ) external override onlyLiquidityOrchestrator returns (uint256 receivedUnderlyingAmount) { - try IERC4626(vaultAsset).asset() returns (address vaultUnderlyingAsset) { - if (vaultUnderlyingAsset != underlyingAsset) revert ErrorsLib.InvalidAddress(); - } catch { - revert ErrorsLib.InvalidAddress(); // Adapter not valid for this vault - } if (sharesAmount == 0) revert ErrorsLib.AmountMustBeGreaterThanZero(vaultAsset); IERC4626 vault = IERC4626(vaultAsset); @@ -70,11 +75,6 @@ contract OrionAssetERC4626ExecutionAdapter is IExecutionAdapter { address vaultAsset, uint256 sharesAmount ) external override onlyLiquidityOrchestrator returns (uint256 spentUnderlyingAmount) { - try IERC4626(vaultAsset).asset() returns (address vaultUnderlyingAsset) { - if (vaultUnderlyingAsset != underlyingAsset) revert ErrorsLib.InvalidAddress(); - } catch { - revert ErrorsLib.InvalidAddress(); // Adapter not valid for this vault - } if (sharesAmount == 0) revert ErrorsLib.AmountMustBeGreaterThanZero(vaultAsset); IERC4626 vault = IERC4626(vaultAsset); diff --git a/contracts/interfaces/IExecutionAdapter.sol b/contracts/interfaces/IExecutionAdapter.sol index 4928857a..7a7d46aa 100644 --- a/contracts/interfaces/IExecutionAdapter.sol +++ b/contracts/interfaces/IExecutionAdapter.sol @@ -22,4 +22,8 @@ interface IExecutionAdapter { /// @param sharesAmount The amount of shares to buy /// @return executionUnderlyingAmount The actual execution underlying amount spent function buy(address asset, uint256 sharesAmount) external returns (uint256 executionUnderlyingAmount); + + /// @notice Validates that the given asset is compatible with this adapter + /// @param asset The address of the asset to validate + function validateExecutionAdapter(address asset) external view; } diff --git a/contracts/interfaces/IOrionStrategy.sol b/contracts/interfaces/IOrionStrategy.sol index 8f1a489e..91d7ef9a 100644 --- a/contracts/interfaces/IOrionStrategy.sol +++ b/contracts/interfaces/IOrionStrategy.sol @@ -20,4 +20,10 @@ interface IOrionStrategy { function computeIntent( address[] calldata vaultWhitelistedAssets ) external view returns (IOrionTransparentVault.Position[] memory intent); + + /// @notice Validate that the strategy is compatible with the provided whitelisted assets + /// @param vaultWhitelistedAssets The whitelisted assets for the vault + /// @dev This function should validate that all assets are compatible with the strategy's requirements + /// Should revert with appropriate error if validation fails + function validateStrategy(address[] calldata vaultWhitelistedAssets) external view; } diff --git a/contracts/interfaces/IOrionVault.sol b/contracts/interfaces/IOrionVault.sol index 78c1adc7..dee3606b 100644 --- a/contracts/interfaces/IOrionVault.sol +++ b/contracts/interfaces/IOrionVault.sol @@ -73,6 +73,10 @@ interface IOrionVault is IERC4626 { uint256 sharesBurned ); + /// @notice The vault whitelist has been updated. + /// @param assets The new whitelist of assets. + event VaultWhitelistUpdated(address[] indexed assets); + /// @notice Curator fees have been accrued for a specific epoch. /// @param epoch The epoch for which fees were accrued. /// @param feeAmount The amount of fees accrued in underlying asset units. diff --git a/contracts/interfaces/IPriceAdapter.sol b/contracts/interfaces/IPriceAdapter.sol index 88f5cd56..ed379d49 100644 --- a/contracts/interfaces/IPriceAdapter.sol +++ b/contracts/interfaces/IPriceAdapter.sol @@ -12,4 +12,9 @@ interface IPriceAdapter { /// @dev The asset shall be whitelisted in the OrionConfig contract. /// @dev The registry will handle normalization to priceAdapterDecimals. function getPriceData(address asset) external view returns (uint256 price, uint8 decimals); + + /// @notice Validates that the given asset is compatible with this adapter + /// @param asset The address of the asset to validate + /// @return true if the asset is compatible, reverts otherwise + function validatePriceAdapter(address asset) external view returns (bool); } diff --git a/contracts/libraries/ErrorsLib.sol b/contracts/libraries/ErrorsLib.sol index 0eee6f67..bed44a13 100644 --- a/contracts/libraries/ErrorsLib.sol +++ b/contracts/libraries/ErrorsLib.sol @@ -56,9 +56,18 @@ library ErrorsLib { /// @notice System is in an invalid or unexpected state. error InvalidState(); + /// @notice The adapter is not compatible with the asset. + error InvalidAdapter(); + /// @notice Operation cannot be performed because the system is not idle. error SystemNotIdle(); /// @notice Transfer of tokens failed. error TransferFailed(); + + /// @notice The curator contract does not properly implement the required interface. + error InvalidCuratorContract(); + + /// @notice The strategy is not compatible with the provided whitelisted assets. + error InvalidStrategy(); } diff --git a/contracts/mocks/MockExecutionAdapter.sol b/contracts/mocks/MockExecutionAdapter.sol index 17912272..75fa8fcd 100644 --- a/contracts/mocks/MockExecutionAdapter.sol +++ b/contracts/mocks/MockExecutionAdapter.sol @@ -10,12 +10,17 @@ contract MockExecutionAdapter is IExecutionAdapter { constructor() {} /// @inheritdoc IExecutionAdapter - function buy(address asset, uint256 sharesAmount) external returns (uint256 executionUnderlyingAmount) { + function buy(address, uint256) external pure returns (uint256 executionUnderlyingAmount) { executionUnderlyingAmount = 1e12; } /// @inheritdoc IExecutionAdapter - function sell(address asset, uint256 sharesAmount) external returns (uint256 executionUnderlyingAmount) { + function sell(address, uint256) external pure returns (uint256 executionUnderlyingAmount) { executionUnderlyingAmount = 1e12; } + + /// @inheritdoc IExecutionAdapter + function validateExecutionAdapter(address) external pure { + // pass + } } diff --git a/contracts/mocks/MockPriceAdapter.sol b/contracts/mocks/MockPriceAdapter.sol index 13f0fad1..9f8366fd 100644 --- a/contracts/mocks/MockPriceAdapter.sol +++ b/contracts/mocks/MockPriceAdapter.sol @@ -16,4 +16,9 @@ contract MockPriceAdapter is IPriceAdapter { 100) + 1; return (mockPrice, 14); // Mock price with 14 decimals (matching priceAdapterDecimals) } + + /// @inheritdoc IPriceAdapter + function validatePriceAdapter(address) external pure returns (bool) { + return true; + } } diff --git a/contracts/orchestrators/InternalStatesOrchestrator.sol b/contracts/orchestrators/InternalStatesOrchestrator.sol index b796296f..a500da1a 100644 --- a/contracts/orchestrators/InternalStatesOrchestrator.sol +++ b/contracts/orchestrators/InternalStatesOrchestrator.sol @@ -273,13 +273,12 @@ contract InternalStatesOrchestrator is Ownable, ReentrancyGuard, IInternalStateO } /// @notice Build filtered transparent vaults list for the epoch - /// @dev Include only vaults with pending LP activity (deposit or redeem) function _buildTransparentVaultsEpoch() internal { address[] memory allTransparent = config.getAllOrionVaults(EventsLib.VaultType.Transparent); delete transparentVaultsEpoch; for (uint16 i = 0; i < allTransparent.length; ++i) { address v = allTransparent[i]; - if (IOrionVault(v).pendingDeposit() == 0 && IOrionVault(v).pendingRedeem() == 0) continue; + if (IOrionVault(v).pendingDeposit() + IOrionVault(v).totalAssets() == 0) continue; // slither-disable-next-line unused-return (address[] memory tTokens, ) = IOrionTransparentVault(v).getIntent(); if (tTokens.length == 0) continue; diff --git a/contracts/orchestrators/LiquidityOrchestrator.sol b/contracts/orchestrators/LiquidityOrchestrator.sol index e9a8b1d4..0b2d195d 100644 --- a/contracts/orchestrators/LiquidityOrchestrator.sol +++ b/contracts/orchestrators/LiquidityOrchestrator.sol @@ -94,12 +94,6 @@ contract LiquidityOrchestrator is Ownable, ReentrancyGuard, ILiquidityOrchestrat /* MODIFIERS */ /* -------------------------------------------------------------------------- */ - /// @dev Restricts function to only Chainlink Automation Registry - modifier onlyAutomationRegistry() { - if (msg.sender != automationRegistry) revert ErrorsLib.NotAuthorized(); - _; - } - /// @dev Restricts function to only owner or Chainlink Automation Registry modifier onlyAuthorizedTrigger() { if (msg.sender != owner() && msg.sender != automationRegistry) { @@ -216,6 +210,7 @@ contract LiquidityOrchestrator is Ownable, ReentrancyGuard, ILiquidityOrchestrat /// @inheritdoc ILiquidityOrchestrator function setExecutionAdapter(address asset, IExecutionAdapter adapter) external onlyConfig { if (asset == address(0) || address(adapter) == address(0)) revert ErrorsLib.ZeroAddress(); + adapter.validateExecutionAdapter(asset); executionAdapterOf[asset] = adapter; emit EventsLib.ExecutionAdapterSet(asset, address(adapter)); diff --git a/contracts/price/OrionAssetERC4626PriceAdapter.sol b/contracts/price/OrionAssetERC4626PriceAdapter.sol index 579d22c9..74deb6be 100644 --- a/contracts/price/OrionAssetERC4626PriceAdapter.sol +++ b/contracts/price/OrionAssetERC4626PriceAdapter.sol @@ -34,17 +34,21 @@ contract OrionAssetERC4626PriceAdapter is IPriceAdapter { } /// @inheritdoc IPriceAdapter + function validatePriceAdapter(address asset) external view returns (bool) { + try IERC4626(asset).asset() returns (address vaultUnderlyingAsset) { + if (vaultUnderlyingAsset != underlyingAsset) revert ErrorsLib.InvalidAdapter(); + } catch { + revert ErrorsLib.InvalidAdapter(); + } + + return true; + } + /// @notice Returns the raw price of one share of the given ERC4626 vault in underlying asset decimals. /// @param vaultAsset The address of the ERC4626-compliant vault. /// @return price The raw price of one share in underlying asset decimals /// @return decimals The number of decimals for the returned price (underlying asset decimals) function getPriceData(address vaultAsset) external view returns (uint256 price, uint8 decimals) { - try IERC4626(vaultAsset).asset() returns (address vaultUnderlyingAsset) { - if (vaultUnderlyingAsset != underlyingAsset) revert ErrorsLib.InvalidAddress(); - } catch { - revert ErrorsLib.InvalidAddress(); // Adapter not valid for this vault - } - uint8 vaultAssetDecimals = IERC20Metadata(vaultAsset).decimals(); uint256 oneShare = 10 ** vaultAssetDecimals; uint256 underlyingAssetAmount = IERC4626(vaultAsset).convertToAssets(oneShare); diff --git a/contracts/price/PriceAdapterRegistry.sol b/contracts/price/PriceAdapterRegistry.sol index 79b44345..f9ef5933 100644 --- a/contracts/price/PriceAdapterRegistry.sol +++ b/contracts/price/PriceAdapterRegistry.sol @@ -44,6 +44,8 @@ contract PriceAdapterRegistry is IPriceAdapterRegistry, Ownable { /// @inheritdoc IPriceAdapterRegistry function setPriceAdapter(address asset, IPriceAdapter adapter) external onlyConfig { if (asset == address(0) || address(adapter) == address(0)) revert ErrorsLib.ZeroAddress(); + if (!adapter.validatePriceAdapter(asset)) revert ErrorsLib.InvalidAdapter(); + adapterOf[asset] = adapter; emit EventsLib.PriceAdapterSet(asset, address(adapter)); } diff --git a/contracts/strategies/KBestTvlWeightedAverage.sol b/contracts/strategies/KBestTvlWeightedAverage.sol index 35481cc8..bae2aae7 100644 --- a/contracts/strategies/KBestTvlWeightedAverage.sol +++ b/contracts/strategies/KBestTvlWeightedAverage.sol @@ -8,6 +8,7 @@ import { ErrorsLib } from "../libraries/ErrorsLib.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import { IERC4626 } from "@openzeppelin/contracts/interfaces/IERC4626.sol"; +import { IERC20Metadata } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import { Math } from "@openzeppelin/contracts/utils/math/Math.sol"; /** @@ -20,13 +21,13 @@ contract KBestTvlWeightedAverage is IOrionStrategy, Ownable, ERC165 { IOrionConfig public config; /// @notice The number of assets to pick - uint8 public k; + uint16 public k; /// @notice Constructor for KBestTvlWeightedAverage strategy /// @param owner The owner of the contract /// @param _config The Orion configuration contract address /// @param _k The number of assets to pick - constructor(address owner, address _config, uint8 _k) Ownable(owner) { + constructor(address owner, address _config, uint16 _k) Ownable(owner) { if (_config == address(0)) revert ErrorsLib.ZeroAddress(); config = IOrionConfig(_config); @@ -37,10 +38,10 @@ contract KBestTvlWeightedAverage is IOrionStrategy, Ownable, ERC165 { function computeIntent( address[] calldata vaultWhitelistedAssets ) external view returns (IOrionTransparentVault.Position[] memory intent) { - uint8 n = uint8(vaultWhitelistedAssets.length); + uint16 n = uint16(vaultWhitelistedAssets.length); uint256[] memory tvls = _getAssetTVLs(vaultWhitelistedAssets, n); - uint8 kActual = uint8(Math.min(k, n)); + uint16 kActual = uint16(Math.min(k, n)); (address[] memory tokens, uint256[] memory topTvls) = _selectTopKAssets( vaultWhitelistedAssets, tvls, @@ -51,19 +52,45 @@ contract KBestTvlWeightedAverage is IOrionStrategy, Ownable, ERC165 { intent = _calculatePositions(tokens, topTvls, kActual); } + /// @inheritdoc IOrionStrategy + function validateStrategy(address[] calldata vaultWhitelistedAssets) external view { + uint16 n = uint16(vaultWhitelistedAssets.length); + address referenceUnderlyingAsset = address(0); + + for (uint16 i = 0; i < n; ++i) { + address asset = vaultWhitelistedAssets[i]; + + // slither-disable-next-line unused-return + try IERC4626(asset).totalAssets() returns (uint256) { + // Asset is ERC4626 compliant, good. + } catch { + revert ErrorsLib.InvalidStrategy(); + } + + // Check that the underlying asset is the same across all assets in vaultWhitelistedAssets + try IERC4626(asset).asset() returns (address vaultUnderlyingAsset) { + if (referenceUnderlyingAsset == address(0)) { + referenceUnderlyingAsset = vaultUnderlyingAsset; + } else if (vaultUnderlyingAsset != referenceUnderlyingAsset) { + revert ErrorsLib.InvalidStrategy(); + } + } catch { + revert ErrorsLib.InvalidStrategy(); + } + } + } + /// @notice Gets TVL for all whitelisted assets /// @param vaultWhitelistedAssets Array of whitelisted asset addresses /// @param n Number of assets /// @return tvls Array of TVL values function _getAssetTVLs( address[] calldata vaultWhitelistedAssets, - uint8 n + uint16 n ) internal view returns (uint256[] memory tvls) { tvls = new uint256[](n); - for (uint8 i = 0; i < n; ++i) { - // This tvl measurement is limited to assets which are ERC4626 compliant and - // whose underlying has the same decimals. + for (uint16 i = 0; i < n; ++i) { tvls[i] = IERC4626(vaultWhitelistedAssets[i]).totalAssets(); } } @@ -78,17 +105,17 @@ contract KBestTvlWeightedAverage is IOrionStrategy, Ownable, ERC165 { function _selectTopKAssets( address[] calldata vaultWhitelistedAssets, uint256[] memory tvls, - uint8 n, - uint8 kActual + uint16 n, + uint16 kActual ) internal pure returns (address[] memory tokens, uint256[] memory topTvls) { tokens = new address[](kActual); topTvls = new uint256[](kActual); bool[] memory used = new bool[](n); - for (uint8 idx = 0; idx < kActual; ++idx) { + for (uint16 idx = 0; idx < kActual; ++idx) { uint256 maxTVL = 0; uint256 maxIndex = 0; - for (uint8 j = 0; j < n; ++j) { + for (uint16 j = 0; j < n; ++j) { if (!used[j] && tvls[j] > maxTVL) { maxTVL = tvls[j]; maxIndex = j; @@ -108,10 +135,10 @@ contract KBestTvlWeightedAverage is IOrionStrategy, Ownable, ERC165 { function _calculatePositions( address[] memory tokens, uint256[] memory topTvls, - uint8 kActual + uint16 kActual ) internal view returns (IOrionTransparentVault.Position[] memory intent) { uint256 totalTVL = 0; - for (uint8 i = 0; i < kActual; ++i) { + for (uint16 i = 0; i < kActual; ++i) { totalTVL += topTvls[i]; } @@ -119,7 +146,7 @@ contract KBestTvlWeightedAverage is IOrionStrategy, Ownable, ERC165 { intent = new IOrionTransparentVault.Position[](kActual); uint32 sumWeights = 0; - for (uint8 i = 0; i < kActual; ++i) { + for (uint16 i = 0; i < kActual; ++i) { uint32 weight = uint32((topTvls[i] * intentScale) / totalTVL); intent[i] = IOrionTransparentVault.Position({ token: tokens[i], value: weight }); sumWeights += weight; @@ -134,7 +161,7 @@ contract KBestTvlWeightedAverage is IOrionStrategy, Ownable, ERC165 { /// @notice Owner can update k /// @param kNew The new number of assets to pick - function updateParameters(uint8 kNew) external onlyOwner { + function updateParameters(uint16 kNew) external onlyOwner { k = kNew; } diff --git a/contracts/test/UtilitiesLibTest.sol b/contracts/test/UtilitiesLibTest.sol new file mode 100644 index 00000000..89240c7e --- /dev/null +++ b/contracts/test/UtilitiesLibTest.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.28; + +import "../libraries/UtilitiesLib.sol"; + +contract UtilitiesLibTest { + function convertDecimals(uint256 value, uint8 fromDecimals, uint8 toDecimals) external pure returns (uint256) { + return UtilitiesLib.convertDecimals(value, fromDecimals, toDecimals); + } +} diff --git a/contracts/vaults/OrionTransparentVault.sol b/contracts/vaults/OrionTransparentVault.sol index 5c8815d5..4fcf413e 100644 --- a/contracts/vaults/OrionTransparentVault.sol +++ b/contracts/vaults/OrionTransparentVault.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.28; import "@openzeppelin/contracts/utils/structs/EnumerableMap.sol"; +import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; import "./OrionVault.sol"; import "../interfaces/IOrionConfig.sol"; @@ -24,6 +25,7 @@ import { EventsLib } from "../libraries/EventsLib.sol"; */ contract OrionTransparentVault is OrionVault, IOrionTransparentVault { using EnumerableMap for EnumerableMap.AddressToUintMap; + using EnumerableSet for EnumerableSet.AddressSet; /// @notice Current portfolio shares per asset (w_0) - mapping of token address to live allocation EnumerableMap.AddressToUintMap internal _portfolio; @@ -55,7 +57,7 @@ contract OrionTransparentVault is OrionVault, IOrionTransparentVault { uint16 performanceFee, uint16 managementFee ) OrionVault(vaultOwner, curator, configAddress, name, symbol, feeType, performanceFee, managementFee) { - _updateCuratorType(); + _updateCuratorType(config.getAllWhitelistedAssets()); } /// --------- CURATOR FUNCTIONS --------- @@ -154,24 +156,52 @@ contract OrionTransparentVault is OrionVault, IOrionTransparentVault { function updateCurator(address newCurator) external override(OrionVault, IOrionVault) onlyVaultOwner { if (newCurator == address(0)) revert ErrorsLib.InvalidAddress(); curator = newCurator; - _updateCuratorType(); + _updateCuratorType(this.vaultWhitelist()); emit CuratorUpdated(newCurator); } + /// @notice Override updateVaultWhitelist to validate strategy compatibility + /// @param assets The new whitelisted assets for the vault + function updateVaultWhitelist(address[] calldata assets) external onlyVaultOwner { + // Clear existing whitelist + _vaultWhitelistedAssets.clear(); + + for (uint256 i = 0; i < assets.length; ++i) { + address token = assets[i]; + + if (!config.isWhitelisted(token)) revert ErrorsLib.TokenNotWhitelisted(token); + + bool inserted = _vaultWhitelistedAssets.add(token); + if (!inserted) revert ErrorsLib.AlreadyRegistered(); + } + + if (_isPassiveCurator) { + IOrionStrategy(curator).validateStrategy(assets); + } + + emit VaultWhitelistUpdated(assets); + } + /// --------- INTERNAL FUNCTIONS --------- /// @notice Update the curator type flag based on ERC-165 interface detection - function _updateCuratorType() internal { + function _updateCuratorType(address[] memory whitelistedAssets) internal { if (curator.code.length == 0) { // EOA (wallet) - active curator _isPassiveCurator = false; } else { // Smart contract - check if it supports IOrionStrategy interface try IERC165(curator).supportsInterface(type(IOrionStrategy).interfaceId) returns (bool supported) { - _isPassiveCurator = supported; + if (supported) { + _isPassiveCurator = true; + IOrionStrategy(curator).validateStrategy(whitelistedAssets); + } else { + // Contract exists but doesn't support IOrionStrategy - invalid curator + revert ErrorsLib.InvalidCuratorContract(); + } } catch { - // If supportsInterface fails, treat as active curator (push-based) - _isPassiveCurator = false; + // If supportsInterface fails, the curator contract is invalid + revert ErrorsLib.InvalidCuratorContract(); } } } @@ -180,9 +210,9 @@ contract OrionTransparentVault is OrionVault, IOrionTransparentVault { /// @return tokens Array of token addresses /// @return weights Array of weights function _computePassiveIntent() internal view returns (address[] memory tokens, uint32[] memory weights) { - address[] memory vaultWhitelistedAssets = this.vaultWhitelist(); + address[] memory whitelistedAssets = this.vaultWhitelist(); // Call the passive curator to compute intent - Position[] memory intent = IOrionStrategy(curator).computeIntent(vaultWhitelistedAssets); + Position[] memory intent = IOrionStrategy(curator).computeIntent(whitelistedAssets); // Convert to return format tokens = new address[](intent.length); diff --git a/contracts/vaults/OrionVault.sol b/contracts/vaults/OrionVault.sol index bbe49b4b..f5b8b4df 100644 --- a/contracts/vaults/OrionVault.sol +++ b/contracts/vaults/OrionVault.sol @@ -56,7 +56,7 @@ abstract contract OrionVault is ERC4626, ReentrancyGuard, IOrionVault { /// @notice Vault-specific whitelist of assets for intent validation /// @dev This is a subset of the protocol whitelist for higher auditability - EnumerableSet.AddressSet private _vaultWhitelistedAssets; + EnumerableSet.AddressSet internal _vaultWhitelistedAssets; /// @notice Total assets under management (t_0) - denominated in underlying asset units uint256 internal _totalAssets; @@ -383,20 +383,6 @@ abstract contract OrionVault is ERC4626, ReentrancyGuard, IOrionVault { emit CuratorUpdated(newCurator); } - /// @inheritdoc IOrionVault - function updateVaultWhitelist(address[] calldata assets) external onlyVaultOwner { - _vaultWhitelistedAssets.clear(); - for (uint256 i = 0; i < assets.length; ++i) { - address token = assets[i]; - - // Protocol whitelist validation - if (!config.isWhitelisted(token)) revert ErrorsLib.TokenNotWhitelisted(token); - - bool inserted = _vaultWhitelistedAssets.add(token); - if (!inserted) revert ErrorsLib.AlreadyRegistered(); - } - } - /// @inheritdoc IOrionVault function vaultWhitelist() external view returns (address[] memory) { return _vaultWhitelistedAssets.values(); diff --git a/test/Adapters.test.ts b/test/Adapters.test.ts index 44005d4e..fd19d5ac 100644 --- a/test/Adapters.test.ts +++ b/test/Adapters.test.ts @@ -2,18 +2,29 @@ import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; import { ethers } from "hardhat"; -import { MockUnderlyingAsset, OrionAssetERC4626PriceAdapter, OrionConfig } from "../typechain-types"; +import { + InternalStatesOrchestrator, + LiquidityOrchestrator, + MockUnderlyingAsset, + OrionAssetERC4626PriceAdapter, + OrionConfig, + PriceAdapterRegistry, +} from "../typechain-types"; describe("Price Adapter", function () { let orionConfig: OrionConfig; let underlyingAsset: MockUnderlyingAsset; let mockAsset1: MockUnderlyingAsset; let priceAdapter: OrionAssetERC4626PriceAdapter; + let priceAdapterRegistry: PriceAdapterRegistry; + let liquidityOrchestrator: LiquidityOrchestrator; + let internalStatesOrchestrator: InternalStatesOrchestrator; let owner: SignerWithAddress; + let automationRegistry: SignerWithAddress; beforeEach(async function () { - [owner] = await ethers.getSigners(); + [owner, automationRegistry] = await ethers.getSigners(); // Deploy Mock Underlying Asset const MockUnderlyingAssetFactory = await ethers.getContractFactory("MockUnderlyingAsset"); @@ -39,15 +50,54 @@ describe("Price Adapter", function () { await orionConfig.getAddress(), )) as unknown as OrionAssetERC4626PriceAdapter; await priceAdapter.waitForDeployment(); + + // Deploy Price Adapter Registry + const PriceAdapterRegistryFactory = await ethers.getContractFactory("PriceAdapterRegistry"); + priceAdapterRegistry = (await PriceAdapterRegistryFactory.deploy( + owner.address, + await orionConfig.getAddress(), + )) as unknown as PriceAdapterRegistry; + await priceAdapterRegistry.waitForDeployment(); + + // Deploy LiquidityOrchestrator + const LiquidityOrchestratorFactory = await ethers.getContractFactory("LiquidityOrchestrator"); + const liquidityOrchestratorDeployed = await LiquidityOrchestratorFactory.deploy( + owner.address, + await orionConfig.getAddress(), + automationRegistry.address, + ); + await liquidityOrchestratorDeployed.waitForDeployment(); + liquidityOrchestrator = liquidityOrchestratorDeployed as unknown as LiquidityOrchestrator; + + // Deploy InternalStatesOrchestrator + const InternalStatesOrchestratorFactory = await ethers.getContractFactory("InternalStatesOrchestrator"); + const internalStatesOrchestratorDeployed = await InternalStatesOrchestratorFactory.deploy( + owner.address, + await orionConfig.getAddress(), + automationRegistry.address, + ); + await internalStatesOrchestratorDeployed.waitForDeployment(); + internalStatesOrchestrator = internalStatesOrchestratorDeployed as unknown as InternalStatesOrchestrator; + + // Set up OrionConfig + await orionConfig.setLiquidityOrchestrator(await liquidityOrchestrator.getAddress()); + await orionConfig.setInternalStatesOrchestrator(await internalStatesOrchestrator.getAddress()); + await orionConfig.setPriceAdapterRegistry(await priceAdapterRegistry.getAddress()); }); - describe("getPriceData", function () { - it("should revert with InvalidAddress when called with a non-ERC4626 contract", async function () { - // Call getPriceData with a regular ERC20 token (not ERC4626) - await expect(priceAdapter.getPriceData(await mockAsset1.getAddress())).to.be.revertedWithCustomError( - priceAdapter, - "InvalidAddress", - ); + describe("addWhitelistedAsset", function () { + it("should revert with InvalidAdapter when trying to whitelist a regular ERC20 token with ERC4626 price adapter", async function () { + const MockExecutionAdapterFactory = await ethers.getContractFactory("MockExecutionAdapter"); + const mockExecutionAdapter = await MockExecutionAdapterFactory.deploy(); + await mockExecutionAdapter.waitForDeployment(); + + await expect( + orionConfig.addWhitelistedAsset( + await mockAsset1.getAddress(), + await priceAdapter.getAddress(), + await mockExecutionAdapter.getAddress(), + ), + ).to.be.revertedWithCustomError(priceAdapter, "InvalidAdapter"); }); }); }); diff --git a/test/Orchestrators.test.ts b/test/Orchestrators.test.ts index 2f47bc53..2a4c5fc9 100644 --- a/test/Orchestrators.test.ts +++ b/test/Orchestrators.test.ts @@ -72,22 +72,19 @@ describe("Orchestrators", function () { // Initialize mock assets with different amounts of underlying assets // This creates initial liquidity in each vault for realistic price testing - const initialDeposit1 = ethers.parseUnits("1000", 12); // 1000 underlying assets for mockAsset1 - const initialDeposit2 = ethers.parseUnits("2000", 12); // 2000 underlying assets for mockAsset2 - const initialDeposit3 = ethers.parseUnits("1500", 12); // 1500 underlying assets for mockAsset3 + const initialDeposit1 = ethers.parseUnits("1000", 12); + const initialDeposit2 = ethers.parseUnits("2000", 12); + const initialDeposit3 = ethers.parseUnits("1500", 12); // Mint underlying assets to user for deposits await underlyingAsset.mint(user.address, ethers.parseUnits("10000", 12)); - // Deposit to mockAsset1 await underlyingAsset.connect(user).approve(await mockAsset1.getAddress(), initialDeposit1); await mockAsset1.connect(user).deposit(initialDeposit1, user.address); - // Deposit to mockAsset2 await underlyingAsset.connect(user).approve(await mockAsset2.getAddress(), initialDeposit2); await mockAsset2.connect(user).deposit(initialDeposit2, user.address); - // Deposit to mockAsset3 await underlyingAsset.connect(user).approve(await mockAsset3.getAddress(), initialDeposit3); await mockAsset3.connect(user).deposit(initialDeposit3, user.address); @@ -467,9 +464,10 @@ describe("Orchestrators", function () { // Have LPs request redemption (test also cancel it) const redeemAmount = await transparentVault.balanceOf(user.address); expect(redeemAmount).to.be.gt(0); - await transparentVault.connect(user).approve(await transparentVault.getAddress(), redeemAmount); - await transparentVault.connect(user).requestRedeem(redeemAmount); - await transparentVault.connect(user).cancelRedeemRequest(redeemAmount); + await transparentVault.connect(user).approve(await transparentVault.getAddress(), redeemAmount / 2n); + await transparentVault.connect(user).requestRedeem(redeemAmount / 2n); + await transparentVault.connect(user).cancelRedeemRequest(redeemAmount / 2n); + await transparentVault.connect(user).approve(await transparentVault.getAddress(), redeemAmount); await transparentVault.connect(user).requestRedeem(redeemAmount); @@ -566,6 +564,33 @@ describe("Orchestrators", function () { if (pendingTransparentCuratorFees > 0) { await transparentVault.connect(owner).claimCuratorFees(pendingTransparentCuratorFees); } + + const epochTokens = await internalStatesOrchestrator.getEpochTokens(); + expect(epochTokens.length).to.be.gt(0); + + const expectedTokens = [ + await mockAsset1.getAddress(), + await mockAsset2.getAddress(), + await mockAsset3.getAddress(), + await underlyingAsset.getAddress(), + ]; + + for (const expectedToken of expectedTokens) { + expect(epochTokens).to.include(expectedToken); + } + + for (const token of epochTokens) { + const price = await internalStatesOrchestrator.getPriceOf(token); + expect(price).to.be.gt(0); + + if (token === (await underlyingAsset.getAddress())) { + // Underlying asset price should be 1 + expect(price).to.equal(ethers.parseUnits("1", 14)); + } else { + // Mock asset prices should be strictly positive + expect(price).to.be.gt(0); + } + } }); it("should not trigger upkeep when system is idle and time hasn't passed", async function () { @@ -673,6 +698,125 @@ describe("Orchestrators", function () { // Verify target buffer ratio is set correctly expect(await liquidityOrchestrator.targetBufferRatio()).to.equal(100); }); + + it("should test internal states orchestrator with positive deltaAmount scenario", async function () { + const epochDuration = await internalStatesOrchestrator.epochDuration(); + await time.increase(epochDuration + 1n); + + let [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(1); + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(2); + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(3); + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(4); + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(0); + expect(await internalStatesOrchestrator.epochCounter()).to.equal(1); + + const initialBufferAmount = await internalStatesOrchestrator.bufferAmount(); + + // Create price mismatch by simulating losses AFTER the oracle price call but BEFORE liquidity orchestrator execution + // This will cause the execution price to be lower than the oracle price, leading to decreasing buffer amount. + + let [liquidityUpkeepNeeded, liquidityPerformData] = await liquidityOrchestrator.checkUpkeep("0x"); + void expect(liquidityUpkeepNeeded).to.be.true; + await liquidityOrchestrator.connect(automationRegistry).performUpkeep(liquidityPerformData); + expect(await liquidityOrchestrator.currentPhase()).to.equal(2); // From Idle to BuyingLeg (no selling in this scenario) + + // Simulate losses in mock assets to decrease their share prices + const lossAmount1 = ethers.parseUnits("5", 12); + await mockAsset1.connect(owner).simulateLosses(lossAmount1, owner.address); + + const lossAmount2 = ethers.parseUnits("7", 12); + await mockAsset2.connect(owner).simulateLosses(lossAmount2, owner.address); + + const lossAmount3 = ethers.parseUnits("10", 12); + await mockAsset3.connect(owner).simulateLosses(lossAmount3, owner.address); + + // Continue liquidity orchestrator execution phases + [liquidityUpkeepNeeded, liquidityPerformData] = await liquidityOrchestrator.checkUpkeep("0x"); + void expect(liquidityUpkeepNeeded).to.be.true; + await liquidityOrchestrator.connect(automationRegistry).performUpkeep(liquidityPerformData); + + [liquidityUpkeepNeeded, liquidityPerformData] = await liquidityOrchestrator.checkUpkeep("0x"); + void expect(liquidityUpkeepNeeded).to.be.true; + await liquidityOrchestrator.connect(automationRegistry).performUpkeep(liquidityPerformData); + + [liquidityUpkeepNeeded, liquidityPerformData] = await liquidityOrchestrator.checkUpkeep("0x"); + void expect(liquidityUpkeepNeeded).to.be.true; + await liquidityOrchestrator.connect(automationRegistry).performUpkeep(liquidityPerformData); + + [liquidityUpkeepNeeded, liquidityPerformData] = await liquidityOrchestrator.checkUpkeep("0x"); + void expect(liquidityUpkeepNeeded).to.be.true; + await liquidityOrchestrator.connect(automationRegistry).performUpkeep(liquidityPerformData); + + expect(await liquidityOrchestrator.currentPhase()).to.equal(3); // FulfillDepositAndRedeem + + [liquidityUpkeepNeeded, liquidityPerformData] = await liquidityOrchestrator.checkUpkeep("0x"); + void expect(liquidityUpkeepNeeded).to.be.true; + await liquidityOrchestrator.connect(automationRegistry).performUpkeep(liquidityPerformData); + expect(await liquidityOrchestrator.currentPhase()).to.equal(0); // Idle + + // Check that buffer amount has changed due to market impact + const finalBufferAmount = await internalStatesOrchestrator.bufferAmount(); + // The buffer amount should have changed due to market impact. + expect(finalBufferAmount).to.be.gt(initialBufferAmount); + + // Start a new epoch to test the complete cycle with the updated buffer + await time.increase(epochDuration + 1n); + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(1); + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(2); + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(3); + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(4); + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(0); + expect(await internalStatesOrchestrator.epochCounter()).to.equal(2); + + const depositAmount = ethers.parseUnits("1000", 12); + const bufferAmountBeforeDeposit = await internalStatesOrchestrator.bufferAmount(); + + await underlyingAsset.connect(owner).mint(owner.address, depositAmount); + await underlyingAsset.connect(owner).approve(await liquidityOrchestrator.getAddress(), depositAmount); + + await liquidityOrchestrator.connect(owner).depositLiquidity(depositAmount); + + // Check that the buffer amount increased by the deposit amount + const bufferAmountAfterDeposit = await internalStatesOrchestrator.bufferAmount(); + expect(bufferAmountAfterDeposit).to.equal(bufferAmountBeforeDeposit + depositAmount); + + const withdrawAmount = ethers.parseUnits("500", 12); + const bufferAmountBeforeWithdraw = bufferAmountAfterDeposit; + + await liquidityOrchestrator.connect(owner).withdrawLiquidity(withdrawAmount); + + const bufferAmountAfterWithdraw = await internalStatesOrchestrator.bufferAmount(); + expect(bufferAmountAfterWithdraw).to.equal(bufferAmountBeforeWithdraw - withdrawAmount); + }); }); describe("configuration", function () { @@ -747,10 +891,16 @@ describe("Orchestrators", function () { .withArgs(newAutomationRegistry); expect(await internalStatesOrchestrator.automationRegistry()).to.equal(newAutomationRegistry); + + await expect(liquidityOrchestrator.updateAutomationRegistry(newAutomationRegistry)) + .to.emit(liquidityOrchestrator, "AutomationRegistryUpdated") + .withArgs(newAutomationRegistry); + + expect(await liquidityOrchestrator.automationRegistry()).to.equal(newAutomationRegistry); }); }); - describe("Security Tests - InvalidState Protection", function () { + describe("Security Tests - InternalStatesOrchestrator InvalidState Protection", function () { const createMaliciousPerformData = (action: string, minibatchIndex: number = 0) => { const actionHash = ethers.keccak256(ethers.toUtf8Bytes(action)); const actionBytes4 = actionHash.slice(0, 10); @@ -858,4 +1008,282 @@ describe("Orchestrators", function () { ).to.be.revertedWithCustomError(internalStatesOrchestrator, "InvalidState"); }); }); + + describe("Security Tests - LiquidityOrchestrator InvalidState Protection", function () { + const createMaliciousLiquidityPerformData = (action: string, minibatchIndex: number = 0) => { + const actionHash = ethers.keccak256(ethers.toUtf8Bytes(action)); + const actionBytes4 = actionHash.slice(0, 10); + return ethers.AbiCoder.defaultAbiCoder().encode(["bytes4", "uint8"], [actionBytes4, minibatchIndex]); + }; + + it("should not update phase when calling start() in any phase", async function () { + expect(await liquidityOrchestrator.currentPhase()).to.equal(0); // Idle + + const epochDuration = await internalStatesOrchestrator.epochDuration(); + await time.increase(epochDuration + 1n); + + let [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(1); // PreprocessingTransparentVaults + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(2); // Buffering + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(3); // PostprocessingTransparentVaults + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(4); // BuildingOrders + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(0); // Back to Idle + + const [_liquidityUpkeepNeeded, liquidityPerformData] = await liquidityOrchestrator.checkUpkeep("0x"); + await liquidityOrchestrator.connect(automationRegistry).performUpkeep(liquidityPerformData); + expect(await liquidityOrchestrator.currentPhase()).to.equal(2); // BuyingLeg (skips SellingLeg since no selling tokens) + + const maliciousData = createMaliciousLiquidityPerformData("start()", 0); + await liquidityOrchestrator.connect(automationRegistry).performUpkeep(maliciousData); + + expect(await liquidityOrchestrator.currentPhase()).to.equal(2); // No phase change. + }); + + it("should revert with InvalidState when calling processSell(uint8) in wrong phase", async function () { + expect(await liquidityOrchestrator.currentPhase()).to.equal(0); // Idle + + const maliciousData = createMaliciousLiquidityPerformData("processSell(uint8)", 0); + await expect( + liquidityOrchestrator.connect(automationRegistry).performUpkeep(maliciousData), + ).to.be.revertedWithCustomError(liquidityOrchestrator, "InvalidState"); + }); + + it("should revert with InvalidState when calling processBuy(uint8) in wrong phase", async function () { + expect(await liquidityOrchestrator.currentPhase()).to.equal(0); // Idle + + const maliciousData = createMaliciousLiquidityPerformData("processBuy(uint8)", 0); + await expect( + liquidityOrchestrator.connect(automationRegistry).performUpkeep(maliciousData), + ).to.be.revertedWithCustomError(liquidityOrchestrator, "InvalidState"); + }); + + it("should revert with InvalidState when calling processFulfillDepositAndRedeem() in wrong phase", async function () { + expect(await liquidityOrchestrator.currentPhase()).to.equal(0); // Idle + + const maliciousData = createMaliciousLiquidityPerformData("processFulfillDepositAndRedeem()", 0); + await expect( + liquidityOrchestrator.connect(automationRegistry).performUpkeep(maliciousData), + ).to.be.revertedWithCustomError(liquidityOrchestrator, "InvalidState"); + }); + + it("should revert with InvalidState when trying to execute phases out of order", async function () { + const epochDuration = await internalStatesOrchestrator.epochDuration(); + await time.increase(epochDuration + 1n); + + let [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(1); // PreprocessingTransparentVaults + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(2); // Buffering + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(3); // PostprocessingTransparentVaults + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(4); // BuildingOrders + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(0); // Back to Idle + + const [_liquidityUpkeepNeeded, liquidityPerformData] = await liquidityOrchestrator.checkUpkeep("0x"); + await liquidityOrchestrator.connect(automationRegistry).performUpkeep(liquidityPerformData); + expect(await liquidityOrchestrator.currentPhase()).to.equal(2); // BuyingLeg (skips SellingLeg since no selling tokens) + + const maliciousData = createMaliciousLiquidityPerformData("processSell(uint8)", 0); + await expect( + liquidityOrchestrator.connect(automationRegistry).performUpkeep(maliciousData), + ).to.be.revertedWithCustomError(liquidityOrchestrator, "InvalidState"); + }); + + it("should revert with InvalidState when trying to replay completed phases", async function () { + const epochDuration = await internalStatesOrchestrator.epochDuration(); + await time.increase(epochDuration + 1n); + + let [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(1); // PreprocessingTransparentVaults + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(2); // Buffering + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(3); // PostprocessingTransparentVaults + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(4); // BuildingOrders + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(0); // Back to Idle + + let [_liquidityUpkeepNeeded, liquidityPerformData] = await liquidityOrchestrator.checkUpkeep("0x"); + await liquidityOrchestrator.connect(automationRegistry).performUpkeep(liquidityPerformData); + expect(await liquidityOrchestrator.currentPhase()).to.equal(2); // BuyingLeg (skips SellingLeg since no selling tokens) + + [_liquidityUpkeepNeeded, liquidityPerformData] = await liquidityOrchestrator.checkUpkeep("0x"); + await liquidityOrchestrator.connect(automationRegistry).performUpkeep(liquidityPerformData); + expect(await liquidityOrchestrator.currentPhase()).to.equal(2); // Still BuyingLeg (processing minibatches) + + [_liquidityUpkeepNeeded, liquidityPerformData] = await liquidityOrchestrator.checkUpkeep("0x"); + await liquidityOrchestrator.connect(automationRegistry).performUpkeep(liquidityPerformData); + expect(await liquidityOrchestrator.currentPhase()).to.equal(2); // Still BuyingLeg (processing minibatches) + + [_liquidityUpkeepNeeded, liquidityPerformData] = await liquidityOrchestrator.checkUpkeep("0x"); + await liquidityOrchestrator.connect(automationRegistry).performUpkeep(liquidityPerformData); + expect(await liquidityOrchestrator.currentPhase()).to.equal(2); // Still BuyingLeg (processing minibatches) + + [_liquidityUpkeepNeeded, liquidityPerformData] = await liquidityOrchestrator.checkUpkeep("0x"); + await liquidityOrchestrator.connect(automationRegistry).performUpkeep(liquidityPerformData); + expect(await liquidityOrchestrator.currentPhase()).to.equal(3); // FulfillDepositAndRedeem + + [_liquidityUpkeepNeeded, liquidityPerformData] = await liquidityOrchestrator.checkUpkeep("0x"); + await liquidityOrchestrator.connect(automationRegistry).performUpkeep(liquidityPerformData); + expect(await liquidityOrchestrator.currentPhase()).to.equal(0); // Back to Idle + + const maliciousData = createMaliciousLiquidityPerformData("processBuy(uint8)", 0); + await expect( + liquidityOrchestrator.connect(automationRegistry).performUpkeep(maliciousData), + ).to.be.revertedWithCustomError(liquidityOrchestrator, "InvalidState"); + }); + + it("should revert with InvalidState when trying to execute wrong minibatch action in current phase", async function () { + const epochDuration = await internalStatesOrchestrator.epochDuration(); + await time.increase(epochDuration + 1n); + + let [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(1); // PreprocessingTransparentVaults + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(2); // Buffering + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(3); // PostprocessingTransparentVaults + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(4); // BuildingOrders + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(0); // Back to Idle + + const [_liquidityUpkeepNeeded, liquidityPerformData] = await liquidityOrchestrator.checkUpkeep("0x"); + await liquidityOrchestrator.connect(automationRegistry).performUpkeep(liquidityPerformData); + expect(await liquidityOrchestrator.currentPhase()).to.equal(2); // BuyingLeg (skips SellingLeg since no selling tokens) + + const maliciousData = createMaliciousLiquidityPerformData("processFulfillDepositAndRedeem()", 0); + + await expect( + liquidityOrchestrator.connect(automationRegistry).performUpkeep(maliciousData), + ).to.be.revertedWithCustomError(liquidityOrchestrator, "InvalidState"); + }); + + it("should revert with InvalidState when trying to execute processSell in BuyingLeg phase", async function () { + const epochDuration = await internalStatesOrchestrator.epochDuration(); + await time.increase(epochDuration + 1n); + + let [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(1); // PreprocessingTransparentVaults + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(2); // Buffering + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(3); // PostprocessingTransparentVaults + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(4); // BuildingOrders + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(0); // Back to Idle + + const [_liquidityUpkeepNeeded, liquidityPerformData] = await liquidityOrchestrator.checkUpkeep("0x"); + await liquidityOrchestrator.connect(automationRegistry).performUpkeep(liquidityPerformData); + expect(await liquidityOrchestrator.currentPhase()).to.equal(2); // BuyingLeg (skips SellingLeg since no selling tokens) + + const maliciousData = createMaliciousLiquidityPerformData("processSell(uint8)", 0); + await expect( + liquidityOrchestrator.connect(automationRegistry).performUpkeep(maliciousData), + ).to.be.revertedWithCustomError(liquidityOrchestrator, "InvalidState"); + }); + + it("should revert with InvalidState when trying to execute processBuy in FulfillDepositAndRedeem phase", async function () { + const epochDuration = await internalStatesOrchestrator.epochDuration(); + await time.increase(epochDuration + 1n); + + let [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(1); // PreprocessingTransparentVaults + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(2); // Buffering + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(3); // PostprocessingTransparentVaults + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(4); // BuildingOrders + + [_upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + expect(await internalStatesOrchestrator.currentPhase()).to.equal(0); // Back to Idle + + let [_liquidityUpkeepNeeded, liquidityPerformData] = await liquidityOrchestrator.checkUpkeep("0x"); + await liquidityOrchestrator.connect(automationRegistry).performUpkeep(liquidityPerformData); + expect(await liquidityOrchestrator.currentPhase()).to.equal(2); // BuyingLeg (skips SellingLeg since no selling tokens) + + [_liquidityUpkeepNeeded, liquidityPerformData] = await liquidityOrchestrator.checkUpkeep("0x"); + await liquidityOrchestrator.connect(automationRegistry).performUpkeep(liquidityPerformData); + expect(await liquidityOrchestrator.currentPhase()).to.equal(2); // Still BuyingLeg (processing minibatches) + + [_liquidityUpkeepNeeded, liquidityPerformData] = await liquidityOrchestrator.checkUpkeep("0x"); + await liquidityOrchestrator.connect(automationRegistry).performUpkeep(liquidityPerformData); + expect(await liquidityOrchestrator.currentPhase()).to.equal(2); // Still BuyingLeg (processing minibatches) + + [_liquidityUpkeepNeeded, liquidityPerformData] = await liquidityOrchestrator.checkUpkeep("0x"); + await liquidityOrchestrator.connect(automationRegistry).performUpkeep(liquidityPerformData); + expect(await liquidityOrchestrator.currentPhase()).to.equal(2); // Still BuyingLeg (processing minibatches) + + [_liquidityUpkeepNeeded, liquidityPerformData] = await liquidityOrchestrator.checkUpkeep("0x"); + await liquidityOrchestrator.connect(automationRegistry).performUpkeep(liquidityPerformData); + expect(await liquidityOrchestrator.currentPhase()).to.equal(3); // FulfillDepositAndRedeem + + const maliciousData = createMaliciousLiquidityPerformData("processBuy(uint8)", 0); + await expect( + liquidityOrchestrator.connect(automationRegistry).performUpkeep(maliciousData), + ).to.be.revertedWithCustomError(liquidityOrchestrator, "InvalidState"); + }); + }); }); diff --git a/test/OrchestratorsZeroState.test.ts b/test/OrchestratorsZeroState.test.ts index 486ea223..e47130f9 100644 --- a/test/OrchestratorsZeroState.test.ts +++ b/test/OrchestratorsZeroState.test.ts @@ -23,9 +23,10 @@ describe("Orchestrators - zero deposits and zero intents", function () { let owner: SignerWithAddress; let curator: SignerWithAddress; let automationRegistry: SignerWithAddress; + let user: SignerWithAddress; beforeEach(async function () { - [owner, curator, automationRegistry] = await ethers.getSigners(); + [owner, curator, automationRegistry, user] = await ethers.getSigners(); const MockUnderlyingAssetFactory = await ethers.getContractFactory("MockUnderlyingAsset"); const underlyingAssetDeployed = await MockUnderlyingAssetFactory.deploy(12); @@ -89,6 +90,9 @@ describe("Orchestrators - zero deposits and zero intents", function () { tvAddress, )) as unknown as OrionTransparentVault; + // Mint underlying assets to user for potential deposits + await underlyingAsset.mint(user.address, ethers.parseUnits("10000", 12)); + // Ensure no deposits or intents present expect(await transparentVault.pendingDeposit()).to.equal(0); expect(await transparentVault.pendingRedeem()).to.equal(0); @@ -104,4 +108,66 @@ describe("Orchestrators - zero deposits and zero intents", function () { await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); expect(await internalStatesOrchestrator.currentPhase()).to.equal(0); }); + + it("should not move forward when vault has no total assets and no pending deposits but has valid intent", async function () { + // Submit a valid intent to the vault + const intent = [ + { + token: await underlyingAsset.getAddress(), + value: 1000000000, // 100% (100% of 1e9) + }, + ]; + await transparentVault.connect(curator).submitIntent(intent); + + // Verify the vault has no total assets and no pending deposits + expect(await transparentVault.totalAssets()).to.equal(0); + expect(await transparentVault.pendingDeposit()).to.equal(0); + + // Verify the vault has a valid intent + const [intentTokens, _intentWeights] = await transparentVault.getIntent(); + expect(intentTokens.length).to.be.gt(0); + + // Fast forward time to trigger upkeep + const epochDuration = await internalStatesOrchestrator.epochDuration(); + await time.increase(epochDuration + 1n); + + // Check that upkeep is needed + const [upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + void expect(upkeepNeeded).to.be.true; + + // Perform upkeep - should complete but not move to next phase + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + + // Should remain in Idle phase (0) because no vaults were processed + expect(await internalStatesOrchestrator.currentPhase()).to.equal(0); + }); + + it("should not move forward when vault has pending deposits but no intent submitted", async function () { + // Make a deposit request to create pending deposits + const depositAmount = ethers.parseUnits("100", 12); + await underlyingAsset.connect(user).approve(await transparentVault.getAddress(), depositAmount); + await transparentVault.connect(user).requestDeposit(depositAmount); + + // Verify the vault has pending deposits but no total assets + expect(await transparentVault.pendingDeposit()).to.equal(depositAmount); + expect(await transparentVault.totalAssets()).to.equal(0); + + // Verify the vault has no intent (empty intent) + const [intentTokens, _intentWeights] = await transparentVault.getIntent(); + expect(intentTokens.length).to.equal(0); + + // Fast forward time to trigger upkeep + const epochDuration = await internalStatesOrchestrator.epochDuration(); + await time.increase(epochDuration + 1n); + + // Check that upkeep is needed + const [upkeepNeeded, performData] = await internalStatesOrchestrator.checkUpkeep("0x"); + void expect(upkeepNeeded).to.be.true; + + // Perform upkeep - should complete but not move to next phase + await internalStatesOrchestrator.connect(automationRegistry).performUpkeep(performData); + + // Should remain in Idle phase (0) because no vaults were processed + expect(await internalStatesOrchestrator.currentPhase()).to.equal(0); + }); }); diff --git a/test/OrionConfigVault.test.ts b/test/OrionConfigVault.test.ts index e23964c3..ca64e8a5 100644 --- a/test/OrionConfigVault.test.ts +++ b/test/OrionConfigVault.test.ts @@ -254,6 +254,34 @@ describe("Config", function () { }); }); + describe("addWhitelistedVaultOwner", function () { + it("Should successfully add a whitelisted vault owner", async function () { + const newVaultOwner = other.address; + + expect(await orionConfig.isWhitelistedVaultOwner(newVaultOwner)).to.equal(false); + await expect(orionConfig.addWhitelistedVaultOwner(newVaultOwner)).to.not.be.reverted; + expect(await orionConfig.isWhitelistedVaultOwner(newVaultOwner)).to.equal(true); + }); + + it("Should revert when trying to add already whitelisted vault owner", async function () { + const existingVaultOwner = owner.address; + + expect(await orionConfig.isWhitelistedVaultOwner(existingVaultOwner)).to.equal(true); + await expect(orionConfig.addWhitelistedVaultOwner(existingVaultOwner)).to.be.revertedWithCustomError( + orionConfig, + "AlreadyRegistered", + ); + }); + + it("Should revert when called by non-owner", async function () { + const newVaultOwner = other.address; + + await expect(orionConfig.connect(user).addWhitelistedVaultOwner(newVaultOwner)) + .to.be.revertedWithCustomError(orionConfig, "OwnableUnauthorizedAccount") + .withArgs(user.address); + }); + }); + describe("removeOrionVault", function () { it("Should successfully remove a transparent vault", async function () { const vaultAddress = await vault.getAddress(); diff --git a/test/PassiveCuratorStrategy.test.ts b/test/PassiveCuratorStrategy.test.ts index f88babea..3d0ba792 100644 --- a/test/PassiveCuratorStrategy.test.ts +++ b/test/PassiveCuratorStrategy.test.ts @@ -199,10 +199,10 @@ describe("Passive Curator Strategy", function () { await strategyDeployed.waitForDeployment(); strategy = strategyDeployed as unknown as KBestTvlWeightedAverage; - // Create a transparent vault with the strategy as curator + // Step 1: Create a transparent vault with an address (not contract) as curator const tx = await transparentVaultFactory .connect(owner) - .createVault(await strategy.getAddress(), "Test Strategy Vault", "TSV", 0, 0, 0); + .createVault(curator.address, "Test Strategy Vault", "TSV", 0, 0, 0); const receipt = await tx.wait(); // Find the vault creation event @@ -228,6 +228,7 @@ describe("Passive Curator Strategy", function () { await transparentVault.connect(owner).updateFeeModel(3, 1000, 100); + // Step 2: Update vault investment universe to exclude underlying asset await transparentVault .connect(owner) .updateVaultWhitelist([ @@ -237,6 +238,9 @@ describe("Passive Curator Strategy", function () { await mockAsset4.getAddress(), ]); + // Step 3: Update curator to the strategy contract + await transparentVault.connect(owner).updateCurator(await strategy.getAddress()); + await underlyingAsset.connect(user).approve(await transparentVault.getAddress(), ethers.parseUnits("10000", 12)); const depositAmount = ethers.parseUnits("100", 12); await transparentVault.connect(user).requestDeposit(depositAmount); @@ -250,8 +254,15 @@ describe("Passive Curator Strategy", function () { it("should support IOrionStrategy interface", async function () { // Check that the strategy supports the IOrionStrategy interface - const interfaceId = ethers.id("computeIntent(address[])").slice(0, 10); - await expect(await strategy.supportsInterface(interfaceId)).to.be.true; + // The interface ID is calculated from XOR of all function selectors in the interface + const computeIntentSelector = ethers.id("computeIntent(address[])").slice(0, 10); + const validateStrategySelector = ethers.id("validateStrategy(address[])").slice(0, 10); + + // XOR the two selectors to get the interface ID + const interfaceId = (BigInt(computeIntentSelector) ^ BigInt(validateStrategySelector)) + .toString(16) + .padStart(8, "0"); + await expect(await strategy.supportsInterface("0x" + interfaceId)).to.be.true; }); it("should support ERC165 interface", async function () { @@ -427,6 +438,39 @@ describe("Passive Curator Strategy", function () { }); }); + describe("Vault Whitelist Updates with Strategy Validation", function () { + it("should validate strategy when updating vault whitelist", async function () { + await transparentVault + .connect(owner) + .updateVaultWhitelist([await mockAsset1.getAddress(), await mockAsset2.getAddress()]); + + const whitelist = await transparentVault.vaultWhitelist(); + expect(whitelist.length).to.equal(2); + expect(whitelist).to.include(await mockAsset1.getAddress()); + expect(whitelist).to.include(await mockAsset2.getAddress()); + }); + + it("should reject invalid whitelist updates that break strategy", async function () { + // Try to update whitelist with an invalid asset (non-ERC4626) + // This should fail because the strategy validation will reject it + await expect( + transparentVault + .connect(owner) + .updateVaultWhitelist([await mockAsset1.getAddress(), await underlyingAsset.getAddress()]), + ).to.be.revertedWithCustomError(strategy, "InvalidStrategy"); + }); + + it("should allow whitelist updates when curator is not a strategy", async function () { + await transparentVault.connect(owner).updateCurator(owner.address); + + await transparentVault + .connect(owner) + .updateVaultWhitelist([await mockAsset1.getAddress(), await mockAsset2.getAddress()]); + + await transparentVault.connect(owner).updateCurator(await strategy.getAddress()); + }); + }); + describe("Error Handling", function () { it("should maintain valid intent weights after parameter changes", async function () { // Test various k values to ensure weights always sum to 100% @@ -445,5 +489,91 @@ describe("Passive Curator Strategy", function () { expect(totalWeight).to.equal(expectedTotalWeight); // 100% } }); + + it("should handle weight overflow scenario (sumWeights > intentScale)", async function () { + const MockERC4626AssetFactory = await ethers.getContractFactory("MockERC4626Asset"); + + const mockAsset5Deployed = await MockERC4626AssetFactory.deploy( + await underlyingAsset.getAddress(), + "Mock Asset 5", + "MA5", + ); + await mockAsset5Deployed.waitForDeployment(); + const mockAsset5 = mockAsset5Deployed as unknown as MockERC4626Asset; + + const mockAsset6Deployed = await MockERC4626AssetFactory.deploy( + await underlyingAsset.getAddress(), + "Mock Asset 6", + "MA6", + ); + await mockAsset6Deployed.waitForDeployment(); + const mockAsset6 = mockAsset6Deployed as unknown as MockERC4626Asset; + + const mockAsset7Deployed = await MockERC4626AssetFactory.deploy( + await underlyingAsset.getAddress(), + "Mock Asset 7", + "MA7", + ); + await mockAsset7Deployed.waitForDeployment(); + const mockAsset7 = mockAsset7Deployed as unknown as MockERC4626Asset; + + await orionConfig.addWhitelistedAsset( + await mockAsset5.getAddress(), + await orionPriceAdapter.getAddress(), + await orionExecutionAdapter.getAddress(), + ); + await orionConfig.addWhitelistedAsset( + await mockAsset6.getAddress(), + await orionPriceAdapter.getAddress(), + await orionExecutionAdapter.getAddress(), + ); + await orionConfig.addWhitelistedAsset( + await mockAsset7.getAddress(), + await orionPriceAdapter.getAddress(), + await orionExecutionAdapter.getAddress(), + ); + + // Using values like 1, 1, 1 with total 3 will create weights that round up + // Each weight will be (1/3) * 10^6 = 333333.33... which rounds to 333334 + // Sum will be 333334 * 3 = 1000002 > 1000000 (intentScale) + const depositAmount = ethers.parseUnits("1", 12); + + await underlyingAsset.connect(user).approve(await mockAsset5.getAddress(), depositAmount); + await mockAsset5.connect(user).deposit(depositAmount, user.address); + + await underlyingAsset.connect(user).approve(await mockAsset6.getAddress(), depositAmount); + await mockAsset6.connect(user).deposit(depositAmount, user.address); + + await underlyingAsset.connect(user).approve(await mockAsset7.getAddress(), depositAmount); + await mockAsset7.connect(user).deposit(depositAmount, user.address); + + await transparentVault + .connect(owner) + .updateVaultWhitelist([ + await mockAsset5.getAddress(), + await mockAsset6.getAddress(), + await mockAsset7.getAddress(), + ]); + + // Set k=3 to select all 3 assets with equal TVL + await strategy.connect(curator).updateParameters(3); + + // Get intent - this should trigger the sumWeights > intentScale condition + const [tokens, weights] = await transparentVault.getIntent(); + + // Verify we have 3 assets selected + expect(tokens.length).to.equal(3); + expect(weights.length).to.equal(3); + + // Verify that weights still sum to the correct total + let totalWeight = 0n; + for (const weight of weights) { + totalWeight += BigInt(weight); + } + + const curatorIntentDecimals = await orionConfig.curatorIntentDecimals(); + const expectedTotalWeight = 10 ** Number(curatorIntentDecimals); + expect(totalWeight).to.equal(expectedTotalWeight); + }); }); }); diff --git a/test/TransparentVault.test.ts b/test/TransparentVault.test.ts index 4c3e750b..f78ed9df 100644 --- a/test/TransparentVault.test.ts +++ b/test/TransparentVault.test.ts @@ -197,10 +197,6 @@ describe("TransparentVault - Curator Pipeline", function () { }); it("Should allow vault owner to claim curator fees", async function () { - // Note: In a real scenario, fees would be accrued by the liquidity orchestrator - // For testing purposes, we'll skip the fee accrual step and just test the claim function - // The claim function requires pendingCuratorFees > 0, so we'll test the revert case - const claimAmount = ethers.parseUnits("50", 6); // Try to claim 50 USDC await expect(transparentVault.connect(owner).claimCuratorFees(claimAmount)).to.be.revertedWithCustomError( @@ -210,7 +206,6 @@ describe("TransparentVault - Curator Pipeline", function () { }); it("Should allow curator to submit intent", async function () { - // First update the whitelist to include the assets we want to use const whitelist = [await mockAsset1.getAddress(), await mockAsset2.getAddress()]; await transparentVault.connect(owner).updateVaultWhitelist(whitelist); diff --git a/test/UtilitiesLib.test.ts b/test/UtilitiesLib.test.ts new file mode 100644 index 00000000..4a061c9e --- /dev/null +++ b/test/UtilitiesLib.test.ts @@ -0,0 +1,193 @@ +import { expect } from "chai"; +import { ethers } from "hardhat"; + +import { UtilitiesLibTest } from "../typechain-types/contracts/test"; + +describe("UtilitiesLib", function () { + let utilitiesLib: UtilitiesLibTest; + + beforeEach(async function () { + const UtilitiesLibTestFactory = await ethers.getContractFactory("UtilitiesLibTest"); + const deployedContract = await UtilitiesLibTestFactory.deploy(); + await deployedContract.waitForDeployment(); + utilitiesLib = deployedContract as unknown as UtilitiesLibTest; + }); + + describe("convertDecimals", function () { + describe("when scaling up (toDecimals > fromDecimals)", function () { + it("should correctly scale up from 6 to 18 decimals", async function () { + const value = ethers.parseUnits("1000", 6); + const expected = ethers.parseUnits("1000", 18); + + const result = await utilitiesLib.convertDecimals(value, 6, 18); + expect(result).to.equal(expected); + }); + + it("should correctly scale up from 0 to 18 decimals", async function () { + const value = 1000; + const expected = ethers.parseUnits("1000", 18); + + const result = await utilitiesLib.convertDecimals(value, 0, 18); + expect(result).to.equal(expected); + }); + + it("should correctly scale up from 6 to 12 decimals", async function () { + const value = ethers.parseUnits("500", 6); // 500 with 6 decimals + const expected = ethers.parseUnits("500", 12); // 500 with 12 decimals + + const result = await utilitiesLib.convertDecimals(value, 6, 12); + expect(result).to.equal(expected); + }); + + it("should handle zero value when scaling up", async function () { + const value = 0; + const expected = 0; + + const result = await utilitiesLib.convertDecimals(value, 6, 18); + expect(result).to.equal(expected); + }); + + it("should handle large values when scaling up", async function () { + const value = ethers.parseUnits("1000000", 6); + const expected = ethers.parseUnits("1000000", 18); + + const result = await utilitiesLib.convertDecimals(value, 6, 18); + expect(result).to.equal(expected); + }); + }); + + describe("when scaling down (toDecimals < fromDecimals)", function () { + it("should correctly scale down from 18 to 6 decimals", async function () { + const value = ethers.parseUnits("1000", 18); + const expected = ethers.parseUnits("1000", 6); + + const result = await utilitiesLib.convertDecimals(value, 18, 6); + expect(result).to.equal(expected); + }); + + it("should correctly scale down from 18 to 0 decimals", async function () { + const value = ethers.parseUnits("1000", 18); + const expected = 1000; + + const result = await utilitiesLib.convertDecimals(value, 18, 0); + expect(result).to.equal(expected); + }); + + it("should correctly scale down from 12 to 6 decimals", async function () { + const value = ethers.parseUnits("500", 12); + const expected = ethers.parseUnits("500", 6); + + const result = await utilitiesLib.convertDecimals(value, 12, 6); + expect(result).to.equal(expected); + }); + + it("should handle zero value when scaling down", async function () { + const value = 0; + const expected = 0; + + const result = await utilitiesLib.convertDecimals(value, 18, 6); + expect(result).to.equal(expected); + }); + + it("should handle precision loss when scaling down", async function () { + const value = ethers.parseUnits("1.5", 18); + const expected = ethers.parseUnits("1.5", 6); + + const result = await utilitiesLib.convertDecimals(value, 18, 6); + expect(result).to.equal(expected); + }); + + it("should handle large values when scaling down", async function () { + const value = ethers.parseUnits("1000000", 18); + const expected = ethers.parseUnits("1000000", 6); + + const result = await utilitiesLib.convertDecimals(value, 18, 6); + expect(result).to.equal(expected); + }); + }); + + describe("when no conversion needed (toDecimals == fromDecimals)", function () { + it("should return the same value when decimals are equal (18)", async function () { + const value = ethers.parseUnits("1000", 18); + const expected = value; + + const result = await utilitiesLib.convertDecimals(value, 18, 18); + expect(result).to.equal(expected); + }); + + it("should return the same value when decimals are equal (6)", async function () { + const value = ethers.parseUnits("1000", 6); + const expected = value; + + const result = await utilitiesLib.convertDecimals(value, 6, 6); + expect(result).to.equal(expected); + }); + + it("should return the same value when decimals are equal (0)", async function () { + const value = 1000; + const expected = value; + + const result = await utilitiesLib.convertDecimals(value, 0, 0); + expect(result).to.equal(expected); + }); + + it("should return zero when value is zero and decimals are equal", async function () { + const value = 0; + const expected = 0; + + const result = await utilitiesLib.convertDecimals(value, 18, 18); + expect(result).to.equal(expected); + }); + }); + + describe("edge cases and boundary conditions", function () { + it("should handle reasonable decimal difference (0 to 18)", async function () { + const value = 1; + const expected = ethers.parseUnits("1", 18); + + const result = await utilitiesLib.convertDecimals(value, 0, 18); + expect(result).to.equal(expected); + }); + + it("should handle reasonable decimal difference (18 to 0)", async function () { + const value = ethers.parseUnits("1", 18); + const expected = 1; + + const result = await utilitiesLib.convertDecimals(value, 18, 0); + expect(result).to.equal(expected); + }); + + it("should handle single decimal difference (17 to 18)", async function () { + const value = ethers.parseUnits("1000", 17); + const expected = ethers.parseUnits("1000", 18); + + const result = await utilitiesLib.convertDecimals(value, 17, 18); + expect(result).to.equal(expected); + }); + + it("should handle single decimal difference (18 to 17)", async function () { + const value = ethers.parseUnits("1000", 18); + const expected = ethers.parseUnits("1000", 17); + + const result = await utilitiesLib.convertDecimals(value, 18, 17); + expect(result).to.equal(expected); + }); + + it("should handle very small values", async function () { + const value = 1; + const expected = ethers.parseUnits("1", 12); + + const result = await utilitiesLib.convertDecimals(value, 0, 12); + expect(result).to.equal(expected); + }); + + it("should handle very large values", async function () { + const value = ethers.parseUnits("1000000000", 18); + const expected = ethers.parseUnits("1000000000", 6); + + const result = await utilitiesLib.convertDecimals(value, 18, 6); + expect(result).to.equal(expected); + }); + }); + }); +});