ETH Price: $3,633.51 (-2.07%)

Token

ERC-20: DiamondHandToken (DT)
 

Overview

Max Total Supply

80,000.003611899567656568 DT

Holders

22

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
4.708530041271996535 DT

Value
$0.00
0x3e7ba6ef3bbf727509ce79cb2cb3939553ecbab1
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DiamondHandToken

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-11-19
*/

//SPDX-License-Identifier: Unlicensed

pragma solidity ^0.8.0;


interface IERC20 {
  function transfer(address to, uint256 value) external returns (bool);
  function approve(address spender, uint256 value) external returns (bool);
  function transferFrom(address from, address to, uint256 value) external returns (bool);
  function totalSupply() external view returns (uint256);
  function balanceOf(address account) external view returns (uint256);
  function allowance(address owner, address spender) external view returns (uint256);
  function decimals() external view returns (uint8);
  function burn(uint256 amount) external;
  event Transfer(address indexed from, address indexed to, uint256 value);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}


library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}


interface IPancakeRouter01 {
    function factory () external pure returns (address);
    function factoryV1 () external pure returns (address);
    function factoryV2 () external pure returns (address);
    function WETH () external pure returns (address);
    function WPLS () external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);

    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

pragma solidity >=0.6.2;

interface IRouter is IPancakeRouter01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

pragma solidity >=0.6.2;

interface IFactory {
function getPair (address token1, address token2) external pure returns (address);
}


contract SuperTokenWrapper {
    using SafeMath for uint256;

    address public bridgeToken;
    address public functETHtoken;
    address public _dev = 0x60859bAF5f538c5F82219e286E73Df1DE43ceEde;

    event Wrapping (address indexed user, uint256 tokenAmount, string action);

    modifier onlyDev() {
        require(msg.sender == _dev); _;
    }

    function setAddresses (address _bridgeToken, address _functETHtoken) public onlyDev { 
            require(bridgeToken == address(0), "setAddresses: Addresses already set!");
            bridgeToken = _bridgeToken;
            functETHtoken = _functETHtoken;
    }

    function deposit (uint256 amount) public {
        uint256 userBalance = IERC20(bridgeToken).balanceOf(msg.sender);
        require (userBalance <= amount, "Wrapper Deposit: The amount you want to wrap exceeds your balance!");

        IERC20(bridgeToken).transfer(address(this), amount);

        IERC20(functETHtoken).transfer(msg.sender, amount);

        emit Wrapping(msg.sender, amount, "deposit/wrap");

    }

    function withdraw (uint256 amount) public {
        uint256 userBalance = IERC20(functETHtoken).balanceOf(msg.sender);
        require (userBalance <= amount, "Wrapper Withdraw: The amount you want to unwrap exceeds your balance!");

        IERC20(functETHtoken).transfer(address(this), amount);

        IERC20(bridgeToken).transfer(msg.sender, amount);

        emit Wrapping(msg.sender, amount, "withdraw/unwrap");

    }


}


interface ISuperTokenManager {
    function burnLP(uint8 buyBackPercent, address tradingPair, address managerAddr, uint256 lpBal ) external returns (uint256, uint256);
    function buyBack(address managerAddr, uint256 ethForBuyback ) external returns (uint256);
}


contract SuperTokenManager is ISuperTokenManager {
    using SafeMath for uint256;

    address public _token;
    IRouter public _router;

    address payable public _dev;

    uint256 public collectedToken;
    uint256 public totalBurnedToken;

    modifier onlyToken() {
        require(msg.sender == _token); _;
    }

    constructor (address router, address payable dev) {
        _router = IRouter(router);
        _token = msg.sender;
        _dev = dev;
    }

 
    // to make the contract being able to receive ETH from Router
    receive() external payable {}


    // function to remove some of the collected LP (onlyToken!)
    function burnLP (uint8 buyBackPercent, address tradingPair, address managerAddr, uint256 lpBal ) external override onlyToken returns (uint256, uint256) {   

        if (IERC20(tradingPair).allowance(managerAddr, address(_router)) == 0) {
         IERC20(tradingPair).approve(address(_router), type(uint256).max);
        }


        uint256 tokenBalBefore = IERC20(_token).balanceOf(managerAddr);

        uint256 lpBalToRemove = lpBal.mul(buyBackPercent).div(1000);

        // remove X% of the colected Liq daily to buyback Token
        (uint256 ethGain, uint256 tokenGain) =
        _router.removeLiquidity(
          _router.WETH(),
          _token,
          lpBalToRemove,
          0,
          0,
          managerAddr,
          block.timestamp + 100
        );

        collectedToken = (IERC20(_token).balanceOf(managerAddr)).sub(tokenBalBefore);

        IERC20(_router.WETH()).transfer(address(_token), ethGain);

        return ( ethGain, tokenGain);
    }

    // function to buy back token with gained ETH from LP removal (onlyToken!)
    function buyBack (address managerAddr, uint256 ethForBuyback) external override onlyToken returns (uint256) {   

        if (IERC20(_router.WETH()).allowance(managerAddr, address(_router)) == 0) {
         IERC20(_router.WETH()).approve(address(_router), type(uint256).max);
        }

        uint256 tokenBalBefore = IERC20(_token).balanceOf(managerAddr);
    
          address[] memory path = new address[](2);
          path[0] = _router.WETH();
          path[1] = _token;

          // Buyback token from LP from received ETH
          _router.swapExactTokensForTokens (
          ethForBuyback,  
          0,
          path,
          managerAddr,
          block.timestamp +100
        );

        uint256 allGainedTokenToBurn = collectedToken.add((IERC20(_token).balanceOf(managerAddr)).sub(tokenBalBefore));
        IERC20(_token).transfer(address(0), allGainedTokenToBurn);

        totalBurnedToken += allGainedTokenToBurn;
        collectedToken = 0;

        return allGainedTokenToBurn;

    }


 ////// Test functions TODO to be removed!!


    modifier onlyDev() {
        require(_dev == msg.sender, "Ownable: caller is not the dev");
        _;
    }

    function securityETHWithdrawal () public onlyDev {

        uint256 ETHbal = address(this).balance;
        (_dev).transfer(ETHbal);
    }
    
    function securityTokenWithdrawal (address tokenAddr) public onlyDev {        

        uint256 tokenBal = IERC20(tokenAddr).balanceOf(address(this));
        IERC20(tokenAddr).transfer(_dev, tokenBal);
    }


}






