ETH Price: $2,388.45 (+7.56%)

Contract

0x6955C4aB5c9FA33160C258eed5213C07Edf171F5
 

Overview

ETH Balance

0.0151145740647004 ETH

Eth Value

$36.10 (@ $2,388.45/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw118747972021-02-17 14:07:191474 days ago1613570839IN
0x6955C4aB...7Edf171F5
0 ETH0.005207164
Buy118739252021-02-17 10:52:051474 days ago1613559125IN
0x6955C4aB...7Edf171F5
1.01511457 ETH0.01594845146
Withdraw117800752021-02-03 0:38:001489 days ago1612312680IN
0x6955C4aB...7Edf171F5
0 ETH0.00606425191
Withdraw117724832021-02-01 20:28:131490 days ago1612211293IN
0x6955C4aB...7Edf171F5
0 ETH0.00482782152
Buy116560172021-01-14 22:57:561508 days ago1610665076IN
0x6955C4aB...7Edf171F5
0.2006004 ETH0.0028299837
Buy116422452021-01-12 20:07:061510 days ago1610482026IN
0x6955C4aB...7Edf171F5
0.1 ETH0.0048068955
Set Sell Treshol...116409472021-01-12 15:35:421510 days ago1610465742IN
0x6955C4aB...7Edf171F5
0 ETH0.00388767142
Set Buy Out Pric...116399752021-01-12 11:59:351510 days ago1610452775IN
0x6955C4aB...7Edf171F5
0 ETH0.0024371789
Deposit116399502021-01-12 11:55:441510 days ago1610452544IN
0x6955C4aB...7Edf171F5
2 ETH0.002159688
Set ERC20116399252021-01-12 11:51:461510 days ago1610452306IN
0x6955C4aB...7Edf171F5
0 ETH0.005922592

Latest 3 internal transactions

Advanced mode:
Parent Transaction Hash Block
From
To
118747972021-02-17 14:07:191474 days ago1613570839
0x6955C4aB...7Edf171F5
1 ETH
117800752021-02-03 0:38:001489 days ago1612312680
0x6955C4aB...7Edf171F5
1 ETH
117724832021-02-01 20:28:131490 days ago1612211293
0x6955C4aB...7Edf171F5
1.3006004 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TokenSale

Compiler Version
v0.6.2+commit.bacdbe57

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-01-12
*/

/**
 *Submitted for verification at Etherscan.io on 2020-12-28
*/

//SPDX-License-Identifier: UNLICENSED
pragma solidity 0.6.2;



/**
 * @dev The contract has an owner address, and provides basic authorization control whitch
 * simplifies the implementation of user permissions. This contract is based on the source code at:
 * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ownership/Ownable.sol
 */
contract Ownable
{

  /**
   * @dev Error constants.
   */
  string public constant NOT_CURRENT_OWNER = "018001";
  string public constant CANNOT_TRANSFER_TO_ZERO_ADDRESS = "018002";

  /**
   * @dev Current owner address.
   */
  address public owner;

  /**
   * @dev An event which is triggered when the owner is changed.
   * @param previousOwner The address of the previous owner.
   * @param newOwner The address of the new owner.
   */
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );

  /**
   * @dev The constructor sets the original `owner` of the contract to the sender account.
   */
  constructor()
    public
  {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner()
  {
    require(msg.sender == owner, NOT_CURRENT_OWNER);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(
    address _newOwner
  )
    public
    onlyOwner
  {
    require(_newOwner != address(0), CANNOT_TRANSFER_TO_ZERO_ADDRESS);
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }

}

contract ReentrancyGuard {
    /// @dev counter to allow mutex lock with only one SSTORE operation
    uint256 private _guardCounter;

    constructor () internal {
        // The counter starts at one to prevent changing it from zero to a non-zero
        // value, which is a more expensive operation.
        _guardCounter = 1;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _guardCounter += 1;
        uint256 localCounter = _guardCounter;
        _;
        require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call");
    }
}

/**
 * @dev Math operations with safety checks that throw on error. This contract is based on the
 * source code at:
 * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/math/SafeMath.sol.
 */
library SafeMath
{
  /**
   * @dev List of revert message codes. Implementing dApp should handle showing the correct message.
   * Based on 0xcert framework error codes.
   */
  string constant OVERFLOW = "008001";
  string constant SUBTRAHEND_GREATER_THEN_MINUEND = "008002";
  string constant DIVISION_BY_ZERO = "008003";

  /**
   * @dev Multiplies two numbers, reverts on overflow.
   * @param _factor1 Factor number.
   * @param _factor2 Factor number.
   * @return product The product of the two factors.
   */
  function mul(
    uint256 _factor1,
    uint256 _factor2
  )
    internal
    pure
    returns (uint256 product)
  {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (_factor1 == 0)
    {
      return 0;
    }

    product = _factor1 * _factor2;
    require(product / _factor1 == _factor2, OVERFLOW);
  }

  /**
   * @dev Integer division of two numbers, truncating the quotient, reverts on division by zero.
   * @param _dividend Dividend number.
   * @param _divisor Divisor number.
   * @return quotient The quotient.
   */
  function div(
    uint256 _dividend,
    uint256 _divisor
  )
    internal
    pure
    returns (uint256 quotient)
  {
    // Solidity automatically asserts when dividing by 0, using all gas.
    require(_divisor > 0, DIVISION_BY_ZERO);
    quotient = _dividend / _divisor;
    // assert(_dividend == _divisor * quotient + _dividend % _divisor); // There is no case in which this doesn't hold.
  }

  /**
   * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
   * @param _minuend Minuend number.
   * @param _subtrahend Subtrahend number.
   * @return difference Difference.
   */
  function sub(
    uint256 _minuend,
    uint256 _subtrahend
  )
    internal
    pure
    returns (uint256 difference)
  {
    require(_subtrahend <= _minuend, SUBTRAHEND_GREATER_THEN_MINUEND);
    difference = _minuend - _subtrahend;
  }

  /**
   * @dev Adds two numbers, reverts on overflow.
   * @param _addend1 Number.
   * @param _addend2 Number.
   * @return sum Sum.
   */
  function add(
    uint256 _addend1,
    uint256 _addend2
  )
    internal
    pure
    returns (uint256 sum)
  {
    sum = _addend1 + _addend2;
    require(sum >= _addend1, OVERFLOW);
  }

  /**
    * @dev Divides two numbers and returns the remainder (unsigned integer modulo), reverts when
    * dividing by zero.
    * @param _dividend Number.
    * @param _divisor Number.
    * @return remainder Remainder.
    */
  function mod(
    uint256 _dividend,
    uint256 _divisor
  )
    internal
    pure
    returns (uint256 remainder)
  {
    require(_divisor != 0, DIVISION_BY_ZERO);
    remainder = _dividend % _divisor;
  }

}


/**
 * @dev signature of external (deployed) contract (ERC20 token)
 * only methods we will use
 */
contract ERC20Token {
 
    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 transfer(address recipient, uint256 amount) external returns (bool){}
    function approve(address spender, uint256 amount) external returns (bool){}
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool){}
    function decimals()  external view returns (uint8){}
  
}



contract TokenSale is
  Ownable, ReentrancyGuard
{
    using SafeMath for uint256;
   
    modifier onlyPriceManager() {
      require(
          msg.sender == price_manager,
          "only price manager can call this function"
          );
          _;
    }
  
    modifier onlyOwnerOrPriceManager() {
      require(
          msg.sender == price_manager || msg.sender == owner,
          "only owner or price manager can call this function"
          );
          _;
    }
   
    ERC20Token token;
    
    /**
    * @dev some non-working address from the start to ensure owner will set correct one
    */
   
    address ERC20Contract = 0x0000000000000000000000000000000000000000;
    address price_manager = 0x0000000000000000000000000000000000000000;
    
    uint256 ref_commission = 5;
    mapping(address => uint256) private ref_balances;
    
    /**
    * @dev 10**18 for tokens with 18 digits, need to be changed accordingly (setter/getter)
    */
    uint256 adj_constant = 1000000000000000000; 
    
    //initial in wei
    uint256  sell_price = 100000000000000000; 
    
    //initial in wei
    uint256  buyout_price = 70000000000000000; 
    
    uint256 constant curve_scale = 100000; 
    uint256 price_curve = 200; // in 1/100000  i.e. 1% == 1000, 0.1% == 100
    uint256 sell_threshold = 250000000000000000;
    
    //events
    event Bought(uint256 tokens_amount, uint256 amount_wei, address wallet);
    event BoughtWithRef(uint256 tokens_amount, uint256 wei_amount, address buyer, address ref_wallet);
    event Sold(uint256 tokens_amount, uint256 amount_wei, address wallet);
    event TokensDeposited(uint256 amount, address wallet);
    event FinneyDeposited(uint256 amount, address wallet);
    event Withdrawn(uint256 amount, address wallet);
    event RefWithdrawnEther(uint256 amount, address wallet);
    event RefWithdrawnTokens(uint256 amount, address wallet);
    event TokensWithdrawn(uint256 amount, address wallet);
    event UpdateSellPrice(uint256 timestamp, uint256 new_price);
    event UpdateBuyoutPrice(uint256 timestamp, uint256 new_price);
   
    /**
    * @dev set price_manager == owner in the beginning, but could be changed by setter, below
    */
    constructor() public {
        price_manager = owner;
    }
    
    
    function setPriceManagerRight(address newPriceManager) external onlyOwner{
          price_manager = newPriceManager;
    }
      
      
    function getPriceManager() public view returns(address){
        return price_manager;
    }
    
    
    function setPriceCurve(uint256 new_curve) external onlyOwnerOrPriceManager{
          price_curve = new_curve;
    }
      
    
    function getPriceCurve() public view returns(uint256){
        return price_curve;
    }
    
    function setSellTreshold(uint256 new_treshold) external onlyOwnerOrPriceManager{
          sell_threshold = new_treshold;
    }
      
    
    function getSellTreshold() public view returns(uint256){
        return sell_threshold;
    }
    
    
    function upForecastPrice(uint256 current_price, uint256 num_tokens) public view returns(uint256) {
        uint256 change =0;
        uint256 forecast_price = current_price;
        for (uint32 i=0; i < num_tokens; i++){
             change = forecast_price.div(curve_scale).mul(price_curve);
             forecast_price = forecast_price.add(change);
        }
        return forecast_price;
    }
    
    function downForecastPrice(uint256 current_price, uint256 num_tokens) public view returns (uint256) {
        uint256 change =0;
        uint256 forecast_price = current_price;
        for (uint32 i=0; i < num_tokens; i++){
             change = forecast_price.div(curve_scale).mul(price_curve);
             forecast_price = forecast_price.sub(change);
        }
        return forecast_price;
    }
    
    function effectiveBuyAmount(uint256 current_price, uint256 num_tokens) public view returns(uint256) {
        uint256 change =0;
        uint256 forecast_price = current_price;
        uint256 total_amount = current_price;
        for (uint32 i=0; i < num_tokens-1; i++){
             change = forecast_price.div(curve_scale).mul(price_curve);
             forecast_price = forecast_price.add(change);
             total_amount += forecast_price;
        }
        return total_amount;
    }
    
    function effectiveSellAmount(uint256 current_price, uint256 num_tokens) public view returns(uint256) {
       uint256 change =0;
        uint256 forecast_price = current_price;
        uint256 total_amount = current_price;
        for (uint32 i=0; i < num_tokens-1; i++){
             change = forecast_price.div(curve_scale).mul(price_curve);
             forecast_price = forecast_price.sub(change);
             total_amount += forecast_price;
        }
        return total_amount;
    }
    
   
    
    function updatePricesBuy(uint256 num_tokens) internal {
        sell_price = upForecastPrice(sell_price, num_tokens);
        buyout_price = upForecastPrice(buyout_price, num_tokens);
        uint256 timestamp = now;
        emit UpdateSellPrice(timestamp,sell_price);
        emit UpdateBuyoutPrice(timestamp, buyout_price);
    }
    
    function updatePricesSell(uint256 num_tokens) internal {
        sell_price = downForecastPrice(sell_price, num_tokens);
        buyout_price = downForecastPrice(buyout_price, num_tokens);
        uint256 timestamp = now;
        emit UpdateSellPrice(timestamp,sell_price);
        emit UpdateBuyoutPrice(timestamp, buyout_price);
    }
    
    /**
    * @dev setter/getter for ERC20 linked to exchange (current) smartcontract
    */
    function setERC20(address newERC20Contract) external onlyOwner returns(bool){
        
        ERC20Contract = newERC20Contract;
        token = ERC20Token(ERC20Contract); 
    }
    
    
    function getERC20() external view returns(address){
        return ERC20Contract;
    }

    /**
    * @dev setter/getter for digits constant (current 10**18)
    */
    function setAdjConstant(uint256 new_adj_constant) external onlyOwner{
        adj_constant = new_adj_constant;
    }
    
    function getAdjConstant() external view returns(uint256){  
        return adj_constant;
    }
 
    /**
    * @dev setter/getter for digits constant (current 10**18)
    */
    function setRefCommission(uint256 new_ref_commission) external onlyOwner{
        ref_commission = new_ref_commission;
    }
    
    function getRefCommission() external view returns(uint256){  
        return ref_commission;
    }
 
 
    /**
    * @dev setters/getters for prices 
    */
    function setSellPrice(uint256 new_sell_price) external onlyPriceManager{
        sell_price = new_sell_price;
    }
    
    function setBuyOutPrice(uint256 new_buyout_price) external onlyPriceManager{
        buyout_price = new_buyout_price;
    }
    
    function getSellPrice() external view returns(uint256){  
        return sell_price;
    }
    
    function getBuyOutPrice() external view returns(uint256){  
        return buyout_price;
    }
    
    
    
    /**
    * @dev user buys tokens 
    * ref_wallet parameter, set 0x0 if not used
    */
    function buy(address ref_wallet, uint256 num_tokens) payable external notContract nonReentrant returns (bool) {
        uint256 amountSent = msg.value; //in wei..
        require(amountSent == effectiveBuyAmount(sell_price,num_tokens), "amount do not correspond");
        require(ref_wallet == address(0x0) || ref_wallet != msg.sender, "you cannot use ref. code for yourself");
        
         uint256 dexBalance = token.balanceOf(address(this));
        //calc number of tokens (real ones, not converted based on decimals..)
        uint256 amountTobuy = num_tokens; //tokens as user see them
       
        uint256 realAmountTobuy = amountTobuy.mul(adj_constant); //tokens adjusted to real ones
        
       
        
        require(realAmountTobuy > 0, "not enough ether to buy any feasible amount of tokens");
        require(realAmountTobuy <= dexBalance, "Not enough tokens in the reserve");
        
    
        
        try token.transfer(msg.sender, realAmountTobuy) { //ensure we revert in case of failure
            if (ref_wallet == address(0x0)){
                emit Bought(amountTobuy, amountSent, msg.sender);
            } else {
                uint256 ref_comiss = amountSent.div(100).mul(ref_commission);
                ref_balances[ref_wallet] = ref_balances[ref_wallet].add(ref_comiss);
                
                emit BoughtWithRef(amountTobuy, amountSent, msg.sender, ref_wallet);
            }
            updatePricesBuy(num_tokens);
            return true;
        } catch {
            require(false,"transfer failed");
        }
        
         //we could not get here, i.e. it is error if we here
        return false;
    }
    
    
    receive() external payable {// called when ether is send, just do not allow it
        revert();
    }
    
    
    /**
    * @dev user sells tokens
    */
    function sell(uint256 amount_tokens) external notContract nonReentrant returns(bool) {
        require(sell_price >= sell_threshold, "price should reach threshold");
        uint256 amount_wei = 0;
        require(amount_tokens > 0, "You need to sell at least some tokens");
        uint256 realAmountTokens = amount_tokens.mul(adj_constant);
        
        uint256 token_bal = token.balanceOf(msg.sender);
        require(token_bal >= realAmountTokens, "Check the token balance on your wallet");
        uint256 allowance = token.allowance(msg.sender, address(this));
        require(allowance >= realAmountTokens, "Check the token allowance");
       
        
        amount_wei = effectiveSellAmount(buyout_price,amount_tokens);
        
        
        
        require(address(this).balance > amount_wei, "unsufficient funds");
        bool success = false;
       
        //ensure we revert in case of failure 
        try token.transferFrom(msg.sender, address(this), realAmountTokens) { 
            //just continue if all good..
        } catch {
            require(false,"tokens transfer failed");
            return false;
        }
        
        
        // **   msg.sender.transfer(amount_wei); .** 
       
        (success, ) = msg.sender.call.value(amount_wei)("");
        require(success, "Transfer failed.");
        // ** end **
        updatePricesSell(amount_tokens);
      
            // all done..
        emit Sold(amount_tokens, amount_wei, msg.sender);
        return true; //normal completion
       
    }


    
    /**
    * @dev returns contract balance, in wei
    */
    function getContractBalance() external view returns (uint256) {
        return address(this).balance;
    }
    
    /**
    * @dev returns contract tokens balance
    */
    function getContractTokensBalance() external view returns (uint256) {
        return token.balanceOf(address(this));
    }
    
    /**
    * @dev use of msg.sender in view function is not security measure (it doesnt work for view functions),
    * it is used only for convinience here. And etherscan do not support it (limitation of etherscan view 
    * functions support, but web3 supports).
    */
    function checkRefBalance(address ref_wallet) external onlyOwner view returns (uint256) {
        return ref_balances[ref_wallet];
    }
    
    function setRefBalance(address ref_wallet, uint256 balance) external onlyOwner{
         ref_balances[ref_wallet] = balance;
    }
    
    /**
    * @dev use of msg.sender in view function is not security measure (it doesnt work for view functions),
    * it is used only for convinience here. And etherscan do not support it (limitation of etherscan view 
    * functions support, but web3 supports).
    */
    function checkOwnRefBalance() external view returns (uint256) {
        return ref_balances[msg.sender];
    }
    
    /**
    * @dev - ref. withdraw ether
    */
    function ref_withdraw_ether() external notContract nonReentrant  {
        require(ref_balances[msg.sender] >0,"no balance");
       
        uint256 amount = ref_balances[msg.sender]; //ether
        
        require(address(this).balance >= amount, "unsufficient funds");
       
        bool success = false;
        // ** sendTo.transfer(amount);** 
        (success, ) = (payable(msg.sender)).call.value(amount)("");
        require(success, "Transfer failed.");
        ref_balances[msg.sender] = 0;
        // ** end **
        emit RefWithdrawnEther(amount, msg.sender); //wei
    }
    
     /**
    * @dev - ref. withdraw ether
    */
    function ref_withdraw_tokens() external notContract nonReentrant  {
        require(ref_balances[msg.sender] >0,"no balance");
       
        uint256 amount = ref_balances[msg.sender];//wei
        
        
        uint256 dexBalance = token.balanceOf(address(this));
        //calc number of tokens (real ones, not converted based on decimals..)
        
        //to ensure that divider is smaller
        amount = amount.mul(100000);
        
        uint256 amount_tokens = amount.div(sell_price); //tokens as user see them
       
        uint256 real_amount_tokens = amount_tokens.mul(adj_constant); //tokens adjusted to real ones
        
        //convert back
        real_amount_tokens = real_amount_tokens.div(100000);
        
        require(real_amount_tokens > 0, "not enough balance to buy any feasible amount of tokens");
        require(real_amount_tokens <= dexBalance, "Not enough tokens in the reserve");
        
    
        try token.transfer(msg.sender, real_amount_tokens) { //ensure we revert in case of failure
            ref_balances[msg.sender] = 0;
            emit RefWithdrawnTokens(real_amount_tokens, msg.sender); //wei
        } catch {
            require(false,"transfer failed");
        }

    }
    
    /**
    * @dev - four functions below are for owner to 
    * deposit/withdraw eth/tokens to exchange contract
    */
    function withdraw(address payable sendTo, uint256 amount) external onlyOwner {
        require(address(this).balance >= amount, "unsufficient funds");
        bool success = false;
        // ** sendTo.transfer(amount);** 
        (success, ) = sendTo.call.value(amount)("");
        require(success, "Transfer failed.");
        // ** end **
        emit Withdrawn(amount, sendTo); //wei
    }
  
    
    function deposit(uint256 amount) payable external onlyOwner { //amount in finney
        require(amount*(1 finney) == msg.value,"please provide value in finney");
        emit FinneyDeposited(amount, owner); //in finney
    }

    function depositTokens(uint256 amount) external onlyOwner {
        require(amount > 0, "You need to deposit at least some tokens");
        uint256 allowance = token.allowance(msg.sender, address(this));
        require(allowance >= amount, "Check the token allowance");
        token.transferFrom(msg.sender, address(this), amount);
        
        emit TokensDeposited(amount.div(adj_constant), owner);
    }
    
  
    function withdrawTokens(address to_wallet, uint256 amount_tokens) external onlyOwner{
        require(amount_tokens > 0, "You need to withdraw at least some tokens");
        uint256 realAmountTokens = amount_tokens.mul(adj_constant);
        uint256 contractTokenBalance = token.balanceOf(address(this));
        
        require(contractTokenBalance >= realAmountTokens, "unsufficient funds");
      
       
        
        //ensure we revert in case of failure 
        try token.transfer(to_wallet, realAmountTokens) { 
            //just continue if all good..
        } catch {
            require(false,"tokens transfer failed");
           
        }
        
    
        // all done..
        emit TokensWithdrawn(amount_tokens, to_wallet);
    }
    
    
    /**
    * @dev service function to check tokens on wallet and allowance of wallet
    */
    function walletTokenBalance(address wallet) external view returns(uint256){
        return token.balanceOf(wallet);
    }
    
    /**
    * @dev service function to check allowance of wallet for tokens
    */
    function walletTokenAllowance(address wallet) external view returns (uint256){
        return  token.allowance(wallet, address(this)); 
    }
    
    
    /**
    * @dev not bullet-proof check, but additional measure, not to allow buy & sell from contracts
    */
    function isContract(address _addr) internal view returns (bool){
      uint32 size;
      assembly {
          size := extcodesize(_addr)
      }
      
      return (size > 0);
    }
    
    modifier notContract(){
      require(
          (!isContract(msg.sender)),
          "external contracts are not allowed"
          );
          _;
    }
    
    //*** fire exit ***
    function kill(address payable killAddress) external onlyOwner
    {
        uint256 contractTokenBalance = token.balanceOf(address(this));
        token.transfer(killAddress, contractTokenBalance);
        selfdestruct(killAddress);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokens_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount_wei","type":"uint256"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"Bought","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokens_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wei_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"address","name":"ref_wallet","type":"address"}],"name":"BoughtWithRef","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"FinneyDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"RefWithdrawnEther","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"RefWithdrawnTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokens_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount_wei","type":"uint256"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"Sold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"TokensDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"TokensWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"new_price","type":"uint256"}],"name":"UpdateBuyoutPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"new_price","type":"uint256"}],"name":"UpdateSellPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"CANNOT_TRANSFER_TO_ZERO_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NOT_CURRENT_OWNER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ref_wallet","type":"address"},{"internalType":"uint256","name":"num_tokens","type":"uint256"}],"name":"buy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"checkOwnRefBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ref_wallet","type":"address"}],"name":"checkRefBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"current_price","type":"uint256"},{"internalType":"uint256","name":"num_tokens","type":"uint256"}],"name":"downForecastPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"current_price","type":"uint256"},{"internalType":"uint256","name":"num_tokens","type":"uint256"}],"name":"effectiveBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"current_price","type":"uint256"},{"internalType":"uint256","name":"num_tokens","type":"uint256"}],"name":"effectiveSellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAdjConstant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBuyOutPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractTokensBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getERC20","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPriceCurve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPriceManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRefCommission","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSellPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSellTreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"killAddress","type":"address"}],"name":"kill","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ref_withdraw_ether","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ref_withdraw_tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_tokens","type":"uint256"}],"name":"sell","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"new_adj_constant","type":"uint256"}],"name":"setAdjConstant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"new_buyout_price","type":"uint256"}],"name":"setBuyOutPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newERC20Contract","type":"address"}],"name":"setERC20","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"new_curve","type":"uint256"}],"name":"setPriceCurve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPriceManager","type":"address"}],"name":"setPriceManagerRight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ref_wallet","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"}],"name":"setRefBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"new_ref_commission","type":"uint256"}],"name":"setRefCommission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"new_sell_price","type":"uint256"}],"name":"setSellPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"new_treshold","type":"uint256"}],"name":"setSellTreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"current_price","type":"uint256"},{"internalType":"uint256","name":"num_tokens","type":"uint256"}],"name":"upForecastPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"walletTokenAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"walletTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"sendTo","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to_wallet","type":"address"},{"internalType":"uint256","name":"amount_tokens","type":"uint256"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600380546001600160a01b031990811690915560048054909116905560058055670de0b6b3a764000060075567016345785d8a000060085566f8b0a10e47000060095560c8600a556703782dace9d90000600b5534801561006457600080fd5b50600080546001600160a01b0319908116331780835560018055600480549092166001600160a01b039091161790556134039081906100a390396000f3fe6080604052600436106102bf5760003560e01c8063ac3807811161016e578063cce7ec13116100cb578063f2fde38b1161007f578063f3fef3a311610064578063f3fef3a3146108c8578063f8a623d314610901578063fc6634b914610916576102c9565b8063f2fde38b14610880578063f3fe3bc3146108b3576102c9565b8063dd49756e116100b0578063dd49756e14610802578063dec0fc5c1461082c578063e4849b3214610856576102c9565b8063cce7ec13146107c1578063db7b69ce146107ed576102c9565b8063be17533511610122578063c7e3865811610107578063c7e3865814610749578063ca5c6e9514610779578063cbf0b0c01461078e576102c9565b8063be175335146106ed578063c29a6fda14610702576102c9565b8063b6b55f2511610153578063b6b55f2514610682578063b85646901461069f578063bc526509146106d8576102c9565b8063ac3807811461063d578063ac8fd1481461066d576102c9565b806355e6663a1161021c578063860d248a116101d05780638df501b4116101b55780638df501b4146105e957806394d212e6146106135780639609f6c714610628576102c9565b8063860d248a1461054a5780638da5cb5b146105d4576102c9565b80636f9fb98a116102015780636f9fb98a146104ed57806374ee9e071461050257806384b8524a14610535576102c9565b806355e6663a146104ae5780636da847f5146104c3576102c9565b8063303b6d08116102735780634c82b3b4116102585780634c82b3b4146104235780634ece90a81461044d57806352b31f1d1461047e576102c9565b8063303b6d08146103e457806343d32e9c1461040e576102c9565b806310a56d5d116102a457806310a56d5d1461034b57806318fdec7e1461037e578063210e200a146103b1576102c9565b806306b091f9146102ce5780630c68987d14610309576102c9565b366102c957600080fd5b600080fd5b3480156102da57600080fd5b50610307600480360360408110156102f157600080fd5b506001600160a01b038135169060200135610940565b005b34801561031557600080fd5b506103396004803603604081101561032c57600080fd5b5080359060200135610c7e565b60408051918252519081900360200190f35b34801561035757600080fd5b506103396004803603602081101561036e57600080fd5b50356001600160a01b0316610cdf565b34801561038a57600080fd5b50610307600480360360208110156103a157600080fd5b50356001600160a01b0316610d81565b3480156103bd57600080fd5b50610339600480360360208110156103d457600080fd5b50356001600160a01b0316610e4a565b3480156103f057600080fd5b506103076004803603602081101561040757600080fd5b5035610eb4565b34801561041a57600080fd5b50610339610f48565b34801561042f57600080fd5b506103076004803603602081101561044657600080fd5b5035610f4e565b34801561045957600080fd5b50610462610fb1565b604080516001600160a01b039092168252519081900360200190f35b34801561048a57600080fd5b50610339600480360360408110156104a157600080fd5b5080359060200135610fc0565b3480156104ba57600080fd5b5061033961100a565b3480156104cf57600080fd5b50610307600480360360208110156104e657600080fd5b503561101d565b3480156104f957600080fd5b5061033961106b565b34801561050e57600080fd5b506103396004803603602081101561052557600080fd5b50356001600160a01b031661106f565b34801561054157600080fd5b5061030761111b565b34801561055657600080fd5b5061055f611378565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610599578181015183820152602001610581565b50505050905090810190601f1680156105c65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156105e057600080fd5b506104626113b1565b3480156105f557600080fd5b506103076004803603602081101561060c57600080fd5b50356113c0565b34801561061f57600080fd5b50610339611454565b34801561063457600080fd5b506103396114e9565b34801561064957600080fd5b506103396004803603604081101561066057600080fd5b50803590602001356114ef565b34801561067957600080fd5b5061033961154b565b6103076004803603602081101561069857600080fd5b5035611551565b3480156106ab57600080fd5b50610307600480360360408110156106c257600080fd5b506001600160a01b038135169060200135611686565b3480156106e457600080fd5b50610307611731565b3480156106f957600080fd5b50610339611afe565b34801561070e57600080fd5b506107356004803603602081101561072557600080fd5b50356001600160a01b0316611b04565b604080519115158252519081900360200190f35b34801561075557600080fd5b506103396004803603604081101561076c57600080fd5b5080359060200135611bdd565b34801561078557600080fd5b50610339611c2f565b34801561079a57600080fd5b50610307600480360360208110156107b157600080fd5b50356001600160a01b0316611c35565b610735600480360360408110156107d757600080fd5b506001600160a01b038135169060200135611dfd565b3480156107f957600080fd5b5061033961229c565b34801561080e57600080fd5b506103076004803603602081101561082557600080fd5b50356122a2565b34801561083857600080fd5b506103076004803603602081101561084f57600080fd5b5035612559565b34801561086257600080fd5b506107356004803603602081101561087957600080fd5b50356125bc565b34801561088c57600080fd5b50610307600480360360208110156108a357600080fd5b50356001600160a01b0316612b14565b3480156108bf57600080fd5b5061055f612ca0565b3480156108d457600080fd5b50610307600480360360408110156108eb57600080fd5b506001600160a01b038135169060200135612cd9565b34801561090d57600080fd5b50610462612ead565b34801561092257600080fd5b506103076004803603602081101561093957600080fd5b5035612ebc565b60005460408051808201909152600681527f30313830303100000000000000000000000000000000000000000000000000006020820152906001600160a01b03163314610a0b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156109d05781810151838201526020016109b8565b50505050905090810190601f1680156109fd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008111610a4b5760405162461bcd60e51b81526004018080602001828103825260298152602001806133a56029913960400191505060405180910390fd5b6000610a6260075483612f0a90919063ffffffff16565b600254604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610acc57600080fd5b505afa158015610ae0573d6000803e3d6000fd5b505050506040513d6020811015610af657600080fd5b5051905081811015610b4f576040805162461bcd60e51b815260206004820152601260248201527f756e73756666696369656e742066756e64730000000000000000000000000000604482015290519081900360640190fd5b600254604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015610bbe57600080fd5b505af1925050508015610be357506040513d6020811015610bde57600080fd5b505160015b610c34576040805162461bcd60e51b815260206004820152601660248201527f746f6b656e73207472616e73666572206661696c656400000000000000000000604482015290519081900360640190fd5b50604080518481526001600160a01b038616602082015281517f0ddddc48b57dd67f8fa2ff05c78034b578c31ef5caa05b03d2ca16feadbbb98f929181900390910190a150505050565b60008083815b848163ffffffff161015610cd457600a54610cb890610cac84620186a063ffffffff612fab16565b9063ffffffff612f0a16565b9250610cca828463ffffffff61304416565b9150600101610c84565b509150505b92915050565b600254604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301523060248301529151600093929092169163dd62ed3e91604480820192602092909190829003018186803b158015610d4f57600080fd5b505afa158015610d63573d6000803e3d6000fd5b505050506040513d6020811015610d7957600080fd5b505192915050565b60005460408051808201909152600681527f30313830303100000000000000000000000000000000000000000000000000006020820152906001600160a01b03163314610e0f5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b50600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600254604080517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152915160009392909216916370a0823191602480820192602092909190829003018186803b158015610d4f57600080fd5b60005460408051808201909152600681527f30313830303100000000000000000000000000000000000000000000000000006020820152906001600160a01b03163314610f425760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b50600755565b60085490565b6004546001600160a01b0316331480610f7157506000546001600160a01b031633145b610fac5760405162461bcd60e51b81526004018080602001828103825260328152602001806133736032913960400191505060405180910390fd5b600b55565b6003546001600160a01b031690565b60008083815b848163ffffffff161015610cd457600a54610fee90610cac84620186a063ffffffff612fab16565b9250611000828463ffffffff6130d316565b9150600101610fc6565b3360009081526006602052604090205490565b6004546001600160a01b031633146110665760405162461bcd60e51b81526004018080602001828103825260298152602001806132246029913960400191505060405180910390fd5b600955565b4790565b6000805460408051808201909152600681527f30313830303100000000000000000000000000000000000000000000000000006020820152906001600160a01b031633146110fe5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b50506001600160a01b031660009081526006602052604090205490565b6111243361315a565b156111605760405162461bcd60e51b81526004018080602001828103825260228152602001806133296022913960400191505060405180910390fd5b60018054810190819055336000908152600660205260409020546111cb576040805162461bcd60e51b815260206004820152600a60248201527f6e6f2062616c616e636500000000000000000000000000000000000000000000604482015290519081900360640190fd5b3360009081526006602052604090205447811115611230576040805162461bcd60e51b815260206004820152601260248201527f756e73756666696369656e742066756e64730000000000000000000000000000604482015290519081900360640190fd5b604051600090339083908381818185875af1925050503d8060008114611272576040519150601f19603f3d011682016040523d82523d6000602084013e611277565b606091505b505080915050806112cf576040805162461bcd60e51b815260206004820152601060248201527f5472616e73666572206661696c65642e00000000000000000000000000000000604482015290519081900360640190fd5b3360008181526006602090815260408083209290925581518581529081019290925280517f8642fc8432d193ca9816939deaf08486dfecde62ca290ef755fa4561932221889281900390910190a150506001548114611375576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b50565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b6000546001600160a01b031681565b60005460408051808201909152600681527f30313830303100000000000000000000000000000000000000000000000000006020820152906001600160a01b0316331461144e5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b50600555565b600254604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156114b857600080fd5b505afa1580156114cc573d6000803e3d6000fd5b505050506040513d60208110156114e257600080fd5b5051905090565b600a5490565b6000808380825b600186038163ffffffff16101561154157600a5461152190610cac85620186a063ffffffff612fab16565b9350611533838563ffffffff61304416565b9250908201906001016114f6565b5095945050505050565b60095490565b60005460408051808201909152600681527f30313830303100000000000000000000000000000000000000000000000000006020820152906001600160a01b031633146115df5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b50348166038d7ea4c68000021461163d576040805162461bcd60e51b815260206004820152601e60248201527f706c656173652070726f766964652076616c756520696e2066696e6e65790000604482015290519081900360640190fd5b600054604080518381526001600160a01b03909216602083015280517feddca56e728ea017cd6a76222db5c5a1a3c95bc755678277f2ed597e027021a59281900390910190a150565b60005460408051808201909152600681527f30313830303100000000000000000000000000000000000000000000000000006020820152906001600160a01b031633146117145760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b506001600160a01b03909116600090815260066020526040902055565b61173a3361315a565b156117765760405162461bcd60e51b81526004018080602001828103825260228152602001806133296022913960400191505060405180910390fd5b60018054810190819055336000908152600660205260409020546117e1576040805162461bcd60e51b815260206004820152600a60248201527f6e6f2062616c616e636500000000000000000000000000000000000000000000604482015290519081900360640190fd5b3360009081526006602090815260408083205460025482517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015292519194936001600160a01b03909116926370a082319260248083019392829003018186803b15801561185457600080fd5b505afa158015611868573d6000803e3d6000fd5b505050506040513d602081101561187e57600080fd5b5051905061189582620186a063ffffffff612f0a16565b915060006118ae60085484612fab90919063ffffffff16565b905060006118c760075483612f0a90919063ffffffff16565b90506118dc81620186a063ffffffff612fab16565b90506000811161191d5760405162461bcd60e51b81526004018080602001828103825260378152602001806132f26037913960400191505060405180910390fd5b82811115611972576040805162461bcd60e51b815260206004820181905260248201527f4e6f7420656e6f75676820746f6b656e7320696e207468652072657365727665604482015290519081900360640190fd5b600254604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b1580156119df57600080fd5b505af1925050508015611a0457506040513d60208110156119ff57600080fd5b505160015b611a55576040805162461bcd60e51b815260206004820152600f60248201527f7472616e73666572206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b503360008181526006602090815260408083209290925581518481529081019290925280517fcada869b31c856a3dd7f3c5037437292c4f2696b79a7bb73a6ffbb126736fee09281900390910190a1505050506001548114611375576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600b5490565b6000805460408051808201909152600681527f30313830303100000000000000000000000000000000000000000000000000006020820152906001600160a01b03163314611b935760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b50600380547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b039485161791829055600280549290941691161790915590565b6000808380825b600186038163ffffffff16101561154157600a54611c0f90610cac85620186a063ffffffff612fab16565b9350611c21838563ffffffff6130d316565b925090820190600101611be4565b60055490565b60005460408051808201909152600681527f30313830303100000000000000000000000000000000000000000000000000006020820152906001600160a01b03163314611cc35760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b50600254604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611d2857600080fd5b505afa158015611d3c573d6000803e3d6000fd5b505050506040513d6020811015611d5257600080fd5b5051600254604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260248201859052915193945091169163a9059cbb916044808201926020929091908290030181600087803b158015611dc557600080fd5b505af1158015611dd9573d6000803e3d6000fd5b505050506040513d6020811015611def57600080fd5b50506001600160a01b038216ff5b6000611e083361315a565b15611e445760405162461bcd60e51b81526004018080602001828103825260228152602001806133296022913960400191505060405180910390fd5b600180548101908190556008543490611e5d9085611bdd565b8114611eb0576040805162461bcd60e51b815260206004820152601860248201527f616d6f756e7420646f206e6f7420636f72726573706f6e640000000000000000604482015290519081900360640190fd5b6001600160a01b0385161580611ecf57506001600160a01b0385163314155b611f0a5760405162461bcd60e51b81526004018080602001828103825260258152602001806132cd6025913960400191505060405180910390fd5b600254604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611f6e57600080fd5b505afa158015611f82573d6000803e3d6000fd5b505050506040513d6020811015611f9857600080fd5b50516007549091508590600090611fb690839063ffffffff612f0a16565b905060008111611ff75760405162461bcd60e51b81526004018080602001828103825260358152602001806132736035913960400191505060405180910390fd5b8281111561204c576040805162461bcd60e51b815260206004820181905260248201527f4e6f7420656e6f75676820746f6b656e7320696e207468652072657365727665604482015290519081900360640190fd5b600254604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b1580156120b957600080fd5b505af19250505080156120de57506040513d60208110156120d957600080fd5b505160015b61212f576040805162461bcd60e51b815260206004820152600f60248201527f7472616e73666572206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b506001600160a01b038816612182576040805183815260208101869052338183015290517fa2a8034590a15fe810e9813d736096c0a03b3236cecb34b5b9f687ed67a6a6249181900360600190a161222e565b60055460009061219d90610cac87606463ffffffff612fab16565b6001600160a01b038a166000908152600660205260409020549091506121c9908263ffffffff6130d316565b6001600160a01b038a1660008181526006602090815260409182902093909355805186815292830188905233838201526060830191909152517f46f017d098ae7f09ad468d6ef84abc20c36313d0e6d3477f6203ad03a874e8589181900360800190a1505b61223787613166565b60019550505050506001548114612295576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b5092915050565b60075490565b60005460408051808201909152600681527f30313830303100000000000000000000000000000000000000000000000000006020820152906001600160a01b031633146123305760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b50600081116123705760405162461bcd60e51b815260040180806020018281038252602881526020018061334b6028913960400191505060405180910390fd5b600254604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815233600482015230602482015290516000926001600160a01b03169163dd62ed3e916044808301926020929190829003018186803b1580156123da57600080fd5b505afa1580156123ee573d6000803e3d6000fd5b505050506040513d602081101561240457600080fd5b505190508181101561245d576040805162461bcd60e51b815260206004820152601960248201527f436865636b2074686520746f6b656e20616c6c6f77616e636500000000000000604482015290519081900360640190fd5b600254604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156124d057600080fd5b505af11580156124e4573d6000803e3d6000fd5b505050506040513d60208110156124fa57600080fd5b50506007547fbb18388c519fe4b4b577b17f416832c870492be5510cdb062b086c0a0025d7889061253290849063ffffffff612fab16565b600054604080519283526001600160a01b0390911660208301528051918290030190a15050565b6004546001600160a01b031633148061257c57506000546001600160a01b031633145b6125b75760405162461bcd60e51b81526004018080602001828103825260328152602001806133736032913960400191505060405180910390fd5b600a55565b60006125c73361315a565b156126035760405162461bcd60e51b81526004018080602001828103825260228152602001806133296022913960400191505060405180910390fd5b60018054810190819055600b546008541015612666576040805162461bcd60e51b815260206004820152601c60248201527f70726963652073686f756c64207265616368207468726573686f6c6400000000604482015290519081900360640190fd5b6000836126a45760405162461bcd60e51b81526004018080602001828103825260258152602001806132a86025913960400191505060405180910390fd5b60006126bb60075486612f0a90919063ffffffff16565b600254604080517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561272557600080fd5b505afa158015612739573d6000803e3d6000fd5b505050506040513d602081101561274f57600080fd5b50519050818110156127925760405162461bcd60e51b815260040180806020018281038252602681526020018061324d6026913960400191505060405180910390fd5b600254604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815233600482015230602482015290516000926001600160a01b03169163dd62ed3e916044808301926020929190829003018186803b1580156127fc57600080fd5b505afa158015612810573d6000803e3d6000fd5b505050506040513d602081101561282657600080fd5b505190508281101561287f576040805162461bcd60e51b815260206004820152601960248201527f436865636b2074686520746f6b656e20616c6c6f77616e636500000000000000604482015290519081900360640190fd5b61288b600954886114ef565b93508347116128e1576040805162461bcd60e51b815260206004820152601260248201527f756e73756666696369656e742066756e64730000000000000000000000000000604482015290519081900360640190fd5b600254604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810186905290516000926001600160a01b0316916323b872dd91606480830192602092919082900301818787803b15801561295357600080fd5b505af192505050801561297857506040513d602081101561297357600080fd5b505160015b6129c9576040805162461bcd60e51b815260206004820152601660248201527f746f6b656e73207472616e73666572206661696c656400000000000000000000604482015290519081900360640190fd5b5060405133908690600081818185875af1925050503d8060008114612a0a576040519150601f19603f3d011682016040523d82523d6000602084013e612a0f565b606091505b50508091505080612a67576040805162461bcd60e51b815260206004820152601060248201527f5472616e73666572206661696c65642e00000000000000000000000000000000604482015290519081900360640190fd5b612a7088613207565b6040805189815260208101879052338183015290517fb047a5353a964554348728cb040330b616a3e706a3a328f71f5640e57a435f209181900360600190a16001965050505050506001548114612b0e576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b50919050565b60005460408051808201909152600681527f30313830303100000000000000000000000000000000000000000000000000006020820152906001600160a01b03163314612ba25760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b5060408051808201909152600681527f303138303032000000000000000000000000000000000000000000000000000060208201526001600160a01b038216612c2c5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b50600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b60005460408051808201909152600681527f30313830303100000000000000000000000000000000000000000000000000006020820152906001600160a01b03163314612d675760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b5080471015612dbd576040805162461bcd60e51b815260206004820152601260248201527f756e73756666696369656e742066756e64730000000000000000000000000000604482015290519081900360640190fd5b6040516000906001600160a01b0384169083908381818185875af1925050503d8060008114612e08576040519150601f19603f3d011682016040523d82523d6000602084013e612e0d565b606091505b50508091505080612e65576040805162461bcd60e51b815260206004820152601060248201527f5472616e73666572206661696c65642e00000000000000000000000000000000604482015290519081900360640190fd5b604080518381526001600160a01b038516602082015281517f8c7cdad0d12a8db3e23561b42da6f10c8137914c97beff202213a410e1f520a3929181900390910190a1505050565b6004546001600160a01b031690565b6004546001600160a01b03163314612f055760405162461bcd60e51b81526004018080602001828103825260298152602001806132246029913960400191505060405180910390fd5b600855565b600082612f1957506000610cd9565b5081810281838281612f2757fe5b04146040518060400160405280600681526020017f3030383030310000000000000000000000000000000000000000000000000000815250906122955760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b60008082116040518060400160405280600681526020017f3030383030330000000000000000000000000000000000000000000000000000815250906130325760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b5081838161303c57fe5b049392505050565b6000828211156040518060400160405280600681526020017f3030383030320000000000000000000000000000000000000000000000000000815250906130cc5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b5050900390565b60408051808201909152600681527f3030383030310000000000000000000000000000000000000000000000000000602082015282820190838210156122955760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b3b63ffffffff16151590565b61317260085482610fc0565b6008556009546131829082610fc0565b6009556008546040805142808252602082019390935281517fff12ff9208e15876b05d323fa2d641784cce0333289906b6ac4de22bdec56f70929181900390910190a160095460408051838152602081019290925280517f21a87bf2289e9717c7c92579154d743191a28bad64673c9b73c114915a84ae2e9281900390910190a15050565b61321360085482610c7e565b6008556009546131829082610c7e56fe6f6e6c79207072696365206d616e616765722063616e2063616c6c20746869732066756e6374696f6e436865636b2074686520746f6b656e2062616c616e6365206f6e20796f75722077616c6c65746e6f7420656e6f75676820657468657220746f2062757920616e79206665617369626c6520616d6f756e74206f6620746f6b656e73596f75206e65656420746f2073656c6c206174206c6561737420736f6d6520746f6b656e73796f752063616e6e6f7420757365207265662e20636f646520666f7220796f757273656c666e6f7420656e6f7567682062616c616e636520746f2062757920616e79206665617369626c6520616d6f756e74206f6620746f6b656e7365787465726e616c20636f6e74726163747320617265206e6f7420616c6c6f776564596f75206e65656420746f206465706f736974206174206c6561737420736f6d6520746f6b656e736f6e6c79206f776e6572206f72207072696365206d616e616765722063616e2063616c6c20746869732066756e6374696f6e596f75206e65656420746f207769746864726177206174206c6561737420736f6d6520746f6b656e73a2646970667358221220102c037189cfae2c31b32ce47263db557a3b36c267ec86bca1834fab756d661164736f6c63430006020033

