Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 724 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Stake | 13184266 | 1208 days ago | IN | 0 ETH | 0.00382293 | ||||
Stake | 13184266 | 1208 days ago | IN | 0 ETH | 0.00383142 | ||||
Transfer Ownersh... | 13036757 | 1231 days ago | IN | 0 ETH | 0.00218241 | ||||
Set Daily Distri... | 13036747 | 1231 days ago | IN | 0 ETH | 0.00857734 | ||||
Set Daily Distri... | 13036739 | 1231 days ago | IN | 0 ETH | 0.00892599 | ||||
Set Daily Distri... | 13036730 | 1231 days ago | IN | 0 ETH | 0.00938968 | ||||
Set Daily Distri... | 13036727 | 1231 days ago | IN | 0 ETH | 0.00939065 | ||||
Set Daily Distri... | 13036717 | 1231 days ago | IN | 0 ETH | 0.00927184 | ||||
Set Daily Distri... | 13036712 | 1231 days ago | IN | 0 ETH | 0.01043298 | ||||
Set Daily Distri... | 13036695 | 1231 days ago | IN | 0 ETH | 0.01043406 | ||||
Set Daily Distri... | 13036695 | 1231 days ago | IN | 0 ETH | 0.01043298 | ||||
Set Daily Distri... | 13036670 | 1231 days ago | IN | 0 ETH | 0.007889 | ||||
Stake | 13035779 | 1231 days ago | IN | 0 ETH | 0.00889 | ||||
Lockable Token | 13035187 | 1231 days ago | IN | 0 ETH | 0.00179736 | ||||
Lockable Token | 13035187 | 1231 days ago | IN | 0 ETH | 0.00179736 | ||||
Lockable Token | 13035187 | 1231 days ago | IN | 0 ETH | 0.00181145 | ||||
Lockable Token | 13035187 | 1231 days ago | IN | 0 ETH | 0.00181145 | ||||
Lockable Token | 13035186 | 1231 days ago | IN | 0 ETH | 0.00181145 | ||||
Lockable Token | 13035186 | 1231 days ago | IN | 0 ETH | 0.00181145 | ||||
Lockable Token | 13035186 | 1231 days ago | IN | 0 ETH | 0.00164038 | ||||
Lockable Token | 13035185 | 1231 days ago | IN | 0 ETH | 0.0021862 | ||||
Un Stake | 13035145 | 1231 days ago | IN | 0 ETH | 0.01452474 | ||||
Un Stake | 13035078 | 1231 days ago | IN | 0 ETH | 0.01844746 | ||||
Un Stake | 13035062 | 1231 days ago | IN | 0 ETH | 0.01700496 | ||||
Stake | 13035052 | 1231 days ago | IN | 0 ETH | 0.01533159 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
UnifarmV8
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-05-18 */ // Sources flattened with hardhat v2.1.2 https://hardhat.org // File contracts/libraries/Context.sol // SPDX-License-Identifier: MIT; pragma solidity >=0.6.0 <=0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File contracts/abstract/Pausable.sol pragma solidity >=0.6.0 <=0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File contracts/abstract/Ownable.sol pragma solidity >=0.6.0 <=0.8.0; abstract contract Ownable is Pausable { address public _owner; address public _admin; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor(address ownerAddress) { _owner = msg.sender; _admin = ownerAddress; emit OwnershipTransferred(address(0), _owner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyAdmin() { require(_admin == _msgSender(), "Ownable: caller is not the Admin"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyAdmin { emit OwnershipTransferred(_owner, _admin); _owner = _admin; } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File contracts/libraries/SafeMath.sol pragma solidity ^0.7.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File contracts/interfaces/IERC20.sol pragma solidity ^0.7.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); } // File contracts/abstract/Admin.sol pragma solidity ^0.7.0; abstract contract Admin is Ownable { struct tokenInfo { bool isExist; uint8 decimal; uint256 userMinStake; uint256 userMaxStake; uint256 totalMaxStake; uint256 lockableDays; bool optionableStatus; } using SafeMath for uint256; address[] public tokens; mapping(address => address[]) public tokensSequenceList; mapping(address => tokenInfo) public tokenDetails; mapping(address => mapping(address => uint256)) public tokenDailyDistribution; mapping(address => mapping(address => bool)) public tokenBlockedStatus; uint256[] public intervalDays = [1, 8, 15, 22, 29, 36, 43, 50]; uint256 public constant DAYS = 1 days; uint256 public constant HOURS = 1 hours; uint256 public stakeDuration; uint256 public refPercentage; uint256 public optionableBenefit; event TokenDetails( address indexed tokenAddress, uint256 userMinStake, uint256 userMaxStake, uint256 totalMaxStake, uint256 updatedTime ); event LockableTokenDetails( address indexed tokenAddress, uint256 lockableDys, bool optionalbleStatus, uint256 updatedTime ); event DailyDistributionDetails( address indexed stakedTokenAddress, address indexed rewardTokenAddress, uint256 rewards, uint256 time ); event SequenceDetails( address indexed stakedTokenAddress, address[] rewardTokenSequence, uint256 time ); event StakeDurationDetails(uint256 updatedDuration, uint256 time); event OptionableBenefitDetails(uint256 updatedBenefit, uint256 time); event ReferrerPercentageDetails(uint256 updatedRefPercentage, uint256 time); event IntervalDaysDetails(uint256[] updatedIntervals, uint256 time); event BlockedDetails( address indexed stakedTokenAddress, address indexed rewardTokenAddress, bool blockedStatus, uint256 time ); event WithdrawDetails( address indexed tokenAddress, uint256 withdrawalAmount, uint256 time ); constructor(address _owner) Ownable(_owner) { stakeDuration = 90 days; refPercentage = 2500000000000000000; optionableBenefit = 2; } function addToken( address tokenAddress, uint256 userMinStake, uint256 userMaxStake, uint256 totalStake, uint8 decimal ) public onlyOwner returns (bool) { if (!(tokenDetails[tokenAddress].isExist)) tokens.push(tokenAddress); tokenDetails[tokenAddress].isExist = true; tokenDetails[tokenAddress].decimal = decimal; tokenDetails[tokenAddress].userMinStake = userMinStake; tokenDetails[tokenAddress].userMaxStake = userMaxStake; tokenDetails[tokenAddress].totalMaxStake = totalStake; emit TokenDetails( tokenAddress, userMinStake, userMaxStake, totalStake, block.timestamp ); return true; } function setDailyDistribution( address[] memory stakedToken, address[] memory rewardToken, uint256[] memory dailyDistribution ) public onlyOwner { require( stakedToken.length == rewardToken.length && rewardToken.length == dailyDistribution.length, "Invalid Input" ); for (uint8 i = 0; i < stakedToken.length; i++) { require( tokenDetails[stakedToken[i]].isExist && tokenDetails[rewardToken[i]].isExist, "Token not exist" ); tokenDailyDistribution[stakedToken[i]][ rewardToken[i] ] = dailyDistribution[i]; emit DailyDistributionDetails( stakedToken[i], rewardToken[i], dailyDistribution[i], block.timestamp ); } } function updateSequence( address stakedToken, address[] memory rewardTokenSequence ) public onlyOwner { tokensSequenceList[stakedToken] = new address[](0); require(tokenDetails[stakedToken].isExist, "Staked Token Not Exist"); for (uint8 i = 0; i < rewardTokenSequence.length; i++) { require( rewardTokenSequence.length <= tokens.length, "Invalid Input" ); require( tokenDetails[rewardTokenSequence[i]].isExist, "Reward Token Not Exist" ); tokensSequenceList[stakedToken].push(rewardTokenSequence[i]); } emit SequenceDetails( stakedToken, tokensSequenceList[stakedToken], block.timestamp ); } function updateToken( address tokenAddress, uint256 userMinStake, uint256 userMaxStake, uint256 totalStake ) public onlyOwner { require(tokenDetails[tokenAddress].isExist, "Token Not Exist"); tokenDetails[tokenAddress].userMinStake = userMinStake; tokenDetails[tokenAddress].userMaxStake = userMaxStake; tokenDetails[tokenAddress].totalMaxStake = totalStake; emit TokenDetails( tokenAddress, userMinStake, userMaxStake, totalStake, block.timestamp ); } function lockableToken( address tokenAddress, uint8 lockableStatus, uint256 lockedDays, bool optionableStatus ) public onlyOwner { require( lockableStatus == 1 || lockableStatus == 2 || lockableStatus == 3, "Invalid Lockable Status" ); require(tokenDetails[tokenAddress].isExist == true, "Token Not Exist"); if (lockableStatus == 1) { tokenDetails[tokenAddress].lockableDays = block.timestamp.add( lockedDays ); } else if (lockableStatus == 2) tokenDetails[tokenAddress].lockableDays = 0; else if (lockableStatus == 3) tokenDetails[tokenAddress].optionableStatus = optionableStatus; emit LockableTokenDetails( tokenAddress, tokenDetails[tokenAddress].lockableDays, tokenDetails[tokenAddress].optionableStatus, block.timestamp ); } function updateStakeDuration(uint256 durationTime) public onlyOwner { stakeDuration = durationTime; emit StakeDurationDetails(stakeDuration, block.timestamp); } function updateOptionableBenefit(uint256 benefit) public onlyOwner { optionableBenefit = benefit; emit OptionableBenefitDetails(optionableBenefit, block.timestamp); } function updateRefPercentage(uint256 refPer) public onlyOwner { refPercentage = refPer; emit ReferrerPercentageDetails(refPercentage, block.timestamp); } function updateIntervalDays(uint256[] memory _interval) public onlyOwner { intervalDays = new uint256[](0); for (uint8 i = 0; i < _interval.length; i++) { uint256 noD = stakeDuration.div(DAYS); require(noD > _interval[i], "Invalid Interval Day"); intervalDays.push(_interval[i]); } emit IntervalDaysDetails(intervalDays, block.timestamp); } function changeTokenBlockedStatus( address stakedToken, address rewardToken, bool status ) public onlyOwner { require( tokenDetails[stakedToken].isExist && tokenDetails[rewardToken].isExist, "Token not exist" ); tokenBlockedStatus[stakedToken][rewardToken] = status; emit BlockedDetails( stakedToken, rewardToken, tokenBlockedStatus[stakedToken][rewardToken], block.timestamp ); } function safeWithdraw(address tokenAddress, uint256 amount) public onlyOwner { require( IERC20(tokenAddress).balanceOf(address(this)) >= amount, "Insufficient Balance" ); require( IERC20(tokenAddress).transfer(_owner, amount), "Transfer failed" ); emit WithdrawDetails(tokenAddress, amount, block.timestamp); } function viewTokensCount() external view returns (uint256) { return tokens.length; } } // File contracts/UnifarmV8.sol pragma solidity ^0.7.0; /** * @title Unifarm Contract * @author OroPocket */ contract UnifarmV8 is Admin { // Wrappers over Solidity's arithmetic operations using SafeMath for uint256; // Stores Stake Details struct stakeInfo { address user; bool[] isActive; address[] referrer; address[] tokenAddress; uint256[] stakeId; uint256[] stakedAmount; uint256[] startTime; } // Mapping mapping(address => stakeInfo) public stakingDetails; mapping(address => mapping(address => uint256)) public userTotalStaking; mapping(address => uint256) public totalStaking; uint256 public poolStartTime; // Events event Stake( address indexed userAddress, uint256 stakeId, address indexed referrerAddress, address indexed tokenAddress, uint256 stakedAmount, uint256 time ); event Claim( address indexed userAddress, address indexed stakedTokenAddress, address indexed tokenAddress, uint256 claimRewards, uint256 time ); event UnStake( address indexed userAddress, address indexed unStakedtokenAddress, uint256 unStakedAmount, uint256 time, uint256 stakeId ); event ReferralEarn( address indexed userAddress, address indexed callerAddress, address indexed rewardTokenAddress, uint256 rewardAmount, uint256 time ); constructor() Admin(msg.sender) { poolStartTime = block.timestamp; } /** * @notice Stake tokens to earn rewards * @param tokenAddress Staking token address * @param amount Amount of tokens to be staked */ function stake( address referrerAddress, address tokenAddress, uint256 amount ) external whenNotPaused { // checks require( msg.sender != referrerAddress, "STAKE: invalid referrer address" ); require( tokenDetails[tokenAddress].isExist, "STAKE : Token is not Exist" ); require( userTotalStaking[msg.sender][tokenAddress].add(amount) >= tokenDetails[tokenAddress].userMinStake, "STAKE : Min Amount should be within permit" ); require( userTotalStaking[msg.sender][tokenAddress].add(amount) <= tokenDetails[tokenAddress].userMaxStake, "STAKE : Max Amount should be within permit" ); require( totalStaking[tokenAddress].add(amount) <= tokenDetails[tokenAddress].totalMaxStake, "STAKE : Maxlimit exceeds" ); require( poolStartTime.add(stakeDuration) > block.timestamp, "STAKE: Staking Time Completed" ); // Storing stake details stakingDetails[msg.sender].stakeId.push( stakingDetails[msg.sender].stakeId.length ); stakingDetails[msg.sender].isActive.push(true); stakingDetails[msg.sender].user = msg.sender; stakingDetails[msg.sender].referrer.push(referrerAddress); stakingDetails[msg.sender].tokenAddress.push(tokenAddress); stakingDetails[msg.sender].startTime.push(block.timestamp); // Update total staking amount stakingDetails[msg.sender].stakedAmount.push(amount); totalStaking[tokenAddress] = totalStaking[tokenAddress].add(amount); userTotalStaking[msg.sender][tokenAddress] = userTotalStaking[ msg.sender ][tokenAddress] .add(amount); // Transfer tokens from userf to contract require( IERC20(tokenAddress).transferFrom( msg.sender, address(this), amount ), "Transfer Failed" ); // Emit state changes emit Stake( msg.sender, (stakingDetails[msg.sender].stakeId.length.sub(1)), referrerAddress, tokenAddress, amount, block.timestamp ); } /** * @notice Claim accumulated rewards * @param stakeId Stake ID of the user * @param stakedAmount Staked amount of the user */ function claimRewards( address userAddress, uint256 stakeId, uint256 stakedAmount, uint256 totalStake ) internal { // Local variables uint256 interval; uint256 endOfProfit; interval = poolStartTime.add(stakeDuration); // Interval calculation if (interval > block.timestamp) endOfProfit = block.timestamp; else endOfProfit = poolStartTime.add(stakeDuration); interval = endOfProfit.sub( stakingDetails[userAddress].startTime[stakeId] ); uint256[2] memory stakeData; stakeData[0] = (stakedAmount); stakeData[1] = (totalStake); // Reward calculation if (interval >= HOURS) _rewardCalculation(userAddress, stakeId, stakeData, interval); } function _rewardCalculation( address userAddress, uint256 stakeId, uint256[2] memory stakingData, uint256 interval ) internal { uint256 rewardsEarned; uint256 refEarned; uint256[2] memory noOfDays; noOfDays[1] = interval.div(HOURS); noOfDays[0] = interval.div(DAYS); rewardsEarned = noOfDays[1].mul( getOneDayReward( stakingData[0], stakingDetails[userAddress].tokenAddress[stakeId], stakingDetails[userAddress].tokenAddress[stakeId], stakingData[1] ) ); // Referrer Earning if (stakingDetails[userAddress].referrer[stakeId] != address(0)) { refEarned = (rewardsEarned.mul(refPercentage)).div(100 ether); rewardsEarned = rewardsEarned.sub(refEarned); require( IERC20(stakingDetails[userAddress].tokenAddress[stakeId]) .transfer( stakingDetails[userAddress].referrer[stakeId], refEarned ) == true, "Transfer Failed" ); emit ReferralEarn( stakingDetails[userAddress].referrer[stakeId], msg.sender, stakingDetails[userAddress].tokenAddress[stakeId], refEarned, block.timestamp ); } // Rewards Send sendToken( userAddress, stakingDetails[userAddress].tokenAddress[stakeId], stakingDetails[userAddress].tokenAddress[stakeId], rewardsEarned ); uint8 i = 1; while (i < intervalDays.length) { if (noOfDays[0] >= intervalDays[i]) { uint256 reductionHours = (intervalDays[i].sub(1)).mul(24); uint256 balHours = noOfDays[1].sub(reductionHours); address rewardToken = tokensSequenceList[ stakingDetails[userAddress].tokenAddress[stakeId] ][i]; if ( rewardToken != stakingDetails[userAddress].tokenAddress[stakeId] && tokenBlockedStatus[ stakingDetails[userAddress].tokenAddress[stakeId] ][rewardToken] == false ) { rewardsEarned = balHours.mul( getOneDayReward( stakingData[0], stakingDetails[userAddress].tokenAddress[stakeId], rewardToken, stakingData[1] ) ); // Referrer Earning if ( stakingDetails[userAddress].referrer[stakeId] != address(0) ) { refEarned = (rewardsEarned.mul(refPercentage)).div( 100 ether ); rewardsEarned = rewardsEarned.sub(refEarned); require( IERC20(rewardToken).transfer( stakingDetails[userAddress].referrer[stakeId], refEarned ) == true, "Transfer Failed" ); emit ReferralEarn( stakingDetails[userAddress].referrer[stakeId], msg.sender, stakingDetails[userAddress].tokenAddress[stakeId], refEarned, block.timestamp ); } // Rewards Send sendToken( userAddress, stakingDetails[userAddress].tokenAddress[stakeId], rewardToken, rewardsEarned ); } i = i + 1; } else { break; } } } /** * @notice Get rewards for one day * @param stakedAmount Stake amount of the user * @param stakedToken Staked token address of the user * @param rewardToken Reward token address * @return reward One dayh reward for the user */ function getOneDayReward( uint256 stakedAmount, address stakedToken, address rewardToken, uint256 totalStake ) public view returns (uint256 reward) { uint256 lockBenefit; if (tokenDetails[stakedToken].optionableStatus) { stakedAmount = stakedAmount.mul(optionableBenefit); lockBenefit = stakedAmount.mul(optionableBenefit.sub(1)); reward = ( stakedAmount.mul( tokenDailyDistribution[stakedToken][rewardToken] ) ) .div(totalStake.add(lockBenefit)); } else reward = ( stakedAmount.mul( tokenDailyDistribution[stakedToken][rewardToken] ) ) .div(totalStake); } /** * @notice Get rewards for one day * @param stakedToken Stake amount of the user * @param tokenAddress Reward token address * @param amount Amount to be transferred as reward */ function sendToken( address userAddress, address stakedToken, address tokenAddress, uint256 amount ) internal { // Checks if (tokenAddress != address(0)) { require( IERC20(tokenAddress).balanceOf(address(this)) >= amount, "SEND : Insufficient Balance" ); // Transfer of rewards require( IERC20(tokenAddress).transfer(userAddress, amount), "Transfer failed" ); // Emit state changes emit Claim( userAddress, stakedToken, tokenAddress, amount, block.timestamp ); } } /** * @notice Unstake and claim rewards * @param stakeId Stake ID of the user */ function unStake(address userAddress, uint256 stakeId) external whenNotPaused returns (bool) { require( msg.sender == userAddress || msg.sender == _owner, "UNSTAKE: Invalid User Entry" ); address stakedToken = stakingDetails[userAddress].tokenAddress[stakeId]; // lockableDays check require( tokenDetails[stakedToken].lockableDays <= block.timestamp, "UNSTAKE: Token Locked" ); // optional lock check if (tokenDetails[stakedToken].optionableStatus) require( stakingDetails[userAddress].startTime[stakeId].add( stakeDuration ) <= block.timestamp, "UNSTAKE: Locked in optional lock" ); // Checks require( stakingDetails[userAddress].stakedAmount[stakeId] > 0 || stakingDetails[userAddress].isActive[stakeId] == true, "UNSTAKE : Already Claimed (or) Insufficient Staked" ); // State updation uint256 stakedAmount = stakingDetails[userAddress].stakedAmount[stakeId]; uint256 totalStaking1 = totalStaking[stakedToken]; totalStaking[stakedToken] = totalStaking[stakedToken].sub(stakedAmount); userTotalStaking[userAddress][stakedToken] = userTotalStaking[ userAddress ][stakedToken] .sub(stakedAmount); stakingDetails[userAddress].stakedAmount[stakeId] = 0; stakingDetails[userAddress].isActive[stakeId] = false; // Balance check require( IERC20(stakingDetails[userAddress].tokenAddress[stakeId]).balanceOf( address(this) ) >= stakedAmount, "UNSTAKE : Insufficient Balance" ); // Transfer staked token back to user IERC20(stakingDetails[userAddress].tokenAddress[stakeId]).transfer( userAddress, stakedAmount ); claimRewards(userAddress, stakeId, stakedAmount, totalStaking1); // Emit state changes emit UnStake( userAddress, stakingDetails[userAddress].tokenAddress[stakeId], stakedAmount, block.timestamp, stakeId ); return true; } function emergencyUnstake( uint256 stakeId, address userAddress, address[] memory rewardtokens, uint256[] memory amount ) external onlyOwner { // Checks require( stakingDetails[userAddress].stakedAmount[stakeId] > 0 && stakingDetails[userAddress].isActive[stakeId] == true, "EMERGENCY : Already Claimed (or) Insufficient Staked" ); // Balance check require( IERC20(stakingDetails[userAddress].tokenAddress[stakeId]).balanceOf( address(this) ) >= stakingDetails[userAddress].stakedAmount[stakeId], "EMERGENCY : Insufficient Balance" ); uint256 stakeAmount = stakingDetails[userAddress].stakedAmount[stakeId]; stakingDetails[userAddress].isActive[stakeId] = false; stakingDetails[userAddress].stakedAmount[stakeId] = 0; totalStaking[ stakingDetails[userAddress].tokenAddress[stakeId] ] = totalStaking[stakingDetails[userAddress].tokenAddress[stakeId]].sub( stakeAmount ); IERC20(stakingDetails[userAddress].tokenAddress[stakeId]).transfer( userAddress, stakeAmount ); for (uint256 i; i < rewardtokens.length; i++) { require( IERC20(rewardtokens[i]).balanceOf(address(this)) >= amount[i], "EMERGENCY : Insufficient Reward Balance" ); uint256 rewardsEarned = amount[i]; if (stakingDetails[userAddress].referrer[stakeId] != address(0)) { uint256 refEarned = (rewardsEarned.mul(refPercentage)).div(100 ether); rewardsEarned = rewardsEarned.sub(refEarned); require( IERC20(rewardtokens[i]).transfer( stakingDetails[userAddress].referrer[stakeId], refEarned ), "EMERGENCY : Transfer Failed" ); emit ReferralEarn( stakingDetails[userAddress].referrer[stakeId], userAddress, rewardtokens[i], refEarned, block.timestamp ); } IERC20(rewardtokens[i]).transfer(userAddress, rewardsEarned); } // Emit state changes emit UnStake( userAddress, stakingDetails[userAddress].tokenAddress[stakeId], stakeAmount, block.timestamp, stakeId ); } /** * @notice View staking details * @param _user User address */ function viewStakingDetails(address _user) public view returns ( address[] memory, address[] memory, bool[] memory, uint256[] memory, uint256[] memory, uint256[] memory ) { return ( stakingDetails[_user].referrer, stakingDetails[_user].tokenAddress, stakingDetails[_user].isActive, stakingDetails[_user].stakeId, stakingDetails[_user].stakedAmount, stakingDetails[_user].startTime ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakedTokenAddress","type":"address"},{"indexed":true,"internalType":"address","name":"rewardTokenAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"blockedStatus","type":"bool"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"BlockedDetails","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"userAddress","type":"address"},{"indexed":true,"internalType":"address","name":"stakedTokenAddress","type":"address"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"claimRewards","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakedTokenAddress","type":"address"},{"indexed":true,"internalType":"address","name":"rewardTokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewards","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"DailyDistributionDetails","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"updatedIntervals","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"IntervalDaysDetails","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"lockableDys","type":"uint256"},{"indexed":false,"internalType":"bool","name":"optionalbleStatus","type":"bool"},{"indexed":false,"internalType":"uint256","name":"updatedTime","type":"uint256"}],"name":"LockableTokenDetails","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"updatedBenefit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"OptionableBenefitDetails","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"userAddress","type":"address"},{"indexed":true,"internalType":"address","name":"callerAddress","type":"address"},{"indexed":true,"internalType":"address","name":"rewardTokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"ReferralEarn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"updatedRefPercentage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"ReferrerPercentageDetails","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakedTokenAddress","type":"address"},{"indexed":false,"internalType":"address[]","name":"rewardTokenSequence","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"SequenceDetails","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakeId","type":"uint256"},{"indexed":true,"internalType":"address","name":"referrerAddress","type":"address"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"Stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"updatedDuration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"StakeDurationDetails","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"userMinStake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userMaxStake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalMaxStake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"updatedTime","type":"uint256"}],"name":"TokenDetails","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"userAddress","type":"address"},{"indexed":true,"internalType":"address","name":"unStakedtokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"unStakedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeId","type":"uint256"}],"name":"UnStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"withdrawalAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"WithdrawDetails","type":"event"},{"inputs":[],"name":"DAYS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOURS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"userMinStake","type":"uint256"},{"internalType":"uint256","name":"userMaxStake","type":"uint256"},{"internalType":"uint256","name":"totalStake","type":"uint256"},{"internalType":"uint8","name":"decimal","type":"uint8"}],"name":"addToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"stakedToken","type":"address"},{"internalType":"address","name":"rewardToken","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"changeTokenBlockedStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakeId","type":"uint256"},{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"address[]","name":"rewardtokens","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"emergencyUnstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"address","name":"stakedToken","type":"address"},{"internalType":"address","name":"rewardToken","type":"address"},{"internalType":"uint256","name":"totalStake","type":"uint256"}],"name":"getOneDayReward","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"intervalDays","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint8","name":"lockableStatus","type":"uint8"},{"internalType":"uint256","name":"lockedDays","type":"uint256"},{"internalType":"bool","name":"optionableStatus","type":"bool"}],"name":"lockableToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"optionableBenefit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"safeWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"stakedToken","type":"address[]"},{"internalType":"address[]","name":"rewardToken","type":"address[]"},{"internalType":"uint256[]","name":"dailyDistribution","type":"uint256[]"}],"name":"setDailyDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"referrerAddress","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingDetails","outputs":[{"internalType":"address","name":"user","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"tokenBlockedStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"tokenDailyDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenDetails","outputs":[{"internalType":"bool","name":"isExist","type":"bool"},{"internalType":"uint8","name":"decimal","type":"uint8"},{"internalType":"uint256","name":"userMinStake","type":"uint256"},{"internalType":"uint256","name":"userMaxStake","type":"uint256"},{"internalType":"uint256","name":"totalMaxStake","type":"uint256"},{"internalType":"uint256","name":"lockableDays","type":"uint256"},{"internalType":"bool","name":"optionableStatus","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokensSequenceList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalStaking","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"stakeId","type":"uint256"}],"name":"unStake","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_interval","type":"uint256[]"}],"name":"updateIntervalDays","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"benefit","type":"uint256"}],"name":"updateOptionableBenefit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"refPer","type":"uint256"}],"name":"updateRefPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"stakedToken","type":"address"},{"internalType":"address[]","name":"rewardTokenSequence","type":"address[]"}],"name":"updateSequence","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"durationTime","type":"uint256"}],"name":"updateStakeDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"userMinStake","type":"uint256"},{"internalType":"uint256","name":"userMaxStake","type":"uint256"},{"internalType":"uint256","name":"totalStake","type":"uint256"}],"name":"updateToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userTotalStaking","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"viewStakingDetails","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"bool[]","name":"","type":"bool[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewTokensCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
61018060405260016080908152600860a0819052600f60c052601660e052601d61010052602461012052602b610140526032610160526200004391600791620000df565b503480156200005157600080fd5b50600080546001600160a81b0319163361010081810292909217808455600180546001600160a01b03191683179055604051919384936001600160a01b03920491909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350506276a7006008556722b1c8c1227a00006009556002600a5542600e556200014b565b82805482825590600052602060002090810192821562000122579160200282015b8281111562000122578251829060ff1690559160200191906001019062000100565b506200013092915062000134565b5090565b5b8082111562000130576000815560010162000135565b6149e4806200015b6000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c806388125f7911610130578063cdd033c8116100b8578063dd4be6831161007c578063dd4be68314610bdf578063e0a79b1614610c43578063e5c4686914610c69578063f2fde38b14610c71578063fbfcd24114610c9757610227565b8063cdd033c814610961578063d431350614610999578063d43c9535146109d6578063d768779a14610b7b578063d939381414610bb357610227565b8063b104e006116100ff578063b104e006146107c6578063b2bdfa7b146107e3578063bf6eac2f146107eb578063c549e6b914610821578063c922e9371461082957610227565b806388125f79146106b557806396591e31146106d2578063a019cb4b146106ef578063a4f3f0e51461071557610227565b806340f02ab6116101b3578063539cd3b411610182578063539cd3b4146106695780635c975abb146106955780635f96dc111461069d578063715018a6146106a557806385d895ef146106ad57610227565b806340f02ab6146105dc5780634cd36531146105e45780634f64b2be146106205780635058c4601461063d57610227565b8063187739a4116101fa578063187739a41461033b5780631d2002e71461036957806326fa24e91461038657806328523eb61461055957806340a166881461059b57610227565b806301193ad71461022c57806301bc45c9146102cf57806304a624c6146102f35780631320da8b1461030d575b600080fd5b6102cd6004803603602081101561024257600080fd5b810190602081018135600160201b81111561025c57600080fd5b82018360208201111561026e57600080fd5b803590602001918460208302840111600160201b8311171561028f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610c9f945050505050565b005b6102d7610e62565b604080516001600160a01b039092168252519081900360200190f35b6102fb610e71565b60408051918252519081900360200190f35b6102fb6004803603604081101561032357600080fd5b506001600160a01b0381358116916020013516610e77565b6102fb6004803603604081101561035157600080fd5b506001600160a01b0381358116916020013516610e94565b6102cd6004803603602081101561037f57600080fd5b5035610eb1565b6103ac6004803603602081101561039c57600080fd5b50356001600160a01b0316610f50565b6040518080602001806020018060200180602001806020018060200187810387528d818151815260200191508051906020019060200280838360005b838110156104005781810151838201526020016103e8565b5050505090500187810386528c818151815260200191508051906020019060200280838360005b8381101561043f578181015183820152602001610427565b5050505090500187810385528b818151815260200191508051906020019060200280838360005b8381101561047e578181015183820152602001610466565b5050505090500187810384528a818151815260200191508051906020019060200280838360005b838110156104bd5781810151838201526020016104a5565b50505050905001878103835289818151815260200191508051906020019060200280838360005b838110156104fc5781810151838201526020016104e4565b50505050905001878103825288818151815260200191508051906020019060200280838360005b8381101561053b578181015183820152602001610523565b505050509050019c5050505050505050505050505060405180910390f35b6105876004803603604081101561056f57600080fd5b506001600160a01b03813581169160200135166111c6565b604080519115158252519081900360200190f35b610587600480360360a08110156105b157600080fd5b5080356001600160a01b0316906020810135906040810135906060810135906080013560ff166111e6565b6102fb61134b565b6102fb600480360360808110156105fa57600080fd5b508035906001600160a01b03602082013581169160408101359091169060600135611351565b6102d76004803603602081101561063657600080fd5b5035611437565b6102cd6004803603604081101561065357600080fd5b506001600160a01b038135169060200135611461565b6102d76004803603604081101561067f57600080fd5b506001600160a01b0381351690602001356116a3565b6105876116db565b6102fb6116e4565b6102cd6116ea565b6102fb6117c2565b6102cd600480360360208110156106cb57600080fd5b50356117c8565b6102cd600480360360208110156106e857600080fd5b5035611867565b6102d76004803603602081101561070557600080fd5b50356001600160a01b0316611906565b6102cd6004803603604081101561072b57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561075557600080fd5b82018360208201111561076757600080fd5b803590602001918460208302840111600160201b8311171561078857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611921945050505050565b6102fb600480360360208110156107dc57600080fd5b5035611c06565b6102d7611c27565b6102cd6004803603606081101561080157600080fd5b506001600160a01b03813581169160208101359091169060400135611c3b565b6102fb6121ad565b6102cd6004803603608081101561083f57600080fd5b8135916001600160a01b0360208201351691810190606081016040820135600160201b81111561086e57600080fd5b82018360208201111561088057600080fd5b803590602001918460208302840111600160201b831117156108a157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156108f057600080fd5b82018360208201111561090257600080fd5b803590602001918460208302840111600160201b8311171561092357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506121b4945050505050565b6102cd6004803603606081101561097757600080fd5b506001600160a01b038135811691602081013590911690604001351515612ad6565b6102cd600480360360808110156109af57600080fd5b506001600160a01b038135169060ff60208201351690604081013590606001351515612c32565b6102cd600480360360608110156109ec57600080fd5b810190602081018135600160201b811115610a0657600080fd5b820183602082011115610a1857600080fd5b803590602001918460208302840111600160201b83111715610a3957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a8857600080fd5b820183602082011115610a9a57600080fd5b803590602001918460208302840111600160201b83111715610abb57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610b0a57600080fd5b820183602082011115610b1c57600080fd5b803590602001918460208302840111600160201b83111715610b3d57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612e6b945050505050565b6102cd60048036036080811015610b9157600080fd5b506001600160a01b03813516906020810135906040810135906060013561311b565b61058760048036036040811015610bc957600080fd5b506001600160a01b038135169060200135613250565b610c0560048036036020811015610bf557600080fd5b50356001600160a01b03166138cd565b60408051971515885260ff9096166020880152868601949094526060860192909252608085015260a0840152151560c0830152519081900360e00190f35b6102fb60048036036020811015610c5957600080fd5b50356001600160a01b0316613911565b6102fb613923565b6102cd60048036036020811015610c8757600080fd5b50356001600160a01b0316613929565b6102fb613a31565b610ca7613a37565b60005461010090046001600160a01b03908116911614610cfc576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6040805160008152602081019182905251610d1991600791614793565b5060005b81518160ff161015610de057600854600090610d3c9062015180613a3b565b9050828260ff1681518110610d4d57fe5b60200260200101518111610d9f576040805162461bcd60e51b8152602060048201526014602482015273496e76616c696420496e74657276616c2044617960601b604482015290519081900360640190fd5b6007838360ff1681518110610db057fe5b60209081029190910181015182546001818101855560009485529290932090920191909155919091019050610d1d565b507f29635226d0b00834767b0cf38daca8dc0fe978152b0a8a5b39eb28112635236160074260405180806020018381526020018281038252848181548152602001915080548015610e5057602002820191906000526020600020905b815481526020019060010190808311610e3c575b5050935050505060405180910390a150565b6001546001600160a01b031681565b600a5481565b600c60209081526000928352604080842090915290825290205481565b600560209081526000928352604080842090915290825290205481565b610eb9613a37565b60005461010090046001600160a01b03908116911614610f0e576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b60098190556040805182815242602082015281517f886f1c6ee47e76ca7e1c7715d9662c5cbc03a9215b76899c702e3d1c38d1ee43929181900390910190a150565b6001600160a01b0381166000908152600b60209081526040918290206002810180548451818502810185019095528085526060948594859485948594859491936003840193600181019360048201936005830193600690930192889190830182828015610fe657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610fc8575b505050505095508480548060200260200160405190810160405280929190818152602001828054801561104257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611024575b50505050509450838054806020026020016040519081016040528092919081815260200182805480156110b457602002820191906000526020600020906000905b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116110835790505b505050505093508280548060200260200160405190810160405280929190818152602001828054801561110657602002820191906000526020600020905b8154815260200190600101908083116110f2575b505050505092508180548060200260200160405190810160405280929190818152602001828054801561115857602002820191906000526020600020905b815481526020019060010190808311611144575b50505050509150808054806020026020016040519081016040528092919081815260200182805480156111aa57602002820191906000526020600020905b815481526020019060010190808311611196575b5050505050905095509550955095509550955091939550919395565b600660209081526000928352604080842090915290825290205460ff1681565b60006111f0613a37565b60005461010090046001600160a01b03908116911614611245576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b03861660009081526004602052604090205460ff166112b157600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0388161790555b6001600160a01b0386166000818152600460209081526040918290208054600160ff19909116811761ff00191661010060ff891602178255810189905560028101889055600301869055815188815290810187905280820186905242606082015290517f6b9e42b75b3aa79aee18ba04bd3f6dedba2d3e55228fadb89fd22817f7ef81ac916080908290030190a250600195945050505050565b60085481565b6001600160a01b038316600090815260046020526040812060050154819060ff16156113f457600a54611385908790613a84565b95506113a76113a06001600a54613add90919063ffffffff16565b8790613a84565b90506113ed6113b68483613b1f565b6001600160a01b038088166000908152600560209081526040808320938a16835292905220546113e7908990613a84565b90613a3b565b915061142e565b6001600160a01b0380861660009081526005602090815260408083209388168352929052205461142b9084906113e7908990613a84565b91505b50949350505050565b6002818154811061144757600080fd5b6000918252602090912001546001600160a01b0316905081565b611469613a37565b60005461010090046001600160a01b039081169116146114be576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b80826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561150c57600080fd5b505afa158015611520573d6000803e3d6000fd5b505050506040513d602081101561153657600080fd5b50511015611582576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b604482015290519081900360640190fd5b816001600160a01b031663a9059cbb600060019054906101000a90046001600160a01b0316836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156115ee57600080fd5b505af1158015611602573d6000803e3d6000fd5b505050506040513d602081101561161857600080fd5b505161165d576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b6040805182815242602082015281516001600160a01b038516927fcb92e2679de255302c9b8d0673cbdf8ef54667e943bf8f049bcaf6a85926ba1a928290030190a25050565b600360205281600052604060002081815481106116bf57600080fd5b6000918252602090912001546001600160a01b03169150829050565b60005460ff1690565b600e5481565b6116f2613a37565b6001546001600160a01b03908116911614611754576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f74207468652041646d696e604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693610100909204909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600154600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60025490565b6117d0613a37565b60005461010090046001600160a01b03908116911614611825576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b60088190556040805182815242602082015281517ff676bd50ed08b41fe017c9b4b7606b132ed9afafd39cbe090006c602170638bf929181900390910190a150565b61186f613a37565b60005461010090046001600160a01b039081169116146118c4576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b600a8190556040805182815242602082015281517fd9124f37a22fb221df30d124c79aae3c3be0e56338cc2ed4d68ade2a51319f49929181900390910190a150565b600b602052600090815260409020546001600160a01b031681565b611929613a37565b60005461010090046001600160a01b0390811691161461197e576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b60408051600080825260208083018085526001600160a01b0387168352600390915292902090516119af92906147de565b506001600160a01b03821660009081526004602052604090205460ff16611a16576040805162461bcd60e51b815260206004820152601660248201527514dd185ad95908151bdad95b88139bdd08115e1a5cdd60521b604482015290519081900360640190fd5b60005b81518160ff161015611b5f5760025482511115611a6d576040805162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908125b9c1d5d609a1b604482015290519081900360640190fd5b60046000838360ff1681518110611a8057fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16611af1576040805162461bcd60e51b815260206004820152601660248201527514995dd85c9908151bdad95b88139bdd08115e1a5cdd60521b604482015290519081900360640190fd5b6001600160a01b03831660009081526003602052604090208251839060ff8416908110611b1a57fe5b60209081029190910181015182546001808201855560009485529290932090920180546001600160a01b0319166001600160a01b039093169290921790915501611a19565b506001600160a01b03821660008181526003602090815260409182902082514292810183905283815281549381018490527f533d99224d362fcbe71ce5ff0a8b2d61a9c08b8d1df27aab851edb881f3fb16b939192918190606082019085908015611bf357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611bd5575b5050935050505060405180910390a25050565b60078181548110611c1657600080fd5b600091825260209091200154905081565b60005461010090046001600160a01b031681565b611c436116db565b15611c88576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b336001600160a01b0384161415611ce6576040805162461bcd60e51b815260206004820152601f60248201527f5354414b453a20696e76616c6964207265666572726572206164647265737300604482015290519081900360640190fd5b6001600160a01b03821660009081526004602052604090205460ff16611d53576040805162461bcd60e51b815260206004820152601a60248201527f5354414b45203a20546f6b656e206973206e6f74204578697374000000000000604482015290519081900360640190fd5b6001600160a01b038216600081815260046020908152604080832060010154338452600c835281842094845293909152902054611d909083613b1f565b1015611dcd5760405162461bcd60e51b815260040180806020018281038252602a81526020018061491f602a913960400191505060405180910390fd5b6001600160a01b038216600081815260046020908152604080832060020154338452600c835281842094845293909152902054611e0a9083613b1f565b1115611e475760405162461bcd60e51b815260040180806020018281038252602a8152602001806148f5602a913960400191505060405180910390fd5b6001600160a01b038216600090815260046020908152604080832060030154600d90925290912054611e799083613b1f565b1115611ecc576040805162461bcd60e51b815260206004820152601860248201527f5354414b45203a204d61786c696d697420657863656564730000000000000000604482015290519081900360640190fd5b42611ee4600854600e54613b1f90919063ffffffff16565b11611f36576040805162461bcd60e51b815260206004820152601d60248201527f5354414b453a205374616b696e672054696d6520436f6d706c65746564000000604482015290519081900360640190fd5b336000818152600b60209081526040808320600481018054600180820183559186528486208101558082018054808301825590865284862085820401805460ff601f9093166101000a9283021916909117905581546001600160a01b0319908116909617825560028201805480830182559086528486200180546001600160a01b038b8116918916919091179091556003830180548084018255908752858720018054918a16919097168117909655600682018054808301825590865284862042910155600590910180549182018155845282842001859055928252600d905220546120229082613b1f565b6001600160a01b0383166000818152600d6020908152604080832094909455338252600c815283822092825291909152205461205e9082613b1f565b336000818152600c602090815260408083206001600160a01b0388168085529083528184209590955580516323b872dd60e01b8152600481019490945230602485015260448401869052516323b872dd93606480820194918390030190829087803b1580156120cc57600080fd5b505af11580156120e0573d6000803e3d6000fd5b505050506040513d60208110156120f657600080fd5b505161213b576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b604482015290519081900360640190fd5b336000818152600b60205260409020600401546001600160a01b0380851692908616917f8d0a98609f00f26e55cd12ea38ffb8a0dfad170f6f001d682185fdce4ff424449061218b906001613add565b60408051918252602082018790524282820152519081900360600190a4505050565b6201518081565b6121bc613a37565b60005461010090046001600160a01b03908116911614612211576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040812060050180548690811061223857fe5b906000526020600020015411801561229a57506001600160a01b0383166000908152600b6020526040902060010180548590811061227257fe5b90600052602060002090602091828204019190069054906101000a900460ff16151560011515145b6122d55760405162461bcd60e51b815260040180806020018281038252603481526020018061497b6034913960400191505060405180910390fd5b6001600160a01b0383166000908152600b602052604090206005018054859081106122fc57fe5b9060005260206000200154600b6000856001600160a01b03166001600160a01b03168152602001908152602001600020600301858154811061233a57fe5b60009182526020918290200154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561238957600080fd5b505afa15801561239d573d6000803e3d6000fd5b505050506040513d60208110156123b357600080fd5b50511015612408576040805162461bcd60e51b815260206004820181905260248201527f454d455247454e4359203a20496e73756666696369656e742042616c616e6365604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040812060050180548690811061242f57fe5b906000526020600020015490506000600b6000866001600160a01b03166001600160a01b03168152602001908152602001600020600101868154811061247157fe5b90600052602060002090602091828204019190066101000a81548160ff0219169083151502179055506000600b6000866001600160a01b03166001600160a01b0316815260200190815260200160002060050186815481106124cf57fe5b906000526020600020018190555061254381600d6000600b6000896001600160a01b03166001600160a01b03168152602001908152602001600020600301898154811061251857fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205490613add565b6001600160a01b0385166000908152600b602052604081206003018054600d9291908990811061256f57fe5b60009182526020808320909101546001600160a01b0390811684528382019490945260409283018220949094559187168252600b909252206003018054869081106125b657fe5b60009182526020808320909101546040805163a9059cbb60e01b81526001600160a01b038981166004830152602482018790529151919092169363a9059cbb93604480850194919392918390030190829087803b15801561261657600080fd5b505af115801561262a573d6000803e3d6000fd5b505050506040513d602081101561264057600080fd5b50600090505b8351811015612a495782818151811061265b57fe5b602002602001015184828151811061266f57fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156126c357600080fd5b505afa1580156126d7573d6000803e3d6000fd5b505050506040513d60208110156126ed57600080fd5b5051101561272c5760405162461bcd60e51b815260040180806020018281038252602781526020018061488d6027913960400191505060405180910390fd5b600083828151811061273a57fe5b6020026020010151905060006001600160a01b0316600b6000886001600160a01b03166001600160a01b03168152602001908152602001600020600201888154811061278257fe5b6000918252602090912001546001600160a01b0316146129aa5760006127c068056bc75e2d631000006113e760095485613a8490919063ffffffff16565b90506127cc8282613add565b91508583815181106127da57fe5b60200260200101516001600160a01b031663a9059cbb600b60008a6001600160a01b03166001600160a01b031681526020019081526020016000206002018a8154811061282357fe5b6000918252602080832090910154604080516001600160e01b031960e087901b1681526001600160a01b039092166004830152602482018790525160448083019491928390030190829087803b15801561287c57600080fd5b505af1158015612890573d6000803e3d6000fd5b505050506040513d60208110156128a657600080fd5b50516128f9576040805162461bcd60e51b815260206004820152601b60248201527f454d455247454e4359203a205472616e73666572204661696c65640000000000604482015290519081900360640190fd5b85838151811061290557fe5b60200260200101516001600160a01b0316876001600160a01b0316600b60008a6001600160a01b03166001600160a01b031681526020019081526020016000206002018a8154811061295357fe5b6000918252602091829020015460408051868152429381019390935280516001600160a01b03909216927fcc30edb66a991e48ca3676c277d3a35485ebfaf3016fa9536663b2689c8f5eef929081900390910190a4505b8482815181106129b657fe5b60200260200101516001600160a01b031663a9059cbb87836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612a1457600080fd5b505af1158015612a28573d6000803e3d6000fd5b505050506040513d6020811015612a3e57600080fd5b505050600101612646565b506001600160a01b0384166000908152600b60205260409020600301805486908110612a7157fe5b60009182526020918290200154604080518481524293810193909352828101889052516001600160a01b0391821692918716917fa4b627609e711628747558b171b04b9636337afdadac065ee7113fb91eab0b72919081900360600190a35050505050565b612ade613a37565b60005461010090046001600160a01b03908116911614612b33576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b03831660009081526004602052604090205460ff168015612b7357506001600160a01b03821660009081526004602052604090205460ff165b612bb6576040805162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08195e1a5cdd608a1b604482015290519081900360640190fd5b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff19168615151790819055825160ff90911615158152429181019190915281517f38dc54047237de43b07dc5d3a0cd9a29485be07da55d5611ddc91102542938ad929181900390910190a3505050565b612c3a613a37565b60005461010090046001600160a01b03908116911614612c8f576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b8260ff1660011480612ca457508260ff166002145b80612cb257508260ff166003145b612d03576040805162461bcd60e51b815260206004820152601760248201527f496e76616c6964204c6f636b61626c6520537461747573000000000000000000604482015290519081900360640190fd5b6001600160a01b03841660009081526004602052604090205460ff161515600114612d67576040805162461bcd60e51b815260206004820152600f60248201526e151bdad95b88139bdd08115e1a5cdd608a1b604482015290519081900360640190fd5b8260ff1660011415612d9f57612d7d4283613b1f565b6001600160a01b03851660009081526004602081905260409091200155612e00565b8260ff1660021415612dcc576001600160a01b038416600090815260046020819052604082200155612e00565b8260ff1660031415612e00576001600160a01b0384166000908152600460205260409020600501805460ff19168215151790555b6001600160a01b03841660008181526004602081815260409283902091820154600590920154835192835260ff16151590820152428183015290517f4030f7d2425e172fe94d03a4cfd07dcdbc4909529bdf15d2732aa1559ff9be7c9181900360600190a250505050565b612e73613a37565b60005461010090046001600160a01b03908116911614612ec8576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b81518351148015612eda575080518251145b612f1b576040805162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908125b9c1d5d609a1b604482015290519081900360640190fd5b60005b83518160ff1610156131155760046000858360ff1681518110612f3d57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff168015612fa6575060046000848360ff1681518110612f7e57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff165b612fe9576040805162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08195e1a5cdd608a1b604482015290519081900360640190fd5b818160ff1681518110612ff857fe5b602002602001015160056000868460ff168151811061301357fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000858460ff168151811061304c57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550828160ff168151811061308757fe5b60200260200101516001600160a01b0316848260ff16815181106130a757fe5b60200260200101516001600160a01b03167f2dc18c352fdd373a4dc83a7156d0dfe95082bd4d820bda50fa65ee3bcf8648f3848460ff16815181106130e857fe5b602002602001015142604051808381526020018281526020019250505060405180910390a3600101612f1e565b50505050565b613123613a37565b60005461010090046001600160a01b03908116911614613178576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b03841660009081526004602052604090205460ff166131d7576040805162461bcd60e51b815260206004820152600f60248201526e151bdad95b88139bdd08115e1a5cdd608a1b604482015290519081900360640190fd5b6001600160a01b0384166000818152600460209081526040918290206001810187905560028101869055600301849055815186815290810185905280820184905242606082015290517f6b9e42b75b3aa79aee18ba04bd3f6dedba2d3e55228fadb89fd22817f7ef81ac9181900360800190a250505050565b600061325a6116db565b1561329f576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b336001600160a01b03841614806132c5575060005461010090046001600160a01b031633145b613316576040805162461bcd60e51b815260206004820152601b60248201527f554e5354414b453a20496e76616c6964205573657220456e7472790000000000604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040812060030180548490811061333d57fe5b60009182526020808320909101546001600160a01b0316808352600491829052604090922001549091504210156133b3576040805162461bcd60e51b8152602060048201526015602482015274155394d51052d14e88151bdad95b88131bd8dad959605a1b604482015290519081900360640190fd5b6001600160a01b03811660009081526004602052604090206005015460ff161561347d574261342a600854600b6000886001600160a01b03166001600160a01b03168152602001908152602001600020600601868154811061341157fe5b9060005260206000200154613b1f90919063ffffffff16565b111561347d576040805162461bcd60e51b815260206004820181905260248201527f554e5354414b453a204c6f636b656420696e206f7074696f6e616c206c6f636b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604081206005018054859081106134a457fe5b9060005260206000200154118061350557506001600160a01b0384166000908152600b602052604090206001018054849081106134dd57fe5b90600052602060002090602091828204019190069054906101000a900460ff16151560011515145b6135405760405162461bcd60e51b81526004018080602001828103825260328152602001806149496032913960400191505060405180910390fd5b6001600160a01b0384166000908152600b6020526040812060050180548590811061356757fe5b60009182526020808320909101546001600160a01b0385168352600d9091526040909120549091506135998183613add565b6001600160a01b038085166000818152600d6020908152604080832095909555928a168152600c8352838120918152915220546135d69083613add565b6001600160a01b038088166000818152600c60209081526040808320948916835293815283822094909455908152600b909252812060050180548790811061361a57fe5b60009182526020808320909101929092556001600160a01b0388168152600b9091526040812060010180548790811061364f57fe5b90600052602060002090602091828204019190066101000a81548160ff02191690831515021790555081600b6000886001600160a01b03166001600160a01b0316815260200190815260200160002060030186815481106136ac57fe5b60009182526020918290200154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156136fb57600080fd5b505afa15801561370f573d6000803e3d6000fd5b505050506040513d602081101561372557600080fd5b5051101561377a576040805162461bcd60e51b815260206004820152601e60248201527f554e5354414b45203a20496e73756666696369656e742042616c616e63650000604482015290519081900360640190fd5b6001600160a01b0386166000908152600b602052604090206003018054869081106137a157fe5b60009182526020808320909101546040805163a9059cbb60e01b81526001600160a01b038b81166004830152602482018890529151919092169363a9059cbb93604480850194919392918390030190829087803b15801561380157600080fd5b505af1158015613815573d6000803e3d6000fd5b505050506040513d602081101561382b57600080fd5b5061383a905086868484613b79565b6001600160a01b0386166000908152600b6020526040902060030180548690811061386157fe5b60009182526020918290200154604080518581524293810193909352828101889052516001600160a01b0391821692918916917fa4b627609e711628747558b171b04b9636337afdadac065ee7113fb91eab0b72919081900360600190a3600193505050505b92915050565b600460208190526000918252604090912080546001820154600283015460038401549484015460059094015460ff8085169661010090950481169593949293911687565b600d6020526000908152604090205481565b60095481565b613931613a37565b60005461010090046001600160a01b03908116911614613986576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b0381166139cb5760405162461bcd60e51b81526004018080602001828103825260268152602001806148676026913960400191505060405180910390fd5b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b610e1081565b3390565b6000613a7d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c2e565b9392505050565b600082613a93575060006138c7565b82820282848281613aa057fe5b0414613a7d5760405162461bcd60e51b81526004018080602001828103825260218152602001806148b46021913960400191505060405180910390fd5b6000613a7d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613cd0565b600082820183811015613a7d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080613b93600854600e54613b1f90919063ffffffff16565b915042821115613ba4575042613bb6565b600854600e54613bb391613b1f565b90505b6001600160a01b0386166000908152600b602052604090206006018054613bfc919087908110613be257fe5b906000526020600020015482613add90919063ffffffff16565b9150613c06614833565b84815260208101849052610e108310613c2557613c2587878386613d2a565b50505050505050565b60008183613cba5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613c7f578181015183820152602001613c67565b50505050905090810190601f168015613cac5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613cc657fe5b0495945050505050565b60008184841115613d225760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613c7f578181015183820152602001613c67565b505050900390565b600080613d35614833565b613d4184610e10613a3b565b6020820152613d538462015180613a3b565b815284516001600160a01b0388166000908152600b602052604090206003018054613df092613de59290918a908110613d8857fe5b60009182526020808320909101546001600160a01b038d81168452600b909252604090922060030180549190921691908b908110613dc257fe5b6000918252602090912001546001600160a01b03168960015b6020020151611351565b602083015190613a84565b6001600160a01b0388166000908152600b602052604081206002018054929550909188908110613e1c57fe5b6000918252602090912001546001600160a01b03161461405357613e5868056bc75e2d631000006113e760095486613a8490919063ffffffff16565b9150613e648383613add565b6001600160a01b0388166000908152600b6020526040902060030180549194509087908110613e8f57fe5b60009182526020808320909101546001600160a01b038a81168452600b90925260409092206002018054919092169163a9059cbb9189908110613ece57fe5b6000918252602080832090910154604080516001600160e01b031960e087901b1681526001600160a01b039092166004830152602482018890525160448083019491928390030190829087803b158015613f2757600080fd5b505af1158015613f3b573d6000803e3d6000fd5b505050506040513d6020811015613f5157600080fd5b50511515600114613f9b576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b604482015290519081900360640190fd5b6001600160a01b0387166000908152600b60205260409020600301805487908110613fc257fe5b60009182526020808320909101546001600160a01b038a81168452600b909252604090922060020180549190921691339189908110613ffd57fe5b6000918252602091829020015460408051878152429381019390935280516001600160a01b03909216927fcc30edb66a991e48ca3676c277d3a35485ebfaf3016fa9536663b2689c8f5eef929081900390910190a45b6001600160a01b0387166000908152600b6020526040902060030180546140d59189918990811061408057fe5b60009182526020808320909101546001600160a01b038c81168452600b909252604090922060030180549190921691908a9081106140ba57fe5b6000918252602090912001546001600160a01b03168661458e565b60015b60075460ff821610156145845760078160ff16815481106140f557fe5b60009182526020909120015482511061457a576000614143601861413d600160078660ff168154811061412457fe5b9060005260206000200154613add90919063ffffffff16565b90613a84565b9050600061415982856001602002015190613add565b9050600060036000600b60008e6001600160a01b03166001600160a01b031681526020019081526020016000206003018c8154811061419457fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020805460ff86169081106141c757fe5b60009182526020808320909101546001600160a01b038e81168452600b909252604090922060030180549190921692508b90811061420157fe5b6000918252602090912001546001600160a01b0382811691161480159061428957506001600160a01b038b166000908152600b60205260408120600301805460069291908d90811061424f57fe5b60009182526020808320909101546001600160a01b039081168452838201949094526040928301822093851682529290925290205460ff16155b1561456c5788516001600160a01b038c166000908152600b6020526040902060030180546142e6926142df9290918e9081106142c157fe5b6000918252602090912001546001600160a01b0316848d6001613ddb565b8390613a84565b6001600160a01b038c166000908152600b60205260408120600201805492995090918c90811061431257fe5b6000918252602090912001546001600160a01b0316146145235761434e68056bc75e2d631000006113e76009548a613a8490919063ffffffff16565b955061435a8787613add565b9650806001600160a01b031663a9059cbb600b60008e6001600160a01b03166001600160a01b031681526020019081526020016000206002018c8154811061439e57fe5b6000918252602080832090910154604080516001600160e01b031960e087901b1681526001600160a01b039092166004830152602482018c90525160448083019491928390030190829087803b1580156143f757600080fd5b505af115801561440b573d6000803e3d6000fd5b505050506040513d602081101561442157600080fd5b5051151560011461446b576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b604482015290519081900360640190fd5b6001600160a01b038b166000908152600b6020526040902060030180548b90811061449257fe5b60009182526020808320909101546001600160a01b038e81168452600b90925260409092206002018054919092169133918d9081106144cd57fe5b60009182526020918290200154604080518b8152429381019390935280516001600160a01b03909216927fcc30edb66a991e48ca3676c277d3a35485ebfaf3016fa9536663b2689c8f5eef929081900390910190a45b6001600160a01b038b166000908152600b60205260409020600301805461456c918d918d90811061455057fe5b6000918252602090912001546001600160a01b0316838a61458e565b83600101935050505061457f565b614584565b6140d8565b5050505050505050565b6001600160a01b038216156131155780826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156145eb57600080fd5b505afa1580156145ff573d6000803e3d6000fd5b505050506040513d602081101561461557600080fd5b5051101561466a576040805162461bcd60e51b815260206004820152601b60248201527f53454e44203a20496e73756666696369656e742042616c616e63650000000000604482015290519081900360640190fd5b816001600160a01b031663a9059cbb85836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156146c157600080fd5b505af11580156146d5573d6000803e3d6000fd5b505050506040513d60208110156146eb57600080fd5b5051614730576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b816001600160a01b0316836001600160a01b0316856001600160a01b03167fcd5e4f020ddad29434c2200a9edf2f8d7ec30f0d787f03b528ab7279aab0acbe8442604051808381526020018281526020019250505060405180910390a450505050565b8280548282559060005260206000209081019282156147ce579160200282015b828111156147ce5782518255916020019190600101906147b3565b506147da929150614851565b5090565b8280548282559060005260206000209081019282156147ce579160200282015b828111156147ce57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906147fe565b60405180604001604052806002906020820280368337509192915050565b5b808211156147da576000815560010161485256fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373454d455247454e4359203a20496e73756666696369656e74205265776172642042616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725354414b45203a204d617820416d6f756e742073686f756c642062652077697468696e207065726d69745354414b45203a204d696e20416d6f756e742073686f756c642062652077697468696e207065726d6974554e5354414b45203a20416c726561647920436c61696d656420286f722920496e73756666696369656e74205374616b6564454d455247454e4359203a20416c726561647920436c61696d656420286f722920496e73756666696369656e74205374616b6564a2646970667358221220e99c1fd5757d0850d9a91f53d430f8ac1edcd305bb7af963ff1abf5adb888d8164736f6c63430007060033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102275760003560e01c806388125f7911610130578063cdd033c8116100b8578063dd4be6831161007c578063dd4be68314610bdf578063e0a79b1614610c43578063e5c4686914610c69578063f2fde38b14610c71578063fbfcd24114610c9757610227565b8063cdd033c814610961578063d431350614610999578063d43c9535146109d6578063d768779a14610b7b578063d939381414610bb357610227565b8063b104e006116100ff578063b104e006146107c6578063b2bdfa7b146107e3578063bf6eac2f146107eb578063c549e6b914610821578063c922e9371461082957610227565b806388125f79146106b557806396591e31146106d2578063a019cb4b146106ef578063a4f3f0e51461071557610227565b806340f02ab6116101b3578063539cd3b411610182578063539cd3b4146106695780635c975abb146106955780635f96dc111461069d578063715018a6146106a557806385d895ef146106ad57610227565b806340f02ab6146105dc5780634cd36531146105e45780634f64b2be146106205780635058c4601461063d57610227565b8063187739a4116101fa578063187739a41461033b5780631d2002e71461036957806326fa24e91461038657806328523eb61461055957806340a166881461059b57610227565b806301193ad71461022c57806301bc45c9146102cf57806304a624c6146102f35780631320da8b1461030d575b600080fd5b6102cd6004803603602081101561024257600080fd5b810190602081018135600160201b81111561025c57600080fd5b82018360208201111561026e57600080fd5b803590602001918460208302840111600160201b8311171561028f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610c9f945050505050565b005b6102d7610e62565b604080516001600160a01b039092168252519081900360200190f35b6102fb610e71565b60408051918252519081900360200190f35b6102fb6004803603604081101561032357600080fd5b506001600160a01b0381358116916020013516610e77565b6102fb6004803603604081101561035157600080fd5b506001600160a01b0381358116916020013516610e94565b6102cd6004803603602081101561037f57600080fd5b5035610eb1565b6103ac6004803603602081101561039c57600080fd5b50356001600160a01b0316610f50565b6040518080602001806020018060200180602001806020018060200187810387528d818151815260200191508051906020019060200280838360005b838110156104005781810151838201526020016103e8565b5050505090500187810386528c818151815260200191508051906020019060200280838360005b8381101561043f578181015183820152602001610427565b5050505090500187810385528b818151815260200191508051906020019060200280838360005b8381101561047e578181015183820152602001610466565b5050505090500187810384528a818151815260200191508051906020019060200280838360005b838110156104bd5781810151838201526020016104a5565b50505050905001878103835289818151815260200191508051906020019060200280838360005b838110156104fc5781810151838201526020016104e4565b50505050905001878103825288818151815260200191508051906020019060200280838360005b8381101561053b578181015183820152602001610523565b505050509050019c5050505050505050505050505060405180910390f35b6105876004803603604081101561056f57600080fd5b506001600160a01b03813581169160200135166111c6565b604080519115158252519081900360200190f35b610587600480360360a08110156105b157600080fd5b5080356001600160a01b0316906020810135906040810135906060810135906080013560ff166111e6565b6102fb61134b565b6102fb600480360360808110156105fa57600080fd5b508035906001600160a01b03602082013581169160408101359091169060600135611351565b6102d76004803603602081101561063657600080fd5b5035611437565b6102cd6004803603604081101561065357600080fd5b506001600160a01b038135169060200135611461565b6102d76004803603604081101561067f57600080fd5b506001600160a01b0381351690602001356116a3565b6105876116db565b6102fb6116e4565b6102cd6116ea565b6102fb6117c2565b6102cd600480360360208110156106cb57600080fd5b50356117c8565b6102cd600480360360208110156106e857600080fd5b5035611867565b6102d76004803603602081101561070557600080fd5b50356001600160a01b0316611906565b6102cd6004803603604081101561072b57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561075557600080fd5b82018360208201111561076757600080fd5b803590602001918460208302840111600160201b8311171561078857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611921945050505050565b6102fb600480360360208110156107dc57600080fd5b5035611c06565b6102d7611c27565b6102cd6004803603606081101561080157600080fd5b506001600160a01b03813581169160208101359091169060400135611c3b565b6102fb6121ad565b6102cd6004803603608081101561083f57600080fd5b8135916001600160a01b0360208201351691810190606081016040820135600160201b81111561086e57600080fd5b82018360208201111561088057600080fd5b803590602001918460208302840111600160201b831117156108a157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156108f057600080fd5b82018360208201111561090257600080fd5b803590602001918460208302840111600160201b8311171561092357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506121b4945050505050565b6102cd6004803603606081101561097757600080fd5b506001600160a01b038135811691602081013590911690604001351515612ad6565b6102cd600480360360808110156109af57600080fd5b506001600160a01b038135169060ff60208201351690604081013590606001351515612c32565b6102cd600480360360608110156109ec57600080fd5b810190602081018135600160201b811115610a0657600080fd5b820183602082011115610a1857600080fd5b803590602001918460208302840111600160201b83111715610a3957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a8857600080fd5b820183602082011115610a9a57600080fd5b803590602001918460208302840111600160201b83111715610abb57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610b0a57600080fd5b820183602082011115610b1c57600080fd5b803590602001918460208302840111600160201b83111715610b3d57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612e6b945050505050565b6102cd60048036036080811015610b9157600080fd5b506001600160a01b03813516906020810135906040810135906060013561311b565b61058760048036036040811015610bc957600080fd5b506001600160a01b038135169060200135613250565b610c0560048036036020811015610bf557600080fd5b50356001600160a01b03166138cd565b60408051971515885260ff9096166020880152868601949094526060860192909252608085015260a0840152151560c0830152519081900360e00190f35b6102fb60048036036020811015610c5957600080fd5b50356001600160a01b0316613911565b6102fb613923565b6102cd60048036036020811015610c8757600080fd5b50356001600160a01b0316613929565b6102fb613a31565b610ca7613a37565b60005461010090046001600160a01b03908116911614610cfc576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6040805160008152602081019182905251610d1991600791614793565b5060005b81518160ff161015610de057600854600090610d3c9062015180613a3b565b9050828260ff1681518110610d4d57fe5b60200260200101518111610d9f576040805162461bcd60e51b8152602060048201526014602482015273496e76616c696420496e74657276616c2044617960601b604482015290519081900360640190fd5b6007838360ff1681518110610db057fe5b60209081029190910181015182546001818101855560009485529290932090920191909155919091019050610d1d565b507f29635226d0b00834767b0cf38daca8dc0fe978152b0a8a5b39eb28112635236160074260405180806020018381526020018281038252848181548152602001915080548015610e5057602002820191906000526020600020905b815481526020019060010190808311610e3c575b5050935050505060405180910390a150565b6001546001600160a01b031681565b600a5481565b600c60209081526000928352604080842090915290825290205481565b600560209081526000928352604080842090915290825290205481565b610eb9613a37565b60005461010090046001600160a01b03908116911614610f0e576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b60098190556040805182815242602082015281517f886f1c6ee47e76ca7e1c7715d9662c5cbc03a9215b76899c702e3d1c38d1ee43929181900390910190a150565b6001600160a01b0381166000908152600b60209081526040918290206002810180548451818502810185019095528085526060948594859485948594859491936003840193600181019360048201936005830193600690930192889190830182828015610fe657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610fc8575b505050505095508480548060200260200160405190810160405280929190818152602001828054801561104257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611024575b50505050509450838054806020026020016040519081016040528092919081815260200182805480156110b457602002820191906000526020600020906000905b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116110835790505b505050505093508280548060200260200160405190810160405280929190818152602001828054801561110657602002820191906000526020600020905b8154815260200190600101908083116110f2575b505050505092508180548060200260200160405190810160405280929190818152602001828054801561115857602002820191906000526020600020905b815481526020019060010190808311611144575b50505050509150808054806020026020016040519081016040528092919081815260200182805480156111aa57602002820191906000526020600020905b815481526020019060010190808311611196575b5050505050905095509550955095509550955091939550919395565b600660209081526000928352604080842090915290825290205460ff1681565b60006111f0613a37565b60005461010090046001600160a01b03908116911614611245576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b03861660009081526004602052604090205460ff166112b157600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0388161790555b6001600160a01b0386166000818152600460209081526040918290208054600160ff19909116811761ff00191661010060ff891602178255810189905560028101889055600301869055815188815290810187905280820186905242606082015290517f6b9e42b75b3aa79aee18ba04bd3f6dedba2d3e55228fadb89fd22817f7ef81ac916080908290030190a250600195945050505050565b60085481565b6001600160a01b038316600090815260046020526040812060050154819060ff16156113f457600a54611385908790613a84565b95506113a76113a06001600a54613add90919063ffffffff16565b8790613a84565b90506113ed6113b68483613b1f565b6001600160a01b038088166000908152600560209081526040808320938a16835292905220546113e7908990613a84565b90613a3b565b915061142e565b6001600160a01b0380861660009081526005602090815260408083209388168352929052205461142b9084906113e7908990613a84565b91505b50949350505050565b6002818154811061144757600080fd5b6000918252602090912001546001600160a01b0316905081565b611469613a37565b60005461010090046001600160a01b039081169116146114be576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b80826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561150c57600080fd5b505afa158015611520573d6000803e3d6000fd5b505050506040513d602081101561153657600080fd5b50511015611582576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b604482015290519081900360640190fd5b816001600160a01b031663a9059cbb600060019054906101000a90046001600160a01b0316836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156115ee57600080fd5b505af1158015611602573d6000803e3d6000fd5b505050506040513d602081101561161857600080fd5b505161165d576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b6040805182815242602082015281516001600160a01b038516927fcb92e2679de255302c9b8d0673cbdf8ef54667e943bf8f049bcaf6a85926ba1a928290030190a25050565b600360205281600052604060002081815481106116bf57600080fd5b6000918252602090912001546001600160a01b03169150829050565b60005460ff1690565b600e5481565b6116f2613a37565b6001546001600160a01b03908116911614611754576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f74207468652041646d696e604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693610100909204909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600154600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60025490565b6117d0613a37565b60005461010090046001600160a01b03908116911614611825576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b60088190556040805182815242602082015281517ff676bd50ed08b41fe017c9b4b7606b132ed9afafd39cbe090006c602170638bf929181900390910190a150565b61186f613a37565b60005461010090046001600160a01b039081169116146118c4576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b600a8190556040805182815242602082015281517fd9124f37a22fb221df30d124c79aae3c3be0e56338cc2ed4d68ade2a51319f49929181900390910190a150565b600b602052600090815260409020546001600160a01b031681565b611929613a37565b60005461010090046001600160a01b0390811691161461197e576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b60408051600080825260208083018085526001600160a01b0387168352600390915292902090516119af92906147de565b506001600160a01b03821660009081526004602052604090205460ff16611a16576040805162461bcd60e51b815260206004820152601660248201527514dd185ad95908151bdad95b88139bdd08115e1a5cdd60521b604482015290519081900360640190fd5b60005b81518160ff161015611b5f5760025482511115611a6d576040805162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908125b9c1d5d609a1b604482015290519081900360640190fd5b60046000838360ff1681518110611a8057fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16611af1576040805162461bcd60e51b815260206004820152601660248201527514995dd85c9908151bdad95b88139bdd08115e1a5cdd60521b604482015290519081900360640190fd5b6001600160a01b03831660009081526003602052604090208251839060ff8416908110611b1a57fe5b60209081029190910181015182546001808201855560009485529290932090920180546001600160a01b0319166001600160a01b039093169290921790915501611a19565b506001600160a01b03821660008181526003602090815260409182902082514292810183905283815281549381018490527f533d99224d362fcbe71ce5ff0a8b2d61a9c08b8d1df27aab851edb881f3fb16b939192918190606082019085908015611bf357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611bd5575b5050935050505060405180910390a25050565b60078181548110611c1657600080fd5b600091825260209091200154905081565b60005461010090046001600160a01b031681565b611c436116db565b15611c88576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b336001600160a01b0384161415611ce6576040805162461bcd60e51b815260206004820152601f60248201527f5354414b453a20696e76616c6964207265666572726572206164647265737300604482015290519081900360640190fd5b6001600160a01b03821660009081526004602052604090205460ff16611d53576040805162461bcd60e51b815260206004820152601a60248201527f5354414b45203a20546f6b656e206973206e6f74204578697374000000000000604482015290519081900360640190fd5b6001600160a01b038216600081815260046020908152604080832060010154338452600c835281842094845293909152902054611d909083613b1f565b1015611dcd5760405162461bcd60e51b815260040180806020018281038252602a81526020018061491f602a913960400191505060405180910390fd5b6001600160a01b038216600081815260046020908152604080832060020154338452600c835281842094845293909152902054611e0a9083613b1f565b1115611e475760405162461bcd60e51b815260040180806020018281038252602a8152602001806148f5602a913960400191505060405180910390fd5b6001600160a01b038216600090815260046020908152604080832060030154600d90925290912054611e799083613b1f565b1115611ecc576040805162461bcd60e51b815260206004820152601860248201527f5354414b45203a204d61786c696d697420657863656564730000000000000000604482015290519081900360640190fd5b42611ee4600854600e54613b1f90919063ffffffff16565b11611f36576040805162461bcd60e51b815260206004820152601d60248201527f5354414b453a205374616b696e672054696d6520436f6d706c65746564000000604482015290519081900360640190fd5b336000818152600b60209081526040808320600481018054600180820183559186528486208101558082018054808301825590865284862085820401805460ff601f9093166101000a9283021916909117905581546001600160a01b0319908116909617825560028201805480830182559086528486200180546001600160a01b038b8116918916919091179091556003830180548084018255908752858720018054918a16919097168117909655600682018054808301825590865284862042910155600590910180549182018155845282842001859055928252600d905220546120229082613b1f565b6001600160a01b0383166000818152600d6020908152604080832094909455338252600c815283822092825291909152205461205e9082613b1f565b336000818152600c602090815260408083206001600160a01b0388168085529083528184209590955580516323b872dd60e01b8152600481019490945230602485015260448401869052516323b872dd93606480820194918390030190829087803b1580156120cc57600080fd5b505af11580156120e0573d6000803e3d6000fd5b505050506040513d60208110156120f657600080fd5b505161213b576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b604482015290519081900360640190fd5b336000818152600b60205260409020600401546001600160a01b0380851692908616917f8d0a98609f00f26e55cd12ea38ffb8a0dfad170f6f001d682185fdce4ff424449061218b906001613add565b60408051918252602082018790524282820152519081900360600190a4505050565b6201518081565b6121bc613a37565b60005461010090046001600160a01b03908116911614612211576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040812060050180548690811061223857fe5b906000526020600020015411801561229a57506001600160a01b0383166000908152600b6020526040902060010180548590811061227257fe5b90600052602060002090602091828204019190069054906101000a900460ff16151560011515145b6122d55760405162461bcd60e51b815260040180806020018281038252603481526020018061497b6034913960400191505060405180910390fd5b6001600160a01b0383166000908152600b602052604090206005018054859081106122fc57fe5b9060005260206000200154600b6000856001600160a01b03166001600160a01b03168152602001908152602001600020600301858154811061233a57fe5b60009182526020918290200154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561238957600080fd5b505afa15801561239d573d6000803e3d6000fd5b505050506040513d60208110156123b357600080fd5b50511015612408576040805162461bcd60e51b815260206004820181905260248201527f454d455247454e4359203a20496e73756666696369656e742042616c616e6365604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040812060050180548690811061242f57fe5b906000526020600020015490506000600b6000866001600160a01b03166001600160a01b03168152602001908152602001600020600101868154811061247157fe5b90600052602060002090602091828204019190066101000a81548160ff0219169083151502179055506000600b6000866001600160a01b03166001600160a01b0316815260200190815260200160002060050186815481106124cf57fe5b906000526020600020018190555061254381600d6000600b6000896001600160a01b03166001600160a01b03168152602001908152602001600020600301898154811061251857fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205490613add565b6001600160a01b0385166000908152600b602052604081206003018054600d9291908990811061256f57fe5b60009182526020808320909101546001600160a01b0390811684528382019490945260409283018220949094559187168252600b909252206003018054869081106125b657fe5b60009182526020808320909101546040805163a9059cbb60e01b81526001600160a01b038981166004830152602482018790529151919092169363a9059cbb93604480850194919392918390030190829087803b15801561261657600080fd5b505af115801561262a573d6000803e3d6000fd5b505050506040513d602081101561264057600080fd5b50600090505b8351811015612a495782818151811061265b57fe5b602002602001015184828151811061266f57fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156126c357600080fd5b505afa1580156126d7573d6000803e3d6000fd5b505050506040513d60208110156126ed57600080fd5b5051101561272c5760405162461bcd60e51b815260040180806020018281038252602781526020018061488d6027913960400191505060405180910390fd5b600083828151811061273a57fe5b6020026020010151905060006001600160a01b0316600b6000886001600160a01b03166001600160a01b03168152602001908152602001600020600201888154811061278257fe5b6000918252602090912001546001600160a01b0316146129aa5760006127c068056bc75e2d631000006113e760095485613a8490919063ffffffff16565b90506127cc8282613add565b91508583815181106127da57fe5b60200260200101516001600160a01b031663a9059cbb600b60008a6001600160a01b03166001600160a01b031681526020019081526020016000206002018a8154811061282357fe5b6000918252602080832090910154604080516001600160e01b031960e087901b1681526001600160a01b039092166004830152602482018790525160448083019491928390030190829087803b15801561287c57600080fd5b505af1158015612890573d6000803e3d6000fd5b505050506040513d60208110156128a657600080fd5b50516128f9576040805162461bcd60e51b815260206004820152601b60248201527f454d455247454e4359203a205472616e73666572204661696c65640000000000604482015290519081900360640190fd5b85838151811061290557fe5b60200260200101516001600160a01b0316876001600160a01b0316600b60008a6001600160a01b03166001600160a01b031681526020019081526020016000206002018a8154811061295357fe5b6000918252602091829020015460408051868152429381019390935280516001600160a01b03909216927fcc30edb66a991e48ca3676c277d3a35485ebfaf3016fa9536663b2689c8f5eef929081900390910190a4505b8482815181106129b657fe5b60200260200101516001600160a01b031663a9059cbb87836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612a1457600080fd5b505af1158015612a28573d6000803e3d6000fd5b505050506040513d6020811015612a3e57600080fd5b505050600101612646565b506001600160a01b0384166000908152600b60205260409020600301805486908110612a7157fe5b60009182526020918290200154604080518481524293810193909352828101889052516001600160a01b0391821692918716917fa4b627609e711628747558b171b04b9636337afdadac065ee7113fb91eab0b72919081900360600190a35050505050565b612ade613a37565b60005461010090046001600160a01b03908116911614612b33576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b03831660009081526004602052604090205460ff168015612b7357506001600160a01b03821660009081526004602052604090205460ff165b612bb6576040805162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08195e1a5cdd608a1b604482015290519081900360640190fd5b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff19168615151790819055825160ff90911615158152429181019190915281517f38dc54047237de43b07dc5d3a0cd9a29485be07da55d5611ddc91102542938ad929181900390910190a3505050565b612c3a613a37565b60005461010090046001600160a01b03908116911614612c8f576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b8260ff1660011480612ca457508260ff166002145b80612cb257508260ff166003145b612d03576040805162461bcd60e51b815260206004820152601760248201527f496e76616c6964204c6f636b61626c6520537461747573000000000000000000604482015290519081900360640190fd5b6001600160a01b03841660009081526004602052604090205460ff161515600114612d67576040805162461bcd60e51b815260206004820152600f60248201526e151bdad95b88139bdd08115e1a5cdd608a1b604482015290519081900360640190fd5b8260ff1660011415612d9f57612d7d4283613b1f565b6001600160a01b03851660009081526004602081905260409091200155612e00565b8260ff1660021415612dcc576001600160a01b038416600090815260046020819052604082200155612e00565b8260ff1660031415612e00576001600160a01b0384166000908152600460205260409020600501805460ff19168215151790555b6001600160a01b03841660008181526004602081815260409283902091820154600590920154835192835260ff16151590820152428183015290517f4030f7d2425e172fe94d03a4cfd07dcdbc4909529bdf15d2732aa1559ff9be7c9181900360600190a250505050565b612e73613a37565b60005461010090046001600160a01b03908116911614612ec8576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b81518351148015612eda575080518251145b612f1b576040805162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908125b9c1d5d609a1b604482015290519081900360640190fd5b60005b83518160ff1610156131155760046000858360ff1681518110612f3d57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff168015612fa6575060046000848360ff1681518110612f7e57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff165b612fe9576040805162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08195e1a5cdd608a1b604482015290519081900360640190fd5b818160ff1681518110612ff857fe5b602002602001015160056000868460ff168151811061301357fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000858460ff168151811061304c57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550828160ff168151811061308757fe5b60200260200101516001600160a01b0316848260ff16815181106130a757fe5b60200260200101516001600160a01b03167f2dc18c352fdd373a4dc83a7156d0dfe95082bd4d820bda50fa65ee3bcf8648f3848460ff16815181106130e857fe5b602002602001015142604051808381526020018281526020019250505060405180910390a3600101612f1e565b50505050565b613123613a37565b60005461010090046001600160a01b03908116911614613178576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b03841660009081526004602052604090205460ff166131d7576040805162461bcd60e51b815260206004820152600f60248201526e151bdad95b88139bdd08115e1a5cdd608a1b604482015290519081900360640190fd5b6001600160a01b0384166000818152600460209081526040918290206001810187905560028101869055600301849055815186815290810185905280820184905242606082015290517f6b9e42b75b3aa79aee18ba04bd3f6dedba2d3e55228fadb89fd22817f7ef81ac9181900360800190a250505050565b600061325a6116db565b1561329f576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b336001600160a01b03841614806132c5575060005461010090046001600160a01b031633145b613316576040805162461bcd60e51b815260206004820152601b60248201527f554e5354414b453a20496e76616c6964205573657220456e7472790000000000604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040812060030180548490811061333d57fe5b60009182526020808320909101546001600160a01b0316808352600491829052604090922001549091504210156133b3576040805162461bcd60e51b8152602060048201526015602482015274155394d51052d14e88151bdad95b88131bd8dad959605a1b604482015290519081900360640190fd5b6001600160a01b03811660009081526004602052604090206005015460ff161561347d574261342a600854600b6000886001600160a01b03166001600160a01b03168152602001908152602001600020600601868154811061341157fe5b9060005260206000200154613b1f90919063ffffffff16565b111561347d576040805162461bcd60e51b815260206004820181905260248201527f554e5354414b453a204c6f636b656420696e206f7074696f6e616c206c6f636b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604081206005018054859081106134a457fe5b9060005260206000200154118061350557506001600160a01b0384166000908152600b602052604090206001018054849081106134dd57fe5b90600052602060002090602091828204019190069054906101000a900460ff16151560011515145b6135405760405162461bcd60e51b81526004018080602001828103825260328152602001806149496032913960400191505060405180910390fd5b6001600160a01b0384166000908152600b6020526040812060050180548590811061356757fe5b60009182526020808320909101546001600160a01b0385168352600d9091526040909120549091506135998183613add565b6001600160a01b038085166000818152600d6020908152604080832095909555928a168152600c8352838120918152915220546135d69083613add565b6001600160a01b038088166000818152600c60209081526040808320948916835293815283822094909455908152600b909252812060050180548790811061361a57fe5b60009182526020808320909101929092556001600160a01b0388168152600b9091526040812060010180548790811061364f57fe5b90600052602060002090602091828204019190066101000a81548160ff02191690831515021790555081600b6000886001600160a01b03166001600160a01b0316815260200190815260200160002060030186815481106136ac57fe5b60009182526020918290200154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156136fb57600080fd5b505afa15801561370f573d6000803e3d6000fd5b505050506040513d602081101561372557600080fd5b5051101561377a576040805162461bcd60e51b815260206004820152601e60248201527f554e5354414b45203a20496e73756666696369656e742042616c616e63650000604482015290519081900360640190fd5b6001600160a01b0386166000908152600b602052604090206003018054869081106137a157fe5b60009182526020808320909101546040805163a9059cbb60e01b81526001600160a01b038b81166004830152602482018890529151919092169363a9059cbb93604480850194919392918390030190829087803b15801561380157600080fd5b505af1158015613815573d6000803e3d6000fd5b505050506040513d602081101561382b57600080fd5b5061383a905086868484613b79565b6001600160a01b0386166000908152600b6020526040902060030180548690811061386157fe5b60009182526020918290200154604080518581524293810193909352828101889052516001600160a01b0391821692918916917fa4b627609e711628747558b171b04b9636337afdadac065ee7113fb91eab0b72919081900360600190a3600193505050505b92915050565b600460208190526000918252604090912080546001820154600283015460038401549484015460059094015460ff8085169661010090950481169593949293911687565b600d6020526000908152604090205481565b60095481565b613931613a37565b60005461010090046001600160a01b03908116911614613986576040805162461bcd60e51b815260206004820181905260248201526000805160206148d5833981519152604482015290519081900360640190fd5b6001600160a01b0381166139cb5760405162461bcd60e51b81526004018080602001828103825260268152602001806148676026913960400191505060405180910390fd5b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b610e1081565b3390565b6000613a7d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c2e565b9392505050565b600082613a93575060006138c7565b82820282848281613aa057fe5b0414613a7d5760405162461bcd60e51b81526004018080602001828103825260218152602001806148b46021913960400191505060405180910390fd5b6000613a7d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613cd0565b600082820183811015613a7d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080613b93600854600e54613b1f90919063ffffffff16565b915042821115613ba4575042613bb6565b600854600e54613bb391613b1f565b90505b6001600160a01b0386166000908152600b602052604090206006018054613bfc919087908110613be257fe5b906000526020600020015482613add90919063ffffffff16565b9150613c06614833565b84815260208101849052610e108310613c2557613c2587878386613d2a565b50505050505050565b60008183613cba5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613c7f578181015183820152602001613c67565b50505050905090810190601f168015613cac5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613cc657fe5b0495945050505050565b60008184841115613d225760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613c7f578181015183820152602001613c67565b505050900390565b600080613d35614833565b613d4184610e10613a3b565b6020820152613d538462015180613a3b565b815284516001600160a01b0388166000908152600b602052604090206003018054613df092613de59290918a908110613d8857fe5b60009182526020808320909101546001600160a01b038d81168452600b909252604090922060030180549190921691908b908110613dc257fe5b6000918252602090912001546001600160a01b03168960015b6020020151611351565b602083015190613a84565b6001600160a01b0388166000908152600b602052604081206002018054929550909188908110613e1c57fe5b6000918252602090912001546001600160a01b03161461405357613e5868056bc75e2d631000006113e760095486613a8490919063ffffffff16565b9150613e648383613add565b6001600160a01b0388166000908152600b6020526040902060030180549194509087908110613e8f57fe5b60009182526020808320909101546001600160a01b038a81168452600b90925260409092206002018054919092169163a9059cbb9189908110613ece57fe5b6000918252602080832090910154604080516001600160e01b031960e087901b1681526001600160a01b039092166004830152602482018890525160448083019491928390030190829087803b158015613f2757600080fd5b505af1158015613f3b573d6000803e3d6000fd5b505050506040513d6020811015613f5157600080fd5b50511515600114613f9b576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b604482015290519081900360640190fd5b6001600160a01b0387166000908152600b60205260409020600301805487908110613fc257fe5b60009182526020808320909101546001600160a01b038a81168452600b909252604090922060020180549190921691339189908110613ffd57fe5b6000918252602091829020015460408051878152429381019390935280516001600160a01b03909216927fcc30edb66a991e48ca3676c277d3a35485ebfaf3016fa9536663b2689c8f5eef929081900390910190a45b6001600160a01b0387166000908152600b6020526040902060030180546140d59189918990811061408057fe5b60009182526020808320909101546001600160a01b038c81168452600b909252604090922060030180549190921691908a9081106140ba57fe5b6000918252602090912001546001600160a01b03168661458e565b60015b60075460ff821610156145845760078160ff16815481106140f557fe5b60009182526020909120015482511061457a576000614143601861413d600160078660ff168154811061412457fe5b9060005260206000200154613add90919063ffffffff16565b90613a84565b9050600061415982856001602002015190613add565b9050600060036000600b60008e6001600160a01b03166001600160a01b031681526020019081526020016000206003018c8154811061419457fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020805460ff86169081106141c757fe5b60009182526020808320909101546001600160a01b038e81168452600b909252604090922060030180549190921692508b90811061420157fe5b6000918252602090912001546001600160a01b0382811691161480159061428957506001600160a01b038b166000908152600b60205260408120600301805460069291908d90811061424f57fe5b60009182526020808320909101546001600160a01b039081168452838201949094526040928301822093851682529290925290205460ff16155b1561456c5788516001600160a01b038c166000908152600b6020526040902060030180546142e6926142df9290918e9081106142c157fe5b6000918252602090912001546001600160a01b0316848d6001613ddb565b8390613a84565b6001600160a01b038c166000908152600b60205260408120600201805492995090918c90811061431257fe5b6000918252602090912001546001600160a01b0316146145235761434e68056bc75e2d631000006113e76009548a613a8490919063ffffffff16565b955061435a8787613add565b9650806001600160a01b031663a9059cbb600b60008e6001600160a01b03166001600160a01b031681526020019081526020016000206002018c8154811061439e57fe5b6000918252602080832090910154604080516001600160e01b031960e087901b1681526001600160a01b039092166004830152602482018c90525160448083019491928390030190829087803b1580156143f757600080fd5b505af115801561440b573d6000803e3d6000fd5b505050506040513d602081101561442157600080fd5b5051151560011461446b576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b604482015290519081900360640190fd5b6001600160a01b038b166000908152600b6020526040902060030180548b90811061449257fe5b60009182526020808320909101546001600160a01b038e81168452600b90925260409092206002018054919092169133918d9081106144cd57fe5b60009182526020918290200154604080518b8152429381019390935280516001600160a01b03909216927fcc30edb66a991e48ca3676c277d3a35485ebfaf3016fa9536663b2689c8f5eef929081900390910190a45b6001600160a01b038b166000908152600b60205260409020600301805461456c918d918d90811061455057fe5b6000918252602090912001546001600160a01b0316838a61458e565b83600101935050505061457f565b614584565b6140d8565b5050505050505050565b6001600160a01b038216156131155780826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156145eb57600080fd5b505afa1580156145ff573d6000803e3d6000fd5b505050506040513d602081101561461557600080fd5b5051101561466a576040805162461bcd60e51b815260206004820152601b60248201527f53454e44203a20496e73756666696369656e742042616c616e63650000000000604482015290519081900360640190fd5b816001600160a01b031663a9059cbb85836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156146c157600080fd5b505af11580156146d5573d6000803e3d6000fd5b505050506040513d60208110156146eb57600080fd5b5051614730576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b816001600160a01b0316836001600160a01b0316856001600160a01b03167fcd5e4f020ddad29434c2200a9edf2f8d7ec30f0d787f03b528ab7279aab0acbe8442604051808381526020018281526020019250505060405180910390a450505050565b8280548282559060005260206000209081019282156147ce579160200282015b828111156147ce5782518255916020019190600101906147b3565b506147da929150614851565b5090565b8280548282559060005260206000209081019282156147ce579160200282015b828111156147ce57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906147fe565b60405180604001604052806002906020820280368337509192915050565b5b808211156147da576000815560010161485256fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373454d455247454e4359203a20496e73756666696369656e74205265776172642042616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725354414b45203a204d617820416d6f756e742073686f756c642062652077697468696e207065726d69745354414b45203a204d696e20416d6f756e742073686f756c642062652077697468696e207065726d6974554e5354414b45203a20416c726561647920436c61696d656420286f722920496e73756666696369656e74205374616b6564454d455247454e4359203a20416c726561647920436c61696d656420286f722920496e73756666696369656e74205374616b6564a2646970667358221220e99c1fd5757d0850d9a91f53d430f8ac1edcd305bb7af963ff1abf5adb888d8164736f6c63430007060033
Deployed Bytecode Sourcemap
22506:17802:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20829:424;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20829:424:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20829:424:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20829:424:0;;-1:-1:-1;20829:424:0;;-1:-1:-1;;;;;20829:424:0:i;:::-;;3485:21;;;:::i;:::-;;;;-1:-1:-1;;;;;3485:21:0;;;;;;;;;;;;;;14467:32;;;:::i;:::-;;;;;;;;;;;;;;;;22969:71;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22969:71:0;;;;;;;;;;:::i;14068:86::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14068:86:0;;;;;;;;;;:::i;20643:178::-;;;;;;;;;;;;;;;;-1:-1:-1;20643:178:0;;:::i;39700:605::-;;;;;;;;;;;;;;;;-1:-1:-1;39700:605:0;-1:-1:-1;;;;;39700:605:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14161:70;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14161:70:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;16004:792;;;;;;;;;;;;;;;;-1:-1:-1;16004:792:0;;-1:-1:-1;;;;;16004:792:0;;;;;;;;;;;;;;;;;;;;;;;:::i;14397:28::-;;;:::i;32453:853::-;;;;;;;;;;;;;;;;-1:-1:-1;32453:853:0;;;-1:-1:-1;;;;;32453:853:0;;;;;;;;;;;;;;;;;;;:::i;13920:23::-;;;;;;;;;;;;;;;;-1:-1:-1;13920:23:0;;:::i;21828:437::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21828:437:0;;;;;;;;:::i;13950:55::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13950:55:0;;;;;;;;:::i;2144:86::-;;;:::i;23101:28::-;;;:::i;4666:132::-;;;:::i;22273:98::-;;;:::i;20251:185::-;;;;;;;;;;;;;;;;-1:-1:-1;20251:185:0;;:::i;20444:191::-;;;;;;;;;;;;;;;;-1:-1:-1;20444:191:0;;:::i;22911:51::-;;;;;;;;;;;;;;;;-1:-1:-1;22911:51:0;-1:-1:-1;;;;;22911:51:0;;:::i;17762:847::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17762:847:0;;;;;;;;;;;;;;;-1:-1:-1;;;17762:847:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17762:847:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17762:847:0;;-1:-1:-1;17762:847:0;;-1:-1:-1;;;;;17762:847:0:i;14238:62::-;;;;;;;;;;;;;;;;-1:-1:-1;14238:62:0;;:::i;3457:21::-;;;:::i;24246:2492::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24246:2492:0;;;;;;;;;;;;;;;;;:::i;14307:37::-;;;:::i;36879:2724::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36879:2724:0;;;;;;;;;;;;;;;;-1:-1:-1;;;36879:2724:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36879:2724:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36879:2724:0;;;;;;;;-1:-1:-1;36879:2724:0;;-1:-1:-1;;;;;36879:2724:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36879:2724:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36879:2724:0;;-1:-1:-1;36879:2724:0;;-1:-1:-1;;;;;36879:2724:0:i;21261:559::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21261:559:0;;;;;;;;;;;;;;;;;;;:::i;19244:999::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19244:999:0;;;;;;;;;;;;;;;;;;;;;;:::i;16804:950::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16804:950:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16804:950:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16804:950:0;;;;;;;;-1:-1:-1;16804:950:0;;-1:-1:-1;;;;;16804:950:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16804:950:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16804:950:0;;;;;;;;-1:-1:-1;16804:950:0;;-1:-1:-1;;;;;16804:950:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16804:950:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16804:950:0;;-1:-1:-1;16804:950:0;;-1:-1:-1;;;;;16804:950:0:i;18617:619::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18617:619:0;;;;;;;;;;;;;;;;;;:::i;34438:2433::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34438:2433:0;;;;;;;;:::i;14012:49::-;;;;;;;;;;;;;;;;-1:-1:-1;14012:49:0;-1:-1:-1;;;;;14012:49:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23047:47;;;;;;;;;;;;;;;;-1:-1:-1;23047:47:0;-1:-1:-1;;;;;23047:47:0;;:::i;14432:28::-;;;:::i;4953:281::-;;;;;;;;;;;;;;;;-1:-1:-1;4953:281:0;-1:-1:-1;;;;;4953:281:0;;:::i;14351:39::-;;;:::i;20829:424::-;4034:12;:10;:12::i;:::-;4024:6;;;;;-1:-1:-1;;;;;4024:6:0;;;:22;;;4016:67;;;;;-1:-1:-1;;;4016:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4016:67:0;;;;;;;;;;;;;;;20928:16:::1;::::0;;20942:1:::1;20928:16:::0;;::::1;::::0;::::1;::::0;;;;20913:31;::::1;::::0;:12:::1;::::0;:31:::1;:::i;:::-;;20962:7;20957:221;20979:9;:16;20975:1;:20;;;20957:221;;;21031:13;::::0;21017:11:::1;::::0;21031:23:::1;::::0;14338:6:::1;21031:17;:23::i;:::-;21017:37;;21083:9;21093:1;21083:12;;;;;;;;;;;;;;;;21077:3;:18;21069:51;;;::::0;;-1:-1:-1;;;21069:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;21069:51:0;;;;;;;;;;;;;::::1;;21135:12;21153:9;21163:1;21153:12;;;;;;;;;;;::::0;;::::1;::::0;;;;;;;21135:31;;::::1;::::0;;::::1;::::0;;-1:-1:-1;21135:31:0;;;;;;;;;::::1;::::0;;;;20997:3;;;::::1;::::0;-1:-1:-1;20957:221:0::1;;;;21195:50;21215:12;21229:15;21195:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20829:424:::0;:::o;3485:21::-;;;-1:-1:-1;;;;;3485:21:0;;:::o;14467:32::-;;;;:::o;22969:71::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14068:86::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;20643:178::-;4034:12;:10;:12::i;:::-;4024:6;;;;;-1:-1:-1;;;;;4024:6:0;;;:22;;;4016:67;;;;;-1:-1:-1;;;4016:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4016:67:0;;;;;;;;;;;;;;;20716:13:::1;:22:::0;;;20756:57:::1;::::0;;;;;20797:15:::1;20756:57;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;20643:178:::0;:::o;39700:605::-;-1:-1:-1;;;;;40023:21:0;;;;;;:14;:21;;;;;;;;;:30;;;40001:296;;;;;;;;;;;;;;;;;39805:16;;;;;;;;;;;;40023:30;;40068:34;;;;40117:30;;;;40162:29;;;;40206:34;;;;40255:31;;;;;40023:30;;40001:296;;;40023:30;40001:296;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40001:296:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40001:296:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39700:605;;;;;;;:::o;14161:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16004:792::-;16201:4;4034:12;:10;:12::i;:::-;4024:6;;;;;-1:-1:-1;;;;;4024:6:0;;;:22;;;4016:67;;;;;-1:-1:-1;;;4016:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4016:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;16224:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;:34;::::1;;16218:68;;16261:6;:25:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;16261:25:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;16261:25:0::1;-1:-1:-1::0;;;;;16261:25:0;::::1;;::::0;;16218:68:::1;-1:-1:-1::0;;;;;16299:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;;;;:41;;16336:4:::1;-1:-1:-1::0;;16299:41:0;;::::1;::::0;::::1;-1:-1:-1::0;;16351:44:0::1;16299:41;;16351:44:::0;::::1;;;::::0;;16406:39;::::1;:54:::0;;;16471:39:::1;::::0;::::1;:54:::0;;;16536:40:::1;;:53:::0;;;16607:159;;;;;;;::::1;::::0;;;;;;;;;16740:15:::1;16607:159:::0;;;;;;::::1;::::0;;;;;;;;::::1;-1:-1:-1::0;16784:4:0::1;16004:792:::0;;;;;;;:::o;14397:28::-;;;;:::o;32453:853::-;-1:-1:-1;;;;;32689:25:0;;32626:14;32689:25;;;:12;:25;;;;;:42;;;32626:14;;32689:42;;32685:613;;;32780:17;;32763:35;;:12;;:16;:35::i;:::-;32748:50;;32827:42;32844:24;32866:1;32844:17;;:21;;:24;;;;:::i;:::-;32827:12;;:16;:42::i;:::-;32813:56;-1:-1:-1;32893:191:0;33056:27;:10;32813:56;33056:14;:27::i;:::-;-1:-1:-1;;;;;32951:35:0;;;;;;;:22;:35;;;;;;;;:48;;;;;;;;;;32912:106;;:12;;:16;:106::i;:::-;32893:162;;:191::i;:::-;32884:200;;32685:613;;;-1:-1:-1;;;;;33182:35:0;;;;;;;:22;:35;;;;;;;;:48;;;;;;;;;;33124:174;;33287:10;;33143:106;;:12;;:16;:106::i;33124:174::-;33115:183;;32685:613;32453:853;;;;;;;:::o;13920:23::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13920:23:0;;-1:-1:-1;13920:23:0;:::o;21828:437::-;4034:12;:10;:12::i;:::-;4024:6;;;;;-1:-1:-1;;;;;4024:6:0;;;:22;;;4016:67;;;;;-1:-1:-1;;;4016:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4016:67:0;;;;;;;;;;;;;;;22010:6:::1;21968:12;-1:-1:-1::0;;;;;21961:30:0::1;;22000:4;21961:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;21961:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;21961:45:0;:55:::1;;21939:125;;;::::0;;-1:-1:-1;;;21939:125:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;21939:125:0;;;;;;;;;;;;;::::1;;22104:12;-1:-1:-1::0;;;;;22097:29:0::1;;22127:6;;;;;;;;;-1:-1:-1::0;;;;;22127:6:0::1;22135;22097:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;22097:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;22097:45:0;22075:110:::1;;;::::0;;-1:-1:-1;;;22075:110:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22075:110:0;;;;;;;;;;;;;::::1;;22203:54;::::0;;;;;22241:15:::1;22203:54;::::0;::::1;::::0;;;-1:-1:-1;;;;;22203:54:0;::::1;::::0;::::1;::::0;;;;;;::::1;21828:437:::0;;:::o;13950:55::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13950:55:0;;-1:-1:-1;13950:55:0;;-1:-1:-1;13950:55:0:o;2144:86::-;2191:4;2215:7;;;2144:86;:::o;23101:28::-;;;;:::o;4666:132::-;4246:12;:10;:12::i;:::-;4236:6;;-1:-1:-1;;;;;4236:6:0;;;:22;;;4228:67;;;;;-1:-1:-1;;;4228:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4757:6:::1;::::0;::::1;4749::::0;;4728:36:::1;::::0;-1:-1:-1;;;;;4757:6:0;;::::1;::::0;::::1;4749::::0;;::::1;::::0;;::::1;::::0;4728:36:::1;::::0;::::1;4784:6;::::0;::::1;4775:15:::0;;-1:-1:-1;;;;;4784:6:0;;::::1;;4775:15;-1:-1:-1::0;;;;;;4775:15:0;;::::1;::::0;;;::::1;::::0;;4666:132::o;22273:98::-;22350:6;:13;22273:98;:::o;20251:185::-;4034:12;:10;:12::i;:::-;4024:6;;;;;-1:-1:-1;;;;;4024:6:0;;;:22;;;4016:67;;;;;-1:-1:-1;;;4016:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4016:67:0;;;;;;;;;;;;;;;20330:13:::1;:28:::0;;;20376:52:::1;::::0;;;;;20412:15:::1;20376:52;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;20251:185:::0;:::o;20444:191::-;4034:12;:10;:12::i;:::-;4024:6;;;;;-1:-1:-1;;;;;4024:6:0;;;:22;;;4016:67;;;;;-1:-1:-1;;;4016:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4016:67:0;;;;;;;;;;;;;;;20522:17:::1;:27:::0;;;20567:60:::1;::::0;;;;;20611:15:::1;20567:60;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;20444:191:::0;:::o;22911:51::-;;;;;;;;;;;;-1:-1:-1;;;;;22911:51:0;;:::o;17762:847::-;4034:12;:10;:12::i;:::-;4024:6;;;;;-1:-1:-1;;;;;4024:6:0;;;:22;;;4016:67;;;;;-1:-1:-1;;;4016:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4016:67:0;;;;;;;;;;;;;;;17932:16:::1;::::0;;17946:1:::1;17932:16:::0;;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;;;;;17898:31:0;::::1;::::0;;:18:::1;:31:::0;;;;;;:50;;::::1;::::0;17932:16;17898:50:::1;:::i;:::-;-1:-1:-1::0;;;;;;17967:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;:33;::::1;;17959:68;;;::::0;;-1:-1:-1;;;17959:68:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;17959:68:0;;;;;;;;;;;;;::::1;;18043:7;18038:418;18060:19;:26;18056:1;:30;;;18038:418;;;18164:6;:13:::0;18134:26;;:43:::1;;18108:118;;;::::0;;-1:-1:-1;;;18108:118:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;18108:118:0;;;;;;;;;;;;;::::1;;18267:12;:36;18280:19;18300:1;18280:22;;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;18267:36:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;18267:36:0;:44;::::1;;18241:128;;;::::0;;-1:-1:-1;;;18241:128:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;18241:128:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;18384:31:0;::::1;;::::0;;;:18:::1;:31;::::0;;;;18421:22;;:19;;:22:::1;::::0;::::1;::::0;;::::1;;;;;;::::0;;::::1;::::0;;;;;;;18384:60;;::::1;::::0;;::::1;::::0;;-1:-1:-1;18384:60:0;;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;18384:60:0::1;-1:-1:-1::0;;;;;18384:60:0;;::::1;::::0;;;::::1;::::0;;;18088:3:::1;18038:418;;;-1:-1:-1::0;;;;;;18473:128:0;::::1;18529:31;::::0;;;:18:::1;:31;::::0;;;;;;;;18473:128;;18575:15:::1;18473:128:::0;;::::1;::::0;;;;;;;;;;;;;;::::1;::::0;18529:31;;18575:15;18473:128;;;;;;18529:31;;18473:128;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;18473:128:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;;;;;;;;;17762:847:::0;;:::o;14238:62::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14238:62:0;:::o;3457:21::-;;;;;;-1:-1:-1;;;;;3457:21:0;;:::o;24246:2492::-;2470:8;:6;:8::i;:::-;2469:9;2461:38;;;;;-1:-1:-1;;;2461:38:0;;;;;;;;;;;;-1:-1:-1;;;2461:38:0;;;;;;;;;;;;;;;24433:10:::1;-1:-1:-1::0;;;;;24433:29:0;::::1;;;24411:110;;;::::0;;-1:-1:-1;;;24411:110:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;24554:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;:34;::::1;;24532:110;;;::::0;;-1:-1:-1;;;24532:110:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;24750:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;;;:39:::1;;::::0;24692:10:::1;24675:28:::0;;:16:::1;:28:::0;;;;;:42;;;;;;;;;;:54:::1;::::0;24722:6;24675:46:::1;:54::i;:::-;:114;;24653:206;;;;-1:-1:-1::0;;;24653:206:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;24967:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;;;:39:::1;;::::0;24909:10:::1;24892:28:::0;;:16:::1;:28:::0;;;;;:42;;;;;;;;;;:54:::1;::::0;24939:6;24892:46:::1;:54::i;:::-;:114;;24870:206;;;;-1:-1:-1::0;;;24870:206:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;25168:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;;;:40:::1;;::::0;25109:12:::1;:26:::0;;;;;;;:38:::1;::::0;25140:6;25109:30:::1;:38::i;:::-;:99;;25087:173;;;::::0;;-1:-1:-1;;;25087:173:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;25330:15;25295:32;25313:13;;25295;;:17;;:32;;;;:::i;:::-;:50;25273:129;;;::::0;;-1:-1:-1;;;25273:129:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;25464:10;25449:26;::::0;;;:14:::1;:26;::::0;;;;;;;:34:::1;::::0;::::1;25503:41:::0;;25449:106:::1;::::0;;::::1;::::0;;;;;;;;;::::1;::::0;25566:35;;::::1;:46:::0;;;;::::1;::::0;;;;;;;;;;::::1;;::::0;;::::1;::::0;;;;::::1;;::::0;;::::1;;;::::0;;::::1;::::0;;25623:44;;-1:-1:-1;;;;;;25623:44:0;;::::1;::::0;;::::1;::::0;;25678:35:::1;::::0;::::1;:57:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;25678:57:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;25746:39:::1;::::0;::::1;:58:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;25815:36:::1;::::0;::::1;:58:::0;;;;::::1;::::0;;;;;;;;25857:15:::1;25815:58:::0;::::1;::::0;25926:39:::1;::::0;;::::1;:52:::0;;;;::::1;::::0;;;;;;;::::1;::::0;;;26018:26;;;:12:::1;:26:::0;;;;:38:::1;::::0;25971:6;26018:30:::1;:38::i;:::-;-1:-1:-1::0;;;;;25989:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;;;:67;;;;26143:10:::1;26112:52:::0;;:16:::1;:52:::0;;;;;:66;;;;;;;;;:92:::1;::::0;26197:6;26112:84:::1;:92::i;:::-;26084:10;26067:28;::::0;;;:16:::1;:28;::::0;;;;;;;-1:-1:-1;;;;;26067:42:0;::::1;::::0;;;;;;;;;:137;;;;26290:134;;-1:-1:-1;;;26290:134:0;;::::1;::::0;::::1;::::0;;;;26379:4:::1;26290:134:::0;;;;;;;;;;;:33:::1;::::0;:134;;;;;;;;;;;;;26067:42;26290:134;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;26290:134:0;26268:199:::1;;;::::0;;-1:-1:-1;;;26268:199:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26268:199:0;;;;;;;;;;;;;::::1;;26536:10;26562:26;::::0;;;:14:::1;:26;::::0;;;;:34:::1;;:41:::0;-1:-1:-1;;;;;26516:214:0;;::::1;::::0;;;::::1;::::0;::::1;::::0;26562:48:::1;::::0;26608:1:::1;26562:45;:48::i;:::-;26516:214;::::0;;;;;::::1;::::0;::::1;::::0;;;26704:15:::1;26516:214:::0;;;;;;;;;;;;::::1;24246:2492:::0;;;:::o;14307:37::-;14338:6;14307:37;:::o;36879:2724::-;4034:12;:10;:12::i;:::-;4024:6;;;;;-1:-1:-1;;;;;4024:6:0;;;:22;;;4016:67;;;;;-1:-1:-1;;;4016:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4016:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37113:27:0;::::1;37165:1;37113:27:::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;37154:7;;37113:49;::::1;;;;;;;;;;;;;:53;:127;;;;-1:-1:-1::0;;;;;;37187:27:0;::::1;;::::0;;;:14:::1;:27;::::0;;;;:36:::1;;:45:::0;;37224:7;;37187:45;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:53;;37236:4;37187:53;;;37113:127;37091:229;;;;-1:-1:-1::0;;;37091:229:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;37499:27:0;::::1;;::::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;37540:7;;37499:49;::::1;;;;;;;;;;;;;37388:14;:27;37403:11;-1:-1:-1::0;;;;;37388:27:0::1;-1:-1:-1::0;;;;;37388:27:0::1;;;;;;;;;;;;:40;;37429:7;37388:49;;;;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;37381:114:::1;::::0;;-1:-1:-1;;;37381:114:0;;37475:4:::1;37381:114;::::0;::::1;::::0;;;-1:-1:-1;;;;;37388:49:0;;::::1;::::0;37381:67:::1;::::0;:114;;;;;;;;;;37388:49;37381:114;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;37381:114:0;:167:::1;;37359:249;;;::::0;;-1:-1:-1;;;37359:249:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;37643:27:0;::::1;37621:19;37643:27:::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;37684:7;;37643:49;::::1;;;;;;;;;;;;;37621:71;;37751:5;37703:14;:27;37718:11;-1:-1:-1::0;;;;;37703:27:0::1;-1:-1:-1::0;;;;;37703:27:0::1;;;;;;;;;;;;:36;;37740:7;37703:45;;;;;;;;;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;37819:1;37767:14;:27;37782:11;-1:-1:-1::0;;;;;37767:27:0::1;-1:-1:-1::0;;;;;37767:27:0::1;;;;;;;;;;;;:40;;37808:7;37767:49;;;;;;;;;;;;;;;:53;;;;37921:104;38003:11;37921:12;:63;37934:14;:27;37949:11;-1:-1:-1::0;;;;;37934:27:0::1;-1:-1:-1::0;;;;;37934:27:0::1;;;;;;;;;;;;:40;;37975:7;37934:49;;;;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;37934:49:0::1;37921:63:::0;;;::::1;::::0;;;;;;;;;;:67:::1;:104::i;:::-;-1:-1:-1::0;;;;;37858:27:0;::::1;37831:87;37858:27:::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;37831:12:::1;::::0;:87;37858:40;37899:7;;37858:49;::::1;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;37858:49:0;;::::1;37831:87:::0;;;;::::1;::::0;;;;;;;;;;:194;;;;38045:27;;::::1;::::0;;:14:::1;:27:::0;;;;:40:::1;;:49:::0;;38086:7;;38045:49;::::1;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;38038:129:::1;::::0;;-1:-1:-1;;;38038:129:0;;-1:-1:-1;;;;;38038:129:0;;::::1;;::::0;::::1;::::0;;;;;;;;;38045:49;;;::::1;::::0;38038:66:::1;::::0;:129;;;;;38045:49;;38038:129;;;;;;;;;38045:49;38038:129;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;38185:9:0::1;::::0;-1:-1:-1;38180:1181:0::1;38200:12;:19;38196:1;:23;38180:1181;;;38319:6;38326:1;38319:9;;;;;;;;;;;;;;38274:12;38287:1;38274:15;;;;;;;;;;;;;;-1:-1:-1::0;;;;;38267:33:0::1;;38309:4;38267:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;38267:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;38267:48:0;:61:::1;;38241:162;;;;-1:-1:-1::0;;;38241:162:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38418:21;38442:6;38449:1;38442:9;;;;;;;;;;;;;;38418:33;;38529:1;-1:-1:-1::0;;;;;38472:59:0::1;:14;:27;38487:11;-1:-1:-1::0;;;;;38472:27:0::1;-1:-1:-1::0;;;;;38472:27:0::1;;;;;;;;;;;;:36;;38509:7;38472:45;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;38472:45:0::1;:59;38468:805;;38552:17;38593:49;38632:9;38594:32;38612:13;;38594;:17;;:32;;;;:::i;38593:49::-;38552:90:::0;-1:-1:-1;38677:28:0::1;:13:::0;38552:90;38677:17:::1;:28::i;:::-;38661:44;;38763:12;38776:1;38763:15;;;;;;;;;;;;;;-1:-1:-1::0;;;;;38756:32:0::1;;38815:14;:27;38830:11;-1:-1:-1::0;;;;;38815:27:0::1;-1:-1:-1::0;;;;;38815:27:0::1;;;;;;;;;;;;:36;;38852:7;38815:45;;;;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;38756:163:::1;::::0;;-1:-1:-1;;;;;;38756:163:0::1;::::0;;;;;;-1:-1:-1;;;;;38815:45:0;;::::1;38756:163;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;38756:163:0;38726:264:::1;;;::::0;;-1:-1:-1;;;38726:264:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;39153:12;39166:1;39153:15;;;;;;;;;;;;;;-1:-1:-1::0;;;;;39016:241:0::1;39119:11;-1:-1:-1::0;;;;;39016:241:0::1;39051:14;:27;39066:11;-1:-1:-1::0;;;;;39051:27:0::1;-1:-1:-1::0;;;;;39051:27:0::1;;;;;;;;;;;;:36;;39088:7;39051:45;;;;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;39016:241:::1;::::0;;;;;39223:15:::1;39016:241:::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;39051:45:0;;::::1;::::0;39016:241:::1;::::0;;;;;;;;;::::1;38468:805;;39296:12;39309:1;39296:15;;;;;;;;;;;;;;-1:-1:-1::0;;;;;39289:32:0::1;;39322:11;39335:13;39289:60;;;;;;;;;;;;;-1:-1:-1::0;;;;;39289:60:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;38221:3:0::1;;38180:1181;;;-1:-1:-1::0;;;;;;39457:27:0;::::1;;::::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;39498:7;;39457:49;::::1;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;39409:186:::1;::::0;;;;;39547:15:::1;39409:186:::0;;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;39457:49:0;;::::1;::::0;39409:186;;::::1;::::0;::::1;::::0;;;;;;;;::::1;4094:1;36879:2724:::0;;;;:::o;21261:559::-;4034:12;:10;:12::i;:::-;4024:6;;;;;-1:-1:-1;;;;;4024:6:0;;;:22;;;4016:67;;;;;-1:-1:-1;;;4016:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4016:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;21434:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;:33;::::1;;:87:::0;::::1;;;-1:-1:-1::0;;;;;;21488:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;:33;::::1;;21434:87;21412:152;;;::::0;;-1:-1:-1;;;21412:152:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;21412:152:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;21575:31:0;;::::1;;::::0;;;:18:::1;:31;::::0;;;;;;;:44;;::::1;::::0;;;;;;;;;;:53;;-1:-1:-1;;21575:53:0::1;::::0;::::1;;;::::0;;;;21646:166;;21575:53:::1;21727:44:::0;;::::1;21646:166;;::::0;;21786:15:::1;21646:166:::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;::::1;21261:559:::0;;;:::o;19244:999::-;4034:12;:10;:12::i;:::-;4024:6;;;;;-1:-1:-1;;;;;4024:6:0;;;:22;;;4016:67;;;;;-1:-1:-1;;;4016:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4016:67:0;;;;;;;;;;;;;;;19447:14:::1;:19;;19465:1;19447:19;:42;;;;19470:14;:19;;19488:1;19470:19;19447:42;:65;;;;19493:14;:19;;19511:1;19493:19;19447:65;19425:138;;;::::0;;-1:-1:-1;;;19425:138:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;19582:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;:34;::::1;;:42;;:34:::0;:42:::1;19574:70;;;::::0;;-1:-1:-1;;;19574:70:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;19574:70:0;;;;;;;;;;;;;::::1;;19661:14;:19;;19679:1;19661:19;19657:360;;;19739:63;:15;19777:10:::0;19739:19:::1;:63::i;:::-;-1:-1:-1::0;;;;;19697:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;;;:39:::1;:105:::0;19657:360:::1;;;19824:14;:19;;19842:1;19824:19;19820:197;;;-1:-1:-1::0;;;;;19858:26:0;::::1;19900:1;19858:26:::0;;;:12:::1;:26;::::0;;;;;;:39:::1;:43:::0;19820:197:::1;;;19921:14;:19;;19939:1;19921:19;19917:100;;;-1:-1:-1::0;;;;;19955:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;:43:::1;;:62:::0;;-1:-1:-1;;19955:62:0::1;::::0;::::1;;;::::0;;19917:100:::1;-1:-1:-1::0;;;;;20035:200:0;::::1;20097:26;::::0;;;:12:::1;:26;::::0;;;;;;;;:39;;::::1;::::0;20151:43:::1;::::0;;::::1;::::0;20035:200;;;;;20151:43:::1;;20035:200;;::::0;;::::1;::::0;20209:15:::1;20035:200:::0;;;;;;::::1;::::0;;;;;;;::::1;19244:999:::0;;;;:::o;16804:950::-;4034:12;:10;:12::i;:::-;4024:6;;;;;-1:-1:-1;;;;;4024:6:0;;;:22;;;4016:67;;;;;-1:-1:-1;;;4016:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4016:67:0;;;;;;;;;;;;;;;17036:11:::1;:18;17014:11;:18;:40;:107;;;;;17097:17;:24;17075:11;:18;:46;17014:107;16992:170;;;::::0;;-1:-1:-1;;;16992:170:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;16992:170:0;;;;;;;;;;;;;::::1;;17180:7;17175:572;17197:11;:18;17193:1;:22;;;17175:572;;;17263:12;:28;17276:11;17288:1;17276:14;;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;17263:28:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;17263:28:0;:36;::::1;;:97:::0;::::1;;;;17324:12;:28;17337:11;17349:1;17337:14;;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;17324:28:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;17324:28:0;:36;::::1;;17263:97;17237:174;;;::::0;;-1:-1:-1;;;17237:174:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;17237:174:0;;;;;;;;;;;;;::::1;;17515:17;17533:1;17515:20;;;;;;;;;;;;;;;;17426:22;:38;17449:11;17461:1;17449:14;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;17426:38:0::1;-1:-1:-1::0;;;;;17426:38:0::1;;;;;;;;;;;;:86;17483:11;17495:1;17483:14;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;17426:86:0::1;-1:-1:-1::0;;;;;17426:86:0::1;;;;;;;;;;;;:109;;;;17633:11;17645:1;17633:14;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;17557:178:0::1;17600:11;17612:1;17600:14;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;17557:178:0::1;;17666:17;17684:1;17666:20;;;;;;;;;;;;;;;;17705:15;17557:178;;;;;;;;;;;;;;;;;;;;;;;;17217:3;;17175:572;;;;16804:950:::0;;;:::o;18617:619::-;4034:12;:10;:12::i;:::-;4024:6;;;;;-1:-1:-1;;;;;4024:6:0;;;:22;;;4016:67;;;;;-1:-1:-1;;;4016:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4016:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;18803:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;:34;::::1;;18795:62;;;::::0;;-1:-1:-1;;;18795:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;18795:62:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;18868:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;;;;:39:::1;::::0;::::1;:54:::0;;;18933:39:::1;::::0;::::1;:54:::0;;;18998:40:::1;;:53:::0;;;19069:159;;;;;;;::::1;::::0;;;;;;;;;19202:15:::1;19069:159:::0;;;;;;::::1;::::0;;;;;;;::::1;18617:619:::0;;;;:::o;34438:2433::-;34552:4;2470:8;:6;:8::i;:::-;2469:9;2461:38;;;;;-1:-1:-1;;;2461:38:0;;;;;;;;;;;;-1:-1:-1;;;2461:38:0;;;;;;;;;;;;;;;34596:10:::1;-1:-1:-1::0;;;;;34596:25:0;::::1;;::::0;:49:::1;;-1:-1:-1::0;34639:6:0::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;34639:6:0::1;34625:10;:20;34596:49;34574:126;;;::::0;;-1:-1:-1;;;34574:126:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;34735:27:0;::::1;34713:19;34735:27:::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;34776:7;;34735:49;::::1;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;34735:49:0::1;34850:25:::0;;;:12:::1;:25:::0;;;;;;;;:38:::1;::::0;34735:49;;-1:-1:-1;34892:15:0::1;-1:-1:-1::0;34850:57:0::1;34828:128;;;::::0;;-1:-1:-1;;;34828:128:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34828:128:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;35005:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;:42:::1;;::::0;::::1;;35001:279;;;35197:15;35088:105;35161:13;;35088:14;:27;35103:11;-1:-1:-1::0;;;;;35088:27:0::1;-1:-1:-1::0;;;;;35088:27:0::1;;;;;;;;;;;;:37;;35126:7;35088:46;;;;;;;;;;;;;;;;:50;;:105;;;;:::i;:::-;:124;;35062:218;;;::::0;;-1:-1:-1;;;35062:218:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;35334:27:0;::::1;35386:1;35334:27:::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;35375:7;;35334:49;::::1;;;;;;;;;;;;;:53;:127;;;-1:-1:-1::0;;;;;;35408:27:0;::::1;;::::0;;;:14:::1;:27;::::0;;;;:36:::1;;:45:::0;;35445:7;;35408:45;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:53;;35457:4;35408:53;;;35334:127;35312:227;;;;-1:-1:-1::0;;;35312:227:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;35615:27:0;::::1;35579:20;35615:27:::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;35656:7;;35615:49;::::1;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;35699:25:0;::::1;::::0;;:12:::1;:25:::0;;;;;;;;35615:49;;-1:-1:-1;35763:43:0::1;35699:25:::0;35615:49;35763:29:::1;:43::i;:::-;-1:-1:-1::0;;;;;35735:25:0;;::::1;;::::0;;;:12:::1;:25;::::0;;;;;;;:71;;;;35862:53;;::::1;::::0;;:16:::1;:53:::0;;;;;:66;;;;;;;:98:::1;::::0;35947:12;35862:84:::1;:98::i;:::-;-1:-1:-1::0;;;;;35817:29:0;;::::1;;::::0;;;:16:::1;:29;::::0;;;;;;;:42;;::::1;::::0;;;;;;;;:143;;;;35971:27;;;:14:::1;:27:::0;;;;;:40:::1;;:49:::0;;36012:7;;35971:49;::::1;;;;;;::::0;;;::::1;::::0;;;;;::::1;:53:::0;;;;-1:-1:-1;;;;;36035:27:0;::::1;::::0;;:14:::1;:27:::0;;;;;;:36:::1;;:45:::0;;36072:7;;36035:45;::::1;;;;;;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;36267:12;36156:14;:27;36171:11;-1:-1:-1::0;;;;;36156:27:0::1;-1:-1:-1::0;;;;;36156:27:0::1;;;;;;;;;;;;:40;;36197:7;36156:49;;;;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;36149:114:::1;::::0;;-1:-1:-1;;;36149:114:0;;36243:4:::1;36149:114;::::0;::::1;::::0;;;-1:-1:-1;;;;;36156:49:0;;::::1;::::0;36149:67:::1;::::0;:114;;;;;;;;;;36156:49;36149:114;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;36149:114:0;:130:::1;;36127:210;;;::::0;;-1:-1:-1;;;36127:210:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;36404:27:0;::::1;;::::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;36445:7;;36404:49;::::1;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;36397:130:::1;::::0;;-1:-1:-1;;;36397:130:0;;-1:-1:-1;;;;;36397:130:0;;::::1;;::::0;::::1;::::0;;;;;;;;;36404:49;;;::::1;::::0;36397:66:::1;::::0;:130;;;;;36404:49;;36397:130;;;;;;;;;36404:49;36397:130;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;36540:63:0::1;::::0;-1:-1:-1;36553:11:0;36566:7;36575:12;36589:13;36540:12:::1;:63::i;:::-;-1:-1:-1::0;;;;;36700:27:0;::::1;;::::0;;;:14:::1;:27;::::0;;;;:40:::1;;:49:::0;;36741:7;;36700:49;::::1;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;36652:187:::1;::::0;;;;;36791:15:::1;36652:187:::0;;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;36700:49:0;;::::1;::::0;36652:187;;::::1;::::0;::::1;::::0;;;;;;;;::::1;36859:4;36852:11;;;;;2510:1;34438:2433:::0;;;;:::o;14012:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23047:47::-;;;;;;;;;;;;;:::o;14432:28::-;;;;:::o;4953:281::-;4034:12;:10;:12::i;:::-;4024:6;;;;;-1:-1:-1;;;;;4024:6:0;;;:22;;;4016:67;;;;;-1:-1:-1;;;4016:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4016:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;5056:22:0;::::1;5034:110;;;;-1:-1:-1::0;;;5034:110:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5181:6;::::0;;5160:38:::1;::::0;-1:-1:-1;;;;;5160:38:0;;::::1;::::0;5181:6:::1;::::0;;::::1;;::::0;5160:38:::1;::::0;::::1;5209:6;:17:::0;;-1:-1:-1;;;;;5209:17:0;;::::1;;;-1:-1:-1::0;;;;;;5209:17:0;;::::1;::::0;;;::::1;::::0;;4953:281::o;14351:39::-;14383:7;14351:39;:::o;722:106::-;810:10;722:106;:::o;8493:132::-;8551:7;8578:39;8582:1;8585;8578:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;8571:46;8493:132;-1:-1:-1;;;8493:132:0:o;7546:471::-;7604:7;7849:6;7845:47;;-1:-1:-1;7879:1:0;7872:8;;7845:47;7916:5;;;7920:1;7916;:5;:1;7940:5;;;;;:10;7932:56;;;;-1:-1:-1;;;7932:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6622:136;6680:7;6707:43;6711:1;6714;6707:43;;;;;;;;;;;;;;;;;:3;:43::i;6158:181::-;6216:7;6248:5;;;6272:6;;;;6264:46;;;;;-1:-1:-1;;;6264:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;26906:840;27099:16;27126:19;27169:32;27187:13;;27169;;:17;;:32;;;;:::i;:::-;27158:43;;27262:15;27251:8;:26;27247:123;;;-1:-1:-1;27293:15:0;27247:123;;;27356:13;;27338;;:32;;:17;:32::i;:::-;27324:46;;27247:123;-1:-1:-1;;;;;27424:27:0;;;;;;:14;:27;;;;;:37;;:46;;27394:87;;27424:37;27462:7;;27424:46;;;;;;;;;;;;;;27394:11;:15;;:87;;;;:::i;:::-;27383:98;;27492:27;;:::i;:::-;27530:29;;;:12;27570;;:27;;;14383:7;27645:17;;27641:97;;27677:61;27696:11;27709:7;27718:9;27729:8;27677:18;:61::i;:::-;26906:840;;;;;;;:::o;9121:225::-;9241:7;9276:12;9269:5;9261:28;;;;-1:-1:-1;;;9261:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9300:9;9316:1;9312;:5;;;;;;;9121:225;-1:-1:-1;;;;;9121:225:0:o;7061:226::-;7181:7;7217:12;7209:6;;;;7201:29;;;;-1:-1:-1;;;7201:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7253:5:0;;;7061:226::o;27754:4418::-;27932:21;27964:17;27992:26;;:::i;:::-;28045:19;:8;14383:7;28045:12;:19::i;:::-;28031:11;;;:33;28089:18;:8;14338:6;28089:12;:18::i;:::-;28075:32;;28200:14;;-1:-1:-1;;;;;28233:27:0;;28084:1;28233:27;;;:14;28075:11;28233:27;;;;:40;;:49;;28136:273;;28166:232;;28200:14;;28274:7;;28233:49;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28301:27:0;;;;;:14;:27;;;;;;;:40;;:49;;28233;;;;;28301:40;28342:7;;28301:49;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28301:49:0;28369:11;28301:49;28369:14;;;;;28166:15;:232::i;:::-;28136:11;;;;;:15;:273::i;:::-;-1:-1:-1;;;;;28455:27:0;;28512:1;28455:27;;;:14;:27;;;;;:36;;:45;;28120:289;;-1:-1:-1;28512:1:0;;28492:7;;28455:45;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28455:45:0;:59;28451:793;;28543:49;28582:9;28544:32;28562:13;;28544;:17;;:32;;;;:::i;28543:49::-;28531:61;-1:-1:-1;28623:28:0;:13;28531:61;28623:17;:28::i;:::-;-1:-1:-1;;;;;28701:27:0;;;;;;:14;:27;;;;;:40;;:49;;28607:44;;-1:-1:-1;28701:40:0;28742:7;;28701:49;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28805:27:0;;;;;:14;:27;;;;;;;:36;;:45;;28701:49;;;;;28694:88;;28842:7;;28805:45;;;;;;;;;;;;;;;;;;28694:207;;;-1:-1:-1;;;;;;28694:207:0;;;;;;;-1:-1:-1;;;;;28805:45:0;;;28694:207;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28694:207:0;:215;;28905:4;28694:215;28668:292;;;;;-1:-1:-1;;;28668:292:0;;;;;;;;;;;;-1:-1:-1;;;28668:292:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29106:27:0;;;;;;:14;:27;;;;;:40;;:49;;29147:7;;29106:49;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29013:27:0;;;;;:14;:27;;;;;;;:36;;:45;;29106:49;;;;;29077:10;;29050:7;;29013:45;;;;;;;;;;;;;;;;;28982:250;;;;;;29202:15;28982:250;;;;;;;;;-1:-1:-1;;;;;29013:45:0;;;;28982:250;;;;;;;;;;;28451:793;-1:-1:-1;;;;;29332:27:0;;;;;;:14;:27;;;;;:40;;:49;;29282:202;;29306:11;;29373:7;;29332:49;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29396:27:0;;;;;:14;:27;;;;;;;:40;;:49;;29332;;;;;29396:40;29437:7;;29396:49;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29396:49:0;29460:13;29282:9;:202::i;:::-;29507:1;29521:2644;29532:12;:19;29528:23;;;;29521:2644;;;29587:12;29600:1;29587:15;;;;;;;;;;;;;;;;;;;;29572:11;;:30;29568:2586;;29623:22;29648:32;29677:2;29649:22;29669:1;29649:12;29662:1;29649:15;;;;;;;;;;;;;;;;;;:19;;:22;;;;:::i;:::-;29648:28;;:32::i;:::-;29623:57;-1:-1:-1;29699:16:0;29718:31;29623:57;29718:8;29727:1;29718:11;;;;;:15;:31::i;:::-;29699:50;;29770:19;29813:18;:117;29858:14;:27;29873:11;-1:-1:-1;;;;;29858:27:0;-1:-1:-1;;;;;29858:27:0;;;;;;;;;;;;:40;;29899:7;29858:49;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29858:49:0;29813:117;;;;;;;;;;;;:120;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30016:27:0;;;;;:14;:27;;;;;;;:40;;:49;;29813:120;;;;;-1:-1:-1;30057:7:0;;30016:49;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29980:85:0;;;30016:49;;29980:85;;;;:270;;-1:-1:-1;;;;;;30135:27:0;;30090:117;30135:27;;;:14;:27;;;;;:40;;:49;;30090:18;;:117;30135:40;30176:7;;30135:49;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30135:49:0;;;30090:117;;;;;;;;;;;;;;;:130;;;;;;;;;;;;;;:160;29980:270;29954:2111;;;30394:14;;-1:-1:-1;;;;;30439:27:0;;30406:1;30439:27;;;:14;30394;30439:27;;;;:40;;:49;;30309:316;;30348:254;;30394:14;;30480:7;;30439:49;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30439:49:0;30519:11;30561;30439:49;30561:14;;30348:254;30309:8;;:12;:316::i;:::-;-1:-1:-1;;;;;30723:27:0;;30805:1;30723:27;;;:14;:27;;;;;:36;;:45;;30293:332;;-1:-1:-1;30805:1:0;;30760:7;;30723:45;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30723:45:0;:84;30693:1066;;30870:105;30939:9;30871:32;30889:13;;30871;:17;;:32;;;;:::i;30870:105::-;30858:117;-1:-1:-1;31018:28:0;:13;30858:117;31018:17;:28::i;:::-;31002:44;;31120:11;-1:-1:-1;;;;;31113:28:0;;31176:14;:27;31191:11;-1:-1:-1;;;;;31176:27:0;-1:-1:-1;;;;;31176:27:0;;;;;;;;;;;;:36;;31213:7;31176:45;;;;;;;;;;;;;;;;;;;;31113:183;;;-1:-1:-1;;;;;;31113:183:0;;;;;;;-1:-1:-1;;;;;31176:45:0;;;31113:183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31113:183:0;:191;;31300:4;31113:191;31075:304;;;;;-1:-1:-1;;;31075:304:0;;;;;;;;;;;;-1:-1:-1;;;31075:304:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31573:27:0;;;;;;:14;:27;;;;;:40;;:49;;31614:7;;31573:49;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31456:27:0;;;;;:14;:27;;;;;;;:36;;:45;;31573:49;;;;;31532:10;;31493:7;;31456:45;;;;;;;;;;;;;;;;;31413:322;;;;;;31693:15;31413:322;;;;;;;;;-1:-1:-1;;;;;31456:45:0;;;;31413:322;;;;;;;;;;;30693:1066;-1:-1:-1;;;;;31895:27:0;;;;;;:14;:27;;;;;:40;;:49;;31821:224;;31857:11;;31936:7;;31895:49;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31895:49:0;31971:11;32009:13;31821:9;:224::i;:::-;32087:1;32091;32087:5;32083:9;;29568:2586;;;;;;32133:5;;29568:2586;29521:2644;;;27754:4418;;;;;;;;:::o;33530:796::-;-1:-1:-1;;;;;33715:26:0;;;33711:608;;33833:6;33791:12;-1:-1:-1;;;;;33784:30:0;;33823:4;33784:45;;;;;;;;;;;;;-1:-1:-1;;;;;33784:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33784:45:0;:55;;33758:144;;;;;-1:-1:-1;;;33758:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33986:12;-1:-1:-1;;;;;33979:29:0;;34009:11;34022:6;33979:50;;;;;;;;;;;;;-1:-1:-1;;;;;33979:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33979:50:0;33953:127;;;;;-1:-1:-1;;;33953:127:0;;;;;;;;;;;;-1:-1:-1;;;33953:127:0;;;;;;;;;;;;;;;34221:12;-1:-1:-1;;;;;34137:170:0;34191:11;-1:-1:-1;;;;;34137:170:0;34161:11;-1:-1:-1;;;;;34137:170:0;;34252:6;34277:15;34137:170;;;;;;;;;;;;;;;;;;;;;;;;33530:796;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;
Swarm Source
ipfs://e99c1fd5757d0850d9a91f53d430f8ac1edcd305bb7af963ff1abf5adb888d81
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.