1.45m txs
5m calls
constructor
constructor(address weth)
functions
and
viewfunction and(uint256 offsets, bytes data) view returns (bool)
arbitraryStaticCall
viewfunction arbitraryStaticCall(address target, bytes data) view returns (uint256)
bitInvalidatorForOrder
viewfunction bitInvalidatorForOrder(address maker, uint256 slot) view returns (uint256)
checkPredicate
viewfunction checkPredicate(bytes predicate) view returns (bool)
eip712Domain
viewfunction eip712Domain() view returns (bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions)
epoch
viewfunction epoch(address maker, uint96 series) view returns (uint256)
epochEquals
viewfunction epochEquals(address maker, uint256 series, uint256 makerEpoch) view returns (bool)
eq
viewfunction eq(uint256 value, bytes data) view returns (bool)
gt
viewfunction gt(uint256 value, bytes data) view returns (bool)
hashOrder
viewfunction hashOrder(tuple order) view returns (bytes32)
lt
viewfunction lt(uint256 value, bytes data) view returns (bool)
not
viewfunction not(bytes data) view returns (bool)
or
viewfunction or(uint256 offsets, bytes data) view returns (bool)
owner
viewfunction owner() view returns (address)
paused
viewfunction paused() view returns (bool)
rawRemainingInvalidatorForOrder
viewfunction rawRemainingInvalidatorForOrder(address maker, bytes32 orderHash) view returns (uint256)
remainingInvalidatorForOrder
viewfunction remainingInvalidatorForOrder(address maker, bytes32 orderHash) view returns (uint256)
advanceEpoch
nonpayablefunction advanceEpoch(uint96 series, uint256 amount)
bitsInvalidateForOrder
nonpayablefunction bitsInvalidateForOrder(uint256 makerTraits, uint256 additionalMask)
cancelOrder
nonpayablefunction cancelOrder(uint256 makerTraits, bytes32 orderHash)
cancelOrders
nonpayablefunction cancelOrders(uint256[] makerTraits, bytes32[] orderHashes)
clipperSwap
payablefunction clipperSwap(address clipperExchange, uint256 srcToken, address dstToken, uint256 inputAmount, uint256 outputAmount, uint256 goodUntil, bytes32 r, bytes32 vs) payable returns (uint256 returnAmount)
clipperSwapTo
payablefunction clipperSwapTo(address clipperExchange, address recipient, uint256 srcToken, address dstToken, uint256 inputAmount, uint256 outputAmount, uint256 goodUntil, bytes32 r, bytes32 vs) payable returns (uint256 returnAmount)
curveSwapCallback
nonpayablefunction curveSwapCallback(address, address, address inCoin, uint256 dx, uint256)
ethUnoswap
payablefunction ethUnoswap(uint256 minReturn, uint256 dex) payable returns (uint256 returnAmount)
ethUnoswap2
payablefunction ethUnoswap2(uint256 minReturn, uint256 dex, uint256 dex2) payable returns (uint256 returnAmount)
ethUnoswap3
payablefunction ethUnoswap3(uint256 minReturn, uint256 dex, uint256 dex2, uint256 dex3) payable returns (uint256 returnAmount)
ethUnoswapTo
payablefunction ethUnoswapTo(uint256 to, uint256 minReturn, uint256 dex) payable returns (uint256 returnAmount)
ethUnoswapTo2
payablefunction ethUnoswapTo2(uint256 to, uint256 minReturn, uint256 dex, uint256 dex2) payable returns (uint256 returnAmount)
ethUnoswapTo3
payablefunction ethUnoswapTo3(uint256 to, uint256 minReturn, uint256 dex, uint256 dex2, uint256 dex3) payable returns (uint256 returnAmount)
fillContractOrder
nonpayablefunction fillContractOrder(tuple order, bytes signature, uint256 amount, uint256 takerTraits) returns (uint256, uint256, bytes32)
fillContractOrderArgs
nonpayablefunction fillContractOrderArgs(tuple order, bytes signature, uint256 amount, uint256 takerTraits, bytes args) returns (uint256, uint256, bytes32)
fillOrder
payablefunction fillOrder(tuple order, bytes32 r, bytes32 vs, uint256 amount, uint256 takerTraits) payable returns (uint256, uint256, bytes32)
fillOrderArgs
payablefunction fillOrderArgs(tuple order, bytes32 r, bytes32 vs, uint256 amount, uint256 takerTraits, bytes args) payable returns (uint256, uint256, bytes32)
increaseEpoch
nonpayablefunction increaseEpoch(uint96 series)
pause
nonpayablefunction pause()
permitAndCall
payablefunction permitAndCall(bytes permit, bytes action) payable
renounceOwnership
nonpayablefunction renounceOwnership()
rescueFunds
nonpayablefunction rescueFunds(address token, uint256 amount)
simulate
nonpayablefunction simulate(address target, bytes data)
swap
payablefunction swap(address executor, tuple desc, bytes data) payable returns (uint256 returnAmount, uint256 spentAmount)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
uniswapV3SwapCallback
nonpayablefunction uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes)
unoswap
nonpayablefunction unoswap(uint256 token, uint256 amount, uint256 minReturn, uint256 dex) returns (uint256 returnAmount)
unoswap2
nonpayablefunction unoswap2(uint256 token, uint256 amount, uint256 minReturn, uint256 dex, uint256 dex2) returns (uint256 returnAmount)
unoswap3
nonpayablefunction unoswap3(uint256 token, uint256 amount, uint256 minReturn, uint256 dex, uint256 dex2, uint256 dex3) returns (uint256 returnAmount)
unoswapTo
nonpayablefunction unoswapTo(uint256 to, uint256 token, uint256 amount, uint256 minReturn, uint256 dex) returns (uint256 returnAmount)
unoswapTo2
nonpayablefunction unoswapTo2(uint256 to, uint256 token, uint256 amount, uint256 minReturn, uint256 dex, uint256 dex2) returns (uint256 returnAmount)
unoswapTo3
nonpayablefunction unoswapTo3(uint256 to, uint256 token, uint256 amount, uint256 minReturn, uint256 dex, uint256 dex2, uint256 dex3) returns (uint256 returnAmount)
unpause
nonpayablefunction unpause()
events
BitInvalidatorUpdated
event BitInvalidatorUpdated(address indexed maker, uint256 slotIndex, uint256 slotValue)
EIP712DomainChanged
event EIP712DomainChanged()
EpochIncreased
event EpochIncreased(address indexed maker, uint256 series, uint256 newEpoch)
OrderCancelled
event OrderCancelled(bytes32 orderHash)
OrderFilled
event OrderFilled(bytes32 orderHash, uint256 remainingAmount)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
Paused
event Paused(address account)
Unpaused
event Unpaused(address account)
errors
AdvanceEpochFailed
error AdvanceEpochFailed()
ArbitraryStaticCallFailed
error ArbitraryStaticCallFailed()
BadCurveSwapSelector
error BadCurveSwapSelector()
BadPool
error BadPool()
BadSignature
error BadSignature()
BitInvalidatedOrder
error BitInvalidatedOrder()
EnforcedPause
error EnforcedPause()
EpochManagerAndBitInvalidatorsAreIncompatible
error EpochManagerAndBitInvalidatorsAreIncompatible()
EthDepositRejected
error EthDepositRejected()
ETHTransferFailed
error ETHTransferFailed()
ETHTransferFailed
error ETHTransferFailed()
ExpectedPause
error ExpectedPause()
InsufficientBalance
error InsufficientBalance()
InvalidatedOrder
error InvalidatedOrder()
InvalidMsgValue
error InvalidMsgValue()
InvalidMsgValue
error InvalidMsgValue()
InvalidPermit2Transfer
error InvalidPermit2Transfer()
InvalidShortString
error InvalidShortString()
MakingAmountTooLow
error MakingAmountTooLow()
MismatchArraysLengths
error MismatchArraysLengths()
OrderExpired
error OrderExpired()
OrderIsNotSuitableForMassInvalidation
error OrderIsNotSuitableForMassInvalidation()
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
PartialFillNotAllowed
error PartialFillNotAllowed()
Permit2TransferAmountTooHigh
error Permit2TransferAmountTooHigh()
PredicateIsNotTrue
error PredicateIsNotTrue()
PrivateOrder
error PrivateOrder()
ReentrancyDetected
error ReentrancyDetected()
RemainingInvalidatedOrder
error RemainingInvalidatedOrder()
ReservesCallFailed
error ReservesCallFailed()
ReturnAmountIsNotEnough
error ReturnAmountIsNotEnough(uint256 result, uint256 minReturn)
SafeTransferFailed
error SafeTransferFailed()
SafeTransferFromFailed
error SafeTransferFromFailed()
SimulationResults
error SimulationResults(bool success, bytes res)
StringTooLong
error StringTooLong(string str)
SwapWithZeroAmount
error SwapWithZeroAmount()
TakingAmountExceeded
error TakingAmountExceeded()
TakingAmountTooHigh
error TakingAmountTooHigh()
TransferFromMakerToTakerFailed
error TransferFromMakerToTakerFailed()
TransferFromTakerToMakerFailed
error TransferFromTakerToMakerFailed()
WrongSeriesNonce
error WrongSeriesNonce()
ZeroAddress
error ZeroAddress()
ZeroMinReturn
error ZeroMinReturn()
creation bytecode
0x6101c060405234620000ac576200001f6200001962000164565b620001f3565b604051615ee6908162000806823960805181612c4f015260a05181612c7c015260c05181612c20015260e0518161481d015261010051816147fc0152610120518161193601526101405181611960015261016051815050610180518150506101a051818181613bad01528181613c6501528181613e3f01528181613e7a01528181613f20015261408f0152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b604081019081106001600160401b03821117620000e057604052565b620000b0565b601f909101601f19168101906001600160401b03821190821017620000e057604052565b604051906200011982620000c4565b565b90620001196040519283620000e6565b6001600160a01b03811603620000ac57565b519062000119826200012b565b90816020910312620000ac5762000161906200013d565b90565b620001616200672c803803806200017b816200011b565b9283398101906200014a565b620001916200010a565b9060188252565b620001a26200010a565b9060018252565b620001b362000187565b7f31696e6368204167677265676174696f6e20526f757465720000000000000000602082015290565b620001e662000198565b601b60f91b602082015290565b6200021562000201620001a9565b6200020b620001dc565b9033848062000238565b6001600160a01b0316156200022657565b60405163d92e233d60e01b8152600490fd5b936200025293909290916001600160a01b03861662000258565b6101a052565b90620001199493929193916200026f939162000275565b61018052565b6200011993849384936200028b92919062000291565b61016052565b6200011992620002a3929091620002b6565b6200011960035460ff60a01b1916600355565b91620002c291620002f9565b6001600160a01b03811615620002dd5762000119906200034d565b604051631e4fbdf760e01b81525f6004820152602490fd5b0390fd5b620001199182918291906200030e8162000639565b610120526200031d8262000660565b610140526020815191012060e05260208151910120610100524660a05262000344620006ed565b6080523060c052565b600380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b634e487b7160e01b5f52602260045260245ffd5b90600182811c92168015620003cb575b6020831014620003c557565b62000395565b91607f1691620003b9565b9055565b818110620003e6575050565b5f8155600101620003da565b90601f821162000400575050565b5f805262000119915f80516020620066ec8339815191525b906020601f840160051c830193106200043a575b601f0160051c0190620003da565b90915081906200042c565b90601f821162000453575050565b60015f5262000119915f805160206200670c83398151915262000418565b80519091906001600160401b038111620000e0576200049c81620004965f54620003a9565b620003f2565b602080601f8311600114620004e057508190620004d093945f92620004d4575b50508160011b915f199060031b1c19161790565b5f55565b015190505f80620004bc565b5f8052601f198316949091905f80516020620066ec833981519152925f905b878210620005385750508360019596106200051f575b505050811b015f55565b01515f1960f88460031b161c191690555f808062000515565b80600185968294968601518155019501930190620004ff565b80519091906001600160401b038111620000e0576001906200057f81620005798454620003a9565b62000445565b602080601f8311600114620005b357508190620003d69394955f92620004d45750508160011b915f199060031b1c19161790565b60015f52601f198316959091905f805160206200670c833981519152925f905b8882106200060b5750508385969710620005f2575b505050811b019055565b01515f1960f88460031b161c191690555f8080620005e8565b808785968294968601518155019501930190620005d3565b620001199062000471565b620001199062000551565b60208151105f1462000650576200016190620007be565b6200065b9062000623565b60ff90565b60208151105f1462000677576200016190620007be565b6200065b906200062e565b620006dd6200011994620006d6608094989795620006cf60a086019a620006c8877f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f9052565b6020870152565b6040850152565b6060830152565b6001600160a01b03909216910152565b60e0516200071962000728620007036101005190565b6040519283916020830195309146918862000682565b03601f198101835282620000e6565b51902090565b5f5b838110620007405750505f910152565b818101518382015260200162000730565b620007766020926200076c9280519384809360209181520190565b948591016200072e565b601f01601f19160190565b9060206200016192818152019062000751565b620007a26020825192015190565b9060208110620007b0575090565b5f199060200360031b1b1690565b601f815111620007e6576200016181620007e062000161620001619462000794565b90511790565b60405163305a27a960e01b8152908190620002f590600483016200078156fe60806040526004361015610022575b3615610018575f80fd5b6100206123d8565b005b5f3560e01c806305b1ea031461034157806307ed23791461033c5780630d2c7c16146103375780630f449d7114610332578063143e86a71461032d57806315169dec14610328578063175accdc14610323578063188ac35d1461031e57806319367472146103195780633f4ba83a14610314578063435b97891461030f578063493189f01461030a5780634f38e2b81461030557806356a75868146103005780635816d723146102fb5780635c975abb146102f65780636fe7b0ba146102f1578063715018a6146102ec57806374261145146102e757806378e3214f146102e2578063802b2ef1146102dd57806383800a8e146102d85780638456cb59146102d357806384b0196e146102ce5780638770ba91146102c957806389af926a146102c457806389e7c650146102bf5780638da5cb5b146102ba5780639fda64bd146102b5578063a76dfc3b146102b0578063b68fb020146102ab578063bd61951d146102a6578063bf15fcd8146102a1578063bf7979591461029c578063bfa7514314610297578063c2a4075314610292578063c3cf80431461028d578063c4d652af14610288578063ca4ece2214610283578063cc713a041461027e578063ce3d710a14610279578063d2d374e514610274578063e2c95c821461026f578063e413f48d1461026a578063ea76dddf14610265578063f2fde38b14610260578063f497df751461025b578063f7a7005614610256578063fa461e33146102515763fcea9e4e0361000e57611030565b610ff9565b610fa6565b610f61565b610eff565b610ecb565b610eb1565b610e63565b610e43565b610df0565b610db4565b610d54565b610d36565b610cdd565b610cac565b610c92565b610c78565b610c5e565b610c4a565b610bfe565b610be9565b610bd1565b610b67565b610b4d565b610ac0565b610aa3565b610a77565b610940565b610923565b61090a565b6108dd565b6108b6565b6108a0565b610886565b610866565b610854565b6107de565b610733565b6106eb565b61067c565b610666565b61062f565b6105f1565b6105dc565b610596565b610530565b6104da565b6104a5565b610431565b610360565b604090600319011261035c576004359060243590565b5f80fd5b3461035c5761002061037136610346565b9061104a565b6001600160a01b0381160361035c57565b6004359061039582610377565b565b60e090602319011261035c57602490565b9181601f8401121561035c5782359167ffffffffffffffff831161035c576020838186019501011161035c57565b61012060031982011261035c576103eb610388565b916103f582610397565b91610104359067ffffffffffffffff821161035c57610416916004016103a8565b9091565b9081526040810192916103959160200152565b0152565b61044661043d366103d6565b929190916113c0565b906104566040519283928361041a565b0390f35b6bffffffffffffffffffffffff81160361035c57565b600435906103958261045a565b602435906103958261045a565b604090600319011261035c5761049e610470565b9060243590565b3461035c576100206104b63661048a565b9061147b565b608090600319011261035c5760043590602435906044359060643590565b6104566104f26104e9366104bc565b9291909161151e565b6040519182918290815260200190565b6024359061039582610377565b6044359061039582610377565b604090600319011261035c5761049e610388565b3461035c576104566104f261056361056661054a3661051c565b92906001600160a01b03165f52600460205260405f2090565b90565b612793565b602060031982011261035c576004359067ffffffffffffffff821161035c57610416916004016103a8565b3461035c576104566105b06105aa3661056b565b90611551565b60405191829182901515815260200190565b606090600319011261035c57600435906024359060443590565b6104566104f26105eb366105c2565b9161156d565b6104566104f2610600366104bc565b9291909161159f565b60c090600319011261035c57600435906024359060443590606435906084359060a43590565b3461035c576104566104f261064336610609565b949390939291926115c9565b5f90600319011261035c57565b5f91031261035c57565b3461035c576106743661064f565b6100206115ec565b3461035c576104566104f26106c46106bf6106b26106993661051c565b91906001600160a01b03165f52600560205260405f2090565b905f5260205260405f2090565b6113cc565b6129e2565b60a090600319011261035c576004359060243590604435906064359060843590565b6104566104f26106fa366106c9565b939290926115f4565b90604060031983011261035c57600435916024359067ffffffffffffffff821161035c57610416916004016103a8565b3461035c576104566105b061074736610703565b91611628565b61010090600319011261035c57600490565b61018060031982011261035c576107758161074d565b9167ffffffffffffffff6101043581811161035c5783610797916004016103a8565b93909392610124359261014435926101643591821161035c57610416916004016103a8565b60409061042d61039594969593966107d78360608101999052565b6020830152565b3461035c576104566107fe6107f23661075f565b95949094939193611646565b604093919351938493846107bc565b604060031982011261035c5767ffffffffffffffff9160043583811161035c578261083a916004016103a8565b9390939260243591821161035c57610416916004016103a8565b61085d3661080d565b929190916116f5565b3461035c576108743661064f565b6003546104569060a01c60ff166105b0565b3461035c576104566105b061089a36610703565b91611750565b3461035c576108ae3661064f565b610020611781565b3461035c576104566105b06108ca36610703565b91611789565b6064359061039582610377565b3461035c576100206108ee3661051c565b90611803565b61010060031982011261035c576105639061074d565b3461035c576104566104f261091e366108f4565b61180d565b3461035c576104566104f2610937366104bc565b9291909161181f565b3461035c5761094e3661064f565b610020611840565b5f5b8381106109675750505f910152565b8181015183820152602001610958565b6109996020926109909280519384809360209181520190565b94859101610956565b601f01601f19160190565b0190565b805180835291602001916020809201915f5b8281106109c8575050505090565b90919293826109dd6001928751815260200190565b9501939291016109ba565b93959194610a53610a4b610a6a95610a3d6105639b99610a2c8a610a63987fff00000000000000000000000000000000000000000000000000000000000000169052565b60e060208b015260e08a0190610977565b9088820360408a0152610977565b976060870152565b6001600160a01b03166080850152565b60a0830152565b60c08184039101526109a8565b3461035c57610a853661064f565b610456610a90611931565b93604097959793919351978897886109e8565b3461035c576104566104f2610ab7366106c9565b939290926119ba565b6104566104f2610acf366105c2565b916119c9565b9181601f8401121561035c5782359167ffffffffffffffff831161035c576020808501948460051b01011161035c57565b604060031982011261035c5767ffffffffffffffff9160043583811161035c5782610b3391600401610ad5565b9390939260243591821161035c5761041691600401610ad5565b3461035c57610020610b5e36610b06565b92919091611a1b565b3461035c57610b753661064f565b610456610b8a6003546001600160a01b031690565b604051918291826001600160a01b03909116815260200190565b61018060031982011261035c57610bba9061074d565b906101043590610124359061014435906101643590565b6104566107fe610be036610ba4565b93929092611a8a565b6104566104f2610bf836610346565b90611abc565b3461035c57610020610c0f36610346565b90611ae4565b90604060031983011261035c57610c2a610388565b916024359067ffffffffffffffff821161035c57610416916004016103a8565b3461035c57610c5836610c15565b91611c27565b3461035c576104566104f2610c7236610c15565b91611c7c565b3461035c576104566105b0610c8c3661056b565b90611cba565b3461035c576104566105b0610ca636610703565b91611cd4565b3461035c576104566104f26105636106bf6106b26106993661051c565b602090600319011261035c57610563610470565b3461035c57610020610cee36610cc9565b611d33565b61012090600319011261035c57610d08610388565b90610d11610502565b9060443590610d1e6108d0565b906084359060a4359060c4359060e435906101043590565b6104566104f2610d4536610cf3565b97969096959195949294611d3c565b3461035c576104566105b0610d6836610703565b91611fae565b9061016060031983011261035c57610d858261074d565b91610104359067ffffffffffffffff821161035c57610da6916004016103a8565b909161012435906101443590565b3461035c576104566107fe610dc836610d6e565b93929092611fcc565b606090600319011261035c57610de5610388565b906024359060443590565b3461035c576104566105b0610e0436610dd1565b91611ff6565b61010090600319011261035c57610e1f610388565b9060243590610e2c61050f565b90606435906084359060a4359060c4359060e43590565b6104566104f2610e5236610e0a565b969590959491949392933390611d3c565b3461035c576104566104f2610e77366106c9565b9392909261201e565b60a090600319011261035c57610e94610388565b90610e9d610502565b90610ea661050f565b906064359060843590565b3461035c57610020610ec236610e80565b9392909261204a565b3461035c576104566104f2610edf36610609565b94939093929192612056565b602090600319011261035c57610563610388565b3461035c57610020610f1036610eeb565b6120c3565b906101a060031983011261035c57610f2c8261074d565b916101043591610124359161014435916101643591610184359067ffffffffffffffff821161035c57610416916004016103a8565b6104566107fe610f7036610f15565b959490949391936120cc565b60e090600319011261035c57600435906024359060443590606435906084359060a4359060c43590565b3461035c576104566104f2610fba36610f7c565b959490949391936120ed565b606060031982011261035c5760043591602435916044359067ffffffffffffffff821161035c57610416916004016103a8565b3461035c5761002061100a36610fc6565b92919091612390565b604090600319011261035c57611027610388565b9061056361047d565b3461035c576104566104f261104436611013565b9061239d565b9061105b611057836123e0565b1590565b6110d2576110cd6110b67fcda0f7e73d07bdb14b141f2cf4745926629a1b63e7c6a3dd8a80232cb459a850926110a5610563336001600160a01b03165f52600460205260405f2090565b64ffffffffff8660781c169061243b565b60405191829163ffffffff339660801c168361041a565b0390a2565b60046040517f86bffaca000000000000000000000000000000000000000000000000000000008152fd5b9061041693929161110b612465565b6113b4565b3561056381610377565b634e487b7160e01b5f52601160045260245ffd5b5f1981019190821161113c57565b61111a565b9190820391821161113c57565b8181029291811591840414171561113c57565b634e487b7160e01b5f52601260045260245ffd5b811561117f570490565b611161565b9093919260a085013594851561137e5761119d81611110565b926111aa60208301611110565b926111b48561249e565b60c084013597909190600289161561135c575f8315611357575060808501355b34111561132d576111f4925b156112fc575b608085013580943390612517565b968794600183981615155f146112c55761120e308261257b565b600181116112a3575b5050611223828661114e565b611230610563898461114e565b1161126e57505090606061039593925b016001600160a01b0361125282611110565b1661125f575033906125f2565b61126890611110565b906125f2565b849161127d886112829361114e565b611175565b9061129f604051928392630325276360e11b84526004840161041a565b0390fd5b6112be9198505f19016112b68185611141565b9833906125f2565b5f80611217565b50919293829150106112df57506103959160608692611240565b8561129f604051928392630325276360e11b84526004840161041a565b61132861130b60408701611110565b60048b161515906001600160a01b0360808901359116338b6124ff565b6111e6565b60046040517f1841b4e1000000000000000000000000000000000000000000000000000000008152fd5b6111d4565b5f8315611379575060808501355b340361132d576111f4926111e0565b61136a565b60046040517f0262dde4000000000000000000000000000000000000000000000000000000008152fd5b90610416939291611184565b906104169392916113a8565b906104169392916110fc565b5490565b91602061039592949361042d8160408101976bffffffffffffffffffffffff169052565b7f099133aefc2c2d1e56f8ef3622ec8e80979a0713fc9c4e1497740efcf80993966110cd61146a61146d73ffffffffffffffffffffffffffffffffffffffff198560a01b1633176114596114536106bf835f52600260205260405f2090565b60010190565b9283915f52600260205260405f2090565b55565b6040519182913395836113d0565b9080158015611514575b6114ea576110cd61146a61146d7f099133aefc2c2d1e56f8ef3622ec8e80979a0713fc9c4e1497740efcf80993969361145973ffffffffffffffffffffffffffffffffffffffff198760a01b163317916109a46106bf845f52600260205260405f2090565b60046040517f555fbbbf000000000000000000000000000000000000000000000000000000008152fd5b5060ff8111611485565b90610563939291600160fb1b831615611543575b6001600160a01b03349116306126dd565b61154c34612684565b611532565b9061155c91306127aa565b81611565575090565b600191501490565b906105639291600160fb1b831615611591575b6001600160a01b03349116306127ce565b61159a34612684565b611580565b90610563939291600160fb1b8216156115bb575b34333061285e565b6115c434612684565b6115b3565b9061056395949392913333612875565b6115e1612929565b6103956103956129da565b6103956115d9565b9061056394939291600160fb1b83161561161a575b6001600160a01b033491163061285e565b61162334612684565b611609565b9161163391306127aa565b8192919261164057505090565b11919050565b9394611667966116599194929487612a16565b989394929591969097612ab9565b9192909190565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000090358181169392601481106116a357505050565b60140360031b82901b16169150565b909291928360141161035c57831161035c57601401916013190190565b90929192831161035c579190565b9093929384831161035c57841161035c578101920390565b926117335f939461172d61041686958061172761171b611715838861166e565b60601c90565b6001600160a01b031690565b946116b2565b91612b4e565b508060405194853783305af43d5f833e1561174c573d90f35b3d90fd5b9161175b91306127aa565b8192919261176857505090565b14919050565b611776612929565b610395610395612b5d565b61039561176e565b929091925f5b63ffffffff82169081156117e0576117af610416836117b69389896116dd565b90306127aa565b816117d5575b506117cb579060201c9061178f565b5050915050600190565b60019150145f6117bc565b5050509150505f90565b90610395916117f7612929565b906103959133906125f2565b90610395916117ea565b61056390611819612c16565b90612ca2565b9061056393929133336127e3565b611835612929565b610395610395612d94565b61039561182d565b634e487b7160e01b5f52604160045260245ffd5b67ffffffffffffffff811161187057604052565b611848565b6020810190811067ffffffffffffffff82111761187057604052565b6040810190811067ffffffffffffffff82111761187057604052565b90601f8019910116810190811067ffffffffffffffff82111761187057604052565b6040519061039582611875565b6040519061039582611891565b9061039560405192836118ad565b6118ff6118cf565b905f8252565b5f368137565b50610395611905565b602090369037565b6119246118f7565b906103956020830161190b565b61195a7f00000000000000000000000000000000000000000000000000000000000000006149d6565b906119847f00000000000000000000000000000000000000000000000000000000000000006149f0565b9061198d61191c565b7f0f00000000000000000000000000000000000000000000000000000000000000939291469130915f9190565b906105639493929133336126f3565b906105639291600160fb1b8216156119e4575b3433306126dd565b6119ed34612684565b6119dc565b634e487b7160e01b5f52603260045260245ffd5b9190811015611a165760051b0190565b6119f2565b9290818103611a60575f5b818110611a34575050505050565b80611a5a611a4c611a48600194868a611a06565b3590565b610c0f611a4884888a611a06565b01611a26565b60046040517fd97cd9d8000000000000000000000000000000000000000000000000000000008152fd5b9261166794919293611a9a5f8091565b939092611ab2611aac5f805b97909691565b96909591565b9790963394612d9c565b9061056391600160fb1b821615611ad6575b3433306127ce565b611adf34612684565b611ace565b90611aee826123e0565b15611b4a57507fcda0f7e73d07bdb14b141f2cf4745926629a1b63e7c6a3dd8a80232cb459a8506110cd6110b6611b39610563336001600160a01b03165f52600460205260405f2090565b64ffffffffff8560781c1690612400565b7f5152abf959f6564662358c2e52b702259b78bac5ee7842a0f01937e670efcc7d9150806104f2611b93611b99936106b2336001600160a01b03165f52600560205260405f2090565b5f199055565b0390a1565b90825f939282370152565b81836109a492949394611b9e565b67ffffffffffffffff811161187057601f01601f191660200190565b90611be5611be083611bb7565b6118e9565b918252565b3d15611c0357611bf93d611bd3565b903d5f602084013e565b606090565b80611c1a604092610563959415159052565b8160208201520190610977565b5f928392611c3a60405180938193611ba9565b03915af4611c46611bea565b9061129f6040519283927f1934afc800000000000000000000000000000000000000000000000000000000845260048401611c08565b90611c8792916127aa565b9015611c905790565b60046040517f1f1b8f61000000000000000000000000000000000000000000000000000000008152fd5b90611cc591306127aa565b81611cce575090565b90501590565b929091925f5b63ffffffff8216908115611d28576117af61041683611cfa9389896116dd565b9015908115611d1c575b50611d13579060201c90611cda565b50509150505f90565b6001915014155f611d04565b505050915050600190565b610395906113f4565b906105639897969594939291611d50612465565b9295969097919394976001600160a01b039485811690811590815f14611f8d575087340361132d575b15611e235750926001600160ff1b035f97949361014996938998956040519b8c987f27a9b424000000000000000000000000000000000000000000000000000000008a5260048a01528760248a01528d60448a0152606489015260848801528160ff1c601b0160a488015260c48701521660e4850152610120610104850152600561012485015264062929c86960db1b610144850152165af115611e1b575090565b3d5f823e3d90fd5b969091929394959789878316155f14611ee857945f98959489989461014998946001600160ff1b03948b986040519e8f9b7f4cb6864c000000000000000000000000000000000000000000000000000000008d5260048d015260248c015260448b015260648a015215600114611ede57503060848801525b8160ff1c601b0160a488015260c48701521660e4850152610120610104850152600561012485015264062929c86960db1b610144850152165af115611e1b575090565b6084880152611e9b565b505f97948897939488956001600160ff1b039361016999959c6040519d8e9a7f2b651a6c000000000000000000000000000000000000000000000000000000008c5260048c015260248b015260448a01528d60648a0152608489015260a48801528160ff1c601b0160c488015260e487015216610104850152610140610124850152600561014485015264062929c86960db1b610164850152165af115611e1b575090565b3461132d57600160ff1b611fa9911615158989891633866124ff565b611d79565b91611fb991306127aa565b81929192611fc657505090565b10919050565b9261166794919293611fdc5f8091565b939092611fec611aac5f80611aa6565b9790963394612ab9565b6106bf906001600160a01b0361201a9360a01b9116175f52600260205260405f2090565b1490565b906001600160a01b036105639594939216336127e3565b90610395916001600160a01b03339116612f44565b50506103959250612035565b906001600160a01b03610563969594939216336126f3565b6103959061207a612929565b6001600160a01b038116156120925761039590612bc1565b6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602490fd5b6103959061206e565b9394611667966120df9194929487612a16565b989394929591969097612d9c565b906001600160a01b036105639796959493921633612875565b6040513d5f823e3d90fd5b60446020925f80935af1156121435760015f5114601f3d11163d15171561213457565b633c9fd93960e21b5f5260045ffd5b612106565b60646020925f80935af1156121435760015f5114601f3d11163d15171561213457565b9060405160158101907f0dfe1681d21220a7ddca3f43a9059cbb23b872dd36c785160000000000000000918282525f851394856001146123775750603582016020816004808601335afa15612143575193905b6084359530871460011461235a5760011461234357602081600485335afa15612143575b602060558401600460088601335afa15612143577fff1f98431c8ad98523631ae4a59f267346ea31f984000000000000000000000083526060812090527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b546035830152336001600160a01b0360558420161861231b5760a4358060011461229a5715612270575b5050505050565b612290946010938352601483015233603483015260548201520190612148565b5f80808080612269565b5091819491526018840152336038840152605883015260788201525f80608460146e22d473030f116ddee9f6b43ac78ba3940182855af19081612310575b50156122e8575f80808080612269565b7fc3f9d332000000000000000000000000000000000000000000000000000000005f5260045ffd5b90503b15155f6122d8565b7fb2c02722000000000000000000000000000000000000000000000000000000005f5260045ffd5b6020603584016004808601335afa6121e257612106565b50506103959450600c925033601083015260308201520190612111565b9350602081600484335afa1561214357805193906121be565b909150610395925061216b565b6106bf906001600160a01b0373ffffffffffffffffffffffffffffffffffffffff196105639460a01b169116175f52600260205260405f2090565b610395612f52565b600160ff1b811615908115916123f4575090565b600160fe1b9150161590565b6103959092919261146a600160ff8660081c96161b61242a6106bf8785905f5260205260405f2090565b17948592905f5260205260405f2090565b61146a610395929493600160ff8760081c97161b1761242a6106bf8785905f5260205260405f2090565b60035460a01c60ff1661247457565b60046040517fd93c0665000000000000000000000000000000000000000000000000000000008152fd5b6001600160a01b031680159081156124b4575090565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee91501490565b92156124de5761039592613083565b61039592612f5a565b92156124f65761039592613112565b61039592612fd9565b931561250e5761039593613180565b6103959361304a565b90602093945f93816040519788947f4b64e49200000000000000000000000000000000000000000000000000000000865260048601526024850137602482840101526044019134905af115611e1b57505f5190565b9081602091031261035c575190565b6125848161249e565b1561258e57503190565b6040516370a0823160e01b81526001600160a01b0392831660048201529160209183916024918391165afa908115612143575f916125ca575090565b610563915060203d81116125eb575b6125e381836118ad565b81019061256c565b503d6125d9565b826125fc57505050565b6126058161249e565b156126705750814710612646575f8080936001600160a01b03829416611388f161262d611bea565b501561263557565b600460405163b12d13eb60e01b8152fd5b60046040517ff4d678b8000000000000000000000000000000000000000000000000000000008152fd5b6001600160a01b0361039593921690612f44565b8061268c5750565b5f6004818093630d0e30db60e41b825273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af11561210657565b816126c3575050565b60045f80938193630d0e30db60e41b83525af11561210657565b9061056395949392916126ee612465565b61270a565b90610563969594939291612705612465565b61275b565b936127419391949695929661273b61272185613207565b92600160fc1b86161515998a5f1461275357843094613225565b9161342a565b926127495750565b61039590836137d6565b848994613225565b61273b6127419593989794929661277186613207565b93600160fc1b871615159a8b5f1461278b5785309561331c565b858a9561331c565b6106bf906105639260081c5f5260205260405f2090565b915f906020928294826040519283375afa60203d141691826127c857565b5f519150565b90610563949392916127de612465565b6127f9565b9061056395949392916127f4612465565b61282e565b909493929190600160fc1b8416156128235791610395939161281c9330906135eb565b92836137d6565b9461056394956135eb565b90959493929190600160fc1b851615612853579161281c9391610395959330906136c4565b9561056395966136c4565b90610563969594939291612870612465565b61288d565b9061056397969594939291612888612465565b6128db565b61273b6128cd92966127419699989594996128a782613207565b906128b188613207565b958691600160fc1b8a1615159d8e5f146128d357843098613225565b91613514565b848d98613225565b90959486929598979493986128ef81613207565b80926128fa88613207565b958691600160fc1b8a1615159d8e5f149b61273b976128cd946127419e6129235750309961331c565b9961331c565b600354336001600160a01b039091160361293f57565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602490fd5b612978613812565b6103956129a86003547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600355565b6040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa908060208101611b99565b610395612970565b80156129ec571990565b60046040517faa3eef95000000000000000000000000000000000000000000000000000000008152fd5b90929091600160fb1b831615612aaf576104168180612a3b611715612a41958961166e565b966116b2565b919091925b62ffffff60e082901c81168015612aa0576104168682612a6d610416612a7695848b6116cf565b999099986116dd565b919091925b60c81c168015612a925761041692610416926116cf565b5050506104166104165f8091565b509390925f8095909594612a7b565b9192903393612a46565b979593919896949290612ad3612acd612c16565b8a612ca2565b809a612adf828c613853565b9260a08c01358414612afc575b5050612af79961451f565b919092565b9061105791612b18936001600160a01b0360208f0135166138e2565b612b2457895f80612aec565b60046040517f5cd5d233000000000000000000000000000000000000000000000000000000008152fd5b90610563929130903390614531565b5f6001600160a01b03612b786003546001600160a01b031690565b612b9a60035473ffffffffffffffffffffffffffffffffffffffff1916600355565b167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3565b600380546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff19821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016301480612c79575b15612c71577f000000000000000000000000000000000000000000000000000000000000000090565b6105636147e9565b507f00000000000000000000000000000000000000000000000000000000000000004614612c48565b9061012061056392610100604051917f3af21ec5a20011b88d3b7b4ed7c806cef05a5980cf34974bcd53566a131f7e4c835260208301372090604291604051917f19010000000000000000000000000000000000000000000000000000000000008352600283015260228201522090565b612d1b612465565b610395612d626003547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017600355565b6040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258908060208101611b99565b610395612d13565b979593919896949290612db0612acd612c16565b809a612dbc828c613853565b9260a08c01358414612dd3575050612af79961451f565b60208c01356001600160a01b031692918315918215612ee0575b50509050612b24578a907f2000000000000000000000000000000000000000000000000000000000000000851615612e26575b80612aec565b612e308888614a81565b6014811015612e41575b5050612e20565b90612e5d610416838061172761171b611715612e66988861166e565b91843091614531565b50612e7761105760e08d01356123e0565b612e83575b8080612e3a565b6110576106bf612eab936106b2611057946001600160a01b03165f52600560205260405f2090565b612eb657895f612e7c565b60046040517fc5f2be51000000000000000000000000000000000000000000000000000000008152fd5b61171b9250612eee93614a0a565b8114158b905f80612ded565b612f079161105791614a8b565b612f0d57565b60046040517ffb7f5079000000000000000000000000000000000000000000000000000000008152fd5b612f079161105791614ad2565b9161105791612f0793614b31565b610395614b5f565b6064906020935f93604051926323b872dd60e01b845260048401526024830152604482015282805af180612fba575b15612f9057565b60046040517ff4059071000000000000000000000000000000000000000000000000000000008152fd5b503d15612fd05760015f5114601f3d1116612f89565b5f3b1515612f89565b91906020915f91604051946323b872dd60e01b8652600486015260248501526044840152606473c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29382855af19081613028575b5015612f9057565b90503d15613042575060015f5114601f3d11165b5f613020565b3b151561303c565b92602092916064915f93604051926323b872dd60e01b845260048401526024830152604482015282855af19081613028575015612f9057565b916001600160a01b0381116130e8575f9160405193631b63c28b60e11b85526004850152602484015260448301528060648301528060846e22d473030f116ddee9f6b43ac78ba39382855af190816130dd575015612f9057565b90503b15155f613020565b60046040517f8112e119000000000000000000000000000000000000000000000000000000008152fd5b916001600160a01b0381116130e8575f9160405193631b63c28b60e11b855260048501526024840152604483015273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260648301528060846e22d473030f116ddee9f6b43ac78ba39382855af190816130dd575015612f9057565b90926001600160a01b0381116130e8575f9260405194631b63c28b60e11b865260048601526024850152604484015260648301528060846e22d473030f116ddee9f6b43ac78ba39382855af190816130dd575015612f9057565b634e487b7160e01b5f52602160045260245ffd5b600311156131f857565b6131da565b90610395826131ee565b61321b6132168260fd1c6131fd565b6131fd565b1561171b57503090565b939291905f946132378460fd1c6131fd565b6001613242826131fd565b0361325357506105639495506155af565b61325c816131fd565b6132b95750610563949550826001600160a01b038092163081145f1461328d5750613288918516612f37565b6153e1565b9050331461329c575b506153e1565b6132b39083600160fa1b86161515918616336124e7565b5f613296565b6132c46002916131fd565b146132d0575b50505050565b6132f19495506001600160a01b033391161480613314575b6132fb57614cf1565b905f8080806132ca565b61330f600160fa1b841615158330336124e7565b614cf1565b5034156132e8565b5f9594939261332e60fd86901c6131fd565b6001613339826131fd565b0361334b5750506105639495506155af565b613354816131fd565b6133b8575061056395965083906001600160a01b038093163081145f146133845750826132889387169116612f44565b9190913314613396575b5050506153e1565b6133b092600160fa1b8716151592818816913391166124ff565b5f808361338e565b6133c36002916131fd565b146133cf575050505050565b6133f7959650836001600160a01b0392833391161480613422575b613402575b505050614cf1565b905f80808080612269565b61341a92600160fa1b871615159230913391166124ff565b5f80836133ef565b5034156133ea565b94939291905f9561343d8560fd1c6131fd565b6001613448826131fd565b03613459575061056395965061565c565b613462816131fd565b6134bf5750610563959650826001600160a01b038092163081145f14613493575061348e918616612efa565b6154cb565b905033146134a2575b506154cb565b6134b99083600160fa1b87161515918716336124cf565b5f61349c565b6134ca6002916131fd565b146134d6575050505050565b6133f79596506001600160a01b03339116148061350c575b156150a257613507600160fa1b851615158330336124cf565b6150a2565b5034156134ee565b939291905f946135268460fd1c6131fd565b6001613531826131fd565b0361354257506105639495506155af565b61354b816131fd565b61359c5750610563949550826001600160a01b038092163081145f146135775750613288918516612efa565b9050331461358557506153e1565b6132b39083600160fa1b86161515918616336124cf565b6135a76002916131fd565b146135b25750505050565b6132f19495506001600160a01b0333911614806135e3575b15614cf15761330f600160fa1b841615158330336124cf565b5034156135ca565b94939291905f956135fe8560fd1c6131fd565b6001613609826131fd565b0361361a575061056395965061565c565b613623816131fd565b6136745750610563959650826001600160a01b038092163081145f1461364f575061348e918616612f37565b9050331461365d57506154cb565b6134b99083600160fa1b87161515918716336124e7565b61367f6002916131fd565b1461368b575050505050565b6133f79596506001600160a01b0333911614806136bc575b156150a257613507600160fa1b851615158330336124e7565b5034156136a3565b5f96959493926136d760fd87901c6131fd565b60016136e2826131fd565b036136f457505061056395965061565c565b6136fd816131fd565b613761575061056396975083906001600160a01b038093163081145f1461372d57508261348e9388169116612f44565b919091331461373f575b5050506154cb565b61375992600160fa1b8816151592818916913391166124ff565b5f8083613737565b61376c6002916131fd565b1461377a575b505050505050565b6137a2969750836001600160a01b03928333911614806137ce575b6137ae575b5050506150a2565b905f8080808080613772565b6137c692600160fa1b881615159230913391166124ff565b5f808361379a565b503415613795565b906137e082615715565b306001600160a01b038216036137f4575050565b5f8080938193611388f11561210657565b816137e091939293615746565b6003546138239060a01c60ff161590565b61382957565b60046040517f8dfc202b000000000000000000000000000000000000000000000000000000008152fd5b61386060e08201356123e0565b1561389f5760a091500135905b811561387557565b60046040517ff71fbda2000000000000000000000000000000000000000000000000000000008152fd5b60a06138d36106bf6138dc946106b26001600160a01b036020870135166001600160a01b03165f52600560205260405f2090565b91013590615765565b9061386d565b5f9060209293959495829680604051927f1626ba7e00000000000000000000000000000000000000000000000000000000978885526004850152604060248501528160448501526064840137606401915afa61393b5750565b5f51143d602014169150565b9061041699989796959493929161395c612465565b61450d565b60e080610395936139728185359052565b6139826020820160208601359052565b6139926040820160408601359052565b6139a26060820160608601359052565b6139b26080820160808601359052565b6139c260a0820160a08601359052565b6139d260c0820160c08601359052565b019101359052565b818352916109999082906020018094611b9e565b95613a44613a5c96613a33613a2a6105639e9c989d9b96613a54988c613a4c9861010082613a206101e0948594613961565b01528d01916139da565b9c6101208b0152565b6001600160a01b0316610140890152565b610160870152565b610180850152565b6101a0830152565b6101c08185039101526139da565b93919694999790959298613a7f8685876157a0565b90156145065750613a976110573360e0880135615885565b6144dc57613aa860e08601356158b0565b6144b257600160fa1b60e086013516614417575b856143bd575b600160ff1b8316156142e357613ad8888b615a7f565b9a8b613ae8898b838b8a8c6159f1565b809c76ffffffffffffffffffffffffffffffffffffffffffffff8716928361428d575b505050505b600160ff1b60e08701351615158061427f575b614255578a8c021561422b57613b3c60e08701356123e0565b156141f357613b84613b6f6105636001600160a01b0360208a0135166001600160a01b03165f52600460205260405f2090565b64ffffffffff60e089013560781c1690615a8c565b600160fc1b60e08701351661412a575b6001600160a01b036060870135168c6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168214918261411a575b8215614112578830925b8b8a60e08401357f010000000000000000000000000000000000000000000000000000000000000016156140b957909150613c1b9250615b02565b9050613f4457613c3b918f916001600160a01b0360208c01351690613180565b614088575b5060138111613ff2575b50506001600160a01b03608084013516906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016821490818092613fe9575b15613ecc5750505086341061132d57863411613ea4575b8760e0830135600160f71b1615613e3857505f8080808a613cc787615b5f565b5af1613cd1611bea565b50156126355787925b600160fb1b60e084013516613d28575b505050613d18907ffec331350fce78ba658e082a71da20ac9f8d798a99b3c79681c8440cbfe77e0793611141565b90611b996040519283928361041a565b90919250613d368183615b8e565b909160208501356001600160a01b0316838360138111613e04575b50506001600160a01b031691823b1561035c575f94613da9869289968b8f8f906040519c8d9b8c9a8b997f462ebde2000000000000000000000000000000000000000000000000000000008b52339360048c016139ee565b03925af18015612143577ffec331350fce78ba658e082a71da20ac9f8d798a99b3c79681c8440cbfe77e0793613d18928892613deb575b819550829350613cea565b80613df8613dfe9261185c565b8061065c565b5f613de0565b6001600160a01b039550819450613e2d925080613e27611715826104169561166e565b956116b2565b93909392905f613d51565b92613e63887f00000000000000000000000000000000000000000000000000000000000000006126ba565b613e9f88613e7085615b5f565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016612f44565b613cda565b5f8080808a3403335af1613eb6611bea565b50613ca757600460405163b12d13eb60e01b8152fd5b9491943461132d5781613fd5575b8115613fc157600160fc1b30915b1615613f6e57613ef88385615b84565b9050613f445789613f0c918c973390613180565b15613cda57613e9f613f1d84615b5f565b897f0000000000000000000000000000000000000000000000000000000000000000613805565b60046040517f2aefd060000000000000000000000000000000000000000000000000000000008152fd5b61105790613f8c92968b613f828688615b84565b9390923390615b0c565b613f97578893613f0c565b60046040517f478a5205000000000000000000000000000000000000000000000000000000008152fd5b600160fc1b613fcf86615b5f565b91613ee8565b60e0850135600160f71b1615159150613eda565b50341515613c90565b808061400a61171b61171b611715614010968861166e565b936116b2565b823b1561035c578592875f878f8f9583978f8f98614060946040519c8d9b8c9a8b997fadf38ba1000000000000000000000000000000000000000000000000000000008b52339360048c016139ee565b03925af1801561214357614075575b80613c4a565b80613df86140829261185c565b5f61406f565b6140b3908c7f0000000000000000000000000000000000000000000000000000000000000000613805565b5f613c40565b94611057946001600160a01b036140d760209695946140e399615b02565b96909501351690615b0c565b15613c3b5760046040517f70a03f48000000000000000000000000000000000000000000000000000000008152fd5b888492613be0565b600160fe1b871615159250613bd6565b6141348786615af8565b6001600160a01b0390602089013582168382601381116141cf575b50508281163b1561035c578f8f5f948f8f958f94908f998f938a966141a6946040519d8e9c8d9b8c997f0986bdd5000000000000000000000000000000000000000000000000000000008b52339360048c016139ee565b0393165af18015612143576141bc575b50613b94565b80613df86141c99261185c565b5f6141b6565b8195506141ea93506104169250613e2761171582809461166e565b90925f8061414f565b6142268c8a031961146a8a6106b26001600160a01b0360208c0135166001600160a01b03165f52600560205260405f2090565b613b84565b60046040517ffba5a276000000000000000000000000000000000000000000000000000000008152fd5b60046040517f8ef0017c000000000000000000000000000000000000000000000000000000008152fd5b5060a08601358c1415613b23565b8181036142b6575050116142a5575b5f8b818e613b0b565b600460405163fb8ae12960e01b8152fd5b6142c6610563926142cc9461114e565b9361114e565b101561429c57600460405163fb8ae12960e01b8152fd5b899a6142f3888a8d8a898b615948565b9b898d11614376575b8c76ffffffffffffffffffffffffffffffffffffffffffffff86169182614326575b505050613b10565b8d81810361434f5750501061433e575b5f8c8161431e565b600460405163240f51c960e11b8152fd5b6142c66105639261435f9461114e565b111561433657600460405163240f51c960e11b8152fd5b9a509a50879a61438a888a808a898b6159f1565b9a808c11156142fc5760046040517f7f902a93000000000000000000000000000000000000000000000000000000008152fd5b6143c786856158ce565b90816143d5575b5050613ac2565b6143e29161105791611551565b6143ed575f806143ce565b60046040517fb6629c02000000000000000000000000000000000000000000000000000000008152fd5b61442460e08601356123e0565b6144885761445961105760e0870135607881901c64ffffffffff9081169160a01c1660208901356001600160a01b0316611ff6565b15613abc5760046040517fe3e8b052000000000000000000000000000000000000000000000000000000008152fd5b60046040517f9e744e25000000000000000000000000000000000000000000000000000000008152fd5b60046040517fc56873ba000000000000000000000000000000000000000000000000000000008152fd5b60046040517fd4dfdafe000000000000000000000000000000000000000000000000000000008152fd5b5f5260045ffd5b90610416999897969594939291613a6a565b90610416999897969594939291613947565b6040519492916064841461471e57836048146146ac578360e01461468857836101001461466257836060146145c35750505061016014614593576004827f68275857000000000000000000000000000000000000000000000000000000008152fd5b610164826101605f94936302b67b5760e41b8695526004830137826e22d473030f116ddee9f6b43ac78ba35af190565b61016493505f95929486956020936040936302b67b5760e41b8752600487015260248601526014826050870137861965ffffffffffff9181601485013560e01c0183166064880152601884013560e01c608488015260a4870152601c83013560e01c011660c485015261010060e4850152816101048501528280820161012486013701610144830137826e22d473030f116ddee9f6b43ac78ba35af190565b5061010492508491505f949061010086956323f2ebc360e21b87945260048501375af190565b5060e492508491505f949060e0869563d505accf60e01b87945260048501375af190565b6101049350906001600160ff1b035f969395879687946323f2ebc360e21b87526004870152602486015260206008602883013592803560e01c60448901528619600482013560e01c016064890152600160848901528360ff1c601b0160a48901520160c48701371660e48401525af190565b60e49350906001600160ff1b035f9693958796879463d505accf60e01b87526004870152602486015260206024604483013592828160448a013786198382013560e01c0160648901528360ff1c601b0160848901520160a48701371660c48401525af190565b6147da610395946147d36080949897956147cc60a086019a6147c5877f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f9052565b6020870152565b6040850152565b6060830152565b01906001600160a01b03169052565b60405160208101906148508161484230467f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000088614784565b03601f1981018352826118ad565b51902090565b634e487b7160e01b5f52602260045260245ffd5b90600182811c92168015614889575b602083101461488457565b614856565b91607f1691614879565b905f915f546148ae6148a48261486a565b8084529260200190565b9060019081811690811561491657506001146148c957505050565b5f8052929350907f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563925f935b828510614903575050500190565b80548585015260209094019381016148f5565b60ff19168352505090151560051b019150565b905f91600180549061494761493d8361486a565b8085529360200190565b91818116908115614916575060011461495f57505050565b60015f52929350907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6925f935b82851061499a575050500190565b805485850152602090940193810161498c565b60405190610395826149be81614893565b03836118ad565b60405190610395826149be81614929565b60ff81146149e75761056390615bbc565b506105636149ad565b60ff8114614a015761056390615bbc565b506105636149c5565b9092915f936001600160ff1b038216917f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a18310614a475750505050565b6020949550915f939160809360405193845260ff1c601b01868401526040830152606082015282805260015afa505f51905f8080806132ca565b9061041691615bd9565b60445f916020936040519163a9059cbb60e01b83526004830152602482015282805af19081614ab657565b90503d15614acb5760015f5114601f3d111690565b5f3b151590565b91906040519263a9059cbb60e01b84526004840152602483015260205f604473c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29482865af19182614b145750565b9091503d15614b2b575060015f5114601f3d111690565b3b151590565b929160446020925f926040519163a9059cbb60e01b83526004830152602482015282865af19182614b145750565b323314614b6857565b60046040517f1b10b0f9000000000000000000000000000000000000000000000000000000008152fd5b15612143573d90565b5f602481602093614bba956370a0823160e01b83526004525afa614b92565b1561035c575f5190565b614bd084848484614c22565b15614bdb5750505050565b614be6848383614c53565b15614c1357918391614bf793614c22565b15614c04578080806132ca565b80633e3f8f7360e01b60049252fd5b600484633e3f8f7360e01b8152fd5b925f602094819460449463095ea7b360e01b8552600485015260248401525af160015f5114601f3d11163d15171690565b6020925f604492819463095ea7b360e01b845260048401528160248401525af160015f5114601f3d11163d15171690565b925f602094819460449463a9059cbb60e01b8552600485015260248401525af160015f5114601f3d11163d15171690565b5f916024916020947f87cb4f5723746eb8c6610657b739953eb9947eb0000000000000000000000000855260048301525afa15612143575f5190565b92916001600160a01b038116938160f21c946001808716818560f91c1691808660f01c16615072575b808660f11c1661503e575b60ff92614d3d848860d81c16858960d01c1687614cb5565b9473c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29473eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee928388149587891487179485821517831516615004575b50604051926011818d60b81c1611614fdc578694847f3df02124a6417ed6ddc1f59d44ee1986ed4ae2b8bf5ed0562f7865a837cab6798e9652602081017f2a064e3c5b41b90865b2489ba64833a0e2ad025a394747c5cb7558f1ce7d65039052604081017fd2e2833add96994f00000000000000000000000000000000000000000000000090528560b61c6103fc16019d828f938760e01c1660048501528660e81c166024840152806044840152606483015f90526084938d888860f31c16986040985f98614e6c9b614fce575b600114614f905760f41c16614f80575b505b02871502905af1614b92565b15614f595760208a1651998a975b838160f41c1615614e92575b50505050505050505050565b838160f51c16614f39575b60f61c8316614f14575b308718614eb5575b80614e86565b1616600114614efe5791859391614ed29593614ef6575b50614c84565b15614ee757505b5f8281808080808080614eaf565b80633c9fd93960e21b60049252fd5b90505f614ecc565b5050505f809350809281925af1614ed957612106565b9650632e1a7d4d60e01b5f52896004525f8060248180885af115612143578996614ea7565b975f6004818093630d0e30db60e41b8252895af115612143578a97614e9d565b81818b1616600114614f7a57614f6f3086614b9b565b5f1901998a97614e7a565b47614f6f565b848601526020909401938d614e5e565b5050947fe413f48d00000000000000000000000000000000000000000000000000000000886060939783880190308252602082015201520193614e60565b97849088015260a497614e4e565b7fa231cb82000000000000000000000000000000000000000000000000000000005f5260045ffd5b61501a8c85808260c81c169160c01c1687614cb5565b908114615037575b615031908d8660405192614bc4565b5f614d80565b5087615022565b632e1a7d4d60e01b5f52866004525f806024818073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af1614d2557612106565b630d0e30db60e41b5f525f806004818a73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af1614d1a57612106565b9093926001600160a01b038116918160f21c956001808816818560f91c1691808660f01c166153b1575b808660f11c1661537d575b60ff926150ef848860d81c16858960d01c168a614cb5565b9473c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29473eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee92838814958b888a14881795858d88851517861516615341575b50505050604051926011818d60b81c1611614fdc578d9c8795857f3df02124a6417ed6ddc1f59d44ee1986ed4ae2b8bf5ed0562f7865a837cab6798f9752602081017f2a064e3c5b41b90865b2489ba64833a0e2ad025a394747c5cb7558f1ce7d65039052604081017fd2e2833add96994f00000000000000000000000000000000000000000000000090528660b61c6103fc16019e8f93808860e01c1660048601528760e81c16602485015281604485015260648401526084938d888860f31c16986040985f986152219b614fce57600114614f905760f41c16614f80575002871502905af1614b92565b1561531a5760208b16519a8b975b838160f41c161561526b575b50505050505050508291501061524e5750565b8261129f604051928392630325276360e11b84526004840161041a565b838160f51c166152fa575b60f61c83166152d5575b30871861528e575b8061523b565b16166001146152bf57918593916152aa9593614ef65750614c84565b15614ee757505b5f8381808080808080615288565b5050505f809350809281925af16152b157612106565b9650632e1a7d4d60e01b5f528a6004525f8060248180885af115612143578a96615280565b975f6004818093630d0e30db60e41b8252895af115612143578b97615276565b81818c161660011461533b576153303086614b9b565b5f19019a8b9761522f565b47615330565b8087806153579360c81c169160c01c1685614cb5565b918214615375575b61536c9260405192614bc4565b8b5f858d615135565b8a915061535f565b632e1a7d4d60e01b5f52836004525f806024818073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af16150d757612106565b630d0e30db60e41b5f525f806004818773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af16150cc57612106565b9291926001600160a01b0384169360018160f71c169063ffffffff8160a01c169384156154bf575b60405194630240bc6b60e21b5f5260405f6004818b5afa156154b6573d605f190161548e576020975f958560a4958995633b9aca008a99968a97159e8f60051b519460f21c16519202920282019102049a63022c0d9f60e01b86528b0260048601528a0260248501526044840152608060648401528160848401525af115611e1b5750565b7f85cd58dc000000000000000000000000000000000000000000000000000000005f5260045ffd5b853d5f823e3d90fd5b633b6d03409450615409565b93929091936001600160a01b0382169160018160f71c169063ffffffff8160a01c169081156155a3575b60405195630240bc6b60e21b5f5260405f600481895afa1561559a573d605f190161548e57633b9aca0084159360208560051b519460f21c16519202920282019102049680881061557f57505f8094819460a494889463022c0d9f60e01b86528b0260048601528a0260248501526044840152608060648401528160848401525af115611e1b5750565b8560449189630325276360e11b835260048301526024820152fd5b863d5f823e3d90fd5b633b6d034091506154f5565b909160018460f71c169060405193630251596160e31b8552600485015281602485015260448401528060011461564b571561562c575b60a06084830152604060a483015260c4820152600160fa1b8216151560e482015260405f61010483826001600160a01b0387165af115611e1b575060f21c602016515f0390565b73fffd8963efd1fc6a506488495d951d5263988d2560648301526155e5565b506401000276a460648301526155e5565b90919493929460018460f71c169060405193630251596160e31b8552600485015281602485015260448401528060011461570457156156e5575b60a06084830152604060a483015260c4820152600160fa1b8216151560e482015260405f61010483826001600160a01b0387165af115611e1b575060f21c602016515f039180831061524e5750565b73fffd8963efd1fc6a506488495d951d5263988d256064830152615696565b506401000276a46064830152615696565b632e1a7d4d60e01b5f526004525f806024818073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af11561210657565b60245f808094938194632e1a7d4d60e01b83526004525af11561210657565b90811561577157501990565b905090565b90929192615786611be082611bb7565b938185528183011161035c57610395916020850190611b9e565b9160e08301357f0200000000000000000000000000000000000000000000000000000000000000161561585757801561582e576157f7916157e2913691615776565b6001600160a01b039181602084935191012090565b1691351603615808575b6001905f90565b5f907fdc11ee6b0000000000000000000000000000000000000000000000000000000090565b5050505f907fb2d25e490000000000000000000000000000000000000000000000000000000090565b91505015615801575f907f74896a7b0000000000000000000000000000000000000000000000000000000090565b69ffffffffffffffffffff8091169081159283156158a4575b50505090565b161490505f808061589e565b60501c64ffffffffff1680151590816158c7575090565b9050421190565b9061041691615c02565b9461592a90615919615910615932956105639d9b9761593a999d9b966159018c6101c092613961565b806101008d01528b01916139da565b9a610120890152565b6001600160a01b0316610140870152565b610160850152565b610180830152565b6101a08185039101526139da565b9391909492946159588282615cc6565b80949194156159d7579060209697615987838061598161171b61171b6117156159c2998d61166e565b986116b2565b9290916040519a8b998a9889987f1d9671c3000000000000000000000000000000000000000000000000000000008a52339360048b016158d8565b03915afa908115612143575f916125ca575090565b505050505050908160a060c0610563940135910135615cd0565b939190949294615a018282615cf2565b8094919415615a65579060209697615a2a838061598161171b61171b6117156159c2998d61166e565b9290916040519a8b998a9889987fd7ff8a80000000000000000000000000000000000000000000000000000000008a52339360048b016158d8565b505050505050908160a060c0610563940135910135615d09565b9080821015615771575090565b600160ff8360081c93161b91615aad6106bf8284905f5260205260405f2090565b908380831614615ace576103959361146a921792905f5260205260405f2090565b60046040517fa4f62a96000000000000000000000000000000000000000000000000000000008152fd5b9061041691615c1e565b9061041691615c3a565b9294805f9581602098889596604051976323b872dd60e01b8952600489015260248801526044870152615b53575b5050606401925af160015f5114601f3d11163d15171690565b6064850137805f615b3a565b6001600160a01b0360408201358116918215615b7a57505090565b6020013516919050565b9061041691615c56565b9061041691615c72565b615ba06118dc565b9060208252565b615baf615b98565b9061039560208301611914565b615bc581615d43565b90615bce615ba7565b918252602082015290565b60208210615bf55761041691601f190190602081019035615d7b565b50506104166104165f8091565b60208210615bf55761041691601f190190602081019035615dc6565b60208210615bf55761041691601f190190602081019035615de9565b60208210615bf55761041691601f190190602081019035615e0c565b60208210615bf55761041691601f190190602081019035615e2b565b60208210615bf55761041691601f190190602081019035615e4b565b60208210615bf55761041691601f190190602081019035615e6a565b60208210615bf55761041691601f190190602081019035615e8d565b9061041691615c8e565b80831760801c15615ce85761127d906105639361114e565b6105639202611175565b9061041691615caa565b9190820180921161113c57565b909182811760801c15615d3457615d2f82615d2a6105639561127d9461114e565b615cfc565b61112e565b610563920281015f1901611175565b60ff16601f8111615d515790565b60046040517fb3512b0c000000000000000000000000000000000000000000000000000000008152fd5b92909163ffffffff93848160801c1694859160a01c1693019383039211615d9e57565b7f9605a010000000000000000000000000000000000000000000000000000000005f5260045ffd5b92909163ffffffff93848160601c1694859160801c1693019383039211615d9e57565b92909163ffffffff93848160a01c1694859160c01c1693019383039211615d9e57565b92909163ffffffff8460201b81169485911693019383039211615d9e57565b92909163ffffffff9384811694859160201c1693019383039211615d9e57565b92909163ffffffff8460c01c16809460e01c93019383039211615d9e57565b92909163ffffffff93848160201c1694859160401c1693019383039211615d9e57565b92909163ffffffff93848160401c1694859160601c1693019383039211615d9e5756fea264697066735822122021d57fb103289e2cba8afc2bb1171da60ce5b202c078d95875fb05ec060bef4f64736f6c63430008170033290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2