Deployed Bytecode

0x6080604052600436106102bf5760003560e01c8063ac3807811161016e578063cce7ec13116100cb578063f2fde38b1161007f578063f3fef3a311610064578063f3fef3a3146108c8578063f8a623d314610901578063fc6634b914610916576102c9565b8063f2fde38b14610880578063f3fe3bc3146108b3576102c9565b8063dd49756e116100b0578063dd49756e14610802578063dec0fc5c1461082c578063e4849b3214610856576102c9565b8063cce7ec13146107c1578063db7b69ce146107ed576102c9565b8063be17533511610122578063c7e3865811610107578063c7e3865814610749578063ca5c6e9514610779578063cbf0b0c01461078e576102c9565b8063be175335146106ed578063c29a6fda14610702576102c9565b8063b6b55f2511610153578063b6b55f2514610682578063b85646901461069f578063bc526509146106d8576102c9565b8063ac3807811461063d578063ac8fd1481461066d576102c9565b806355e6663a1161021c578063860d248a116101d05780638df501b4116101b55780638df501b4146105e957806394d212e6146106135780639609f6c714610628576102c9565b8063860d248a1461054a5780638da5cb5b146105d4576102c9565b80636f9fb98a116102015780636f9fb98a146104ed57806374ee9e071461050257806384b8524a14610535576102c9565b806355e6663a146104ae5780636da847f5146104c3576102c9565b8063303b6d08116102735780634c82b3b4116102585780634c82b3b4146104235780634ece90a81461044d57806352b31f1d1461047e576102c9565b8063303b6d08146103e457806343d32e9c1461040e576102c9565b806310a56d5d116102a457806310a56d5d1461034b57806318fdec7e1461037e578063210e200a146103b1576102c9565b806306b091f9146102ce5780630c68987d14610309576102c9565b366102c957600080fd5b600080fd5b3480156102da57600080fd5b50610307600480360360408110156102f157600080fd5b506001600160a01b038135169060200135610940565b005b34801561031557600080fd5b506103396004803603604081101561032c57600080fd5b5080359060200135610c7e565b60408051918252519081900360200190f35b34801561035757600080fd5b506103396004803603602081101561036e57600080fd5b50356001600160a01b0316610cdf565b34801561038a57600080fd5b50610307600480360360208110156103a157600080fd5b50356001600160a01b0316610d81565b3480156103bd57600080fd5b50610339600480360360208110156103d457600080fd5b50356001600160a01b0316610e4a565b3480156103f057600080fd5b506103076004803603602081101561040757600080fd5b5035610eb4565b34801561041a57600080fd5b50610339610f48565b34801561042f57600080fd5b506103076004803603602081101561044657600080fd5b5035610f4e565b34801561045957600080fd5b50610462610fb1565b604080516001600160a01b039092168252519081900360200190f35b34801561048a57600080fd5b50610339600480360360408110156104a157600080fd5b5080359060200135610fc0565b3480156104ba57600080fd5b5061033961100a565b3480156104cf57600080fd5b50610307600480360360208110156104e657600080fd5b503561101d565b3480156104f957600080fd5b5061033961106b565b34801561050e57600080fd5b506103396004803603602081101561052557600080fd5b50356001600160a01b031661106f565b34801561054157600080fd5b5061030761111b565b34801561055657600080fd5b5061055f611378565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610599578181015183820152602001610581565b50505050905090810190601f1680156105c65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156105e057600080fd5b506104626113b1565b3480156105f557600080fd5b506103076004803603602081101561060c57600080fd5b50356113c0565b34801561061f57600080fd5b50610339611454565b34801561063457600080fd5b506103396114e9565b34801561064957600080fd5b506103396004803603604081101561066057600080fd5b50803590602001356114ef565b34801561067957600080fd5b5061033961154b565b6103076004803603602081101561069857600080fd5b5035611551565b3480156106ab57600080fd5b50610307600480360360408110156106c257600080fd5b506001600160a01b038135169060200135611686565b3480156106e457600080fd5b50610307611731565b3480156106f957600080fd5b50610339611afe565b34801561070e57600080fd5b506107356004803603602081101561072557600080fd5b50356001600160a01b0316611b04565b604080519115158252519081900360200190f35b34801561075557600080fd5b506103396004803603604081101561076c57600080fd5b5080359060200135611bdd565b34801561078557600080fd5b50610339611c2f565b34801561079a57600080fd5b50610307600480360360208110156107b157600080fd5b50356001600160a01b0316611c35565b610735600480360360408110156107d757600080fd5b506001600160a01b038135169060200135611dfd565b3480156107f957600080fd5b5061033961229c565b34801561080e57600080fd5b506103076004803603602081101561082557600080fd5b50356122a2565b34801561083857600080fd5b506103076004803603602081101561084f57600080fd5b5035612559565b34801561086257600080fd5b506107356004803603602081101561087957600080fd5b50356125bc565b34801561088c57600080fd5b50610307600480360360208110156108a357600080fd5b50356001600160a01b0316612b14565b3480156108bf57600080fd5b5061055f612ca0565b3480156108d457600080fd5b50610307600480360360408110156108eb57600080fd5b506001600160a01b038135169060200135612cd9565b34801561090d57600080fd5b50610462612ead565b34801561092257600080fd5b506103076004803603602081101561093957600080fd5b5035612ebc565b60005460408051808201909152600681527f30313830303100000000000000000000000000000000000000000000000000006020820152906001600160a01b03163314610a0b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156109d05781810151838201526020016109b8565b50505050905090810190601f1680156109fd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008111610a4b5760405162461bcd60e51b81526004018080602001828103825260298152602001806133a56029913960400191505060405180910390fd5b6000610a6260075483612f0a90919063ffffffff16565b600254604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610acc57600080fd5b505afa158015610ae0573d6000803e3d6000fd5b505050506040513d6020811015610af657600080fd5b5051905081811015610b4f576040805162461bcd60e51b815260206004820152601260248201527f756e73756666696369656e742066756e64730000000000000000000000000000604482015290519081900360640190fd5b600254604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015610bbe57600080fd5b505af1925050508015610be357506040513d6020811015610bde57600080fd5b505160015b610c34576040805162461bcd60e51b815260206004820152601660248201527f746f6b656e73207472616e73666572206661696c656400000000000000000000604482015290519081900360640190fd5b50604080518481526001600160a01b038616602082015281517f0ddddc48b57dd67f8fa2ff05c78034b578c31ef5caa05b03d2ca16feadbbb98f929181900390910190a150505050565b60008083815b848163ffffffff161015610cd457600a54610cb890610cac84620186a063ffffffff612fab16565b9063ffffffff612f0a16565b9250610cca828463ffffffff61304416565b9150600101610c84565b509150505b92915050565b600254604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301523060248301529151600093929092169163dd62ed3e91604480820192602092909190829003018186803b158015610d4f57600080fd5b505afa158015610d63573d6000803e3d6000fd5b505050506040513d6020811015610d7957600080fd5b505192915050565b60005460408051808201909152600681527f30313830303100000000000000000000000000000000000000000000000000006020820152906001600160a01b03163314610e0f5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b50600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600254604080517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152915160009392909216916370a0823191602480820192602092909190829003018186803b158015610d4f57600080fd5b60005460408051808201909152600681527f30313830303100000000000000000000000000000000000000000000000000006020820152906001600160a01b03163314610f425760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b50600755565b60085490565b6004546001600160a01b0316331480610f7157506000546001600160a01b031633145b610fac5760405162461bcd60e51b81526004018080602001828103825260328152602001806133736032913960400191505060405180910390fd5b600b55565b6003546001600160a01b031690565b60008083815b848163ffffffff161015610cd457600a54610fee90610cac84620186a063ffffffff612fab16565b9250611000828463ffffffff6130d316565b9150600101610fc6565b3360009081526006602052604090205490565b6004546001600160a01b031633146110665760405162461bcd60e51b81526004018080602001828103825260298152602001806132246029913960400191505060405180910390fd5b600955565b4790565b6000805460408051808201909152600681527f30313830303100000000000000000000000000000000000000000000000000006020820152906001600160a01b031633146110fe5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b50506001600160a01b031660009081526006602052604090205490565b6111243361315a565b156111605760405162461bcd60e51b81526004018080602001828103825260228152602001806133296022913960400191505060405180910390fd5b60018054810190819055336000908152600660205260409020546111cb576040805162461bcd60e51b815260206004820152600a60248201527f6e6f2062616c616e636500000000000000000000000000000000000000000000604482015290519081900360640190fd5b3360009081526006602052604090205447811115611230576040805162461bcd60e51b815260206004820152601260248201527f756e73756666696369656e742066756e64730000000000000000000000000000604482015290519081900360640190fd5b604051600090339083908381818185875af1925050503d8060008114611272576040519150601f19603f3d011682016040523d82523d6000602084013e611277565b606091505b505080915050806112cf576040805162461bcd60e51b815260206004820152601060248201527f5472616e73666572206661696c65642e00000000000000000000000000000000604482015290519081900360640190fd5b3360008181526006602090815260408083209290925581518581529081019290925280517f8642fc8432d193ca9816939deaf08486dfecde62ca290ef755fa4561932221889281900390910190a150506001548114611375576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b50565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b6000546001600160a01b031681565b60005460408051808201909152600681527f30313830303100000000000000000000000000000000000000000000000000006020820152906001600160a01b0316331461144e5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b50600555565b600254604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156114b857600080fd5b505afa1580156114cc573d6000803e3d6000fd5b505050506040513d60208110156114e257600080fd5b5051905090565b600a5490565b6000808380825b600186038163ffffffff16101561154157600a5461152190610cac85620186a063ffffffff612fab16565b9350611533838563ffffffff61304416565b9250908201906001016114f6565b5095945050505050565b60095490565b60005460408051808201909152600681527f30313830303100000000000000000000000000000000000000000000000000006020820152906001600160a01b031633146115df5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b50348166038d7ea4c68000021461163d576040805162461bcd60e51b815260206004820152601e60248201527f706c656173652070726f766964652076616c756520696e2066696e6e65790000604482015290519081900360640190fd5b600054604080518381526001600160a01b03909216602083015280517feddca56e728ea017cd6a76222db5c5a1a3c95bc755678277f2ed597e027021a59281900390910190a150565b60005460408051808201909152600681527f30313830303100000000000000000000000000000000000000000000000000006020820152906001600160a01b031633146117145760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b506001600160a01b03909116600090815260066020526040902055565b61173a3361315a565b156117765760405162461bcd60e51b81526004018080602001828103825260228152602001806133296022913960400191505060405180910390fd5b60018054810190819055336000908152600660205260409020546117e1576040805162461bcd60e51b815260206004820152600a60248201527f6e6f2062616c616e636500000000000000000000000000000000000000000000604482015290519081900360640190fd5b3360009081526006602090815260408083205460025482517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015292519194936001600160a01b03909116926370a082319260248083019392829003018186803b15801561185457600080fd5b505afa158015611868573d6000803e3d6000fd5b505050506040513d602081101561187e57600080fd5b5051905061189582620186a063ffffffff612f0a16565b915060006118ae60085484612fab90919063ffffffff16565b905060006118c760075483612f0a90919063ffffffff16565b90506118dc81620186a063ffffffff612fab16565b90506000811161191d5760405162461bcd60e51b81526004018080602001828103825260378152602001806132f26037913960400191505060405180910390fd5b82811115611972576040805162461bcd60e51b815260206004820181905260248201527f4e6f7420656e6f75676820746f6b656e7320696e207468652072657365727665604482015290519081900360640190fd5b600254604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b1580156119df57600080fd5b505af1925050508015611a0457506040513d60208110156119ff57600080fd5b505160015b611a55576040805162461bcd60e51b815260206004820152600f60248201527f7472616e73666572206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b503360008181526006602090815260408083209290925581518481529081019290925280517fcada869b31c856a3dd7f3c5037437292c4f2696b79a7bb73a6ffbb126736fee09281900390910190a1505050506001548114611375576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600b5490565b6000805460408051808201909152600681527f30313830303100000000000000000000000000000000000000000000000000006020820152906001600160a01b03163314611b935760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b50600380547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b039485161791829055600280549290941691161790915590565b6000808380825b600186038163ffffffff16101561154157600a54611c0f90610cac85620186a063ffffffff612fab16565b9350611c21838563ffffffff6130d316565b925090820190600101611be4565b60055490565b60005460408051808201909152600681527f30313830303100000000000000000000000000000000000000000000000000006020820152906001600160a01b03163314611cc35760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b50600254604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611d2857600080fd5b505afa158015611d3c573d6000803e3d6000fd5b505050506040513d6020811015611d5257600080fd5b5051600254604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015260248201859052915193945091169163a9059cbb916044808201926020929091908290030181600087803b158015611dc557600080fd5b505af1158015611dd9573d6000803e3d6000fd5b505050506040513d6020811015611def57600080fd5b50506001600160a01b038216ff5b6000611e083361315a565b15611e445760405162461bcd60e51b81526004018080602001828103825260228152602001806133296022913960400191505060405180910390fd5b600180548101908190556008543490611e5d9085611bdd565b8114611eb0576040805162461bcd60e51b815260206004820152601860248201527f616d6f756e7420646f206e6f7420636f72726573706f6e640000000000000000604482015290519081900360640190fd5b6001600160a01b0385161580611ecf57506001600160a01b0385163314155b611f0a5760405162461bcd60e51b81526004018080602001828103825260258152602001806132cd6025913960400191505060405180910390fd5b600254604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611f6e57600080fd5b505afa158015611f82573d6000803e3d6000fd5b505050506040513d6020811015611f9857600080fd5b50516007549091508590600090611fb690839063ffffffff612f0a16565b905060008111611ff75760405162461bcd60e51b81526004018080602001828103825260358152602001806132736035913960400191505060405180910390fd5b8281111561204c576040805162461bcd60e51b815260206004820181905260248201527f4e6f7420656e6f75676820746f6b656e7320696e207468652072657365727665604482015290519081900360640190fd5b600254604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b1580156120b957600080fd5b505af19250505080156120de57506040513d60208110156120d957600080fd5b505160015b61212f576040805162461bcd60e51b815260206004820152600f60248201527f7472616e73666572206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b506001600160a01b038816612182576040805183815260208101869052338183015290517fa2a8034590a15fe810e9813d736096c0a03b3236cecb34b5b9f687ed67a6a6249181900360600190a161222e565b60055460009061219d90610cac87606463ffffffff612fab16565b6001600160a01b038a166000908152600660205260409020549091506121c9908263ffffffff6130d316565b6001600160a01b038a1660008181526006602090815260409182902093909355805186815292830188905233838201526060830191909152517f46f017d098ae7f09ad468d6ef84abc20c36313d0e6d3477f6203ad03a874e8589181900360800190a1505b61223787613166565b60019550505050506001548114612295576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b5092915050565b60075490565b60005460408051808201909152600681527f30313830303100000000000000000000000000000000000000000000000000006020820152906001600160a01b031633146123305760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b50600081116123705760405162461bcd60e51b815260040180806020018281038252602881526020018061334b6028913960400191505060405180910390fd5b600254604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815233600482015230602482015290516000926001600160a01b03169163dd62ed3e916044808301926020929190829003018186803b1580156123da57600080fd5b505afa1580156123ee573d6000803e3d6000fd5b505050506040513d602081101561240457600080fd5b505190508181101561245d576040805162461bcd60e51b815260206004820152601960248201527f436865636b2074686520746f6b656e20616c6c6f77616e636500000000000000604482015290519081900360640190fd5b600254604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156124d057600080fd5b505af11580156124e4573d6000803e3d6000fd5b505050506040513d60208110156124fa57600080fd5b50506007547fbb18388c519fe4b4b577b17f416832c870492be5510cdb062b086c0a0025d7889061253290849063ffffffff612fab16565b600054604080519283526001600160a01b0390911660208301528051918290030190a15050565b6004546001600160a01b031633148061257c57506000546001600160a01b031633145b6125b75760405162461bcd60e51b81526004018080602001828103825260328152602001806133736032913960400191505060405180910390fd5b600a55565b60006125c73361315a565b156126035760405162461bcd60e51b81526004018080602001828103825260228152602001806133296022913960400191505060405180910390fd5b60018054810190819055600b546008541015612666576040805162461bcd60e51b815260206004820152601c60248201527f70726963652073686f756c64207265616368207468726573686f6c6400000000604482015290519081900360640190fd5b6000836126a45760405162461bcd60e51b81526004018080602001828103825260258152602001806132a86025913960400191505060405180910390fd5b60006126bb60075486612f0a90919063ffffffff16565b600254604080517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561272557600080fd5b505afa158015612739573d6000803e3d6000fd5b505050506040513d602081101561274f57600080fd5b50519050818110156127925760405162461bcd60e51b815260040180806020018281038252602681526020018061324d6026913960400191505060405180910390fd5b600254604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815233600482015230602482015290516000926001600160a01b03169163dd62ed3e916044808301926020929190829003018186803b1580156127fc57600080fd5b505afa158015612810573d6000803e3d6000fd5b505050506040513d602081101561282657600080fd5b505190508281101561287f576040805162461bcd60e51b815260206004820152601960248201527f436865636b2074686520746f6b656e20616c6c6f77616e636500000000000000604482015290519081900360640190fd5b61288b600954886114ef565b93508347116128e1576040805162461bcd60e51b815260206004820152601260248201527f756e73756666696369656e742066756e64730000000000000000000000000000604482015290519081900360640190fd5b600254604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810186905290516000926001600160a01b0316916323b872dd91606480830192602092919082900301818787803b15801561295357600080fd5b505af192505050801561297857506040513d602081101561297357600080fd5b505160015b6129c9576040805162461bcd60e51b815260206004820152601660248201527f746f6b656e73207472616e73666572206661696c656400000000000000000000604482015290519081900360640190fd5b5060405133908690600081818185875af1925050503d8060008114612a0a576040519150601f19603f3d011682016040523d82523d6000602084013e612a0f565b606091505b50508091505080612a67576040805162461bcd60e51b815260206004820152601060248201527f5472616e73666572206661696c65642e00000000000000000000000000000000604482015290519081900360640190fd5b612a7088613207565b6040805189815260208101879052338183015290517fb047a5353a964554348728cb040330b616a3e706a3a328f71f5640e57a435f209181900360600190a16001965050505050506001548114612b0e576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b50919050565b60005460408051808201909152600681527f30313830303100000000000000000000000000000000000000000000000000006020820152906001600160a01b03163314612ba25760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b5060408051808201909152600681527f303138303032000000000000000000000000000000000000000000000000000060208201526001600160a01b038216612c2c5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b50600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b60005460408051808201909152600681527f30313830303100000000000000000000000000000000000000000000000000006020820152906001600160a01b03163314612d675760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b5080471015612dbd576040805162461bcd60e51b815260206004820152601260248201527f756e73756666696369656e742066756e64730000000000000000000000000000604482015290519081900360640190fd5b6040516000906001600160a01b0384169083908381818185875af1925050503d8060008114612e08576040519150601f19603f3d011682016040523d82523d6000602084013e612e0d565b606091505b50508091505080612e65576040805162461bcd60e51b815260206004820152601060248201527f5472616e73666572206661696c65642e00000000000000000000000000000000604482015290519081900360640190fd5b604080518381526001600160a01b038516602082015281517f8c7cdad0d12a8db3e23561b42da6f10c8137914c97beff202213a410e1f520a3929181900390910190a1505050565b6004546001600160a01b031690565b6004546001600160a01b03163314612f055760405162461bcd60e51b81526004018080602001828103825260298152602001806132246029913960400191505060405180910390fd5b600855565b600082612f1957506000610cd9565b5081810281838281612f2757fe5b04146040518060400160405280600681526020017f3030383030310000000000000000000000000000000000000000000000000000815250906122955760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b60008082116040518060400160405280600681526020017f3030383030330000000000000000000000000000000000000000000000000000815250906130325760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b5081838161303c57fe5b049392505050565b6000828211156040518060400160405280600681526020017f3030383030320000000000000000000000000000000000000000000000000000815250906130cc5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b5050900390565b60408051808201909152600681527f3030383030310000000000000000000000000000000000000000000000000000602082015282820190838210156122955760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156109d05781810151838201526020016109b8565b3b63ffffffff16151590565b61317260085482610fc0565b6008556009546131829082610fc0565b6009556008546040805142808252602082019390935281517fff12ff9208e15876b05d323fa2d641784cce0333289906b6ac4de22bdec56f70929181900390910190a160095460408051838152602081019290925280517f21a87bf2289e9717c7c92579154d743191a28bad64673c9b73c114915a84ae2e9281900390910190a15050565b61321360085482610c7e565b6008556009546131829082610c7e56fe6f6e6c79207072696365206d616e616765722063616e2063616c6c20746869732066756e6374696f6e436865636b2074686520746f6b656e2062616c616e6365206f6e20796f75722077616c6c65746e6f7420656e6f75676820657468657220746f2062757920616e79206665617369626c6520616d6f756e74206f6620746f6b656e73596f75206e65656420746f2073656c6c206174206c6561737420736f6d6520746f6b656e73796f752063616e6e6f7420757365207265662e20636f646520666f7220796f757273656c666e6f7420656e6f7567682062616c616e636520746f2062757920616e79206665617369626c6520616d6f756e74206f6620746f6b656e7365787465726e616c20636f6e74726163747320617265206e6f7420616c6c6f776564596f75206e65656420746f206465706f736974206174206c6561737420736f6d6520746f6b656e736f6e6c79206f776e6572206f72207072696365206d616e616765722063616e2063616c6c20746869732066756e6374696f6e596f75206e65656420746f207769746864726177206174206c6561737420736f6d6520746f6b656e73a2646970667358221220102c037189cfae2c31b32ce47263db557a3b36c267ec86bca1834fab756d661164736f6c63430006020033

