Contract 0x28EdA20f663f9b98cf2e227997D321516A143c85

Contract Overview

Balance:
3.2 Ether

Token:
Txn Hash
Method
Block
From
To
Value
0x0209232b55d9544a3026c733e05700c08a8c921d0492e9e7ead13d0f51b6e3aeWithdraw82773012021-03-22 5:59:49471 days 14 hrs ago0x199d3d45ffb7cd778a01a1b360bc70b79460ef40 IN  0x28eda20f663f9b98cf2e227997d321516a143c850 Ether0.000160024
0xb350075cc29f2999dce40bfa1d2fce7fac6a1fbb0701fe7dc28eed3fe768accdWithdraw Token82772892021-03-22 5:56:49471 days 14 hrs ago0x199d3d45ffb7cd778a01a1b360bc70b79460ef40 IN  0x28eda20f663f9b98cf2e227997d321516a143c850 Ether0.000270924
0x15816fc886f110af83453ed7293b647866b2fc42ded243b1b2a738a144918999Trade82772852021-03-22 5:55:49471 days 14 hrs ago0x199d3d45ffb7cd778a01a1b360bc70b79460ef40 IN  0x28eda20f663f9b98cf2e227997d321516a143c850 Ether0.000423234
0x6a82a42a3a8928080f50d78ff76ae47a18a45c7ef35ecd3eb13169f11219fa25Withdraw Token82772782021-03-22 5:54:04471 days 14 hrs ago0x199d3d45ffb7cd778a01a1b360bc70b79460ef40 IN  0x28eda20f663f9b98cf2e227997d321516a143c850 Ether0.000256964
0x7c20fb0f7bd8367bfff67b0ec54f46b98a4adcc50e9fdd3b8ddaa207b63105c3Trade82772752021-03-22 5:53:19471 days 14 hrs ago0x199d3d45ffb7cd778a01a1b360bc70b79460ef40 IN  0x28eda20f663f9b98cf2e227997d321516a143c850 Ether0.000363384
0x21ce6e7dc8b2e3825223470989490ea7dc22593b33f99cf0f28e69f367f025b7Deposit82772692021-03-22 5:51:49471 days 14 hrs ago0x199d3d45ffb7cd778a01a1b360bc70b79460ef40 IN  0x28eda20f663f9b98cf2e227997d321516a143c851 Ether0.000178024
0x117ddead6217728334ebfcbd9269a505168c098770873fb1b312425ddd831543Withdraw Token81046642021-02-20 5:29:09501 days 14 hrs ago0x1edb613d82a6f2558460d58c8992ac42f71434d8 IN  0x28eda20f663f9b98cf2e227997d321516a143c850 Ether0.000196964
0x9326e8535527ce47acd7c5fdbee877e56987312b29bd18c7410a59af7378be92Trade81046482021-02-20 5:25:09501 days 14 hrs ago0x1edb613d82a6f2558460d58c8992ac42f71434d8 IN  0x28eda20f663f9b98cf2e227997d321516a143c850 Ether0.000406584
0x0eb809045229587b9db84e512dc03540a386a5fbd178d515f89b568666b44475Trade80588402021-02-12 6:26:49509 days 13 hrs ago0xc296ffa5a99c664b060bc0ba81631c1399548d2d IN  0x28eda20f663f9b98cf2e227997d321516a143c850 Ether0.000252884
0x02130429a6575a6efbf653fc340786ac5305138ec65595f989d513cb1331ddeeTrade80588242021-02-12 6:22:49509 days 14 hrs ago0xc296ffa5a99c664b060bc0ba81631c1399548d2d IN  0x28eda20f663f9b98cf2e227997d321516a143c850 Ether0.000363424
0xd9dcd5f0301e0cb4acb44cbcc0b7a0693d0fda6c80fa3ba66c24536cc1f25a61Trade80587932021-02-12 6:15:04509 days 14 hrs ago0xe31c30293fa286b9fe97498849cdf261eccf5b8b IN  0x28eda20f663f9b98cf2e227997d321516a143c850 Ether0.000423284
0xba8b1aa3ebeadcd8ed9721de6cece8ff9ab8a044c34a63c1a26b6960bfdb6d8fTrade80587902021-02-12 6:14:19509 days 14 hrs ago0xe31c30293fa286b9fe97498849cdf261eccf5b8b IN  0x28eda20f663f9b98cf2e227997d321516a143c850 Ether0.000483334
0x68ad8a5bbbe6d33f3eb5585662d585af919028ac592411b6e648850842db2be1Deposit80587562021-02-12 6:05:49509 days 14 hrs ago0xc296ffa5a99c664b060bc0ba81631c1399548d2d IN  0x28eda20f663f9b98cf2e227997d321516a143c851 Ether0.000118024
0x426b97636f80f8617c6809e7f0c23156b6e664d19642bc64fcc8354fe1b98b57Deposit80587542021-02-12 6:05:19509 days 14 hrs ago0xc296ffa5a99c664b060bc0ba81631c1399548d2d IN  0x28eda20f663f9b98cf2e227997d321516a143c851 Ether0.000178024
0x02f69c889f909274e8fb3d9e5baa554233c363640dcd586d97cc4ab54995ab2bDeposit80587412021-02-12 6:02:04509 days 14 hrs ago0xe31c30293fa286b9fe97498849cdf261eccf5b8b IN  0x28eda20f663f9b98cf2e227997d321516a143c851 Ether0.000178024
0xb7711bb91753535305a9a3e3cf0d0d6c5d65a92fbc59f94a96f53efafbf664d8Deposit Token80586812021-02-12 5:47:03509 days 14 hrs ago0xe31c30293fa286b9fe97498849cdf261eccf5b8b IN  0x28eda20f663f9b98cf2e227997d321516a143c850 Ether0.000159734
0x140b4b612d0eac59993ee4025302f485559a002dc5cc5d81a0cca2acbb36d55fWithdraw80415492021-02-09 6:23:36512 days 14 hrs ago0x90c17d5d39299419983a5f5332072442fb6e04d6 IN  0x28eda20f663f9b98cf2e227997d321516a143c850 Ether0.000100024
0xa5192ab6fd15ac21ef7d0fc0d66f0df55e04dc4e34e3b2ecaf9be3a1ed9d1db2Deposit80415472021-02-09 6:23:06512 days 14 hrs ago0x90c17d5d39299419983a5f5332072442fb6e04d6 IN  0x28eda20f663f9b98cf2e227997d321516a143c851 Ether0.000178024
0x66d101f463508dd75f342131a142f97bab4f1a130ffa6f03857d1c7793ab7294Deposit Token80351472021-02-08 3:42:27513 days 16 hrs ago0xe31c30293fa286b9fe97498849cdf261eccf5b8b IN  0x28eda20f663f9b98cf2e227997d321516a143c850 Ether0.000285524
0x845325208930f4197181cd615555798a0540ebfcffdb9dd6f0ba87c7d6dfdf5dDeposit Token80338172021-02-07 22:09:35513 days 22 hrs ago0xe31c30293fa286b9fe97498849cdf261eccf5b8b IN  0x28eda20f663f9b98cf2e227997d321516a143c850 Ether0.000279784
0xdf881b69d266c060e3334592e4f98f5de7eec5020535cf5d519691da2e1188d50x6080604080294272021-02-07 3:51:00514 days 16 hrs ago0x1edb613d82a6f2558460d58c8992ac42f71434d8 IN  Create: eMarketDex0 Ether0.003061531
[ Download CSV Export 
Latest 8 internal transactions
Parent Txn Hash Block From To Value
0x0209232b55d9544a3026c733e05700c08a8c921d0492e9e7ead13d0f51b6e3ae82773012021-03-22 5:59:49471 days 14 hrs ago 0x28eda20f663f9b98cf2e227997d321516a143c850x199d3d45ffb7cd778a01a1b360bc70b79460ef400.8 Ether
0xb350075cc29f2999dce40bfa1d2fce7fac6a1fbb0701fe7dc28eed3fe768accd82772892021-03-22 5:56:49471 days 14 hrs ago 0x28eda20f663f9b98cf2e227997d321516a143c85 0x13361dc38fe5fd7328dc239dc360c075de8a837a0 Ether
0x6a82a42a3a8928080f50d78ff76ae47a18a45c7ef35ecd3eb13169f11219fa2582772782021-03-22 5:54:04471 days 14 hrs ago 0x28eda20f663f9b98cf2e227997d321516a143c85 0x74b5f3fe7823c51cc1469aee7d0ae276b189f4c90 Ether
0x117ddead6217728334ebfcbd9269a505168c098770873fb1b312425ddd83154381046642021-02-20 5:29:09501 days 14 hrs ago 0x28eda20f663f9b98cf2e227997d321516a143c85 0x74b5f3fe7823c51cc1469aee7d0ae276b189f4c90 Ether
0xb7711bb91753535305a9a3e3cf0d0d6c5d65a92fbc59f94a96f53efafbf664d880586812021-02-12 5:47:03509 days 14 hrs ago 0x28eda20f663f9b98cf2e227997d321516a143c85 0x74b5f3fe7823c51cc1469aee7d0ae276b189f4c90 Ether
0x140b4b612d0eac59993ee4025302f485559a002dc5cc5d81a0cca2acbb36d55f80415492021-02-09 6:23:36512 days 14 hrs ago 0x28eda20f663f9b98cf2e227997d321516a143c850x90c17d5d39299419983a5f5332072442fb6e04d61 Ether
0x66d101f463508dd75f342131a142f97bab4f1a130ffa6f03857d1c7793ab729480351472021-02-08 3:42:27513 days 16 hrs ago 0x28eda20f663f9b98cf2e227997d321516a143c85 0x13361dc38fe5fd7328dc239dc360c075de8a837a0 Ether
0x845325208930f4197181cd615555798a0540ebfcffdb9dd6f0ba87c7d6dfdf5d80338172021-02-07 22:09:35513 days 22 hrs ago 0x28eda20f663f9b98cf2e227997d321516a143c85 0x74b5f3fe7823c51cc1469aee7d0ae276b189f4c90 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
eMarketDex

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-02-07
*/

/**
 *Submitted for verification at Etherscan.io on 2020-09-11
*/

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

/**
 *Submitted for verification at Etherscan.io on 2020-09-04
*/

/**
 *Submitted for verification at Etherscan.io on 2020-08-27
*/

/**
 *Submitted for verification at Etherscan.io on 2020-06-27
*/

/**
 *Submitted for verification at Etherscan.io on 2019-09-25
*/

pragma solidity 0.5.17;   /*



    ___________________________________________________________________
      _      _                                        ______           
      |  |  /          /                                /              
    --|-/|-/-----__---/----__----__---_--_----__-------/-------__------
      |/ |/    /___) /   /   ' /   ) / /  ) /___)     /      /   )     
    __/__|____(___ _/___(___ _(___/_/_/__/_(___ _____/______(___/__o_o_


    
███████╗███╗░░░███╗░█████╗░██████╗░██╗░░██╗███████╗████████╗  ██████╗░███████╗██╗░░██╗
██╔════╝████╗░████║██╔══██╗██╔══██╗██║░██╔╝██╔════╝╚══██╔══╝  ██╔══██╗██╔════╝╚██╗██╔╝
█████╗░░██╔████╔██║███████║██████╔╝█████═╝░█████╗░░░░░██║░░░  ██║░░██║█████╗░░░╚███╔╝░
██╔══╝░░██║╚██╔╝██║██╔══██║██╔══██╗██╔═██╗░██╔══╝░░░░░██║░░░  ██║░░██║██╔══╝░░░██╔██╗░
███████╗██║░╚═╝░██║██║░░██║██║░░██║██║░╚██╗███████╗░░░██║░░░  ██████╔╝███████╗██╔╝╚██╗
╚══════╝╚═╝░░░░░╚═╝╚═╝░░╚═╝╚═╝░░╚═╝╚═╝░░╚═╝╚══════╝░░░╚═╝░░░  ╚═════╝░╚══════╝╚═╝░░╚═╝

 
------------------------------------------------------------------------------------------------------
 Copyright 2019 eMarket DEX https://eMarket.io
 Contract designed with ❤ by EtherAuthority  ( https://EtherAuthority.io )
------------------------------------------------------------------------------------------------------
*/




//*******************************************************************
//------------------------ SafeMath Library -------------------------
//*******************************************************************
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}


