0 txs
3.9k calls
constructor
constructor()
functions
BOOST_BASE
viewfunction BOOST_BASE() view returns (uint256)
calculateTotalRewards
viewfunction calculateTotalRewards(address _staker, uint256 _stakeIndex) view returns (uint256)
canRelockStake
viewfunction canRelockStake(address _staker, uint256 _stakeIndex) view returns (bool canRelock, string reason)
communityRewardsTreasury
viewfunction communityRewardsTreasury() view returns (address)
currentAPY
viewfunction currentAPY() view returns (uint256)
currentEpoch
viewfunction currentEpoch() view returns (uint256)
currentEpochProRataRewards
viewfunction currentEpochProRataRewards(uint256 _stakeIndex) view returns (uint256 currentEpochProRata)
EPOCH_DURATION
viewfunction EPOCH_DURATION() view returns (uint256)
epochAPY
viewfunction epochAPY(uint256 epoch) view returns (uint256 apy)
epochClaimed
viewfunction epochClaimed(address user, uint256 stakeIndex, uint256 epoch) view returns (bool claimed)
epochStartTime
viewfunction epochStartTime() view returns (uint256)
factory
viewfunction factory() view returns (address)
fyiToken
viewfunction fyiToken() view returns (address)
getActiveStakes
viewfunction getActiveStakes(address _staker) view returns (uint256[] stakeIndices, uint256[] amounts, uint256[] startTimes, uint256[] endTimes, uint256[] boosts)
getCheckpointInfo
viewfunction getCheckpointInfo(address _staker, uint256 _stakeIndex) view returns (uint256 totalClaimed, uint256 lastCheckpointEpoch, uint256 unclaimedCompleted, uint256 unclaimedTotal)
getClaimableEpochs
viewfunction getClaimableEpochs(address _staker, uint256 _stakeIndex) view returns (uint256[])
getCurrentEpoch
viewfunction getCurrentEpoch() view returns (uint256)
getEpochAdvancementInfo
viewfunction getEpochAdvancementInfo() view returns (bool needsAdvancement, uint256 epochsToAdvance, uint256 epochsCanAdvance)
getPoolStats
viewfunction getPoolStats() view returns (uint256 totalStakedAmount, uint256 currentApy, uint256 totalStakes, uint256 lastUpdateTime)
getTotalStakedBalance
viewfunction getTotalStakedBalance(address _staker) view returns (uint256)
implementation
viewfunction implementation() view returns (address)
lastClaimedCheckpointEpoch
viewfunction lastClaimedCheckpointEpoch(address user, uint256 stakeIndex) view returns (uint256 lastClaimedCheckpointEpoch)
MAX_EPOCHS_PER_ADVANCE
viewfunction MAX_EPOCHS_PER_ADVANCE() view returns (uint256)
owner
viewfunction owner() view returns (address)
paused
viewfunction paused() view returns (bool)
pendingEpochReward
viewfunction pendingEpochReward(uint256 _stakeIndex, uint256 _epochNumber) view returns (uint256)
pendingRewards
viewfunction pendingRewards(uint256 _stakeIndex) view returns (uint256)
REWARD_PRECISION
viewfunction REWARD_PRECISION() view returns (uint256)
stakeEpochStart
viewfunction stakeEpochStart(address user, uint256 stakeIndex) view returns (uint256 epochStart)
totalClaimedRewards
viewfunction totalClaimedRewards(address user, uint256 stakeIndex) view returns (uint256 totalClaimedRewards)
totalRewardsPaid
viewfunction totalRewardsPaid() view returns (uint256)
totalStaked
viewfunction totalStaked() view returns (uint256)
userStakeCount
viewfunction userStakeCount(address user) view returns (uint256 stakeCount)
userStakes
viewfunction userStakes(address user, uint256) view returns (uint256 amount, uint256 startTime, uint256 endTime, uint256 duration, uint256 boostBasisPoints, bool unstaked)
advanceEpochIfNeeded
nonpayablefunction advanceEpochIfNeeded()
claimEpochReward
nonpayablefunction claimEpochReward(uint256 _stakeIndex, uint256 _epochNumber) returns (uint256)
claimRewards
nonpayablefunction claimRewards(uint256 _stakeIndex) returns (uint256)
claimRewardsBatch
nonpayablefunction claimRewardsBatch(uint256 _stakeIndex, uint256 _maxEpochs) returns (uint256 rewardsClaimed, uint256 epochsProcessed, bool hasMoreEpochs)
emergencyWithdraw
nonpayablefunction emergencyWithdraw(uint256 _stakeIndex) returns (uint256)
initialize
nonpayablefunction initialize(address _fyiToken, address _communityRewardsTreasury)
pause
nonpayablefunction pause()
relockStake
nonpayablefunction relockStake(uint256 _stakeIndex)
renounceOwnership
nonpayablefunction renounceOwnership()
stake
nonpayablefunction stake(uint256 _stakingTierID, uint256 _amount)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
unpause
nonpayablefunction unpause()
updateApy
nonpayablefunction updateApy(uint256 _apy, uint256 _epochNumber)
withdraw
nonpayablefunction withdraw(uint256 _stakeIndex) returns (uint256, uint256)
events
CheckpointUpdated
event CheckpointUpdated(address indexed staker, uint256 stakeIndex, uint256 newCheckpointEpoch, uint256 totalClaimed)
EpochAdvanced
event EpochAdvanced(uint256 newEpoch)
Initialized
event Initialized(uint64 version)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
Paused
event Paused(address account)
RewardsClaimed
event RewardsClaimed(address indexed stakingPool, address indexed staker, uint256 stakeIndex, uint256 amount)
Staked
event Staked(address indexed stakingPool, address indexed staker, uint256 stakingTierID, uint256 amount, uint256 stakeIndex)
StakeExtended
event StakeExtended(address indexed staker, uint256 stakeIndex, uint256 newEndTime)
Unpaused
event Unpaused(address account)
UpdatedAPY
event UpdatedAPY(address indexed stakingPool, uint256 newAPY, uint256 epochNumber)
Withdrawn
event Withdrawn(address indexed stakingPool, address indexed staker, uint256 stakeIndex, uint256 principal, uint256 reward)
errors
EnforcedPause
error EnforcedPause()
ExpectedPause
error ExpectedPause()
InvalidInitialization
error InvalidInitialization()
NotInitializing
error NotInitializing()
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
creation bytecode
0x608060405234801562000010575f80fd5b506200001b62000021565b620000d5565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d25780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b613eb480620000e35f395ff3fe608060405234801561000f575f80fd5b5060043610610297575f3560e01c806378555d5711610161578063af90bf6a116100ca578063c1f73aae11610084578063c1f73aae146106ce578063c45a0155146106e1578063e9434e5a146106f4578063f0faf87114610707578063f2fde38b1461071a578063f60ca6411461072d575f80fd5b8063af90bf6a146105d9578063b02e64a914610609578063b5d5b5fa14610628578063b704b6281461066a578063b97dd9e21461068b578063bbb8518814610693575f80fd5b80638a3f5a591161011b5780638a3f5a591461053a5780638da5cb5b1461054d57806392eb72091461057d5780639a79d32b1461059c578063a70b9f0c146105a5578063aacd5572146105af575f80fd5b806378555d57146104ba5780637b0472f0146104e45780637dcb2abf146104f7578063817b1cd21461050a57806383782b83146105125780638456cb5914610532575f80fd5b8063461fc5f61161020357806362586864116101bd57806362586864146104605780636d9ddd06146104735780636f045a6914610498578063715018a6146104a057806374958e35146104a857806376671808146104b1575f80fd5b8063461fc5f6146103e9578063485cc955146103f15780635312ea8e14610404578063582f62c4146104175780635c60da1b146104415780635c975abb14610449575f80fd5b806328eb423f1161025457806328eb423f1461036f5780632e1a7d4d146103845780633194ae2b146103ac57806339e87ffe146103bf5780633d6aa5e1146103d25780633f4ba83a146103e1575f80fd5b80630962ef791461029b5780631747e0b0146102c1578063183521cc146102e557806318567a31146102f85780631a3463161461032357806325f09e6114610366575b5f80fd5b6102ae6102a9366004613a53565b610736565b6040519081526020015b60405180910390f35b6102d46102cf366004613a7e565b610988565b6040516102b8959493929190613ad3565b6102ae6102f3366004613a7e565b610d6a565b60065461030b906001600160a01b031681565b6040516001600160a01b0390911681526020016102b8565b610356610331366004613b33565b600a60209081525f938452604080852082529284528284209052825290205460ff1681565b60405190151581526020016102b8565b6102ae61271081565b61038261037d366004613b65565b610e37565b005b610397610392366004613a53565b610ea5565b604080519283526020830191909152016102b8565b6103826103ba366004613a53565b6110fd565b6102ae6103cd366004613b85565b611356565b6102ae670de0b6b3a764000081565b610382611454565b610382611466565b6103826103ff366004613baf565b611504565b6102ae610412366004613a53565b61170f565b6102ae610425366004613b85565b600c60209081525f928352604080842090915290825290205481565b61030b6118ef565b5f80516020613e3f8339815191525460ff16610356565b6102ae61046e366004613b65565b611991565b61047b611b10565b6040805193151584526020840192909252908201526060016102b8565b6102ae603281565b610382611b58565b6102ae60025481565b6102ae60035481565b6102ae6104c8366004613b85565b600b60209081525f928352604080842090915290825290205481565b6103826104f2366004613b65565b611b69565b6102ae610505366004613a53565b611ece565b6102ae5f5481565b610525610520366004613b85565b611ed9565b6040516102b89190613be6565b6103826120f4565b6102ae610548366004613b65565b612104565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031661030b565b6102ae61058b366004613a53565b600e6020525f908152604090205481565b6102ae60015481565b6102ae62093a8081565b6102ae6105bd366004613b85565b600d60209081525f928352604080842090915290825290205481565b6105ec6105e7366004613b65565b612447565b6040805193845260208401929092521515908201526060016102b8565b6102ae610617366004613a7e565b60086020525f908152604090205481565b61063b610636366004613b85565b612725565b6040805196875260208701959095529385019290925260608401526080830152151560a082015260c0016102b8565b61067d610678366004613b85565b612778565b6040516102b8929190613bf8565b6102ae6128f2565b5f805460015433835260086020526040909220546004549192915b6040805194855260208501939093529183015260608201526080016102b8565b60075461030b906001600160a01b031681565b60055461030b906001600160a01b031681565b6102ae610702366004613a53565b612923565b6106ae610715366004613b85565b6129d9565b610382610728366004613a7e565b612a32565b6102ae60045481565b5f61073f612a6c565b610747612a9c565b60055f9054906101000a90046001600160a01b03166001600160a01b03166363a599a46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610797573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107bb9190613c5d565b156107e15760405162461bcd60e51b81526004016107d890613c76565b60405180910390fd5b335f90815260096020526040902054829081106108105760405162461bcd60e51b81526004016107d890613cb9565b610818611466565b5f6108233385612ad3565b90505f811161087e5760405162461bcd60e51b815260206004820152602160248201527f4167656e745374616b696e675f5f4e6f207265776172647320746f20636c61696044820152606d60f81b60648201526084016107d8565b5f6108876128f2565b335f818152600d602090815260408083208a8452825280832054938352600b82528083208a84529091528120549293509091908183116108c757816108d2565b6108d2836001613d0e565b9050805b8481101561093c57335f908152600a602090815260408083208c8452825280832084845290915290205460ff1661093457335f908152600a602090815260408083208c845282528083208484529091529020805460ff191660011790555b6001016108d6565b505f80851161094b575f610956565b610956600186613d21565b9050610964338a8884612c1c565b50939550505050505061098360015f80516020613e5f83398151915255565b919050565b6060808080806001600160a01b0386166109f05760405162461bcd60e51b8152602060048201526024808201527f4167656e745374616b696e675f5f496e76616c6964207374616b6572206164646044820152637265737360e01b60648201526084016107d8565b6001600160a01b0386165f90815260096020526040812054815b81811015610ab4576001600160a01b0389165f908152600960205260408120805483908110610a3b57610a3b613d34565b5f9182526020918290206040805160c081018252600690930290910180548352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015460ff16151560a08201819052909150610aab5783610aa781613d48565b9450505b50600101610a0a565b508167ffffffffffffffff811115610ace57610ace613d60565b604051908082528060200260200182016040528015610af7578160200160208202803683370190505b5096508167ffffffffffffffff811115610b1357610b13613d60565b604051908082528060200260200182016040528015610b3c578160200160208202803683370190505b5095508167ffffffffffffffff811115610b5857610b58613d60565b604051908082528060200260200182016040528015610b81578160200160208202803683370190505b5094508167ffffffffffffffff811115610b9d57610b9d613d60565b604051908082528060200260200182016040528015610bc6578160200160208202803683370190505b5093508167ffffffffffffffff811115610be257610be2613d60565b604051908082528060200260200182016040528015610c0b578160200160208202803683370190505b5092505f805b82811015610d5d576001600160a01b038a165f908152600960205260408120805483908110610c4257610c42613d34565b5f9182526020918290206040805160c081018252600690930290910180548352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015460ff16151560a08201819052909150610d5457818a8481518110610cb757610cb7613d34565b602002602001018181525050805f0151898481518110610cd957610cd9613d34565b6020026020010181815250508060200151888481518110610cfc57610cfc613d34565b6020026020010181815250508060400151878481518110610d1f57610d1f613d34565b6020026020010181815250508060800151868481518110610d4257610d42613d34565b60209081029190910101526001909201915b50600101610c11565b5050505091939590929450565b5f80805b6001600160a01b0384165f90815260096020526040902054811015610e30576001600160a01b0384165f908152600960205260408120805483908110610db657610db6613d34565b5f9182526020918290206040805160c081018252600690930290910180548352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015460ff16151560a08201819052909150610e27578051610e249084613d0e565b92505b50600101610d6e565b5092915050565b610e3f612c52565b610e47611466565b5f818152600e602052604090208290556003548103610e665760018290555b604080518381526020810183905230917f39455d2271c9fbaa41f50f53da90cc2974af4709f012eaec301e4fc42b3499c6910160405180910390a25050565b5f80610eaf612a9c565b610eb7612a6c565b60055f9054906101000a90046001600160a01b03166001600160a01b03166363a599a46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f07573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f2b9190613c5d565b15610f485760405162461bcd60e51b81526004016107d890613c76565b335f9081526009602052604090205483908110610f775760405162461bcd60e51b81526004016107d890613cb9565b610f7f611466565b5f610f8985612cad565b90508060020154421015610feb5760405162461bcd60e51b815260206004820152602360248201527f4167656e745374616b696e675f5f4c6f636b20706572696f64206e6f7420656e60448201526219195960ea1b60648201526084016107d8565b5f610ff63387612d42565b90505f6110016128f2565b9050811561102557801561102557611025338861101f600185613d21565b85612d63565b825460058401805460ff191660011790555f80548291908190611049908490613d21565b9091555050335f90815260086020526040812080546001929061106d908490613d21565b9091555061107e9050338985612e4e565b600754611095906001600160a01b03163383612ec1565b6040805189815260208101839052908101849052339030907f3cae9923fd3c2f468aa25a8ef687923e37f957459557c0380fd06526c0b8cdbc9060600160405180910390a395509093505050506110f860015f80516020613e5f83398151915255565b915091565b611105612a9c565b61110d612a6c565b60055f9054906101000a90046001600160a01b03166001600160a01b03166363a599a46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561115d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111819190613c5d565b1561119e5760405162461bcd60e51b81526004016107d890613c76565b335f90815260096020526040902054819081106111cd5760405162461bcd60e51b81526004016107d890613cb9565b5f6111d783612cad565b905080600201544210156112415760405162461bcd60e51b815260206004820152602b60248201527f4167656e745374616b696e675f5f43757272656e74206c6f636b20706572696f60448201526a19081b9bdd08195b99195960aa1b60648201526084016107d8565b611249611466565b5f6112543385612d42565b90505f61125f6128f2565b90508115611290575f808211611275575f611280565b611280600183613d21565b905061128e33878584612c1c565b505b5f8360030154426112a19190613d0e565b42600186015560028501819055335f908152600b602090815260408083208a845290915290208390559050816112d7575f6112e2565b6112e2600183613d21565b335f818152600d602090815260408083208b845282529182902093909355805189815292830184905290917fa30ff8212323692931e60ec64a7ee5293d3f12df36f78104f0536b36c2e450f9910160405180910390a2505050505061135360015f80516020613e5f83398151915255565b50565b6001600160a01b0382165f90815260096020526040812054821061137b57505f61144e565b6001600160a01b0383165f9081526009602052604081208054849081106113a4576113a4613d34565b5f9182526020918290206040805160c081018252600690930290910180548352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015460ff1615801560a083015290915061140e575f91505061144e565b6001600160a01b0384165f908152600c602090815260408083208684529091528120549061143c8686612d42565b90506114488183613d0e565b93505050505b92915050565b61145c612c52565b611464612f20565b565b5f61146f6128f2565b90505f60326003546114819190613d0e565b90508082111561148f578091505b6003548211156115005760018054600380545f908152600e60205260408120929092555490916114bf9190613d0e565b60038190556040518181529091507fb7f0e37f8e78f28f1f21b98f426d307e949c22f2997ca4b562ee90c3e5b30b309060200160405180910390a15061148f565b5050565b5f61150d612f7f565b805490915060ff600160401b820416159067ffffffffffffffff165f811580156115345750825b90505f8267ffffffffffffffff1660011480156115505750303b155b90508115801561155e575080155b1561157c5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156115a657845460ff60401b1916600160401b1785555b6001600160a01b0387166115fc5760405162461bcd60e51b815260206004820152601960248201527f496e76616c69642066796920746f6b656e20616464726573730000000000000060448201526064016107d8565b6001600160a01b0386166116655760405162461bcd60e51b815260206004820152602a60248201527f496e76616c696420636f6d6d756e6974792072657761726473207472656173756044820152697279206164647265737360b01b60648201526084016107d8565b61166e33612fa7565b611676612fb8565b61167e612fc0565b60058054336001600160a01b0319918216179091556006805482166001600160a01b038981169190911790915560078054909216908916179055426004555f600355831561170657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f611718612a9c565b335f90815260096020526040902054829081106117475760405162461bcd60e51b81526004016107d890613cb9565b60055f9054906101000a90046001600160a01b03166001600160a01b03166363a599a46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611797573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117bb9190613c5d565b6118175760405162461bcd60e51b815260206004820152602760248201527f4167656e745374616b696e675f5f456d657267656e63792073746f70206e6f746044820152662061637469766560c81b60648201526084016107d8565b61181f611466565b5f61182984612cad565b805460058201805460ff191660011790555f805492935090918291908190611852908490613d21565b9091555050335f908152600860205260408120805460019290611876908490613d21565b9091555050600754611892906001600160a01b03163383612ec1565b60408051868152602081018390525f818301529051339130917f3cae9923fd3c2f468aa25a8ef687923e37f957459557c0380fd06526c0b8cdbc9181900360600190a39250505061098360015f80516020613e5f83398151915255565b5f8061191c60017fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d51613d21565b5f1b90505f815490505f819050806001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611965573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119899190613d74565b935050505090565b335f9081526009602052604081205483106119ad57505f61144e565b335f9081526009602052604081208054859081106119cd576119cd613d34565b5f9182526020918290206040805160c081018252600690930290910180548352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015460ff1615801560a0830152909150611a37575f91505061144e565b335f908152600b6020908152604080832087845290915281205490611a5a6128f2565b905081851080611a6a5750808510155b15611a7a575f935050505061144e565b335f908152600a60209081526040808320898452825280832088845290915290205460ff1615611aaf575f935050505061144e565b335f908152600d6020908152604080832089845290915281205490838211611ad75783611ae2565b611ae2826001613d0e565b905080871015611af9575f9550505050505061144e565b611b04338989612fd0565b98975050505050505050565b5f805f80611b1c6128f2565b90506003548111935083611b30575f611b3d565b600354611b3d9082613d21565b925060328311611b4d5782611b50565b60325b915050909192565b611b60612c52565b6114645f613165565b611b71612a9c565b611b79612a6c565b60055f9054906101000a90046001600160a01b03166001600160a01b03166363a599a46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bc9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bed9190613c5d565b15611c0a5760405162461bcd60e51b81526004016107d890613c76565b662386f26fc10000811015611c7e5760405162461bcd60e51b815260206004820152603460248201527f4167656e745374616b696e675f5f416d6f756e74206d7573742062652067726560448201527330ba32b9103a3430b710181718189032ba3432b960611b60648201526084016107d8565b611c86611466565b600554604051636a8133f760e11b8152600481018490525f91829182916001600160a01b03169063d50267ee90602401606060405180830381865afa158015611cd1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cf59190613d8f565b92509250925080611d595760405162461bcd60e51b815260206004820152602860248201527f4167656e745374616b696e675f5f5374616b696e672074696572206973206e6f604482015267742061637469766560c01b60648201526084016107d8565b5f6040518060c001604052808681526020014281526020018542611d7d9190613d0e565b8152602080820187905260408083018790525f60609384018190523380825260098452828220805460018082018355828552868520895160069093020191825595880151818701559387015160028501559486015160038401556080860151600484015560a08601516005909301805460ff19169315159390931790925590815291549293509091611e0f9190613d21565b9050611e1b33826131d5565b335f908152600860205260408120805460019290611e3a908490613d0e565b92505081905550855f80828254611e519190613d0e565b9091555050600754611e6e906001600160a01b031633308961322f565b6040805188815260208101889052908101829052339030907fad3fa07f4195b47e64892eb944ecbfc253384053c119852bb2bcae484c2fcb699060600160405180910390a3505050505061150060015f80516020613e5f83398151915255565b5f61144e3383612ad3565b6001600160a01b0382165f908152600960205260409020546060908210611f0e5750604080515f81526020810190915261144e565b6001600160a01b0383165f908152600960205260408120805484908110611f3757611f37613d34565b5f9182526020918290206040805160c081018252600690930290910180548352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015460ff1615801560a0830152909150611fad575050604080515f81526020810190915261144e565b6001600160a01b0384165f908152600b6020908152604080832086845290915281205490611fd96128f2565b90505f825b8281101561202e576001600160a01b0388165f908152600a602090815260408083208a8452825280832084845290915290205460ff16612026578161202281613d48565b9250505b600101611fde565b505f8167ffffffffffffffff81111561204957612049613d60565b604051908082528060200260200182016040528015612072578160200160208202803683370190505b5090505f845b848110156120e6576001600160a01b038a165f908152600a602090815260408083208c8452825280832084845290915290205460ff166120de57808383815181106120c5576120c5613d34565b6020908102919091010152816120da81613d48565b9250505b600101612078565b509098975050505050505050565b6120fc612c52565b611464613268565b5f61210d612a6c565b612115612a9c565b60055f9054906101000a90046001600160a01b03166001600160a01b03166363a599a46040518163ffffffff1660e01b8152600401602060405180830381865afa158015612165573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121899190613c5d565b156121a65760405162461bcd60e51b81526004016107d890613c76565b335f90815260096020526040902054839081106121d55760405162461bcd60e51b81526004016107d890613cb9565b6121dd611466565b335f908152600b60209081526040808320878452909152812054906122006128f2565b9050818510156122615760405162461bcd60e51b815260206004820152602660248201527f4167656e745374616b696e675f5f45706f6368206265666f7265207374616b65604482015265081cdd185c9d60d21b60648201526084016107d8565b8085106122cb5760405162461bcd60e51b815260206004820152603260248201527f4167656e745374616b696e675f5f43616e6e6f7420636c61696d2063757272656044820152710dce840dee440cceae8eae4ca40cae0dec6d60731b60648201526084016107d8565b335f9081526009602052604081208054889081106122eb576122eb613d34565b5f9182526020909120600690910201600581015490915060ff16156123225760405162461bcd60e51b81526004016107d890613dc1565b335f908152600d602090815260408083208a84529091528120549084821161234a5784612355565b612355826001613d0e565b9050808810156123c25760405162461bcd60e51b815260206004820152603260248201527f4167656e745374616b696e675f5f45706f636820616c726561647920636c61696044820152711b5959081d9a584818da1958dadc1bda5b9d60721b60648201526084016107d8565b5f6123ce338b8b6132b0565b90505f81116123ef5760405162461bcd60e51b81526004016107d890613dc1565b335f908152600c602090815260408083208d845290915281208054839290612418908490613d0e565b909155506124299050338b83612e4e565b965050505050505061144e60015f80516020613e5f83398151915255565b5f805f612452612a6c565b61245a612a9c565b60055f9054906101000a90046001600160a01b03166001600160a01b03166363a599a46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124ce9190613c5d565b156124eb5760405162461bcd60e51b81526004016107d890613c76565b335f908152600960205260409020548590811061251a5760405162461bcd60e51b81526004016107d890613cb9565b5f85116125815760405162461bcd60e51b815260206004820152602f60248201527f4167656e745374616b696e675f5f4d61782065706f636873206d75737420626560448201526e02067726561746572207468616e203608c1b60648201526084016107d8565b612589611466565b335f818152600d602090815260408083208a8452825280832054938352600b82528083208a8452909152812054906125bf6128f2565b90505f8284116125cf57826125da565b6125da846001613d0e565b90505f6125e78a83613d0e565b9050828111156125f45750815b8282106126435760405162461bcd60e51b815260206004820181905260248201527f4167656e745374616b696e675f5f4e6f2065706f63687320746f20636c61696d60448201526064016107d8565b61264f338c848461333c565b985061265b8282613d21565b97508281109650881561270257815b818110156126d057335f908152600a602090815260408083208f8452825280832084845290915290205460ff166126c857335f908152600a602090815260408083208f845282528083208484529091529020805460ff191660011790555b60010161266a565b505f876126e7576126e2600185613d21565b6126f2565b6126f2600183613d21565b9050612700338d8c84612c1c565b505b50505050505061271e60015f80516020613e5f83398151915255565b9250925092565b6009602052815f5260405f20818154811061273e575f80fd5b5f91825260209091206006909102018054600182015460028301546003840154600485015460059095015493965091945092909160ff1686565b6001600160a01b0382165f9081526009602052604081205460609083106127cc575050604080518082019091526013815272092dcecc2d8d2c840e6e8c2d6ca40d2dcc8caf606b1b60208201525f906128eb565b6001600160a01b0384165f9081526009602052604081208054859081106127f5576127f5613d34565b5f9182526020918290206040805160c081018252600690930290910180548352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015460ff1615801560a083015290915061289457505060408051808201909152601781527f5374616b6520616c72656164792077697468647261776e00000000000000000060208201525f91506128eb565b80604001514210156128d6575050604080518082019091526015815274131bd8dac81c195c9a5bd9081b9bdd08195b991959605a1b60208201525f91506128eb565b505060408051602081019091525f8152600191505b9250929050565b5f60045442101561290257505f90565b62093a80600454426129149190613d21565b61291e9190613e08565b905090565b335f90815260096020526040812054821061293f57505f919050565b335f90815260096020526040812080548490811061295f5761295f613d34565b5f9182526020918290206040805160c081018252600690930290910180548352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015460ff1615801560a08301529091506129c857505f92915050565b6129d2338461345e565b9392505050565b6001600160a01b0382165f818152600c60209081526040808320858452825280832054938352600d82528083208584529091528120549080612a1b8686612ad3565b9150612a278686612d42565b905092959194509250565b612a3a612c52565b6001600160a01b038116612a6357604051631e4fbdf760e01b81525f60048201526024016107d8565b61135381613165565b5f80516020613e3f8339815191525460ff16156114645760405163d93c066560e01b815260040160405180910390fd5b5f80516020613e5f833981519152805460011901612acd57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b6001600160a01b0382165f908152600960205260408120548210612af857505f61144e565b6001600160a01b0383165f908152600960205260408120805484908110612b2157612b21613d34565b5f9182526020918290206040805160c081018252600690930290910180548352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015460ff1615801560a0830152909150612b8b575f91505061144e565b6001600160a01b0384165f818152600d60209081526040808320878452825280832054938352600b825280832087845290915281205490612bca6128f2565b90505f828411612bda5782612be5565b612be5846001613d0e565b9050805b82811015612c1057612bfc898983612fd0565b612c069088613d0e565b9650600101612be9565b50505050505092915050565b8115612c3957612c2e84848385612d63565b612c39848484612e4e565b50505050565b60015f80516020613e5f83398151915255565b33612c847f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146114645760405163118cdaa760e01b81523360048201526024016107d8565b335f908152600960205260408120805483908110612ccd57612ccd613d34565b5f9182526020909120600690910201600581015490915060ff16156109835760405162461bcd60e51b815260206004820152602560248201527f4167656e745374616b696e675f5f5374616b6520616c72656164792077697468604482015264323930bbb760d91b60648201526084016107d8565b5f612d4d8383612ad3565b9050612d59838361345e565b6129d29082613d0e565b6001600160a01b0384165f908152600c6020908152604080832086845290915281208054839290612d95908490613d0e565b90915550506001600160a01b0384165f908152600d602090815260408083208684529091529020548210612de9576001600160a01b0384165f908152600d6020908152604080832086845290915290208290555b6001600160a01b0384165f818152600c602090815260408083208784528252918290205482518781529182018690528183015290517f22188920b268f2e593aff5b88d1f7cc5d72d0efdb4d66f1b5551a8e68e4e32199181900360600190a250505050565b8015612ebc578060025f828254612e659190613d0e565b90915550612e7590508382613701565b60408051838152602081018390526001600160a01b0385169130917fd92c424393cb3ccdf7d5e36602e3bfa34f24490579ba47978f4bcfad496995f2910160405180910390a35b505050565b6040516001600160a01b03838116602483015260448201839052612ebc91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061376c565b612f286137d8565b5f80516020613e3f833981519152805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0061144e565b612faf613807565b6113538161382c565b611464613807565b612fc8613807565b611464613834565b6001600160a01b0383165f908152600960205260408120548310612ff557505f6129d2565b6001600160a01b0384165f90815260096020526040812080548590811061301e5761301e613d34565b5f9182526020918290206040805160c081018252600690930290910180548352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015460ff1615801560a0830152909150613088575f9150506129d2565b6001600160a01b0385165f908152600b602090815260408083208784529091529020548310156130bb575f9150506129d2565b6001600160a01b0385165f908152600a60209081526040808320878452825280832086845290915290205460ff16156130f7575f9150506129d2565b5f61310d825f01516131088661383c565b61385a565b9050805f03613120575f925050506129d2565b5f61312b8386613896565b9050805f0361313f575f93505050506129d2565b5f62093a8061314e8385613e27565b6131589190613e08565b9050611b04848288613907565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f6131de6128f2565b6001600160a01b0384165f908152600b6020908152604080832086845290915281205491925003612ebc576001600160a01b03929092165f908152600b602090815260408083209383529290522055565b6040516001600160a01b038481166024830152838116604483015260648201839052612c399186918216906323b872dd90608401612eee565b613270612a6c565b5f80516020613e3f833981519152805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833612f61565b6001600160a01b0383165f908152600a60209081526040808320858452825280832084845290915281205460ff16156132ea57505f6129d2565b5f6132f6858585612fd0565b90508015613334576001600160a01b0385165f908152600a6020908152604080832087845282528083208684529091529020805460ff191660011790555b949350505050565b6001600160a01b0384165f90815260096020526040812054841061336157505f613334565b6001600160a01b0385165f90815260096020526040812080548690811061338a5761338a613d34565b5f9182526020918290206040805160c081018252600690930290910180548352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015460ff1615801560a08301529091506133f4575f915050613334565b6001600160a01b0386165f908152600b60209081526040808320888452909152812054908186116134255781613427565b855b9050805b858110156134525761343e898983612fd0565b6134489086613d0e565b945060010161342b565b50505050949350505050565b6001600160a01b0382165f90815260096020526040812080548291908490811061348a5761348a613d34565b5f9182526020918290206040805160c081018252600690930290910180548352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015460ff1615801560a08301529091506134f4575f91505061144e565b5f6134fd6128f2565b6001600160a01b0386165f908152600b6020908152604080832088845290915290205490915080821015613536575f935050505061144e565b5f613547845f01516131088561383c565b9050805f0361355c575f94505050505061144e565b5f61356a62093a8085613e27565b6004546135779190613d0e565b90505f8186602001511161358b5781613591565b85602001515b90505f61359e8242613d21565b9050805f036135b6575f97505050505050505061144e565b5f62093a806135c58387613e27565b6135cf9190613e08565b905042886040015110613618576135f0670de0b6b3a7640000612710613e27565b6135fd8960800151613a2d565b6136079083613e27565b6136119190613e08565b98506136f3565b82886040015111156136de575f8389604001516136359190613d21565b90505f6136428285613d21565b90505f62093a80613653848a613e27565b61365d9190613e08565b90505f613674670de0b6b3a7640000612710613e27565b6136818d60800151613a2d565b61368b9084613e27565b6136959190613e08565b90505f62093a806136a6858c613e27565b6136b09190613e08565b90505f6136c5670de0b6b3a764000083613e08565b90506136d18184613d0e565b9e505050505050506136f3565b6136f0670de0b6b3a764000082613e08565b98505b505050505050505092915050565b80156115005760065460405163a8031a1d60e01b81526001600160a01b038481166004830152602482018490529091169063a8031a1d906044015f604051808303815f87803b158015613752575f80fd5b505af1158015613764573d5f803e3d5ffd5b505050505050565b5f8060205f8451602086015f885af18061378b576040513d5f823e3d81fd5b50505f513d915081156137a25780600114156137af565b6001600160a01b0384163b155b15612c3957604051635274afe760e01b81526001600160a01b03851660048201526024016107d8565b5f80516020613e3f8339815191525460ff1661146457604051638dfc202b60e01b815260040160405180910390fd5b61380f613a3a565b61146457604051631afcd79f60e31b815260040160405180910390fd5b612a3a613807565b612c3f613807565b5f818152600e60205260408120549081900361098357505060015490565b5f64496cebb800670de0b6b3a764000062093a806138788587613e27565b6138829190613e27565b61388c9190613e27565b6129d29190613e08565b5f806138a562093a8084613e27565b6004546138b29190613d0e565b90505f6138c262093a8083613d0e565b90505f828660200151116138d657826138dc565b85602001515b9050818181116138f2575f94505050505061144e565b6138fc8282613d21565b979650505050505050565b5f8061391662093a8084613e27565b6004546139239190613d0e565b90505f61393362093a8083613d0e565b90508086604001511061397c57613954670de0b6b3a7640000612710613e27565b6139618760800151613a2d565b61396b9087613e27565b6139759190613e08565b9250613a24565b8186604001511115613a0f575f8287604001516139999190613d21565b90505f62093a806139aa8389613e27565b6139b49190613e08565b90505f6139c18289613d21565b9050670de0b6b3a7640000816127106139dd8c60800151613a2d565b6139e79086613e27565b6139f19190613e08565b6139fb9190613d0e565b613a059190613e08565b9550505050613a24565b613a21670de0b6b3a764000086613e08565b92505b50509392505050565b5f61144e82612710613d0e565b5f613a43612f7f565b54600160401b900460ff16919050565b5f60208284031215613a63575f80fd5b5035919050565b6001600160a01b0381168114611353575f80fd5b5f60208284031215613a8e575f80fd5b81356129d281613a6a565b5f815180845260208085019450602084015f5b83811015613ac857815187529582019590820190600101613aac565b509495945050505050565b60a081525f613ae560a0830188613a99565b8281036020840152613af78188613a99565b90508281036040840152613b0b8187613a99565b90508281036060840152613b1f8186613a99565b90508281036080840152611b048185613a99565b5f805f60608486031215613b45575f80fd5b8335613b5081613a6a565b95602085013595506040909401359392505050565b5f8060408385031215613b76575f80fd5b50508035926020909101359150565b5f8060408385031215613b96575f80fd5b8235613ba181613a6a565b946020939093013593505050565b5f8060408385031215613bc0575f80fd5b8235613bcb81613a6a565b91506020830135613bdb81613a6a565b809150509250929050565b602081525f6129d26020830184613a99565b82151581525f60206040602084015283518060408501525f5b81811015613c2d57858101830151858201606001528201613c11565b505f606082860101526060601f19601f830116850101925050509392505050565b80518015158114610983575f80fd5b5f60208284031215613c6d575f80fd5b6129d282613c4e565b60208082526023908201527f4167656e745374616b696e675f5f456d657267656e63792073746f702061637460408201526269766560e81b606082015260800190565b60208082526021908201527f4167656e745374616b696e675f5f496e76616c6964207374616b6520696e64656040820152600f60fb1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561144e5761144e613cfa565b8181038181111561144e5761144e613cfa565b634e487b7160e01b5f52603260045260245ffd5b5f60018201613d5957613d59613cfa565b5060010190565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215613d84575f80fd5b81516129d281613a6a565b5f805f60608486031215613da1575f80fd5b8351925060208401519150613db860408501613c4e565b90509250925092565b60208082526027908201527f4167656e745374616b696e675f5f4e6f207265776172647320666f72207468696040820152660e640cae0dec6d60cb1b606082015260800190565b5f82613e2257634e487b7160e01b5f52601260045260245ffd5b500490565b808202811582820484141761144e5761144e613cfa56fecd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a2646970667358221220d45783fdd423322d45ca81c94ada0fa9bdfb0ca78d40ab15e3895d6ba97939ce64736f6c63430008170033