0 txs
5 calls
constructor
constructor(uint256 appVersion_, string port)
functions
appVersion
viewfunction appVersion() view returns (uint256)
calcSrcNativeAmount
viewfunction calcSrcNativeAmount(uint256 dstChainId, uint256 dstNativeAmount) view returns (uint256)
channelUpgradeFallback
viewfunction channelUpgradeFallback() view returns (address)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
defaultFallback
viewfunction defaultFallback() view returns (address)
externalRetryBlocks
viewfunction externalRetryBlocks() view returns (uint64)
getChainId
viewfunction getChainId(string localChannel, bool checksAppVersion) view returns (uint256 counterpartyChainId)
getPool
viewfunction getPool(uint256 localPoolId) view returns (address localPool)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
IBC_HANDLER_ROLE
viewfunction IBC_HANDLER_ROLE() view returns (bytes32)
poolRepository
viewfunction poolRepository() view returns (address)
premiumBPS
viewfunction premiumBPS(uint256 chainId) view returns (uint256)
receiveRetryBlocks
viewfunction receiveRetryBlocks() view returns (uint64)
refuelDstCap
viewfunction refuelDstCap() view returns (uint256)
refuelSrcCap
viewfunction refuelSrcCap(uint256 chainId) view returns (uint256)
RELAYER_FEE_OWNER_ROLE
viewfunction RELAYER_FEE_OWNER_ROLE() view returns (bytes32)
relayerFeeCalculator
viewfunction relayerFeeCalculator() view returns (address)
revertReceive
viewfunction revertReceive(uint256 chainId, uint64 sequence) view returns (bytes)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
TIMEOUT_TIMESTAMP
viewfunction TIMEOUT_TIMESTAMP() view returns (uint64)
tokenEscrow
viewfunction tokenEscrow() view returns (address)
tokenPriceOracle
viewfunction tokenPriceOracle() view returns (address)
withdrawRetryBlocks
viewfunction withdrawRetryBlocks() view returns (uint64)
addRevertExternal
nonpayablefunction addRevertExternal(uint256 srcChainId, uint64 sequence, address token, uint256 amount, address to, tuple externalInfo, uint256 lastValidHeightOrZero)
addRevertReceivePool
nonpayablefunction addRevertReceivePool(uint256 srcChainId, uint64 sequence, uint256 srcPoolId, uint256 dstPoolId, address to, tuple fee, uint256 refuelAmount, tuple externalInfo, uint256 lastValidHeightOrZero)
addRevertReceiveToken
nonpayablefunction addRevertReceiveToken(uint256 srcChainId, uint64 sequence, string denom, uint256 amount, address to, uint256 refuelAmount, tuple externalInfo, uint256 lastValidHeightOrZero)
addRevertRefuel
nonpayablefunction addRevertRefuel(uint256 srcChainId, uint64 sequence, address to, uint256 refuelAmount, uint256 lastValidHeightOrZero)
addRevertRefuelAndExternal
nonpayablefunction addRevertRefuelAndExternal(uint256 srcChainId, uint64 sequence, address token, uint256 amount, address to, uint256 refuelAmount, tuple externalInfo, uint256 lastValidHeightOrZero)
addRevertWithdrawConfirm
nonpayablefunction addRevertWithdrawConfirm(uint256 srcChainId, uint64 sequence, uint256 withdrawLocalPoolId, uint256 withdrawCheckPoolId, address to, uint256 amountGD, uint256 mintAmountGD, uint256 lastValidHeightOrZero)
callDelta
nonpayablefunction callDelta(uint256 srcPoolId, bool fullMode)
draw
nonpayablefunction draw(uint256 amount, address to)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
refill
payablefunction refill() payable
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
retryOnReceive
nonpayablefunction retryOnReceive(string dstChannel, uint64 sequence)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
sendCredit
payablefunction sendCredit(string srcChannel, uint256 srcPoolId, uint256 dstPoolId, address refundTo) payable
setChainLookup
nonpayablefunction setChainLookup(string localChannel, uint256 counterpartyChainId)
setChannelUpgradeFallback
nonpayablefunction setChannelUpgradeFallback(address channelUpgradeFallback_)
setDefaultFallback
nonpayablefunction setDefaultFallback(address defaultFallback_)
setICS04SendPacket
nonpayablefunction setICS04SendPacket(address ics04SendPacket_)
setPoolRepository
nonpayablefunction setPoolRepository(address poolRepository_)
setPremiumBPS
nonpayablefunction setPremiumBPS(string localChannel, uint256 premiumBps)
setRefuelDstCap
nonpayablefunction setRefuelDstCap(uint256 cap)
setRefuelSrcCap
nonpayablefunction setRefuelSrcCap(string localChannel, uint256 cap)
setRelayerFeeCalculator
nonpayablefunction setRelayerFeeCalculator(address relayerFeeCalculator_)
setRetryBlocks
nonpayablefunction setRetryBlocks(uint64 receiveBlocks, uint64 withdrawBlocks, uint64 externalBlocks)
setTokenEscrow
nonpayablefunction setTokenEscrow(address tokenEscrow_)
setTokenPriceOracle
nonpayablefunction setTokenPriceOracle(address tokenPriceOracle_)
events
Draw
event Draw(uint256 amount, address to)
Initialized
event Initialized(uint64 version)
Refill
event Refill(uint256 amount)
RefuelDstCapped
event RefuelDstCapped(uint256 chainId, uint64 sequence, address to, uint256 requestAmount, uint256 actualAmount)
RevertReceive
event RevertReceive(uint8 retryType, uint256 chainId, uint64 sequence, uint256 lastValidHeight)
RoleAdminChanged
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)
RoleGranted
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)
RoleRevoked
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)
SetChainLookup
event SetChainLookup(string localChannel, uint256 counterpartyChainId)
SetChannelUpgradeFallback
event SetChannelUpgradeFallback(address channelUpgradeFallback)
SetDefaultFallback
event SetDefaultFallback(address defaultFallback)
SetICS04SendPacket
event SetICS04SendPacket(address ics04SendPacket)
SetPoolRepository
event SetPoolRepository(address poolRepository)
SetPremiumBPS
event SetPremiumBPS(uint256 chainId, uint256 riskPremiumBPS)
SetRefuelDstCap
event SetRefuelDstCap(uint256 cap)
SetRefuelSrcCap
event SetRefuelSrcCap(uint256 chainId, uint256 cap)
SetRelayerFeeCalculator
event SetRelayerFeeCalculator(address relayerFeeCalculator)
SetRetryBlocks
event SetRetryBlocks(uint64 receiveRetryBlocks, uint64 withdrawRetryBlocks, uint64 externalRetryBlocks)
SetTokenEscrow
event SetTokenEscrow(address tokenEscrow)
SetTokenPriceOracle
event SetTokenPriceOracle(address tokenPriceOracle)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
FailedCall
error FailedCall()
InsufficientBalance
error InsufficientBalance(uint256 balance, uint256 needed)
InvalidInitialization
error InvalidInitialization()
InvalidShortString
error InvalidShortString()
NotInitializing
error NotInitializing()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
StringTooLong
error StringTooLong(string str)
TokiCannotCloseChannel
error TokiCannotCloseChannel()
TokiCannotTimeoutPacket
error TokiCannotTimeoutPacket()
TokiChannelNotFound
error TokiChannelNotFound(string portId, string channelId)
TokiContractNotAllowed
error TokiContractNotAllowed(string name, address addr)
TokiDepeg
error TokiDepeg(uint256 poolId)
TokiDstChainIdNotAccepted
error TokiDstChainIdNotAccepted(uint256 dstChainId)
TokiDstOuterGasShouldBeZero
error TokiDstOuterGasShouldBeZero()
TokiExceed
error TokiExceed(string name, uint256 value, uint256 limit)
TokiExceedAdd
error TokiExceedAdd(string name, uint256 current, uint256 add, uint256 limit)
TokiFailToRefund
error TokiFailToRefund()
TokiFallbackUnauthorized
error TokiFallbackUnauthorized(address caller)
TokiFlowRateLimitExceed
error TokiFlowRateLimitExceed(uint256 current, uint256 add, uint256 limit)
TokiInsufficientAmount
error TokiInsufficientAmount(string name, uint256 value, uint256 needed)
TokiInsufficientPoolLiquidity
error TokiInsufficientPoolLiquidity(uint256 value, uint256 needed)
TokiInvalidAppVersion
error TokiInvalidAppVersion(uint256 expected, uint256 actual)
TokiInvalidBalanceDeficitFeeZone
error TokiInvalidBalanceDeficitFeeZone()
TokiInvalidPacketType
error TokiInvalidPacketType(uint8)
TokiInvalidProposedVersion
error TokiInvalidProposedVersion(string version)
TokiInvalidRecipientBytes
error TokiInvalidRecipientBytes()
TokiInvalidRetryType
error TokiInvalidRetryType(uint8)
TokiInvalidSafeZoneRange
error TokiInvalidSafeZoneRange(uint256 min, uint256 max)
TokiMock
error TokiMock(string message)
TokiNativeTransferIsFailed
error TokiNativeTransferIsFailed(address to, uint256 value)
TokiNoFee
error TokiNoFee()
TokiNoPeerPoolInfo
error TokiNoPeerPoolInfo()
TokiNoPool
error TokiNoPool(uint256 poolId)
TokiNoRevertReceive
error TokiNoRevertReceive()
TokiNotEnoughNativeFee
error TokiNotEnoughNativeFee(uint256 value, uint256 limit)
TokiPeerPoolInfoNotFound
error TokiPeerPoolInfoNotFound(uint256 chainId, uint256 poolId)
TokiPeerPoolIsAlreadyActive
error TokiPeerPoolIsAlreadyActive(uint256 chainId, uint256 poolId)
TokiPeerPoolIsNotReady
error TokiPeerPoolIsNotReady(uint256 peerChainId, uint256 peerPoolId)
TokiPeerPoolIsRegistered
error TokiPeerPoolIsRegistered(uint256 chainId, uint256 poolId)
TokiPoolRecvIsFailed
error TokiPoolRecvIsFailed(uint256 poolId)
TokiPoolWithdrawConfirmIsFailed
error TokiPoolWithdrawConfirmIsFailed(uint256 poolId)
TokiPriceIsExpired
error TokiPriceIsExpired(uint256 updatedAt)
TokiPriceIsNotPositive
error TokiPriceIsNotPositive(int256 value)
TokiRequireOrderedChannel
error TokiRequireOrderedChannel()
TokiRetryExpired
error TokiRetryExpired(uint256 expiryBlock)
TokiSamePool
error TokiSamePool(uint256 poolId, address pool)
TokiSlippageTooHigh
error TokiSlippageTooHigh(uint256 amountGD, uint256 eqReward, uint256 eqFee, uint256 minAmountGD)
TokiTransferIsFailed
error TokiTransferIsFailed(address token, address to, uint256 value)
TokiTransferIsStop
error TokiTransferIsStop()
TokiUnregisteredChainId
error TokiUnregisteredChainId(string channel)
TokiUnregisteredPoolId
error TokiUnregisteredPoolId(uint256 poolId)
TokiZeroAddress
error TokiZeroAddress(string message)
TokiZeroAmount
error TokiZeroAmount(string message)
TokiZeroValue
error TokiZeroValue(string message)
creation bytecode
0x60c06040523461016157614e778038038061001981610179565b928339810190604081830312610161578051602082015190916001600160401b03821161016157019082601f830112156101615781516001600160401b03811161016557610070601f8201601f1916602001610179565b9281845260208401946020838301011161016157815f926020809301875e84010152608052601f8151116101255751905160208210610115575b1760a052604051614cd8908161019f8239608051818181610a3401528181610a6401528181610bdf0152818161152a01528181611a1101528181611c8b01528181612666015281816129ec01528181612c5301528181612d8501526130ec015260a05181614b0d0152f35b5f198260200360031b1b166100aa565b60449060405192839163305a27a960e01b8352602060048401525180918160248501528484015e5f828201840152601f01601f19168101030190fd5b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b6040519190601f01601f191682016001600160401b038111838210176101655760405256fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a714610334578063027321981461032f578063068bcd8d1461032a5780630d97d4341461032557806317fec5e1146103205780632023c8b21461031b57806321f31a3714610316578063248a9ca3146103115780632ac50df11461030c5780632f2ff15d146103075780633069382014610302578063320dd5e3146102fd57806336568abe146102f857806336eabf3d146102f35780633b616467146102ee57806344409a82146102e957806345bd6c1e146102e4578063490cfee4146102df5780634ca9de56146102da578063538e0759146102d557806355143d00146102d05780635e8438d8146102cb5780636158412c146102c657806368d85296146102c15780636da937c4146102bc57806375b8bcbe146102b75780637788276b146102b25780637d6d3935146102ad57806384a00e5f146102a857806385e048d9146102a357806391d148541461029e5780639a6d9441146102995780639aa04dc5146102945780639ad0d78f1461028f578063a217fddf1461028a578063a28ce3aa14610285578063aac41ed614610280578063b148b0fd1461027b578063b18a2ae214610276578063b2a0973314610271578063b702a8791461026c578063be967c3814610267578063cba6ced714610262578063d547741f1461025d578063e1be5e8114610258578063e41dd64f14610253578063e4b76cc11461024e578063e5d9703614610249578063f8892e79146102445763fba6e2801461023f575f80fd5b6127b3565b612777565b61270c565b61259c565b6124a0565b61245b565b61240e565b6122fd565b6122c3565b6121ed565b611cf3565b611cae565b611c74565b611c2f565b611ab8565b611a9e565b61197e565b61186e565b611796565b611737565b611702565b611651565b6115d3565b61148b565b61138f565b61136e565b6112ed565b6112bb565b611281565b6111ce565b61118f565b611146565b6110fd565b611001565b610fbc565b610e43565b610dae565b610d07565b610b12565b610984565b61078a565b610745565b610706565b6106d1565b61068c565b6105cf565b6104d3565b6104a4565b61039f565b3461038a57602036600319011261038a5760043563ffffffff60e01b811680910361038a57602090637965db0b60e01b8114908115610379575b506040519015158152f35b6301ffc9a760e01b1490505f61036e565b5f80fd5b6001600160a01b0381160361038a57565b3461038a57602036600319011261038a576001600160a01b036004356103c48161038e565b6103cc612fad565b16801561045e576020816104557fc3f166be6360ee53b25ffea23e315be40588d7d492625de6739dcee67e22b0e4936001600160a01b03166001600160a01b03197f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab5045416177f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab50455565b604051908152a1005b604051636bc37c5f60e11b815260206004820152600f60248201527f706f6f6c5265706f7369746f72795f00000000000000000000000000000000006044820152606490fd5b3461038a57602036600319011261038a5760206104c260043561285a565b6001600160a01b0360405191168152f35b3461038a57602036600319011261038a576001600160a01b036004356104f88161038e565b610500612ffc565b168015610589576020816104557fe6d203f7c56037404bb4678c52ded222d7abb849b78541e006b70a29c5ca15b8936001600160a01b03166001600160a01b03197f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab5075416177f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab50755565b604051636bc37c5f60e11b815260206004820152601560248201527f72656c6179657246656543616c63756c61746f725f00000000000000000000006044820152606490fd5b3461038a57602036600319011261038a577f9f4fb4f50eef21d638c8d9e486ec5301d79ba0c4eb8790c1dbdb5d084804a91b60206001600160a01b036004356106178161038e565b61061f612fad565b610628816130ce565b16806001600160a01b03197f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab5015416177f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab50155604051908152a1005b5f91031261038a57565b3461038a575f36600319011261038a5760206001600160a01b037f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab5045416604051908152f35b3461038a575f36600319011261038a5760206001600160401b035f516020614c635f395f51905f525460401c16604051908152f35b3461038a57602036600319011261038a57602061073d6004355f525f516020614c835f395f51905f52602052600160405f20015490565b604051908152f35b3461038a575f36600319011261038a5760206001600160a01b037f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab5065416604051908152f35b3461038a57604036600319011261038a576107dc6024356004356107ad8261038e565b6107d76107d2825f525f516020614c835f395f51905f52602052600160405f20015490565b61306b565b613206565b005b634e487b7160e01b5f52604160045260245ffd5b604081019081106001600160401b0382111761080d57604052565b6107de565b60c081019081106001600160401b0382111761080d57604052565b61010081019081106001600160401b0382111761080d57604052565b60a081019081106001600160401b0382111761080d57604052565b60e081019081106001600160401b0382111761080d57604052565b61012081019081106001600160401b0382111761080d57604052565b90601f801991011681019081106001600160401b0382111761080d57604052565b604051906108cb60408361089b565b565b604051906108cb6101208361089b565b604051906108cb6101008361089b565b604051906108cb60a08361089b565b604051906108cb60e08361089b565b6001600160401b03811161080d57601f01601f191660200190565b9291926109328261090b565b91610940604051938461089b565b82948184528183011161038a578281602093845f960137010152565b9080601f8301121561038a5781602061097793359101610926565b90565b8015150361038a57565b3461038a57604036600319011261038a576004356001600160401b03811161038a576109b490369060040161095c565b602435906109c18261097a565b610a00604051602081845180838701835e81017f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab50281520301902061290c565b918251918215610a8a575080610a5c575b610a2057602090604051908152f35b602082015163d2b143bd60e01b5f526004527f000000000000000000000000000000000000000000000000000000000000000060245260445b5ffd5b5060208201517f00000000000000000000000000000000000000000000000000000000000000001415610a11565b6040516372943a3560e11b8152908190610aa7906004830161185d565b0390fd5b6001600160401b0381160361038a57565b91909160408184031261038a5760405190610ad6826107f2565b819381356001600160401b03811161038a5782019181601f8401121561038a57610b096020939283858095359101610926565b84520135910152565b3461038a5761010036600319011261038a57600435602435610b3381610aab565b60443591610b408361038e565b608435606435610b4f8261038e565b60a43560c4356001600160401b03811161038a57610b71903690600401610abc565b9060e435303303610cf45780610cc657506001600160401b035f516020614c635f395f51905f525460801c164301804311610cc1575f516020614c435f395f51905f5297610c31610c8f946001600160a01b039485610cbc99610c3f96995b604051988997600c60208a01527f000000000000000000000000000000000000000000000000000000000000000060408a01528c60608a015216608088015260a08701521660c085015260e0840152610100808401526101208301906132b8565b03601f19810183528261089b565b610c8a86610c74875f527f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab50860205260405f2090565b906001600160401b03165f5260205260405f2090565b612aee565b604051938493846001600160401b036060929594936080830196600c845260208401521660408201520152565b0390a1005b612a2c565b5f516020614c435f395f51905f5297610c31610c8f946001600160a01b039485610cbc99610c3f9699610bd0565b63f126bc3960e01b5f523360045260245ffd5b3461038a57604036600319011261038a57600435602435610d278161038e565b336001600160a01b03821603610d40576107dc916132d8565b63334bd91960e11b5f5260045ffd5b9181601f8401121561038a578235916001600160401b03831161038a576020838186019501011161038a57565b604060031982011261038a57600435906001600160401b03821161038a57610da691600401610d4f565b909160243590565b3461038a577faa7c25c0a2fa0504f0459e7bfb6a9b089dc49e699e441ca56495ac5ea585c663610df5610dfa610de336610d7c565b939190610dee612fad565b3691610926565b61292a565b805f527f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab50a6020528160405f2055610cbc6040519283928360209093929193604081019481520152565b3461038a57604036600319011261038a5760043560243590610e9b610e8f7f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab506546001600160a01b031690565b6001600160a01b031690565b6040805163585dc22760e01b815246600482015293919084602481845afa908115610f93575f945f92610f98575b506040805163585dc22760e01b81526004810186905291829060249082905afa928315610f9357610f5195610f41955f935f96610f55575b5060ff610f3681925f527f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab50a60205260405f2090565b5496169416916133d9565b6040519081529081906020820190565b0390f35b60ff919650610f369450610f81829160403d604011610f8c575b610f79818361089b565b810190612bc7565b979095509150610f01565b503d610f6f565b61284f565b909450610fb4915060403d604011610f8c57610f79818361089b565b90935f610ec9565b3461038a575f36600319011261038a5760206001600160a01b037f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab5005416604051908152f35b3461038a57602036600319011261038a576001600160a01b036004356110268161038e565b61102e612fad565b1680156110b7576020816104557ffe5f3042116e4fdbf3b16edf4d08461edce145923ccf07b23f9e80a0fa7ac8c9936001600160a01b03166001600160a01b03197f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab5035416177f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab50355565b604051636bc37c5f60e11b815260206004820152601060248201527f696373303453656e645061636b65745f000000000000000000000000000000006044820152606490fd5b3461038a57602036600319011261038a576004355f527f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab50a602052602060405f2054604051908152f35b3461038a57602036600319011261038a576004355f527f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab50b602052602060405f2054604051908152f35b5f36600319011261038a576111a2612fad565b7feaed9ac791ffc98eefecab801a57f40082eff3e35ae776a81f0e84a7c5b9359d6020604051348152a1005b3461038a57602036600319011261038a577f7278395c4adca5050cd2f9391794af18291a481298288adf307861a292673f7b60206001600160a01b036004356112168161038e565b61121e612fad565b611227816130ce565b16806001600160a01b03197f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab5005416177f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab50055604051908152a1005b3461038a575f36600319011261038a5760206040517feb69226cf0509417098bfe1b20d96915c3ef74ab4650312921414e1bace0790c8152f35b3461038a575f36600319011261038a5760206001600160401b035f516020614c635f395f51905f525416604051908152f35b3461038a5761010036600319011261038a5760243560043561130e82610aab565b6044356001600160401b03811161038a5761132d90369060040161095c565b9160643560843561133d8161038e565b60a4359160c435956001600160401b03871161038a576113646107dc973690600401610abc565b9460e43596612be1565b3461038a575f36600319011261038a5760206040516001600160401b038152f35b3461038a57602036600319011261038a576001600160a01b036004356113b48161038e565b6113bc612fad565b168015611445576020816104557fb39d5e60d8706e36001ad20f40fca4f1202bbb7fa6b64691be711f08b7fffb1e936001600160a01b03166001600160a01b03197f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab5065416177f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab50655565b604051636bc37c5f60e11b815260206004820152601160248201527f746f6b656e50726963654f7261636c655f0000000000000000000000000000006044820152606490fd5b3461038a5761010036600319011261038a576004356024356114ac81610aab565b608435916044356064356114bf8561038e565b60a4359460c4359260e435303303610cf457806115ad57506001600160401b035f516020614c635f395f51905f525460401c16430193844311610cc1575f516020614c435f395f51905f52976001600160a01b0361158094610cbc97965b60405195600260208801527f00000000000000000000000000000000000000000000000000000000000000006040880152886060880152608087015260a08601521660c084015260e08301526101008201526101008152610c3f6101208261089b565b604051938493846001600160401b0360609295949360808301966002845260208401521660408201520152565b935f516020614c435f395f51905f52976001600160a01b0361158094610cbc979661151d565b3461038a577f2424c88ba4823b14bd48e2423877fd5c83f82a45d223ddc7ed5ba3abdcabfe35610df5611608610de336610d7c565b805f527f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab50b6020528160405f2055610cbc6040519283928360209093929193604081019481520152565b3461038a576101c036600319011261038a5760243560043561167282610aab565b604435916064356084356116858161038e565b60c03660a319011261038a576040519061169e82610812565b60a435825260c435602083015260e43560408301526101043560608301526101243560808301526101443560a0830152610164359261018435966001600160401b03881161038a576116f76107dc983690600401610abc565b956101a43597612d15565b3461038a575f36600319011261038a5760206001600160401b035f516020614c635f395f51905f525460801c16604051908152f35b3461038a57604036600319011261038a57602060ff61178a60243560043561175e8261038e565b5f525f516020614c835f395f51905f52845260405f20906001600160a01b03165f5260205260405f2090565b54166040519015158152f35b3461038a577f57a40edbcd7bc9b92c91547cc934f84b26b8cb55f6757dc009ab90c8814b6c4c60606117c736610d7c565b90809392916117d4612fad565b80604051838582376020818581017f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab5028152030190205560405194859360408552816040860152858501375f8383018501526020830152601f01601f19168101030190a1005b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b906020610977928181520190611839565b3461038a57604036600319011261038a576118d160243560043561189182610aab565b5f527f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab50860205260405f20906001600160401b03165f5260205260405f2090565b604051905f908054906118e382612a5d565b80855291600181169081156119575750600114611917575b610f518461190b8186038261089b565b6040519182918261185d565b5f90815260208120939250905b80821061193d5750909150810160200161190b826118fb565b919260018160209254838588010152019101909291611924565b60ff191660208087019190915292151560051b8501909201925061190b91508390506118fb565b3461038a5760a036600319011261038a5760043560243561199e81610aab565b604435916119ab8361038e565b60643592608435303303610cf45780611a8257506001600160401b035f516020614c635f395f51905f525460801c16430193844311610cc157611a55610cbc925f516020614c435f395f51905f5296925b6001600160a01b0360405192600b60208501527f0000000000000000000000000000000000000000000000000000000000000000604085015285606085015216608083015260a082015260a08152610c3f60c08261089b565b604051938493846001600160401b036060929594936080830196600b845260208401521660408201520152565b5f516020614c435f395f51905f5294610cbc92611a55916119fc565b3461038a575f36600319011261038a5760206040515f8152f35b608036600319011261038a576004356001600160401b03811161038a57611ae3903690600401610d4f565b6024356044359260643591611af78361038e565b611aff6134bb565b6001600160a01b03831615611be957611b178161285a565b906001600160a01b036040611b65611b38611b33368a89610926565b61299a565b82516388cb0df760e01b815260048101829052602481018b905290959093849283915f9183906044820190565b0393165af18015610f9357611bb097611baa93611b89935f93611bb8575b5061353b565b92611b926108bc565b95611b9b612f36565b87525f60208801523691610926565b9061360a565b6107dc613516565b611bdb91935060403d604011611be2575b611bd3818361089b565b810190612f0e565b915f611b83565b503d611bc9565b604051636bc37c5f60e11b815260206004820152600860248201527f726566756e64546f0000000000000000000000000000000000000000000000006044820152606490fd5b3461038a575f36600319011261038a5760206001600160a01b037f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab5055416604051908152f35b3461038a575f36600319011261038a5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461038a575f36600319011261038a5760206001600160a01b037f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab5015416604051908152f35b3461038a57604036600319011261038a576004356001600160401b03811161038a57611d23903690600401610d4f565b60243590611d3082610aab565b611d386134bb565b611d46611b33368386610926565b92611d84611d7f84610c74875f527f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab50860205260405f2090565b612e70565b938451156121de57611dc9611dc485610c74845f527f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab50860205260405f2090565b612f4a565b602085015160ff811660018103611e4c57505050611de9611bb09461465f565b9060408201611df8815161390a565b5193611e026108bc565b945f865260208601526060830151608084015190611e2a60a08601516001600160a01b031690565b92611e4760c08701519561010060e0890151980151983691610926565b6148b4565b93949360058103611eb757505050611e66611eb294614379565b906040820192611e76845161390a565b6060830151608084015191611ead611e9860a08701516001600160a01b031690565b9460e060c08801519701519751983691610926565b614431565b611bb0565b93949360028103611f2d57505050611ed1611eb294614090565b9060408201611ee0815161390a565b5193611eea6108bc565b945f865260208601526060830151608084015191611f28611f1560a08701516001600160a01b031690565b9460e060c0880151970151973691610926565b61413e565b939493919291600a8103611f99575050611f49611eb295613f94565b916040830193611f59855161390a565b60608401516001600160a01b031691611f9460808601519460c0611f8760a08901516001600160a01b031690565b9701519751983691610926565b613cda565b9295939492600b810361215a5750505050611fb390613e91565b9160408301611fc2815161390a565b60808401606081517f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab50c548082105f146121525750955b01915f80808089612016610e8f610e8f8a516001600160a01b031690565b5af1612020612f7e565b50156120bb5750519384810361203b575b5050505050611bb0565b7f5afe1f9e8e235e19b1386610b4a07c2bf8e34b821a5d160891d4b6f92a88208c946120716120ae93516001600160a01b031690565b60405195869586916080936001600160401b036001600160a01b0392989796939860a0860199865216602085015216604083015260608201520152565b0390a15f80808080612031565b9392916120d1919550516001600160a01b031690565b9351925192303b1561038a57604051639ad0d78f60e01b815260048101929092526001600160401b039290921660248201526001600160a01b03939093166044840152606483015260848201525f8160a48183305af18015610f9357612138575b50611bb0565b806121465f61214c9361089b565b80610682565b5f612132565b905095611ff8565b9395929493600c036121c95750612173611eb29561384b565b916040830193612183855161390a565b60608401516001600160a01b0316906080850151926121c46121af60a08801516001600160a01b031690565b9560e060c08901519801519851993691610926565b613a10565b638d8e165760e01b5f5260ff1660045260245ffd5b6379f7973560e11b5f5260045ffd5b3461038a57604036600319011261038a576004356001600160a01b036024356122158161038e565b61221d612fad565b168015612298577fc41816115fa1bcec19c79512b6fbb5b88fe30c0036f40828b1a10609ec94348260408051848152836020820152a1814710612281575f80809381935af161226a612f7e565b501561227257005b63d6bda27560e01b5f5260045ffd5b504763cf47918160e01b5f5260045260245260445ffd5b604051636bc37c5f60e11b8152602060048201526002602482015261746f60f01b6044820152606490fd5b3461038a575f36600319011261038a5760206040517ffc37dbc4b77b0a9e098017fe20cac5f35a3b75421a51f54b2f6c481ab04e9bb18152f35b3461038a57606036600319011261038a577f36ef1a397a1489907109f07304e8baa0df2e6ce71edfbc4aae66fcf326caa9a260043561233b81610aab565b6024359061234882610aab565b610cbc60443561235781610aab565b61235f612fad565b5f516020614c635f395f51905f525477ffffffffffffffff000000000000000000000000000000008260801b16907fffffffffffffffff0000000000000000000000000000000000000000000000006001600160401b0386169116176fffffffffffffffff00000000000000008660401b1617175f516020614c635f395f51905f5255604051938493849160409194936001600160401b03809281606087019816865216602085015216910152565b3461038a57604036600319011261038a576107dc6024356004356124318261038e565b6124566107d2825f525f516020614c835f395f51905f52602052600160405f20015490565b6132d8565b3461038a575f36600319011261038a5760206001600160a01b037f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab5075416604051908152f35b3461038a57602036600319011261038a576001600160a01b036004356124c58161038e565b6124cd612fad565b168015612556576020816104557f73c3f3e9cc57ea7c73bbb79e9ceec0f5779e6de214de7bf12bf31c04931fe457936001600160a01b03166001600160a01b03197f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab5055416177f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab50555565b604051636bc37c5f60e11b815260206004820152600c60248201527f746f6b656e457363726f775f00000000000000000000000000000000000000006044820152606490fd5b3461038a5760e036600319011261038a576004356024356125bc81610aab565b604435916125c98361038e565b608435926064356125d98561038e565b60a4356001600160401b03811161038a576125f8903690600401610abc565b9460c435303303610cf457806126df57506001600160401b035f516020614c635f395f51905f525460801c16430195864311610cc157610c3f610cbc94610c316001600160a01b0393846126b2965f516020614c435f395f51905f529c985b604051978896600a60208901527f000000000000000000000000000000000000000000000000000000000000000060408901528b606089015216608087015260a08601521660c084015260e0808401526101008301906132b8565b604051938493846001600160401b036060929594936080830196600a845260208401521660408201520152565b610c3f610cbc94610c315f516020614c435f395f51905f52996001600160a01b036126b296819698612657565b3461038a57602036600319011261038a577fc469a4d43f73e4c5bac93c9a666c6e81e299061f1eb9c385e52f46fd5d5841fd602060043561274b612fad565b807f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab50c55604051908152a1005b3461038a575f36600319011261038a5760207f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab50c54604051908152f35b3461038a575f604036600319011261038a576024356001600160a01b036127e9600435836127e08161097a565b61282d5761285a565b1690813b1561038a575f91602483926040519485938492637fb6526560e01b8452151560048401525af18015610f9357612821575080f35b6107dc91505f9061089b565b612835612fad565b61285a565b9081602091031261038a57516109778161038e565b6040513d5f823e3d90fd5b7f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab5045460405163068bcd8d60e01b815260048101839052929190602090849060249082906001600160a01b03165afa928315610f93575f936128db575b506001600160a01b038316156128c95750565b630f24c65560e21b5f5260045260245ffd5b6128fe91935060203d602011612905575b6128f6818361089b565b81019061283a565b915f6128b6565b503d6128ec565b90604051612919816107f2565b602060018294805484520154910152565b9061296a604051602081855180838801835e81017f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab50281520301902061290c565b519182156129755750565b6040516372943a3560e11b815260206004820152908190610aa7906024830190611839565b906129da604051602081855180838801835e81017f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab50281520301902061290c565b805192831561297557506020018051907f0000000000000000000000000000000000000000000000000000000000000000809203612a16575050565b5163d2b143bd60e01b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b61271001908161271011610cc157565b91908201809211610cc157565b90600182811c92168015612a8b575b6020831014612a7757565b634e487b7160e01b5f52602260045260245ffd5b91607f1691612a6c565b818110612aa0575050565b5f8155600101612a95565b9190601f8111612aba57505050565b6108cb925f5260205f20906020601f840160051c83019310612ae4575b601f0160051c0190612a95565b9091508190612ad7565b91909182516001600160401b03811161080d57612b1581612b0f8454612a5d565b84612aab565b6020601f8211600114612b54578190612b459394955f92612b49575b50508160011b915f199060031b1c19161790565b9055565b015190505f80612b31565b601f19821690612b67845f5260205f2090565b915f5b818110612ba157509583600195969710612b89575b505050811b019055565b01515f1960f88460031b161c191690555f8080612b7f565b9192602060018192868b015181550194019201612b6a565b519060ff8216820361038a57565b919082604091031261038a57610977602083519301612bb9565b9493929196959095303303610cf45780612ce557506001600160401b035f516020614c635f395f51905f525416430193844311610cc1575f516020614c435f395f51905f5297610c31612cb394612c9094610c3f946001600160a01b03612ce09a995b604051988997600560208a01527f000000000000000000000000000000000000000000000000000000000000000060408a01528c60608a015261010060808a0152610120890190611839565b9460a08801521660c086015260e0850152601f19848303016101008501526132b8565b604051938493846001600160401b0360609295949360808301966005845260208401521660408201520152565b0390a1565b5f516020614c435f395f51905f5297610c31612cb394612c9094612ce0986001600160a01b03610c3f9699612c44565b95929190969497303303610cf45780612e4057506001600160401b035f516020614c635f395f51905f525416430190814311610cc157610c31612ce096612e1395612dfb5f516020614c435f395f51905f529c6001600160a01b03610c3f979a5b604051998a98600160208b01527f000000000000000000000000000000000000000000000000000000000000000060408b01528d60608b015260808a015260a08901521660c087015260e086019060a0809180518452602081015160208501526040810151604085015260608101516060850152608081015160808501520151910152565b6101a08401526101c0808401526101e08301906132b8565b604051938493846001600160401b0360609295949360808301966001845260208401521660408201520152565b90610c31612ce096612e1395612dfb5f516020614c435f395f51905f529c6001600160a01b03610c3f979a612d76565b9060405191825f825492612e8384612a5d565b8084529360018116908115612eec5750600114612ea8575b506108cb9250038361089b565b90505f9291925260205f20905f915b818310612ed05750509060206108cb928201015f612e9b565b6020919350806001915483858901015201910190918492612eb7565b9050602092506108cb94915060ff191682840152151560051b8201015f612e9b565b9081604091031261038a57602060405191612f28836107f2565b805183520151602082015290565b60405190612f4560208361089b565b5f8252565b5f90612f568154612a5d565b601f8111612f62575055565b81835260208320612f7b91601f0160051c810190612a95565b55565b3d15612fa8573d90612f8f8261090b565b91612f9d604051938461089b565b82523d5f602084013e565b606090565b335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff1615612fe557565b63e2517d3f60e01b5f52336004525f60245260445ffd5b335f9081527f2ee74b0e16fc94f9c442cf7b0193daa260d4782758f2d4d4c7d39a02b3a27b8e602052604090205460ff161561303457565b63e2517d3f60e01b5f52336004527ffc37dbc4b77b0a9e098017fe20cac5f35a3b75421a51f54b2f6c481ab04e9bb160245260445ffd5b805f525f516020614c835f395f51905f5260205260ff61309f3360405f20906001600160a01b03165f5260205260405f2090565b5416156130a95750565b63e2517d3f60e01b5f523360045260245260445ffd5b9081602091031261038a575190565b6001600160a01b031680156131c05760405163b148b0fd60e01b81527f00000000000000000000000000000000000000000000000000000000000000009190602081600481855afa908115610f93575f916131a1575b50820361312f575050565b9060206004926040519384809263b148b0fd60e01b82525afa908115610f9357610a59925f92613170575b5063d2b143bd60e01b5f52600452602452604490565b61319391925060203d60201161319a575b61318b818361089b565b8101906130bf565b908361315a565b503d613181565b6131ba915060203d60201161319a5761318b818361089b565b5f613124565b604051636bc37c5f60e11b815260206004820152600960248201527f66616c6c6261636b5f00000000000000000000000000000000000000000000006044820152606490fd5b805f525f516020614c835f395f51905f5260205260ff61323a8360405f20906001600160a01b03165f5260205260405f2090565b54166132b257805f525f516020614c835f395f51905f526020526132728260405f20906001600160a01b03165f5260205260405f2090565b805460ff1916600117905533916001600160a01b0316907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b906020806132cf8451604085526040850190611839565b93015191015290565b805f525f516020614c835f395f51905f5260205260ff61330c8360405f20906001600160a01b03165f5260205260405f2090565b5416156132b257805f525f516020614c835f395f51905f526020526133458260405f20906001600160a01b03165f5260205260405f2090565b805460ff1916905533916001600160a01b0316907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b604d8111610cc157600a0a90565b906127108202918083046127101490151715610cc157565b81810292918115918404141715610cc157565b81156133c5570490565b634e487b7160e01b5f52601260045260245ffd5b90939492919484156134755785811015613441578503948511610cc15761343061343b9361342a6134246134369561341f6134166109779b613382565b916001976133a8565b6133a8565b91612a40565b906133a8565b936133a8565b613390565b906133bb565b948503948511610cc15761343061343b9361342a6134246134369561341f61346b6109779b613382565b91600192976133a8565b604051634612b38f60e01b815260206004820152600d60248201527f737263546f6b656e5072696365000000000000000000000000000000000000006044820152606490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005c6135075760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005d565b633ee5aeb560e01b5f5260045ffd5b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005d565b91602091604051936002848601526040850152606084015280516080840152015160a082015260a0815261097760c08261089b565b908161012091031261038a576101006135876108cd565b918051835261359860208201612bb9565b602084015260408101516040840152606081015160608401526135bd60808201612bb9565b608084015260a081015160a084015260c081015160c084015260e081015160e0840152015161010082015290565b610977939260ff606093168252602082015281604082015201906132b8565b936136709461361d829461012094614ae9565b613651610e8f7f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab507546001600160a01b031690565b9060405180978194829363a68c985f60e01b84526002600485016135eb565b03915afa928315610f93575f936136ff575b50805151151590816136f2575b506136ac576136a65f6101006108cb940151612a50565b90614bdf565b60405163495279c560e11b815260206004820152600b60248201527f6473744f757465724761730000000000000000000000000000000000000000006044820152606490fd5b602091500151155f61368f565b6137229193506101203d8111613729575b61371a818361089b565b810190613570565b915f613682565b503d613710565b6040519061373d826107f2565b5f602083606081520152565b51906108cb8261038e565b9291926137608261090b565b9161376e604051938461089b565b82948184528183011161038a578281602093845f96015e010152565b91909160408184031261038a57604051906137a4826107f2565b819381516001600160401b03811161038a5782019181601f8401121561038a576137d76020939283858095519101613754565b84520151910152565b9190916101008184031261038a576137f781612bb9565b9260208201519260408301519260608101516138128161038e565b9260808201519260a08301516138278161038e565b9260c08101519260e08201516001600160401b03811161038a57610977920161378a565b6001600160a01b03806138fd6138ad6138e79460405161386a8161082d565b5f81525f60208201525f60408201525f60608201525f60808201525f60a08201525f60c082015260e061389b613730565b910152602080825183010191016137e0565b99969a9391956138cc6138c39a9496929a6108dd565b60ff909d168d52565b60208c015260408b0152166001600160a01b03166060890152565b6080870152166001600160a01b031660a0850152565b60c083015260e082015290565b8043116139145750565b6361f3be2f60e11b5f5260045260245ffd5b60ff60029116019060ff8211610cc157565b90926001600160a01b03613959610977969495608085526080850190611839565b9416602083015260408201526060818403910152611839565b989796936001600160a01b0360e097946001600160401b0382956139c299958e521660208d01521660408b015260608a015216608088015260a087015261010060c08701526101008601906132b8565b930152565b97969592936001600160a01b036139c2956001600160401b03829560c099958d521660208c01521660408a0152606089015216608087015260e060a087015260e08601906132b8565b97949597969096939291935f877f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab50c54878b8d8381105f14613c6d5793505050505b5f8080806001600160a01b038d1694855af1613a6b612f7e565b5015613c64575b8351908151151580613c5a575b613bec575b505060ff16905060018103613b245750505050613aad610e8f610e8f306001600160a01b031690565b91823b1561038a57604051639ad0d78f60e01b815260048101959095526001600160401b0390911660248501526001600160a01b03909216604484015260648301939093526084820152905f90829081838160a481015b03925af18015610f9357613b16575b50565b806121465f6108cb9361089b565b92979496919594909260028103613b6f5750613b429050610e8f3081565b93843b1561038a575f968793613b04926040519a8b998a98899763e4b76cc160e01b8952600489016139c7565b9296949092600314613b86575b5050505050505050565b613b90610e8f3081565b94853b1561038a575f978894613bbd936040519b8c9a8b998a9863320dd5e360e01b8a5260048a01613972565b03925af18015610f9357613bd8575b80808080808080613b7c565b806121465f613be69361089b565b5f613bcc565b602085015193813b1561038a5760ff94875f80948b94613c226040519889978896879463eb2659c960e01b865260048601613938565b0393f19081613c46575b50613c4157613c3a90613926565b5f80613a84565b613c3a565b806121465f613c549361089b565b5f613c2c565b50893b1515613a7f565b60019150613a72565b83613cd2917f5afe1f9e8e235e19b1386610b4a07c2bf8e34b821a5d160891d4b6f92a88208c959660405195869586916080936001600160401b036001600160a01b0392989796939860a0860199865216602085015216604083015260608201520152565b0390a1613a51565b959095939291935f908251908151151580613e87575b613e0c575b505060ff1660018103613d785750505050613d1c610e8f610e8f306001600160a01b031690565b90813b1561038a57604051639ad0d78f60e01b815260048101949094526001600160401b031660248401526001600160a01b0390911660448301525f606483018190526084830193909352909190829081838160a48101613b04565b6002819897929396959498145f14613d955750613b42610e8f3081565b600314613da6575b50505050505050565b613db0610e8f3081565b93843b1561038a575f96879384613dde936040519b8c9a8b998a9863320dd5e360e01b8a5260048a01613972565b03925af18015610f9357613df8575b808080808080613d9d565b806121465f613e069361089b565b5f613ded565b6001600160a01b038816906020850151823b1561038a57865f80948a94613e496040519889978896879463eb2659c960e01b865260048601613938565b0393f19081613e73575b50613e6b575060ff613e645f613926565b905f613cf5565b60ff90613e64565b806121465f613e819361089b565b5f613e53565b50873b1515613cf0565b5f6080604051613ea081610849565b828152826020820152826040820152826060820152015260a08180518101031261038a57613ed060208201612bb9565b90613f2a6001600160a01b03604083015192606081015160a0608083015192613ef88461038e565b015194613f0f613f066108ed565b60ff9098168852565b60208701526040860152166001600160a01b03166060840152565b608082015290565b9060e08282031261038a57613f4682612bb9565b926020830151926040810151926060820151613f618161038e565b9260808301519260a0810151613f768161038e565b9260c08201516001600160401b03811161038a57610977920161378a565b61402761403d6001600160a01b03613ff08194604051613fb381610864565b5f81525f60208201525f60408201525f60608201525f60808201525f60a082015260c0613fde613730565b91015260208082518301019101613f32565b989390959992919461400c6140036108fc565b60ff909c168c52565b60208b015260408a0152166001600160a01b03166060880152565b6080860152166001600160a01b031660a0840152565b60c082015290565b91908261010091031261038a5761405b82612bb9565b9160208101519160408201519160608101519160808201519160a08101516140828161038e565b9160e060c083015192015190565b6138fd6140e66001600160a01b03925f60e06040516140ae8161082d565b8281528260208201528260408201528260608201528260808201528260a08201528260c0820152015260208082518301019101614045565b97956141046140fb9a9692989a9593956108dd565b60ff909b168b52565b60208a0152604089015260608801526080870152166001600160a01b031660a0850152565b9081602091031261038a57516109778161097a565b61414f90979491939795929561299a565b906141598661285a565b6001600160a01b035f9116846020848c6141c48d6141778d51151590565b90604051968795869563606e503760e11b87528d60048801949160a094919796936001600160a01b039160c088019988526020880152166040860152606085015260808401521515910152565b03815f865af15f91816142e1575b506142d95750865161426d575b505b156141f0575050505050505050565b60206141fc610e8f3081565b950151853b1561038a575f978894613bbd936040519b8c9a8b998a98637788276b60e01b8a5260048a0194909897969360e096936001600160401b036001600160a01b039461010089019c89521660208801526040870152606086015216608084015260a083015260c08201520152565b803b1561038a57604051630b81d85f60e41b815260048101859052602481018b90526001600160a01b038416604482015260648101869052608481018a9052905f90829060a490829084905af18015610f9357156141df57806121465f6142d39361089b565b5f6141df565b9150506141e1565b61430491925060203d60201161430b575b6142fc818361089b565b810190614129565b905f6141d2565b503d6142f2565b9190916101008184031261038a5761432981612bb9565b9260208201519260408301519260608101516001600160401b03811161038a57810183601f8201121561038a578381602061436693519101613754565b9260808201519261382760a08401613749565b6138fd6140e66001600160a01b03926040516143948161082d565b5f81525f60208201525f60408201526060808201525f60808201525f60a08201525f60c082015260e06143c5613730565b91015260208082518301019101614312565b98979692946144136139c2966001600160401b0360e099956001600160a01b03958e521660208d015261010060408d01526101008c0190611839565b9460608b015216608089015260a088015286820360c08801526132b8565b909296939491946144418261299a565b91614476610e8f7f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab505546001600160a01b031690565b803b1561038a57604051634b91ad0f60e11b81526001600160a01b0384166004820152602481018b9052905f908290604490829084905af19081614593575b506144f257506144c5610e8f3081565b94853b1561038a575f978894613b04936040519b8c9a8b998a9863346c294b60e11b8a5260048a016143d7565b93909160049893959796506020614533610e8f7f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab505546001600160a01b031690565b604051637e062a3560e11b81529a8b9182905afa928315610f93576108cb995f94614569575b506001600160a01b031694613a10565b6001600160a01b0391945061458c9060203d602011612905576128f6818361089b565b9390614559565b806121465f6145a19361089b565b5f6144b5565b808203916101c0831261038a576145bd82612bb9565b9360208301519360408401519360608101519360808201519360c060a08401516145e68161038e565b9460bf19011261038a576040516145fc81610812565b60c0840151815260e0840151602082015261010084015160408201526101208401516060820152610140840151608082015261016084015160a082015292610180810151926101a08201516001600160401b03811161038a57610977920161378a565b61472b6146f06001600160a01b039260405161467a8161087f565b5f81525f60208201525f60408201525f60608201525f60808201525f60a08201526040516146a781610812565b5f81525f60208201525f60408201525f60608201525f60808201525f60a082015260c08201525f60e08201526101006146de613730565b910152602080825183010191016145a7565b98959097999491966147066140039594956108cd565b60208b015260408a015260608901526080880152166001600160a01b031660a0860152565b60c084015260e083015261010082015290565b919082604091031261038a57602082519201516109778161097a565b936001600160a01b03610120946147bd9398979461014088019988526020880152166040860152606085019060a0809180518452602081015160208501526040810151604085015260608101516060850152608081015160808501520151910152565b1515910152565b6001600160a01b036108cb9460609397969461012084019884526020840152166040820152019060a0809180518452602081015160208501526040810151604085015260608101516060850152608081015160808501520151910152565b999897946101a0979461489a948c60206001600160401b036139c29b976001600160a01b039784521691015260408d015260608c01521660808a015260a089019060a0809180518452602081015160208501526040810151604085015260608101516060850152608081015160808501520151910152565b6101608701526101c06101808701526101c08601906132b8565b969594929791976148c48861299a565b906148ce8161285a565b995f955f9b6001600160a01b03169b86516148e890151590565b6040516392c883fb60e01b8152908e908290819061490d90878f8a8d6004870161475a565b03815a6040945f91f190815f915f93614a43575b50614a3a57505086516149e3575b1561498e5750505060206004996040519a8b8092637e062a3560e11b82525afa928315610f93576108cb995f9461496c575b506020015197613a10565b602091945061498790823d8411612905576128f6818361089b565b9390614961565b9550979193969850985060206149b3610e8f610e8f979497306001600160a01b031690565b96015190863b1561038a575f988995613b04946040519c8d9b8c9a8b996384a00e5f60e01b8b5260048b01614822565b8c3b1561038a57815f8a8f86838a614a1160405197889687958694631c44c65160e11b8652600486016147c4565b03925af18015610f9357614a26575b5061492f565b806121465f614a349361089b565b5f614a20565b9850905061492f565b909250614a68915060403d604011614a6f575b614a60818361089b565b81019061473e565b915f614921565b503d614a56565b9081602091031261038a575161097781610aab565b906020614abd6109779694614ab06001600160401b039460c0875260c0870190611839565b9085820384870152611839565b9482815116604085015201511660608201526001600160401b03608082015260a0818403910152611839565b7f183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab503547f00000000000000000000000000000000000000000000000000000000000000009160ff8316916001600160a01b031690601f8311614bd05760209360405193614b5660408661089b565b8585528486019060203683378552525f614b6e6108bc565b938185528186860152614b976040519788968795869463ae4cd20160e01b865260048601614a8b565b03925af18015610f9357614ba85750565b613b139060203d602011614bc9575b614bc1818361089b565b810190614a76565b503d614bb7565b632cd44ac360e21b5f5260045ffd5b348211614c2b5781340391348311610cc1573403614bfb575050565b5f8080936001600160a01b038294165af1614c14612f7e565b5015614c1c57565b6303d6971360e41b5f5260045ffd5b506326ac465760e01b5f526004523460245260445ffdfe9a1dbdc6a392ad445a4c2a6048499bda676149c6e12cea512cfe4b582ebdd8b2183a6125c38840424c4a85fa12bab2ab606c4b6d0e7cc73c0c06ba5300eab50902dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a2646970667358221220cef37ca92c50e268c97665639105264a6c6569096463f12fb6c88a20c4dc21ad64736f6c634300081c0033000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000004746f6b6900000000000000000000000000000000000000000000000000000000