Deployed Bytecode Sourcemap

6602:17468:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15786:8;;;6602:17468;;;;22035:778;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22035:778:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22035:778:0;;;;;;;;:::i;:::-;;10130:408;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10130:408:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10130:408:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23148:143;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23148:143:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23148:143:0;-1:-1:-1;;;;;23148:143:0;;:::i;8952:125::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8952:125:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8952:125:0;-1:-1:-1;;;;;8952:125:0;;:::i;22927:123::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22927:123:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22927:123:0;-1:-1:-1;;;;;22927:123:0;;:::i;12763:118::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12763:118:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12763:118:0;;:::i;13651:92::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13651:92:0;;;:::i;9451:129::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9451:129:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9451:129:0;;:::i;12586:89::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12586:89:0;;;:::i;:::-;;;;-1:-1:-1;;;;;12586:89:0;;;;;;;;;;;;;;9713:405;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9713:405:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9713:405:0;;;;;;;:::i;18697:112::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18697:112:0;;;:::i;13514:125::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13514:125:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13514:125:0;;:::i;17528:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17528:109:0;;;:::i;18125:137::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18125:137:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18125:137:0;-1:-1:-1;;;;;18125:137:0;;:::i;18872:604::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18872:604:0;;;:::i;568:65::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;568:65:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;568:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;688:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;688:20:0;;;:::i;13078:126::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13078:126:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13078:126:0;;:::i;17710:124::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17710:124:0;;;:::i;9349:90::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9349:90:0;;;:::i;11063:501::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11063:501:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11063:501:0;;;;;;;:::i;13755:96::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13755:96:0;;;:::i;21364:228::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21364:228:0;;:::i;18274:132::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18274:132:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;18274:132:0;;;;;;;;:::i;19540:1268::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19540:1268:0;;;:::i;9600:95::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9600:95:0;;;:::i;12386:182::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12386:182:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12386:182:0;-1:-1:-1;;;;;12386:182:0;;:::i;:::-;;;;;;;;;;;;;;;;;;10550:501;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10550:501:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10550:501:0;;;;;;;:::i;13216:100::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13216:100:0;;;:::i;23824:243::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23824:243:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23824:243:0;-1:-1:-1;;;;;23824:243:0;;:::i;13971:1709::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13971:1709:0;;;;;;;;:::i;12893:96::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12893:96:0;;;:::i;21600:419::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21600:419:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21600:419:0;;:::i;9211:118::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9211:118:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9211:118:0;;:::i;15867:1583::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15867:1583:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15867:1583:0;;:::i;1525:238::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1525:238:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1525:238:0;-1:-1:-1;;;;;1525:238:0;;:::i;512:51::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;512:51:0;;;:::i;20946:402::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20946:402:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20946:402:0;;;;;;;;:::i;9099:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9099:94:0;;;:::i;13385:117::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13385:117:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13385:117:0;;:::i;22035:778::-;1318:5;;1325:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1318:5:0;1304:10;:19;1296:47;;;;-1:-1:-1;;;1296:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1296:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22154:1:::1;22138:13;:17;22130:71;;;;-1:-1:-1::0;;;22130:71:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22212:24;22239:31;22257:12;;22239:13;:17;;:31;;;;:::i;:::-;22312:5;::::0;:30:::1;::::0;;;;;22336:4:::1;22312:30;::::0;::::1;::::0;;;22212:58;;-1:-1:-1;22281:28:0::1;::::0;-1:-1:-1;;;;;22312:5:0;;::::1;::::0;:15:::1;::::0;:30;;;;;::::1;::::0;;;;;;;;;:5;:30;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;22312:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22312:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;22312:30:0;;-1:-1:-1;22371:40:0;;::::1;;22363:71;;;::::0;;-1:-1:-1;;;22363:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;22524:5;::::0;:43:::1;::::0;;;;;-1:-1:-1;;;;;22524:43:0;;::::1;;::::0;::::1;::::0;;;;;;;;;:5;;;::::1;::::0;:14:::1;::::0;:43;;;;;::::1;::::0;;;;;;;;:5:::1;::::0;:43;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;22524:43:0;;;;;;;;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;22524:43:0;::::1;;22520:190;;22646:39;::::0;;-1:-1:-1;;;22646:39:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;22520:190;;22764:41;::::0;;;;;-1:-1:-1;;;;;22764:41:0;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;1350:1;;22035:778:::0;;:::o;10130:408::-;10221:7;;10294:13;10221:7;10318:181;10339:10;10335:1;:14;;;10318:181;;;10416:11;;10380:48;;:31;:14;7844:6;10380:31;:18;:31;:::i;:::-;:35;:48;:35;:48;:::i;:::-;10371:57;-1:-1:-1;10461:26:0;:14;10371:57;10461:26;:18;:26;:::i;:::-;10444:43;-1:-1:-1;10351:3:0;;10318:181;;;-1:-1:-1;10516:14:0;-1:-1:-1;;10130:408:0;;;;;:::o;23148:143::-;23244:5;;:38;;;;;;-1:-1:-1;;;;;23244:38:0;;;;;;;23276:4;23244:38;;;;;;23217:7;;23244:5;;;;;:15;;:38;;;;;;;;;;;;;;;:5;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;23244:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23244:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23244:38:0;;23148:143;-1:-1:-1;;23148:143:0:o;8952:125::-;1318:5;;1325:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1318:5:0;1304:10;:19;1296:47;;;;-1:-1:-1;;;1296:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1296:47:0;-1:-1:-1;9038:13:0::1;:31:::0;;;::::1;-1:-1:-1::0;;;;;9038:31:0;;;::::1;::::0;;;::::1;::::0;;8952:125::o;22927:123::-;23019:5;;:23;;;;;;-1:-1:-1;;;;;23019:23:0;;;;;;;;;22993:7;;23019:5;;;;;:15;;:23;;;;;;;;;;;;;;;:5;:23;;;5:2:-1;;;;30:1;27;20:12;12763:118:0;1318:5;;1325:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1318:5:0;1304:10;:19;1296:47;;;;-1:-1:-1;;;1296:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1296:47:0;-1:-1:-1;12842:12:0::1;:31:::0;12763:118::o;13651:92::-;13725:10;;13651:92;:::o;9451:129::-;6961:13;;-1:-1:-1;;;;;6961:13:0;6947:10;:27;;:50;;-1:-1:-1;6992:5:0;;-1:-1:-1;;;;;6992:5:0;6978:10;:19;6947:50;6927:148;;;;-1:-1:-1;;;6927:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9543:14:::1;:29:::0;9451:129::o;12586:89::-;12654:13;;-1:-1:-1;;;;;12654:13:0;12586:89;:::o;9713:405::-;9801:7;;9874:13;9801:7;9898:181;9919:10;9915:1;:14;;;9898:181;;;9996:11;;9960:48;;:31;:14;7844:6;9960:31;:18;:31;:::i;:48::-;9951:57;-1:-1:-1;10041:26:0;:14;9951:57;10041:26;:18;:26;:::i;:::-;10024:43;-1:-1:-1;9931:3:0;;9898:181;;18697:112;18790:10;18750:7;18777:24;;;:12;:24;;;;;;18697:112;:::o;13514:125::-;6769:13;;-1:-1:-1;;;;;6769:13:0;6755:10;:27;6735:116;;;;-1:-1:-1;;;6735:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13600:12:::1;:31:::0;13514:125::o;17528:109::-;17608:21;17528:109;:::o;18125:137::-;18203:7;1318:5;;1325:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1318:5:0;1304:10;:19;1296:47;;;;-1:-1:-1;;;1296:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1296:47:0;-1:-1:-1;;;;;;;18230:24:0::1;;::::0;;;:12:::1;:24;::::0;;;;;;18125:137::o;18872:604::-;23680:22;23691:10;23680;:22::i;:::-;23679:23;23658:107;;;;-1:-1:-1;;;23658:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2552:1:::1;2535:18:::0;;;::::1;::::0;;;;18969:10:::2;2535:13:::1;18956:24:::0;;;:12:::2;:24;::::0;;;;;18948:49:::2;;;::::0;;-1:-1:-1;;;18948:49:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;19047:10;19017:14;19034:24:::0;;;:12:::2;:24;::::0;;;;;19095:21:::2;:31:::0;-1:-1:-1;19095:31:0::2;19087:62;;;::::0;;-1:-1:-1;;;19087:62:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;19257:44;::::0;19169:12:::2;::::0;19266:10:::2;::::0;19290:6;;19169:12;19257:44;19169:12;19257:44;19290:6;19266:10;19257:44:::2;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;19243:58:0;;;;;19320:7;19312:36;;;::::0;;-1:-1:-1;;;19312:36:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;19372:10;19386:1;19359:24:::0;;;:12:::2;:24;::::0;;;;;;;:28;;;;19425:37;;;;;;;::::2;::::0;;;;;;::::2;::::0;;;;;;;;::::2;2611:1;;2647:13:::1;;2631:12;:29;2623:73;;;::::0;;-1:-1:-1;;;2623:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;23778:1;18872:604::o:0;568:65::-;;;;;;;;;;;;;;;;;;;:::o;688:20::-;;;-1:-1:-1;;;;;688:20:0;;:::o;13078:126::-;1318:5;;1325:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1318:5:0;1304:10;:19;1296:47;;;;-1:-1:-1;;;1296:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1296:47:0;-1:-1:-1;13161:14:0::1;:35:::0;13078:126::o;17710:124::-;17796:5;;:30;;;;;;17820:4;17796:30;;;;;;17769:7;;-1:-1:-1;;;;;17796:5:0;;:15;;:30;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;17796:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17796:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17796:30:0;;-1:-1:-1;17710:124:0;:::o;9349:90::-;9420:11;;9349:90;:::o;11063:501::-;11155:7;;11227:13;;11155:7;11298:229;11330:1;11319:10;:12;11315:1;:16;;;11298:229;;;11398:11;;11362:48;;:31;:14;7844:6;11362:31;:18;:31;:::i;:48::-;11353:57;-1:-1:-1;11443:26:0;:14;11353:57;11443:26;:18;:26;:::i;:::-;11426:43;-1:-1:-1;11485:30:0;;;;11333:3;;11298:229;;;-1:-1:-1;11544:12:0;11063:501;-1:-1:-1;;;;;11063:501:0:o;13755:96::-;13831:12;;13755:96;:::o;21364:228::-;1318:5;;1325:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1318:5:0;1304:10;:19;1296:47;;;;-1:-1:-1;;;1296:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1296:47:0;;21483:9:::1;21462:6;21470:8;21462:17;:30;21454:72;;;::::0;;-1:-1:-1;;;21454:72:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;21566:5;::::0;21542:30:::1;::::0;;;;;-1:-1:-1;;;;;21566:5:0;;::::1;21542:30;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;21364:228:::0;:::o;18274:132::-;1318:5;;1325:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1318:5:0;1304:10;:19;1296:47;;;;-1:-1:-1;;;1296:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1296:47:0;-1:-1:-1;;;;;;18364:24:0;;::::1;;::::0;;;:12:::1;:24;::::0;;;;:34;18274:132::o;19540:1268::-;23680:22;23691:10;23680;:22::i;:::-;23679:23;23658:107;;;;-1:-1:-1;;;23658:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2552:1:::1;2535:18:::0;;;::::1;::::0;;;;19638:10:::2;2535:13:::1;19625:24:::0;;;:12:::2;:24;::::0;;;;;19617:49:::2;;;::::0;;-1:-1:-1;;;19617:49:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;19716:10;19686:14;19703:24:::0;;;:12:::2;:24;::::0;;;;;;;;19784:5:::2;::::0;:30;;;;;19808:4:::2;19784:30;::::0;::::2;::::0;;;19703:24;;19686:14;-1:-1:-1;;;;;19784:5:0;;::::2;::::0;:15:::2;::::0;:30;;;;;19703:24;19784:30;;;;;:5;:30;::::2;;5:2:-1::0;::::2;;;30:1;27::::0;20:12:::2;5:2;19784:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;19784:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::2;2:2;-1:-1:::0;19784:30:0;;-1:-1:-1;19969:18:0::2;:6:::0;19980::::2;19969:18;:10;:18;:::i;:::-;19960:27;;20008:21;20032:22;20043:10;;20032:6;:10;;:22;;;;:::i;:::-;20008:46;;20100:26;20129:31;20147:12;;20129:13;:17;;:31;;;;:::i;:::-;20100:60:::0;-1:-1:-1;20257:30:0::2;20100:60:::0;20280:6:::2;20257:30;:22;:30;:::i;:::-;20236:51;;20337:1;20316:18;:22;20308:90;;;;-1:-1:-1::0;;;20308:90:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20439:10;20417:18;:32;;20409:77;;;::::0;;-1:-1:-1;;;20409:77:0;;::::2;;::::0;::::2;::::0;;;;;;;::::2;::::0;;;;;;;;;;;;;::::2;;20517:5;::::0;:46:::2;::::0;;;;;20532:10:::2;20517:46;::::0;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;20517:5:0;;::::2;::::0;:14:::2;::::0;:46;;;;;::::2;::::0;;;;;;;;;:5:::2;::::0;:46;::::2;;5:2:-1::0;::::2;;;30:1;27::::0;20:12:::2;5:2;20517:46:0;;;;;;;;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::2;2:2;-1:-1:::0;20517:46:0;::::2;;20513:286;;20755:32;::::0;;-1:-1:-1;;;20755:32:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;20513:286;-1:-1:-1::0;20630:10:0::2;20644:1;20617:24:::0;;;:12:::2;:24;::::0;;;;;;;:28;;;;20665:50;;;;;;;::::2;::::0;;;;;;::::2;::::0;;;;;;;;::::2;2611:1;;;;2647:13:::1;;2631:12;:29;2623:73;;;::::0;;-1:-1:-1;;;2623:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;9600:95:::0;9673:14;;9600:95;:::o;12386:182::-;12457:4;1318:5;;1325:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1318:5:0;1304:10;:19;1296:47;;;;-1:-1:-1;;;1296:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1296:47:0;-1:-1:-1;12483:13:0::1;:32:::0;;;;;::::1;-1:-1:-1::0;;;;;12483:32:0;;::::1;;::::0;;;;12526:5:::1;:33:::0;;12545:13;;;::::1;12526:33:::0;::::1;;::::0;;;;12386:182::o;10550:501::-;10641:7;;10714:13;;10641:7;10785:229;10817:1;10806:10;:12;10802:1;:16;;;10785:229;;;10885:11;;10849:48;;:31;:14;7844:6;10849:31;:18;:31;:::i;:48::-;10840:57;-1:-1:-1;10930:26:0;:14;10840:57;10930:26;:18;:26;:::i;:::-;10913:43;-1:-1:-1;10972:30:0;;;;10820:3;;10785:229;;13216:100;13294:14;;13216:100;:::o;23824:243::-;1318:5;;1325:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1318:5:0;1304:10;:19;1296:47;;;;-1:-1:-1;;;1296:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1296:47:0;-1:-1:-1;23933:5:0::1;::::0;:30:::1;::::0;;;;;23957:4:::1;23933:30;::::0;::::1;::::0;;;23902:28:::1;::::0;-1:-1:-1;;;;;23933:5:0::1;::::0;:15:::1;::::0;:30;;;;;::::1;::::0;;;;;;;;:5;:30;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;23933:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23933:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;23933:30:0;23974:5:::1;::::0;:49:::1;::::0;;;;;-1:-1:-1;;;;;23974:49:0;;::::1;;::::0;::::1;::::0;;;;;;;;;23933:30;;-1:-1:-1;23974:5:0;::::1;::::0;:14:::1;::::0;:49;;;;;23933:30:::1;::::0;23974:49;;;;;;;;:5:::1;::::0;:49;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;23974:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23974:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;;;;;;;24034:25:0;::::1;;13971:1709:::0;14075:4;23680:22;23691:10;23680;:22::i;:::-;23679:23;23658:107;;;;-1:-1:-1;;;23658:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2552:1:::1;2535:18:::0;;;::::1;::::0;;;;14185:10:::2;::::0;14113:9:::2;::::0;14166:41:::2;::::0;14196:10;14166:18:::2;:41::i;:::-;14152:10;:55;14144:92;;;::::0;;-1:-1:-1;;;14144:92:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;14255:26:0;::::2;::::0;;:54:::2;;-1:-1:-1::0;;;;;;14285:24:0;::::2;14299:10;14285:24;;14255:54;14247:104;;;;-1:-1:-1::0;;;14247:104:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14394:5;::::0;:30:::2;::::0;;;;;14418:4:::2;14394:30;::::0;::::2;::::0;;;14373:18:::2;::::0;-1:-1:-1;;;;;14394:5:0::2;::::0;:15:::2;::::0;:30;;;;;::::2;::::0;;;;;;;;:5;:30;::::2;;5:2:-1::0;::::2;;;30:1;27::::0;20:12:::2;5:2;14394:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;14394:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::2;2:2;-1:-1:::0;14394:30:0;14635:12:::2;::::0;14394:30;;-1:-1:-1;14537:10:0;;14515:19:::2;::::0;14619:29:::2;::::0;14537:10;;14619:29:::2;:15;:29;:::i;:::-;14593:55;;14745:1;14727:15;:19;14719:85;;;;-1:-1:-1::0;;;14719:85:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14842:10;14823:15;:29;;14815:74;;;::::0;;-1:-1:-1;;;14815:74:0;;::::2;;::::0;::::2;::::0;;;;;;;::::2;::::0;;;;;;;;;;;;;::::2;;14930:5;::::0;:43:::2;::::0;;;;;14945:10:::2;14930:43;::::0;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;14930:5:0;;::::2;::::0;:14:::2;::::0;:43;;;;;::::2;::::0;;;;;;;;;:5:::2;::::0;:43;::::2;;5:2:-1::0;::::2;;;30:1;27::::0;20:12:::2;5:2;14930:43:0;;;;;;;;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::2;2:2;-1:-1:::0;14930:43:0;::::2;;14926:651;;15533:32;::::0;;-1:-1:-1;;;15533:32:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;14926:651;-1:-1:-1::0;;;;;;15031:26:0;::::2;15027:405;;15082:43;::::0;;;;;::::2;::::0;::::2;::::0;;;15114:10:::2;15082:43:::0;;;;;;::::2;::::0;;;;;;;::::2;15027:405;;;15211:14;::::0;15166:18:::2;::::0;15187:39:::2;::::0;:19:::2;:10:::0;15202:3:::2;15187:19;:14;:19;:::i;:39::-;-1:-1:-1::0;;;;;15272:24:0;::::2;;::::0;;;:12:::2;:24;::::0;;;;;15166:60;;-1:-1:-1;15272:40:0::2;::::0;15166:60;15272:40:::2;:28;:40;:::i;:::-;-1:-1:-1::0;;;;;15245:24:0;::::2;;::::0;;;:12:::2;:24;::::0;;;;;;;;:67;;;;15354:62;;;;;;;::::2;::::0;;;15393:10:::2;15354:62:::0;;;;;;;;;;;;::::2;::::0;;;;;;;::::2;15027:405;;15446:27;15462:10;15446:15;:27::i;:::-;15495:4;15488:11;;;;;;2647:13:::1;;2631:12;:29;2623:73;;;::::0;;-1:-1:-1;;;2623:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;23778:1;13971:1709:::0;;;;:::o;12893:96::-;12969:12;;12893:96;:::o;21600:419::-;1318:5;;1325:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1318:5:0;1304:10;:19;1296:47;;;;-1:-1:-1;;;1296:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1296:47:0;;21686:1:::1;21677:6;:10;21669:63;;;;-1:-1:-1::0;;;21669:63:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21763:5;::::0;:42:::1;::::0;;;;;21779:10:::1;21763:42;::::0;::::1;::::0;21799:4:::1;21763:42:::0;;;;;;21743:17:::1;::::0;-1:-1:-1;;;;;21763:5:0::1;::::0;:15:::1;::::0;:42;;;;;::::1;::::0;;;;;;;;:5;:42;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;21763:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;21763:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;21763:42:0;;-1:-1:-1;21824:19:0;;::::1;;21816:57;;;::::0;;-1:-1:-1;;;21816:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;21884:5;::::0;:53:::1;::::0;;;;;21903:10:::1;21884:53;::::0;::::1;::::0;21923:4:::1;21884:53:::0;;;;;;;;;;;;-1:-1:-1;;;;;21884:5:0;;::::1;::::0;:18:::1;::::0;:53;;;;;::::1;::::0;;;;;;;;;:5:::1;::::0;:53;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;21884:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;21884:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;;21990:12:0::1;::::0;21963:48:::1;::::0;21979:24:::1;::::0;:6;;:24:::1;:10;:24;:::i;:::-;22005:5;::::0;21963:48:::1;::::0;;;;;-1:-1:-1;;;;;22005:5:0;;::::1;21963:48;::::0;::::1;::::0;;;;;;;;;::::1;1350:1;21600:419:::0;:::o;9211:118::-;6961:13;;-1:-1:-1;;;;;6961:13:0;6947:10;:27;;:50;;-1:-1:-1;6992:5:0;;-1:-1:-1;;;;;6992:5:0;6978:10;:19;6947:50;6927:148;;;;-1:-1:-1;;;6927:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9298:11:::1;:23:::0;9211:118::o;15867:1583::-;15946:4;23680:22;23691:10;23680;:22::i;:::-;23679:23;23658:107;;;;-1:-1:-1;;;23658:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2552:1:::1;2535:18:::0;;;::::1;::::0;;;;15985:14:::2;::::0;15971:10:::2;::::0;:28:::2;;15963:69;;;::::0;;-1:-1:-1;;;15963:69:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;16043:18;16084:17:::0;16076:67:::2;;;;-1:-1:-1::0;;;16076:67:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16154:24;16181:31;16199:12;;16181:13;:17;;:31;;;;:::i;:::-;16253:5;::::0;:27:::2;::::0;;;;;16269:10:::2;16253:27;::::0;::::2;::::0;;;16154:58;;-1:-1:-1;16233:17:0::2;::::0;-1:-1:-1;;;;;16253:5:0;;::::2;::::0;:15:::2;::::0;:27;;;;;::::2;::::0;;;;;;;;;:5;:27;::::2;;5:2:-1::0;::::2;;;30:1;27::::0;20:12:::2;5:2;16253:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;16253:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::2;2:2;-1:-1:::0;16253:27:0;;-1:-1:-1;16299:29:0;;::::2;;16291:80;;;;-1:-1:-1::0;;;16291:80:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16402:5;::::0;:42:::2;::::0;;;;;16418:10:::2;16402:42;::::0;::::2;::::0;16438:4:::2;16402:42:::0;;;;;;16382:17:::2;::::0;-1:-1:-1;;;;;16402:5:0::2;::::0;:15:::2;::::0;:42;;;;;::::2;::::0;;;;;;;;:5;:42;::::2;;5:2:-1::0;::::2;;;30:1;27::::0;20:12:::2;5:2;16402:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;16402:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::2;2:2;-1:-1:::0;16402:42:0;;-1:-1:-1;16463:29:0;;::::2;;16455:67;;;::::0;;-1:-1:-1;;;16455:67:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;16565:47;16585:12;;16598:13;16565:19;:47::i;:::-;16552:60;;16685:10;16661:21;:34;16653:65;;;::::0;;-1:-1:-1;;;16653:65:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;16821:5;::::0;:63:::2;::::0;;;;;16840:10:::2;16821:63;::::0;::::2;::::0;16860:4:::2;16821:63:::0;;;;;;;;;;;;16729:12:::2;::::0;-1:-1:-1;;;;;16821:5:0::2;::::0;:18:::2;::::0;:63;;;;;::::2;::::0;;;;;;;;16729:12;16821:5;:63;::::2;;5:2:-1::0;::::2;;;30:1;27::::0;20:12:::2;5:2;16821:63:0;;;;;;;;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::2;2:2;-1:-1:::0;16821:63:0;::::2;;16817:224;;16963:39;::::0;;-1:-1:-1;;;16963:39:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;16817:224;;17149:37;::::0;:10:::2;::::0;17171;;17149:37:::2;::::0;;;17171:10;17149;:37:::2;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;17135:51:0;;;;;17205:7;17197:36;;;::::0;;-1:-1:-1;;;17197:36:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;17266:31;17283:13;17266:16;:31::i;:::-;17348:43;::::0;;;;;::::2;::::0;::::2;::::0;;;17380:10:::2;17348:43:::0;;;;;;::::2;::::0;;;;;;;::::2;17409:4;17402:11;;;;;;;2647:13:::1;;2631:12;:29;2623:73;;;::::0;;-1:-1:-1;;;2623:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;23778:1;15867:1583:::0;;;:::o;1525:238::-;1318:5;;1325:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1318:5:0;1304:10;:19;1296:47;;;;-1:-1:-1;;;1296:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1296:47:0;-1:-1:-1;1651:31:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;;::::0;::::1;::::0;-1:-1:-1;;;;;1626:23:0;::::1;1618:65;;;::::0;-1:-1:-1;;;1618:65:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;;;;;27:10:-1;;8:100:::1;;90:11:::0;;::::1;84:18:::0;71:11;;::::1;64:39:::0;52:2:::1;45:10;8:100;;1618:65:0;-1:-1:-1::0;1716:5:0::1;::::0;;1695:38:::1;::::0;-1:-1:-1;;;;;1695:38:0;;::::1;::::0;1716:5;::::1;::::0;1695:38:::1;::::0;::::1;1740:5;:17:::0;;;::::1;-1:-1:-1::0;;;;;1740:17:0;;;::::1;::::0;;;::::1;::::0;;1525:238::o;512:51::-;;;;;;;;;;;;;;;;;;;:::o;20946:402::-;1318:5;;1325:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1318:5:0;1304:10;:19;1296:47;;;;-1:-1:-1;;;1296:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1296:47:0;;21067:6:::1;21042:21;:31;;21034:62;;;::::0;;-1:-1:-1;;;21034:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;21195:29;::::0;21107:12:::1;::::0;-1:-1:-1;;;;;21195:11:0;::::1;::::0;21213:6;;21107:12;21195:29;21107:12;21195:29;21213:6;21195:11;:29:::1;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;21181:43:0;;;;;21243:7;21235:36;;;::::0;;-1:-1:-1;;;21235:36:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;21309:25;::::0;;;;;-1:-1:-1;;;;;21309:25:0;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;1350:1;20946:402:::0;;:::o;9099:94::-;9172:13;;-1:-1:-1;;;;;9172:13:0;9099:94;:::o;13385:117::-;6769:13;;-1:-1:-1;;;;;6769:13:0;6755:10;:27;6735:116;;;;-1:-1:-1;;;6735:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13467:10:::1;:27:::0;13385:117::o;3470:485::-;3572:15;3811:13;3807:49;;-1:-1:-1;3847:1:0;3840:8;;3807:49;-1:-1:-1;3874:19:0;;;3885:8;3874;:19;:8;3908:18;;;;;:30;3940:8;;;;;;;;;;;;;;;;;3900:49;;;;;-1:-1:-1;;;3900:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;4188:409:0;4291:16;4412:1;4401:8;:12;4415:16;;;;;;;;;;;;;;;;;4393:39;;;;;-1:-1:-1;;;4393:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;4393:39:0;;4462:8;4450:9;:20;;;;;;;4188:409;-1:-1:-1;;;4188:409:0:o;4836:248::-;4941:18;4994:8;4979:11;:23;;5004:31;;;;;;;;;;;;;;;;;4971:65;;;;;-1:-1:-1;;;4971:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;4971:65:0;-1:-1:-1;;5056:22:0;;;4836:248::o;5237:197::-;5419:8;;;;;;;;;;;;;;;;;5368:19;;;;5402:15;;;;5394:34;;;;-1:-1:-1;;;5394:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;23425:190:0;23547:18;23598:8;;;;;23425:190::o;11587:337::-;11665:39;11681:10;;11693;11665:15;:39::i;:::-;11652:10;:52;11746:12;;11730:41;;11760:10;11730:15;:41::i;:::-;11715:12;:56;11847:10;;11821:37;;;11802:3;11821:37;;;;;;;;;;;;;;;;;;;;;;;11903:12;;11874:42;;;;;;;;;;;;;;;;;;;;;;;;;11587:337;;:::o;11936:342::-;12015:41;12033:10;;12045;12015:17;:41::i;:::-;12002:10;:54;12100:12;;12082:43;;12114:10;12082:17;:43::i

Swarm Source

ipfs://102c037189cfae2c31b32ce47263db557a3b36c267ec86bca1834fab756d6611

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.