0 txs
3.2k calls
constructor
constructor(uint256 _minMarketCapacity)
functions
allowance
viewfunction allowance(address owner, address spender) view returns (uint256)
asset
viewfunction asset() view returns (address)
balanceOf
viewfunction balanceOf(address account) view returns (uint256)
convertToAssets
viewfunction convertToAssets(uint256 shares) view returns (uint256)
convertToShares
viewfunction convertToShares(uint256 assets) view returns (uint256)
decimals
viewfunction decimals() view returns (uint8)
EVault
viewfunction EVault() view returns (address)
exchangePrice
viewfunction exchangePrice() view returns (uint256)
getPrecison
viewfunction getPrecison() view returns (uint256)
getTokens
viewfunction getTokens() view returns (address[])
getVaultParams
viewfunction getVaultParams() view returns (tuple)
getVaultState
viewfunction getVaultState() view returns (tuple)
getWithdrawFee
viewfunction getWithdrawFee(uint256 _assetAmount) view returns (uint256 withdrawFee_)
lastExchangePrice
viewfunction lastExchangePrice() view returns (uint256)
MAX_POSITION_LIMIT
viewfunction MAX_POSITION_LIMIT() view returns (uint256)
maxDeposit
viewfunction maxDeposit(address) view returns (uint256 maxAssets_)
maxMint
viewfunction maxMint(address) view returns (uint256)
maxRedeem
viewfunction maxRedeem(address owner) view returns (uint256)
maxWithdraw
viewfunction maxWithdraw(address owner) view returns (uint256)
name
viewfunction name() view returns (string)
owner
viewfunction owner() view returns (address)
paused
viewfunction paused() view returns (bool)
positionLimit
viewfunction positionLimit(address) view returns (uint256)
previewDeposit
viewfunction previewDeposit(uint256 assets) view returns (uint256)
previewMint
viewfunction previewMint(uint256 shares) view returns (uint256)
previewRedeem
viewfunction previewRedeem(uint256 shares) view returns (uint256)
previewWithdraw
viewfunction previewWithdraw(uint256 assets) view returns (uint256)
remainingUpdateTime
viewfunction remainingUpdateTime() view returns (uint256)
rEUL
viewfunction rEUL() view returns (address)
revenue
viewfunction revenue() view returns (uint256)
revenueExchangePrice
viewfunction revenueExchangePrice() view returns (uint256)
strategies
viewfunction strategies() view returns (address[])
strategiesCount
viewfunction strategiesCount() view returns (uint256)
strategyAddress
viewfunction strategyAddress(uint256 _offset) view returns (address)
symbol
viewfunction symbol() view returns (string)
totalAssets
viewfunction totalAssets() view returns (uint256)
totalSupply
viewfunction totalSupply() view returns (uint256)
USD1
viewfunction USD1() view returns (address)
USDC
viewfunction USDC() view returns (address)
USDT
viewfunction USDT() view returns (address)
VERSION
viewfunction VERSION() view returns (string)
addToken
nonpayablefunction addToken(address _newToken)
approve
nonpayablefunction approve(address spender, uint256 value) returns (bool)
collectManagementFee
nonpayablefunction collectManagementFee()
collectRevenue
nonpayablefunction collectRevenue()
createStrategy
nonpayablefunction createStrategy(address _impl, bytes _initBytes, uint256 _positionLimit)
deposit
nonpayablefunction deposit(uint256 _assets, address _receiver) returns (uint256 shares_)
initialize
nonpayablefunction initialize(bytes _initBytes)
mint
nonpayablefunction mint(uint256 _shares, address _receiver) returns (uint256 assets_)
optionalDeposit
payablefunction optionalDeposit(address _token, uint256 _assets, address _receiver, address _referral) payable returns (uint256 shares_)
optionalRedeem
nonpayablefunction optionalRedeem(address _token, uint256 _shares, uint256 _cutPercentage, address _receiver, address _owner) returns (uint256 assetsAfterFee_)
pause
nonpayablefunction pause()
redeem
nonpayablefunction redeem(uint256, address, address) returns (uint256)
removeStrategy
nonpayablefunction removeStrategy(address _strategy)
removeToken
nonpayablefunction removeToken(address _token)
renounceOwnership
nonpayablefunction renounceOwnership()
requestRedeem
nonpayablefunction requestRedeem(uint256 _shares, address _token)
strategyAssets
nonpayablefunction strategyAssets(uint256 _offset) returns (uint256 totalAssets_)
totalStrategiesAssets
nonpayablefunction totalStrategiesAssets() returns (uint256 totalAssets_)
transfer
nonpayablefunction transfer(address to, uint256 value) returns (bool)
transferFrom
nonpayablefunction transferFrom(address from, address to, uint256 value) returns (bool)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
transferToStrategy
nonpayablefunction transferToStrategy(address _token, uint256 _amount, uint256 _strategyIndex)
underlyingTvl
nonpayablefunction underlyingTvl() returns (uint256)
unpause
nonpayablefunction unpause()
updateExchangePrice
nonpayablefunction updateExchangePrice() returns (uint256 newExchangePrice, uint256 newRevenue)
updateExitFeeRate
nonpayablefunction updateExitFeeRate(uint256 _newExitFeeRate)
updateFeeReceiver
nonpayablefunction updateFeeReceiver(address _newFeeReceiver)
updateManagementFee
nonpayablefunction updateManagementFee(uint256 _newManagementFeeRate)
updateManagementFeeClaimPeriod
nonpayablefunction updateManagementFeeClaimPeriod(uint256 _newmanagementFeeClaimPeriod)
updateMarketCapacity
nonpayablefunction updateMarketCapacity(uint256 _newCapacityLimit)
updateMaxPriceUpdatePeriod
nonpayablefunction updateMaxPriceUpdatePeriod(uint256 _newMaxPriceUpdatePeriod)
updateRebalancer
nonpayablefunction updateRebalancer(address _newRebalancer)
updateRedeemOperator
nonpayablefunction updateRedeemOperator(address _newRedeemOperator)
updateRevenueRate
nonpayablefunction updateRevenueRate(uint256 _newRevenueRate)
updateStrategyLimit
nonpayablefunction updateStrategyLimit(uint256 _offset, uint256 _newPositionLimit)
withdraw
nonpayablefunction withdraw(uint256, address, address) returns (uint256)
events
AddToken
event AddToken(address token)
Approval
event Approval(address indexed owner, address indexed spender, uint256 value)
CollectManagementFee
event CollectManagementFee(uint256 assets)
CollectRevenue
event CollectRevenue(uint256 revenue)
CreateStrategy
event CreateStrategy(address strategy, address impl)
Deposit
event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares)
Initialized
event Initialized(uint64 version)
OptionalDeposit
event OptionalDeposit(address caller, address token, uint256 assets, address receiver, address referral)
OptionalRedeem
event OptionalRedeem(address token, uint256 shares, address receiver, address owner)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
Paused
event Paused(address account)
RemoveStrategy
event RemoveStrategy(address strategy)
RemoveToken
event RemoveToken(address token)
RequestRedeem
event RequestRedeem(address user, uint256 shares, address token)
Transfer
event Transfer(address indexed from, address indexed to, uint256 value)
TransferToStrategy
event TransferToStrategy(address token, uint256 amount, uint256 strategyIndex)
Unpaused
event Unpaused(address account)
UpdateExchangePrice
event UpdateExchangePrice(uint256 newExchangePrice, uint256 newRevenue)
UpdateExitFeeRate
event UpdateExitFeeRate(uint256 oldExitFeeRate, uint256 newExitFeeRate)
UpdateFeeReceiver
event UpdateFeeReceiver(address oldFeeReceiver, address newFeeReceiver)
UpdateManagementFee
event UpdateManagementFee(uint256 oldManagementFee, uint256 newManagementFee)
UpdateManagementFeeClaimPeriod
event UpdateManagementFeeClaimPeriod(uint256 oldManagementFeeClaimPeriod, uint256 newManagementFeeClaimPeriod)
UpdateMarketCapacity
event UpdateMarketCapacity(uint256 oldCapacityLimit, uint256 newCapacityLimit)
UpdateMaxPriceUpdatePeriod
event UpdateMaxPriceUpdatePeriod(uint256 oldMaxPriceUpdatePeriod, uint256 newMaxPriceUpdatePeriod)
UpdateOperator
event UpdateOperator(address oldOperator, address newOperator)
UpdateRebalancer
event UpdateRebalancer(address oldRebalancer, address newRebalancer)
UpdateRedeemOperator
event UpdateRedeemOperator(address oldRedeemOperator, address newRedeemOperator)
UpdateRevenueRate
event UpdateRevenueRate(uint256 oldRevenueRate, uint256 newRevenueRate)
UpdateStrategyLimit
event UpdateStrategyLimit(uint256 oldLimit, uint256 newLimit)
UpdateUnbackedMinter
event UpdateUnbackedMinter(address oldUnbackedMinter, address newUnbackedMinter)
Withdraw
event Withdraw(address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares)
errors
AddressEmptyCode
error AddressEmptyCode(address target)
AddressInsufficientBalance
error AddressInsufficientBalance(address account)
CallerNotRebalancer
error CallerNotRebalancer()
EnforcedPause
error EnforcedPause()
ERC20InsufficientAllowance
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed)
ERC20InsufficientBalance
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed)
ERC20InvalidApprover
error ERC20InvalidApprover(address approver)
ERC20InvalidReceiver
error ERC20InvalidReceiver(address receiver)
ERC20InvalidSender
error ERC20InvalidSender(address sender)
ERC20InvalidSpender
error ERC20InvalidSpender(address spender)
ERC4626ExceededMaxDeposit
error ERC4626ExceededMaxDeposit(address receiver, uint256 assets, uint256 max)
ERC4626ExceededMaxMint
error ERC4626ExceededMaxMint(address receiver, uint256 shares, uint256 max)
ERC4626ExceededMaxRedeem
error ERC4626ExceededMaxRedeem(address owner, uint256 shares, uint256 max)
ERC4626ExceededMaxWithdraw
error ERC4626ExceededMaxWithdraw(address owner, uint256 assets, uint256 max)
ExitFeeRateTooHigh
error ExitFeeRateTooHigh()
ExpectedPause
error ExpectedPause()
FailedInnerCall
error FailedInnerCall()
IncorrectState
error IncorrectState()
InvalidAdmin
error InvalidAdmin()
InvalidAsset
error InvalidAsset()
InvalidClaimTime
error InvalidClaimTime()
InvalidFeeReceiver
error InvalidFeeReceiver()
InvalidInitialization
error InvalidInitialization()
InvalidLimit
error InvalidLimit()
InvalidOperator
error InvalidOperator()
InvalidRebalancer
error InvalidRebalancer()
InvalidRedeemOperator
error InvalidRedeemOperator()
InvalidUnderlyingToken
error InvalidUnderlyingToken()
ManagementFeeClaimPeriodTooShort
error ManagementFeeClaimPeriodTooShort()
ManagementFeeRateTooHigh
error ManagementFeeRateTooHigh()
MarketCapacityTooLow
error MarketCapacityTooLow()
MathOverflowedMulDiv
error MathOverflowedMulDiv()
NotInitializing
error NotInitializing()
NotSupportedYet
error NotSupportedYet()
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
PriceNotUpdated
error PriceNotUpdated()
PriceUpdatePeriodTooLong
error PriceUpdatePeriodTooLong()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
RevenueFeeRateTooHigh
error RevenueFeeRateTooHigh()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
UnSupportedOperation
error UnSupportedOperation()
UnsupportedToken
error UnsupportedToken()
WithdrawZero
error WithdrawZero()
creation bytecode
0x60e0604052348015600e575f80fd5b50604051615a2d380380615a2d833981016040819052602b916043565b670de0b6b3a7640000608081905260a05260c0526059565b5f602082840312156052575f80fd5b5051919050565b60805160a05160c0516159876100a65f395f611afd01525f611c2801525f8181610c5b01528181610d50015281816116ab015281816117070152818161178a01526126cf01526159875ff3fe608060405260043610610418575f3560e01c80638456cb5911610227578063ba08765211610134578063d905777e116100b3578063ed14d17e11610078578063ed14d17e14610ca6578063ef8b30f714610b9e578063f2fde38b14610cba578063f4ad878814610cd9578063ffa1ad7414610cee575f80fd5b8063d905777e14610bfb578063d9f9027f14610c1a578063dd62ed3e14610c2e578063e3ea7c6a14610c4d578063e672243414610c7f575f80fd5b8063c63d75b6116100f9578063c63d75b614610b5f578063c69bebe414610b7f578063c6e6f59214610b9e578063ce96cb7714610bbd578063d48bfca714610bdc575f80fd5b8063ba08765214610ab3578063ba8bfa2a14610ad2578063bf6590a414610af1578063c0587a9514610b05578063c54e44eb14610b38575f80fd5b8063a7b73254116101c0578063b046a44911610185578063b046a44914610a2b578063b0caa89114610a4a578063b2db983a14610a75578063b3d7f6b914610a94578063b460af9414610ab3575f80fd5b8063a7b7325414610986578063a7c60f8c146109a5578063a9059cbb146109cc578063aa6ca808146109eb578063ad35530b14610a0c575f80fd5b80638456cb59146108a757806388bb4f60146108bb57806389a30271146108dc5780638da5cb5b1461090357806394bf804d1461091757806395d89b411461093657806398e1862c1461094a5780639c016ffd1461095e5780639e65741e14610972575f80fd5b80633b0426db116103255780634b59b82e116102be57806370a082311161028357806370a0823114610817578063715018a6146108365780637a825e071461084a5780637f6c81b7146108695780638152cd1814610888575f80fd5b80634b59b82e146107a65780634cdad506146104a05780635c975abb146107c55780635fa7b584146107d95780636e553f65146107f8575f80fd5b80633b0426db146106685780633bfaa7e31461067c5780633c5280e4146106a55780633e9491a2146106c45780633f4ba83a146106d8578063402d267d146106ec578063439fab911461070b578063443863211461072a5780634a8c110a14610751575f80fd5b806318160ddd116103b157806329c23e4a1161037657806329c23e4a146105d0578063313ce567146105ef57806332507a5f14610615578063340691571461062857806338d52e0f14610647575f80fd5b806318160ddd1461054b57806323b872dd1461055f5780632489f7f71461057e57806325bd414214610592578063266f8dc9146105b1575f80fd5b806301e1d11414610423578063030d624a1461044a57806306fdde031461046b578063079c3b881461048c57806307a2d13a146104a0578063095ea7b3146104bf5780630a28a477146104ee578063107703ab1461050d578063175188e81461052c575f80fd5b3661041f57005b5f80fd5b34801561042e575f80fd5b50610437610d1c565b6040519081526020015b60405180910390f35b348015610455575f80fd5b50610469610464366004613ffb565b610d93565b005b348015610476575f80fd5b5061047f610dfe565b6040516104419190614040565b348015610497575f80fd5b50610437610e9c565b3480156104ab575f80fd5b506104376104ba366004613ffb565b611042565b3480156104ca575f80fd5b506104de6104d936600461406d565b611053565b6040519015158152602001610441565b3480156104f9575f80fd5b50610437610508366004613ffb565b61106a565b348015610518575f80fd5b50610469610527366004614095565b611076565b348015610537575f80fd5b506104696105463660046140bf565b611172565b348015610556575f80fd5b5061043761125b565b34801561056a575f80fd5b506104de6105793660046140d8565b611264565b348015610589575f80fd5b50610437611289565b34801561059d575f80fd5b506104696105ac366004613ffb565b611293565b3480156105bc575f80fd5b506104696105cb366004613ffb565b6112fe565b3480156105db575f80fd5b506104376105ea366004613ffb565b61136a565b3480156105fa575f80fd5b50610603611387565b60405160ff9091168152602001610441565b610437610623366004614111565b6113b0565b348015610633575f80fd5b50610469610642366004613ffb565b61155e565b348015610652575f80fd5b5061065b6115cb565b604051610441919061415b565b348015610673575f80fd5b506104376115e5565b348015610687575f80fd5b50610690611618565b60408051928352602083019190915201610441565b3480156106b0575f80fd5b506104696106bf366004613ffb565b6118ce565b3480156106cf575f80fd5b50601254610437565b3480156106e3575f80fd5b5061046961193b565b3480156106f7575f80fd5b506104376107063660046140bf565b61194d565b348015610716575f80fd5b506104696107253660046141b3565b611963565b348015610735575f80fd5b5061065b738d0d000ee44948fc98c9b98a4fa4921476f08b0d81565b34801561075c575f80fd5b50610765611e1c565b60405161044191905f60a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b3480156107b1575f80fd5b5061065b6107c0366004613ffb565b611e7e565b3480156107d0575f80fd5b506104de611e89565b3480156107e4575f80fd5b506104696107f33660046140bf565b611e9d565b348015610803575f80fd5b50610437610812366004614095565b611ee0565b348015610822575f80fd5b506104376108313660046140bf565b611fb1565b348015610841575f80fd5b50610469611fda565b348015610855575f80fd5b506104696108643660046140bf565b611feb565b348015610874575f80fd5b50610469610883366004613ffb565b612083565b348015610893575f80fd5b506104696108a23660046141f1565b6120ee565b3480156108b2575f80fd5b5061046961219c565b3480156108c6575f80fd5b506108cf6121f6565b6040516104419190614211565b3480156108e7575f80fd5b5061065b738ac76a51cc950d9822d68b83fe1ad97b32cd580d81565b34801561090e575f80fd5b5061065b612440565b348015610922575f80fd5b50610437610931366004614095565b612468565b348015610941575f80fd5b5061047f6124b2565b348015610955575f80fd5b50601154610437565b348015610969575f80fd5b506104696124ce565b34801561097d575f80fd5b50601054610437565b348015610991575f80fd5b506104376109a036600461431b565b6125b8565b3480156109b0575f80fd5b5061065b735e13d41913adf18bb2acae34228e8d21f3c2f2eb81565b3480156109d7575f80fd5b506104de6109e636600461406d565b6127a5565b3480156109f6575f80fd5b506109ff6127b2565b604051610441919061436e565b348015610a17575f80fd5b50610469610a263660046143ba565b6127be565b348015610a36575f80fd5b50610469610a453660046140bf565b612892565b348015610a55575f80fd5b50610437610a643660046140bf565b60026020525f908152604090205481565b348015610a80575f80fd5b50610437610a8f366004613ffb565b61292d565b348015610a9f575f80fd5b50610437610aae366004613ffb565b612998565b348015610abe575f80fd5b50610437610acd36600461440f565b6129a4565b348015610add575f80fd5b50610469610aec366004614448565b6129be565b348015610afc575f80fd5b50610437612ce2565b348015610b10575f80fd5b507f4995646f72fa9a270ffc094641ab616ce576b2e3eab25eaf05c15caa4f0e595d5c610437565b348015610b43575f80fd5b5061065b7355d398326f99059ff775485246999027b319795581565b348015610b6a575f80fd5b50610437610b793660046140bf565b505f1990565b348015610b8a575f80fd5b50610469610b993660046140bf565b612d97565b348015610ba9575f80fd5b50610437610bb8366004613ffb565b612e2f565b348015610bc8575f80fd5b50610437610bd73660046140bf565b612e3a565b348015610be7575f80fd5b50610469610bf63660046140bf565b612e4d565b348015610c06575f80fd5b50610437610c153660046140bf565b612eb7565b348015610c25575f80fd5b506109ff612ec1565b348015610c39575f80fd5b50610437610c48366004614478565b612ecc565b348015610c58575f80fd5b507f0000000000000000000000000000000000000000000000000000000000000000610437565b348015610c8a575f80fd5b5061065b73c41f2ba7102e9f9f2d603eb951f955ae205ed27281565b348015610cb1575f80fd5b50610469612f06565b348015610cc5575f80fd5b50610469610cd43660046140bf565b612f89565b348015610ce4575f80fd5b5061043761271081565b348015610cf9575f80fd5b5061047f604051806040016040528060038152602001620312e360ec1b81525081565b6009546014545f9190610d2f90426144b4565b1115610d4e57604051631f4bcb2b60e01b815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000610d7761125b565b601054610d8491906144c7565b610d8e91906144f2565b905090565b610d9b612fc6565b6004811115610dbd576040516309aa66eb60e01b815260040160405180910390fd5b60075460408051918252602082018390527f29b9d7a7d8a7a3ac22c295e4517723bc4e386eea60173e59e6da1dbd460cb409910160405180910390a1600755565b60605f610e09612ff8565b9050806003018054610e1a90614505565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4690614505565b8015610e915780601f10610e6857610100808354040283529160200191610e91565b820191905f5260205f20905b815481529060010190602001808311610e7457829003601f168201915b505050505091505090565b5f805f80610ea8611387565b90505f5b610eb6601561301c565b81101561101557610ec8601582613025565b92505f836001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610ef7919061415b565b602060405180830381865afa158015610f12573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f36919061453d565b90505f846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f999190614554565b90508360ff168160ff161115610fcf57610fb38482614574565b610fbe90600a61466d565b610fc890836144f2565b9150610fff565b8360ff168160ff161015610fff57610fe78185614574565b610ff290600a61466d565b610ffc90836144c7565b91505b611009828761467b565b95505050600101610eac565b505f61101f612ce2565b60125490915061102f858361467b565b61103991906144b4565b94505050505090565b5f61104d825f613030565b92915050565b5f3361106081858561306d565b5060019392505050565b5f61104d82600161307f565b61107e6130b3565b6110866130fd565b815f036110a657604051637ea773a960e01b815260040160405180910390fd5b600f546110be9033906001600160a01b031684613123565b600f546040516336c69b5d60e11b81526001600160a01b0390911690636d8d36ba906110f0903390869060040161468e565b5f604051808303815f87803b158015611107575f80fd5b505af1158015611119573d5f803e3d5ffd5b505060408051338152602081018690526001600160a01b0385168183015290517ff9fd31dd1a61b95c600dd5aa1a6330f6c5cbe70a39a660edc081daf217db3cfb9350908190036060019150a161116e613180565b5050565b61117a612fc6565b5f816001600160a01b03166308bb5fb06040518163ffffffff1660e01b81526004016020604051808303815f875af11580156111b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111dc919061453d565b11156111fb5760405163e9ec812960e01b815260040160405180910390fd5b6112055f826131a6565b506001600160a01b0381165f9081526002602052604080822091909155517fd3281a40d50ae838fe77dc627744037b8f0fc6a5711d66119a9b670c5cde41af9061125090839061415b565b60405180910390a150565b5f610d8e6131ba565b5f336112718582856131ce565b61127c858585613123565b60019150505b9392505050565b5f610d8e5f61301c565b61129b612fc6565b60788111156112bd5760405163f4d1caab60e01b815260040160405180910390fd5b600b5460408051918252602082018390527f394967f6fe403cda0905b23e81b928c5ca79107000b1404c6b3185442f05213c910160405180910390a1600b55565b611306612fc6565b6105dc81111561132957604051630674143f60e01b815260040160405180910390fd5b600a5460408051918252602082018390527f63058ed61801434ac6bfe39e74400bed7f3ba09b7cb6294092974450727eb753910160405180910390a1600a55565b600b545f906127109061137d90846144c7565b61104d91906144f2565b5f8061139161321e565b90505f81546113aa9190600160a01b900460ff166146a7565b91505090565b5f6113b96130b3565b6113c16130fd565b6113cc601586613242565b6113e95760405163350b944160e11b815260040160405180910390fd5b5f19840361145f576040516370a0823160e01b81526001600160a01b038616906370a082319061141d90339060040161415b565b602060405180830381865afa158015611438573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061145c919061453d565b93505b6114746001600160a01b038616333087613263565b5f61147e5f61194d565b9050808511156114b057838582604051633c8097d960e11b81526004016114a7939291906146c0565b60405180910390fd5b6114b985612e2f565b6014549092506114c990426144b4565b60095410156114eb57604051631f4bcb2b60e01b815260040160405180910390fd5b6114f584836132ca565b604080513381526001600160a01b03888116602083015281830188905286811660608301528516608082015290517f308d36d8f61bd4393536b6557142f55554c34d4ea2a3dbf54fe782b98889dfb29181900360a00190a150611556613180565b949350505050565b611566612fc6565b6212750081111561158a5760405163e88d3ecb60e01b815260040160405180910390fd5b60095460408051918252602082018390527fcc5a4a7c466fc20af4119a7a26048791fdb55cbd401aff36ef2bfc639662b2e2910160405180910390a1600955565b5f806115d561321e565b546001600160a01b031692915050565b6014545f9081906115f690426144b4565b9050806003600601541161160a575f6113aa565b6009546113aa9082906144b4565b600d545f9081906001600160a01b031633146116475760405163bd72e29160e01b815260040160405180910390fd5b601054611675907f4995646f72fa9a270ffc094641ab616ce576b2e3eab25eaf05c15caa4f0e595d906132fe565b426014555f61168261125b565b9050805f0361169a5750506010546012549091509091565b5f6116a3610e9c565b9050816116d07f0000000000000000000000000000000000000000000000000000000000000000836144c7565b6116da91906144f2565b60115490945084111561181c576011545f0361170457505050601181905560108190556012549091565b5f7f00000000000000000000000000000000000000000000000000000000000000008360106001015461173791906144c7565b61174191906144f2565b61174b90836144b4565b600a549091506127109061175f90836144c7565b61176991906144f2565b93508360106002015f82825461177f919061467b565b9091555050601054837f00000000000000000000000000000000000000000000000000000000000000006117b387866144b4565b6117bd91906144c7565b6117c791906144f2565b6010556127106117d86064836144c7565b6117e291906144f2565b6010546117f09083906144b4565b111561180f57604051630508c93960e41b815260040160405180910390fd5b505060105460115561188f565b5f8460105f01541161183a5760105461183590866144b4565b611848565b6010546118489086906144b4565b9050612710606460105f015461185e91906144c7565b61186891906144f2565b81111561188857604051630508c93960e41b815260040160405180910390fd5b5060108490555b60408051858152602081018590527f83d2ad38a3d31bbc70811535dd8943b0140df344c23e6e167ee1ca32f9a1a459910160405180910390a150509091565b6118d6612fc6565b62093a808110156118fa57604051632011727b60e11b815260040160405180910390fd5b60085460408051918252602082018390527fcdbf56e2a82365307f9691ad933e9762726485d202543fe224f47447d79feaf0910160405180910390a1600855565b611943612fc6565b61194b613305565b565b5f611956610d1c565b60065461104d91906144b4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156119a75750825b90505f826001600160401b031660011480156119c25750303b155b9050811580156119d0575080155b156119ee5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315611a1857845460ff60401b1916600160401b1785555b5f80611a26888a018a61483c565b91509150611a32613350565b611a3a613360565b611a4c82602001518360400151613370565b81516001600160a01b0316611a74576040516317dc37cb60e11b815260040160405180910390fd5b6101408201516001600160a01b0316611aa3576040516001626bbab960e11b0319815260040160405180910390fd5b6101208201516001600160a01b0316611acf57604051630b5eba9f60e41b815260040160405180910390fd5b6101608201516001600160a01b0316611afb57604051633480121760e21b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000082606001511015611b4057604051633240d18160e21b815260040160405180910390fd5b600482608001511115611b66576040516309aa66eb60e01b815260040160405180910390fd5b62093a808260a001511015611b8e57604051632011727b60e11b815260040160405180910390fd5b621275008260c001511115611bb65760405163e88d3ecb60e01b815260040160405180910390fd5b6105dc8260e001511115611bdd57604051630674143f60e01b815260040160405180910390fd5b60788261010001511115611c045760405163f4d1caab60e01b815260040160405180910390fd5b611c12826101200151613382565b8151611c1d90613393565b4260138190556014557f00000000000000000000000000000000000000000000000000000000000000006010558151600380546001600160a01b0319166001600160a01b039092169190911781556020830151839190600490611c8090826149c6565b5060408201516002820190611c9590826149c6565b50606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e0820151600782015561010082015160088201556101208201516009820180546001600160a01b03199081166001600160a01b0393841617909155610140840151600a840180548316918416919091179055610160840151600b84018054831691841691909117905561018090930151600c909201805490931691161790555f5b8151811015611dca575f6001600160a01b0316828281518110611d6557611d65614a85565b60200260200101516001600160a01b031603611d94576040516317dc37cb60e11b815260040160405180910390fd5b611dc1828281518110611da957611da9614a85565b602002602001015160156133a490919063ffffffff16565b50600101611d40565b5050508315611e1357845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b611e496040518060a001604052805f81526020015f81526020015f81526020015f81526020015f81525090565b506040805160a08101825260105481526011546020820152601254918101919091526013546060820152601454608082015290565b5f61104d8183613025565b5f80611e936133b8565b5460ff1692915050565b611ea5612fc6565b611eb06015826131a6565b507f4eb129c82dcd3eedb52df2b0e6fb4cfa41ac64ee9d63ff081acbb1877e85d79b81604051611250919061415b565b5f611ee96130b3565b611ef16130fd565b601454611efe90426144b4565b6009541015611f2057604051631f4bcb2b60e01b815260040160405180910390fd5b5f198303611f9d57611f306115cb565b6001600160a01b03166370a08231336040518263ffffffff1660e01b8152600401611f5b919061415b565b602060405180830381865afa158015611f76573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f9a919061453d565b92505b611fa783836133dc565b905061104d613180565b5f80611fbb612ff8565b6001600160a01b039093165f9081526020939093525050604090205490565b611fe2612fc6565b61194b5f613428565b611ff3612fc6565b6001600160a01b03811661201a5760405163d214a59760e01b815260040160405180910390fd5b600f546040517fe74dd8b1f5f3d5328df682e649c08b085f09c2ce77b68e54329e8d30e2642f7891612059916001600160a01b03909116908490614a99565b60405180910390a1600f80546001600160a01b0319166001600160a01b0392909216919091179055565b61208b612fc6565b60065481116120ad5760405163e9ec812960e01b815260040160405180910390fd5b60065460408051918252602082018390527f7f3306669f28a6aa13d0f709be2bd4f3e21d2f37aee9358846a50e1988ee4832910160405180910390a1600655565b6120f6612fc6565b801580612104575061271081115b156121225760405163e55fb50960e01b815260040160405180910390fd5b5f61212d8184613025565b6001600160a01b0381165f908152600260209081526040918290205482519081529081018590529192507f7cd01dd3533c6dc08821cd303814de60aba1901f1531c3cbcd95d26ed924e9cf910160405180910390a16001600160a01b03165f9081526002602052604090205550565b6121a4612440565b6001600160a01b0316336001600160a01b0316141580156121d05750600d546001600160a01b03163314155b156121ee5760405163e9ec812960e01b815260040160405180910390fd5b61194b613498565b612283604051806101a001604052805f6001600160a01b0316815260200160608152602001606081526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681525090565b604080516101a08101909152600380546001600160a01b03168252600480546020840191906122b190614505565b80601f01602080910402602001604051908101604052809291908181526020018280546122dd90614505565b80156123285780601f106122ff57610100808354040283529160200191612328565b820191905f5260205f20905b81548152906001019060200180831161230b57829003601f168201915b5050505050815260200160028201805461234190614505565b80601f016020809104026020016040519081016040528092919081815260200182805461236d90614505565b80156123b85780601f1061238f576101008083540402835291602001916123b8565b820191905f5260205f20905b81548152906001019060200180831161239b57829003601f168201915b505050918352505060038201546020820152600482015460408201526005820154606082015260068201546080820152600782015460a0820152600882015460c082015260098201546001600160a01b0390811660e0830152600a8301548116610100830152600b8301548116610120830152600c9092015490911661014090910152919050565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993006115d5565b5f6124716130b3565b6124796130fd565b60145461248690426144b4565b60095410156124a857604051631f4bcb2b60e01b815260040160405180910390fd5b611fa783836134de565b60605f6124bd612ff8565b9050806004018054610e1a90614505565b600e546001600160a01b031633146124f957604051633480121760e21b815260040160405180910390fd5b60085460135442919061250c90836144b4565b101561252b57604051631221b97b60e01b815260040160405180910390fd5b60138190556007545f9061271090612541610d1c565b61254b91906144c7565b61255591906144f2565b600e54909150612581906001600160a01b0316826125716115cb565b6001600160a01b031691906134f9565b6040518181527f55ce6141cc7099e5baac44c64543a6d7fc4e37ebba0fcaa65fa1f2a9996ec5a59060200160405180910390a15050565b5f6125c16130b3565b6125c96130fd565b6125d4601587613242565b6125f157604051636448d6e960e11b815260040160405180910390fd5b600f546001600160a01b0316331461261c5760405163e9ec812960e01b815260040160405180910390fd5b601454421461263e57604051631f4bcb2b60e01b815260040160405180910390fd5b5f1985036126565761264f82612eb7565b94506126ae565b61265f82612eb7565b8511156126ae5760405162461bcd60e51b815260206004820152601d60248201527f455243343632363a2072656465656d206d6f7265207468616e206d617800000060448201526064016114a7565b336001600160a01b038316146126c9576126c98233876131ce565b5f61270c7f00000000000000000000000000000000000000000000000000000000000000006126f887826144b4565b61270290896144c7565b6104ba91906144f2565b9050612718838761351f565b6127218161136a565b61272b90826144b4565b91506127416001600160a01b03881685846134f9565b604080516001600160a01b03898116825260208201899052868116828401528516606082015290517f4e19afb1df46d77083cc4e520735afa0cdc2d763d6bc5d710661c3dbb35f4c4d9181900360800190a15061279c613180565b95945050505050565b5f33611060818585613123565b6060610d8e6015613553565b6127c6612fc6565b8015806127d4575061271081115b156127f25760405163e55fb50960e01b815260040160405180910390fd5b5f8433858560405161280390613fee565b6128109493929190614ab3565b604051809103905ff080158015612829573d5f803e3d5ffd5b506001600160a01b0381165f90815260026020526040812084905590915061285190826133a4565b507f0803371633b57311f58d10924711080d2dae75ab17c5c0c262af3887cfca00bb8186604051612883929190614a99565b60405180910390a15050505050565b61289a612fc6565b6001600160a01b0381166128c4576040516001626bbab960e11b0319815260040160405180910390fd5b600d546040517fe2eeab472f89ac267be30e463da684fb96f56cc8e947839361fdf45bf6a3458e91612903916001600160a01b03909116908490614a99565b60405180910390a1600d80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6129388183613025565b6001600160a01b03166308bb5fb06040518163ffffffff1660e01b81526004016020604051808303815f875af1158015612974573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061104d919061453d565b5f61104d826001613030565b5f604051637dc4dd1560e11b815260040160405180910390fd5b335f829003612a21576129cf612440565b6001600160a01b0316816001600160a01b0316141580156129fe5750600d546001600160a01b03828116911614155b15612a1c5760405163ccea9e6f60e01b815260040160405180910390fd5b612a5a565b612a29612440565b6001600160a01b0316816001600160a01b031614612a5a5760405163ccea9e6f60e01b815260040160405180910390fd5b5f612a6483611e7e565b6001600160a01b0381165f818152600260209081526040808320548151628bb5fb60e41b81529151959650949293926308bb5fb092600480840193919291829003018187875af1158015612aba573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ade919061453d565b90505f612ae9611387565b90505f886001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b4c9190614554565b90508760ff8084169083161115612b8357612b678383614574565b612b7290600a61466d565b612b7c908a6144f2565b9050612bb3565b8260ff168260ff161015612bb357612b9b8284614574565b612ba690600a61466d565b612bb0908a6144c7565b90505b61271085612bbf610d1c565b612bc991906144c7565b612bd391906144f2565b612bdd828661467b565b1115612bfc5760405163e55fb50960e01b815260040160405180910390fd5b612c106001600160a01b038b16878b61355f565b6040516356f4edaf60e01b81526001600160a01b038716906356f4edaf90612c3e908d908d9060040161468e565b6020604051808303815f875af1158015612c5a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c7e9190614afd565b612c9b57604051630508c93960e41b815260040160405180910390fd5b7f921f9e77ef648025190d46d8b7f3d22a5546367ff7aaa883b1f39ffd2a2d325d8a8a8a604051612cce939291906146c0565b60405180910390a150505050505050505050565b5f80612cec611289565b90505f612cf7612ec1565b90505f5b82811015612d9157818181518110612d1557612d15614a85565b60200260200101516001600160a01b03166308bb5fb06040518163ffffffff1660e01b81526004016020604051808303815f875af1158015612d59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d7d919061453d565b612d87908561467b565b9350600101612cfb565b50505090565b612d9f612fc6565b6001600160a01b038116612dc657604051633480121760e21b815260040160405180910390fd5b600e546040517f2861448678f0be67f11bfb5481b3e3b4cfeb3acc6126ad60a05f95bfc653066691612e05916001600160a01b03909116908490614a99565b60405180910390a1600e80546001600160a01b0319166001600160a01b0392909216919091179055565b5f61104d825f61307f565b5f61104d612e4783611fb1565b5f613030565b612e55612fc6565b6001600160a01b038116612e7c576040516317dc37cb60e11b815260040160405180910390fd5b612e876015826133a4565b507fe473c74f34be27c1464d6624f14a0d7fd4e301cbfa29c3eba425d378c8a7ebe081604051611250919061415b565b5f61104d82611fb1565b6060610d8e5f613553565b5f80612ed6612ff8565b6001600160a01b039485165f90815260019190910160209081526040808320959096168252939093525050205490565b600e546001600160a01b03163314612f3157604051633480121760e21b815260040160405180910390fd5b600e54601254612f4d916001600160a01b0316906125716115cb565b6012546040519081527f8a2034f45f83800eed1750a670ad845ceee6add62106ca5326598842cfbd6ea79060200160405180910390a15f601255565b612f91612fc6565b6001600160a01b038116612fba575f604051631e4fbdf760e01b81526004016114a7919061415b565b612fc381613428565b50565b33612fcf612440565b6001600160a01b03161461194b573360405163118cdaa760e01b81526004016114a7919061415b565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0090565b5f61104d825490565b5f61128283836135e4565b5f61128261303c610d1c565b61304790600161467b565b6130525f600a61466d565b61305a61125b565b613064919061467b565b8591908561360a565b61307a8383836001613657565b505050565b5f61128261308e82600a61466d565b61309661125b565b6130a0919061467b565b6130a8610d1c565b61306490600161467b565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016130f757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b613105611e89565b1561194b5760405163d93c066560e01b815260040160405180910390fd5b6001600160a01b03831661314c575f604051634b637e8f60e11b81526004016114a7919061415b565b6001600160a01b038216613175575f60405163ec442f0560e01b81526004016114a7919061415b565b61307a838383613738565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f611282836001600160a01b03841661385b565b5f806131c4612ff8565b6002015492915050565b5f6131d98484612ecc565b90505f198114613218578181101561320a57828183604051637dc7a0d960e11b81526004016114a7939291906146c0565b61321884848484035f613657565b50505050565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e0090565b6001600160a01b0381165f9081526001830160205260408120541515611282565b6040516001600160a01b0384811660248301528381166044830152606482018390526132189186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061393e565b6001600160a01b0382166132f3575f60405163ec442f0560e01b81526004016114a7919061415b565b61116e5f8383613738565b80825d5050565b61330d613996565b5f6133166133b8565b805460ff1916815590507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051611250919061415b565b6133586139bb565b61194b613a04565b6133686139bb565b61194b613a20565b6133786139bb565b61116e8282613a28565b61338a6139bb565b612fc381613a58565b61339b6139bb565b612fc381613a60565b5f611282836001600160a01b038416613acd565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330090565b5f806133e78361194d565b90508084111561341057828482604051633c8097d960e11b81526004016114a7939291906146c0565b5f61341a85612e2f565b905061155633858784613b19565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b6134a06130fd565b5f6134a96133b8565b805460ff1916600117815590507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586133433390565b5f5f195f6134eb85612998565b905061155633858388613b19565b61307a83846001600160a01b031663a9059cbb858560405160240161329892919061468e565b6001600160a01b038216613548575f604051634b637e8f60e11b81526004016114a7919061415b565b61116e825f83613738565b60605f61128283613b94565b604051636eb1769f60e11b81525f906001600160a01b0385169063dd62ed3e9061358f9030908790600401614a99565b602060405180830381865afa1580156135aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135ce919061453d565b905061321884846135df858561467b565b613bed565b5f825f0182815481106135f9576135f9614a85565b905f5260205f200154905092915050565b5f80613617868686613c7d565b905061362283613d3c565b801561363d57505f8480613638576136386144de565b868809115b1561279c5761364d60018261467b565b9695505050505050565b5f613660612ff8565b90506001600160a01b03851661368b575f60405163e602df0560e01b81526004016114a7919061415b565b6001600160a01b0384166136b4575f604051634a1406b160e11b81526004016114a7919061415b565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561373157836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161372891815260200190565b60405180910390a35b5050505050565b5f613741612ff8565b90506001600160a01b03841661376f5781816002015f828254613764919061467b565b909155506137cc9050565b6001600160a01b0384165f90815260208290526040902054828110156137ae5784818460405163391434e360e21b81526004016114a7939291906146c0565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b0383166137ea576002810180548390039055613808565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161384d91815260200190565b60405180910390a350505050565b5f8181526001830160205260408120548015613935575f61387d6001836144b4565b85549091505f90613890906001906144b4565b90508082146138ef575f865f0182815481106138ae576138ae614a85565b905f5260205f200154905080875f0184815481106138ce576138ce614a85565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061390057613900614b1c565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061104d565b5f91505061104d565b5f6139526001600160a01b03841683613d68565b905080515f141580156139765750808060200190518101906139749190614afd565b155b1561307a5782604051635274afe760e01b81526004016114a7919061415b565b61399e611e89565b61194b57604051638dfc202b60e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661194b57604051631afcd79f60e31b815260040160405180910390fd5b613a0c6139bb565b5f613a156133b8565b805460ff1916905550565b6131806139bb565b613a306139bb565b5f613a39612ff8565b905060038101613a4984826149c6565b506004810161321883826149c6565b612f916139bb565b613a686139bb565b5f613a7161321e565b90505f80613a7e84613d75565b9150915081613a8e576012613a90565b805b83546001600160a81b031916600160a01b60ff92909216919091026001600160a01b031916176001600160a01b0394909416939093179091555050565b5f818152600183016020526040812054613b1257508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561104d565b505f61104d565b5f613b2261321e565b8054909150613b3c906001600160a01b0316863086613263565b613b4684836132ca565b836001600160a01b0316856001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78585604051613728929190918252602082015260400190565b6060815f01805480602002602001604051908101604052809291908181526020018280548015613be157602002820191905f5260205f20905b815481526020019060010190808311613bcd575b50505050509050919050565b5f836001600160a01b031663095ea7b38484604051602401613c1092919061468e565b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050509050613c498482613e4b565b61321857613c7384856001600160a01b031663095ea7b3865f60405160240161329892919061468e565b613218848261393e565b5f838302815f1985870982811083820303915050805f03613cb157838281613ca757613ca76144de565b0492505050611282565b808411613cd15760405163227bc15360e01b815260040160405180910390fd5b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b5f6002826003811115613d5157613d51614b30565b613d5b9190614b44565b60ff166001149050919050565b606061128283835f613ee8565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f918291829182916001600160a01b03871691613dbb91614b65565b5f60405180830381855afa9150503d805f8114613df3576040519150601f19603f3d011682016040523d82523d5f602084013e613df8565b606091505b5091509150818015613e0c57506020815110155b15613e3f575f81806020019051810190613e26919061453d565b905060ff8111613e3d576001969095509350505050565b505b505f9485945092505050565b5f805f846001600160a01b031684604051613e669190614b65565b5f604051808303815f865af19150503d805f8114613e9f576040519150601f19603f3d011682016040523d82523d5f602084013e613ea4565b606091505b5091509150818015613ece575080511580613ece575080806020019051810190613ece9190614afd565b801561279c5750505050506001600160a01b03163b151590565b606081471015613f0d573060405163cd78605960e01b81526004016114a7919061415b565b5f80856001600160a01b03168486604051613f289190614b65565b5f6040518083038185875af1925050503d805f8114613f62576040519150601f19603f3d011682016040523d82523d5f602084013e613f67565b606091505b509150915061364d868383606082613f8757613f8282613fc5565b611282565b8151158015613f9e57506001600160a01b0384163b155b15613fbe5783604051639996b31560e01b81526004016114a7919061415b565b5080611282565b805115613fd55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b610dd680614b7c83390190565b5f6020828403121561400b575f80fd5b5035919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6112826020830184614012565b80356001600160a01b0381168114614068575f80fd5b919050565b5f806040838503121561407e575f80fd5b61408783614052565b946020939093013593505050565b5f80604083850312156140a6575f80fd5b823591506140b660208401614052565b90509250929050565b5f602082840312156140cf575f80fd5b61128282614052565b5f805f606084860312156140ea575f80fd5b6140f384614052565b925061410160208501614052565b9150604084013590509250925092565b5f805f8060808587031215614124575f80fd5b61412d85614052565b93506020850135925061414260408601614052565b915061415060608601614052565b905092959194509250565b6001600160a01b0391909116815260200190565b5f8083601f84011261417f575f80fd5b5081356001600160401b03811115614195575f80fd5b6020830191508360208285010111156141ac575f80fd5b9250929050565b5f80602083850312156141c4575f80fd5b82356001600160401b038111156141d9575f80fd5b6141e58582860161416f565b90969095509350505050565b5f8060408385031215614202575f80fd5b50508035926020909101359150565b6020815261422b6020820183516001600160a01b03169052565b5f60208301516101a08060408501526142486101c0850183614012565b91506040850151601f198584030160608601526142658382614012565b92505060608501516080850152608085015160a085015260a085015160c085015260c085015160e085015260e08501516101008181870152808701519150506101208181870152808701519150506101406142ca818701836001600160a01b03169052565b86015190506101606142e6868201836001600160a01b03169052565b8601519050610180614302868201836001600160a01b03169052565b909501516001600160a01b031693019290925250919050565b5f805f805f60a0868803121561432f575f80fd5b61433886614052565b9450602086013593506040860135925061435460608701614052565b915061436260808701614052565b90509295509295909350565b602080825282518282018190525f9190848201906040850190845b818110156143ae5783516001600160a01b031683529284019291840191600101614389565b50909695505050505050565b5f805f80606085870312156143cd575f80fd5b6143d685614052565b935060208501356001600160401b038111156143f0575f80fd5b6143fc8782880161416f565b9598909750949560400135949350505050565b5f805f60608486031215614421575f80fd5b8335925061443160208501614052565b915061443f60408501614052565b90509250925092565b5f805f6060848603121561445a575f80fd5b61446384614052565b95602085013595506040909401359392505050565b5f8060408385031215614489575f80fd5b61449283614052565b91506140b660208401614052565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561104d5761104d6144a0565b808202811582820484141761104d5761104d6144a0565b634e487b7160e01b5f52601260045260245ffd5b5f82614500576145006144de565b500490565b600181811c9082168061451957607f821691505b60208210810361453757634e487b7160e01b5f52602260045260245ffd5b50919050565b5f6020828403121561454d575f80fd5b5051919050565b5f60208284031215614564575f80fd5b815160ff81168114611282575f80fd5b60ff828116828216039081111561104d5761104d6144a0565b600181815b808511156145c757815f19048211156145ad576145ad6144a0565b808516156145ba57918102915b93841c9390800290614592565b509250929050565b5f826145dd5750600161104d565b816145e957505f61104d565b81600181146145ff576002811461460957614625565b600191505061104d565b60ff84111561461a5761461a6144a0565b50506001821b61104d565b5060208310610133831016604e8410600b8410161715614648575081810a61104d565b614652838361458d565b805f1904821115614665576146656144a0565b029392505050565b5f61128260ff8416836145cf565b8082018082111561104d5761104d6144a0565b6001600160a01b03929092168252602082015260400190565b60ff818116838216019081111561104d5761104d6144a0565b6001600160a01b039390931683526020830191909152604082015260600190565b634e487b7160e01b5f52604160045260245ffd5b6040516101a081016001600160401b0381118282101715614718576147186146e1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614746576147466146e1565b604052919050565b5f82601f83011261475d575f80fd5b81356001600160401b03811115614776576147766146e1565b614789601f8201601f191660200161471e565b81815284602083860101111561479d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126147c8575f80fd5b813560206001600160401b038211156147e3576147e36146e1565b8160051b6147f282820161471e565b928352848101820192828101908785111561480b575f80fd5b83870192505b848310156148315761482283614052565b82529183019190830190614811565b979650505050505050565b5f806040838503121561484d575f80fd5b82356001600160401b0380821115614863575f80fd5b908401906101a08287031215614877575f80fd5b61487f6146f5565b61488883614052565b815260208301358281111561489b575f80fd5b6148a78882860161474e565b6020830152506040830135828111156148be575f80fd5b6148ca8882860161474e565b604083015250606083013560608201526080830135608082015260a083013560a082015260c083013560c082015260e083013560e082015261010080840135818301525061012061491c818501614052565b9082015261014061492e848201614052565b90820152610160614940848201614052565b90820152610180614952848201614052565b908201529350602085013591508082111561496b575f80fd5b50614978858286016147b9565b9150509250929050565b601f82111561307a57805f5260205f20601f840160051c810160208510156149a75750805b601f840160051c820191505b81811015613731575f81556001016149b3565b81516001600160401b038111156149df576149df6146e1565b6149f3816149ed8454614505565b84614982565b602080601f831160018114614a26575f8415614a0f5750858301515b5f19600386901b1c1916600185901b178555614a7d565b5f85815260208120601f198616915b82811015614a5457888601518255948401946001909101908401614a35565b5085821015614a7157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0385811682528416602082015260606040820181905281018290525f828460808401375f608084840101526080601f19601f850116830101905095945050505050565b5f60208284031215614b0d575f80fd5b81518015158114611282575f80fd5b634e487b7160e01b5f52603160045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60ff831680614b5657614b566144de565b8060ff84160691505092915050565b5f82518060208501845e5f92019182525091905056fe60a0604052604051610dd6380380610dd68339810160408190526100229161036a565b828161002e828261008c565b50508160405161003d9061032e565b6001600160a01b039091168152602001604051809103905ff080158015610066573d5f803e3d5ffd5b506001600160a01b031660805261008461007f60805190565b6100ea565b50505061044b565b61009582610157565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100de576100d982826101d5565b505050565b6100e6610248565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6101295f80516020610db6833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161015481610269565b50565b806001600160a01b03163b5f0361019157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101f19190610435565b5f60405180830381855af49150503d805f8114610229576040519150601f19603f3d011682016040523d82523d5f602084013e61022e565b606091505b50909250905061023f8583836102a6565b95945050505050565b34156102675760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661029257604051633173bdd160e11b81525f6004820152602401610188565b805f80516020610db68339815191526101b4565b6060826102bb576102b682610305565b6102fe565b81511580156102d257506001600160a01b0384163b155b156102fb57604051639996b31560e01b81526001600160a01b0385166004820152602401610188565b50805b9392505050565b8051156103155780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b610501806108b583390190565b80516001600160a01b0381168114610351575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f805f6060848603121561037c575f80fd5b6103858461033b565b92506103936020850161033b565b60408501519092506001600160401b03808211156103af575f80fd5b818601915086601f8301126103c2575f80fd5b8151818111156103d4576103d4610356565b604051601f8201601f19908116603f011681019083821181831017156103fc576103fc610356565b81604052828152896020848701011115610414575f80fd5b8260208601602083015e5f6020848301015280955050505050509250925092565b5f82518060208501845e5f920191825250919050565b6080516104536104625f395f601001526104535ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82518060208501845e5f92019182525091905056fea2646970667358221220117f216494c9098d12bbff87c8d584f4d545471f7a95c3c910c20d7f0d1a105964736f6c63430008190033608060405234801561000f575f80fd5b5060405161050138038061050183398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b61040c806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d14610090578063ad3cb1cc146100a3578063f2fde38b146100e0575b5f80fd5b348015610058575f80fd5b506100616100ff565b005b34801561006e575f80fd5b505f546001600160a01b0316604051610087919061023e565b60405180910390f35b61006161009e36600461027a565b610112565b3480156100ae575f80fd5b506100d3604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100879190610377565b3480156100eb575f80fd5b506100616100fa366004610390565b61017d565b6101076101c3565b6101105f6101ef565b565b61011a6101c3565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014a90869086906004016103ab565b5f604051808303818588803b158015610161575f80fd5b505af1158015610173573d5f803e3d5ffd5b5050505050505050565b6101856101c3565b6001600160a01b0381166101b7575f604051631e4fbdf760e01b81526004016101ae919061023e565b60405180910390fd5b6101c0816101ef565b50565b5f546001600160a01b03163314610110573360405163118cdaa760e01b81526004016101ae919061023e565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146101c0575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f6060848603121561028c575f80fd5b833561029781610252565b925060208401356102a781610252565b9150604084013567ffffffffffffffff808211156102c3575f80fd5b818601915086601f8301126102d6575f80fd5b8135818111156102e8576102e8610266565b604051601f8201601f19908116603f0116810190838211818310171561031057610310610266565b81604052828152896020848701011115610328575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6103896020830184610349565b9392505050565b5f602082840312156103a0575f80fd5b813561038981610252565b6001600160a01b03831681526040602082018190525f906103ce90830184610349565b94935050505056fea2646970667358221220497e1225d21503b2c0e72feef0d5216fe1525afb4c43c9fa065eef75c65856e264736f6c63430008190033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a26469706673582212203f9b1d1e2de71b75e35e8308e5c755d3d2c224a70259af81b6453d98f135692d64736f6c634300081900330000000000000000000000000000000000000000000000000de0b6b3a7640000