contract DiamondHandToken {

    using SafeMath for uint256;

    address payable public _dev = payable (0x60859bAF5f538c5F82219e286E73Df1DE43ceEde); // receives ETH of buy and vest function
 
    uint8 public contractBuyFee = 30;

    address public contrAddr;

    address public _routerAddr = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; //  Uniswap V2 on test and mainnet equal
    IRouter public _router = IRouter(_routerAddr);

    IFactory public _factory = IFactory(_router.factory());
    address public tradingPair = address(0);

    ISuperTokenManager public manager;

    uint256 public usedETHforBuyBack;
    uint256 public burnedTokenFromBuyBack;
    uint256 public lpBal;

    uint256 public overallVestedToken;
    uint256 public overallCollectedDividends;

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    event Vest(address indexed user, uint256 stakeAmount, uint256 vestTime);
    event EnterVesting (address indexed user, uint256 rawAmount, uint256 vestedTokenAmt, uint256 entryTime);
    event ClaimRewards (address indexed user, uint256 rewardAmount, uint256 claimTime);

    modifier onlyDev() {
        require(_dev == msg.sender, "Ownable: caller is not the dev");
        _;
    }

    string public constant name = "DiamondHandToken";
    string public constant symbol = "DT";
    uint256 public constant decimals = 18;

    uint256 public _monthlyDevmint = 2000 * 1e18; // 2 k token

    uint256 public _totalSupply;

    bool public noVestandBuyVest = false;

    mapping(address => uint256) private _Balances;

    /* Time of contract launch */
    uint256 public LAUNCH_TIME = 1700337000; // Sets Starttime of the contract, Days and Month // TODO
    uint256 public oneDay = 1 days;  // 100; //  TODO
    uint256 public oneMonth =  30 days; //699; // TODO


    uint256 public currentDay;
    uint256 public currentMonth;

    uint256 public lastBuyVestDay;
    uint8 public buyBackPerecent = 40; // 40 equals 4%
    uint8 public percentToReceive = 20; // percentage of tokens to be received when doing a regular buy from DEX
    
    uint256 public rewardDays = 365; // rewarded days when user does vesting

    uint256 private weiPerSfor1perDay = 11574074074074;  // this token/wei amount need to be accounted per second to have 1 ETH per day
    
    
    struct userVestData{
      uint256 vestTime;
      uint256 userVestDay;
      uint256 userVestAmt;
      uint256 amount;
      uint256 claimed;
      uint256 lastUpdate;
      uint256 collected;
    }   

    mapping(address => mapping(uint256 => userVestData)) public vests;


    // counter for users vesting 
    mapping(address => uint256) public vestID;

    // day's total ETH vesting amount 
    mapping(uint256 => uint256) public vestingEntry;

    // total ETH amount for vesting   
    uint256 public vestingEntry_allDays;

    // counting unique (unique for every day only) Auction enteries for each day
    mapping(uint256 => uint256) public usersCountDaily;

    // counting unique (unique for every day only) users
    uint256 public usersCount = 0;


    // mapping for allowance
    mapping (address => mapping (address => uint256)) private _allowance;

    
    // Auction memebrs overall data 
    struct userVesting_GlobalData{
        uint256 overall_collectedTokens;
        uint256 totalVestingAmount;
        uint256 overall_stakedTokens;
    }
    // new map for every user's overall data  
    mapping(address => userVesting_GlobalData) public mapUserVest_globalData;
    

    // Addresses that excluded from transferTax when receiving
    mapping(address => bool) private _excludedFromTaxReceiver;
    



    constructor() {
        contrAddr = address(this);

        manager = new SuperTokenManager(address(_routerAddr), _dev);

        _excludedFromTaxReceiver[msg.sender] = true;
        _excludedFromTaxReceiver[contrAddr] = true;
        _excludedFromTaxReceiver[_routerAddr] = true;
        _excludedFromTaxReceiver[_dev] = true;
        _excludedFromTaxReceiver[address(manager)] = true;

        _mint(_dev, 80000 * 1e18); // initial supply mint to DEV

    }
    
    function totalSupply() external view returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) external view returns (uint256) {
        return _Balances[account];
    }

    function allowance(address owner_, address spender) external view returns (uint256) {
        return _allowance[owner_][spender];
    }

    function approve(address spender, uint256 value) public returns (bool) {
        _allowance[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {
        _allowance[msg.sender][spender] =
        _allowance[msg.sender][spender].add(addedValue);
        emit Approval(msg.sender, spender, _allowance[msg.sender][spender]);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
        uint256 oldValue = _allowance[msg.sender][spender];
        if (subtractedValue >= oldValue) {
            _allowance[msg.sender][spender] = 0;
        } else {
            _allowance[msg.sender][spender] = oldValue.sub(subtractedValue);
        }
        emit Approval(msg.sender, spender, _allowance[msg.sender][spender]);
        return true;
    }



    // Set addresses of dev ad dev1
    function setDevs(address payable dev) external onlyDev {
        _dev = dev;
     }



    // Set the fee that goes to dev with each auction entry
    function setDevBuyFee(uint8 _devBuyFee) external onlyDev {
      require(_devBuyFee <= 30, "setDevBuyFee: Dev Auction Fee cant be above 30%" );
        contractBuyFee = _devBuyFee;
     }

    // Set the bool to prefent users from using the vest and buyAndVest function.
    function setNoVestandBuyVest(bool _noVestandBuyVest) external onlyDev {      
        noVestandBuyVest = _noVestandBuyVest;
     }


    // Set the LP-Buyback Percentage (1000 equals 100%)
    function setBuyBackPerecent(uint8 _buyBackPerecent) external onlyDev {
        require (_buyBackPerecent < 1000, "Value to big, use at max 999!");
        buyBackPerecent = _buyBackPerecent;
     }


    function devMint() external onlyDev {
        uint256 thisMonth = (block.timestamp - LAUNCH_TIME) / oneMonth;

        require (thisMonth > currentMonth, "devMint: you already minted this month!");

        _mint(_dev, _monthlyDevmint);

        currentMonth = thisMonth;
    }

    // Set the percentage to be received when buying from DEX
     function setPercentToReceive(uint8 _percentToReceive) external onlyDev {
        require (20 <= _percentToReceive, "Value to small, use at least 20!");
        require (_percentToReceive <= 100, "Value to big, use at max 100!");
        percentToReceive = _percentToReceive;
     }
     
    // Set address to be in- or excluded from Tax when receiving
    function setExcludedFromTaxReceiver(address _account, bool _excluded) external onlyDev {
        _excludedFromTaxReceiver[_account] = _excluded;
     }


    // Returns if the address is excluded from Tax or not when receiving.    
    function isExcludedFromTaxReceiver(address _account) public view returns (bool) {
        return _excludedFromTaxReceiver[_account];
    }



    
   function transferToZero(uint256 amount) internal returns (bool) {
        _Balances[contrAddr] = _Balances[contrAddr].sub(amount, "Token: transfer amount exceeds balance");
        _Balances[address(0)] = _Balances[address(0)].add(amount);
        emit Transfer(contrAddr, address(0), amount);
        return true;
    }

    function transfer(address to, uint256 amount) public returns (bool) {
        _transfer(msg.sender, to, amount);
        return true;
    }  

    function transferFrom(address from, address to, uint256 amount) public returns (bool) {
        if( msg.sender != contrAddr ) {
          _allowance[from][msg.sender] = _allowance[from][msg.sender].sub(amount);
        }
        _transfer(from, to, amount);
        return true;
    }

    // internal transfer function to apply the transfer tax ONLY for buys from DEX liquidity
    function _transfer(address from, address to, uint256 amount) internal virtual {

        // For Taxed Transfer (if pair is sender (token BUY) tax of "percentToReceive"-% applies)
        bool _isTaxedRecipient = !isExcludedFromTaxReceiver(to);

            if ( from == tradingPair && _isTaxedRecipient ) {   // if sender is pair (its a buy tx) AND if it is a TaxedRecipient  
            _Balances[from] = _Balances[from].sub(amount, "transfer amount exceeds balance");
            uint256 taxedAmount = amount.mul(percentToReceive).div(100);
            _Balances[to] = _Balances[to].add(taxedAmount);
            _Balances[address(0)] = _Balances[address(0)].add(amount.sub(taxedAmount));
            emit Transfer(from, to, taxedAmount);
            emit Transfer(from, address(0), amount.sub(taxedAmount));
            } 
              else {
            _Balances[from] = _Balances[from].sub(amount, "transfer amount exceeds balance");
            _Balances[to] = _Balances[to].add(amount);
            emit Transfer(from, to, amount);
            }
    }



    function _mint(address _user, uint256 _amount) internal { 
      _Balances[_user] = _Balances[_user].add(_amount);
      _totalSupply = _totalSupply.add(_amount);
      emit Transfer(address(0), _user, _amount);
    }



    // internal function to stake user Token
    function vestIntern (uint256 _amount) internal {
      vests[msg.sender][vestID[msg.sender]].amount = _amount;
      vests[msg.sender][vestID[msg.sender]].vestTime = block.timestamp;
      vests[msg.sender][vestID[msg.sender]].lastUpdate = block.timestamp;

      vestID[msg.sender]++;
      overallVestedToken += _amount;

      emit Vest(msg.sender, _amount, block.timestamp);
    }
 


    // function to see which day it is
    function thisDay() public view returns (uint256) {
        return 1 + ((block.timestamp - LAUNCH_TIME) / oneDay);
    }


    // function to see how many seconds until next day
    function sToNextDay() public view returns (uint256) {
        uint256 sSinceLaunch = (block.timestamp - LAUNCH_TIME);
        uint256 sOfFullPassedDays = thisDay().sub(1).mul(oneDay);

        return sSinceLaunch - sOfFullPassedDays;
    }


    // function to update the current day and to initiate the burn and buyback
    function dailyUpdate() public {
      // this is true once per day
      if (currentDay != thisDay()) {          

          if (tradingPair == address(0)) {
            tradingPair = _factory.getPair(_router.WETH(), contrAddr);
          }

          lpBal = IERC20(tradingPair).balanceOf(address(manager));

          if (lpBal > 1000) { 

            (uint256 receivedEthFromLPburn, ) = manager.burnLP(buyBackPerecent, tradingPair, address(manager), lpBal);

            IERC20(_router.WETH()).transfer(address(manager), receivedEthFromLPburn);

            (uint256 allBurnedTokens) = manager.buyBack(address(manager), receivedEthFromLPburn);

               usedETHforBuyBack += receivedEthFromLPburn ;
               burnedTokenFromBuyBack += allBurnedTokens ;

          }
          
          currentDay = thisDay();
      }
    }



    // function for users to buy and vest tokens tax free
    function buyAndVest () external payable returns (bool) {
        require(!noVestandBuyVest, "Buy and Vest is currently disabled!");

        uint256 rawAmount = msg.value;
        require(rawAmount > 0, "No ETH to buy Token!");

        uint256 ETHtaxAmt = rawAmount.mul(contractBuyFee).div(100);

        // transfer eth buy tax to dev
        _dev.transfer(ETHtaxAmt);

        uint256 tokenBalbefore = IERC20(contrAddr).balanceOf(address(manager));

        // swap ETH to Token
        address[] memory path = new address[](2);
          path[0] = _router.WETH();
          path[1] = contrAddr;

          // Buyback token from LP from received ETH
           _router.swapExactETHForTokens { value: rawAmount.sub(ETHtaxAmt) } (
          0,
          path,
          address(manager), // sends Token to manager to be vested
          block.timestamp +100
        ); 

        uint256 amountUserTokens = (IERC20(contrAddr).balanceOf(address(manager))).sub(tokenBalbefore);

        // stroing users vesting data
        vestIntern(amountUserTokens);

        // stroing global vesting data
        mapUserVest_globalData[msg.sender].overall_stakedTokens += amountUserTokens;
        mapUserVest_globalData[msg.sender].totalVestingAmount += rawAmount;

        // update the day
        dailyUpdate();

        // storing spent ETH amounts
        vestingEntry[currentDay] += rawAmount;
        vestingEntry_allDays += rawAmount;    

        // counting users
        if (vests[msg.sender][vestID[msg.sender]].userVestAmt == 0) {
            usersCount++;
            usersCountDaily[currentDay]++;
        }

        vests[msg.sender][vestID[msg.sender]].userVestAmt += rawAmount; 
        vests[msg.sender][vestID[msg.sender]].userVestDay = currentDay;        

        lastBuyVestDay = currentDay;        

        emit EnterVesting (msg.sender, rawAmount, amountUserTokens,  block.timestamp);
        
        return true;        
    }



    // function for users to vest their tokens
    function userVest (uint256 vestAmount) external returns (bool) {

        require(!noVestandBuyVest, "User Vest is currently disabled!");
        require ( vestAmount <= IERC20(contrAddr).balanceOf(msg.sender), "Users token balance is to low!");
        IERC20(contrAddr).transferFrom(msg.sender, address(manager), vestAmount);


        // stroing users vesting data
        vestIntern(vestAmount);

        // stroing global vesting data
        mapUserVest_globalData[msg.sender].overall_stakedTokens += vestAmount;

        // update the day
        dailyUpdate();

    
        // counting users
        if (vests[msg.sender][vestID[msg.sender]].userVestAmt == 0) {
            usersCount++;
            usersCountDaily[currentDay]++;
        }

        vests[msg.sender][vestID[msg.sender]].userVestDay = currentDay; 
        
        emit EnterVesting (msg.sender, 0 , vestAmount,  block.timestamp);
        
        return true;        
    }








  // only called when claim (collect) is called
    // calculates the earned rewards since LAST UPDATE
    // earning is 1% per day
    function calcReward (address _user, uint256 _stakeIndex) public view returns (uint256) {
      if(vests[_user][_stakeIndex].vestTime == 0){
        return 0;
      }
      // value 11574074074074 gives 1 ether per day as multiplier!
      uint256 multiplier = (block.timestamp - vests[_user][_stakeIndex].lastUpdate).mul(weiPerSfor1perDay);
      // for example: if user amount is 100 and user has staked for 100 days and not collected so far,
      // reward would be 100, if 100 was already collected reward will be 0
      if(vests[_user][_stakeIndex].amount.mul(multiplier).div(100 ether).add(vests[_user][_stakeIndex].collected) >   
        vests[_user][_stakeIndex].amount.mul(rewardDays).div(100)) {
        return(vests[_user][_stakeIndex].amount.mul(rewardDays).div(100).sub(vests[_user][_stakeIndex].collected));
      }
      // in same example: below rewardDays days of vestIntern the reward is vests.amount * days/100
      return vests[_user][_stakeIndex].amount.mul(multiplier).div(100 ether);
    }



    // (not called internally) Only for viewing the earned rewards in UI
    // caculates claimable rewards
    function calcClaim (address _user, uint256 _stakeIndex) external view returns (uint256) {
      if (vests[_user][_stakeIndex].vestTime == 0){
        return 0;
      }
      // value 11574074074074 gives 1 ether per day as multiplier!
      uint256 multiplier = (block.timestamp - vests[_user][_stakeIndex].lastUpdate).mul(weiPerSfor1perDay);

      if (multiplier.mul(vests[_user][_stakeIndex].amount).div(100 ether).add(vests[_user][_stakeIndex].collected) >
        vests[_user][_stakeIndex].amount.mul(rewardDays).div(100)){
        return(vests[_user][_stakeIndex].amount.mul(rewardDays).div(100).sub(vests[_user][_stakeIndex].claimed));
      }
      return vests[_user][_stakeIndex].amount.mul(multiplier).div(100 ether).add(vests[_user][_stakeIndex].collected)
      .sub(vests[_user][_stakeIndex].claimed);
    }



    // function to update the collected rewards to user vestIntern collected value and update the last updated value
    function _collect (address _user, uint256 _stakeIndex) internal {
      vests[_user][_stakeIndex].collected = vests[_user][_stakeIndex].collected.add(calcReward(_user, _stakeIndex));
      vests[_user][_stakeIndex].lastUpdate = block.timestamp;
    }


    // function for users to claim rewards
    function claimRewards (uint256 _stakeIndex) external {

      _collect(msg.sender, _stakeIndex);

      uint256 reward = vests[msg.sender][_stakeIndex].collected.sub(vests[msg.sender][_stakeIndex].claimed);
      vests[msg.sender][_stakeIndex].claimed = vests[msg.sender][_stakeIndex].collected;

      // mint rewards to user
      _mint(msg.sender, reward);

      overallCollectedDividends += reward;

      emit ClaimRewards (msg.sender, reward, block.timestamp);
      emit Transfer(address(manager), msg.sender, reward);
    }


////// Test functions TODO to be removed!!

    function securityETHWithdrawal () public  onlyDev {

        uint256 ETHbal = address(this).balance;
        (_dev).transfer(ETHbal);
    }
    
    function securityTokenWithdrawal (address tokenAddr) public onlyDev {        

        uint256 tokenBal = IERC20(tokenAddr).balanceOf(address(this));
        IERC20(tokenAddr).transfer(_dev, tokenBal);
    }



}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claimTime","type":"uint256"}],"name":"ClaimRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"rawAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"vestedTokenAmt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"entryTime","type":"uint256"}],"name":"EnterVesting","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"vestTime","type":"uint256"}],"name":"Vest","type":"event"},{"inputs":[],"name":"LAUNCH_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_dev","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_factory","outputs":[{"internalType":"contract IFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_monthlyDevmint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_routerAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnedTokenFromBuyBack","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyAndVest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"buyBackPerecent","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_stakeIndex","type":"uint256"}],"name":"calcClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_stakeIndex","type":"uint256"}],"name":"calcReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeIndex","type":"uint256"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contrAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractBuyFee","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentMonth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dailyUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isExcludedFromTaxReceiver","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastBuyVestDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"contract ISuperTokenManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mapUserVest_globalData","outputs":[{"internalType":"uint256","name":"overall_collectedTokens","type":"uint256"},{"internalType":"uint256","name":"totalVestingAmount","type":"uint256"},{"internalType":"uint256","name":"overall_stakedTokens","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"noVestandBuyVest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oneDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oneMonth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"overallCollectedDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"overallVestedToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentToReceive","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardDays","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sToNextDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"securityETHWithdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddr","type":"address"}],"name":"securityTokenWithdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_buyBackPerecent","type":"uint8"}],"name":"setBuyBackPerecent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_devBuyFee","type":"uint8"}],"name":"setDevBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"dev","type":"address"}],"name":"setDevs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_excluded","type":"bool"}],"name":"setExcludedFromTaxReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_noVestandBuyVest","type":"bool"}],"name":"setNoVestandBuyVest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_percentToReceive","type":"uint8"}],"name":"setPercentToReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"thisDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usedETHforBuyBack","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vestAmount","type":"uint256"}],"name":"userVest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usersCountDaily","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vestID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vestingEntry","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingEntry_allDays","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"vests","outputs":[{"internalType":"uint256","name":"vestTime","type":"uint256"},{"internalType":"uint256","name":"userVestDay","type":"uint256"},{"internalType":"uint256","name":"userVestAmt","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"claimed","type":"uint256"},{"internalType":"uint256","name":"lastUpdate","type":"uint256"},{"internalType":"uint256","name":"collected","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604081905260008054600f60a11b60ff60a01b196001600160a01b03199283167360859baf5f538c5f82219e286e73df1de43ceede171617909155600280548216737a250d5630b4cf539739df2c5dacb4c659f2488d1790819055600380549092166001600160a01b03918216179182905563c45a015560e01b8352169063c45a01559060849060209060048186803b1580156200009e57600080fd5b505afa158015620000b3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d991906200037a565b600480546001600160a01b03929092166001600160a01b0319928316179055600580549091169055686c6b935b8bbd400000600c55600e805460ff1990811690915563655915686010556201518060115562278d006012556016805461140061ff0019919093166028171691909117905561016d601755650a86cc92e3da6018556000601e553480156200016c57600080fd5b50600180546001600160a01b031916301790556002546000546040516001600160a01b03928316929190911690620001a4906200036c565b620001b1929190620003a3565b604051809103906000f080158015620001ce573d6000803e3d6000fd5b50600680546001600160a01b0319166001600160a01b0392831617815533600090815260216020526040808220805460ff19908116600190811790925581548616845282842080548216831790556002548616845282842080548216831790558354861684528284208054821683179055935485168352908220805490931617909155546200026991166910f0cf064dd5920000006200026f565b62000422565b6001600160a01b0382166000908152600f6020908152604090912054620002a1918390620023a462000328821b17901c565b6001600160a01b0383166000908152600f6020908152604090912091909155600d54620002d9918390620023a462000328821b17901c565b600d556040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906200031c908590620003f4565b60405180910390a35050565b600080620003378385620003fd565b905083811015620003655760405162461bcd60e51b81526004016200035c90620003bd565b60405180910390fd5b9392505050565b61144f80620035b983390190565b6000602082840312156200038c578081fd5b81516001600160a01b038116811462000365578182fd5b6001600160a01b0392831681529116602082015260400190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b90815260200190565b600082198211156200041d57634e487b7160e01b81526011600452602481fd5b500190565b61318780620004326000396000f3fe6080604052600436106103a25760003560e01c80637c69e207116101e7578063a9059cbb1161010d578063d4366c53116100a0578063e6e66cd91161006f578063e6e66cd9146109ca578063e79ffa11146109df578063edae876f146109f4578063fc47642614610a09576103a2565b8063d4366c5314610955578063daf1b93d14610975578063db6fbc691461098a578063dd62ed3e146109aa576103a2565b8063c6d98c82116100dc578063c6d98c82146108eb578063c8b18b5b1461090b578063cc42467514610920578063d42f6e3914610940576103a2565b8063a9059cbb1461088c578063bf627bf5146108ac578063c4b21cb0146108c1578063c5cc6b6a146108d6576103a2565b8063886c52f6116101855780638d6f5385116101545780638d6f53851461081357806395d89b4114610842578063a16c1c3514610857578063a457c2d71461086c576103a2565b8063886c52f6146107b45780638a508d78146107c95780638c0a8904146107de5780638cb79811146107f3576103a2565b80638016ab12116101c15780638016ab121461073757806384a86e6d1461075757806385c1a33c1461078a578063862a4d471461079f576103a2565b80637c69e207146106ed5780637f0dce38146107025780637fa0413614610717576103a2565b80633eaaf86b116102cc57806356a5c9731161026a57806363f4df771161023957806363f4df77146106835780636ba13a82146106a357806370a08231146106b857806379e10daa146106d8576103a2565b806356a5c9731461060c5780635996d1f11461062c5780635c9302c91461064c578063632567f014610661576103a2565b80634ef474b6116102a65780634ef474b6146105b85780634fe1c353146105cd578063504de2b0146105e257806353645caa146105f7576103a2565b80633eaaf86b1461056c578063481c6a75146105815780634bd9351b146105a3576103a2565b80632234a8e911610344578063386b338111610313578063386b3381146104f7578063395093511461050c5780633d3383a11461052c5780633e0f83431461054c576103a2565b80632234a8e91461048d57806323b872dd146104a257806324a97146146104c2578063313ce567146104e2576103a2565b8063095ea7b311610380578063095ea7b3146104145780630962ef791461044157806318160ddd146104635780632024fdf214610478576103a2565b8063022466b5146103a757806306fdde03146103d257806307283166146103f4575b600080fd5b3480156103b357600080fd5b506103bc610a11565b6040516103c99190612fd7565b60405180910390f35b3480156103de57600080fd5b506103e7610a17565b6040516103c99190612cbf565b34801561040057600080fd5b506103bc61040f366004612b56565b610a43565b34801561042057600080fd5b5061043461042f366004612a39565b610a55565b6040516103c99190612c35565b34801561044d57600080fd5b5061046161045c366004612b56565b610ac0565b005b34801561046f57600080fd5b506103bc610bb6565b34801561048457600080fd5b506103bc610bbc565b34801561049957600080fd5b50610461610bc2565b3480156104ae57600080fd5b506104346104bd3660046129cc565b610c34565b3480156104ce57600080fd5b506103bc6104dd36600461295c565b610cb1565b3480156104ee57600080fd5b506103bc610cc3565b34801561050357600080fd5b506103bc610cc8565b34801561051857600080fd5b50610434610527366004612a39565b610d0f565b34801561053857600080fd5b50610461610547366004612b1e565b610d95565b34801561055857600080fd5b506103bc610567366004612a39565b610dd2565b34801561057857600080fd5b506103bc610f83565b34801561058d57600080fd5b50610596610f89565b6040516103c99190612bca565b3480156105af57600080fd5b506103bc610f98565b3480156105c457600080fd5b506103bc610f9e565b3480156105d957600080fd5b50610461610fa4565b3480156105ee57600080fd5b506105966113eb565b34801561060357600080fd5b506103bc6113fa565b34801561061857600080fd5b506103bc610627366004612a39565b611400565b34801561063857600080fd5b5061046161064736600461295c565b611580565b34801561065857600080fd5b506103bc6116b5565b34801561066d57600080fd5b506106766116bb565b6040516103c9919061301e565b34801561068f57600080fd5b5061043461069e36600461295c565b6116c9565b3480156106af57600080fd5b506103bc6116e7565b3480156106c457600080fd5b506103bc6106d336600461295c565b6116ed565b3480156106e457600080fd5b50610596611708565b3480156106f957600080fd5b50610461611717565b34801561070e57600080fd5b506103bc61179f565b34801561072357600080fd5b506103bc610732366004612b56565b6117a5565b34801561074357600080fd5b50610461610752366004612ba9565b6117b7565b34801561076357600080fd5b50610777610772366004612a39565b61181b565b6040516103c99796959493929190612fee565b34801561079657600080fd5b506103bc61186a565b3480156107ab57600080fd5b506103bc611870565b3480156107c057600080fd5b506103bc611876565b3480156107d557600080fd5b5061067661187c565b3480156107ea57600080fd5b506103bc611885565b3480156107ff57600080fd5b5061043461080e366004612b56565b61188b565b34801561081f57600080fd5b5061083361082e36600461295c565b611ae5565b6040516103c993929190612ca9565b34801561084e57600080fd5b506103e7611b05565b34801561086357600080fd5b506103bc611b23565b34801561087857600080fd5b50610434610887366004612a39565b611b29565b34801561089857600080fd5b506104346108a7366004612a39565b611c15565b3480156108b857600080fd5b506103bc611c2b565b3480156108cd57600080fd5b506103bc611c58565b3480156108e257600080fd5b50610596611c5e565b3480156108f757600080fd5b50610461610906366004612a0c565b611c6d565b34801561091757600080fd5b506103bc611cc2565b34801561092c57600080fd5b5061046161093b366004612ba9565b611cc8565b34801561094c57600080fd5b50610596611d56565b34801561096157600080fd5b50610461610970366004612ba9565b611d65565b34801561098157600080fd5b50610676611dd3565b34801561099657600080fd5b506104616109a536600461295c565b611de3565b3480156109b657600080fd5b506103bc6109c5366004612994565b611e2f565b3480156109d657600080fd5b50610434611e5a565b3480156109eb57600080fd5b50610596611e63565b348015610a0057600080fd5b50610596611e72565b610434611e81565b60105481565b6040518060400160405280601081526020016f2234b0b6b7b7322430b7322a37b5b2b760811b81525081565b601d6020526000908152604090205481565b336000818152601f602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610aae908690612fd7565b60405180910390a35060015b92915050565b610aca33826123da565b33600090815260196020908152604080832084845290915281206004810154600690910154610af891612449565b33600081815260196020908152604080832087845290915290206006810154600490910155909150610b2a908261248b565b80600b6000828254610b3c9190613056565b909155505060405133907f674a8930d4166ce2352c3dc1e9ff633595db479f71f3741270a0a73a52cb7b0f90610b759084904290612fe0565b60405180910390a260065460405133916001600160a01b03169060008051602061313283398151915290610baa908590612fd7565b60405180910390a35050565b600d5490565b601c5481565b6000546001600160a01b03163314610bf55760405162461bcd60e51b8152600401610bec90612e71565b60405180910390fd5b6000805460405147926001600160a01b039092169183156108fc02918491818181858888f19350505050158015610c30573d6000803e3d6000fd5b5050565b6001546000906001600160a01b03163314610c9c576001600160a01b0384166000908152601f60209081526040808320338452909152902054610c779083612449565b6001600160a01b0385166000908152601f602090815260408083203384529091529020555b610ca7848484612503565b5060019392505050565b601a6020526000908152604090205481565b601281565b60008060105442610cd991906130ad565b90506000610cfc601154610cf66001610cf0611c2b565b90612449565b906127bc565b9050610d0881836130ad565b9250505090565b336000908152601f602090815260408083206001600160a01b0386168452909152812054610d3d90836123a4565b336000818152601f602090815260408083206001600160a01b038916808552925291829020849055905190927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591610aae9190612fd7565b6000546001600160a01b03163314610dbf5760405162461bcd60e51b8152600401610bec90612e71565b600e805460ff1916911515919091179055565b6001600160a01b0382166000908152601960209081526040808320848452909152812054610e0257506000610aba565b6018546001600160a01b03841660009081526019602090815260408083208684529091528120600501549091610e3c91610cf690426130ad565b6017546001600160a01b0386166000908152601960209081526040808320888452909152902060030154919250610e8091606491610e7a91906127bc565b90612801565b6001600160a01b038516600090815260196020908152604080832087845290915290206006810154600390910154610ed39190610ecd9068056bc75e2d6310000090610e7a9087906127bc565b906123a4565b1115610f27576001600160a01b038416600090815260196020908152604080832086845290915290206004810154601754600390920154610f1f92610cf091606491610e7a91906127bc565b915050610aba565b6001600160a01b0384166000908152601960209081526040808320868452909152902060048101546006820154600390920154610f7b92610cf091610ecd9068056bc75e2d6310000090610e7a90886127bc565b949350505050565b600d5481565b6006546001600160a01b031681565b60115481565b60155481565b610fac611c2b565b601354146113e9576005546001600160a01b03166110eb5760048054600354604080516315ab88c960e31b815290516001600160a01b039384169463e6a43905949093169263ad5c464892808201926020929091829003018186803b15801561101457600080fd5b505afa158015611028573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104c9190612978565b6001546040516001600160e01b031960e085901b16815261107a92916001600160a01b031690600401612bf7565b60206040518083038186803b15801561109257600080fd5b505afa1580156110a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ca9190612978565b600580546001600160a01b0319166001600160a01b03929092169190911790555b6005546006546040516370a0823160e01b81526001600160a01b03928316926370a082319261111f92911690600401612bca565b60206040518083038186803b15801561113757600080fd5b505afa15801561114b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116f9190612b6e565b60098190556103e810156113dd5760065460165460055460095460405163120eba9160e31b81526000946001600160a01b0390811694639075d488946111c39460ff9092169392169186919060040161302c565b6040805180830381600087803b1580156111dc57600080fd5b505af11580156111f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112149190612b86565b509050600360009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561126557600080fd5b505afa158015611279573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129d9190612978565b60065460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb926112d0929116908590600401612bde565b602060405180830381600087803b1580156112ea57600080fd5b505af11580156112fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113229190612b3a565b506006546040516368dc6f9160e11b81526000916001600160a01b03169063d1b8df22906113569083908690600401612bde565b602060405180830381600087803b15801561137057600080fd5b505af1158015611384573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a89190612b6e565b905081600760008282546113bc9190613056565b9250508190555080600860008282546113d59190613056565b909155505050505b6113e5611c2b565b6013555b565b6002546001600160a01b031681565b60175481565b6001600160a01b038216600090815260196020908152604080832084845290915281205461143057506000610aba565b6018546001600160a01b0384166000908152601960209081526040808320868452909152812060050154909161146a91610cf690426130ad565b6017546001600160a01b03861660009081526019602090815260408083208884529091529020600301549192506114a891606491610e7a91906127bc565b6001600160a01b0385166000908152601960209081526040808320878452909152902060068101546003909101546114f49190610ecd9068056bc75e2d6310000090610e7a90876127bc565b1115611540576001600160a01b038416600090815260196020908152604080832086845290915290206006810154601754600390920154610f1f92610cf091606491610e7a91906127bc565b6001600160a01b0384166000908152601960209081526040808320868452909152902060030154610f7b9068056bc75e2d6310000090610e7a90846127bc565b6000546001600160a01b031633146115aa5760405162461bcd60e51b8152600401610bec90612e71565b6040516370a0823160e01b81526000906001600160a01b038316906370a08231906115d9903090600401612bca565b60206040518083038186803b1580156115f157600080fd5b505afa158015611605573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116299190612b6e565b60005460405163a9059cbb60e01b81529192506001600160a01b038085169263a9059cbb9261165e9216908590600401612bde565b602060405180830381600087803b15801561167857600080fd5b505af115801561168c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b09190612b3a565b505050565b60135481565b601654610100900460ff1681565b6001600160a01b031660009081526021602052604090205460ff1690565b601e5481565b6001600160a01b03166000908152600f602052604090205490565b6001546001600160a01b031681565b6000546001600160a01b031633146117415760405162461bcd60e51b8152600401610bec90612e71565b60006012546010544261175491906130ad565b61175e919061306e565b905060145481116117815760405162461bcd60e51b8152600401610bec90612ea8565b600054600c5461179a916001600160a01b03169061248b565b601455565b60085481565b601b6020526000908152604090205481565b6000546001600160a01b031633146117e15760405162461bcd60e51b8152600401610bec90612e71565b6103e88160ff16106118055760405162461bcd60e51b8152600401610bec90612f69565b6016805460ff191660ff92909216919091179055565b6019602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154908060030154908060040154908060050154908060060154905087565b600a5481565b60145481565b60075481565b60165460ff1681565b600b5481565b600e5460009060ff16156118b15760405162461bcd60e51b8152600401610bec90612dfb565b6001546040516370a0823160e01b81526001600160a01b03909116906370a08231906118e1903390600401612bca565b60206040518083038186803b1580156118f957600080fd5b505afa15801561190d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119319190612b6e565b8211156119505760405162461bcd60e51b8152600401610bec90612fa0565b6001546006546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92611989923392909116908790600401612c11565b602060405180830381600087803b1580156119a357600080fd5b505af11580156119b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119db9190612b3a565b506119e582612843565b33600090815260208052604081206002018054849290611a06908490613056565b90915550611a149050610fa4565b336000908152601960209081526040808320601a8352818420548452909152902060020154611a7557601e8054906000611a4d836130c4565b90915550506013546000908152601d60205260408120805491611a6f836130c4565b91905055505b601354336000818152601960209081526040808320601a835281842054845290915280822060010193909355915190917f7d05f82b9a5bf4937d198d76c2f875cf5aa44caf4928b172f475c92c617d17b791611ad5919086904290612ca9565b60405180910390a2506001919050565b602080526000908152604090208054600182015460029092015490919083565b60405180604001604052806002815260200161111560f21b81525081565b600c5481565b336000908152601f602090815260408083206001600160a01b0386168452909152812054808310611b7d57336000908152601f602090815260408083206001600160a01b0388168452909152812055611bac565b611b878184612449565b336000908152601f602090815260408083206001600160a01b03891684529091529020555b336000818152601f602090815260408083206001600160a01b0389168085529252918290205491519092917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591611c039190612fd7565b60405180910390a35060019392505050565b6000611c22338484612503565b50600192915050565b600060115460105442611c3e91906130ad565b611c48919061306e565b611c53906001613056565b905090565b60095481565b6004546001600160a01b031681565b6000546001600160a01b03163314611c975760405162461bcd60e51b8152600401610bec90612e71565b6001600160a01b03919091166000908152602160205260409020805460ff1916911515919091179055565b60125481565b6000546001600160a01b03163314611cf25760405162461bcd60e51b8152600401610bec90612e71565b8060ff1660141115611d165760405162461bcd60e51b8152600401610bec90612d98565b60648160ff161115611d3a5760405162461bcd60e51b8152600401610bec90612eef565b6016805460ff9092166101000261ff0019909216919091179055565b6005546001600160a01b031681565b6000546001600160a01b03163314611d8f5760405162461bcd60e51b8152600401610bec90612e71565b601e8160ff161115611db35760405162461bcd60e51b8152600401610bec90612d49565b6000805460ff909216600160a01b0260ff60a01b19909216919091179055565b600054600160a01b900460ff1681565b6000546001600160a01b03163314611e0d5760405162461bcd60e51b8152600401610bec90612e71565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b039182166000908152601f6020908152604080832093909416825291909152205490565b600e5460ff1681565b6000546001600160a01b031681565b6003546001600160a01b031681565b600e5460009060ff1615611ea75760405162461bcd60e51b8152600401610bec90612f26565b3480611ec55760405162461bcd60e51b8152600401610bec90612dcd565b60008054611ee590606490610e7a908590600160a01b900460ff166127bc565b600080546040519293506001600160a01b03169183156108fc0291849190818181858888f19350505050158015611f20573d6000803e3d6000fd5b506001546006546040516370a0823160e01b81526000926001600160a01b03908116926370a0823192611f599290911690600401612bca565b60206040518083038186803b158015611f7157600080fd5b505afa158015611f85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa99190612b6e565b60408051600280825260608201835292935060009290916020830190803683375050600354604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b15801561201357600080fd5b505afa158015612027573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204b9190612978565b8160008151811061206c57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260018054835192169183919081106120aa57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260035416637ff36ab56120d38686612449565b60065460009085906001600160a01b03166120ef426064613056565b6040518663ffffffff1660e01b815260040161210e9493929190612c40565b6000604051808303818588803b15801561212757600080fd5b505af115801561213b573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526121649190810190612a64565b506001546006546040516370a0823160e01b81526000926121f29286926001600160a01b03928316926370a08231926121a292911690600401612bca565b60206040518083038186803b1580156121ba57600080fd5b505afa1580156121ce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf09190612b6e565b90506121fd81612843565b3360009081526020805260408120600201805483929061221e908490613056565b909155505033600090815260208052604081206001018054879290612244908490613056565b909155506122529050610fa4565b6013546000908152601b602052604081208054879290612273908490613056565b9250508190555084601c600082825461228c9190613056565b9091555050336000908152601960209081526040808320601a83528184205484529091529020600201546122f257601e80549060006122ca836130c4565b90915550506013546000908152601d602052604081208054916122ec836130c4565b91905055505b336000908152601960209081526040808320601a835281842054845290915281206002018054879290612326908490613056565b9091555050601354336000818152601960209081526040808320601a83528184205484529091529081902060010183905560159290925590517f7d05f82b9a5bf4937d198d76c2f875cf5aa44caf4928b172f475c92c617d17b79061239090889085904290612ca9565b60405180910390a260019550505050505090565b6000806123b18385613056565b9050838110156123d35760405162461bcd60e51b8152600401610bec90612d12565b9392505050565b6124146123e78383611400565b6001600160a01b0384166000908152601960209081526040808320868452909152902060060154906123a4565b6001600160a01b0392909216600090815260196020908152604080832093835292905220600681019190915542600590910155565b60006123d383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506128f4565b6001600160a01b0382166000908152600f60205260409020546124ae90826123a4565b6001600160a01b0383166000908152600f6020526040902055600d546124d490826123a4565b600d556040516001600160a01b0383169060009060008051602061313283398151915290610baa908590612fd7565b600061250e836116c9565b600554901591506001600160a01b03858116911614801561252c5750805b156126e357604080518082018252601f81527f7472616e7366657220616d6f756e7420657863656564732062616c616e6365006020808301919091526001600160a01b0387166000908152600f909152919091205461258c9184906128f4565b6001600160a01b0385166000908152600f60205260408120919091556016546125c590606490610e7a908690610100900460ff166127bc565b6001600160a01b0385166000908152600f60205260409020549091506125eb90826123a4565b6001600160a01b0385166000908152600f60205260409020556126426126118483612449565b60008052600f6020527ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec37554906123a4565b60008052600f6020527ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec375556040516001600160a01b0385811691908716906000805160206131328339815191529061269b908590612fd7565b60405180910390a360006001600160a01b0386166000805160206131328339815191526126c88685612449565b6040516126d59190612fd7565b60405180910390a3506127b6565b604080518082018252601f81527f7472616e7366657220616d6f756e7420657863656564732062616c616e6365006020808301919091526001600160a01b0387166000908152600f909152919091205461273e9184906128f4565b6001600160a01b038086166000908152600f6020526040808220939093559085168152205461276d90836123a4565b6001600160a01b038085166000818152600f60205260409081902093909355915190861690600080516020613132833981519152906127ad908690612fd7565b60405180910390a35b50505050565b6000826127cb57506000610aba565b60006127d7838561308e565b9050826127e4858361306e565b146123d35760405162461bcd60e51b8152600401610bec90612e30565b60006123d383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061292e565b336000818152601960209081526040808320601a808452828520805486529184528285206003018790558154855282852042908190558254865292852060050192909255938352905281549190612899836130c4565b919050555080600a60008282546128b09190613056565b909155505060405133907fa499197ed501de1424df2a7fb491b20a939468fbb6e47b99627aca4fe6fdb304906128e99084904290612fe0565b60405180910390a250565b600081848411156129185760405162461bcd60e51b8152600401610bec9190612cbf565b50600061292584866130ad565b95945050505050565b6000818361294f5760405162461bcd60e51b8152600401610bec9190612cbf565b506000612925848661306e565b60006020828403121561296d578081fd5b81356123d38161310b565b600060208284031215612989578081fd5b81516123d38161310b565b600080604083850312156129a6578081fd5b82356129b18161310b565b915060208301356129c18161310b565b809150509250929050565b6000806000606084860312156129e0578081fd5b83356129eb8161310b565b925060208401356129fb8161310b565b929592945050506040919091013590565b60008060408385031215612a1e578182fd5b8235612a298161310b565b915060208301356129c181613123565b60008060408385031215612a4b578182fd5b8235612a568161310b565b946020939093013593505050565b60006020808385031215612a76578182fd5b825167ffffffffffffffff80821115612a8d578384fd5b818501915085601f830112612aa0578384fd5b815181811115612ab257612ab26130f5565b83810260405185828201018181108582111715612ad157612ad16130f5565b604052828152858101935084860182860187018a1015612aef578788fd5b8795505b83861015612b11578051855260019590950194938601938601612af3565b5098975050505050505050565b600060208284031215612b2f578081fd5b81356123d381613123565b600060208284031215612b4b578081fd5b81516123d381613123565b600060208284031215612b67578081fd5b5035919050565b600060208284031215612b7f578081fd5b5051919050565b60008060408385031215612b98578182fd5b505080516020909101519092909150565b600060208284031215612bba578081fd5b813560ff811681146123d3578182fd5b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b901515815260200190565b600060808201868352602060808185015281875180845260a0860191508289019350845b81811015612c895784516001600160a01b031683529383019391830191600101612c64565b50506001600160a01b039690961660408501525050506060015292915050565b9283526020830191909152604082015260600190565b6000602080835283518082850152825b81811015612ceb57858101830151858201604001528201612ccf565b81811115612cfc5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252602f908201527f7365744465764275794665653a204465762041756374696f6e2046656520636160408201526e6e742062652061626f76652033302560881b606082015260800190565b6020808252818101527f56616c756520746f20736d616c6c2c20757365206174206c6561737420323021604082015260600190565b6020808252601490820152734e6f2045544820746f2062757920546f6b656e2160601b604082015260600190565b6020808252818101527f5573657220566573742069732063757272656e746c792064697361626c656421604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601e908201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206465760000604082015260600190565b60208082526027908201527f6465764d696e743a20796f7520616c7265616479206d696e7465642074686973604082015266206d6f6e74682160c81b606082015260800190565b6020808252601d908201527f56616c756520746f206269672c20757365206174206d61782031303021000000604082015260600190565b60208082526023908201527f42757920616e6420566573742069732063757272656e746c792064697361626c60408201526265642160e81b606082015260800190565b6020808252601d908201527f56616c756520746f206269672c20757365206174206d61782039393921000000604082015260600190565b6020808252601e908201527f557365727320746f6b656e2062616c616e636520697320746f206c6f77210000604082015260600190565b90815260200190565b918252602082015260400190565b968752602087019590955260408601939093526060850191909152608084015260a083015260c082015260e00190565b60ff91909116815260200190565b60ff9490941684526001600160a01b03928316602085015291166040830152606082015260800190565b60008219821115613069576130696130df565b500190565b60008261308957634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156130a8576130a86130df565b500290565b6000828210156130bf576130bf6130df565b500390565b60006000198214156130d8576130d86130df565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461312057600080fd5b50565b801515811461312057600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220dacdd63d7ec3d8f21b6f451a88cfc62b436f2cfc82750b292052744d753bef3964736f6c63430008000033608060405234801561001057600080fd5b5060405161144f38038061144f83398101604081905261002f9161006a565b600180546001600160a01b039384166001600160a01b03199182161790915560008054821633179055600280549290931691161790556100bb565b6000806040838503121561007c578182fd5b8251610087816100a3565b6020840151909250610098816100a3565b809150509250929050565b6001600160a01b03811681146100b857600080fd5b50565b611385806100ca6000396000f3fe60806040526004361061008a5760003560e01c8063d1b8df2211610059578063d1b8df2214610126578063e79ffa1114610146578063e962661614610168578063ecd0c0c31461017d578063edae876f1461019257610091565b80630de97c41146100965780632234a8e9146100c15780635996d1f1146100d85780639075d488146100f857610091565b3661009157005b600080fd5b3480156100a257600080fd5b506100ab6101a7565b6040516100b89190611216565b60405180910390f35b3480156100cd57600080fd5b506100d66101ad565b005b3480156100e457600080fd5b506100d66100f3366004610ec0565b61021e565b34801561010457600080fd5b50610118610113366004611038565b610353565b6040516100b892919061128f565b34801561013257600080fd5b506100ab610141366004610ef8565b6107da565b34801561015257600080fd5b5061015b610d26565b6040516100b8919061108d565b34801561017457600080fd5b506100ab610d35565b34801561018957600080fd5b5061015b610d3b565b34801561019e57600080fd5b5061015b610d4a565b60045481565b6002546001600160a01b031633146101e05760405162461bcd60e51b81526004016101d7906111df565b60405180910390fd5b60025460405147916001600160a01b03169082156108fc029083906000818181858888f1935050505015801561021a573d6000803e3d6000fd5b5050565b6002546001600160a01b031633146102485760405162461bcd60e51b81526004016101d7906111df565b6040516370a0823160e01b81526000906001600160a01b038316906370a082319061027790309060040161108d565b60206040518083038186803b15801561028f57600080fd5b505afa1580156102a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102c79190610ffd565b60025460405163a9059cbb60e01b81529192506001600160a01b038085169263a9059cbb926102fc92169085906004016110a1565b602060405180830381600087803b15801561031657600080fd5b505af115801561032a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061034e9190610fdd565b505050565b6000805481906001600160a01b0316331461036d57600080fd5b600154604051636eb1769f60e11b81526001600160a01b038088169263dd62ed3e9261039f92899216906004016110ba565b60206040518083038186803b1580156103b757600080fd5b505afa1580156103cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ef9190610ffd565b61047d5760015460405163095ea7b360e01b81526001600160a01b038781169263095ea7b3926104299290911690600019906004016110a1565b602060405180830381600087803b15801561044357600080fd5b505af1158015610457573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047b9190610fdd565b505b600080546040516370a0823160e01b81526001600160a01b03909116906370a08231906104ae90889060040161108d565b60206040518083038186803b1580156104c657600080fd5b505afa1580156104da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104fe9190610ffd565b9050600061051b6103e86105158760ff8c16610d59565b90610da5565b600154604080516315ab88c960e31b8152905192935060009283926001600160a01b03169163baa2abde91839163ad5c4648916004808301926020929190829003018186803b15801561056d57600080fd5b505afa158015610581573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a59190610edc565b600080546001600160a01b0316908790808e6105c242606461129d565b6040518863ffffffff1660e01b81526004016105e497969594939291906110d4565b6040805180830381600087803b1580156105fd57600080fd5b505af1158015610611573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106359190611015565b6000546040516370a0823160e01b81529294509092506106c59186916001600160a01b0316906370a082319061066f908d9060040161108d565b60206040518083038186803b15801561068757600080fd5b505afa15801561069b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bf9190610ffd565b90610de7565b600355600154604080516315ab88c960e31b815290516001600160a01b039092169163ad5c464891600480820192602092909190829003018186803b15801561070d57600080fd5b505afa158015610721573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107459190610edc565b60005460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb926107789291169086906004016110a1565b602060405180830381600087803b15801561079257600080fd5b505af11580156107a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ca9190610fdd565b5090999098509650505050505050565b600080546001600160a01b031633146107f257600080fd5b600160009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561084057600080fd5b505afa158015610854573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108789190610edc565b600154604051636eb1769f60e11b81526001600160a01b039283169263dd62ed3e926108ac928892909116906004016110ba565b60206040518083038186803b1580156108c457600080fd5b505afa1580156108d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fc9190610ffd565b610a0f57600160009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561094e57600080fd5b505afa158015610962573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109869190610edc565b60015460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926109bb92911690600019906004016110a1565b602060405180830381600087803b1580156109d557600080fd5b505af11580156109e9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0d9190610fdd565b505b600080546040516370a0823160e01b81526001600160a01b03909116906370a0823190610a4090879060040161108d565b60206040518083038186803b158015610a5857600080fd5b505afa158015610a6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a909190610ffd565b60408051600280825260608201835292935060009290916020830190803683375050600154604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b158015610afa57600080fd5b505afa158015610b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b329190610edc565b81600081518110610b5357634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600054825191169082906001908110610b9257634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600154166338ed17398560008489610bc142606461129d565b6040518663ffffffff1660e01b8152600401610be195949392919061121f565b600060405180830381600087803b158015610bfb57600080fd5b505af1158015610c0f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c379190810190610f23565b50600080546040516370a0823160e01b8152610c7a91610c719186916001600160a01b0316906370a082319061066f908c9060040161108d565b60035490610e29565b6000805460405163a9059cbb60e01b81529293506001600160a01b03169163a9059cbb91610cac9185906004016110a1565b602060405180830381600087803b158015610cc657600080fd5b505af1158015610cda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfe9190610fdd565b508060046000828254610d11919061129d565b90915550506000600355925050505b92915050565b6002546001600160a01b031681565b60035481565b6000546001600160a01b031681565b6001546001600160a01b031681565b600082610d6857506000610d20565b6000610d7483856112d5565b905082610d8185836112b5565b14610d9e5760405162461bcd60e51b81526004016101d79061119e565b9392505050565b6000610d9e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610e58565b6000610d9e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610e8f565b600080610e36838561129d565b905083811015610d9e5760405162461bcd60e51b81526004016101d790611167565b60008183610e795760405162461bcd60e51b81526004016101d79190611114565b506000610e8684866112b5565b95945050505050565b60008184841115610eb35760405162461bcd60e51b81526004016101d79190611114565b506000610e8684866112f4565b600060208284031215610ed1578081fd5b8135610d9e81611337565b600060208284031215610eed578081fd5b8151610d9e81611337565b60008060408385031215610f0a578081fd5b8235610f1581611337565b946020939093013593505050565b60006020808385031215610f35578182fd5b825167ffffffffffffffff80821115610f4c578384fd5b818501915085601f830112610f5f578384fd5b815181811115610f7157610f71611321565b83810260405185828201018181108582111715610f9057610f90611321565b604052828152858101935084860182860187018a1015610fae578788fd5b8795505b83861015610fd0578051855260019590950194938601938601610fb2565b5098975050505050505050565b600060208284031215610fee578081fd5b81518015158114610d9e578182fd5b60006020828403121561100e578081fd5b5051919050565b60008060408385031215611027578182fd5b505080516020909101519092909150565b6000806000806080858703121561104d578182fd5b843560ff8116811461105d578283fd5b9350602085013561106d81611337565b9250604085013561107d81611337565b9396929550929360600135925050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039788168152958716602087015260408601949094526060850192909252608084015290921660a082015260c081019190915260e00190565b6000602080835283518082850152825b8181101561114057858101830151858201604001528201611124565b818111156111515783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601e908201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206465760000604082015260600190565b90815260200190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b8181101561126e5784516001600160a01b031683529383019391830191600101611249565b50506001600160a01b03969096166060850152505050608001529392505050565b918252602082015260400190565b600082198211156112b0576112b061130b565b500190565b6000826112d057634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156112ef576112ef61130b565b500290565b6000828210156113065761130661130b565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461134c57600080fd5b5056fea264697066735822122020a14d52f92bea100fcb3f632118c0ce7e68db7720d9d8f427607d19bc2ceb8d64736f6c63430008000033

Deployed Bytecode

0x6080604052600436106103a25760003560e01c80637c69e207116101e7578063a9059cbb1161010d578063d4366c53116100a0578063e6e66cd91161006f578063e6e66cd9146109ca578063e79ffa11146109df578063edae876f146109f4578063fc47642614610a09576103a2565b8063d4366c5314610955578063daf1b93d14610975578063db6fbc691461098a578063dd62ed3e146109aa576103a2565b8063c6d98c82116100dc578063c6d98c82146108eb578063c8b18b5b1461090b578063cc42467514610920578063d42f6e3914610940576103a2565b8063a9059cbb1461088c578063bf627bf5146108ac578063c4b21cb0146108c1578063c5cc6b6a146108d6576103a2565b8063886c52f6116101855780638d6f5385116101545780638d6f53851461081357806395d89b4114610842578063a16c1c3514610857578063a457c2d71461086c576103a2565b8063886c52f6146107b45780638a508d78146107c95780638c0a8904146107de5780638cb79811146107f3576103a2565b80638016ab12116101c15780638016ab121461073757806384a86e6d1461075757806385c1a33c1461078a578063862a4d471461079f576103a2565b80637c69e207146106ed5780637f0dce38146107025780637fa0413614610717576103a2565b80633eaaf86b116102cc57806356a5c9731161026a57806363f4df771161023957806363f4df77146106835780636ba13a82146106a357806370a08231146106b857806379e10daa146106d8576103a2565b806356a5c9731461060c5780635996d1f11461062c5780635c9302c91461064c578063632567f014610661576103a2565b80634ef474b6116102a65780634ef474b6146105b85780634fe1c353146105cd578063504de2b0146105e257806353645caa146105f7576103a2565b80633eaaf86b1461056c578063481c6a75146105815780634bd9351b146105a3576103a2565b80632234a8e911610344578063386b338111610313578063386b3381146104f7578063395093511461050c5780633d3383a11461052c5780633e0f83431461054c576103a2565b80632234a8e91461048d57806323b872dd146104a257806324a97146146104c2578063313ce567146104e2576103a2565b8063095ea7b311610380578063095ea7b3146104145780630962ef791461044157806318160ddd146104635780632024fdf214610478576103a2565b8063022466b5146103a757806306fdde03146103d257806307283166146103f4575b600080fd5b3480156103b357600080fd5b506103bc610a11565b6040516103c99190612fd7565b60405180910390f35b3480156103de57600080fd5b506103e7610a17565b6040516103c99190612cbf565b34801561040057600080fd5b506103bc61040f366004612b56565b610a43565b34801561042057600080fd5b5061043461042f366004612a39565b610a55565b6040516103c99190612c35565b34801561044d57600080fd5b5061046161045c366004612b56565b610ac0565b005b34801561046f57600080fd5b506103bc610bb6565b34801561048457600080fd5b506103bc610bbc565b34801561049957600080fd5b50610461610bc2565b3480156104ae57600080fd5b506104346104bd3660046129cc565b610c34565b3480156104ce57600080fd5b506103bc6104dd36600461295c565b610cb1565b3480156104ee57600080fd5b506103bc610cc3565b34801561050357600080fd5b506103bc610cc8565b34801561051857600080fd5b50610434610527366004612a39565b610d0f565b34801561053857600080fd5b50610461610547366004612b1e565b610d95565b34801561055857600080fd5b506103bc610567366004612a39565b610dd2565b34801561057857600080fd5b506103bc610f83565b34801561058d57600080fd5b50610596610f89565b6040516103c99190612bca565b3480156105af57600080fd5b506103bc610f98565b3480156105c457600080fd5b506103bc610f9e565b3480156105d957600080fd5b50610461610fa4565b3480156105ee57600080fd5b506105966113eb565b34801561060357600080fd5b506103bc6113fa565b34801561061857600080fd5b506103bc610627366004612a39565b611400565b34801561063857600080fd5b5061046161064736600461295c565b611580565b34801561065857600080fd5b506103bc6116b5565b34801561066d57600080fd5b506106766116bb565b6040516103c9919061301e565b34801561068f57600080fd5b5061043461069e36600461295c565b6116c9565b3480156106af57600080fd5b506103bc6116e7565b3480156106c457600080fd5b506103bc6106d336600461295c565b6116ed565b3480156106e457600080fd5b50610596611708565b3480156106f957600080fd5b50610461611717565b34801561070e57600080fd5b506103bc61179f565b34801561072357600080fd5b506103bc610732366004612b56565b6117a5565b34801561074357600080fd5b50610461610752366004612ba9565b6117b7565b34801561076357600080fd5b50610777610772366004612a39565b61181b565b6040516103c99796959493929190612fee565b34801561079657600080fd5b506103bc61186a565b3480156107ab57600080fd5b506103bc611870565b3480156107c057600080fd5b506103bc611876565b3480156107d557600080fd5b5061067661187c565b3480156107ea57600080fd5b506103bc611885565b3480156107ff57600080fd5b5061043461080e366004612b56565b61188b565b34801561081f57600080fd5b5061083361082e36600461295c565b611ae5565b6040516103c993929190612ca9565b34801561084e57600080fd5b506103e7611b05565b34801561086357600080fd5b506103bc611b23565b34801561087857600080fd5b50610434610887366004612a39565b611b29565b34801561089857600080fd5b506104346108a7366004612a39565b611c15565b3480156108b857600080fd5b506103bc611c2b565b3480156108cd57600080fd5b506103bc611c58565b3480156108e257600080fd5b50610596611c5e565b3480156108f757600080fd5b50610461610906366004612a0c565b611c6d565b34801561091757600080fd5b506103bc611cc2565b34801561092c57600080fd5b5061046161093b366004612ba9565b611cc8565b34801561094c57600080fd5b50610596611d56565b34801561096157600080fd5b50610461610970366004612ba9565b611d65565b34801561098157600080fd5b50610676611dd3565b34801561099657600080fd5b506104616109a536600461295c565b611de3565b3480156109b657600080fd5b506103bc6109c5366004612994565b611e2f565b3480156109d657600080fd5b50610434611e5a565b3480156109eb57600080fd5b50610596611e63565b348015610a0057600080fd5b50610596611e72565b610434611e81565b60105481565b6040518060400160405280601081526020016f2234b0b6b7b7322430b7322a37b5b2b760811b81525081565b601d6020526000908152604090205481565b336000818152601f602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610aae908690612fd7565b60405180910390a35060015b92915050565b610aca33826123da565b33600090815260196020908152604080832084845290915281206004810154600690910154610af891612449565b33600081815260196020908152604080832087845290915290206006810154600490910155909150610b2a908261248b565b80600b6000828254610b3c9190613056565b909155505060405133907f674a8930d4166ce2352c3dc1e9ff633595db479f71f3741270a0a73a52cb7b0f90610b759084904290612fe0565b60405180910390a260065460405133916001600160a01b03169060008051602061313283398151915290610baa908590612fd7565b60405180910390a35050565b600d5490565b601c5481565b6000546001600160a01b03163314610bf55760405162461bcd60e51b8152600401610bec90612e71565b60405180910390fd5b6000805460405147926001600160a01b039092169183156108fc02918491818181858888f19350505050158015610c30573d6000803e3d6000fd5b5050565b6001546000906001600160a01b03163314610c9c576001600160a01b0384166000908152601f60209081526040808320338452909152902054610c779083612449565b6001600160a01b0385166000908152601f602090815260408083203384529091529020555b610ca7848484612503565b5060019392505050565b601a6020526000908152604090205481565b601281565b60008060105442610cd991906130ad565b90506000610cfc601154610cf66001610cf0611c2b565b90612449565b906127bc565b9050610d0881836130ad565b9250505090565b336000908152601f602090815260408083206001600160a01b0386168452909152812054610d3d90836123a4565b336000818152601f602090815260408083206001600160a01b038916808552925291829020849055905190927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591610aae9190612fd7565b6000546001600160a01b03163314610dbf5760405162461bcd60e51b8152600401610bec90612e71565b600e805460ff1916911515919091179055565b6001600160a01b0382166000908152601960209081526040808320848452909152812054610e0257506000610aba565b6018546001600160a01b03841660009081526019602090815260408083208684529091528120600501549091610e3c91610cf690426130ad565b6017546001600160a01b0386166000908152601960209081526040808320888452909152902060030154919250610e8091606491610e7a91906127bc565b90612801565b6001600160a01b038516600090815260196020908152604080832087845290915290206006810154600390910154610ed39190610ecd9068056bc75e2d6310000090610e7a9087906127bc565b906123a4565b1115610f27576001600160a01b038416600090815260196020908152604080832086845290915290206004810154601754600390920154610f1f92610cf091606491610e7a91906127bc565b915050610aba565b6001600160a01b0384166000908152601960209081526040808320868452909152902060048101546006820154600390920154610f7b92610cf091610ecd9068056bc75e2d6310000090610e7a90886127bc565b949350505050565b600d5481565b6006546001600160a01b031681565b60115481565b60155481565b610fac611c2b565b601354146113e9576005546001600160a01b03166110eb5760048054600354604080516315ab88c960e31b815290516001600160a01b039384169463e6a43905949093169263ad5c464892808201926020929091829003018186803b15801561101457600080fd5b505afa158015611028573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104c9190612978565b6001546040516001600160e01b031960e085901b16815261107a92916001600160a01b031690600401612bf7565b60206040518083038186803b15801561109257600080fd5b505afa1580156110a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ca9190612978565b600580546001600160a01b0319166001600160a01b03929092169190911790555b6005546006546040516370a0823160e01b81526001600160a01b03928316926370a082319261111f92911690600401612bca565b60206040518083038186803b15801561113757600080fd5b505afa15801561114b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116f9190612b6e565b60098190556103e810156113dd5760065460165460055460095460405163120eba9160e31b81526000946001600160a01b0390811694639075d488946111c39460ff9092169392169186919060040161302c565b6040805180830381600087803b1580156111dc57600080fd5b505af11580156111f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112149190612b86565b509050600360009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561126557600080fd5b505afa158015611279573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129d9190612978565b60065460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb926112d0929116908590600401612bde565b602060405180830381600087803b1580156112ea57600080fd5b505af11580156112fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113229190612b3a565b506006546040516368dc6f9160e11b81526000916001600160a01b03169063d1b8df22906113569083908690600401612bde565b602060405180830381600087803b15801561137057600080fd5b505af1158015611384573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a89190612b6e565b905081600760008282546113bc9190613056565b9250508190555080600860008282546113d59190613056565b909155505050505b6113e5611c2b565b6013555b565b6002546001600160a01b031681565b60175481565b6001600160a01b038216600090815260196020908152604080832084845290915281205461143057506000610aba565b6018546001600160a01b0384166000908152601960209081526040808320868452909152812060050154909161146a91610cf690426130ad565b6017546001600160a01b03861660009081526019602090815260408083208884529091529020600301549192506114a891606491610e7a91906127bc565b6001600160a01b0385166000908152601960209081526040808320878452909152902060068101546003909101546114f49190610ecd9068056bc75e2d6310000090610e7a90876127bc565b1115611540576001600160a01b038416600090815260196020908152604080832086845290915290206006810154601754600390920154610f1f92610cf091606491610e7a91906127bc565b6001600160a01b0384166000908152601960209081526040808320868452909152902060030154610f7b9068056bc75e2d6310000090610e7a90846127bc565b6000546001600160a01b031633146115aa5760405162461bcd60e51b8152600401610bec90612e71565b6040516370a0823160e01b81526000906001600160a01b038316906370a08231906115d9903090600401612bca565b60206040518083038186803b1580156115f157600080fd5b505afa158015611605573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116299190612b6e565b60005460405163a9059cbb60e01b81529192506001600160a01b038085169263a9059cbb9261165e9216908590600401612bde565b602060405180830381600087803b15801561167857600080fd5b505af115801561168c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b09190612b3a565b505050565b60135481565b601654610100900460ff1681565b6001600160a01b031660009081526021602052604090205460ff1690565b601e5481565b6001600160a01b03166000908152600f602052604090205490565b6001546001600160a01b031681565b6000546001600160a01b031633146117415760405162461bcd60e51b8152600401610bec90612e71565b60006012546010544261175491906130ad565b61175e919061306e565b905060145481116117815760405162461bcd60e51b8152600401610bec90612ea8565b600054600c5461179a916001600160a01b03169061248b565b601455565b60085481565b601b6020526000908152604090205481565b6000546001600160a01b031633146117e15760405162461bcd60e51b8152600401610bec90612e71565b6103e88160ff16106118055760405162461bcd60e51b8152600401610bec90612f69565b6016805460ff191660ff92909216919091179055565b6019602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154908060030154908060040154908060050154908060060154905087565b600a5481565b60145481565b60075481565b60165460ff1681565b600b5481565b600e5460009060ff16156118b15760405162461bcd60e51b8152600401610bec90612dfb565b6001546040516370a0823160e01b81526001600160a01b03909116906370a08231906118e1903390600401612bca565b60206040518083038186803b1580156118f957600080fd5b505afa15801561190d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119319190612b6e565b8211156119505760405162461bcd60e51b8152600401610bec90612fa0565b6001546006546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92611989923392909116908790600401612c11565b602060405180830381600087803b1580156119a357600080fd5b505af11580156119b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119db9190612b3a565b506119e582612843565b33600090815260208052604081206002018054849290611a06908490613056565b90915550611a149050610fa4565b336000908152601960209081526040808320601a8352818420548452909152902060020154611a7557601e8054906000611a4d836130c4565b90915550506013546000908152601d60205260408120805491611a6f836130c4565b91905055505b601354336000818152601960209081526040808320601a835281842054845290915280822060010193909355915190917f7d05f82b9a5bf4937d198d76c2f875cf5aa44caf4928b172f475c92c617d17b791611ad5919086904290612ca9565b60405180910390a2506001919050565b602080526000908152604090208054600182015460029092015490919083565b60405180604001604052806002815260200161111560f21b81525081565b600c5481565b336000908152601f602090815260408083206001600160a01b0386168452909152812054808310611b7d57336000908152601f602090815260408083206001600160a01b0388168452909152812055611bac565b611b878184612449565b336000908152601f602090815260408083206001600160a01b03891684529091529020555b336000818152601f602090815260408083206001600160a01b0389168085529252918290205491519092917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591611c039190612fd7565b60405180910390a35060019392505050565b6000611c22338484612503565b50600192915050565b600060115460105442611c3e91906130ad565b611c48919061306e565b611c53906001613056565b905090565b60095481565b6004546001600160a01b031681565b6000546001600160a01b03163314611c975760405162461bcd60e51b8152600401610bec90612e71565b6001600160a01b03919091166000908152602160205260409020805460ff1916911515919091179055565b60125481565b6000546001600160a01b03163314611cf25760405162461bcd60e51b8152600401610bec90612e71565b8060ff1660141115611d165760405162461bcd60e51b8152600401610bec90612d98565b60648160ff161115611d3a5760405162461bcd60e51b8152600401610bec90612eef565b6016805460ff9092166101000261ff0019909216919091179055565b6005546001600160a01b031681565b6000546001600160a01b03163314611d8f5760405162461bcd60e51b8152600401610bec90612e71565b601e8160ff161115611db35760405162461bcd60e51b8152600401610bec90612d49565b6000805460ff909216600160a01b0260ff60a01b19909216919091179055565b600054600160a01b900460ff1681565b6000546001600160a01b03163314611e0d5760405162461bcd60e51b8152600401610bec90612e71565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b039182166000908152601f6020908152604080832093909416825291909152205490565b600e5460ff1681565b6000546001600160a01b031681565b6003546001600160a01b031681565b600e5460009060ff1615611ea75760405162461bcd60e51b8152600401610bec90612f26565b3480611ec55760405162461bcd60e51b8152600401610bec90612dcd565b60008054611ee590606490610e7a908590600160a01b900460ff166127bc565b600080546040519293506001600160a01b03169183156108fc0291849190818181858888f19350505050158015611f20573d6000803e3d6000fd5b506001546006546040516370a0823160e01b81526000926001600160a01b03908116926370a0823192611f599290911690600401612bca565b60206040518083038186803b158015611f7157600080fd5b505afa158015611f85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa99190612b6e565b60408051600280825260608201835292935060009290916020830190803683375050600354604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b15801561201357600080fd5b505afa158015612027573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204b9190612978565b8160008151811061206c57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260018054835192169183919081106120aa57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260035416637ff36ab56120d38686612449565b60065460009085906001600160a01b03166120ef426064613056565b6040518663ffffffff1660e01b815260040161210e9493929190612c40565b6000604051808303818588803b15801561212757600080fd5b505af115801561213b573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526121649190810190612a64565b506001546006546040516370a0823160e01b81526000926121f29286926001600160a01b03928316926370a08231926121a292911690600401612bca565b60206040518083038186803b1580156121ba57600080fd5b505afa1580156121ce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf09190612b6e565b90506121fd81612843565b3360009081526020805260408120600201805483929061221e908490613056565b909155505033600090815260208052604081206001018054879290612244908490613056565b909155506122529050610fa4565b6013546000908152601b602052604081208054879290612273908490613056565b9250508190555084601c600082825461228c9190613056565b9091555050336000908152601960209081526040808320601a83528184205484529091529020600201546122f257601e80549060006122ca836130c4565b90915550506013546000908152601d602052604081208054916122ec836130c4565b91905055505b336000908152601960209081526040808320601a835281842054845290915281206002018054879290612326908490613056565b9091555050601354336000818152601960209081526040808320601a83528184205484529091529081902060010183905560159290925590517f7d05f82b9a5bf4937d198d76c2f875cf5aa44caf4928b172f475c92c617d17b79061239090889085904290612ca9565b60405180910390a260019550505050505090565b6000806123b18385613056565b9050838110156123d35760405162461bcd60e51b8152600401610bec90612d12565b9392505050565b6124146123e78383611400565b6001600160a01b0384166000908152601960209081526040808320868452909152902060060154906123a4565b6001600160a01b0392909216600090815260196020908152604080832093835292905220600681019190915542600590910155565b60006123d383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506128f4565b6001600160a01b0382166000908152600f60205260409020546124ae90826123a4565b6001600160a01b0383166000908152600f6020526040902055600d546124d490826123a4565b600d556040516001600160a01b0383169060009060008051602061313283398151915290610baa908590612fd7565b600061250e836116c9565b600554901591506001600160a01b03858116911614801561252c5750805b156126e357604080518082018252601f81527f7472616e7366657220616d6f756e7420657863656564732062616c616e6365006020808301919091526001600160a01b0387166000908152600f909152919091205461258c9184906128f4565b6001600160a01b0385166000908152600f60205260408120919091556016546125c590606490610e7a908690610100900460ff166127bc565b6001600160a01b0385166000908152600f60205260409020549091506125eb90826123a4565b6001600160a01b0385166000908152600f60205260409020556126426126118483612449565b60008052600f6020527ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec37554906123a4565b60008052600f6020527ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec375556040516001600160a01b0385811691908716906000805160206131328339815191529061269b908590612fd7565b60405180910390a360006001600160a01b0386166000805160206131328339815191526126c88685612449565b6040516126d59190612fd7565b60405180910390a3506127b6565b604080518082018252601f81527f7472616e7366657220616d6f756e7420657863656564732062616c616e6365006020808301919091526001600160a01b0387166000908152600f909152919091205461273e9184906128f4565b6001600160a01b038086166000908152600f6020526040808220939093559085168152205461276d90836123a4565b6001600160a01b038085166000818152600f60205260409081902093909355915190861690600080516020613132833981519152906127ad908690612fd7565b60405180910390a35b50505050565b6000826127cb57506000610aba565b60006127d7838561308e565b9050826127e4858361306e565b146123d35760405162461bcd60e51b8152600401610bec90612e30565b60006123d383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061292e565b336000818152601960209081526040808320601a808452828520805486529184528285206003018790558154855282852042908190558254865292852060050192909255938352905281549190612899836130c4565b919050555080600a60008282546128b09190613056565b909155505060405133907fa499197ed501de1424df2a7fb491b20a939468fbb6e47b99627aca4fe6fdb304906128e99084904290612fe0565b60405180910390a250565b600081848411156129185760405162461bcd60e51b8152600401610bec9190612cbf565b50600061292584866130ad565b95945050505050565b6000818361294f5760405162461bcd60e51b8152600401610bec9190612cbf565b506000612925848661306e565b60006020828403121561296d578081fd5b81356123d38161310b565b600060208284031215612989578081fd5b81516123d38161310b565b600080604083850312156129a6578081fd5b82356129b18161310b565b915060208301356129c18161310b565b809150509250929050565b6000806000606084860312156129e0578081fd5b83356129eb8161310b565b925060208401356129fb8161310b565b929592945050506040919091013590565b60008060408385031215612a1e578182fd5b8235612a298161310b565b915060208301356129c181613123565b60008060408385031215612a4b578182fd5b8235612a568161310b565b946020939093013593505050565b60006020808385031215612a76578182fd5b825167ffffffffffffffff80821115612a8d578384fd5b818501915085601f830112612aa0578384fd5b815181811115612ab257612ab26130f5565b83810260405185828201018181108582111715612ad157612ad16130f5565b604052828152858101935084860182860187018a1015612aef578788fd5b8795505b83861015612b11578051855260019590950194938601938601612af3565b5098975050505050505050565b600060208284031215612b2f578081fd5b81356123d381613123565b600060208284031215612b4b578081fd5b81516123d381613123565b600060208284031215612b67578081fd5b5035919050565b600060208284031215612b7f578081fd5b5051919050565b60008060408385031215612b98578182fd5b505080516020909101519092909150565b600060208284031215612bba578081fd5b813560ff811681146123d3578182fd5b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b901515815260200190565b600060808201868352602060808185015281875180845260a0860191508289019350845b81811015612c895784516001600160a01b031683529383019391830191600101612c64565b50506001600160a01b039690961660408501525050506060015292915050565b9283526020830191909152604082015260600190565b6000602080835283518082850152825b81811015612ceb57858101830151858201604001528201612ccf565b81811115612cfc5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252602f908201527f7365744465764275794665653a204465762041756374696f6e2046656520636160408201526e6e742062652061626f76652033302560881b606082015260800190565b6020808252818101527f56616c756520746f20736d616c6c2c20757365206174206c6561737420323021604082015260600190565b6020808252601490820152734e6f2045544820746f2062757920546f6b656e2160601b604082015260600190565b6020808252818101527f5573657220566573742069732063757272656e746c792064697361626c656421604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601e908201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206465760000604082015260600190565b60208082526027908201527f6465764d696e743a20796f7520616c7265616479206d696e7465642074686973604082015266206d6f6e74682160c81b606082015260800190565b6020808252601d908201527f56616c756520746f206269672c20757365206174206d61782031303021000000604082015260600190565b60208082526023908201527f42757920616e6420566573742069732063757272656e746c792064697361626c60408201526265642160e81b606082015260800190565b6020808252601d908201527f56616c756520746f206269672c20757365206174206d61782039393921000000604082015260600190565b6020808252601e908201527f557365727320746f6b656e2062616c616e636520697320746f206c6f77210000604082015260600190565b90815260200190565b918252602082015260400190565b968752602087019590955260408601939093526060850191909152608084015260a083015260c082015260e00190565b60ff91909116815260200190565b60ff9490941684526001600160a01b03928316602085015291166040830152606082015260800190565b60008219821115613069576130696130df565b500190565b60008261308957634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156130a8576130a86130df565b500290565b6000828210156130bf576130bf6130df565b500390565b60006000198214156130d8576130d86130df565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461312057600080fd5b50565b801515811461312057600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220dacdd63d7ec3d8f21b6f451a88cfc62b436f2cfc82750b292052744d753bef3964736f6c63430008000033

Deployed Bytecode Sourcemap

12648:18443:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14390:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14010:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;15760:50::-;;;;;;;;;;-1:-1:-1;15760:50:0;;;;;:::i;:::-;;:::i;17354:203::-;;;;;;;;;;-1:-1:-1;17354:203:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;30114:546::-;;;;;;;;;;-1:-1:-1;30114:546:0;;;;;:::i;:::-;;:::i;:::-;;16988:93;;;;;;;;;;;;;:::i;15634:35::-;;;;;;;;;;;;;:::i;30716:143::-;;;;;;;;;;;;;:::i;20835:290::-;;;;;;;;;;-1:-1:-1;20835:290:0;;;;;:::i;:::-;;:::i;15448:41::-;;;;;;;;;;-1:-1:-1;15448:41:0;;;;;:::i;:::-;;:::i;14108:37::-;;;;;;;;;;;;;:::i;23230:244::-;;;;;;;;;;;;;:::i;17565:297::-;;;;;;;;;;-1:-1:-1;17565:297:0;;;;;:::i;:::-;;:::i;18821:132::-;;;;;;;;;;-1:-1:-1;18821:132:0;;;;;:::i;:::-;;:::i;28843:834::-;;;;;;;;;;-1:-1:-1;28843:834:0;;;;;:::i;:::-;;:::i;14220:27::-;;;;;;;;;;;;;:::i;13207:33::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;14494:30::-;;;;;;;;;;;;;:::i;14677:29::-;;;;;;;;;;;;;:::i;23564:863::-;;;;;;;;;;;;;:::i;12925:71::-;;;;;;;;;;;;;:::i;14889:31::-;;;;;;;;;;;;;:::i;27692:1029::-;;;;;;;;;;-1:-1:-1;27692:1029:0;;;;;:::i;:::-;;:::i;30871:211::-;;;;;;;;;;-1:-1:-1;30871:211:0;;;;;:::i;:::-;;:::i;14609:25::-;;;;;;;;;;;;;:::i;14769:34::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;20193:140::-;;;;;;;;;;-1:-1:-1;20193:140:0;;;;;:::i;:::-;;:::i;15877:29::-;;;;;;;;;;;;;:::i;17089:112::-;;;;;;;;;;-1:-1:-1;17089:112:0;;;;;:::i;:::-;;:::i;12892:24::-;;;;;;;;;;;;;:::i;19230:285::-;;;;;;;;;;;;;:::i;13288:37::-;;;;;;;;;;;;;:::i;15538:47::-;;;;;;;;;;-1:-1:-1;15538:47:0;;;;;:::i;:::-;;:::i;19020:200::-;;;;;;;;;;-1:-1:-1;19020:200:0;;;;;:::i;:::-;;:::i;15337:65::-;;;;;;;;;;-1:-1:-1;15337:65:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;13361:33::-;;;;;;;;;;;;;:::i;14641:27::-;;;;;;;;;;;;;:::i;13249:32::-;;;;;;;;;;;;;:::i;14713:33::-;;;;;;;;;;;;;:::i;13401:40::-;;;;;;;;;;;;;:::i;26557:978::-;;;;;;;;;;-1:-1:-1;26557:978:0;;;;;:::i;:::-;;:::i;16277:72::-;;;;;;;;;;-1:-1:-1;16277:72:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;14065:36::-;;;;;;;;;;;;;:::i;14154:44::-;;;;;;;;;;;;;:::i;17870:463::-;;;;;;;;;;-1:-1:-1;17870:463:0;;;;;:::i;:::-;;:::i;20683:142::-;;;;;;;;;;-1:-1:-1;20683:142:0;;;;;:::i;:::-;;:::i;23043:121::-;;;;;;;;;;;;;:::i;13332:20::-;;;;;;;;;;;;;:::i;13098:54::-;;;;;;;;;;;;;:::i;19951:153::-;;;;;;;;;;-1:-1:-1;19951:153:0;;;;;:::i;:::-;;:::i;14549:34::-;;;;;;;;;;;;;:::i;19587:285::-;;;;;;;;;;-1:-1:-1;19587:285:0;;;;;:::i;:::-;;:::i;13159:39::-;;;;;;;;;;;;;:::i;18540:190::-;;;;;;;;;;-1:-1:-1;18540:190:0;;;;;:::i;:::-;;:::i;12851:32::-;;;;;;;;;;;;;:::i;18382:85::-;;;;;;;;;;-1:-1:-1;18382:85:0;;;;;:::i;:::-;;:::i;17209:137::-;;;;;;;;;;-1:-1:-1;17209:137:0;;;;;:::i;:::-;;:::i;14256:36::-;;;;;;;;;;;;;:::i;12718:82::-;;;;;;;;;;;;;:::i;13044:45::-;;;;;;;;;;;;;:::i;24498:1999::-;;;:::i;14390:39::-;;;;:::o;14010:48::-;;;;;;;;;;;;;;-1:-1:-1;;;14010:48:0;;;;:::o;15760:50::-;;;;;;;;;;;;;:::o;17354:203::-;17447:10;17419:4;17436:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;17436:31:0;;;;;;;;;;:39;;;17491:36;17419:4;;17436:31;;17491:36;;;;17470:5;;17491:36;:::i;:::-;;;;;;;;-1:-1:-1;17545:4:0;17354:203;;;;;:::o;30114:546::-;30178:33;30187:10;30199:11;30178:8;:33::i;:::-;30290:10;30222:14;30284:17;;;:5;:17;;;;;;;;:30;;;;;;;;:38;;;;30239:40;;;;;:84;;:44;:84::i;:::-;30379:10;30373:17;;;;:5;:17;;;;;;;;:30;;;;;;;;:40;;;;30332:38;;;;:81;30222:101;;-1:-1:-1;30455:25:0;;30222:101;30455:5;:25::i;:::-;30520:6;30491:25;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;;30542:50:0;;30556:10;;30542:50;;;;30568:6;;30576:15;;30542:50;:::i;:::-;;;;;;;;30623:7;;30606:46;;30633:10;;-1:-1:-1;;;;;30623:7:0;;-1:-1:-1;;;;;;;;;;;30606:46:0;;;30645:6;;30606:46;:::i;:::-;;;;;;;;30114:546;;:::o;16988:93::-;17061:12;;16988:93;:::o;15634:35::-;;;;:::o;30716:143::-;13929:4;;-1:-1:-1;;;;;13929:4:0;13937:10;13929:18;13921:61;;;;-1:-1:-1;;;13921:61:0;;;;;;;:::i;:::-;;;;;;;;;30779:14:::1;30829:4:::0;;30828:23:::1;::::0;30796:21:::1;::::0;-1:-1:-1;;;;;30829:4:0;;::::1;::::0;30828:23;::::1;;;::::0;30796:21;;30828:23;30779:14;30828:23;30796:21;30829:4;30828:23;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;13993:1;30716:143::o:0;20835:290::-;20950:9;;20915:4;;-1:-1:-1;;;;;20950:9:0;20936:10;:23;20932:126;;-1:-1:-1;;;;;21006:16:0;;;;;;:10;:16;;;;;;;;21023:10;21006:28;;;;;;;;:40;;21039:6;21006:32;:40::i;:::-;-1:-1:-1;;;;;20975:16:0;;;;;;:10;:16;;;;;;;;20992:10;20975:28;;;;;;;:71;20932:126;21068:27;21078:4;21084:2;21088:6;21068:9;:27::i;:::-;-1:-1:-1;21113:4:0;20835:290;;;;;:::o;15448:41::-;;;;;;;;;;;;;:::o;14108:37::-;14143:2;14108:37;:::o;23230:244::-;23273:7;23293:20;23335:11;;23317:15;:29;;;;:::i;:::-;23293:54;;23358:25;23386:28;23407:6;;23386:16;23400:1;23386:9;:7;:9::i;:::-;:13;;:16::i;:::-;:20;;:28::i;:::-;23358:56;-1:-1:-1;23434:32:0;23358:56;23434:12;:32;:::i;:::-;23427:39;;;;23230:244;:::o;17565:297::-;17718:10;17647:4;17707:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;17707:31:0;;;;;;;;;;:47;;17743:10;17707:35;:47::i;:::-;17675:10;17664:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;17664:31:0;;;;;;;;;;;:90;;;17770:62;;17664:31;;17770:62;;;;17664:90;17770:62;:::i;18821:132::-;13929:4;;-1:-1:-1;;;;;13929:4:0;13937:10;13929:18;13921:61;;;;-1:-1:-1;;;13921:61:0;;;;;;;:::i;:::-;18908:16:::1;:36:::0;;-1:-1:-1;;18908:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;18821:132::o;28843:834::-;-1:-1:-1;;;;;28944:12:0;;28922:7;28944:12;;;:5;:12;;;;;;;;:25;;;;;;;;:34;28940:73;;-1:-1:-1;29002:1:0;28995:8;;28940:73;29171:17;;-1:-1:-1;;;;;29129:12:0;;29089:18;29129:12;;;:5;:12;;;;;;;;:25;;;;;;;;:36;;;29089:18;;29110:79;;29111:54;;:15;:54;:::i;29110:79::-;29357:10;;-1:-1:-1;;;;;29320:12:0;;;;;;:5;:12;;;;;;;;:25;;;;;;;;:32;;;29089:100;;-1:-1:-1;29320:57:0;;29373:3;;29320:48;;:32;:36;:48::i;:::-;:52;;:57::i;:::-;-1:-1:-1;;;;;29272:12:0;;;;;;:5;:12;;;;;;;;:25;;;;;;;;:35;;;;29219:32;;;;;29204:104;;29272:35;29204:63;;29257:9;;29204:48;;:10;;:14;:48::i;:63::-;:67;;:104::i;:::-;:173;29200:303;;;-1:-1:-1;;;;;29458:12:0;;;;;;:5;:12;;;;;;;;:25;;;;;;;;:33;;;;29433:10;;29396:32;;;;;:96;;:57;;29449:3;;29396:48;;:32;:36;:48::i;:96::-;29389:104;;;;;29200:303;-1:-1:-1;;;;;29635:12:0;;;;;;:5;:12;;;;;;;;:25;;;;;;;;:33;;;;29586:35;;;;29518:32;;;;;:151;;:104;;:63;;29571:9;;29518:48;;29555:10;29518:36;:48::i;:151::-;29511:158;28843:834;-1:-1:-1;;;;28843:834:0:o;14220:27::-;;;;:::o;13207:33::-;;;-1:-1:-1;;;;;13207:33:0;;:::o;14494:30::-;;;;:::o;14677:29::-;;;;:::o;23564:863::-;23657:9;:7;:9::i;:::-;23643:10;;:23;23639:781;;23697:11;;-1:-1:-1;;;;;23697:11:0;23693:117;;23753:8;;;23770:7;;:14;;;-1:-1:-1;;;23770:14:0;;;;-1:-1:-1;;;;;23753:8:0;;;;:16;;23770:7;;;;:12;;:14;;;;;;;;;;;;;:7;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23786:9;;23753:43;;-1:-1:-1;;;;;;23753:43:0;;;;;;;;;;-1:-1:-1;;;;;23786:9:0;;23753:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23739:11;:57;;-1:-1:-1;;;;;;23739:57:0;-1:-1:-1;;;;;23739:57:0;;;;;;;;;;23693:117;23839:11;;23870:7;;23832:47;;-1:-1:-1;;;23832:47:0;;-1:-1:-1;;;;;23839:11:0;;;;23832:29;;:47;;23870:7;;;23832:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23824:5;:55;;;23906:4;-1:-1:-1;23894:470:0;;;23966:7;;23981:15;;23998:11;;24029:5;;23966:69;;-1:-1:-1;;;23966:69:0;;23931:29;;-1:-1:-1;;;;;23966:7:0;;;;:14;;:69;;23981:15;;;;;23998:11;;;23966:7;;24029:5;23966:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23930:105;;;24059:7;;;;;;;;;-1:-1:-1;;;;;24059:7:0;-1:-1:-1;;;;;24059:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24092:7;;24052:72;;-1:-1:-1;;;24052:72:0;;-1:-1:-1;;;;;24052:31:0;;;;;;:72;;24092:7;;;24102:21;;24052:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;24169:7:0;;:56;;-1:-1:-1;;;24169:56:0;;24142:23;;-1:-1:-1;;;;;24169:7:0;;:15;;:56;;:7;;24203:21;;24169:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24141:84;;24266:21;24245:17;;:42;;;;;;;:::i;:::-;;;;;;;;24332:15;24306:22;;:41;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;23894:470:0;24401:9;:7;:9::i;:::-;24388:10;:22;23639:781;23564:863::o;12925:71::-;;;-1:-1:-1;;;;;12925:71:0;;:::o;14889:31::-;;;;:::o;27692:1029::-;-1:-1:-1;;;;;27791:12:0;;27770:7;27791:12;;;:5;:12;;;;;;;;:25;;;;;;;;:34;27788:72;;-1:-1:-1;27849:1:0;27842:8;;27788:72;28018:17;;-1:-1:-1;;;;;27976:12:0;;27936:18;27976:12;;;:5;:12;;;;;;;;:25;;;;;;;;:36;;;27936:18;;27957:79;;27958:54;;:15;:54;:::i;27957:79::-;28385:10;;-1:-1:-1;;;;;28348:12:0;;;;;;:5;:12;;;;;;;;:25;;;;;;;;:32;;;27936:100;;-1:-1:-1;28348:57:0;;28401:3;;28348:48;;:32;:36;:48::i;:57::-;-1:-1:-1;;;;;28297:12:0;;;;;;:5;:12;;;;;;;;:25;;;;;;;;:35;;;;28229:32;;;;;:104;;28297:35;28229:63;;28282:9;;28229:48;;28266:10;28229:36;:48::i;:104::-;:176;28226:308;;;-1:-1:-1;;;;;28487:12:0;;;;;;:5;:12;;;;;;;;:25;;;;;;;;:35;;;;28462:10;;28425:32;;;;;:98;;:57;;28478:3;;28425:48;;:32;:36;:48::i;28226:308::-;-1:-1:-1;;;;;28650:12:0;;;;;;:5;:12;;;;;;;;:25;;;;;;;;:32;;;:63;;28703:9;;28650:48;;28687:10;28650:36;:48::i;30871:211::-;13929:4;;-1:-1:-1;;;;;13929:4:0;13937:10;13929:18;13921:61;;;;-1:-1:-1;;;13921:61:0;;;;;;;:::i;:::-;30979:42:::1;::::0;-1:-1:-1;;;30979:42:0;;30960:16:::1;::::0;-1:-1:-1;;;;;30979:27:0;::::1;::::0;::::1;::::0;:42:::1;::::0;31015:4:::1;::::0;30979:42:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31059:4;::::0;31032:42:::1;::::0;-1:-1:-1;;;31032:42:0;;30960:61;;-1:-1:-1;;;;;;31032:26:0;;::::1;::::0;::::1;::::0;:42:::1;::::0;31059:4:::1;::::0;30960:61;;31032:42:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13993:1;30871:211:::0;:::o;14609:25::-;;;;:::o;14769:34::-;;;;;;;;;:::o;20193:140::-;-1:-1:-1;;;;;20291:34:0;20267:4;20291:34;;;:24;:34;;;;;;;;;20193:140::o;15877:29::-;;;;:::o;17089:112::-;-1:-1:-1;;;;;17175:18:0;17148:7;17175:18;;;:9;:18;;;;;;;17089:112::o;12892:24::-;;;-1:-1:-1;;;;;12892:24:0;;:::o;19230:285::-;13929:4;;-1:-1:-1;;;;;13929:4:0;13937:10;13929:18;13921:61;;;;-1:-1:-1;;;13921:61:0;;;;;;;:::i;:::-;19277:17:::1;19331:8;;19316:11;;19298:15;:29;;;;:::i;:::-;19297:42;;;;:::i;:::-;19277:62;;19373:12;;19361:9;:24;19352:77;;;;-1:-1:-1::0;;;19352:77:0::1;;;;;;;:::i;:::-;19448:4;::::0;19454:15:::1;::::0;19442:28:::1;::::0;-1:-1:-1;;;;;19448:4:0::1;::::0;19442:5:::1;:28::i;:::-;19483:12;:24:::0;19230:285::o;13288:37::-;;;;:::o;15538:47::-;;;;;;;;;;;;;:::o;19020:200::-;13929:4;;-1:-1:-1;;;;;13929:4:0;13937:10;13929:18;13921:61;;;;-1:-1:-1;;;13921:61:0;;;;;;;:::i;:::-;19128:4:::1;19109:16;:23;;;19100:66;;;;-1:-1:-1::0;;;19100:66:0::1;;;;;;;:::i;:::-;19177:15;:34:::0;;-1:-1:-1;;19177:34:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;19020:200::o;15337:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13361:33::-;;;;:::o;14641:27::-;;;;:::o;13249:32::-;;;;:::o;14713:33::-;;;;;;:::o;13401:40::-;;;;:::o;26557:978::-;26642:16;;26614:4;;26642:16;;26641:17;26633:62;;;;-1:-1:-1;;;26633:62:0;;;;;;;:::i;:::-;26737:9;;26730:39;;-1:-1:-1;;;26730:39:0;;-1:-1:-1;;;;;26737:9:0;;;;26730:27;;:39;;26758:10;;26730:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26716:10;:53;;26706:98;;;;-1:-1:-1;;;26706:98:0;;;;;;;:::i;:::-;26822:9;;26866:7;;26815:72;;-1:-1:-1;;;26815:72:0;;-1:-1:-1;;;;;26822:9:0;;;;26815:30;;:72;;26846:10;;26866:7;;;;26876:10;;26815:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26941:22;26952:10;26941;:22::i;:::-;27039:10;27016:34;;;;:22;:34;;;;;:55;;:69;;27075:10;;27016:34;:69;;27075:10;;27016:69;:::i;:::-;;;;-1:-1:-1;27125:13:0;;-1:-1:-1;27125:11:0;:13::i;:::-;27194:10;27188:17;;;;:5;:17;;;;;;;;27206:6;:18;;;;;;27188:37;;;;;;;:49;;;27184:143;;27259:10;:12;;;:10;:12;;;:::i;:::-;;;;-1:-1:-1;;27302:10:0;;27286:27;;;;:15;:27;;;;;:29;;;;;;:::i;:::-;;;;;;27184:143;27391:10;;27345;27339:17;;;;:5;:17;;;;;;;;27357:6;:18;;;;;;27339:37;;;;;;;;:49;;:62;;;;27428:59;;27345:10;;27428:59;;;;27339:17;27458:10;;27471:15;;27428:59;:::i;:::-;;;;;;;;-1:-1:-1;27515:4:0;26557:978;;;:::o;16277:72::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14065:36::-;;;;;;;;;;;;;;-1:-1:-1;;;14065:36:0;;;;:::o;14154:44::-;;;;:::o;17870:463::-;18004:10;17957:4;17993:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;17993:31:0;;;;;;;;;;18039:27;;;18035:191;;18094:10;18117:1;18083:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;18083:31:0;;;;;;;;;:35;18035:191;;;18185:29;:8;18198:15;18185:12;:29::i;:::-;18162:10;18151:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;18151:31:0;;;;;;;;;:63;18035:191;18250:10;18271:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;18241:62:0;;18271:31;;;;;;;;;;18241:62;;;;18250:10;18241:62;;;;18271:31;18241:62;:::i;:::-;;;;;;;;-1:-1:-1;18321:4:0;;17870:463;-1:-1:-1;;;17870:463:0:o;20683:142::-;20745:4;20762:33;20772:10;20784:2;20788:6;20762:9;:33::i;:::-;-1:-1:-1;20813:4:0;20683:142;;;;:::o;23043:121::-;23083:7;23149:6;;23134:11;;23116:15;:29;;;;:::i;:::-;23115:40;;;;:::i;:::-;23110:46;;:1;:46;:::i;:::-;23103:53;;23043:121;:::o;13332:20::-;;;;:::o;13098:54::-;;;-1:-1:-1;;;;;13098:54:0;;:::o;19951:153::-;13929:4;;-1:-1:-1;;;;;13929:4:0;13937:10;13929:18;13921:61;;;;-1:-1:-1;;;13921:61:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20049:34:0;;;::::1;;::::0;;;:24:::1;:34;::::0;;;;:46;;-1:-1:-1;;20049:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;19951:153::o;14549:34::-;;;;:::o;19587:285::-;13929:4;;-1:-1:-1;;;;;13929:4:0;13937:10;13929:18;13921:61;;;;-1:-1:-1;;;13921:61:0;;;;;;;:::i;:::-;19684:17:::1;19678:23;;:2;:23;;19669:69;;;;-1:-1:-1::0;;;19669:69:0::1;;;;;;;:::i;:::-;19779:3;19758:17;:24;;;;19749:67;;;;-1:-1:-1::0;;;19749:67:0::1;;;;;;;:::i;:::-;19827:16;:36:::0;;::::1;::::0;;::::1;;;-1:-1:-1::0;;19827:36:0;;::::1;::::0;;;::::1;::::0;;19587:285::o;13159:39::-;;;-1:-1:-1;;;;;13159:39:0;;:::o;18540:190::-;13929:4;;-1:-1:-1;;;;;13929:4:0;13937:10;13929:18;13921:61;;;;-1:-1:-1;;;13921:61:0;;;;;;;:::i;:::-;18628:2:::1;18614:10;:16;;;;18606:77;;;;-1:-1:-1::0;;;18606:77:0::1;;;;;;;:::i;:::-;18694:14;:27:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;18694:27:0::1;-1:-1:-1::0;;;;18694:27:0;;::::1;::::0;;;::::1;::::0;;18540:190::o;12851:32::-;;;-1:-1:-1;;;12851:32:0;;;;;:::o;18382:85::-;13929:4;;-1:-1:-1;;;;;13929:4:0;13937:10;13929:18;13921:61;;;;-1:-1:-1;;;13921:61:0;;;;;;;:::i;:::-;18448:4:::1;:10:::0;;-1:-1:-1;;;;;;18448:10:0::1;-1:-1:-1::0;;;;;18448:10:0;;;::::1;::::0;;;::::1;::::0;;18382:85::o;17209:137::-;-1:-1:-1;;;;;17311:18:0;;;17284:7;17311:18;;;:10;:18;;;;;;;;:27;;;;;;;;;;;;;17209:137::o;14256:36::-;;;;;;:::o;12718:82::-;;;-1:-1:-1;;;;;12718:82:0;;:::o;13044:45::-;;;-1:-1:-1;;;;;13044:45:0;;:::o;24498:1999::-;24573:16;;24547:4;;24573:16;;24572:17;24564:65;;;;-1:-1:-1;;;24564:65:0;;;;;;;:::i;:::-;24662:9;24690:13;24682:46;;;;-1:-1:-1;;;24682:46:0;;;;;;;:::i;:::-;24741:17;24775:14;;24761:38;;24795:3;;24761:29;;:9;;-1:-1:-1;;;24775:14:0;;;;24761:13;:29::i;:38::-;24852:4;;;:24;;24741:58;;-1:-1:-1;;;;;;24852:4:0;;:24;;;;;24741:58;;24852:24;;:4;:24;24741:58;24852:4;:24;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24921:9:0;;24950:7;;24914:45;;-1:-1:-1;;;24914:45:0;;24889:22;;-1:-1:-1;;;;;24921:9:0;;;;24914:27;;:45;;24950:7;;;;24914:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25026:16;;;25040:1;25026:16;;;;;;;;24889:70;;-1:-1:-1;25002:21:0;;25026:16;;;;;;;;;;-1:-1:-1;;25065:7:0;;:14;;;-1:-1:-1;;;25065:14:0;;;;25002:40;;-1:-1:-1;;;;;;25065:7:0;;;;:12;;-1:-1:-1;25065:14:0;;;;;;;;;;;;;;:7;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25055:4;25060:1;25055:7;;;;;;-1:-1:-1;;;25055:7:0;;;;;;;;;-1:-1:-1;;;;;25055:24:0;;;:7;;;;;;;;;:24;25102:9;;;25092:7;;25102:9;;;25092:4;;25102:9;25092:7;;;;-1:-1:-1;;;25092:7:0;;;;;;;;;-1:-1:-1;;;;;25092:19:0;;;:7;;;;;;;;;:19;25181:7;;;:29;25220:24;:9;25234;25220:13;:24::i;:::-;25299:7;;25260:1;;25274:4;;-1:-1:-1;;;;;25299:7:0;25359:20;:15;25376:3;25359:20;:::i;:::-;25181:209;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25181:209:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;25439:9:0;;25468:7;;25432:45;;-1:-1:-1;;;25432:45:0;;25404:24;;25431:67;;25483:14;;-1:-1:-1;;;;;25439:9:0;;;;25432:27;;:45;;25468:7;;;25432:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25431:67::-;25404:94;;25550:28;25561:16;25550:10;:28::i;:::-;25654:10;25631:34;;;;:22;:34;;;;;:55;;:75;;25690:16;;25631:34;:75;;25690:16;;25631:75;:::i;:::-;;;;-1:-1:-1;;25740:10:0;25717:34;;;;:22;:34;;;;;:53;;:66;;25774:9;;25717:34;:66;;25774:9;;25717:66;:::i;:::-;;;;-1:-1:-1;25823:13:0;;-1:-1:-1;25823:11:0;:13::i;:::-;25900:10;;25887:24;;;;:12;:24;;;;;:37;;25915:9;;25887:24;:37;;25915:9;;25887:37;:::i;:::-;;;;;;;;25959:9;25935:20;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;26022:10:0;26016:17;;;;:5;:17;;;;;;;;26034:6;:18;;;;;;26016:37;;;;;;;:49;;;26012:143;;26087:10;:12;;;:10;:12;;;:::i;:::-;;;;-1:-1:-1;;26130:10:0;;26114:27;;;;:15;:27;;;;;:29;;;;;;:::i;:::-;;;;;;26012:143;26173:10;26167:17;;;;:5;:17;;;;;;;;26185:6;:18;;;;;;26167:37;;;;;;;:49;;:62;;26220:9;;26167:17;:62;;26220:9;;26167:62;:::i;:::-;;;;-1:-1:-1;;26293:10:0;;26247;26241:17;;;;:5;:17;;;;;;;;26259:6;:18;;;;;;26241:37;;;;;;;;;:49;;:62;;;26324:14;:27;;;;26377:72;;;;;;26403:9;;26414:16;;26433:15;;26377:72;:::i;:::-;;;;;;;;26477:4;26470:11;;;;;;;24498:1999;:::o;835:181::-;893:7;;925:5;929:1;925;:5;:::i;:::-;913:17;;954:1;949;:6;;941:46;;;;-1:-1:-1;;;941:46:0;;;;;;;:::i;:::-;1007:1;835:181;-1:-1:-1;;;835:181:0:o;29807:253::-;29918:71;29958:30;29969:5;29976:11;29958:10;:30::i;:::-;-1:-1:-1;;;;;29918:12:0;;;;;;:5;:12;;;;;;;;:25;;;;;;;;:35;;;;:39;:71::i;:::-;-1:-1:-1;;;;;29880:12:0;;;;;;;;:5;:12;;;;;;;;:25;;;;;;;:35;;;:109;;;;30037:15;29998:36;;;;:54;29807:253::o;1024:136::-;1082:7;1109:43;1113:1;1116;1109:43;;;;;;;;;;;;;;;;;:3;:43::i;22318:221::-;-1:-1:-1;;;;;22403:16:0;;;;;;:9;:16;;;;;;:29;;22424:7;22403:20;:29::i;:::-;-1:-1:-1;;;;;22384:16:0;;;;;;:9;:16;;;;;:48;22456:12;;:25;;22473:7;22456:16;:25::i;:::-;22441:12;:40;22495:36;;-1:-1:-1;;;;;22495:36:0;;;22512:1;;-1:-1:-1;;;;;;;;;;;22495:36:0;;;22523:7;;22495:36;:::i;21227:1079::-;21417:22;21443:29;21469:2;21443:25;:29::i;:::-;21502:11;;21442:30;;;-1:-1:-1;;;;;;21494:19:0;;;21502:11;;21494:19;:40;;;;;21517:17;21494:40;21489:810;;;21640:62;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21640:15:0;;-1:-1:-1;21640:15:0;;;:9;:15;;;;;;;;:62;;21660:6;;21640:19;:62::i;:::-;-1:-1:-1;;;;;21622:15:0;;;;;;:9;:15;;;;;:80;;;;21750:16;;21739:37;;21772:3;;21739:28;;:6;;21750:16;;;;;21739:10;:28::i;:37::-;-1:-1:-1;;;;;21807:13:0;;;;;;:9;:13;;;;;;21717:59;;-1:-1:-1;21807:30:0;;21717:59;21807:17;:30::i;:::-;-1:-1:-1;;;;;21791:13:0;;;;;;:9;:13;;;;;:46;21876:50;21902:23;:6;21913:11;21902:10;:23::i;:::-;21876:21;;;:9;:21;;;;;:25;:50::i;:::-;21852:21;;;:9;:21;;;:74;:21;21946:31;-1:-1:-1;;;;;21946:31:0;;;;;;;;-1:-1:-1;;;;;;;;;;;21946:31:0;;;21965:11;;21946:31;:::i;:::-;;;;;;;;22020:1;-1:-1:-1;;;;;21997:51:0;;-1:-1:-1;;;;;;;;;;;22024:23:0;:6;22035:11;22024:10;:23::i;:::-;21997:51;;;;;;:::i;:::-;;;;;;;;21489:810;;;;22119:62;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22119:15:0;;-1:-1:-1;22119:15:0;;;:9;:15;;;;;;;;:62;;22139:6;;22119:19;:62::i;:::-;-1:-1:-1;;;;;22101:15:0;;;;;;;:9;:15;;;;;;:80;;;;22212:13;;;;;;;:25;;22230:6;22212:17;:25::i;:::-;-1:-1:-1;;;;;22196:13:0;;;;;;;:9;:13;;;;;;;:41;;;;22257:26;;;;;;-1:-1:-1;;;;;;;;;;;22257:26:0;;;22276:6;;22257:26;:::i;:::-;;;;;;;;21489:810;21227:1079;;;;:::o;1368:250::-;1426:7;1450:6;1446:47;;-1:-1:-1;1480:1:0;1473:8;;1446:47;1505:9;1517:5;1521:1;1517;:5;:::i;:::-;1505:17;-1:-1:-1;1550:1:0;1541:5;1545:1;1505:17;1541:5;:::i;:::-;:10;1533:56;;;;-1:-1:-1;;;1533:56:0;;;;;;;:::i;1626:132::-;1684:7;1711:39;1715:1;1718;1711:39;;;;;;;;;;;;;;;;;:3;:39::i;22597:393::-;22659:10;22653:17;;;;:5;:17;;;;;;;;22671:6;:18;;;;;;;;22653:37;;;;;;;;:44;;:54;;;22734:18;;22716:37;;;;;22765:15;22716:64;;;;22807:18;;22789:37;;;;;:48;;:66;;;;22866:18;;;;;:20;;;22671:18;22866:20;;;:::i;:::-;;;;;;22917:7;22895:18;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;22940:42:0;;22945:10;;22940:42;;;;22957:7;;22966:15;;22940:42;:::i;:::-;;;;;;;;22597:393;:::o;1168:192::-;1254:7;1290:12;1282:6;;;;1274:29;;;;-1:-1:-1;;;1274:29:0;;;;;;;;:::i;:::-;-1:-1:-1;1314:9:0;1326:5;1330:1;1326;:5;:::i;:::-;1314:17;1168:192;-1:-1:-1;;;;;1168:192:0:o;1766:191::-;1852:7;1887:12;1880:5;1872:28;;;;-1:-1:-1;;;1872:28:0;;;;;;;;:::i;:::-;-1:-1:-1;1911:9:0;1923:5;1927:1;1923;:5;:::i;14:259:1:-;;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:33;237:5;210:33;:::i;278:263::-;;401:2;389:9;380:7;376:23;372:32;369:2;;;422:6;414;407:22;369:2;459:9;453:16;478:33;505:5;478:33;:::i;818:402::-;;;947:2;935:9;926:7;922:23;918:32;915:2;;;968:6;960;953:22;915:2;1012:9;999:23;1031:33;1058:5;1031:33;:::i;:::-;1083:5;-1:-1:-1;1140:2:1;1125:18;;1112:32;1153:35;1112:32;1153:35;:::i;:::-;1207:7;1197:17;;;905:315;;;;;:::o;1225:470::-;;;;1371:2;1359:9;1350:7;1346:23;1342:32;1339:2;;;1392:6;1384;1377:22;1339:2;1436:9;1423:23;1455:33;1482:5;1455:33;:::i;:::-;1507:5;-1:-1:-1;1564:2:1;1549:18;;1536:32;1577:35;1536:32;1577:35;:::i;:::-;1329:366;;1631:7;;-1:-1:-1;;;1685:2:1;1670:18;;;;1657:32;;1329:366::o;1700:396::-;;;1826:2;1814:9;1805:7;1801:23;1797:32;1794:2;;;1847:6;1839;1832:22;1794:2;1891:9;1878:23;1910:33;1937:5;1910:33;:::i;:::-;1962:5;-1:-1:-1;2019:2:1;2004:18;;1991:32;2032;1991;2032;:::i;2101:327::-;;;2230:2;2218:9;2209:7;2205:23;2201:32;2198:2;;;2251:6;2243;2236:22;2198:2;2295:9;2282:23;2314:33;2341:5;2314:33;:::i;:::-;2366:5;2418:2;2403:18;;;;2390:32;;-1:-1:-1;;;2188:240:1:o;2433:1148::-;;2559:2;2602;2590:9;2581:7;2577:23;2573:32;2570:2;;;2623:6;2615;2608:22;2570:2;2661:9;2655:16;2690:18;2731:2;2723:6;2720:14;2717:2;;;2752:6;2744;2737:22;2717:2;2795:6;2784:9;2780:22;2770:32;;2840:7;2833:4;2829:2;2825:13;2821:27;2811:2;;2867:6;2859;2852:22;2811:2;2901;2895:9;2923:2;2919;2916:10;2913:2;;;2929:18;;:::i;:::-;2976:2;2972;2968:11;3008:2;3002:9;3059:2;3054;3046:6;3042:15;3038:24;3112:6;3100:10;3097:22;3092:2;3080:10;3077:18;3074:46;3071:2;;;3123:18;;:::i;:::-;3159:2;3152:22;3209:18;;;3243:15;;;;-1:-1:-1;3278:11:1;;;3308;;;3304:20;;3301:33;-1:-1:-1;3298:2:1;;;3352:6;3344;3337:22;3298:2;3379:6;3370:15;;3394:156;3408:2;3405:1;3402:9;3394:156;;;3465:10;;3453:23;;3426:1;3419:9;;;;;3496:12;;;;3528;;3394:156;;;-1:-1:-1;3569:6:1;2539:1042;-1:-1:-1;;;;;;;;2539:1042:1:o;3586:253::-;;3695:2;3683:9;3674:7;3670:23;3666:32;3663:2;;;3716:6;3708;3701:22;3663:2;3760:9;3747:23;3779:30;3803:5;3779:30;:::i;3844:257::-;;3964:2;3952:9;3943:7;3939:23;3935:32;3932:2;;;3985:6;3977;3970:22;3932:2;4022:9;4016:16;4041:30;4065:5;4041:30;:::i;4106:190::-;;4218:2;4206:9;4197:7;4193:23;4189:32;4186:2;;;4239:6;4231;4224:22;4186:2;-1:-1:-1;4267:23:1;;4176:120;-1:-1:-1;4176:120:1:o;4301:194::-;;4424:2;4412:9;4403:7;4399:23;4395:32;4392:2;;;4445:6;4437;4430:22;4392:2;-1:-1:-1;4473:16:1;;4382:113;-1:-1:-1;4382:113:1:o;4500:255::-;;;4640:2;4628:9;4619:7;4615:23;4611:32;4608:2;;;4661:6;4653;4646:22;4608:2;-1:-1:-1;;4689:16:1;;4745:2;4730:18;;;4724:25;4689:16;;4724:25;;-1:-1:-1;4598:157:1:o;4760:289::-;;4870:2;4858:9;4849:7;4845:23;4841:32;4838:2;;;4891:6;4883;4876:22;4838:2;4935:9;4922:23;4985:4;4978:5;4974:16;4967:5;4964:27;4954:2;;5010:6;5002;4995:22;5054:203;-1:-1:-1;;;;;5218:32:1;;;;5200:51;;5188:2;5173:18;;5155:102::o;5486:282::-;-1:-1:-1;;;;;5686:32:1;;;;5668:51;;5750:2;5735:18;;5728:34;5656:2;5641:18;;5623:145::o;5773:304::-;-1:-1:-1;;;;;6003:15:1;;;5985:34;;6055:15;;6050:2;6035:18;;6028:43;5935:2;5920:18;;5902:175::o;6082:375::-;-1:-1:-1;;;;;6340:15:1;;;6322:34;;6392:15;;;;6387:2;6372:18;;6365:43;6439:2;6424:18;;6417:34;;;;6272:2;6257:18;;6239:218::o;6741:187::-;6906:14;;6899:22;6881:41;;6869:2;6854:18;;6836:92::o;7614:911::-;;7896:3;7885:9;7881:19;7927:6;7916:9;7909:25;7953:2;7991:3;7986:2;7975:9;7971:18;7964:31;8015:6;8050;8044:13;8081:6;8073;8066:22;8119:3;8108:9;8104:19;8097:26;;8158:2;8150:6;8146:15;8132:29;;8179:4;8192:195;8206:6;8203:1;8200:13;8192:195;;;8271:13;;-1:-1:-1;;;;;8267:39:1;8255:52;;8362:15;;;;8327:12;;;;8303:1;8221:9;8192:195;;;-1:-1:-1;;;;;;;8443:32:1;;;;8438:2;8423:18;;8416:60;-1:-1:-1;;;8507:2:1;8492:18;8485:34;8404:3;7857:668;-1:-1:-1;;7857:668:1:o;8530:327::-;8740:25;;;8796:2;8781:18;;8774:34;;;;8839:2;8824:18;;8817:34;8728:2;8713:18;;8695:162::o;8862:603::-;;9003:2;9032;9021:9;9014:21;9064:6;9058:13;9107:6;9102:2;9091:9;9087:18;9080:34;9132:4;9145:140;9159:6;9156:1;9153:13;9145:140;;;9254:14;;;9250:23;;9244:30;9220:17;;;9239:2;9216:26;9209:66;9174:10;;9145:140;;;9303:6;9300:1;9297:13;9294:2;;;9373:4;9368:2;9359:6;9348:9;9344:22;9340:31;9333:45;9294:2;-1:-1:-1;9449:2:1;9428:15;-1:-1:-1;;9424:29:1;9409:45;;;;9456:2;9405:54;;8983:482;-1:-1:-1;;;8983:482:1:o;9470:351::-;9672:2;9654:21;;;9711:2;9691:18;;;9684:30;9750:29;9745:2;9730:18;;9723:57;9812:2;9797:18;;9644:177::o;9826:411::-;10028:2;10010:21;;;10067:2;10047:18;;;10040:30;10106:34;10101:2;10086:18;;10079:62;-1:-1:-1;;;10172:2:1;10157:18;;10150:45;10227:3;10212:19;;10000:237::o;10242:356::-;10444:2;10426:21;;;10463:18;;;10456:30;10522:34;10517:2;10502:18;;10495:62;10589:2;10574:18;;10416:182::o;10603:344::-;10805:2;10787:21;;;10844:2;10824:18;;;10817:30;-1:-1:-1;;;10878:2:1;10863:18;;10856:50;10938:2;10923:18;;10777:170::o;10952:356::-;11154:2;11136:21;;;11173:18;;;11166:30;11232:34;11227:2;11212:18;;11205:62;11299:2;11284:18;;11126:182::o;11313:397::-;11515:2;11497:21;;;11554:2;11534:18;;;11527:30;11593:34;11588:2;11573:18;;11566:62;-1:-1:-1;;;11659:2:1;11644:18;;11637:31;11700:3;11685:19;;11487:223::o;11715:354::-;11917:2;11899:21;;;11956:2;11936:18;;;11929:30;11995:32;11990:2;11975:18;;11968:60;12060:2;12045:18;;11889:180::o;12074:403::-;12276:2;12258:21;;;12315:2;12295:18;;;12288:30;12354:34;12349:2;12334:18;;12327:62;-1:-1:-1;;;12420:2:1;12405:18;;12398:37;12467:3;12452:19;;12248:229::o;12482:353::-;12684:2;12666:21;;;12723:2;12703:18;;;12696:30;12762:31;12757:2;12742:18;;12735:59;12826:2;12811:18;;12656:179::o;12840:399::-;13042:2;13024:21;;;13081:2;13061:18;;;13054:30;13120:34;13115:2;13100:18;;13093:62;-1:-1:-1;;;13186:2:1;13171:18;;13164:33;13229:3;13214:19;;13014:225::o;13244:353::-;13446:2;13428:21;;;13485:2;13465:18;;;13458:30;13524:31;13519:2;13504:18;;13497:59;13588:2;13573:18;;13418:179::o;13602:354::-;13804:2;13786:21;;;13843:2;13823:18;;;13816:30;13882:32;13877:2;13862:18;;13855:60;13947:2;13932:18;;13776:180::o;13961:177::-;14107:25;;;14095:2;14080:18;;14062:76::o;14143:248::-;14317:25;;;14373:2;14358:18;;14351:34;14305:2;14290:18;;14272:119::o;14720:607::-;15035:25;;;15091:2;15076:18;;15069:34;;;;15134:2;15119:18;;15112:34;;;;15177:2;15162:18;;15155:34;;;;15220:3;15205:19;;15198:35;15264:3;15249:19;;15242:35;15308:3;15293:19;;15286:35;15022:3;15007:19;;14989:338::o;15332:184::-;15504:4;15492:17;;;;15474:36;;15462:2;15447:18;;15429:87::o;15521:454::-;15778:4;15766:17;;;;15748:36;;-1:-1:-1;;;;;15858:15:1;;;15853:2;15838:18;;15831:43;15910:15;;15905:2;15890:18;;15883:43;15957:2;15942:18;;15935:34;15735:3;15720:19;;15702:273::o;15980:128::-;;16051:1;16047:6;16044:1;16041:13;16038:2;;;16057:18;;:::i;:::-;-1:-1:-1;16093:9:1;;16028:80::o;16113:217::-;;16179:1;16169:2;;-1:-1:-1;;;16204:31:1;;16258:4;16255:1;16248:15;16286:4;16211:1;16276:15;16169:2;-1:-1:-1;16315:9:1;;16159:171::o;16335:168::-;;16441:1;16437;16433:6;16429:14;16426:1;16423:21;16418:1;16411:9;16404:17;16400:45;16397:2;;;16448:18;;:::i;:::-;-1:-1:-1;16488:9:1;;16387:116::o;16508:125::-;;16576:1;16573;16570:8;16567:2;;;16581:18;;:::i;:::-;-1:-1:-1;16618:9:1;;16557:76::o;16638:135::-;;-1:-1:-1;;16698:17:1;;16695:2;;;16718:18;;:::i;:::-;-1:-1:-1;16765:1:1;16754:13;;16685:88::o;16778:127::-;16839:10;16834:3;16830:20;16827:1;16820:31;16870:4;16867:1;16860:15;16894:4;16891:1;16884:15;16910:127;16971:10;16966:3;16962:20;16959:1;16952:31;17002:4;16999:1;16992:15;17026:4;17023:1;17016:15;17042:133;-1:-1:-1;;;;;17119:31:1;;17109:42;;17099:2;;17165:1;17162;17155:12;17099:2;17089:86;:::o;17180:120::-;17268:5;17261:13;17254:21;17247:5;17244:32;17234:2;;17290:1;17287;17280:12

Swarm Source

ipfs://20a14d52f92bea100fcb3f632118c0ce7e68db7720d9d8f427607d19bc2ceb8d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.