[ { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [ { "internalType": "address", "name": "target", "type": "address" } ], "name": "AddressEmptyCode", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "AddressInsufficientBalance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "allowance", "type": "uint256" }, { "internalType": "uint256", "name": "needed", "type": "uint256" } ], "name": "ERC20InsufficientAllowance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "uint256", "name": "balance", "type": "uint256" }, { "internalType": "uint256", "name": "needed", "type": "uint256" } ], "name": "ERC20InsufficientBalance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "approver", "type": "address" } ], "name": "ERC20InvalidApprover", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "receiver", "type": "address" } ], "name": "ERC20InvalidReceiver", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" } ], "name": "ERC20InvalidSender", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" } ], "name": "ERC20InvalidSpender", "type": "error" }, { "inputs": [], "name": "ExceedsLimit", "type": "error" }, { "inputs": [], "name": "FailedInnerCall", "type": "error" }, { "inputs": [], "name": "InsufficientDeposit", "type": "error" }, { "inputs": [], "name": "InsufficientIssueDebt", "type": "error" }, { "inputs": [], "name": "InsufficientWithdraw", "type": "error" }, { "inputs": [], "name": "InvalidInitialization", "type": "error" }, { "inputs": [], "name": "NotInitializing", "type": "error" }, { "inputs": [], "name": "NotLimitIncreaser", "type": "error" }, { "inputs": [], "name": "ReentrancyGuardReentrantCall", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "token", "type": "address" } ], "name": "SafeERC20FailedOperation", "type": "error" }, { "inputs": [], "name": "UnsafeCast", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "depositor", "type": "address" }, { "indexed": true, "internalType": "address", "name": "recipient", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "Deposit", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "IncreaseLimit", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint64", "name": "version", "type": "uint64" } ], "name": "Initialized", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "issuer", "type": "address" }, { "indexed": true, "internalType": "address", "name": "recipient", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "debtIssued", "type": "uint256" } ], "name": "IssueDebt", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "issuer", "type": "address" }, { "indexed": true, "internalType": "address", "name": "recipient", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "debtRepaid", "type": "uint256" } ], "name": "RepayDebt", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "limitIncreaser", "type": "address" } ], "name": "SetLimitIncreaser", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "withdrawer", "type": "address" }, { "indexed": true, "internalType": "address", "name": "recipient", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "Withdraw", "type": "event" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" } ], "name": "allowance", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "approve", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "asset", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "issuer", "type": "address" }, { "internalType": "address", "name": "recipient", "type": "address" } ], "name": "debt", "outputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "decimals", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "deposit", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" }, { "internalType": "uint8", "name": "v", "type": "uint8" }, { "internalType": "bytes32", "name": "r", "type": "bytes32" }, { "internalType": "bytes32", "name": "s", "type": "bytes32" } ], "name": "deposit", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "increaseLimit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "asset_", "type": "address" }, { "internalType": "uint256", "name": "initialLimit", "type": "uint256" }, { "internalType": "address", "name": "limitIncreaser_", "type": "address" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "issueDebt", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "issuer", "type": "address" } ], "name": "issuerDebt", "outputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "issuer", "type": "address" } ], "name": "issuerRepaidDebt", "outputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "limit", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "limitIncreaser", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "recipient", "type": "address" } ], "name": "recipientDebt", "outputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "recipient", "type": "address" } ], "name": "recipientRepaidDebt", "outputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "issuer", "type": "address" }, { "internalType": "address", "name": "recipient", "type": "address" } ], "name": "repaidDebt", "outputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "limitIncreaser_", "type": "address" } ], "name": "setLimitIncreaser", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalDebt", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalRepaidDebt", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "transfer", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "transferFrom", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "withdraw", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ]
6080806040523460b4577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c1660a557506001600160401b036002600160401b0319828216016061575b6040516120b490816100ba8239f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a13880806052565b63f92ee8a960e01b8152600490fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8063055bee72146101c757806306fdde03146101c2578063095ea7b3146101bd5780630aa28714146101b857806318160ddd146101b35780631f320d77146101ae57806323b872dd146101a9578063313ce567146101a457806332f84a3b1461019f57806338d52e0f1461019a57806347e7ef24146101955780635f777607146101905780636468c9e11461018b57806370a08231146101865780637715be0b14610181578063880721e31461017c57806395d89b41146101775780639eb2b20614610172578063a4d66daf1461016d578063a9059cbb14610168578063c350a1b514610163578063c57584891461015e578063d449300d14610159578063dd62ed3e14610154578063f2dee6221461014f578063f3fef3a31461014a5763fc7b9c181461014557600080fd5b610fbc565b610f2f565b610f11565b610ef4565b610eb8565b610c41565b610aee565b610ab9565b610a9b565b610a5e565b6109aa565b610965565b6107eb565b61078f565b610752565b610715565b6106e2565b6106b5565b610678565b6105e5565b610548565b6104d6565b6104ab565b61042f565b610369565b610261565b6101dc565b60009103126101d757565b600080fd5b346101d75760003660031901126101d757600a546040516001600160a01b039091168152602090f35b60005b8381106102185750506000910152565b8181015183820152602001610208565b9060209161024181518092818552858086019101610205565b601f01601f1916010190565b90602061025e928181520190610228565b90565b346101d757600080600319360112610355576040519080600080516020611fff833981519152805461029281610fda565b8086529260209260019280841690811561032657506001146102cf575b6102cb876102bf8189038261107b565b6040519182918261024d565b0390f35b815293507f2ae08a8e29253f69ac5d979a101956ab8f8d9d7ded63fa7a83b16fc47648eab05b838510610313575050505081016020016102bf826102cb38806102af565b80548686018401529382019381016102f5565b9150508695506102cb969350602092506102bf94915060ff191682840152151560051b820101929338806102af565b80fd5b6001600160a01b038116036101d757565b346101d75760403660031901126101d75760043561038681610358565b6024353315610416576001600160a01b0382169182156103fd576103c582916103ae33610606565b9060018060a01b0316600052602052604060002090565b556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b604051634a1406b160e11b815260006004820152602490fd5b60405163e602df0560e01b815260006004820152602490fd5b346101d75760203660031901126101d757600a54600435906001600160a01b0316330361049957600954818101809111610494577f7db0c775af0de83157f8daa1aa2e3ded9fc1b9b2c59ce540207c9cc286f4652791602091600955604051908152a1005b61109d565b6040516301c90f3b60e01b8152600490fd5b346101d75760003660031901126101d757602060008051602061203f83398151915254604051908152f35b346101d75760203660031901126101d7576004356104f381610358565b600a54906001600160a01b03908183163303610499571680916bffffffffffffffffffffffff60a01b1617600a557fc60dce8ee7742d2c2b79ac9131cecf283fca0f1da763a6f20920cc04ec80e4e5600080a2005b346101d75760603660031901126101d75760043561056581610358565b60243561057181610358565b60443590610582336103ae85610606565b5492600184016105a3575b610597935061159e565b60405160018152602090f35b8284106105bf576105ba8361059795033383611adb565b61058d565b604051637dc7a0d960e11b81523360048201526024810185905260448101849052606490fd5b346101d75760003660031901126101d757602060ff60005416604051908152f35b6001600160a01b031660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020526040902090565b6001600160a01b031660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006020526040902090565b346101d75760203660031901126101d75760043561069581610358565b60018060a01b031660005260036020526020604060002054604051908152f35b346101d75760003660031901126101d75760005460405160089190911c6001600160a01b03168152602090f35b346101d75760403660031901126101d757602061070d60043561070481610358565b602435906110c0565b604051908152f35b346101d75760203660031901126101d75760043561073281610358565b60018060a01b031660005260026020526020604060002054604051908152f35b346101d75760203660031901126101d75760043561076f81610358565b60018060a01b031660005260076020526020604060002054604051908152f35b346101d75760203660031901126101d7576004356107ac81610358565b60018060a01b03166000527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006020526020604060002054604051908152f35b346101d75760403660031901126101d75760043561080881610358565b602435801561092e5761081b81336117f6565b6040518181526001600160a01b038316926108fe91839190859033907f94d718798b5bf599360e731fe04c43db32daf30624eb7eef736635b7ce43e92490602090a361087161086c836001546110b3565b600155565b33600090815260026020526040902061088b8382546110b3565b90556001600160a01b03811660009081526003602052604090206108b08382546110b3565b90553360009081526004602052604090206108cc9082906103ae565b6108d78382546110b3565b90556000546108f99060081c6001600160a01b03165b6001600160a01b031690565b6118a0565b60405190815233907fb92c2305723a5c84fe23da1e9f53750e00b192f70950944b1821f93ce10c814390602090a3005b6040516316163cad60e21b8152600490fd5b60409060031901126101d75760043561095881610358565b9060243561025e81610358565b346101d75760206109a161097836610940565b6001600160a01b0391821660009081526004855260408082209290931681526020919091522090565b54604051908152f35b346101d75760008060031936011261035557604051908060008051602061201f83398151915280546109db81610fda565b808652926020926001928084169081156103265750600114610a07576102cb876102bf8189038261107b565b815293507f46a2803e59a4de4e7a4c574b1243f25977ac4c77d5a1a4a609b5394cebb4a2aa5b838510610a4b575050505081016020016102bf826102cb38806102af565b8054868601840152938201938101610a2d565b346101d75760203660031901126101d757600435610a7b81610358565b60018060a01b031660005260066020526020604060002054604051908152f35b346101d75760003660031901126101d7576020600954604051908152f35b346101d75760403660031901126101d757610ae3600435610ad981610358565b602435903361159e565b602060405160018152f35b346101d75760603660031901126101d757600435610b0b81610358565b60443590610b1882610358565b60008051602061205f833981519152549167ffffffffffffffff60ff8460401c1615931680159081610c2e575b6001149081610c24575b159081610c1b575b50610c095760008051602061205f833981519152805467ffffffffffffffff19166001179055610b909183610bdf575b60243590611408565b610b9657005b60008051602061205f833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b60008051602061205f833981519152805460ff60401b191668010000000000000000179055610b87565b60405163f92ee8a960e01b8152600490fd5b90501538610b57565b303b159150610b4f565b849150610b45565b60ff8116036101d757565b346101d75760c03660031901126101d757600435610c5e81610358565b602435604435606435610c7081610c36565b60843560a4359160009360018060a01b03855460081c169460405190602080830192633644e51560e01b845260048152610ca981611043565b8293839173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28b03610e96575b505083610d1c575b5050509186959391610cf4976102cb99969415610d04575b5050505050506110c0565b6040519081529081906020820190565b610d119530903390611e42565b388080808086610ce9565b827fdbb8cf42e1ecb028be3f3dbc922e1d878b963f411dc388ced501601c60f7c6f7929a999795939b989694505014600014610e3557604051623f675f60e91b815233600482015298888a602481895afa908115610e305780610cf49a84610dea8c956102cb9f8591610e03575b506040516323f2ebc360e21b8582015233602482015230604482015260648101919091526084810192909252600160a483015260ff881660c483015260e4820189905261010482018a90528161012481015b03601f19810183528261107b565b905b81519101828a5af192949699829496989950610cd1565b610e239150843d8611610e29575b610e1b818361107b565b8101906112a0565b38610d8a565b503d610e11565b6112af565b60405163d505accf60e01b818a0152336024820152306044820152606481018890526084810182905260ff831660a482015260c4810184905260e481018590526102cb99610cf4998992829190610e90816101048101610ddc565b90610dec565b83955084925051908a611388fa81518015153d85141690911692908338610cc9565b346101d75760206109a1610ecb36610940565b6001600160a01b0391821660009081526008855260408082209290931681526020919091522090565b346101d75760206109a16103ae610f0a36610940565b9190610606565b346101d75760003660031901126101d7576020600154604051908152f35b346101d75760403660031901126101d757600435610f4c81610358565b602435908115610faa57610f6082336117f6565b60018060a01b0390610f7a83828460005460081c166118a0565b60405192835216907f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb60203392a3005b60405163c0b99cad60e01b8152600490fd5b346101d75760003660031901126101d7576020600554604051908152f35b90600182811c9216801561100a575b6020831014610ff457565b634e487b7160e01b600052602260045260246000fd5b91607f1691610fe9565b634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff811161103e57604052565b611014565b6040810190811067ffffffffffffffff82111761103e57604052565b6080810190811067ffffffffffffffff82111761103e57604052565b90601f8019910116810190811067ffffffffffffffff82111761103e57604052565b634e487b7160e01b600052601160045260246000fd5b9190820180921161049457565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461128e57600290556000546111069060081c6001600160a01b03166108ed565b6040516370a0823160e01b8082523060048301526001600160a01b03946020938484602481848b165afa938415610e3057600094611269575b509061114e9130903390611684565b600054839061116a906108ed9060081c6001600160a01b031681565b604051928352306004840152829060249082905afa908115610e30576111999360009261124c575b50506112bb565b91821561123a576111b98360008051602061203f833981519152546110b3565b60095410611228576111cb8383611787565b60405183815291169033907f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f6290602090a39061122660017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b565b604051632795088960e11b8152600490fd5b60405163070f6eed60e11b8152600490fd5b6112629250803d10610e2957610e1b818361107b565b3880611192565b61114e9291945061128690863d8811610e2957610e1b818361107b565b93909161113f565b604051633ee5aeb560e01b8152600490fd5b908160209103126101d7575190565b6040513d6000823e3d90fd5b9190820391821161049457565b604051906112268261105f565b604051906060820182811067ffffffffffffffff82111761103e57604052565b67ffffffffffffffff811161103e57601f01601f191660200190565b6020818303126101d75780519067ffffffffffffffff82116101d7570181601f820112156101d7578051611344816112f5565b92611352604051948561107b565b818452602082840101116101d75761025e9160208085019101610205565b90611226603260405180947144656661756c74436f6c6c61746572616c5f60701b60208301526113a98151809260208686019101610205565b810103601281018552018361107b565b90611226602360405180946244435f60e81b60208301526113e38151809260208686019101610205565b810103600381018552018361107b565b908160209103126101d7575161025e81610c36565b6040516306fdde0360e01b815260009391926001600160a01b038416918581600481865afa8015610e305761144887916004938391611584575b50611370565b93604051928380926395d89b4160e01b82525afa948515610e30576114886114bc946114826114de986114b7958b91611562575b506113b9565b90611978565b611490611aa5565b60008054610100600160a81b03191660089290921b610100600160a81b0316919091179055565b600955565b60018060a01b03166bffffffffffffffffffffffff60a01b600a541617600a55565b80546004906020906114fd906108ed9060081c6001600160a01b031681565b60405163313ce56760e01b815292839182905afa908115610e30576112269291611533575b5060ff1660ff196000541617600055565b611555915060203d60201161155b575b61154d818361107b565b8101906113f3565b38611522565b503d611543565b61157e91503d808d833e611576818361107b565b810190611311565b3861147c565b61159891503d8085833e611576818361107b565b38611442565b916001600160a01b038084169290831561166b578116938415611652576115c48161063f565b548381106116235761161e9284926116027fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9661160894039161063f565b5561063f565b8054820190556040519081529081906020820190565b0390a3565b60405163391434e360e21b81526001600160a01b03929092166004830152602482015260448101839052606490fd5b60405163ec442f0560e01b815260006004820152602490fd5b604051634b637e8f60e11b815260006004820152602490fd5b6040516323b872dd60e01b60208083019182526001600160a01b0380861660248501528616604484015260648301879052939590949390916116e691906116ce8160848101610ddc565b6000968791519082875af185516001143d1517161590565b6116f2575b5050505050565b6116fb90611b02565b916e22d473030f116ddee9f6b43ac78ba391823b1561178357604051631b63c28b60e11b81526001600160a01b03968716600482015291861660248301529285166044820152919093166064820152918290608490829084905af18015610e305761176a575b808080806116eb565b8061177761177d9261102a565b806101cc565b38611761565b8480fd5b6001600160a01b038116919082156116525760008051602061203f83398151915291825490808201809211610494576117e77fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef936020936000965561063f565b818154019055604051908152a3565b91906001600160a01b03831690811561166b576118128461063f565b549381851061186e578160209161184f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9460009798039161063f565b5560008051602061203f833981519152818154039055604051908152a3565b60405163391434e360e21b81526001600160a01b03919091166004820152602481018590526044810191909152606490fd5b91600080916119159360405195602087019263a9059cbb60e01b845260018060a01b0380931660248901526044880152604487526118dd8761105f565b1694519082865af13d15611970573d906118f6826112f5565b91611904604051938461107b565b82523d6000602084013e5b83611f9b565b805190811515918261194e575b505061192b5750565b604051635274afe760e01b81526001600160a01b03919091166004820152602490fd5b611969925090602080611965938301019101611b28565b1590565b3880611922565b60609061190f565b9190611982611b40565b61198a611b40565b825167ffffffffffffffff811161103e57600080516020611fff833981519152906119be816119b98454610fda565b611b6f565b602080601f8311600114611a07575090806119f59261122696976000926119fc575b50508160011b916000199060031b1c19161790565b9055611c6d565b0151905038806119e0565b90601f19831696611a47600080516020611fff8339815191526000527f2ae08a8e29253f69ac5d979a101956ab8f8d9d7ded63fa7a83b16fc47648eab090565b926000905b898210611a8d57505090839291600194611226989910611a74575b505050811b019055611c6d565b015160001960f88460031b161c19169055388080611a67565b80600185968294968601518155019501930190611a4c565b611aad611b40565b611ab5611b40565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b906001600160a01b0380831615610416578116156103fd576103ae611aff92610606565b55565b6001600160a01b0390818111611b16571690565b60405163c4bd89a960e01b8152600490fd5b908160209103126101d7575180151581036101d75790565b60ff60008051602061205f8339815191525460401c1615611b5d57565b604051631afcd79f60e31b8152600490fd5b601f8111611b7b575050565b600090600080516020611fff8339815191526000527f2ae08a8e29253f69ac5d979a101956ab8f8d9d7ded63fa7a83b16fc47648eab0906020601f850160051c83019410611be4575b601f0160051c01915b828110611bd957505050565b818155600101611bcd565b9092508290611bc4565b601f8111611bfa575050565b60009060008051602061201f8339815191526000527f46a2803e59a4de4e7a4c574b1243f25977ac4c77d5a1a4a609b5394cebb4a2aa906020601f850160051c83019410611c63575b601f0160051c01915b828110611c5857505050565b818155600101611c4c565b9092508290611c43565b90815167ffffffffffffffff811161103e5760008051602061201f83398151915290611ca281611c9d8454610fda565b611bee565b602080601f8311600114611cd957508190611cd59394956000926119fc5750508160011b916000199060031b1c19161790565b9055565b90601f19831695611d1960008051602061201f8339815191526000527f46a2803e59a4de4e7a4c574b1243f25977ac4c77d5a1a4a609b5394cebb4a2aa90565b926000905b888210611d5657505083600195969710611d3d575b505050811b019055565b015160001960f88460031b161c19169055388080611d33565b80600185968294968601518155019501930190611d1e565b519065ffffffffffff821682036101d757565b908160609103126101d7578051611d9781610358565b9161025e6040611da960208501611d6e565b9301611d6e565b929190604051936020850152604084015260ff60f81b166060830152604182526112268261105f565b604061025e94936101009360018060a01b038091168452815181815116602086015281602082015116848601526060848201519165ffffffffffff80931682880152015116608085015260208201511660a0840152015160c08201528160e08201520190610228565b60405163927da10560e01b81526001600160a01b038381166004830152918216602482018190529184166044820152909791966e22d473030f116ddee9f6b43ac78ba39690959294909391906060826064818b5afa918215610e3057600092611f63575b50611eb090611b02565b611eb86112c8565b6001600160a01b03909a168a526001600160a01b031660208a015265ffffffffffff60408a015265ffffffffffff166060890152611ef46112d5565b9788526001600160a01b03166020880152604087015260ff60f81b9060f81b1690611f1e92611db0565b90803b156101d757611f4b9360008094604051968795869485936302b67b5760e41b855260048501611dd9565b03925af1611f565750565b806117776112269261102a565b611eb0919250611f8a9060603d606011611f94575b611f82818361107b565b810190611d81565b9150509190611ea6565b503d611f78565b90611fc25750805115611fb057805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580611ff5575b611fd3575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15611fcb56fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0352c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0452c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a2646970667358221220b0e7181ed1d45fd0577d1d9e454146ba37410a364c8c78de37cdcecc47863cc564736f6c63430008190033