5 txs
9 calls
constructor
constructor(address _poolManager, address _positionManager, address _permit2, address _feeReceiver)
functions
blacklistedHooks
viewfunction blacklistedHooks(address) view returns (bool)
FEE_DENOMINATOR
viewfunction FEE_DENOMINATOR() view returns (uint256)
feeReceiver
viewfunction feeReceiver() view returns (address)
fees
viewfunction fees(bytes32 nameHash) view returns (string name, uint256 lpFee, uint256 collectFee, uint256 lockFee, address lockFeeToken)
getBatchLockInfo
viewfunction getBatchLockInfo(uint256[] lockIds) view returns (tuple[])
getFee
viewfunction getFee(string name_) view returns (tuple)
getLockInfo
viewfunction getLockInfo(uint256 lockId) view returns (tuple)
getUserLockAt
viewfunction getUserLockAt(address user, uint256 index) view returns (uint256)
getUserLockCount
viewfunction getUserLockCount(address user) view returns (uint256)
getUserLocks
viewfunction getUserLocks(address user) view returns (uint256[] lockIds)
isLocked
viewfunction isLocked(uint256 lockId) view returns (bool)
isSupportedFeeName
viewfunction isSupportedFeeName(string name_) view returns (bool)
isWhitelistMode
viewfunction isWhitelistMode() view returns (bool)
locks
viewfunction locks(uint256) view returns (uint256 lockId, address pendingOwner, address owner, address collector, uint256 collectFee, uint256 lpFee, uint256 tokenId, tuple poolKey, uint256 amount, uint256 unlockTime)
MAX_FEE
viewfunction MAX_FEE() view returns (uint256)
NATIVE_ETH
viewfunction NATIVE_ETH() view returns (address)
onERC721Received
purefunction onERC721Received(address operator, address from, uint256 tokenId, bytes data) pure returns (bytes4)
owner
viewfunction owner() view returns (address)
permit2
viewfunction permit2() view returns (address)
poolManager
viewfunction poolManager() view returns (address)
positionManager
viewfunction positionManager() view returns (address)
whitelistedHooks
viewfunction whitelistedHooks(address) view returns (bool)
acceptLock
nonpayablefunction acceptLock(uint256 lockId_)
addOrUpdateFee
nonpayablefunction addOrUpdateFee(string name_, uint256 lpFee_, uint256 collectFee_, uint256 lockFee_, address lockFeeToken_)
adminRescueETH
nonpayablefunction adminRescueETH(uint256 amount, address receiver)
adminRescueTokens
nonpayablefunction adminRescueTokens(address token, address receiver, uint256 amount)
changeWhitelistMode
nonpayablefunction changeWhitelistMode()
collect
nonpayablefunction collect(uint256 lockId, address recipient) returns (uint256 amount0, uint256 amount1, uint256 fee0, uint256 fee1)
decreaseLiquidity
nonpayablefunction decreaseLiquidity(uint256 lockId, uint128 liquidityDecrease, uint256 amount0Min, uint256 amount1Min) returns (uint256 amount0, uint256 amount1)
increaseLiquidity
payablefunction increaseLiquidity(uint256 lockId, uint256 amount0Max, uint256 amount1Max, uint48 deadline) payable returns (uint256 amount0Used, uint256 amount1Used)
lockNFTPosition
payablefunction lockNFTPosition(uint256 tokenId, uint256 unlockTime, address lockOwner_, address collector_, string feeName) payable returns (uint256 lockId)
relock
nonpayablefunction relock(uint256 lockId, uint256 newUnlockTime)
removeCustomFee
nonpayablefunction removeCustomFee(address user)
removeFee
nonpayablefunction removeFee(string name_)
renounceOwnership
nonpayablefunction renounceOwnership()
setCollectAddress
nonpayablefunction setCollectAddress(uint256 lockId, address newCollectAddress)
setCustomFee
nonpayablefunction setCustomFee(address user, tuple feeObj)
setHookBlacklist
nonpayablefunction setHookBlacklist(address hook, bool blacklisted)
setHookWhitelist
nonpayablefunction setHookWhitelist(address hookAddress, bool status)
transferLock
nonpayablefunction transferLock(uint256 lockId_, address newOwner_)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
unlockLiquidity
nonpayablefunction unlockLiquidity(uint256 lockId)
updateFeeReceiver
nonpayablefunction updateFeeReceiver(address feeReceiver_)
events
CollectAddressUpdated
event CollectAddressUpdated(uint256 indexed lockId, address indexed newCollectAddress)
CustomFeeAdded
event CustomFeeAdded(address indexed user, uint256 lpFee, uint256 collectFee, uint256 lockFee, address lockFeeToken)
CustomFeeRemoved
event CustomFeeRemoved(address indexed user)
EthRescued
event EthRescued(address indexed receiver, uint256 amount)
HookBlacklisted
event HookBlacklisted(address hook, bool blacklisted)
HookWhitelisted
event HookWhitelisted(address indexed hookAddress, bool status)
LiquidityDecreased
event LiquidityDecreased(uint256 indexed lockId)
LiquidityLocked
event LiquidityLocked(uint256 indexed lockId, address indexed owner, address positionManager, uint256 tokenId, bytes32 indexed poolId, uint256 amount, uint256 unlockTime)
LiquidityUnlocked
event LiquidityUnlocked(uint256 indexed lockId, address indexed owner, address token, uint256 tokenId, bytes32 indexed poolId, uint256 amount)
LockExtended
event LockExtended(uint256 indexed lockId, uint256 newUnlockTime)
OnAddFee
event OnAddFee(bytes32 nameHash, string name, uint256 lpFee, uint256 collectFee, uint256 lockFee, address lockFeeToken)
OnEditFee
event OnEditFee(bytes32 nameHash, string name, uint256 lpFee, uint256 collectFee, uint256 lockFee, address lockFeeToken)
OnFeeReceiverUpdated
event OnFeeReceiverUpdated(address oldFeeReceiver, address newFeeReceiver)
OnIncreaseLiquidity
event OnIncreaseLiquidity(uint256 indexed lockId, uint256 amount, uint256 token0Used, uint256 token1Used)
OnLockPendingTransfer
event OnLockPendingTransfer(uint256 indexed lockId, address previousOwner, address newOwner)
OnLockTransferred
event OnLockTransferred(uint256 indexed lockId, address previousOwner, address newOwner)
OnRemoveFee
event OnRemoveFee(bytes32 nameHash)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
TokensRescued
event TokensRescued(address indexed token, address indexed receiver, uint256 amount)
WhitelistModeChanged
event WhitelistModeChanged(bool indexed isWhitelistMode)
errors
AddressEmptyCode
error AddressEmptyCode(address target)
AddressInsufficientBalance
error AddressInsufficientBalance(address account)
AlreadyUnlocked
error AlreadyUnlocked()
CannotRescueNFTs
error CannotRescueNFTs()
ETHTransferFailed
error ETHTransferFailed()
FailedInnerCall
error FailedInnerCall()
HookIsBlacklisted
error HookIsBlacklisted()
HookNotWhitelisted
error HookNotWhitelisted()
InsufficientLiquidity
error InsufficientLiquidity()
InsufficientLockFee
error InsufficientLockFee()
InvalidCollectAddress
error InvalidCollectAddress()
InvalidHookAddress
error InvalidHookAddress()
InvalidPermit2
error InvalidPermit2()
InvalidPoolManager
error InvalidPoolManager()
InvalidPositionManager
error InvalidPositionManager()
InvalidRecipient
error InvalidRecipient()
InvalidTokenId
error InvalidTokenId()
InvalidUnlockTime
error InvalidUnlockTime()
NFTOwnerMismatch
error NFTOwnerMismatch(address expected, address actual)
NoChange
error NoChange()
NoLiquidityInPosition
error NoLiquidityInPosition()
NotOwner
error NotOwner()
NotYetExpired
error NotYetExpired()
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
PoolNotInitialized
error PoolNotInitialized()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
StillLocked
error StillLocked()
TransferFailed
error TransferFailed(string reason)
UnlockTimeInPast
error UnlockTimeInPast()
ZeroLiquidity
error ZeroLiquidity()
creation bytecode
0x60e080604052346109d9576000906080816163a0803803809161002282856109f9565b8339810103126109d55761003581610a1c565b9061004260208201610a1c565b9061005b606061005460408401610a1c565b9201610a1c565b9133156109c1578454336001600160a01b031982168117875560405195916001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08880a3600180556001600160a01b03169081156109b2576001600160a01b03169182156109a3576001600160a01b0316928315610994576001600160a01b0316938415610952575060805260a05260c05260018060a01b0319600a541617600a55610147604051916101166040846109f9565b600783526020830190661111519055531560ca1b825250610158602060405180938282019586918851928391610a30565b81010301601f1981018352826109f9565b5190206000906040519261016b846109de565b8084526020840193602885526040810160a081526060820166b1a2bc2ec5000081526080830191868352858752600760205260408720935197885160018060401b03811161093e578554600181811c91168015610934575b602082101461092057601f81116108db575b506020601f82116001146108735781908a9b600498999a9b92610868575b50508160011b916000199060031b1c19161786555b51600186015551600285015551600384015551910180546001600160a01b0319166001600160a01b039290921691909117905560008281526009602052604090205415610837576000805160206163608339815191529161026e60405192839283610a53565b0390a15b604051906102816040836109f9565b60038252602082016204c56560ec1b81523360018060a01b038354160361082457610147906102c0602060405180938282019586918951928391610a30565b5190209050604051916102d2836109de565b808352602083019260408452604081016050815260608201600081526080830191600083528560005260076020526040600020935196875160018060401b03811161080e578554600181811c91168015610804575b60208210146107ee57601f81116107a6575b506020601f821160011461073b57819060049798999a600092610730575b50508160011b916000199060031b1c19161786555b51600186015551600285015551600384015551910180546001600160a01b0319166001600160a01b0392909216919091179055600082815260096020526040902054156106ff57600080516020616360833981519152916103d260405192839283610aa8565b0390a15b6040516103e46040826109f9565b60038152602081016204c4c560ec1b81523360018060a01b0360005416036106ea5761014790610424602060405180938282019586918851928391610a30565b519020600091604051610436816109de565b81815260208101601881526040820161011881526060830190868252608084019287845286885260076020526040882094519788519060018060401b0382116106d6578654600181811c911680156106cc575b60208210146106b857601f8111610673575b50602090601f831160011461060c579060049798999a83610601575b50508160011b916000199060031b1c19161786555b51600186015551600285015551600384015551910180546001600160a01b0319166001600160a01b0392909216919091179055600082815260096020526040902054156105d0576000805160206163608339815191529161053260405192839283610af6565b0390a15b6040516157869081610bda823960805181818161053201528181610e38015261296c015260a0518181816104a501528181611a6001528181611e0c01528181611fdb01528181612508015281816127a50152818161291d01528181612ab201528181612e0a01528181612e6101528181612fa5015281816130050152613066015260c051818181613447015281816149060152614aa20152f35b816105e960008051602061638083398151915293610b46565b506105f960405192839283610af6565b0390a1610536565b0151905038806104b7565b99601f198316888c52828c209b5b81811061065b575091600498999a9b91846001959410610642575b505050811b0186556104cc565b015160001960f88460031b161c19169055388080610635565b838301518d556001909c019b6020938401930161061a565b87825260208220601f840160051c810191602085106106ae575b601f0160051c01905b8181106106a3575061049b565b828155600101610696565b909150819061068d565b634e487b7160e01b82526022600452602482fd5b90607f1690610489565b634e487b7160e01b81526041600452602490fd5b63118cdaa760e01b6000523360045260246000fd5b8161071860008051602061638083398151915293610b46565b5061072860405192839283610aa8565b0390a16103d6565b015190503880610357565b601f1982169987600052816000209a60005b81811061078e575091600498999a9b91846001959410610775575b505050811b01865561036c565b015160001960f88460031b161c19169055388080610768565b838301518d556001909c019b6020938401930161074d565b866000526020600020601f830160051c810191602084106107e4575b601f0160051c01905b8181106107d85750610339565b600081556001016107cb565b90915081906107c2565b634e487b7160e01b600052602260045260246000fd5b90607f1690610327565b634e487b7160e01b600052604160045260246000fd5b63118cdaa760e01b825233600452602482fd5b8161085060008051602061638083398151915293610b46565b5061086060405192839283610a53565b0390a1610272565b0151905038806101f3565b868a52808a209a601f1983168b5b8181106108c3575091600498999a9b9c918460019594106108aa575b505050811b018655610208565b015160001960f88460031b161c1916905538808061089d565b838301518e556001909d019c60209384019301610881565b868a5260208a20601f830160051c81019160208410610916575b601f0160051c01905b81811061090b57506101d5565b8a81556001016108fe565b90915081906108f5565b634e487b7160e01b8a52602260045260248afd5b90607f16906101c3565b634e487b7160e01b89526041600452602489fd5b62461bcd60e51b815260206004820152601460248201527f496e76616c6964206665652072656365697665720000000000000000000000006044820152606490fd5b631968e46d60e11b8652600486fd5b63ed5f09f160e01b8652600486fd5b63bc12814760e01b8652600486fd5b631e4fbdf760e01b85526004859052602485fd5b5080fd5b600080fd5b60a081019081106001600160401b0382111761080e57604052565b601f909101601f19168101906001600160401b0382119082101761080e57604052565b51906001600160a01b03821682036109d957565b60005b838110610a435750506000910152565b8181015183820152602001610a33565b929160e060a091600093865260c06020870152610a7f815180928160c08a01526020858a019101610a30565b601f8019910116850101936028604082015281606082015266b1a2bc2ec5000060808201520152565b929160e060a091600093865260c06020870152610ad4815180928160c08a01526020858a019101610a30565b601f801991011685010193604080820152605060608201528260808201520152565b929160e060a091600093865260c06020870152610b22815180928160c08a01526020858a019101610a30565b601f8019910116850101936018604082015261011860608201528260808201520152565b80600052600960205260406000205415600014610bd3576008546801000000000000000081101561080e576001810180600855811015610bbd577ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30181905560085460009182526009602052604090912055600190565b634e487b7160e01b600052603260045260246000fd5b5060009056fe60a080604052600436101561001d575b50361561001b57600080fd5b005b60006080526080513560e01c908163011e1167146138a357508063093cf39114613729578063100fc9431461347657806312261ee714613430578063150b7a02146133c157806317d616a01461337d578063227588021461333c57806323a35de91461327c5780634d95d20f146128745780636d3b96c314612833578063715018a6146127d4578063791b98bc1461278e5780637dccbb99146127415780637efed30f1461258b578063879905a1146124c45780638d3c100a14611f515780638da5cb5b14611f265780638e5f597714611d0857806393ac830514611c6e57806396e83924146119e15780639b7d02ad146119a5578063aa67bf3a14611904578063b2fb30cb1461186f578063b3f0067414611845578063b48dd3be1461169a578063b707a288146115e5578063bc063e1a146115c7578063c3a875be146115a3578063c4545aff146112ce578063c69bebe41461124b578063c9102afd1461118c578063cdb5661f1461110f578063ce79eb601461104c578063d5fdb73214610ee3578063d73792a914610ec5578063d86669d914610e67578063dc4c90d314610e21578063eaeaddee14610d3c578063ed1eee6814610cb0578063f188ce39146103a5578063f2fde38b14610314578063f4dadc611461025b5763f6aacfb114610209573861000f565b34610255576020366003190112610255576004356080515260026020526020604060805120600a81015415159081610247575b506040519015158152f35b600b9150015442103861023c565b60805180fd5b34610255576020366003190112610255576004356080515260026020526101c060406080512080549060018060a01b036001820154169061030660018060a01b0360028301541660018060a01b0360038401541660048401546005850154906006860154926102cc60078801613bf2565b94600b600a890154980154986040519a8b5260208b015260408a01526060890152608088015260a087015260c086015260e08501906139d6565b6101808301526101a0820152f35b346102555760203660031901126102555761032d6139aa565b6103356141e2565b6001600160a01b0316801561038c5760805180546001600160a01b03198116831782556001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a360805180f35b631e4fbdf760e01b608051526080516004526024608051fd5b60a0366003190112610255576044356024356004356001600160a01b038316808403610255576064356001600160a01b0381169390849003610255576084356001600160401b03811161025557610400903690600401613963565b61040861420b565b42821115610c9d576104186140e8565b503360805152600660205260ff6040608051205416600014610c4957503360805152600560205260406080512060405190610452826138bf565b61045b81613b06565b8252600181015460208301526002810154604083015260038101546060830152600401546001600160a01b03166080820152935b604051637ba03aad60e01b8152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316939060c081602481885afa908115610aa65760805191610c19575b50604051631efeed3360e01b81526004810187905291602083602481895afa928315610aa65760805193610bf8575b506001600160801b038316928315610be55761055660a084207f000000000000000000000000000000000000000000000000000000000000000061430c565b5050506001600160a01b031615610bd25760808301516001600160a01b031680610b6c575b5098606089018051610afe575b50863b1561025557604051632142170760e11b8152608051336004830152306024830152604482018a905281806064810103816080518c5af18015610aa657610ae5575b5061066961066461062e61061b6105e1614cc2565b6106298d6040519384916020830160c091815260006020820152600060408201526000606082015260a06080820152600060a08201520190565b03601f198101845283613927565b614e25565b9260018060a01b038651169361065f602088019561061b60018060a01b038851169460405195869360208501613f10565b614f03565b614fe1565b90603c42019182421161095857883b15610255576040519063dd46508f60e01b8252818061069e866080519460048401613f33565b03816080518d5af18015610aa657610acc575b5060208a019485519081610970575b505050506004549760001989146109585760409060018a016004550151925192604051946101008601958087106001600160401b03881117610940578a8a60a097600b9560209f95896001600160801b038e9860e09e60405286895260208a908a01528b60408a01528360608a01528460808a0152858e8a0152169c878e60c0819a01520152604051986107538a6138f0565b858a5260208a01608051815260408b0191825260608b0192835260808b019384528c8b0194855260c08b0195865260e08b01968c88526101008c019889526101208c01998a52608051526020600290526040608051209a518b556001808e1b0390511660018b01906001808f1b03166001600160601b038e1b8254161790556001808d1b0390511660028a01906001808e1b03166001600160601b038d1b8254161790556001808c1b0390511660038901906001808d1b03166001600160601b038c1b82541617905551600488015551600587015551600686015551600180881b0381511660078601906001808a1b03166001600160601b03891b82541617905560088501600180891b036001808a1b038f84015116166001600160601b03891b82541617815560408201518154606084015160b81b62ffffff60b81b169162ffffff8b1b908b1b169065ffffffffffff8b1b1916171790556080600180891b03910151166009850190600180891b03166001600160601b03881b82541617905551600a840155519101553360805152600388526108f68760406080512061533a565b5020936040519384528684015260408301526060820152827f49def1ccceea7771ce91254bcad08254733e55bec4be0b3b47a01b7f2cb53b0060803393a460018055604051908152f35b634e487b7160e01b6080515260416004526024608051fd5b634e487b7160e01b6080515260116004526024608051fd5b610a0293949c5061271061098b61066494936109d493613de3565b04610994614cc2565b60405191608051508d602084015260408301526080516060830152608051608083015260a08083015260805160c083015260c0825261062960e083613927565b85519151600a546040519361065f92859261061b926001600160a01b03918216928216911660208501613f10565b863b1561025557610a2b916040518093819263dd46508f60e01b83526080519460048401613f33565b03816080518a5af18015610aa657610ab3575b50604051631efeed3360e01b815260048101879052602081602481895afa908115610aa65760805191610a77575b5097898080806106c0565b610a99915060203d602011610a9f575b610a918183613927565b810190613ef1565b89610a6c565b503d610a87565b6040513d608051823e3d90fd5b608051610abf91613927565b6080516102555788610a3e565b608051610ad891613927565b608051610255578b6106b1565b608051610af191613927565b608051610255578a6105cc565b60808a0180519091906001600160a01b0316610b3e57610b219150513414615506565b600a54610b389034906001600160a01b0316614886565b8a610588565b610b6791610b4c3415615506565b51600a549151916001600160a01b0390811691339116614245565b610b38565b60ff600d5416610ba7575b60805152600b60205260ff6040608051205416610b94578a61057b565b6308ed3ca360e01b608051526004608051fd5b8060805152600c60205260ff6040608051205416610b7757632812ca3b60e21b608051526004608051fd5b63486aa30760e01b608051526004608051fd5b6378b8b76160e01b608051526004608051fd5b610c1291935060203d602011610a9f57610a918183613927565b9189610517565b610c3b915060c03d60c011610c42575b610c338183613927565b810190613d5a565b50886104e8565b503d610c29565b610c5281613d0c565b15610c6657610c6090614114565b9361048f565b60405162461bcd60e51b815260206004820152600f60248201526e11995953985b59481a5b9d985b1a59608a1b6044820152606490fd5b63ae130dfb60e01b608051526004608051fd5b34610255576020366003190112610255576004356001600160401b03811161025557610ce3610ce8913690600401613963565b614114565b604051809160208252610d07815160a0602085015260c0840190613bcd565b90602081015160408401526040810151606084015260608101516080840152608060018060a01b039101511660a08301520390f35b3461025557602036600319011261025557610d556139aa565b610d5d6141e2565b6001600160a01b0316610d7181151561403e565b8060805152600660205260ff604060805120541615610de8578060805152600660205260406080512060ff19815416905580608051526005602052610dba604060805120614079565b7f51454f9794faf78c6081b7157bc8a28880d9b9caac3ff3b81d00fd2f59517f0d608051608051a260805180f35b60405162461bcd60e51b8152602060048201526011602482015270139bc818dd5cdd1bdb48199959481cd95d607a1b6044820152606490fd5b3461025557608051366003190112610255576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346102555760805136600319011261025557610e816141e2565b600d5460ff8082161516809160ff191617600d5515157f9094b093988cc7e117334d86adc047e84bbc414f34eb87fe4dd14fc3f623733d608051608051a260805180f35b34610255576080513660031901126102555760206040516127108152f35b34610255576020366003190112610255576004356001600160401b03811161025557610f13903690600401613963565b610f1b6141e2565b604051610f4960208281610f388183019687815193849201613baa565b81010301601f198101835282613927565b5190206040516020810190661111519055531560ca1b825260078152610f70602782613927565b519020811461101d57610f90816000526009602052604060002054151590565b15610fe757602081610fc27fb2c474098bd86300759342af0b60dbf39dcf9552246e0b7ffd3c19a4e3e906059361513a565b50806080515260078252610fda604060805120614079565b604051908152a160805180f35b60405162461bcd60e51b815260206004820152600e60248201526d466565206e6f742065786973747360901b6044820152606490fd5b60405162461bcd60e51b81526020600482015260076024820152661111519055531560ca1b6044820152606490fd5b346102555761105a36613a9d565b906110636141e2565b6001600160a01b03169081156110fc578160805152600c60205260ff60406080512054169080151580921515146110e9577f5b2460eb1f1133b6714bb07afb85ae0d9c49f24afa50d9800c1cc6d789f4acc7916110dc6020928560805152600c84526040608051209060ff801983541691151516179055565b604051908152a260805180f35b63a88ee57760e01b608051526004608051fd5b632a96f9e160e21b608051526004608051fd5b346102555760203660031901126102555760043560805152600760205261117360406080512061113e81613b06565b90600181015490600281015490600381015490600460018060a01b03910154169160405195869560a0875260a0870190613bcd565b9360208601526040850152606084015260808301520390f35b34610255576020366003190112610255576111a5613e56565b506004356080515260026020526101c0604060805120600b604051916111ca836138f0565b8054835260018101546001600160a01b039081166020850152600282015481166040850152600382015416606084015260048101546080840152600581015460a0840152600681015460c084015261122460078201613bf2565b60e0840152600a81015461010084015201546101208201526112496040518092613a19565bf35b34610255576020366003190112610255576112646139aa565b61126c6141e2565b600a54604080516001600160a01b038084168252841660208201529192917f02cbe864dd291b617018e5a2181cfd770c54bf3fba21fc323434c694b3b2ad1f9190a16001600160a01b03166001600160a01b03199190911617600a5560805180f35b34610255576040366003190112610255576112e76139aa565b6024356001600160401b0381116102555760a0600319823603011261025557604051611312816138bf565b81600401356001600160401b038111610255576113359060043691850101613963565b8152602081019260248301358452604082019260448101358452608460608401916064810135835201359160018060a01b038316830361159e576080840192835261137e6141e2565b6101f48651111580611591575b61139490613c82565b6001600160a01b0316946113a986151561403e565b85608051526006602052604060805120600160ff198254161790558560805152600560205260406080512093518051906001600160401b038211610940576113f18654613acc565b601f8111611552575b506020906001601f8411146114be57926114578360809896946004947f73e9338c8224933c40e2e5b255cef93af001cb8765c80164b3e3179a7d20bd2e9b99978b51926114b3575b50508160011b916000199060031b1c19161790565b85555b51600185018190559451600285018190559151600385018190559251930180546001600160a01b0319166001600160a01b039490941693841790556040805194855260208501919091528301526060820152a260805180f35b015190508c80611442565b90601f1983169187608051528160805120926080515b81811061153a5750936004937f73e9338c8224933c40e2e5b255cef93af001cb8765c80164b3e3179a7d20bd2e9a9896936001938360809c9a9810611521575b505050811b01855561145a565b015160001960f88460031b161c191690558b8080611514565b929360206001819287860151815501950193016114d4565b611581908760805152602060805120601f850160051c81019160208610611587575b601f0160051c0190613cb8565b886113fa565b9091508190611574565b5084516101f4101561138b565b600080fd5b346102555760805136600319011261025557602060ff600d54166040519015158152f35b34610255576080513660031901126102555760206040516101f48152f35b34610255576040366003190112610255576004356001600160a01b036116096139c0565b16908115611687578060805152600260205260406080512060018060a01b0360028201541633036116745760030180546001600160a01b031916831790556080517f570a1ee460fe39844fcfa359db528b53324ce4c22fa7080d3834db0a6349ed809080a360805180f35b6330cd747160e01b608051526004608051fd5b635447822f60e01b608051526004608051fd5b34610255576040366003190112610255576004356116b66139c0565b6116c36004548310613c45565b8160805152600260205260018060a01b036002604060805120015416330361180f576001600160a01b03811680156117bb57338114611766576080805184905260026020908152905160409081902060010180546001600160a01b0319169390931790925581513381526001600160a01b0393909316908301527f2ab916445cd7f71b7d22f037187a5e1b6086c455fa944619946ca72b62030ca291a260805180f35b60405162461bcd60e51b815260206004820152602760248201527f4c6f636b3a206e6577206f776e65722063616e6e6f742062652063757272656e6044820152663a1037bbb732b960c91b6064820152608490fd5b60405162461bcd60e51b815260206004820152602660248201527f4c6f636b3a206e6577206f776e65722063616e6e6f74206265207a65726f206160448201526564647265737360d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152600e60248201526d2737ba103637b1b59037bbb732b960911b6044820152606490fd5b346102555760805136600319011261025557600a546040516001600160a01b039091168152602090f35b34610255576040366003190112610255576004356024358160805152600260205260406080512060018060a01b0360028201541633036116745742821115610c9d57600b0180548211156118f157817f4e4187a5cfd31a235276a431f3c394962d1b05cc4da52f6fa4e5460a5808ee219260209255604051908152a260805180f35b6352aba6d360e11b608051526004608051fd5b346102555761191236613a9d565b9061191b6141e2565b6001600160a01b03169081156110fc578160805152600b60205260ff60406080512054169181151580931515146110e9577f4cc0d8bbc18f4db77c5226d5370b9a94a5e93e3cf2671017043e55c190be6d6d926119946040938360805152600b60205284608051209060ff801983541691151516179055565b82519182526020820152a160805180f35b34610255576020366003190112610255576001600160a01b036119c66139aa565b16608051526003602052602060406080512054604051908152f35b34610255576020366003190112610255576004356119fd61420b565b8060805152600260205260406080512060018060a01b0360028201541633810361167457600b8201544210611c5b57600a82019182548015611c4857600682015493608051905582608051526003602052611a5d85604060805120615222565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691823b15610255576040516323b872dd60e01b81526080513060048301526001600160a01b0386166024830152604482018790528180606481010381608051885af19081611c2f575b50611b7e5760805160033d11611b68575b6308c379a014611b2c575b6040516312dfddb360e01b81526020600482015260166024820152752ab735b737bbb7103a3930b739b332b91032b93937b960511b6044820152606490fd5b611b34613fcb565b80611b3f5750611aed565b6040516312dfddb360e01b815260206004820152908190611b64906024830190613bcd565b0390fd5b5060046080516080513e6080515160e01c611ae2565b85927fba4a3f8e2e6613ba4f7a58a5f3afbe56fdaae5ed213275b0d9bec44761f6cb059260a0611bb2600760609501613bf2565b209660405192835260208301526040820152a4608080519190915260026020819052905160408120818155600180820183905592810182905560038101829055600481018290556005810182905560068101829055600781018290556008810182905560098101829055600a8101829055600b0181905590805580f35b608051611c3b91613927565b6080516102555787611ad1565b6328486b6360e11b608051526004608051fd5b636100d92960e11b608051526004608051fd5b34610255576040366003190112610255576024356001600160a01b038116906004359082900361025557611ca06141e2565b611ca861420b565b60805180808084865af1611cba613f9b565b5015611cf55760207fff76eef98b5bdf97a95e78ef7e4f3da9681cd874619e7dbc5767e38ed162b80391604051908152a26001805560805180f35b63b12d13eb60e01b608051526004608051fd5b3461025557608036600319011261025557600435602435906001600160801b0382169182810361025557611d3a61420b565b816080515260026020526040608051209060018060a01b03600283015416330361167457600b820154421115611f13578315611f0057600a82019182548511611eed57611dd9611e0a92611d8c614cc2565b60068401546040805160208101929092526001600160801b03909316928101929092526044356060830152606435608083015260a080830152600060c08301526106298260e0810161061b565b60078201546008909201546040519261065f91849161061b9133916001600160a01b03918216911660208501613f10565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690611e3e90614fe1565b603c420180421161095857823b1561025557611e7392604051808095819463dd46508f60e01b83526080519660048401613f33565b0391608051905af18015610aa657611ed4575b50611e946040938254613e0c565b90558151907f64d0c470254fcda065fe0e66b5395405b2b6f2997de63b73f166031c81c4bdbb608051608051a26001805560805181526080516020820152f35b608051611ee091613927565b6080516102555783611e86565b63bb55fd2760e01b608051526004608051fd5b630200e8a960e31b608051526004608051fd5b632cc8960360e11b608051526004608051fd5b346102555760805136600319011261025557608051546040516001600160a01b039091168152602090f35b3461025557604036600319011261025557611f6a6139c0565b611f7261420b565b608080516004358152600260208190529151604090209182015491929091829182918291906001600160a01b0316331415806124ad575b611674576001600160a01b0381161561249a576006860154604051637ba03aad60e01b815260048101829052909690917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169060c084602481855afa938415610aa65760805194612478575b50604051631efeed3360e01b8152600481018a9052602081602481865afa8015610aa6576001600160801b039160805191612459575b501661207b575b60808888888860018055604051938452602084015260408301526060820152f35b83516020850180519599509395506001600160a01b0394851694919391169182159182156123f45747995b6040516370a0823160e01b81523060048201529b60208d6024818b5afa9c8d15610aa6576080519d6123bc575b50916106649161065f61212861061b61214e966106296120f1614cc2565b916040519384916020830160c091815260006020820152600060408201526000606082015260a06080820152600060a08201520190565b9151925160405193849161061b9130916001600160a01b03908116911660208501613f10565b603c420180421161095857823b156102555761218392604051808095819463dd46508f60e01b83526080519660048401613f33565b0391608051905af18015610aa6576123a3575b50801561233e5747985b6040516370a0823160e01b81523060048201529860208a602481895afa998a15610aa6576080519a612308575b50816121f9828d6121f460809f968f6121ed6121ff9860049a1015613f4f565b1015613f4f565b613e0c565b9a613e0c565b9501548061225c575b5090878386949382612236575b5050505081612225575b8061205a565b61222e9261507b565b85818161221f565b1561224e576122459250614886565b88878282612215565b6122579261507b565b612245565b955091938796509084916122986122906127108061227d8b6122879e613de3565b049b8c9a85613de3565b049a8b9a613e0c565b998a92613e0c565b958694886122ce575b896122b1575b9293509350612208565b600a546122c9908b906001600160a01b03168961507b565b6122a7565b80156122f057600a546122eb908a906001600160a01b0316614886565b6122a1565b600a546122eb908a906001600160a01b03168661507b565b9199506020823d602011612336575b8161232460209383613927565b8101031261159e5790519890816121cd565b3d9150612317565b6040516370a0823160e01b8152306004820152602081602481865afa908115610aa65760805191612371575b50986121a0565b90506020813d60201161239b575b8161238c60209383613927565b8101031261159e57518a61236a565b3d915061237f565b6080516123af91613927565b6080516102555789612196565b9091929c506020813d6020116123ec575b816123da60209383613927565b8101031261159e57519b91908d6120d3565b3d91506123cd565b6040516370a0823160e01b8152306004820152602081602481885afa908115610aa65760805191612427575b50996120a6565b90506020813d602011612451575b8161244260209383613927565b8101031261159e57518c612420565b3d9150612435565b612472915060203d602011610a9f57610a918183613927565b8b612053565b61249291945060c03d60c011610c4257610c338183613927565b50928961201d565b634e46966960e11b608051526004608051fd5b5060038601546001600160a01b0316331415611fa9565b34610255576060366003190112610255576124dd6139aa565b6124e56139c0565b604435916124f16141e2565b6124f961420b565b6001600160a01b0390811691907f00000000000000000000000000000000000000000000000000000000000000001682146125785760208161255d857f77023e19c7343ad491fd706c36335ca0e738340a91f29b1fd81e2673d44896c4948661507b565b6040519485526001600160a01b031693a36001805560805180f35b633d8647d760e11b608051526004608051fd5b34610255576020366003190112610255576004356001600160401b03811161025557366023820112156102555780600401356001600160401b038111610255573660248260051b84010111610255576125e381613e3f565b916125f16040519384613927565b818352601f1961260083613e3f565b016080515b81811061272a5750506080515b828110156126d7576001906080515060248160051b84010135608051526002602052604060805120600b60405191612649836138f0565b805483528481015460a086811b87900391821660208601526002830154821660408601526003830154909116606085015260048201546080850152600582015490840152600681015460c08401526126a360078201613bf2565b60e0840152600a81015461010084015201546101208201526126c58287613ec7565b526126d08186613ec7565b5001612612565b836040518091602082016020835281518091526020604084019201906080515b818110612705575050500390f35b9193509160206101c08261271c6001948851613a19565b0194019101918493926126f7565b602090612735613e56565b82828801015201612605565b34610255576040366003190112610255576001600160a01b036127626139aa565b16608051526003602052602061277f602435604060805120615122565b90549060031b1c604051908152f35b3461025557608051366003190112610255576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461025557608051366003190112610255576127ee6141e2565b60805180546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a360805180f35b34610255576020366003190112610255576001600160a01b036128546139aa565b1660805152600c602052602060ff60406080512054166040519015158152f35b60803660031901126102555765ffffffffffff60643516606435036102555761289b61420b565b60043560805152600260205260406080512060018060a01b03600282015416330361167457600781015460088201546001600160a01b039081169116811561323f578061322c5760243534036131f0575b6128fa604435303385614245565b6006830154604051637ba03aad60e01b815260048101919091529160c0836024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa928315610aa657608051936131cd575b5061299060a061296960078701613bf2565b207f000000000000000000000000000000000000000000000000000000000000000061430c565b505050906129c46129a68560081c60020b6143d5565b60443590602435906129bd8860201c60020b6143d5565b9086614706565b926129d48560081c60020b6143d5565b936129e48660201c60020b6143d5565b608051958682826001600160a01b03808316908216116131c2575b50506001600160a01b03878116908316811161318557505090612a22929161547d565b60243581111561317f5750602435935b6044358111156131795750604435915b60808051339052600660205251604090205460ff161561316f5733608051526005602052600160406080512001545b608051608051918061309a575b5096612b0591612a91612a9a9989613e0c565b98899187613e0c565b96879286613057575b612aad84876148e9565b612ae17f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168588614a6a565b612aff612af38260081c60020b6143d5565b9160201c60020b6143d5565b91614706565b968796612b10614cc2565b95612b696006840154612b5b83856040519d8e9460208601929060c094926001600160801b039185521660208401526040830152606082015260a06080820152600060a08201520190565b03601f1981018b528a613927565b612b71614c5f565b50602087015151600181018111610958576001612b8e9101614854565b97602088015151600181018111610958576001612bab9101614c78565b608051909b905b8c51600019810190811161095857811015612c185780612bee818f612bdd6001958f60200151613ec7565b51612be88383613ec7565b52613ec7565b508b612c11828d612c058260ff60f81b9251614d28565b51166080511a92614d28565b5301612bb2565b508b8a8c9a9798999a8251600019810190811161095857612c4491612c3d8286613ec7565b5283613ec7565b5081518060001981011161095857612c63608051916000190183614d28565b538752602087015260018060a01b036007860154169860018060a01b0360088701541697604051998b60208c01528960408c015260408b52612ca660608c613927565b612cae614c5f565b50602089015151600181018111610958576001612ccb9101614854565b9960208a015151600181018111610958576001612ceb919e9d9e01614c78565b608051909c905b8d51600019810190811161095857811015612d43579d60018e9f8f8f908f80612d2885612d3994612bdd82602081970151613ec7565b50612c058260ff60f81b9251614d28565b5301909e50612cf2565b508a918c918f8f908151600019810190811161095857612d6e91612d678285613ec7565b5282613ec7565b50805160001981019490851161095857612dfa95612dd1612dd194612dd69484600d612da061061b9b61061b98614d28565b538452602080850191909152604080516001600160a01b039093169183019190915230908201529283906060820190565b614d39565b604080516001600160a01b0390941660208501523090840152919283906060820190565b81612f9457612e0890614fe1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b15610255576040519063dd46508f60e01b82528180612e5c608051936064359060048401613e19565b03818b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af18015610aa657612f73575b5090600a946001600160801b039493925b8160243511612f3d575b50508160443511612f1f575b5050169301928354608051508181018091116109585760409455835190815282602082015281848201527ff4a24ba0083c1c1026e9a9afbc65244e8dd5ea13d07eb0874e3e8d5ad44bae07606060043592a26001805582519182526020820152f35b612f2e612f3692604435613e0c565b9033906147a2565b8680612ebd565b80612f5f5750612f52612f5891602435613e0c565b33614886565b8880612eb1565b612f2e612f6e92602435613e0c565b612f58565b6080519194939291612f8491613927565b6080516102555790919288612e96565b612fa2909493929194614fe1565b947f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b15610255576040519563dd46508f60e01b87528680612ff7608051936064359060048401613e19565b038160805160018060a01b037f0000000000000000000000000000000000000000000000000000000000000000165af1948515610aa657600a966001600160801b0396613045575b50612ea7565b60805161305191613927565b8a61303f565b61306183886148e9565b6130957f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168489614a6a565b612aa3565b915050612710811161313857612a9a9681612a916127106130ca816130c2612b05978d613de3565b049389613de3565b0491806130ff575b826130e2575b9299505091612a7e565b600a546130fa9084906001600160a01b0316886147a2565b6130d8565b8661312057600a5461311b9082906001600160a01b0316614886565b6130d2565b600a5461311b9082906001600160a01b0316896147a2565b60405162461bcd60e51b815260206004820152600f60248201526e098a0be8c8a8abea89e9ebe90928e9608b1b6044820152606490fd5b6005870154612a71565b91612a42565b93612a32565b919750906001600160a01b03831611156131b6575090846131aa826131b0948361547d565b9661543a565b93612a22565b95906131b0929161543a565b935091508a806129ff565b6131e791935060c03d60c011610c4257610c338183613927565b90509184612957565b60405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd0811551208185b5bdd5b9d60621b6044820152606490fd5b61323a602435303384614245565b6128ec565b60405162461bcd60e51b8152602060048201526015602482015274222aa0a62fa720aa24ab22afa327a92124a22222a760591b6044820152606490fd5b34610255576020366003190112610255576001600160a01b0361329d6139aa565b166080515260036020526040608051206040518060208354918281520190819360805152602060805120906080515b81811061332657505050816132e2910382613927565b604051918291602083019060208452518091526040830191906080515b81811061330d575050500390f35b82518452859450602093840193909201916001016132ff565b82548452602090930192600192830192016132cc565b34610255576020366003190112610255576001600160a01b0361335d6139aa565b1660805152600b602052602060ff60406080512054166040519015158152f35b34610255576020366003190112610255576004356001600160401b038111610255576133b76133b26020923690600401613963565b613d0c565b6040519015158152f35b34610255576080366003190112610255576133da6139aa565b506133e36139c0565b506064356001600160401b03811161025557366023820112156102555780600401356001600160401b038111610255573691016024011161025557604051630a85bd0160e11b8152602090f35b3461025557608051366003190112610255576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346102555760a0366003190112610255576004356001600160401b038111610255576134a6903690600401613963565b608435906001600160a01b038216606435604435602435838603610255576134cc6141e2565b60405160208101906134eb60208281610f388b87815193849201613baa565b519020936101f48211158061371d575b61350490613c82565b60405190613511826138bf565b86825260208201838152604083018581526060840191878352608085019384528860805152600760205260406080512094518051906001600160401b0382116109405761355e8754613acc565b601f81116136e9575b506020906001601f8411146136795791806135a092600498979695946080519261366e5750508160011b916000199060031b1c19161790565b86555b51600186015551600285015551600384015551910180546001600160a01b0319166001600160a01b03929092169190911790556000848152600960205260409020541561362857917fcef0ac813efcf2b70c3ca9407cb4b9c7a2c13f88069eb984681924530d733714959161361e9360405196879687613ccf565b0390a15b60805180f35b917f57c45aa395835adc7c2b2cacb6fcce511da0c9e4ef3887a310645a944161ad3f959161366693613659866152df565b5060405196879687613ccf565b0390a1613622565b015190508f80611442565b90601f1983169188608051528160805120926080515b8181106136d1575091600193918560049a9998979694106136b8575b505050811b0186556135a3565b015160001960f88460031b161c191690558e80806136ab565b9293602060018192878601518155019501930161368f565b613717908860805152602060805120601f850160051c8101916020861061158757601f0160051c0190613cb8565b8d613567565b506101f48311156134fb565b346102555760203660031901126102555760043561374a6004548210613c45565b6080805182905260026020525160409020600101546001600160a01b0316330361386b57608080518290526002602081815291516040908190209091015481516001600160a01b039091168152339281019290925282917f977f200b2646b170d74b50cb3968700a2cc1884b0f7918d49efdb96302cb18549190a28060805152600260205260018060a01b0360026040608051200154166080515260036020526137f981604060805120615222565b50336080515260036020526138138160406080512061533a565b50806080515260026020526001604060805120016001600160601b0360a01b815416905560805152600260205260026040608051200160018060a01b0333166001600160601b0360a01b825416179055608051608051f35b60405162461bcd60e51b815260206004820152601060248201526f2737ba103832b73234b733a7bbb732b960811b6044820152606490fd5b3461025557608051366003190112610255576020906080518152f35b60a081019081106001600160401b038211176138da57604052565b634e487b7160e01b600052604160045260246000fd5b61014081019081106001600160401b038211176138da57604052565b604081019081106001600160401b038211176138da57604052565b90601f801991011681019081106001600160401b038211176138da57604052565b6001600160401b0381116138da57601f01601f191660200190565b81601f8201121561159e5780359061397a82613948565b926139886040519485613927565b8284526020838301011161159e57816000926020809301838601378301015290565b600435906001600160a01b038216820361159e57565b602435906001600160a01b038216820361159e57565b80516001600160a01b03908116835260208083015182169084015260408083015162ffffff169084015260608083015160020b9084015260809182015116910152565b6101206101a0918051845260018060a01b03602082015116602085015260018060a01b03604082015116604085015260018060a01b0360608201511660608501526080810151608085015260a081015160a085015260c081015160c0850152613a8a60e082015160e08601906139d6565b6101008101516101808501520151910152565b604090600319011261159e576004356001600160a01b038116810361159e5790602435801515810361159e5790565b90600182811c92168015613afc575b6020831014613ae657565b634e487b7160e01b600052602260045260246000fd5b91607f1691613adb565b9060405191826000825492613b1a84613acc565b8084529360018116908115613b885750600114613b41575b50613b3f92500383613927565b565b90506000929192526020600020906000915b818310613b6c575050906020613b3f9282010138613b32565b6020919350806001915483858901015201910190918492613b53565b905060209250613b3f94915060ff191682840152151560051b82010138613b32565b60005b838110613bbd5750506000910152565b8181015183820152602001613bad565b90602091613be681518092818552858086019101613baa565b601f01601f1916010190565b90604051613bff816138bf565b82546001600160a01b0390811682526001840154808216602084015260a081901c62ffffff16604084015260b81c600290810b6060840152909301549092166080830152565b15613c4c57565b60405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a59081b1bd8dad25960921b6044820152606490fd5b15613c8957565b60405162461bcd60e51b81526020600482015260076024820152664d41585f46454560c81b6044820152606490fd5b818110613cc3575050565b60008155600101613cb8565b9491613cf09060a0959298979498875260c0602088015260c0870190613bcd565b96604086015260608501526080840152600180831b0316910152565b613d4390604051613d2d60208281610f388183019687815193849201613baa565b5190206000526009602052604060002054151590565b90565b51906001600160a01b038216820361159e57565b8092910360c0811261159e5760a01361159e57604051613d79816138bf565b613d8283613d46565b8152613d9060208401613d46565b6020820152604083015162ffffff8116810361159e57604082015260608301518060020b810361159e5760608201526080830151906001600160a01b038216820361159e5760a091608082015292015190565b81810292918115918404141715613df657565b634e487b7160e01b600052601160045260246000fd5b91908203918211613df657565b9065ffffffffffff613e38602092959495604085526040850190613bcd565b9416910152565b6001600160401b0381116138da5760051b60200190565b60405190613e63826138f0565b6000610120838281528260208201528260408201528260608201528260808201528260a08201528260c0820152604051613e9c816138bf565b83815283602082015283604082015283606082015283608082015260e0820152826101008201520152565b8051821015613edb5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b9081602091031261159e57516001600160801b038116810361159e5790565b6001600160a01b0391821681529181166020830152909116604082015260600190565b929190613f4a602091604086526040860190613bcd565b930152565b15613f5657565b60405162461bcd60e51b815260206004820152601e60248201527f42616c616e63652064656372656173656420756e65787065637465646c7900006044820152606490fd5b3d15613fc6573d90613fac82613948565b91613fba6040519384613927565b82523d6000602084013e565b606090565b600060443d10613d43576040513d600319016004823e8051913d60248401116001600160401b0384111761403857828201928351916001600160401b038311614030573d840160031901858401602001116140305750613d4392910160200190613927565b949350505050565b92915050565b1561404557565b60405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b2103ab9b2b960a11b6044820152606490fd5b60046000916140888154613acc565b806140a5575b508260018201558260028201558260038201550155565b601f81116001146140bb57508281555b3861408e565b818452602084206140d791601f0160051c810190600101613cb8565b8083528260208120818355556140b5565b604051906140f5826138bf565b6000608083606081528260208201528260408201528260608201520152565b61411c6140e8565b5060405161413a60208281610f388183019687815193849201613baa565b519020614154816000526009602052604060002054151590565b156141b1576000526007602052604060002060405190614173826138bf565b61417c81613b06565b8252600181015460208301526002810154604083015260038101546060830152600401546001600160a01b0316608082015290565b60405162461bcd60e51b81526020600482015260096024820152681393d5081193d5539160ba1b6044820152606490fd5b6000546001600160a01b031633036141f657565b63118cdaa760e01b6000523360045260246000fd5b60026001541461421c576002600155565b633ee5aeb560e01b60005260046000fd5b9081602091031261159e5751801515810361159e5790565b6040516323b872dd60e01b602082019081526001600160a01b039384166024830152939092166044830152606482019390935260009283929091839061429881608481015b03601f198101835282613927565b51925af16142a4613f9b565b816142dd575b50156142b257565b60405162461bcd60e51b815260206004820152600360248201526229aa2360e91b6044820152606490fd5b80518015925082156142f2575b5050386142aa565b614305925060208091830101910161422d565b38806142ea565b91906020906040518281019182526006604082015260408152614330606082613927565b519020604051631e2eaeaf60e01b8152600481019190915292839060249082906001600160a01b03165afa9182156143c957600092614392575b506001600160a01b0382169160a081901c60020b9162ffffff60b883901c81169260d01c1690565b90916020823d6020116143c1575b816143ad60209383613927565b810103126143be575051903861436a565b80fd5b3d91506143a0565b6040513d6000823e3d90fd5b60020b908160ff1d82810118620d89e881116146f15763ffffffff9192600182167001fffcb933bd6fad37aa2d162d1a59400102600160801b1891600281166146d5575b600481166146b9575b6008811661469d575b60108116614681575b60208116614665575b60408116614649575b6080811661462d575b6101008116614611575b61020081166145f5575b61040081166145d9575b61080081166145bd575b61100081166145a1575b6120008116614585575b6140008116614569575b618000811661454d575b620100008116614531575b620200008116614516575b6204000081166144fb575b62080000166144e2575b6000126144d9575b0160201c90565b600019046144d2565b6b048a170391f7dc42444e8fa290910260801c906144ca565b6d2216e584f5fa1ea926041bedfe9890920260801c916144c0565b916e5d6af8dedb81196699c329225ee6040260801c916144b5565b916f09aa508b5b7a84e1c677de54f3e99bc90260801c916144aa565b916f31be135f97d08fd981231505542fcfa60260801c9161449f565b916f70d869a156d2a1b890bb3df62baf32f70260801c91614495565b916fa9f746462d870fdf8a65dc1f90e061e50260801c9161448b565b916fd097f3bdfd2022b8845ad8f792aa58250260801c91614481565b916fe7159475a2c29b7443b29c7fa6e889d90260801c91614477565b916ff3392b0822b70005940c7a398e4b70f30260801c9161446d565b916ff987a7253ac413176f2b074cf7815e540260801c91614463565b916ffcbe86c7900a88aedcffc83b479aa3a40260801c91614459565b916ffe5dee046a99a2a811c461f1969c30530260801c9161444f565b916fff2ea16466c96a3843ec78b326b528610260801c91614446565b916fff973b41fa98c081472e6896dfb254c00260801c9161443d565b916fffcb9843d60f6159c9db58835c9266440260801c91614434565b916fffe5caca7e10e4e61c3624eaa0941cd00260801c9161442b565b916ffff2e50f5f656932ef12357cf3c7fdcc0260801c91614422565b916ffff97272373d413259a46990580e213a0260801c91614419565b826345c3193d60e11b60005260045260246000fd5b936001600160a01b038381169083161161479a575b6001600160a01b0385811695908316861161473c575050613d4393506153e6565b919490939192906001600160a01b038216111561478e5782916147639161476995946153e6565b936153a3565b6001600160801b0381166001600160801b03831610600014614789575090565b905090565b915050613d43926153a3565b90919061471b565b60405163a9059cbb60e01b602082019081526001600160a01b039093166024820152604481019390935260009283929083906147e1816064810161428a565b51925af16147ed613f9b565b81614825575b50156147fb57565b60405162461bcd60e51b815260206004820152600260248201526114d560f21b6044820152606490fd5b805180159250821561483a575b5050386147f3565b61484d925060208091830101910161422d565b3880614832565b9061485e82613948565b61486b6040519182613927565b828152809261487c601f1991613948565b0190602036910137565b600080916020936040519061489b8683613927565b83825285820191601f19870136843751925af16148b6613f9b565b50156148bf5750565b6064906040519062461bcd60e51b82526004820152600360248201526253544560e81b6044820152fd5b604051636eb1769f60e11b81523060048201526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166024830181905293919216602083604481845afa9283156143c957600093614a23575b5081831015614a1d57614997936020936149d3575b60405163095ea7b360e01b81526001600160a01b03909116600482015260248101929092529092839190829060009082906044820190565b03925af180156143c9576149a85750565b6149c99060203d6020116149cc575b6149c18183613927565b81019061422d565b50565b503d6149b7565b60405163095ea7b360e01b81528160048201526000602482015284816044816000875af1614a02575b5061495f565b614a1890853d87116149cc576149c18183613927565b6149fc565b50505050565b90926020823d602011614a4f575b81614a3e60209383613927565b810103126143be575051913861494a565b3d9150614a31565b519065ffffffffffff8216820361159e57565b60405163927da10560e01b81523060048201526001600160a01b039182166024820181905293821660448201819052600094909290917f000000000000000000000000000000000000000000000000000000000000000090911690606081606481855afa8015614c545786918791614bf2575b506001600160a01b038611614bbc57859065ffffffffffff42911610918215614ba9575b5050614b0f575b5050505050565b620151804201804211614b9557813b15614b9157918560849265ffffffffffff82969560405198899788966387517c4560e01b88526004880152602487015260018060a01b031660448601521660648401525af18015614b8657614b76575b808080614b08565b81614b8091613927565b38614b6e565b6040513d84823e3d90fd5b8580fd5b634e487b7160e01b86526011600452602486fd5b6001600160a01b03161090508438614b01565b60405162461bcd60e51b815260206004820152600e60248201526d6e656564656420746f6f2062696760901b6044820152606490fd5b9150506060813d606011614c4c575b81614c0e60609383613927565b81010312614b915780516001600160a01b0381168103614c4857614c406040614c3960208501614a57565b9301614a57565b509038614add565b8680fd5b3d9150614c01565b6040513d88823e3d90fd5b60405190614c6c8261390c565b60606020838281520152565b90614c8282613e3f565b614c8f6040519182613927565b8281528092614ca0601f1991613e3f565b019060005b828110614cb157505050565b806060602080938501015201614ca5565b614cca614c5f565b506040516020614cda8183613927565b60008083526040519190614cee8284613927565b8252601f1981018160005b828110614d185750505060405192614d108461390c565b835282015290565b6060828287010152018290614cf9565b908151811015613edb570160200190565b614d41614c5f565b50602081019081515160018101809111613df657614d5e90614854565b9180515160018101809111613df657614d7690614c78565b9460005b86516000198101908111613df657811015614dda5780614d9d6001928551613ec7565b51614da8828a613ec7565b52614db38189613ec7565b5060ff60f81b614dc4828751614d28565b511660001a614dd38288614d28565b5301614d7a565b50949290919383516000198101908111613df657614e0391614dfc8287613ec7565b5284613ec7565b5082516000198101908111613df657614e1e60149183614d28565b5383525290565b614e2d614c5f565b50602081019081515160018101809111613df657614e4a90614854565b9180515160018101809111613df657614e6290614c78565b9460005b86516000198101908111613df657811015614ec65780614e896001928551613ec7565b51614e94828a613ec7565b52614e9f8189613ec7565b5060ff60f81b614eb0828751614d28565b511660001a614ebf8288614d28565b5301614e66565b50949290919383516000198101908111613df657614ee891614dfc8287613ec7565b5082516000198101908111613df657614e1e60019183614d28565b614f0b614c5f565b50602081019081515160018101809111613df657614f2890614854565b9180515160018101809111613df657614f4090614c78565b9460005b86516000198101908111613df657811015614fa45780614f676001928551613ec7565b51614f72828a613ec7565b52614f7d8189613ec7565b5060ff60f81b614f8e828751614d28565b511660001a614f9d8288614d28565b5301614f44565b50949290919383516000198101908111613df657614fc691614dfc8287613ec7565b5082516000198101908111613df657614e1e60119183614d28565b615004906020815191015190604051928391604060208401526060830190613bcd565b91601f19828403016040830152805180845260208401936020808360051b8301019301946000915b83831061504a5750505050613d43925003601f198101835282613927565b919360019193955060206150698192601f198682030187528951613bcd565b9701930193019092869492959361502c565b60405163a9059cbb60e01b602082019081526001600160a01b039390931660248201526044808201949094529283526150dd916000918291906150bf606487613927565b60018060a01b031694519082865af16150d6613f9b565b90836156ef565b8051908115159182615107575b50506150f35750565b635274afe760e01b60005260045260246000fd5b61511a925060208091830101910161422d565b1538806150ea565b8054821015613edb5760005260206000200190600090565b600081815260096020526040902054801561521b576000198101818111613df657600854600019810191908211613df6578181036151ca575b50505060085480156151b4576000190161518e816008615122565b8154906000199060031b1b19169055600855600052600960205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b6152036151db6151ec936008615122565b90549060031b1c9283926008615122565b819391549060031b91821b91600019901b19161790565b90556000526009602052604060002055388080615173565b5050600090565b90600182019181600052826020526040600020548015156000146152d6576000198101818111613df6578254600019810191908211613df65781810361529f575b505050805480156151b457600019019061527d8282615122565b8154906000199060031b1b191690555560005260205260006040812055600190565b6152bf6152af6151ec9386615122565b90549060031b1c92839286615122565b905560005283602052604060002055388080615263565b50505050600090565b8060005260096020526040600020541560001461533457600854600160401b8110156138da5761531b6151ec8260018594016008556008615122565b9055600854906000526009602052604060002055600190565b50600090565b600082815260018201602052604090205461521b57805490600160401b8210156138da57826153736151ec846001809601855584615122565b905580549260005201602052604060002055600190565b6001600160a01b039182169082160391908211613df657565b613d43926153db9290916001600160a01b03808316908216116153e0575b6001600160a01b03916153d4919061538a565b1690615547565b6156a1565b906153c1565b613d43926153db929091906001600160a01b0380821690831611615434575b61542d61541e6001600160a01b038381169085166155d4565b926001600160a01b039261538a565b169161561e565b90615405565b613d4392916001600160801b03916001600160a01b0380831690821611615477575b6001600160a01b039161546f919061538a565b1691166155d4565b9061545c565b916154d4916001600160a01b0380821690851611615500575b6001600160a01b036154a8858361538a565b6001600160a01b039092169291169060601b6fffffffffffffffffffffffffffffffff60601b1661561e565b6001600160a01b039091169081156154ea570490565b634e487b7160e01b600052601260045260246000fd5b92615496565b1561550d57565b60405162461bcd60e51b8152602060048201526012602482015271496e636f7272656374206c6f636b2066656560701b6044820152606490fd5b90606082901b90600019600160601b84099282808510940393808503948584111561159e57146155cd578190600160601b9009818060000316809204600281600302188082026002030280820260020302808202600203028082026002030280820260020302809102600203029360018380600003040190848311900302920304170290565b5091500490565b818102919060001982820991838084109303928084039384600160601b111561159e571461561557600160601b910990828211900360a01b910360601c1790565b50505060601c90565b91818302916000198185099383808610950394808603958685111561159e57146156995790829109818060000316809204600281600302188082026002030280820260020302808202600203028082026002030280820260020302809102600203029360018380600003040190848311900302920304170290565b505091500490565b906001600160801b0382169182036156b557565b60405162461bcd60e51b81526020600482015260126024820152716c6971756964697479206f766572666c6f7760701b6044820152606490fd5b90615715575080511561570457805190602001fd5b630a12f52160e11b60005260046000fd5b81511580615747575b615726575090565b639996b31560e01b60009081526001600160a01b0391909116600452602490fd5b50803b1561571e56fea26469706673582212206c3513442effaf369008b3e324c9aee136805cf0785f732ffa54b20193a73f7764736f6c634300081a0033cef0ac813efcf2b70c3ca9407cb4b9c7a2c13f88069eb984681924530d73371457c45aa395835adc7c2b2cacb6fcce511da0c9e4ef3887a310645a944161ad3f000000000000000000000000000000000004444c5dc75cb358380d2e3de08a90000000000000000000000000bd216513d74c8cf14cf4747e6aaa6420ff64ee9e000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3000000000000000000000000521faacdfa097ad35a32387727e468f7fd032fd6