//*******************************************************************//
//------------------ Contract to Manage Ownership -------------------//
//*******************************************************************//
    
contract owned {
    address payable public owner;
    address payable public newOwner;


    event OwnershipTransferred(uint256 curTime, address indexed _from, address indexed _to);

    constructor() public {
        owner = msg.sender;
    }

    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }


    function onlyOwnerTransferOwnership(address payable _newOwner) public onlyOwner {
        newOwner = _newOwner;
    }

    //this flow is to prevent transferring ownership to wrong wallet by mistake
    function acceptOwnership() public {
        require(msg.sender == newOwner);
        emit OwnershipTransferred(now, owner, newOwner);
        owner = newOwner;
        newOwner = address(0);
    }
}

interface ERC20Essential 
{

    function transfer(address _to, uint256 _amount) external returns (bool);
    function transferFrom(address _from, address _to, uint256 _amount) external returns (bool);

}

interface ERC865Essential
{
    function transferPreSigned(address _from, address _to,uint256 _value,uint256 _fee,uint256 _nonce,uint8 v,bytes32 r,bytes32 s) external returns(bool);
    function withdrawPreSigned(address _from, address _to,uint256 _value,uint256 _fee,uint256 _nonce,uint8 v,bytes32 r,bytes32 s) external returns(bool);
}


contract eMarketDex is owned {
  using SafeMath for uint256;
  bool public safeGuard; // To hault all non owner functions in case of imergency - by default false
  address public admin; //the admin address
  address public feeAccount; //the account that will receive fees
  uint public tradingFee = 50; // 50 = 0.5%
  
  mapping (address => mapping (address => uint)) public tokens; //mapping of token addresses to mapping of account balances (token=0 means Ether)
  mapping (address => mapping (bytes32 => bool)) public orders; //mapping of user accounts to mapping of order hashes to booleans (true = submitted by user, equivalent to offchain signature)
  mapping (address => mapping (bytes32 => uint)) public orderFills; //mapping of user accounts to mapping of order hashes to uints (amount of order that has been filled)
  
  event Order(uint256 curTime, address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user);
  event Cancel(uint256 curTime, address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s);
  event Trade(uint256 curTime, address tokenGet, uint amountGet, address tokenGive, uint amountGive, address get, address give, uint256 orderBookID);
  event Deposit(uint256 curTime, address token, address user, uint amount, uint balance);
  event Withdraw(uint256 curTime, address token, address user, uint amount, uint balance);

    event OwnerWithdrawTradingFee(address indexed ownerAddress, uint256 amount);


    constructor() public {
        feeAccount = msg.sender;
    }


    //Calculate percent and return result
    function calculatePercentage(uint256 PercentOf, uint256 percentTo ) internal pure returns (uint256) 
    {
        uint256 factor = 10000;
        require(percentTo <= factor);
        uint256 c = PercentOf.mul(percentTo).div(factor);
        return c;
    }  



    
  // contract without fallback automatically reject incoming ether
  // function() external {  }


  function changeFeeAccount(address feeAccount_) public onlyOwner {
    feeAccount = feeAccount_;
  }

  function changetradingFee(uint tradingFee_) public onlyOwner{
    //require(tradingFee_ <= tradingFee);
    tradingFee = tradingFee_;
  }
  
  function availableTradingFeeOwner() public view returns(uint256){
      //it only holds ether as fee
      return tokens[address(0)][feeAccount];
  }
  
  function withdrawTradingFeeOwner() public onlyOwner returns (string memory){
      uint256 amount = availableTradingFeeOwner();
      require (amount > 0, 'Nothing to withdraw');
      
      tokens[address(0)][feeAccount] = 0;
      
      msg.sender.transfer(amount);
      
      emit OwnerWithdrawTradingFee(owner, amount);
      
  }

  function deposit() public payable {
    tokens[address(0)][msg.sender] = tokens[address(0)][msg.sender].add(msg.value);
    emit Deposit(now, address(0), msg.sender, msg.value, tokens[address(0)][msg.sender]);
  }

  function withdraw(uint amount) public {
    require(!safeGuard,"System Paused by Admin");
    require(tokens[address(0)][msg.sender] >= amount);
    tokens[address(0)][msg.sender] = tokens[address(0)][msg.sender].sub(amount);
    msg.sender.transfer(amount);
    emit Withdraw(now, address(0), msg.sender, amount, tokens[address(0)][msg.sender]);
  }

  function depositToken(address token, uint amount) public {
    //remember to call Token(address).approve(this, amount) or this contract will not be able to do the transfer on your behalf.
    require(token!=address(0));
    require(ERC20Essential(token).transferFrom(msg.sender, address(this), amount));
    tokens[token][msg.sender] = tokens[token][msg.sender].add(amount);
    emit Deposit(now, token, msg.sender, amount, tokens[token][msg.sender]);
  }
	
  function withdrawToken(address token, uint amount) public {
    require(!safeGuard,"System Paused by Admin");
    require(token!=address(0));
    require(tokens[token][msg.sender] >= amount);
    tokens[token][msg.sender] = tokens[token][msg.sender].sub(amount);
	  ERC20Essential(token).transfer(msg.sender, amount);
    emit Withdraw(now, token, msg.sender, amount, tokens[token][msg.sender]);
  }

  function balanceOf(address token, address user) public view returns (uint) {
    return tokens[token][user];
  }

  function order(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce) public {
    bytes32 hash = keccak256(abi.encodePacked(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce));
    orders[msg.sender][hash] = true;
    emit Order(now, tokenGet, amountGet, tokenGive, amountGive, expires, nonce, msg.sender);
  }

  function trade(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s, uint amount, uint256 orderBookID) public {
    require(!safeGuard,"System Paused by Admin");
    //amount is in amountGet terms
    bytes32 hash = keccak256(abi.encodePacked(address(this), tokenGet, amountGet, tokenGive, amountGive, expires, nonce));
    require((
      (orders[user][hash] || ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)),v,r,s) == user) &&
      block.number <= expires &&
      orderFills[user][hash].add(amount) <= amountGet
    ),"Invalid");
    splitTrade(tokenGet, amountGet, tokenGive, amountGive, user, amount, orderBookID);
    orderFills[user][hash] = orderFills[user][hash].add(amount);
    
  }
  
  function splitTrade(address tokenGet, uint amountGet, address tokenGive, uint amountGive, address user, uint amount, uint256 orderBookID) internal {
      
      tradeBalances(tokenGet, amountGet, tokenGive, amountGive, user, amount);
      emit Trade(now, tokenGet, amount, tokenGive, amountGive * amount / amountGet, user, msg.sender, orderBookID);
  }
  

  function tradeBalances(address tokenGet, uint amountGet, address tokenGive, uint amountGive, address user, uint amount) internal {
    
    uint tradingFeeXfer = calculatePercentage(amount,tradingFee);

    tokens[tokenGet][msg.sender] = tokens[tokenGet][msg.sender].sub(amount.add(tradingFeeXfer));
    tokens[tokenGet][user] = tokens[tokenGet][user].add(amount.sub(tradingFeeXfer));
    tokens[address(0)][feeAccount] = tokens[address(0)][feeAccount].add(tradingFeeXfer);

    tokens[tokenGive][user] = tokens[tokenGive][user].sub(amountGive.mul(amount) / amountGet);
    tokens[tokenGive][msg.sender] = tokens[tokenGive][msg.sender].add(amountGive.mul(amount) / amountGet);
  }

  function testTrade(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s, uint amount, address sender) public view returns(bool) {
    
    if (!(
      tokens[tokenGet][sender] >= amount &&
      availableVolume(tokenGet, amountGet, tokenGive, amountGive, expires, nonce, user, v, r, s) >= amount
    )) return false;
    return true;
  }

  function availableVolume(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s) public view returns(uint) {
    bytes32 hash = keccak256(abi.encodePacked(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce));
    uint available1;
    if (!(
      (orders[user][hash] || ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)),v,r,s) == user) &&
      block.number <= expires
    )) return 0;
    available1 = tokens[tokenGive][user].mul(amountGet) / amountGive;
    
    if (amountGet.sub(orderFills[user][hash])<available1) return amountGet.sub(orderFills[user][hash]);
    return available1;
    
  }

  function amountFilled(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user) public view returns(uint) {
    bytes32 hash = keccak256(abi.encodePacked(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce));
    return orderFills[user][hash];
  }

  function cancelOrder(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, uint8 v, bytes32 r, bytes32 s) public {
    require(!safeGuard,"System Paused by Admin");
    bytes32 hash = keccak256(abi.encodePacked(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce));
    require((orders[msg.sender][hash] || ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)),v,r,s) == msg.sender));
    orderFills[msg.sender][hash] = amountGet;
    emit Cancel(now, tokenGet, amountGet, tokenGive, amountGive, expires, nonce, msg.sender, v, r, s);
  }




    /****************************************/
    /* Custom Code for the ERC865 TOKEN */
    /****************************************/

     /* Nonces of transfers performed */
    mapping(bytes32 => bool) transactionHashes;
    

    function transferFromPreSigned(
        address token,
        address _from,
        address _to,
        uint256 _value,
        uint256 _fee,
        uint256 _nonce,
        uint8 v, 
        bytes32 r, 
        bytes32 s
    )
        public
        returns (bool)
    {
        require(_to != address(0));
        bytes32 hashedTx = keccak256(abi.encodePacked('transferFromPreSigned', address(this), _from, _to, _value, _fee, _nonce));
        require(transactionHashes[hashedTx] == false, 'transaction hash is already used');
        address spender = ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hashedTx)),v,r,s);
        require(spender != address(0), 'Invalid _from address');
        require(ERC20Essential(token).transferFrom(_from, _to, _value),"transferfrom fail");
        require(ERC20Essential(token).transferFrom(spender, msg.sender, _fee),"transfer from fee fail");
        transactionHashes[hashedTx] = true;
        return true;
    }
    
    function transferPreSigned(
        address token,
        address _from,
        address _to,
        uint256 _value,
        uint256 _fee,
        uint256 _nonce,
        uint8 v, 
        bytes32 r, 
        bytes32 s
    )
        public
        returns (bool)
    {
        require(_to != address(0));
        bytes32 hashedTx = keccak256(abi.encodePacked('transferFromPreSigned', address(this), _to, _value, _fee, _nonce));
        require(transactionHashes[hashedTx] == false, 'transaction hash is already used');
        address spender = ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hashedTx)),v,r,s);
        require(spender != address(0), 'Invalid _from address');
        require(_from==spender);
        require(ERC20Essential(token).transfer(_to, _value.sub(_fee)),"transferfrom fail");
        require(ERC20Essential(token).transfer( msg.sender, _fee),"transfer from fee fail");
        transactionHashes[hashedTx] = true;
        return true;
    }
     
	    
	    
    function testSender(
        address _to,
        uint256 _value,
        uint256 _fee,
        uint256 _nonce,
        uint8 v, 
        bytes32 r, 
        bytes32 s
    )
        public
        view
        returns (address)
    {
        bytes32 hashedTx = keccak256(abi.encodePacked(address(this), _to, _value, _fee, _nonce));
        return ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hashedTx)),v,r,s);
    }





    /********************************/
    /*  Code for helper functions   */
    /********************************/
      
    //Just in case, owner wants to transfer Ether from contract to owner address
    function manualWithdrawEther()onlyOwner public{
        address(owner).transfer(address(this).balance);
    }
    
    //Just in case, owner wants to transfer Tokens from contract to owner address
    //tokenAmount must be in WEI
    function manualWithdrawTokens(address token, uint256 tokenAmount)onlyOwner public{
        ERC20Essential(token).transfer(msg.sender, tokenAmount);
    }
    
    //selfdestruct function. just in case owner decided to destruct this contract.
    function destructContract()onlyOwner public{
        selfdestruct(owner);
    }
    
    /**
     * Change safeguard status on or off
     *
     * When safeguard is true, then all the non-owner functions will stop working.
     * When safeguard is false, then all the functions will resume working back again!
     */
    function changeSafeguardStatus() onlyOwner public{
        if (safeGuard == false){
            safeGuard = true;
        }
        else{
            safeGuard = false;    
        }
    }

    
    // function getpreSignHash(string memory _messg, address currentcon, address _to, uint _amount, uint fee, uint _nonce)public view returns (bytes32)
    // {
    //     return keccak256(abi.encodePacked(_messg,currentcon,_to,_amount,fee,_nonce));
    // }
    
    // function transferfromPresignedhash(string memory _messg,address _from, address currentcon, address _to, uint _amount, uint fee, uint _nonce)public view returns (bytes32)
    // {
    //     return keccak256(abi.encodePacked(_messg,currentcon,_from, _to,_amount,fee,_nonce));
    // }
    
    // function getpreSignTradeHash(address tokenGet,uint amountGet,address tokenGive,uint amountGive,uint expires,uint nonce, address _from)public view returns (bytes32)
    // {
    //     return keccak256(abi.encodePacked(_from, tokenGet, amountGet, tokenGive, amountGive, expires, nonce));
    // }
    
    function preSignDeposit(address token, uint amount,uint8 v,bytes32 r,bytes32 s, address _from, uint _fee,uint _nonce) public {
        
        require(token!=address(0));
        require(ERC865Essential(token).transferPreSigned(_from, address(this), amount, _fee, _nonce, v, r, s));
        //require(ERC20Essential(token).transfer(msg.sender, _fee));
        tokens[token][_from] = tokens[token][_from].add(amount).sub(_fee);
        emit Deposit(now, token, _from, amount, tokens[token][_from]);
      }
      
      function preSignWithdraw(address token,address _to, uint amount,uint fee,uint8 v,bytes32 r,bytes32 s,uint _nonce ) public  returns(bool){
        
        require(!safeGuard,"System Paused by Admin");
        require(token!=address(0));
        require(tokens[token][_to] >= amount);
    	require(ERC865Essential(token).withdrawPreSigned(address(this),_to, amount, fee, _nonce, v, r, s));
    	tokens[token][_to] = tokens[token][_to].sub(amount).sub(fee);
        emit Withdraw(now, token, _to, amount, tokens[token][_to]);
        return true;
      }
      
function presigntrade(address _from, address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s, uint amount, uint _fee, uint256 orderBookID) public {
    require(!safeGuard,"System Paused by Admin");
    //amount is in amountGet terms
    bytes32 hash = keccak256(abi.encodePacked(address(this), tokenGet, amountGet, tokenGive, amountGive, expires, nonce));
    require(orders[user][hash] || ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)),v,r,s) == user,"invvalid");
    require(block.number <= expires,"Block Expired");
    require(orderFills[user][hash].add(amount) <= amountGet,"invalid amount");
    splitPresignTrade(_from,tokenGet, amountGet, tokenGive, amountGive, user, amount, _fee, orderBookID);
    orderFills[user][hash] = orderFills[user][hash].add(amount);
    //emit Trade(now, tokenGet, amount, tokenGive, amountGive * amount / amountGet, user, _from);
  }
  
  function splitPresignTrade(address _from, address tokenGet, uint amountGet, address tokenGive, uint amountGive, address user, uint amount, uint _fee, uint256 orderBookID) internal {
     
      presigntradeBalances(_from,tokenGet, amountGet, tokenGive, amountGive, user, amount, _fee);
      emit Trade(now, tokenGet, amount, tokenGive, amountGive * amount / amountGet, user, _from, orderBookID);
     
  }

  function presigntradeBalances(address _from, address tokenGet, uint amountGet, address tokenGive, uint amountGive, address user, uint amount, uint _fee) internal {
    
    uint tradingFeeXfer = calculatePercentage(amount,tradingFee);

    tokens[tokenGet][_from] = tokens[tokenGet][_from].sub(amount.add(tradingFeeXfer));
    tokens[tokenGet][user] = tokens[tokenGet][user].add(amount.sub(tradingFeeXfer));
    tokens[address(0)][feeAccount] = tokens[address(0)][feeAccount].add(tradingFeeXfer);

    tokens[tokenGive][user] = tokens[tokenGive][user].sub(amountGive.mul(amount) / amountGet);
    tokens[tokenGive][_from] = tokens[tokenGive][_from].add(amountGive.mul(amount) / amountGet).sub(_fee);
    tokens[tokenGive][msg.sender] = tokens[tokenGive][msg.sender].add(_fee);
   
  }
  




}

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"curTime","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenGet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountGet","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenGive","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountGive","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"expires","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint8","name":"v","type":"uint8"},{"indexed":false,"internalType":"bytes32","name":"r","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"Cancel","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"curTime","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"curTime","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenGet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountGet","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenGive","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountGive","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"expires","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"user","type":"address"}],"name":"Order","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"ownerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OwnerWithdrawTradingFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"curTime","type":"uint256"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"curTime","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenGet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountGet","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenGive","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountGive","type":"uint256"},{"indexed":false,"internalType":"address","name":"get","type":"address"},{"indexed":false,"internalType":"address","name":"give","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderBookID","type":"uint256"}],"name":"Trade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"curTime","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"Withdraw","type":"event"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenGet","type":"address"},{"internalType":"uint256","name":"amountGet","type":"uint256"},{"internalType":"address","name":"tokenGive","type":"address"},{"internalType":"uint256","name":"amountGive","type":"uint256"},{"internalType":"uint256","name":"expires","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"amountFilled","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"availableTradingFeeOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenGet","type":"address"},{"internalType":"uint256","name":"amountGet","type":"uint256"},{"internalType":"address","name":"tokenGive","type":"address"},{"internalType":"uint256","name":"amountGive","type":"uint256"},{"internalType":"uint256","name":"expires","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"availableVolume","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"user","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenGet","type":"address"},{"internalType":"uint256","name":"amountGet","type":"uint256"},{"internalType":"address","name":"tokenGive","type":"address"},{"internalType":"uint256","name":"amountGive","type":"uint256"},{"internalType":"uint256","name":"expires","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"cancelOrder","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"feeAccount_","type":"address"}],"name":"changeFeeAccount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"changeSafeguardStatus","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tradingFee_","type":"uint256"}],"name":"changetradingFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"deposit","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"destructContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"feeAccount","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"manualWithdrawEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"manualWithdrawTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"newOwner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_newOwner","type":"address"}],"name":"onlyOwnerTransferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenGet","type":"address"},{"internalType":"uint256","name":"amountGet","type":"uint256"},{"internalType":"address","name":"tokenGive","type":"address"},{"internalType":"uint256","name":"amountGive","type":"uint256"},{"internalType":"uint256","name":"expires","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"order","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"orderFills","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"orders","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"preSignDeposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"preSignWithdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"tokenGet","type":"address"},{"internalType":"uint256","name":"amountGet","type":"uint256"},{"internalType":"address","name":"tokenGive","type":"address"},{"internalType":"uint256","name":"amountGive","type":"uint256"},{"internalType":"uint256","name":"expires","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"orderBookID","type":"uint256"}],"name":"presigntrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"safeGuard","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"testSender","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenGet","type":"address"},{"internalType":"uint256","name":"amountGet","type":"uint256"},{"internalType":"address","name":"tokenGive","type":"address"},{"internalType":"uint256","name":"amountGive","type":"uint256"},{"internalType":"uint256","name":"expires","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"sender","type":"address"}],"name":"testTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"tokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenGet","type":"address"},{"internalType":"uint256","name":"amountGet","type":"uint256"},{"internalType":"address","name":"tokenGive","type":"address"},{"internalType":"uint256","name":"amountGive","type":"uint256"},{"internalType":"uint256","name":"expires","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"orderBookID","type":"uint256"}],"name":"trade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tradingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"transferFromPreSigned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"transferPreSigned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawTradingFeeOwner","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

6080604052603260045534801561001557600080fd5b5060008054336001600160a01b0319918216811783556003805490921617905561354b90819061004590396000f3fe60806040526004361061020e5760003560e01c806379279fd111610118578063d0e30db0116100a0578063f7888aec1161006f578063f7888aec14610996578063f851a440146109d1578063f95b1325146109e6578063f96b05d614610a70578063fb6e155f14610aca5761020e565b8063d0e30db0146108a1578063d4ee1d90146108a9578063eb3941cc146108be578063eba3477a1461092a5761020e565b80639e281a98116100e75780639e281a9814610754578063bb5f46291461078d578063c4042133146107c6578063c5d9a28f14610859578063cc9c18071461088c5761020e565b806379279fd11461070057806379ba5097146107155780638da5cb5b1461072a5780639499e0181461073f5761020e565b80634bec83351161019b5780635954c8c51161016a5780635954c8c51461058357806362bbb2081461059857806365e17c9d146106195780636c86888b1461064a57806371ffcb16146106cd5761020e565b80634bec8335146104a5578063508493bc146104ba57806356f43352146104f5578063590bab2e1461050a5761020e565b806319774d43116101e257806319774d4314610330578063278b8c0e1461037b5780632d804ca2146103e55780632e1a7d4d14610442578063338b5dea1461046c5761020e565b8062649cb61461021357806303d196371461027a57806304e4c741146102a45780630b927666146102dd575b600080fd5b34801561021f57600080fd5b50610278600480360361010081101561023757600080fd5b506001600160a01b03813581169160208101359160ff6040830135169160608101359160808201359160a08101359091169060c08101359060e00135610b3d565b005b34801561028657600080fd5b506102786004803603602081101561029d57600080fd5b5035610ccf565b3480156102b057600080fd5b50610278600480360360408110156102c757600080fd5b506001600160a01b038135169060200135610ceb565b3480156102e957600080fd5b50610278600480360360c081101561030057600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060808101359060a00135610d81565b34801561033c57600080fd5b506103696004803603604081101561035357600080fd5b506001600160a01b038135169060200135610e87565b60408051918252519081900360200190f35b34801561038757600080fd5b50610278600480360361012081101561039f57600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060808101359060a08101359060ff60c0820135169060e0810135906101000135610ea4565b3480156103f157600080fd5b50610369600480360360e081101561040857600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359160808201359160a08101359160c090910135166110da565b34801561044e57600080fd5b506102786004803603602081101561046557600080fd5b503561116b565b34801561047857600080fd5b506102786004803603604081101561048f57600080fd5b506001600160a01b0381351690602001356112cb565b3480156104b157600080fd5b50610278611416565b3480156104c657600080fd5b50610369600480360360408110156104dd57600080fd5b506001600160a01b0381358116916020013516611466565b34801561050157600080fd5b50610369611483565b34801561051657600080fd5b5061056f600480360361010081101561052e57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c08101359060e00135611489565b604080519115158252519081900360200190f35b34801561058f57600080fd5b50610278611696565b3480156105a457600080fd5b5061027860048036036101808110156105bc57600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359160808201359160a08101359160c0820135169060ff60e0820135169061010081013590610120810135906101408101359061016001356116ea565b34801561062557600080fd5b5061062e6119c7565b604080516001600160a01b039092168252519081900360200190f35b34801561065657600080fd5b5061056f600480360361018081101561066e57600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359160808201359160a08101359160c082013581169160ff60e082013516916101008201359161012081013591610140820135916101600135166119d6565b3480156106d957600080fd5b50610278600480360360208110156106f057600080fd5b50356001600160a01b0316611a3e565b34801561070c57600080fd5b5061056f611a77565b34801561072157600080fd5b50610278611a87565b34801561073657600080fd5b5061062e611b0f565b34801561074b57600080fd5b50610278611b1e565b34801561076057600080fd5b506102786004803603604081101561077757600080fd5b506001600160a01b038135169060200135611b43565b34801561079957600080fd5b5061056f600480360360408110156107b057600080fd5b506001600160a01b038135169060200135611d16565b3480156107d257600080fd5b5061027860048036036101c08110156107ea57600080fd5b506001600160a01b0381358116916020810135821691604082013591606081013582169160808201359160a08101359160c08201359160e08101359091169060ff6101008201351690610120810135906101408101359061016081013590610180810135906101a00135611d36565b34801561086557600080fd5b506102786004803603602081101561087c57600080fd5b50356001600160a01b031661208b565b34801561089857600080fd5b506103696120c4565b6102786120ef565b3480156108b557600080fd5b5061062e61218d565b3480156108ca57600080fd5b5061056f60048036036101208110156108e257600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060808101359060a08101359060ff60c0820135169060e081013590610100013561219c565b34801561093657600080fd5b5061056f600480360361012081101561094e57600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060808101359060a08101359060ff60c0820135169060e0810135906101000135612549565b3480156109a257600080fd5b50610369600480360360408110156109b957600080fd5b506001600160a01b0381358116916020013516612871565b3480156109dd57600080fd5b5061062e61289e565b3480156109f257600080fd5b506109fb6128ad565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610a35578181015183820152602001610a1d565b50505050905090810190601f168015610a625780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610a7c57600080fd5b5061062e600480360360e0811015610a9357600080fd5b506001600160a01b038135169060208101359060408101359060608101359060ff6080820135169060a08101359060c001356129b9565b348015610ad657600080fd5b506103696004803603610140811015610aee57600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359160808201359160a08101359160c0820135169060ff60e08201351690610100810135906101200135612ab5565b6001600160a01b038816610b5057600080fd5b6040805163747cab3360e11b81526001600160a01b038581166004830152306024830152604482018a9052606482018590526084820184905260ff891660a483015260c4820188905260e482018790529151918a169163e8f9566691610104808201926020929091908290030181600087803b158015610bcf57600080fd5b505af1158015610be3573d6000803e3d6000fd5b505050506040513d6020811015610bf957600080fd5b5051610c0457600080fd5b6001600160a01b03808916600090815260056020908152604080832093871683529290522054610c4c908390610c40908a63ffffffff612ce616565b9063ffffffff612d4716565b6001600160a01b0389811660008181526005602090815260408083209489168084529482529182902085905581514281529081019290925281810192909252606081018a90526080810192909252517feb65d0f36862bbd8763c5e2c983c9d753267d223eee35a224d8d0a9d7ef433a29181900360a00190a15050505050505050565b6000546001600160a01b03163314610ce657600080fd5b600455565b6000546001600160a01b03163314610d0257600080fd5b6040805163a9059cbb60e01b81523360048201526024810183905290516001600160a01b0384169163a9059cbb9160448083019260209291908290030181600087803b158015610d5157600080fd5b505af1158015610d65573d6000803e3d6000fd5b505050506040513d6020811015610d7b57600080fd5b50505050565b6040805130606090811b6020808401919091526001600160601b03198a831b81166034850152604884018a90529188901b9091166068830152607c8201869052609c820185905260bc8083018590528351808403909101815260dc83018085528151918301919091203360008181526006855286812083825290945292859020805460ff19166001179055429091526001600160a01b03808b1660fc85015261011c84018a9052881661013c84015261015c830187905261017c830186905261019c83018590526101bc83019190915291517f5d4e2e93cb30c11a5ef49975ca501a4adc79af355f3ae0ad88d0c4d27a27a6a9918190036101dc0190a150505050505050565b600760209081526000928352604080842090915290825290205481565b600154600160a01b900460ff1615610ef1576040805162461bcd60e51b815260206004820152601660248201526000805160206134f7833981519152604482015290519081900360640190fd5b6040805130606090811b6020808401919091526001600160601b03198d831b81166034850152604884018d9052918b901b9091166068830152607c8201899052609c820188905260bc8083018890528351808403909101815260dc9092018352815191810191909120336000908152600683528381208282529092529190205460ff168061101f575060408051600080516020613496833981519152602080830191909152603c80830185905283518084039091018152605c83018085528151918301919091206000909152607c83018085525260ff8716609c83015260bc820186905260dc82018590529151339260019260fc80820193601f1981019281900390910190855afa15801561100a573d6000803e3d6000fd5b505050602060405103516001600160a01b0316145b61102857600080fd5b3360008181526007602090815260408083208584528252918290208c905581514281526001600160a01b038e8116928201929092528083018d9052908b166060820152608081018a905260a0810189905260c0810188905260e081019290925260ff861661010083015261012082018590526101408201849052517fc46ed0e85bc35bcaec73fbbd1bc0bce5d9eef397e24db51ae1bffd9ed238a7c3918190036101600190a150505050505050505050565b6040805130606090811b6020808401919091526001600160601b03198b831b81166034850152604884018b90529189901b9091166068830152607c8201879052609c820186905260bc8083018690528351808403909101815260dc90920183528151918101919091206001600160a01b03841660009081526007835283812091815291522054979650505050505050565b600154600160a01b900460ff16156111b8576040805162461bcd60e51b815260206004820152601660248201526000805160206134f7833981519152604482015290519081900360640190fd5b3360009081526000805160206134d783398151915260205260409020548111156111e157600080fd5b3360009081526000805160206134d7833981519152602052604090205461120e908263ffffffff612d4716565b3360008181526000805160206134d78339815191526020526040808220939093559151909183156108fc02918491818181858888f19350505050158015611259573d6000803e3d6000fd5b503360008181526000805160206134d783398151915260209081526040808320548151428152928301939093528181019390935260608101849052608081019190915290517ffe7813e2866053d5c3938554e517b554fce6666a6561bed9eaa7419b29fa9b689181900360a00190a150565b6001600160a01b0382166112de57600080fd5b604080516323b872dd60e01b81523360048201523060248201526044810183905290516001600160a01b038416916323b872dd9160648083019260209291908290030181600087803b15801561133357600080fd5b505af1158015611347573d6000803e3d6000fd5b505050506040513d602081101561135d57600080fd5b505161136857600080fd5b6001600160a01b038216600090815260056020908152604080832033845290915290205461139c908263ffffffff612ce616565b6001600160a01b0383166000818152600560209081526040808320338085529083529281902085905580514281529182019390935280830191909152606081018490526080810192909252517feb65d0f36862bbd8763c5e2c983c9d753267d223eee35a224d8d0a9d7ef433a29181900360a00190a15050565b6000546001600160a01b0316331461142d57600080fd5b600154600160a01b900460ff16611456576001805460ff60a01b1916600160a01b179055611464565b6001805460ff60a01b191690555b565b600560209081526000928352604080842090915290825290205481565b60045481565b600154600090600160a01b900460ff16156114d9576040805162461bcd60e51b815260206004820152601660248201526000805160206134f7833981519152604482015290519081900360640190fd5b6001600160a01b0389166114ec57600080fd5b6001600160a01b03808a166000908152600560209081526040808320938c168352929052205487111561151e57600080fd5b6040805163ac19767d60e01b81523060048201526001600160a01b038a81166024830152604482018a9052606482018990526084820185905260ff881660a483015260c4820187905260e482018690529151918b169163ac19767d91610104808201926020929091908290030181600087803b15801561159d57600080fd5b505af11580156115b1573d6000803e3d6000fd5b505050506040513d60208110156115c757600080fd5b50516115d257600080fd5b6001600160a01b03808a166000908152600560209081526040808320938c168352929052205461160e908790610c40908a63ffffffff612d4716565b6001600160a01b038a81166000818152600560209081526040808320948e168084529482529182902085905581514281529081019290925281810192909252606081018a90526080810192909252517ffe7813e2866053d5c3938554e517b554fce6666a6561bed9eaa7419b29fa9b689181900360a00190a150600198975050505050505050565b6000546001600160a01b031633146116ad57600080fd5b600080546040516001600160a01b03909116914780156108fc02929091818181858888f193505050501580156116e7573d6000803e3d6000fd5b50565b600154600160a01b900460ff1615611737576040805162461bcd60e51b815260206004820152601660248201526000805160206134f7833981519152604482015290519081900360640190fd5b6000308d8d8d8d8d8d60405160200180886001600160a01b03166001600160a01b031660601b8152601401876001600160a01b03166001600160a01b031660601b8152601401868152602001856001600160a01b03166001600160a01b031660601b815260140184815260200183815260200182815260200197505050505050505060405160208183030381529060405280519060200120905060066000886001600160a01b03166001600160a01b03168152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff16806118c9575060408051600080516020613496833981519152602080830191909152603c80830185905283518084039091018152605c83018085528151918301919091206000909152607c83018085525260ff8916609c83015260bc820188905260dc820187905291516001600160a01b038a169260019260fc80820193601f1981019281900390910190855afa1580156118b4573d6000803e3d6000fd5b505050602060405103516001600160a01b0316145b80156118d55750884311155b801561191557506001600160a01b03871660009081526007602090815260408083208484529091529020548c90611912908563ffffffff612ce616565b11155b611950576040805162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b604482015290519081900360640190fd5b61195f8d8d8d8d8b8888612da4565b6001600160a01b0387166000908152600760209081526040808320848452909152902054611993908463ffffffff612ce616565b6001600160a01b03909716600090815260076020908152604080832093835292905220959095555050505050505050505050565b6003546001600160a01b031681565b6001600160a01b03808d1660009081526005602090815260408083209385168352929052908120548311801590611a1e575082611a1b8e8e8e8e8e8e8e8e8e8e612ab5565b10155b611a2a57506000611a2e565b5060015b9c9b505050505050505050505050565b6000546001600160a01b03163314611a5557600080fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600154600160a01b900460ff1681565b6001546001600160a01b03163314611a9e57600080fd5b6001546000546040805142815290516001600160a01b039384169392909216917f16b85f49bf01212961345d3016c9a531894accf62eb7680f2045d79185cc0ec09181900360200190a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000546001600160a01b031681565b6000546001600160a01b03163314611b3557600080fd5b6000546001600160a01b0316ff5b600154600160a01b900460ff1615611b90576040805162461bcd60e51b815260206004820152601660248201526000805160206134f7833981519152604482015290519081900360640190fd5b6001600160a01b038216611ba357600080fd5b6001600160a01b0382166000908152600560209081526040808320338452909152902054811115611bd357600080fd5b6001600160a01b0382166000908152600560209081526040808320338452909152902054611c07908263ffffffff612d4716565b6001600160a01b03831660008181526005602090815260408083203380855290835281842095909555805163a9059cbb60e01b815260048101959095526024850186905251929363a9059cbb9360448083019491928390030190829087803b158015611c7257600080fd5b505af1158015611c86573d6000803e3d6000fd5b505050506040513d6020811015611c9c57600080fd5b50506001600160a01b038216600081815260056020908152604080832033808552908352928190205481514281529283019490945281810192909252606081018490526080810192909252517ffe7813e2866053d5c3938554e517b554fce6666a6561bed9eaa7419b29fa9b689181900360a00190a15050565b600660209081526000928352604080842090915290825290205460ff1681565b600154600160a01b900460ff1615611d83576040805162461bcd60e51b815260206004820152601660248201526000805160206134f7833981519152604482015290519081900360640190fd5b6000308e8e8e8e8e8e60405160200180886001600160a01b03166001600160a01b031660601b8152601401876001600160a01b03166001600160a01b031660601b8152601401868152602001856001600160a01b03166001600160a01b031660601b815260140184815260200183815260200182815260200197505050505050505060405160208183030381529060405280519060200120905060066000896001600160a01b03166001600160a01b03168152602001908152602001600020600082815260200190815260200160002060009054906101000a900460ff1680611f15575060408051600080516020613496833981519152602080830191909152603c80830185905283518084039091018152605c83018085528151918301919091206000909152607c83018085525260ff8a16609c83015260bc820189905260dc820188905291516001600160a01b038b169260019260fc80820193601f1981019281900390910190855afa158015611f00573d6000803e3d6000fd5b505050602060405103516001600160a01b0316145b611f51576040805162461bcd60e51b81526020600482015260086024820152671a5b9d9d985b1a5960c21b604482015290519081900360640190fd5b89431115611f96576040805162461bcd60e51b815260206004820152600d60248201526c109b1bd8dac8115e1c1a5c9959609a1b604482015290519081900360640190fd5b6001600160a01b03881660009081526007602090815260408083208484529091529020548d90611fcc908663ffffffff612ce616565b1115612010576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b6120218f8f8f8f8f8d8a8a8a612e38565b6001600160a01b0388166000908152600760209081526040808320848452909152902054612055908563ffffffff612ce616565b6001600160a01b039098166000908152600760209081526040808320938352929052209690965550505050505050505050505050565b6000546001600160a01b031633146120a257600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b031660009081526000805160206134d7833981519152602052604090205490565b3360009081526000805160206134d7833981519152602052604090205461211c903463ffffffff612ce616565b3360008181526000805160206134d78339815191526020908152604080832085905580514281529182019290925280820192909252346060830152608082019290925290517feb65d0f36862bbd8763c5e2c983c9d753267d223eee35a224d8d0a9d7ef433a29181900360a00190a1565b6001546001600160a01b031681565b60006001600160a01b0388166121b157600080fd5b60408051741d1c985b9cd9995c919c9bdb541c9954da59db9959605a1b60208083019190915230606090811b60358401526001600160601b03198d821b81166049850152908c901b16605d830152607182018a90526091820189905260b18083018990528351808403909101815260d19092018352815191810191909120600081815260089092529190205460ff1615612292576040805162461bcd60e51b815260206004820181905260248201527f7472616e73616374696f6e206861736820697320616c72656164792075736564604482015290519081900360640190fd5b60408051600080516020613496833981519152602080830191909152603c80830185905283518084039091018152605c8301808552815191830191909120600091829052607c84018086525260ff8916609c84015260bc830188905260dc8301879052925160019260fc8082019392601f1981019281900390910190855afa158015612322573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612382576040805162461bcd60e51b8152602060048201526015602482015274496e76616c6964205f66726f6d206164647265737360581b604482015290519081900360640190fd5b604080516323b872dd60e01b81526001600160a01b038d811660048301528c81166024830152604482018c90529151918e16916323b872dd916064808201926020929091908290030181600087803b1580156123dd57600080fd5b505af11580156123f1573d6000803e3d6000fd5b505050506040513d602081101561240757600080fd5b505161244e576040805162461bcd60e51b81526020600482015260116024820152701d1c985b9cd9995c999c9bdb4819985a5b607a1b604482015290519081900360640190fd5b604080516323b872dd60e01b81526001600160a01b038381166004830152336024830152604482018b90529151918e16916323b872dd916064808201926020929091908290030181600087803b1580156124a757600080fd5b505af11580156124bb573d6000803e3d6000fd5b505050506040513d60208110156124d157600080fd5b505161251d576040805162461bcd60e51b81526020600482015260166024820152751d1c985b9cd9995c88199c9bdb481999594819985a5b60521b604482015290519081900360640190fd5b506000908152600860205260409020805460ff1916600190811790915590509998505050505050505050565b60006001600160a01b03881661255e57600080fd5b60408051741d1c985b9cd9995c919c9bdb541c9954da59db9959605a1b60208083019190915230606090811b60358401528b901b6001600160601b0319166049830152605d82018a9052607d8201899052609d8083018990528351808403909101815260bd9092018352815191810191909120600081815260089092529190205460ff1615612634576040805162461bcd60e51b815260206004820181905260248201527f7472616e73616374696f6e206861736820697320616c72656164792075736564604482015290519081900360640190fd5b60408051600080516020613496833981519152602080830191909152603c80830185905283518084039091018152605c8301808552815191830191909120600091829052607c84018086525260ff8916609c84015260bc830188905260dc8301879052925160019260fc8082019392601f1981019281900390910190855afa1580156126c4573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612724576040805162461bcd60e51b8152602060048201526015602482015274496e76616c6964205f66726f6d206164647265737360581b604482015290519081900360640190fd5b806001600160a01b03168b6001600160a01b03161461274257600080fd5b6001600160a01b038c1663a9059cbb8b6127628c8c63ffffffff612d4716565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156127b157600080fd5b505af11580156127c5573d6000803e3d6000fd5b505050506040513d60208110156127db57600080fd5b5051612822576040805162461bcd60e51b81526020600482015260116024820152701d1c985b9cd9995c999c9bdb4819985a5b607a1b604482015290519081900360640190fd5b6040805163a9059cbb60e01b8152336004820152602481018a905290516001600160a01b038e169163a9059cbb9160448083019260209291908290030181600087803b1580156124a757600080fd5b6001600160a01b038083166000908152600560209081526040808320938516835292905220545b92915050565b6002546001600160a01b031681565b6000546060906001600160a01b031633146128c757600080fd5b60006128d16120c4565b90506000811161291e576040805162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b604482015290519081900360640190fd5b6003546001600160a01b031660009081526000805160206134d7833981519152602052604080822082905551339183156108fc02918491818181858888f19350505050158015612972573d6000803e3d6000fd5b506000546040805183815290516001600160a01b03909216917fad8a10b8218c5c9db36608f71b7288c2041ebaee2aa86d946d6ea50c047558369181900360200190a25090565b6040805130606090811b602080840191909152908a901b6001600160601b0319166034830152604882018990526068820188905260888083018890528351808403909101815260a88301845280519082012060008051602061349683398151915260c884015260e480840182905284518085039091018152610104840180865281519184019190912060009182905261012485018087525260ff881661014485015261016484018790526101848401869052935190926001926101a4808301939192601f198301929081900390910190855afa158015612a9d573d6000803e3d6000fd5b5050604051601f1901519a9950505050505050505050565b6040805130606090811b6020808401919091526001600160601b03198e831b81166034850152604884018e9052918c901b9091166068830152607c82018a9052609c820189905260bc8083018990528351808403909101815260dc90920183528151918101919091206001600160a01b03871660009081526006835283812082825290925291812054909190829060ff1680612bfa575060408051600080516020613496833981519152602080830191909152603c80830186905283518084039091018152605c83018085528151918301919091206000909152607c83018085525260ff8916609c83015260bc820188905260dc820187905291516001600160a01b038a169260019260fc80820193601f1981019281900390910190855afa158015612be5573d6000803e3d6000fd5b505050602060405103516001600160a01b0316145b8015612c065750884311155b612c1557600092505050612cd8565b6001600160a01b03808c166000908152600560209081526040808320938b16835292905220548a90612c4d908e63ffffffff612ed216565b81612c5457fe5b6001600160a01b038916600090815260076020908152604080832087845290915290205491900491508190612c90908e9063ffffffff612d4716565b1015612cd4576001600160a01b0387166000908152600760209081526040808320858452909152902054612ccb908d9063ffffffff612d4716565b92505050612cd8565b9150505b9a9950505050505050505050565b600082820183811015612d40576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600082821115612d9e576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b612db2878787878787612f2b565b7f35cc15ad16b95a9d45fadedd6ecbbd89858ec4bfedf144506f3f531d3eb63509428884888a878a0281612de257fe5b604080519687526001600160a01b0395861660208801528681019490945291841660608601529004608084015290861660a08301523360c083015260e0820184905251908190036101000190a150505050505050565b612e488989898989898989613157565b7f35cc15ad16b95a9d45fadedd6ecbbd89858ec4bfedf144506f3f531d3eb63509428985898b888b0281612e7857fe5b604080519687526001600160a01b0395861660208801528681019490945291841660608601529004608084015281881660a0840152908c1660c083015260e0820184905251908190036101000190a1505050505050505050565b600082612ee157506000612898565b82820282848281612eee57fe5b0414612d405760405162461bcd60e51b81526004018080602001828103825260218152602001806134b66021913960400191505060405180910390fd5b6000612f39826004546133ee565b9050612f7e612f4e838363ffffffff612ce616565b6001600160a01b03891660009081526005602090815260408083203384529091529020549063ffffffff612d4716565b6001600160a01b0388166000908152600560209081526040808320338452909152902055612fe7612fb5838363ffffffff612d4716565b6001600160a01b03808a166000908152600560209081526040808320938916835292905220549063ffffffff612ce616565b6001600160a01b038089166000908152600560209081526040808320888516845282528083209490945560035490921681526000805160206134d7833981519152909152205461303d908263ffffffff612ce616565b6003546001600160a01b031660009081526000805160206134d783398151915260205260409020556130b486613079868563ffffffff612ed216565b8161308057fe5b6001600160a01b038089166000908152600560209081526040808320938a168352929052205491900463ffffffff612d4716565b6001600160a01b03808716600090815260056020908152604080832093881683529290522055613127866130ee868563ffffffff612ed216565b816130f557fe5b6001600160a01b038816600090815260056020908152604080832033845290915290205491900463ffffffff612ce616565b6001600160a01b039095166000908152600560209081526040808320338452909152902094909455505050505050565b6000613165836004546133ee565b90506131ac61317a848363ffffffff612ce616565b6001600160a01b03808b166000908152600560209081526040808320938f16835292905220549063ffffffff612d4716565b6001600160a01b03808a166000908152600560209081526040808320938e16835292905220556132176131e5848363ffffffff612d4716565b6001600160a01b03808b166000908152600560209081526040808320938a16835292905220549063ffffffff612ce616565b6001600160a01b03808a166000908152600560209081526040808320898516845282528083209490945560035490921681526000805160206134d7833981519152909152205461326d908263ffffffff612ce616565b6003546001600160a01b031660009081526000805160206134d783398151915260205260409020556132e4876132a9878663ffffffff612ed216565b816132b057fe5b6001600160a01b03808a166000908152600560209081526040808320938b168352929052205491900463ffffffff612d4716565b6001600160a01b0380881660009081526005602090815260408083209389168352929052205561338182610c4089613322898863ffffffff612ed216565b8161332957fe5b04600560008b6001600160a01b03166001600160a01b0316815260200190815260200160002060008e6001600160a01b03166001600160a01b0316815260200190815260200160002054612ce690919063ffffffff16565b6001600160a01b038781166000908152600560209081526040808320938e168352929052818120929092553382529020546133bc9083612ce6565b6001600160a01b0390961660009081526005602090815260408083203384529091529020959095555050505050505050565b60006127108083111561340057600080fd5b600061342282613416878763ffffffff612ed216565b9063ffffffff61342b16565b95945050505050565b6000808211613481576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b600082848161348c57fe5b0494935050505056fe19457468657265756d205369676e6564204d6573736167653a0a333200000000536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7705b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc53797374656d205061757365642062792041646d696e00000000000000000000a265627a7a72315820a304766cfcc4ae47de04b84a6415dc7e606fb546004ad599cb0d5d784217b66e64736f6c63430005110032

Deployed ByteCode Sourcemap

7620:17089:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21376:513;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21376:513:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;21376:513:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;9812:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9812:140:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9812:140:0;;:::i;19700:155::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19700:155:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19700:155:0;;;;;;;;:::i;12058:371::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12058:371:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;12058:371:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;8287:64::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8287:64:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;8287:64:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;15835:624;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15835:624:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;15835:624:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15514:315::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15514:315:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;15514:315:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;10696:356::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10696:356:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10696:356:0;;:::i;11058:461::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11058:461:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;11058:461:0;;;;;;;;:::i;20284:195::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20284:195:0;;;:::i;7948:60::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7948:60:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;7948:60:0;;;;;;;;;;:::i;7899:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7899:27:0;;;:::i;21905:561::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21905:561:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;21905:561:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;19460:111;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19460:111:0;;;:::i;12435:826::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12435:826:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;12435:826:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;7832:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7832:25:0;;;:::i;:::-;;;;-1:-1:-1;;;;;7832:25:0;;;;;;;;;;;;;;14333:432;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14333:432:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;14333:432:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;9705:101::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9705:101:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9705:101:0;-1:-1:-1;;;;;9705:101:0;;:::i;7685:21::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7685:21:0;;;:::i;6851:201::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6851:201:0;;;:::i;6316:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6316:28:0;;;:::i;19951:81::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19951:81:0;;;:::i;11526:406::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11526:406:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;11526:406:0;;;;;;;;:::i;8095:60::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8095:60:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;8095:60:0;;;;;;;;:::i;22476:997::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22476:997:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;22476:997:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;6643:119::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6643:119:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6643:119:0;-1:-1:-1;;;;;6643:119:0;;:::i;9960:152::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9960:152:0;;;:::i;10474:216::-;;;:::i;6351:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6351:31:0;;;:::i;16714:1006::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16714:1006:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;16714:1006:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17732:1016::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17732:1016:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;17732:1016:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;11938:114::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11938:114:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;11938:114:0;;;;;;;;;;:::i;7787:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7787:20:0;;;:::i;10120:348::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10120:348: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;10120:348:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18775:459;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18775:459:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;18775:459:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14771:737::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14771:737:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;14771:737:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21376:513::-;-1:-1:-1;;;;;21530:17:0;;21522:26;;;;;;21567:93;;;-1:-1:-1;;;21567:93:0;;-1:-1:-1;;;;;21567:93:0;;;;;;;21623:4;21567:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:40;;;;;;:93;;;;;;;;;;;;;;;-1:-1:-1;21567:40:0;:93;;;5:2:-1;;;;30:1;27;20:12;5:2;21567:93:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21567:93:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21567:93:0;21559:102;;;;;;-1:-1:-1;;;;;21765:13:0;;;;;;;:6;:13;;;;;;;;:20;;;;;;;;;;:42;;21802:4;;21765:32;;21790:6;21765:32;:24;:32;:::i;:::-;:36;:42;:36;:42;:::i;:::-;-1:-1:-1;;;;;21742:13:0;;;;;;;:6;:13;;;;;;;;:20;;;;;;;;;;;;;:65;;;21823:56;;21831:3;21823:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21376:513;;;;;;;;:::o;9812:140::-;6607:5;;-1:-1:-1;;;;;6607:5:0;6593:10;:19;6585:28;;;;;;9922:10;:24;9812:140::o;19700:155::-;6607:5;;-1:-1:-1;;;;;6607:5:0;6593:10;:19;6585:28;;;;;;19792:55;;;-1:-1:-1;;;19792:55:0;;19823:10;19792:55;;;;;;;;;;;;-1:-1:-1;;;;;19792:30:0;;;;;:55;;;;;;;;;;;;;;-1:-1:-1;19792:30:0;:55;;;5:2:-1;;;;30:1;27;20:12;5:2;19792:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19792:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;19700:155:0:o;12058:371::-;12208:82;;;12225:4;12208:82;;;;;;;;;;;;-1:-1:-1;;;;;;12208:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;12208:82:0;;;;;;12198:93;;;;;;;;;12305:10;12183:12;12298:18;;;:6;:18;;;;;:24;;;;;;;;;;:31;;-1:-1:-1;;12298:31:0;12325:4;12298:31;;;12347:3;12341:82;;;-1:-1:-1;;;;;12208:82:0;;;12341;;;;;;;;;;12208;;12341;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12058:371;;;;;;;:::o;8287:64::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;15835:624::-;16006:9;;-1:-1:-1;;;16006:9:0;;;;16005:10;15997:44;;;;;-1:-1:-1;;;15997:44:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15997:44:0;;;;;;;;;;;;;;;16073:82;;;16090:4;16073:82;;;;;;;;;;;;-1:-1:-1;;;;;;16073:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;16073:82:0;;;;;;16063:93;;;;;;;;;16179:10;16048:12;16172:18;;;:6;:18;;;;;:24;;;;;;;;;;;;;:128;;-1:-1:-1;16220:58:0;;;-1:-1:-1;;;;;;;;;;;16220:58:0;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;16220:58:0;;;;;;16210:69;;;;;;;;;-1:-1:-1;16200:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16290:10;;16200:86;;;;;;;-1:-1:-1;;16200:86:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16200:86:0;;;;;;;;-1:-1:-1;;;;;16200:100:0;;16172:128;16163:139;;;;;;16320:10;16309:22;;;;:10;:22;;;;;;;;:28;;;;;;;;;:40;;;16361:92;;16368:3;16361:92;;-1:-1:-1;;;;;16361:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15835:624;;;;;;;;;;:::o;15514:315::-;15704:82;;;15721:4;15704:82;;;;;;;;;;;;-1:-1:-1;;;;;;15704:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;15704:82:0;;;;;;15694:93;;;;;;;;;-1:-1:-1;;;;;15801:16:0;;15666:4;15801:16;;;:10;:16;;;;;:22;;;;;;;15514:315;;;;;;;;;:::o;10696:356::-;10750:9;;-1:-1:-1;;;10750:9:0;;;;10749:10;10741:44;;;;;-1:-1:-1;;;10741:44:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10741:44:0;;;;;;;;;;;;;;;10819:10;10800:18;:30;;;-1:-1:-1;;;;;;;;;;;10800:18:0;:30;:18;:30;;;:40;-1:-1:-1;10800:40:0;10792:49;;;;;;10900:10;10881:18;:30;;;-1:-1:-1;;;;;;;;;;;10881:18:0;:30;:18;:30;;;:42;;10916:6;10881:42;:34;:42;:::i;:::-;10867:10;10848:18;:30;;;-1:-1:-1;;;;;;;;;;;10848:18:0;:30;:18;:30;;;:75;;;;10930:27;;10867:10;;10930:27;;;;;10950:6;;10930:27;10848:18;10930:27;10950:6;10867:10;10930:27;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;10995:10:0;10991:1;11015:30;;;-1:-1:-1;;;;;;;;;;;11015:18:0;:30;;;:18;:30;;;;10969:77;;10978:3;10969:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10696:356;:::o;11058:461::-;-1:-1:-1;;;;;11260:17:0;;11252:26;;;;;;11293:69;;;-1:-1:-1;;;11293:69:0;;11328:10;11293:69;;;;11348:4;11293:69;;;;;;;;;;;;-1:-1:-1;;;;;11293:34:0;;;;;:69;;;;;;;;;;;;;;-1:-1:-1;11293:34:0;:69;;;5:2:-1;;;;30:1;27;20:12;5:2;11293:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11293:69:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11293:69:0;11285:78;;;;;;-1:-1:-1;;;;;11398:13:0;;;;;;:6;:13;;;;;;;;11412:10;11398:25;;;;;;;;:37;;11428:6;11398:37;:29;:37;:::i;:::-;-1:-1:-1;;;;;11370:13:0;;;;;;:6;:13;;;;;;;;11384:10;11370:25;;;;;;;;;;:65;;;11447:66;;11455:3;11447:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11058:461;;:::o;20284:195::-;6607:5;;-1:-1:-1;;;;;6607:5:0;6593:10;:19;6585:28;;;;;;20348:9;;-1:-1:-1;;;20348:9:0;;;;20344:128;;20394:4;20382:16;;-1:-1:-1;;;;20382:16:0;-1:-1:-1;;;20382:16:0;;;20344:128;;;20439:9;:17;;-1:-1:-1;;;;20439:17:0;;;20344:128;20284:195::o;7948:60::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;7899:27::-;;;;:::o;21905:561::-;22071:9;;22036:4;;-1:-1:-1;;;22071:9:0;;;;22070:10;22062:44;;;;;-1:-1:-1;;;22062:44:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22062:44:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;22125:17:0;;22117:26;;;;;;-1:-1:-1;;;;;22162:13:0;;;;;;;:6;:13;;;;;;;;:18;;;;;;;;;;:28;-1:-1:-1;22162:28:0;22154:37;;;;;;22207:89;;;-1:-1:-1;;;22207:89:0;;22256:4;22207:89;;;;-1:-1:-1;;;;;22207:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:40;;;;;;:89;;;;;;;;;;;;;;;-1:-1:-1;22207:40:0;:89;;;5:2:-1;;;;30:1;27;20:12;5:2;22207:89:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22207:89:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22207:89:0;22199:98;;;;;;-1:-1:-1;;;;;22326:13:0;;;;;;;:6;:13;;;;;;;;:18;;;;;;;;;;:39;;22361:3;;22326:30;;22349:6;22326:30;:22;:30;:::i;:39::-;-1:-1:-1;;;;;22305:13:0;;;;;;;:6;:13;;;;;;;;:18;;;;;;;;;;;;;:60;;;22381:53;;22390:3;22381:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22452:4:0;21905:561;;;;;;;;;;:::o;19460:111::-;6607:5;;-1:-1:-1;;;;;6607:5:0;6593:10;:19;6585:28;;;;;;19525:5;;;19517:46;;-1:-1:-1;;;;;19525:5:0;;;;19541:21;19517:46;;;;;19541:21;;19517:46;19525:5;19517:46;19541:21;19525:5;19517:46;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19517:46:0;19460:111::o;12435:826::-;12648:9;;-1:-1:-1;;;12648:9:0;;;;12647:10;12639:44;;;;;-1:-1:-1;;;12639:44:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12639:44:0;;;;;;;;;;;;;;;12726:12;12776:4;12783:8;12793:9;12804;12815:10;12827:7;12836:5;12751:91;;;;;;-1:-1:-1;;;;;12751:91:0;-1:-1:-1;;;;;12751:91:0;;;;;;;;-1:-1:-1;;;;;12751:91:0;-1:-1:-1;;;;;12751:91:0;;;;;;;;;;;;;-1:-1:-1;;;;;12751:91:0;-1:-1:-1;;;;;12751:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;12751:91:0;;;12741:102;;;;;;12726:117;;12868:6;:12;12875:4;-1:-1:-1;;;;;12868:12:0;-1:-1:-1;;;;;12868:12:0;;;;;;;;;;;;:18;12881:4;12868:18;;;;;;;;;;;;;;;;;;;;;:116;;;-1:-1:-1;12910:58:0;;;-1:-1:-1;;;;;;;;;;;12910:58:0;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;12910:58:0;;;;;;12900:69;;;;;;;;;-1:-1:-1;12890:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12890:94:0;;;:86;;;;;;;-1:-1:-1;;12890:86:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12890:86:0;;;;;;;;-1:-1:-1;;;;;12890:94:0;;12868:116;12867:152;;;;;13012:7;12996:12;:23;;12867:152;:210;;;;-1:-1:-1;;;;;;13030:16:0;;;;;;:10;:16;;;;;;;;:22;;;;;;;;;13068:9;;13030:34;;13057:6;13030:34;:26;:34;:::i;:::-;:47;;12867:210;12850:245;;;;;-1:-1:-1;;;12850:245:0;;;;;;;;;;;;-1:-1:-1;;;12850:245:0;;;;;;;;;;;;;;;13102:81;13113:8;13123:9;13134;13145:10;13157:4;13163:6;13171:11;13102:10;:81::i;:::-;-1:-1:-1;;;;;13215:16:0;;;;;;:10;:16;;;;;;;;:22;;;;;;;;;:34;;13242:6;13215:34;:26;:34;:::i;:::-;-1:-1:-1;;;;;13190:16:0;;;;;;;:10;:16;;;;;;;;:22;;;;;;;:59;;;;-1:-1:-1;;;;;;;;;;;12435:826:0:o;7832:25::-;;;-1:-1:-1;;;;;7832:25:0;;:::o;14333:432::-;-1:-1:-1;;;;;14575:16:0;;;14542:4;14575:16;;;:6;:16;;;;;;;;:24;;;;;;;;;;;;:34;-1:-1:-1;14575:34:0;;;:145;;;14714:6;14620:90;14636:8;14646:9;14657;14668:10;14680:7;14689:5;14696:4;14702:1;14705;14708;14620:15;:90::i;:::-;:100;;14575:145;14561:180;;-1:-1:-1;14736:5:0;14729:12;;14561:180;-1:-1:-1;14755:4:0;14333:432;;;;;;;;;;;;;;;:::o;9705:101::-;6607:5;;-1:-1:-1;;;;;6607:5:0;6593:10;:19;6585:28;;;;;;9776:10;:24;;-1:-1:-1;;;;;;9776:24:0;-1:-1:-1;;;;;9776:24:0;;;;;;;;;;9705:101::o;7685:21::-;;;-1:-1:-1;;;7685:21:0;;;;;:::o;6851:201::-;6918:8;;-1:-1:-1;;;;;6918:8:0;6904:10;:22;6896:31;;;;;;6976:8;;;6969:5;6943:42;;;6964:3;6943:42;;;;-1:-1:-1;;;;;6976:8:0;;;;6969:5;;;;;6943:42;;;;;;;;;7004:8;;;;6996:16;;-1:-1:-1;;;;;;6996:16:0;;;-1:-1:-1;;;;;7004:8:0;;6996:16;;;;7023:21;;;6851:201::o;6316:28::-;;;-1:-1:-1;;;;;6316:28:0;;:::o;19951:81::-;6607:5;;-1:-1:-1;;;;;6607:5:0;6593:10;:19;6585:28;;;;;;20018:5;;-1:-1:-1;;;;;20018:5:0;20005:19;11526:406;11600:9;;-1:-1:-1;;;11600:9:0;;;;11599:10;11591:44;;;;;-1:-1:-1;;;11591:44:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;11591:44:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;11650:17:0;;11642:26;;;;;;-1:-1:-1;;;;;11683:13:0;;;;;;:6;:13;;;;;;;;11697:10;11683:25;;;;;;;;:35;-1:-1:-1;11683:35:0;11675:44;;;;;;-1:-1:-1;;;;;11754:13:0;;;;;;:6;:13;;;;;;;;11768:10;11754:25;;;;;;;;:37;;11784:6;11754:37;:29;:37;:::i;:::-;-1:-1:-1;;;;;11726:13:0;;;;;;:6;:13;;;;;;;;11740:10;11726:25;;;;;;;;;:65;;;;11797:50;;-1:-1:-1;;;11797:50:0;;;;;;;;;;;;;;;;11726:13;;11797:30;;:50;;;;;;;;;;;;;;11726:13;11797:50;;;5:2:-1;;;;30:1;27;20:12;5:2;11797:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11797:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;;11900:13:0;;;;;;:6;11797:50;11900:13;;;;;;;11880:10;11900:25;;;;;;;;;;;11859:67;;11868:3;11859:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11526:406;;:::o;8095:60::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22476:997::-;22722:9;;-1:-1:-1;;;22722:9:0;;;;22721:10;22713:44;;;;;-1:-1:-1;;;22713:44:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22713:44:0;;;;;;;;;;;;;;;22800:12;22850:4;22857:8;22867:9;22878;22889:10;22901:7;22910:5;22825:91;;;;;;-1:-1:-1;;;;;22825:91:0;-1:-1:-1;;;;;22825:91:0;;;;;;;;-1:-1:-1;;;;;22825:91:0;-1:-1:-1;;;;;22825:91:0;;;;;;;;;;;;;-1:-1:-1;;;;;22825:91:0;-1:-1:-1;;;;;22825:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;22825:91:0;;;22815:102;;;;;;22800:117;;22932:6;:12;22939:4;-1:-1:-1;;;;;22932:12:0;-1:-1:-1;;;;;22932:12:0;;;;;;;;;;;;:18;22945:4;22932:18;;;;;;;;;;;;;;;;;;;;;:116;;;-1:-1:-1;22974:58:0;;;-1:-1:-1;;;;;;;;;;;22974:58:0;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;22974:58:0;;;;;;22964:69;;;;;;;;;-1:-1:-1;22954:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22954:94:0;;;:86;;;;;;;-1:-1:-1;;22954:86:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22954:86:0;;;;;;;;-1:-1:-1;;;;;22954:94:0;;22932:116;22924:136;;;;;-1:-1:-1;;;22924:136:0;;;;;;;;;;;;-1:-1:-1;;;22924:136:0;;;;;;;;;;;;;;;23091:7;23075:12;:23;;23067:48;;;;;-1:-1:-1;;;23067:48:0;;;;;;;;;;;;-1:-1:-1;;;23067:48:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;23130:16:0;;;;;;:10;:16;;;;;;;;:22;;;;;;;;;23168:9;;23130:34;;23157:6;23130:34;:26;:34;:::i;:::-;:47;;23122:73;;;;;-1:-1:-1;;;23122:73:0;;;;;;;;;;;;-1:-1:-1;;;23122:73:0;;;;;;;;;;;;;;;23202:100;23220:5;23226:8;23236:9;23247;23258:10;23270:4;23276:6;23284:4;23290:11;23202:17;:100::i;:::-;-1:-1:-1;;;;;23334:16:0;;;;;;:10;:16;;;;;;;;:22;;;;;;;;;:34;;23361:6;23334:34;:26;:34;:::i;:::-;-1:-1:-1;;;;;23309:16:0;;;;;;;:10;:16;;;;;;;;:22;;;;;;;:59;;;;-1:-1:-1;;;;;;;;;;;;;22476:997:0:o;6643:119::-;6607:5;;-1:-1:-1;;;;;6607:5:0;6593:10;:19;6585:28;;;;;;6734:8;:20;;-1:-1:-1;;;;;;6734:20:0;-1:-1:-1;;;;;6734:20:0;;;;;;;;;;6643:119::o;9960:152::-;10095:10;;-1:-1:-1;;;;;10095:10:0;10016:7;10076:30;;;-1:-1:-1;;;;;;;;;;;10076:18:0;:30;:18;:30;;;9960:152;:::o;10474:216::-;10567:10;10548:18;:30;;;-1:-1:-1;;;;;;;;;;;10548:18:0;:30;:18;:30;;;:45;;10583:9;10548:45;:34;:45;:::i;:::-;10534:10;10515:18;:30;;;-1:-1:-1;;;;;;;;;;;10515:18:0;:30;;;:18;:30;;;:78;;;10605:79;;10613:3;10605:79;;;;;;;;;;;;;;;;10642:9;10605:79;;;;;;;;;;;;;;;;;;;;;;10474:216::o;6351:31::-;;;-1:-1:-1;;;;;6351:31:0;;:::o;16714:1006::-;16989:4;-1:-1:-1;;;;;17019:17:0;;17011:26;;;;;;17077:90;;;-1:-1:-1;;;17077:90:0;;;;;;;;17127:4;17077:90;;;;;;;;-1:-1:-1;;;;;;17077:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;17077:90:0;;;;;;17067:101;;;;;;;;;17048:16;17187:27;;;:17;:27;;;;;;;;;:36;17179:81;;;;;-1:-1:-1;;;17179:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17309:62;;;-1:-1:-1;;;;;;;;;;;17309:62:0;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;17309:62:0;;;;;;17299:73;;;;;;;;;17271:15;17289:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17309:62;-1:-1:-1;;17289:90:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;17289:90:0;;-1:-1:-1;;17289:90:0;;;-1:-1:-1;;;;;;;17398:21:0;;17390:55;;;;;-1:-1:-1;;;17390:55:0;;;;;;;;;;;;-1:-1:-1;;;17390:55:0;;;;;;;;;;;;;;;17464:54;;;-1:-1:-1;;;17464:54:0;;-1:-1:-1;;;;;17464:54:0;;;;;;;;;;;;;;;;;;;;;;:34;;;;;;:54;;;;;;;;;;;;;;;-1:-1:-1;17464:34:0;:54;;;5:2:-1;;;;30:1;27;20:12;5:2;17464:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17464:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17464:54:0;17456:83;;;;;-1:-1:-1;;;17456:83:0;;;;;;;;;;;;-1:-1:-1;;;17456:83:0;;;;;;;;;;;;;;;17558:61;;;-1:-1:-1;;;17558:61:0;;-1:-1:-1;;;;;17558:61:0;;;;;;;17602:10;17558:61;;;;;;;;;;;;:34;;;;;;:61;;;;;;;;;;;;;;;-1:-1:-1;17558:34:0;:61;;;5:2:-1;;;;30:1;27;20:12;5:2;17558:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17558:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17558:61:0;17550:95;;;;;-1:-1:-1;;;17550:95:0;;;;;;;;;;;;-1:-1:-1;;;17550:95:0;;;;;;;;;;;;;;;-1:-1:-1;17656:27:0;;;;:17;:27;;;;;:34;;-1:-1:-1;;17656:34:0;17686:4;17656:34;;;;;;17686:4;-1:-1:-1;16714:1006:0;;;;;;;;;;;:::o;17732:1016::-;18003:4;-1:-1:-1;;;;;18033:17:0;;18025:26;;;;;;18091:83;;;-1:-1:-1;;;18091:83:0;;;;;;;;18141:4;18091:83;;;;;;;;;;;-1:-1:-1;;;;;;18091:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;18091:83:0;;;;;;18081:94;;;;;;;;;-1:-1:-1;18194:27:0;;;:17;:27;;;;;;;;;:36;18186:81;;;;;-1:-1:-1;;;18186:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18316:62;;;-1:-1:-1;;;;;;;;;;;18316:62:0;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;18316:62:0;;;;;;18306:73;;;;;;;;;18278:15;18296:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18316:62;-1:-1:-1;;18296:90:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;18296:90:0;;-1:-1:-1;;18296:90:0;;;-1:-1:-1;;;;;;;18405:21:0;;18397:55;;;;;-1:-1:-1;;;18397:55:0;;;;;;;;;;;;-1:-1:-1;;;18397:55:0;;;;;;;;;;;;;;;18478:7;-1:-1:-1;;;;;18471:14:0;:5;-1:-1:-1;;;;;18471:14:0;;18463:23;;;;;;-1:-1:-1;;;;;18505:30:0;;;18536:3;18541:16;:6;18552:4;18541:16;:10;:16;:::i;:::-;18505:53;;;;;;;;;;;;;-1:-1:-1;;;;;18505:53:0;-1:-1:-1;;;;;18505:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18505:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18505:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18505:53:0;18497:82;;;;;-1:-1:-1;;;18497:82:0;;;;;;;;;;;;-1:-1:-1;;;18497:82:0;;;;;;;;;;;;;;;18598:49;;;-1:-1:-1;;;18598:49:0;;18630:10;18598:49;;;;;;;;;;;;-1:-1:-1;;;;;18598:30:0;;;;;:49;;;;;;;;;;;;;;-1:-1:-1;18598:30:0;:49;;;5:2:-1;;;;30:1;27;20:12;11938:114:0;-1:-1:-1;;;;;12027:13:0;;;12007:4;12027:13;;;:6;:13;;;;;;;;:19;;;;;;;;;;11938:114;;;;;:::o;7787:20::-;;;-1:-1:-1;;;;;7787:20:0;;:::o;10120:348::-;6607:5;;10181:13;;-1:-1:-1;;;;;6607:5:0;6593:10;:19;6585:28;;;;;;10204:14;10221:26;:24;:26::i;:::-;10204:43;;10274:1;10265:6;:10;10256:43;;;;;-1:-1:-1;;;10256:43:0;;;;;;;;;;;;-1:-1:-1;;;10256:43:0;;;;;;;;;;;;;;;10335:10;;-1:-1:-1;;;;;10335:10:0;10349:1;10316:30;;;-1:-1:-1;;;;;;;;;;;10316:18:0;:30;:18;:30;;;:34;;;10367:27;:10;;:27;;;;;10387:6;;10367:27;10349:1;10367:27;10387:6;10367:10;:27;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;10440:5:0;;10416:38;;;;;;;;-1:-1:-1;;;;;10440:5:0;;;;10416:38;;;;;;;;;6624:1;10120:348;:::o;18775:459::-;19059:58;;;19084:4;19059:58;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19059:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;19059:58:0;;;;;19049:69;;;;;;-1:-1:-1;;;;;;;;;;;19156:62:0;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;19156:62:0;;;;;;19146:73;;;;;;;;;-1:-1:-1;19136:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19049:69;;19136:90;;;;;;;19059:58;;-1:-1:-1;;19136:90:0;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;19136:90:0;;-1:-1:-1;;19136:90:0;;;18775:459;-1:-1:-1;;;;;;;;;;18775:459:0:o;14771:737::-;14995:82;;;15012:4;14995:82;;;;;;;;;;;;-1:-1:-1;;;;;;14995:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;14995:82:0;;;;;;14985:93;;;;;;;;;-1:-1:-1;;;;;15122:12:0;;14957:4;15122:12;;;:6;:12;;;;;:18;;;;;;;;;;14957:4;;14985:93;14957:4;;15122:18;;;:116;;-1:-1:-1;15164:58:0;;;-1:-1:-1;;;;;;;;;;;15164:58:0;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;15164:58:0;;;;;;15154:69;;;;;;;;;-1:-1:-1;15144:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15144:94:0;;;:86;;;;;;;-1:-1:-1;;15144:86:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15144:86:0;;;;;;;;-1:-1:-1;;;;;15144:94:0;;15122:116;15121:152;;;;;15266:7;15250:12;:23;;15121:152;15107:183;;15289:1;15282:8;;;;;;15107:183;-1:-1:-1;;;;;15310:17:0;;;;;;;:6;:17;;;;;;;;:23;;;;;;;;;;15351:10;;15310:38;;15338:9;15310:38;:27;:38;:::i;:::-;:51;;;;;-1:-1:-1;;;;;15392:16:0;;;;;;:10;:16;;;;;;;;:22;;;;;;;;;15310:51;;;;-1:-1:-1;15310:51:0;;15378:37;;:9;;:37;:13;:37;:::i;:::-;:48;15374:98;;;-1:-1:-1;;;;;15449:16:0;;;;;;:10;:16;;;;;;;;:22;;;;;;;;;15435:37;;:9;;:37;:13;:37;:::i;:::-;15428:44;;;;;;15374:98;15486:10;-1:-1:-1;;14771:737:0;;;;;;;;;;;;;:::o;3289:181::-;3347:7;3379:5;;;3403:6;;;;3395:46;;;;;-1:-1:-1;;;3395:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3461:1;3289:181;-1:-1:-1;;;3289:181:0:o;3745:184::-;3803:7;3836:1;3831;:6;;3823:49;;;;;-1:-1:-1;;;3823:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3895:5:0;;;3745:184::o;13269:358::-;13433:71;13447:8;13457:9;13468;13479:10;13491:4;13497:6;13433:13;:71::i;:::-;13518:103;13524:3;13529:8;13539:6;13547:9;13580;13571:6;13558:10;:19;:31;;;;;13518:103;;;;;;-1:-1:-1;;;;;13518:103:0;;;;;;;;;;;;;;;;;;;;;13558:31;;13518:103;;;;;;;;;;;13597:10;13518:103;;;;;;;;;;;;;;;;;;;13269:358;;;;;;;:::o;23481:411::-;23677:90;23698:5;23704:8;23714:9;23725;23736:10;23748:4;23754:6;23762:4;23677:20;:90::i;:::-;23781:98;23787:3;23792:8;23802:6;23810:9;23843;23834:6;23821:10;:19;:31;;;;;23781:98;;;;;;-1:-1:-1;;;;;23781:98:0;;;;;;;;;;;;;;;;;;;;;23821:31;;23781:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23481:411;;;;;;;;;:::o;4180:470::-;4238:7;4482:6;4478:47;;-1:-1:-1;4512:1:0;4505:8;;4478:47;4549:5;;;4553:1;4549;:5;:1;4573:5;;;;;:10;4565:56;;;;-1:-1:-1;;;4565:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13637:690;13779:19;13801:38;13821:6;13828:10;;13801:19;:38::i;:::-;13779:60;-1:-1:-1;13879:60:0;13912:26;:6;13779:60;13912:26;:10;:26;:::i;:::-;-1:-1:-1;;;;;13879:16:0;;;;;;:6;:16;;;;;;;;13896:10;13879:28;;;;;;;;;:60;:32;:60;:::i;:::-;-1:-1:-1;;;;;13848:16:0;;;;;;:6;:16;;;;;;;;13865:10;13848:28;;;;;;;:91;13971:54;13998:26;:6;14009:14;13998:26;:10;:26;:::i;:::-;-1:-1:-1;;;;;13971:16:0;;;;;;;:6;:16;;;;;;;;:22;;;;;;;;;;;:54;:26;:54;:::i;:::-;-1:-1:-1;;;;;13946:16:0;;;;;;;:6;:16;;;;;;;;:22;;;;;;;;;;:79;;;;14084:10;;;;;14065:30;;-1:-1:-1;;;;;;;;;;;14065:30:0;;;;;:50;;14100:14;14065:50;:34;:50;:::i;:::-;14051:10;;-1:-1:-1;;;;;14051:10:0;14032:18;:30;;;-1:-1:-1;;;;;;;;;;;14032:18:0;:30;:18;:30;;:83;14150:63;14203:9;14178:22;:10;14193:6;14178:22;:14;:22;:::i;:::-;:34;;;;;-1:-1:-1;;;;;14150:17:0;;;;;;;:6;:17;;;;;;;;:23;;;;;;;;;;;14178:34;;14150:63;:27;:63;:::i;:::-;-1:-1:-1;;;;;14124:17:0;;;;;;;:6;:17;;;;;;;;:23;;;;;;;;;:89;14252:69;14311:9;14286:22;:10;14301:6;14286:22;:14;:22;:::i;:::-;:34;;;;;-1:-1:-1;;;;;14252:17:0;;;;;;:6;:17;;;;;;;;14270:10;14252:29;;;;;;;;;14286:34;;14252:69;:33;:69;:::i;:::-;-1:-1:-1;;;;;14220:17:0;;;;;;;:6;:17;;;;;;;;14238:10;14220:29;;;;;;;:101;;;;-1:-1:-1;;;;;;13637:690:0:o;23898:796::-;24073:19;24095:38;24115:6;24122:10;;24095:19;:38::i;:::-;24073:60;-1:-1:-1;24168:55:0;24196:26;:6;24073:60;24196:26;:10;:26;:::i;:::-;-1:-1:-1;;;;;24168:16:0;;;;;;;:6;:16;;;;;;;;:23;;;;;;;;;;;:55;:27;:55;:::i;:::-;-1:-1:-1;;;;;24142:16:0;;;;;;;:6;:16;;;;;;;;:23;;;;;;;;;:81;24255:54;24282:26;:6;24293:14;24282:26;:10;:26;:::i;:::-;-1:-1:-1;;;;;24255:16:0;;;;;;;:6;:16;;;;;;;;:22;;;;;;;;;;;:54;:26;:54;:::i;:::-;-1:-1:-1;;;;;24230:16:0;;;;;;;:6;:16;;;;;;;;:22;;;;;;;;;;:79;;;;24368:10;;;;;24349:30;;-1:-1:-1;;;;;;;;;;;24349:30:0;;;;;:50;;24384:14;24349:50;:34;:50;:::i;:::-;24335:10;;-1:-1:-1;;;;;24335:10:0;24316:18;:30;;;-1:-1:-1;;;;;;;;;;;24316:18:0;:30;:18;:30;;:83;24434:63;24487:9;24462:22;:10;24477:6;24462:22;:14;:22;:::i;:::-;:34;;;;;-1:-1:-1;;;;;24434:17:0;;;;;;;:6;:17;;;;;;;;:23;;;;;;;;;;;24462:34;;24434:63;:27;:63;:::i;:::-;-1:-1:-1;;;;;24408:17:0;;;;;;;:6;:17;;;;;;;;:23;;;;;;;;;:89;24531:74;24600:4;24531:64;24585:9;24560:22;:10;24575:6;24560:22;:14;:22;:::i;:::-;:34;;;;;;24531:6;:17;24538:9;-1:-1:-1;;;;;24531:17:0;-1:-1:-1;;;;;24531:17:0;;;;;;;;;;;;:24;24549:5;-1:-1:-1;;;;;24531:24:0;-1:-1:-1;;;;;24531:24:0;;;;;;;;;;;;;:28;;:64;;;;:::i;:74::-;-1:-1:-1;;;;;24504:17:0;;;;;;;:6;:17;;;;;;;;:24;;;;;;;;;;;:101;;;;24662:10;24644:29;;;;;:39;;24678:4;24644:33;:39::i;:::-;-1:-1:-1;;;;;24612:17:0;;;;;;;:6;:17;;;;;;;;24630:10;24612:29;;;;;;;:71;;;;-1:-1:-1;;;;;;;;23898:796:0:o;9320:264::-;9411:7;9454:5;9478:19;;;;9470:28;;;;;;9509:9;9521:36;9550:6;9521:24;:9;9535;9521:24;:13;:24;:::i;:::-;:28;:36;:28;:36;:::i;:::-;9509:48;9320:264;-1:-1:-1;;;;;9320:264:0:o;5118:333::-;5176:7;5275:1;5271;:5;5263:44;;;;;-1:-1:-1;;;5263:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5318:9;5334:1;5330;:5;;;;;;;5118:333;-1:-1:-1;;;;5118:333:0:o

Swarm Source

bzzr://a304766cfcc4ae47de04b84a6415dc7e606fb546004ad599cb0d5d784217b66e
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading

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.