ETH Price: $2,507.45 (-1.10%)

Token

ePING (ePING)
 

Overview

Max Total Supply

50,790,848.680142416 ePING

Holders

56

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
244,037.988005781 ePING

Value
$0.00
0xcbd4318f7be189a2af2d2f7ef05c39532b31c2a9
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ePING

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-28
*/

/**	
 * 
$$$$$$$\        $$$$$$\       $$\   $$\        $$$$$$\  
$$  __$$\       \_$$  _|      $$$\  $$ |      $$  __$$\ 
$$ |  $$ |        $$ |        $$$$\ $$ |      $$ /  \__|
$$$$$$$  |        $$ |        $$ $$\$$ |      $$ |$$$$\ 
$$  ____/         $$ |        $$ \$$$$ |      $$ |\_$$ |
$$ |              $$ |        $$ |\$$$ |      $$ |  $$ |
$$ |            $$$$$$\       $$ | \$$ |      \$$$$$$  |
\__|            \______|      \__|  \__|       \______/ 
                                                        
*                                                   
*/  
/* PING
*
* Taxes structure:
*
* 3% taxes for Liquidity
* 2% reflected to HODLERS
* 3% operation/dev/marketing wallet
* 2% research wallet
*
* Total supply: 4 billion tokens.

https://www.sonarplatform.io/

World's first crypto metatracker - AI-driven data aggregation platform

*
*/

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
     function mint(address from, uint256 value) external;
     function burn(address from, uint256 value) external;

    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: @openzeppelin/contracts/math/SafeMath.sol


pragma solidity ^0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

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

    /**
     * @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) {
        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, reverting 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) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }
    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


pragma solidity ^0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        address addr = msg.sender;
        address payable Sender = payable(addr);
        return Sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts/utils/Address.sol


pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }
}

pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol

pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

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

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol

//pragma solidity >=0.6.2;


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

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

// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol

pragma solidity >=0.5.0;

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

// File: contracts/PING.sol

pragma solidity ^0.8.0;
// SPDX-License-Identifier: None

/* PING
*
* Taxes structure:
*
* 3% taxes for Liquidity
* 2% reflected to HODLERS
* 3% operation/dev/marketing wallet
* 2% research wallet
*
*
*/

contract ePING is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => bool) private _isExcluded;
    mapping(address => bool) public adminAddresses;
    address[] private _excluded;
    bool public isWalletTransferFeeEnabled = false;
    bool public isContractTransferFeeEnabled = true;

    string private constant _name = "ePING";
    string private constant _symbol = "ePING";
    uint8 private constant _decimals = 9;

    uint256 private constant MAX = 16 * 10**36 * 10**_decimals;
    uint256 private  _tTotal = 1 * 10**0 * 10**_decimals;
    
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tRfiTotal;
    uint256 public numOfHODLers;
    uint256 private _tDevelopmentTotal;
    uint256 private _tResearchTotal;
    
    //@dev enable optimisation to pack this in 32b
    struct feeRatesStruct {
      uint8 rfi;
      uint8 liquidity;
      uint8 research;
      uint8 dev;
    }

    feeRatesStruct public feeRates = feeRatesStruct(
     {rfi: 2,
      liquidity: 6,
      research: 1,
      dev: 1}); //32 bytes - perfect, as it should be

    struct valuesFromGetValues{
      uint256 rAmount;
      uint256 rTransferAmount;
      uint256 rRfi;
      uint256 tTransferAmount;
      uint256 tRfi;
      uint256 tLiquidity;
      uint256 tResearch;
      uint256 tDev;
    }

    address public researchWallet;
    address public devWallet;
    mapping (address => bool) public isPresaleWallet;//exclude presaleWallet from max transaction limit, so that public can claim tokens.
    
    IUniswapV2Router02 public  PancakeSwapV2Router;
    address public  pancakeswapV2Pair;

    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;

    uint256 public _maxTxAmount = 4 * 10**9  * 10**_decimals;  
    uint256 public numTokensSellToAddToLiquidity = 4 * 10**6 * 10**_decimals;   //0.1%

    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(uint256 tokensSwapped, uint256 bnbReceived, uint256 tokensIntoLiquidity);
    event BalanceWithdrawn(address withdrawer, uint256 amount);
    event LiquidityAdded(uint256 tokenAmount, uint256 bnbAmount);
    event MaxTxAmountChanged(uint256 oldValue, uint256 newValue);
    event SwapAndLiquifyStatus(string status);
    event WalletsChanged();
    event FeesChanged();
    event tokensBurned(uint256 amount, string message);
    event Mint(uint256 amount, address mintAddress);
    event Burn(uint256 amount, address burnAddress);


    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    constructor () {
        _rOwned[_msgSender()] = _rTotal;
        
        IUniswapV2Router02 _PancakeSwapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

        pancakeswapV2Pair = IUniswapV2Factory(_PancakeSwapV2Router.factory()).createPair(address(this), _PancakeSwapV2Router.WETH()); //only utility is to have the pair at hand, on bscscan...
        PancakeSwapV2Router = _PancakeSwapV2Router;

        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;

        emit Transfer(address(0), _msgSender(), _tTotal);
    }
    function toggleWalletTransferTax() external onlyOwner {
        isWalletTransferFeeEnabled = !isWalletTransferFeeEnabled;
    }

    function toggleContractTransferTax() external onlyOwner {
        isContractTransferFeeEnabled = !isContractTransferFeeEnabled;
    }

    //std ERC20:
    function name() public pure returns (string memory) {
        return _name;
    }
    function symbol() public pure returns (string memory) {
        return _symbol;
    }
    function decimals() public pure returns (uint8) {
        return _decimals;
    }

    //override ERC20:
    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient,amount, isWalletTransferFeeEnabled);
        return true;
    }


    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
       if (sender.isContract()) {
            _transfer(sender, recipient, amount, isContractTransferFeeEnabled);
        } else {
            _transfer(sender, recipient, amount, isWalletTransferFeeEnabled);
        }
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function totalFees() public view returns (uint256) {
        return _tRfiTotal;
    }

  

    function reflectionFromToken(uint256 tAmount, bool deductTransferRfi) public view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferRfi) {
            valuesFromGetValues memory s = _getValues(tAmount, true);
            return s.rAmount;
        } else {
            valuesFromGetValues memory s = _getValues(tAmount, true);
            return s.rTransferAmount;
        }
    }


    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount.div(currentRate);
    }

    function excludeFromRFI(address account) public onlyOwner() {
        require(!_isExcluded[account], "Account is already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeInRFI(address account) external onlyOwner() {
        require(_isExcluded[account], "Account is not excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function excludeFromFeeAndRfi(address account) public onlyOwner {
        excludeFromFee(account);
        excludeFromRFI(account);
    }

    function excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;
    }

    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = false;
    }

    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }

    /* @dev passing an array or just an uint256 would have been more efficient/elegant, I know
    */
    function setRfiRatesPercents(uint8 _rfi, uint8 _lp, uint8 _research, uint8 _dev) public onlyOwner {
      feeRates.rfi = _rfi;
      feeRates.liquidity = _lp;
      feeRates.research = _research;
      feeRates.dev = _dev;
      emit FeesChanged();
    }

    function setWallets(address _research, address _dev) public onlyOwner {
      researchWallet = _research;
      devWallet = _dev;
      _isExcludedFromFee[_research] = true;
      _isExcludedFromFee[_dev] = true;
      emit WalletsChanged();
    }

    function setPresaleWallet(address _presaleWallet) public onlyOwner {
      _isExcludedFromFee[_presaleWallet] = true;
      isPresaleWallet[_presaleWallet]=true;
    }

   function setMaxTxPercent(uint256 maxTxPercent) external onlyOwner {
        uint256 _previoiusAmount = _maxTxAmount;
        _maxTxAmount = _tTotal.mul(maxTxPercent).div(100);
        emit MaxTxAmountChanged(_previoiusAmount, _maxTxAmount);
    }
    
    function setMaxTxAmount(uint256 maxTxAmount) external onlyOwner {
        _maxTxAmount = maxTxAmount;
    }

    //@dev swapLiq is triggered only when the contract's balance is above this threshold
    function setThreshholdForLP(uint256 threshold) external onlyOwner {
      numTokensSellToAddToLiquidity = threshold * 10**_decimals;
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

    //  @dev receive BNB from pancakeswapV2Router when swapping
    receive() external payable {}

    function _reflectRfi(uint256 rRfi, uint256 tRfi) private {
        _rTotal = _rTotal.sub(rRfi);
        _tRfiTotal = _tRfiTotal.add(tRfi);
    }

    function _getValues(uint256 tAmount, bool takeFee) private view returns (valuesFromGetValues memory to_return) {
        to_return = _getTValues(tAmount, takeFee);
        (to_return.rAmount, to_return.rTransferAmount, to_return.rRfi) = _getRValues(to_return, tAmount, takeFee, _getRate());

        return to_return;

    }

    function _getTValues(uint256 tAmount, bool takeFee) private view returns (valuesFromGetValues memory s) {

        if(!takeFee) {
            s.tTransferAmount = tAmount;
            return s;
        }

        s.tRfi = tAmount.mul(feeRates.rfi).div(100);
        s.tLiquidity = tAmount.mul(feeRates.liquidity).div(100);
        s.tResearch = tAmount.mul(feeRates.research).div(100);
        s.tDev = tAmount.mul(feeRates.dev).div(100);

        s.tTransferAmount = tAmount.sub(s.tRfi).sub(s.tLiquidity).sub(s.tResearch).sub(s.tDev);

        return s;
    }

    function _getRValues(valuesFromGetValues memory s, uint256 tAmount, bool takeFee, uint256 currentRate) private pure returns (uint256 rAmount, uint256 rTransferAmount, uint256 rRfi) {

        rAmount = tAmount.mul(currentRate); //wondering how rfi works ? This is the trick

        if(!takeFee) {
          return(rAmount, rAmount, 0);
        }

        rRfi = s.tRfi.mul(currentRate);
        uint256 rLiquidity = s.tLiquidity.mul(currentRate);
        uint256 rResearch = s.tResearch.mul(currentRate);
        uint256 rDev = s.tDev.mul(currentRate);

        rTransferAmount = rAmount.sub(rRfi).sub(rLiquidity).sub(rResearch).sub(rDev);

        return (rAmount, rTransferAmount, rRfi);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate =  _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if(_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }


    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
    

    function _transfer(address from, address to, uint256 amount , bool takeFee) private {
        require(amount > 0, "Transfer amount must be greater than zero");
        require(amount <= balanceOf(from),"Insuf balance, check balance at SafeSale.finance if you have token lock");
        //Exclude owner and presale wallets from maxTxAmount.
        if((from != owner() && to != owner()) && ( !isPresaleWallet[from] &&  !isPresaleWallet[to]))  
            require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");

        uint256 contractTokenBalance = balanceOf(address(this));

        if(contractTokenBalance >= _maxTxAmount) {
            contractTokenBalance = _maxTxAmount;
        }

        bool overMinTokenBalance = contractTokenBalance >= numTokensSellToAddToLiquidity;
        if (overMinTokenBalance && !inSwapAndLiquify && from != pancakeswapV2Pair && swapAndLiquifyEnabled) {
            contractTokenBalance = numTokensSellToAddToLiquidity;
            //add liquidity
            swapAndLiquify(contractTokenBalance);
        }
        bool shouldTakeFeeForTransfer = takeFee &&
            !(_isExcludedFromFee[from] || _isExcludedFromFee[to]);

        _tokenTransfer(from, to, amount, shouldTakeFeeForTransfer);
    }


    function _tokenTransfer(address sender, address recipient, uint256 tAmount, bool takeFee) private {
        if (_rOwned[recipient] == 0) {numOfHODLers++;}
        valuesFromGetValues memory s = _getValues(tAmount, takeFee);

        if (_isExcluded[sender] && !_isExcluded[recipient]) {  //from excluded
                _tOwned[sender] = _tOwned[sender].sub(tAmount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) { //to excluded
                _tOwned[recipient] = _tOwned[recipient].add(s.tTransferAmount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) { //both excluded
                _tOwned[sender] = _tOwned[sender].sub(tAmount);
                _tOwned[recipient] = _tOwned[recipient].add(s.tTransferAmount);
        }

        //common to all transfers and == transfer std :
        _rOwned[sender] = _rOwned[sender].sub(s.rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(s.rTransferAmount);

        _takeLiquidity(s.tLiquidity);
        _reflectRfi(s.rRfi, s.tRfi);
        reflectDevandResearchFee(s.tDev,s.tResearch);

        emit Transfer(sender, recipient, s.tTransferAmount);
    }


    function reflectDevandResearchFee(uint256 tDev, uint256 tResearch) private {
        uint256 currentRate =  _getRate();
        uint256 rDevelopent =  tDev.mul(currentRate);
        uint256 rResearch =  tResearch.mul(currentRate);
        _tDevelopmentTotal = _tDevelopmentTotal.add(tDev);
        _rOwned[devWallet] = _rOwned[devWallet].add(rDevelopent);
        _tResearchTotal = _tResearchTotal.add(tResearch);
        _rOwned[researchWallet] = _rOwned[researchWallet].add(rResearch);
    }


    function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
        // split the contract balance into halves
        uint256 half = contractTokenBalance.div(2);
        uint256 otherHalf = contractTokenBalance.sub(half);

        // capture the contract's current BNB balance.
        // this is so that we can capture exactly the amount of BNB that the
        // swap creates, and not make the liquidity event include any BNB that
        // has been manually sent to the contract
        uint256 initialBalance = address(this).balance;

        if(swapTokensForBNB(half)) { //enough liquidity ? If not, no swapLiq
          uint256 newBalance = address(this).balance.sub(initialBalance);
          addLiquidity(otherHalf, newBalance);
          emit SwapAndLiquify(half, newBalance, otherHalf);
        }
    }

    // @dev This is used by the swapAndLiquify function to swap to BNB
    // allowance optimisation, only when needed - max allowance since spender=uniswap
    function swapTokensForBNB(uint256 tokenAmount) private returns (bool status){

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = PancakeSwapV2Router.WETH();

        if(allowance(address(this), address(PancakeSwapV2Router)) < tokenAmount) {
          _approve(address(this), address(PancakeSwapV2Router), ~uint256(0));
        }

        try PancakeSwapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,0,path,address(this),block.timestamp) {
          emit SwapAndLiquifyStatus("Success");
          return true;
        }
        catch {
          emit SwapAndLiquifyStatus("Failed");
          return false;
        }

    }

    function addLiquidity(uint256 tokenAmount, uint256 bnbAmount) private {
        PancakeSwapV2Router.addLiquidityETH{value: bnbAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            owner(),
            block.timestamp
        );
        emit LiquidityAdded(tokenAmount, bnbAmount);
    }

    function totalDevelopmentFee() public view returns (uint256) {
        return _tDevelopmentTotal;
    }
    
    function totalResearchFee() public view returns (uint256) {
        return _tResearchTotal;
    }
    
    function adminConfig(address adminAddress , bool isAdmin) external onlyOwner {
        adminAddresses[adminAddress] = isAdmin;
    }

    modifier onlyAdmin() {
        require(adminAddresses[_msgSender()], "Caller is not an admin.");
        _;
    }

    function _mint(address recipient, uint256 amount) private {
        require(amount > 0, "Transfer amount must be greater than zero");
        require(_tTotal + amount <= 4 * 10**9 * 10**_decimals, "Total supply cannot exceed 4B");
        
        uint256 _rTransferAmount = (amount.mul(_rTotal)).div(_tTotal);
        
        _tTotal = _tTotal.add(amount);
        _rTotal = _rTotal.add(_rTransferAmount);

        if (_isExcluded[recipient]) {
            _tOwned[recipient] = _tOwned[recipient].add(amount);
        }

        _rOwned[recipient] = _rOwned[recipient].add(_rTransferAmount);

        emit Transfer(address(0), recipient, amount);
    }

    function _burn(address senderAddress, uint256 amount) private {
        require(amount > 0, "Transfer amount must be greater than zero");
        require(amount <= balanceOf(senderAddress), "Insufficient balance");
        require(_tTotal - amount >= 0, "Total supply cannot be below 0");

        uint256 _rTransferAmount = (amount.mul(_rTotal)).div(_tTotal);
        
        _tTotal = _tTotal.sub(amount);
        _rTotal = _rTotal.sub(_rTransferAmount);

        if (_isExcluded[senderAddress]) {
            _tOwned[senderAddress] = _tOwned[senderAddress].sub(amount);
        }

        _rOwned[senderAddress] = _rOwned[senderAddress].sub(_rTransferAmount);

        emit Transfer(senderAddress, address(0), amount);
    }

    function mint(address recipient, uint256 value)
        external
        override
        onlyAdmin
    {
        _mint(recipient, value);
        emit Mint(value, recipient);
    }

    function burn(address fromAddress, uint256 value) external override onlyAdmin {
        _burn(fromAddress, value);
        emit Burn(value, fromAddress);
    }
    
    
    function withdrawStuckTokens(IERC20 token, address to) external onlyOwner {
        uint256 balance = token.balanceOf(address(this));
        token.transfer(to, balance);
    }

    function withdrawLeftoverETH(address payable receipient) external onlyOwner {
        receipient.transfer(address(this).balance);
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BalanceWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"burnAddress","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[],"name":"FeesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bnbAmount","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"MaxTxAmountChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"mintAddress","type":"address"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bnbReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"status","type":"string"}],"name":"SwapAndLiquifyStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[],"name":"WalletsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"tokensBurned","type":"event"},{"inputs":[],"name":"PancakeSwapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"adminAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"adminAddress","type":"address"},{"internalType":"bool","name":"isAdmin","type":"bool"}],"name":"adminConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fromAddress","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFeeAndRfi","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromRFI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeRates","outputs":[{"internalType":"uint8","name":"rfi","type":"uint8"},{"internalType":"uint8","name":"liquidity","type":"uint8"},{"internalType":"uint8","name":"research","type":"uint8"},{"internalType":"uint8","name":"dev","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInRFI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isContractTransferFeeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isPresaleWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWalletTransferFeeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"numOfHODLers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSellToAddToLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pancakeswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferRfi","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"researchWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxAmount","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxPercent","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_presaleWallet","type":"address"}],"name":"setPresaleWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_rfi","type":"uint8"},{"internalType":"uint8","name":"_lp","type":"uint8"},{"internalType":"uint8","name":"_research","type":"uint8"},{"internalType":"uint8","name":"_dev","type":"uint8"}],"name":"setRfiRatesPercents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"setThreshholdForLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_research","type":"address"},{"internalType":"address","name":"_dev","type":"address"}],"name":"setWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"toggleContractTransferTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWalletTransferTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDevelopmentFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalResearchFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"receipient","type":"address"}],"name":"withdrawLeftoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526008805461ffff1916610100179055620000216009600a6200051d565b6200002e90600162000535565b60098181556200004090600a6200051d565b6200005c906f0c097ce7bc90715b34b9f1000000000062000535565b62000068919062000557565b620000766009600a6200051d565b62000092906f0c097ce7bc90715b34b9f1000000000062000535565b6200009e91906200057a565b600a908155604080516080810182526002815260066020820152600191810182905260600152600f8054630101060263ffffffff199091161790556014805460ff60a81b1916600160a81b179055620000fa906009906200051d565b6200010a9063ee6b280062000535565b6015556200011b6009600a6200051d565b6200012a90623d090062000535565b6016553480156200013a57600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600a543360009081526001602090815260409182902092909255805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d92839263c45a01559260048083019392829003018186803b158015620001de57600080fd5b505afa158015620001f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000219919062000594565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200026257600080fd5b505afa15801562000277573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029d919062000594565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620002e657600080fd5b505af1158015620002fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000321919062000594565b601480546001600160a01b03199081166001600160a01b039384161790915560138054909116918316919091179055600160046000620003696000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526004909252902080549091166001179055620003b13390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600954604051620003f991815260200190565b60405180910390a350620005bf565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200045f57816000190482111562000443576200044362000408565b808516156200045157918102915b93841c939080029062000423565b509250929050565b600082620004785750600162000517565b81620004875750600062000517565b8160018114620004a05760028114620004ab57620004cb565b600191505062000517565b60ff841115620004bf57620004bf62000408565b50506001821b62000517565b5060208310610133831016604e8410600b8410161715620004f0575081810a62000517565b620004fc83836200041e565b806000190482111562000513576200051362000408565b0290505b92915050565b60006200052e60ff84168362000467565b9392505050565b600081600019048311821515161562000552576200055262000408565b500290565b6000826200057557634e487b7160e01b600052601260045260246000fd5b500690565b6000828210156200058f576200058f62000408565b500390565b600060208284031215620005a757600080fd5b81516001600160a01b03811681146200052e57600080fd5b6146ce80620005cf6000396000f3fe6080604052600436106103435760003560e01c80637688c584116101b0578063bfa24742116100ec578063d543dbeb11610095578063ea2f0b371161006f578063ea2f0b3714610a74578063ec28438a14610a94578063f2fde38b14610ab4578063fbc232cd14610ad457600080fd5b8063d543dbeb146109ec578063db5d653614610a0c578063dd62ed3e14610a2157600080fd5b8063d07a091c116100c6578063d07a091c14610996578063d12a7688146109b6578063d3f6a157146109cc57600080fd5b8063bfa2474214610936578063c49b9a8014610956578063c9becf121461097657600080fd5b806395d89b41116101595780639f16544d116101335780639f16544d146108c1578063a457c2d7146108d6578063a8e11c67146108f6578063a9059cbb1461091657600080fd5b806395d89b411461034f5780639dc29fac1461088c5780639ebd86db146108ac57600080fd5b806388f820201161018a57806388f82020146107ee5780638da5cb5b146108345780638ea5220f1461085f57600080fd5b80637688c5841461074857806379fdd832146107ab5780637d1db4a5146107d857600080fd5b806340c10f191161027f5780634ed38faf1161022857806354bc089f1161020257806354bc089f146106bb578063571d622d146106db5780636d2dda02146106fb57806370a082311461072857600080fd5b80634ed38faf146105f357806352892884146106235780635342acb41461067557600080fd5b80634549b039116102595780634549b039146105805780634a74bb02146105a05780634d11ef9b146105d357600080fd5b806340c10f191461051057806340fb7ad914610530578063437823ec1461056057600080fd5b806325b86edf116102ec578063313ce567116102c6578063313ce567146104a05780633467a760146104bc57806338dac461146104db57806339509351146104f057600080fd5b806325b86edf1461043e5780632d6c2631146104605780632d8381191461048057600080fd5b806318160ddd1161031d57806318160ddd146103f357806320fecdd11461040857806323b872dd1461041e57600080fd5b806306fdde031461034f578063095ea7b3146103a457806313114a9d146103d457600080fd5b3661034a57005b600080fd5b34801561035b57600080fd5b50604080518082018252600581527f6550494e470000000000000000000000000000000000000000000000000000006020820152905161039b919061404a565b60405180910390f35b3480156103b057600080fd5b506103c46103bf3660046140df565b610aee565b604051901515815260200161039b565b3480156103e057600080fd5b50600b545b60405190815260200161039b565b3480156103ff57600080fd5b506009546103e5565b34801561041457600080fd5b506103e5600c5481565b34801561042a57600080fd5b506103c461043936600461410b565b610b05565b34801561044a57600080fd5b5061045e61045936600461414c565b610bc2565b005b34801561046c57600080fd5b5061045e61047b366004614185565b610d9a565b34801561048c57600080fd5b506103e561049b3660046141a2565b61106f565b3480156104ac57600080fd5b506040516009815260200161039b565b3480156104c857600080fd5b506008546103c490610100900460ff1681565b3480156104e757600080fd5b5061045e611120565b3480156104fc57600080fd5b506103c461050b3660046140df565b6111db565b34801561051c57600080fd5b5061045e61052b3660046140df565b61121e565b34801561053c57600080fd5b506103c461054b366004614185565b60126020526000908152604090205460ff1681565b34801561056c57600080fd5b5061045e61057b366004614185565b6112f4565b34801561058c57600080fd5b506103e561059b3660046141c9565b6113c4565b3480156105ac57600080fd5b506014546103c4907501000000000000000000000000000000000000000000900460ff1681565b3480156105df57600080fd5b5061045e6105ee366004614185565b611468565b3480156105ff57600080fd5b506103c461060e366004614185565b60066020526000908152604090205460ff1681565b34801561062f57600080fd5b506014546106509073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161039b565b34801561068157600080fd5b506103c4610690366004614185565b73ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205460ff1690565b3480156106c757600080fd5b5061045e6106d6366004614185565b6114fe565b3480156106e757600080fd5b5061045e6106f6366004614185565b611739565b34801561070757600080fd5b506010546106509073ffffffffffffffffffffffffffffffffffffffff1681565b34801561073457600080fd5b506103e5610743366004614185565b6117fc565b34801561075457600080fd5b50600f5461077e9060ff808216916101008104821691620100008204811691630100000090041684565b6040805160ff9586168152938516602085015291841691830191909152909116606082015260800161039b565b3480156107b757600080fd5b506013546106509073ffffffffffffffffffffffffffffffffffffffff1681565b3480156107e457600080fd5b506103e560155481565b3480156107fa57600080fd5b506103c4610809366004614185565b73ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205460ff1690565b34801561084057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610650565b34801561086b57600080fd5b506011546106509073ffffffffffffffffffffffffffffffffffffffff1681565b34801561089857600080fd5b5061045e6108a73660046140df565b611882565b3480156108b857600080fd5b50600e546103e5565b3480156108cd57600080fd5b5061045e611950565b3480156108e257600080fd5b506103c46108f13660046140df565b611a03565b34801561090257600080fd5b5061045e610911366004614204565b611a5f565b34801561092257600080fd5b506103c46109313660046140df565b611ba4565b34801561094257600080fd5b5061045e6109513660046141a2565b611bb9565b34801561096257600080fd5b5061045e610971366004614258565b611c56565b34801561098257600080fd5b5061045e610991366004614275565b611d5c565b3480156109a257600080fd5b5061045e6109b1366004614185565b611e33565b3480156109c257600080fd5b506103e560165481565b3480156109d857600080fd5b5061045e6109e736600461414c565b611f1b565b3480156109f857600080fd5b5061045e610a073660046141a2565b612066565b348015610a1857600080fd5b50600d546103e5565b348015610a2d57600080fd5b506103e5610a3c36600461414c565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260036020908152604080832093909416825291909152205490565b348015610a8057600080fd5b5061045e610a8f366004614185565b612140565b348015610aa057600080fd5b5061045e610aaf3660046141a2565b61220d565b348015610ac057600080fd5b5061045e610acf366004614185565b612293565b348015610ae057600080fd5b506008546103c49060ff1681565b6000610afb338484612444565b5060015b92915050565b600073ffffffffffffffffffffffffffffffffffffffff84163b15610b4457610b3f848484600860019054906101000a900460ff166125f8565b610b59565b600854610b599085908590859060ff166125f8565b610bb88433610bb38560405180606001604052806028815260200161464c6028913973ffffffffffffffffffffffffffffffffffffffff8a16600090815260036020908152604080832033845290915290205491906129ad565b612444565b5060019392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a082319060240160206040518083038186803b158015610cb057600080fd5b505afa158015610cc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce891906142a3565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390529192509084169063a9059cbb90604401602060405180830381600087803b158015610d5c57600080fd5b505af1158015610d70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9491906142bc565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090205460ff16610eaa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610c3f565b60005b60075481101561106b578173ffffffffffffffffffffffffffffffffffffffff1660078281548110610ee157610ee16142d9565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614156110595760078054610f1990600190614337565b81548110610f2957610f296142d9565b6000918252602090912001546007805473ffffffffffffffffffffffffffffffffffffffff9092169183908110610f6257610f626142d9565b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055918416815260028252604080822082905560059092522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556007805480610ffd57610ffd61434e565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690550190555050565b806110638161437d565b915050610ead565b5050565b6000600a54821115611103576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201527f65666c656374696f6e73000000000000000000000000000000000000000000006064820152608401610c3f565b600061110d6129fe565b90506111198382612a21565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b33600081815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610afb918590610bb39086612a96565b3360009081526006602052604090205460ff16611297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616c6c6572206973206e6f7420616e2061646d696e2e0000000000000000006044820152606401610c3f565b6112a18282612b0f565b6040805182815273ffffffffffffffffffffffffffffffffffffffff841660208201527ff3cea5493d790af0133817606f7350a91d7f154ea52eaa79d179d4d231e5010291015b60405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff16600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000600954831115611432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610c3f565b8161144e576000611444846001612d82565b519150610aff9050565b600061145b846001612d82565b602001519150610aff9050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146114e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b6114f2816112f4565b6114fb816114fe565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461157f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090205460ff161561160f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260016020526040902054156116905773ffffffffffffffffffffffffffffffffffffffff81166000908152600160205260409020546116699061106f565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600260205260409020555b73ffffffffffffffffffffffffffffffffffffffff16600081815260056020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146117ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b60405173ffffffffffffffffffffffffffffffffffffffff8216904780156108fc02916000818181858888f1935050505015801561106b573d6000803e3d6000fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081205460ff1615611853575073ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902054610aff9061106f565b3360009081526006602052604090205460ff166118fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616c6c6572206973206e6f7420616e2061646d696e2e0000000000000000006044820152606401610c3f565b6119058282612dfb565b6040805182815273ffffffffffffffffffffffffffffffffffffffff841660208201527ff6554c3a5d28e08c120b5a69c7edbaf52f935bd2596a60b8a18e282cd257cddb91016112e8565b60005473ffffffffffffffffffffffffffffffffffffffff1633146119d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b6000610afb3384610bb3856040518060600160405280602581526020016146746025913933600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8d16845290915290205491906129ad565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ae0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b600f805460ff8681167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009092169190911761010086831602177fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff1662010000858316027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff16176301000000918416919091021790556040517f846206d6c3449ac0b05841dfb88bf28b55aef00f96152490c69c96238048de1590600090a150505050565b6000610afb336008548590859060ff166125f8565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b611c466009600a6144d6565b611c5090826144e5565b60165550565b60005473ffffffffffffffffffffffffffffffffffffffff163314611cd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b601480548215157501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff9091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990611d5190831515815260200190565b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ddd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314611eb4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff166000908152600460209081526040808320805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092556012909352922080549091169091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314611f9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b6010805473ffffffffffffffffffffffffffffffffffffffff8085167fffffffffffffffffffffffff000000000000000000000000000000000000000092831681179093556011805491851691909216811790915560009182526004602052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009081166001908117909255928452818420805490931617909155517fffb3cd8846e7abe92a150cf0618d4e5f6c419c78b6a11e965eb40d6e63e690649190a15050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146120e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b601554600954612104906064906120fe90856130c5565b90612a21565b60158190556040805183815260208101929092527fd6f586005531e7d32112f5389278497d656f7ed9029f31f85494a3f58ca1833391016112e8565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff16600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60005473ffffffffffffffffffffffffffffffffffffffff16331461228e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b601555565b60005473ffffffffffffffffffffffffffffffffffffffff163314612314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff81166123b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610c3f565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff83166124e6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610c3f565b73ffffffffffffffffffffffffffffffffffffffff8216612589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610c3f565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60008211612688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610c3f565b612691846117fc565b821115612746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f496e7375662062616c616e63652c20636865636b2062616c616e63652061742060448201527f5361666553616c652e66696e616e636520696620796f75206861766520746f6b60648201527f656e206c6f636b00000000000000000000000000000000000000000000000000608482015260a401610c3f565b60005473ffffffffffffffffffffffffffffffffffffffff85811691161480159061278c575060005473ffffffffffffffffffffffffffffffffffffffff848116911614155b80156127ef575073ffffffffffffffffffffffffffffffffffffffff841660009081526012602052604090205460ff161580156127ef575073ffffffffffffffffffffffffffffffffffffffff831660009081526012602052604090205460ff16155b1561288657601554821115612886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785460448201527f78416d6f756e742e0000000000000000000000000000000000000000000000006064820152608401610c3f565b6000612891306117fc565b905060155481106128a157506015545b601654811080159081906128d0575060145474010000000000000000000000000000000000000000900460ff16155b80156128f7575060145473ffffffffffffffffffffffffffffffffffffffff878116911614155b801561291e57506014547501000000000000000000000000000000000000000000900460ff165b156129315760165491506129318261317a565b6000838015612996575073ffffffffffffffffffffffffffffffffffffffff871660009081526004602052604090205460ff1680612994575073ffffffffffffffffffffffffffffffffffffffff861660009081526004602052604090205460ff165b155b90506129a48787878461326e565b50505050505050565b600081848411156129eb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3f919061404a565b506129f68385614337565b949350505050565b6000806000612a0b61366e565b9092509050612a1a8282612a21565b9250505090565b6000808211612a8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610c3f565b6111198284614522565b600080612aa3838561455d565b905083811015611119576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610c3f565b60008111612b9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610c3f565b612bab6009600a6144d6565b612bb99063ee6b28006144e5565b81600954612bc7919061455d565b1115612c2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f546f74616c20737570706c792063616e6e6f74206578636565642034420000006044820152606401610c3f565b6000612c4c6009546120fe600a54856130c590919063ffffffff16565b600954909150612c5c9083612a96565b600955600a54612c6c9082612a96565b600a5573ffffffffffffffffffffffffffffffffffffffff831660009081526005602052604090205460ff1615612cf45773ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040902054612ccd9083612a96565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600260205260409020555b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054612d249082612a96565b73ffffffffffffffffffffffffffffffffffffffff84166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906125eb9086815260200190565b612dca60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b612dd48383613824565b9050612de9818484612de46129fe565b613947565b60408401526020830152815292915050565b60008111612e8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610c3f565b612e94826117fc565b811115612efd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e73756666696369656e742062616c616e63650000000000000000000000006044820152606401610c3f565b600081600954612f0d9190614337565b1015612f75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f546f74616c20737570706c792063616e6e6f742062652062656c6f77203000006044820152606401610c3f565b6000612f926009546120fe600a54856130c590919063ffffffff16565b600954909150612fa290836139eb565b600955600a54612fb290826139eb565b600a5573ffffffffffffffffffffffffffffffffffffffff831660009081526005602052604090205460ff161561303a5773ffffffffffffffffffffffffffffffffffffffff831660009081526002602052604090205461301390836139eb565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600260205260409020555b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604090205461306a90826139eb565b73ffffffffffffffffffffffffffffffffffffffff84166000818152600160205260408082209390935591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906125eb9086815260200190565b6000826130d457506000610aff565b60006130e083856144e5565b9050826130ed8583614522565b14611119576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610c3f565b601480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905560006131c6826002612a21565b905060006131d483836139eb565b9050476131e083613a61565b156132405760006131f147836139eb565b90506131fd8382613d5c565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a1505b5050601480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690555050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600160205260409020546132ae57600c80549060006132a88361437d565b91905055505b60006132ba8383612d82565b73ffffffffffffffffffffffffffffffffffffffff861660009081526005602052604090205490915060ff168015613318575073ffffffffffffffffffffffffffffffffffffffff841660009081526005602052604090205460ff16155b156133785773ffffffffffffffffffffffffffffffffffffffff851660009081526002602052604090205461334d90846139eb565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260026020526040902055613530565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602052604090205460ff161580156133d3575073ffffffffffffffffffffffffffffffffffffffff841660009081526005602052604090205460ff165b1561343757606081015173ffffffffffffffffffffffffffffffffffffffff851660009081526002602052604090205461340c91612a96565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260026020526040902055613530565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602052604090205460ff168015613491575073ffffffffffffffffffffffffffffffffffffffff841660009081526005602052604090205460ff165b156135305773ffffffffffffffffffffffffffffffffffffffff85166000908152600260205260409020546134c690846139eb565b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600260205260408082209390935560608401519187168152919091205461350991612a96565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600260205260409020555b805173ffffffffffffffffffffffffffffffffffffffff8616600090815260016020526040902054613561916139eb565b73ffffffffffffffffffffffffffffffffffffffff808716600090815260016020908152604080832094909455840151918716815291909120546135a491612a96565b73ffffffffffffffffffffffffffffffffffffffff851660009081526001602052604090205560a08101516135d890613e99565b6135ea81604001518260800151613f22565b6135fc8160e001518260c00151613f46565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836060015160405161365f91815260200190565b60405180910390a35050505050565b600a546009546000918291825b6007548110156137f45782600160006007848154811061369d5761369d6142d9565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054118061372257508160026000600784815481106136ee576136ee6142d9565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054115b1561373857600a54600954945094505050509091565b61378b6001600060078481548110613752576137526142d9565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205484906139eb565b92506137e060026000600784815481106137a7576137a76142d9565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205483906139eb565b9150806137ec8161437d565b91505061367b565b50600954600a5461380491612a21565b82101561381b57600a546009549350935050509091565b90939092509050565b61386c60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8161387d5760608101839052610aff565b600f54613895906064906120fe90869060ff166130c5565b6080820152600f546138b7906064906120fe908690610100900460ff166130c5565b60a0820152600f546138da906064906120fe90869062010000900460ff166130c5565b60c0820152600f546138fe906064906120fe9086906301000000900460ff166130c5565b8160e001818152505061393c8160e001516139368360c001516139368560a0015161393687608001518a6139eb90919063ffffffff16565b906139eb565b606082015292915050565b6000808061395586856130c5565b925084613967575081905060006139e1565b608087015161397690856130c5565b90506000613991858960a001516130c590919063ffffffff16565b905060006139ac868a60c001516130c590919063ffffffff16565b905060006139c7878b60e001516130c590919063ffffffff16565b90506139db81613936848187818c8b6139eb565b94505050505b9450945094915050565b600082821115613a57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610c3f565b6111198284614337565b604080516002808252606082018352600092839291906020830190803683370190505090503081600081518110613a9a57613a9a6142d9565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152601354604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b158015613b1457600080fd5b505afa158015613b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b4c9190614575565b81600181518110613b5f57613b5f6142d9565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920181019190915260135430600090815260038352604080822092909416815291522054831115613bee57601354613bee90309073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612444565b6013546040517f791ac94700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063791ac94790613c4d908690600090869030904290600401614592565b600060405180830381600087803b158015613c6757600080fd5b505af1925050508015613c78575060015b613cec577f22b212abbac4f28435a37f1253f735d1d9c9b444577feee64b691ca091130297604051613cdb9060208082526006908201527f4661696c65640000000000000000000000000000000000000000000000000000604082015260600190565b60405180910390a150600092915050565b7f22b212abbac4f28435a37f1253f735d1d9c9b444577feee64b691ca091130297604051613d4b9060208082526007908201527f5375636365737300000000000000000000000000000000000000000000000000604082015260600190565b60405180910390a150600192915050565b60135473ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080613d9f60005473ffffffffffffffffffffffffffffffffffffffff1690565b60405160e088901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b158015613e2757600080fd5b505af1158015613e3b573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613e60919061461d565b505060408051848152602081018490527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b9250016112e8565b6000613ea36129fe565b90506000613eb183836130c5565b30600090815260016020526040902054909150613ece9082612a96565b3060009081526001602090815260408083209390935560059052205460ff1615613f1d5730600090815260026020526040902054613f0c9084612a96565b306000908152600260205260409020555b505050565b600a54613f2f90836139eb565b600a55600b54613f3f9082612a96565b600b555050565b6000613f506129fe565b90506000613f5e84836130c5565b90506000613f6c84846130c5565b600d54909150613f7c9086612a96565b600d5560115473ffffffffffffffffffffffffffffffffffffffff16600090815260016020526040902054613fb19083612a96565b60115473ffffffffffffffffffffffffffffffffffffffff16600090815260016020526040902055600e54613fe69085612a96565b600e5560105473ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205461401b9082612a96565b60105473ffffffffffffffffffffffffffffffffffffffff166000908152600160205260409020555050505050565b600060208083528351808285015260005b818110156140775785810183015185820160400152820161405b565b81811115614089576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146114fb57600080fd5b600080604083850312156140f257600080fd5b82356140fd816140bd565b946020939093013593505050565b60008060006060848603121561412057600080fd5b833561412b816140bd565b9250602084013561413b816140bd565b929592945050506040919091013590565b6000806040838503121561415f57600080fd5b823561416a816140bd565b9150602083013561417a816140bd565b809150509250929050565b60006020828403121561419757600080fd5b8135611119816140bd565b6000602082840312156141b457600080fd5b5035919050565b80151581146114fb57600080fd5b600080604083850312156141dc57600080fd5b82359150602083013561417a816141bb565b803560ff811681146141ff57600080fd5b919050565b6000806000806080858703121561421a57600080fd5b614223856141ee565b9350614231602086016141ee565b925061423f604086016141ee565b915061424d606086016141ee565b905092959194509250565b60006020828403121561426a57600080fd5b8135611119816141bb565b6000806040838503121561428857600080fd5b8235614293816140bd565b9150602083013561417a816141bb565b6000602082840312156142b557600080fd5b5051919050565b6000602082840312156142ce57600080fd5b8151611119816141bb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561434957614349614308565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143af576143af614308565b5060010190565b600181815b8085111561440f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156143f5576143f5614308565b8085161561440257918102915b93841c93908002906143bb565b509250929050565b60008261442657506001610aff565b8161443357506000610aff565b816001811461444957600281146144535761446f565b6001915050610aff565b60ff84111561446457614464614308565b50506001821b610aff565b5060208310610133831016604e8410600b8410161715614492575081810a610aff565b61449c83836143b6565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156144ce576144ce614308565b029392505050565b600061111960ff841683614417565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561451d5761451d614308565b500290565b600082614558577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000821982111561457057614570614308565b500190565b60006020828403121561458757600080fd5b8151611119816140bd565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156145ef57845173ffffffffffffffffffffffffffffffffffffffff16835293830193918301916001016145bd565b505073ffffffffffffffffffffffffffffffffffffffff969096166060850152505050608001529392505050565b60008060006060848603121561463257600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212204ad51105d22bc77a515d6b0e9e82627854012945e1913627b4b61b7c5e19abb264736f6c63430008090033

Deployed Bytecode

0x6080604052600436106103435760003560e01c80637688c584116101b0578063bfa24742116100ec578063d543dbeb11610095578063ea2f0b371161006f578063ea2f0b3714610a74578063ec28438a14610a94578063f2fde38b14610ab4578063fbc232cd14610ad457600080fd5b8063d543dbeb146109ec578063db5d653614610a0c578063dd62ed3e14610a2157600080fd5b8063d07a091c116100c6578063d07a091c14610996578063d12a7688146109b6578063d3f6a157146109cc57600080fd5b8063bfa2474214610936578063c49b9a8014610956578063c9becf121461097657600080fd5b806395d89b41116101595780639f16544d116101335780639f16544d146108c1578063a457c2d7146108d6578063a8e11c67146108f6578063a9059cbb1461091657600080fd5b806395d89b411461034f5780639dc29fac1461088c5780639ebd86db146108ac57600080fd5b806388f820201161018a57806388f82020146107ee5780638da5cb5b146108345780638ea5220f1461085f57600080fd5b80637688c5841461074857806379fdd832146107ab5780637d1db4a5146107d857600080fd5b806340c10f191161027f5780634ed38faf1161022857806354bc089f1161020257806354bc089f146106bb578063571d622d146106db5780636d2dda02146106fb57806370a082311461072857600080fd5b80634ed38faf146105f357806352892884146106235780635342acb41461067557600080fd5b80634549b039116102595780634549b039146105805780634a74bb02146105a05780634d11ef9b146105d357600080fd5b806340c10f191461051057806340fb7ad914610530578063437823ec1461056057600080fd5b806325b86edf116102ec578063313ce567116102c6578063313ce567146104a05780633467a760146104bc57806338dac461146104db57806339509351146104f057600080fd5b806325b86edf1461043e5780632d6c2631146104605780632d8381191461048057600080fd5b806318160ddd1161031d57806318160ddd146103f357806320fecdd11461040857806323b872dd1461041e57600080fd5b806306fdde031461034f578063095ea7b3146103a457806313114a9d146103d457600080fd5b3661034a57005b600080fd5b34801561035b57600080fd5b50604080518082018252600581527f6550494e470000000000000000000000000000000000000000000000000000006020820152905161039b919061404a565b60405180910390f35b3480156103b057600080fd5b506103c46103bf3660046140df565b610aee565b604051901515815260200161039b565b3480156103e057600080fd5b50600b545b60405190815260200161039b565b3480156103ff57600080fd5b506009546103e5565b34801561041457600080fd5b506103e5600c5481565b34801561042a57600080fd5b506103c461043936600461410b565b610b05565b34801561044a57600080fd5b5061045e61045936600461414c565b610bc2565b005b34801561046c57600080fd5b5061045e61047b366004614185565b610d9a565b34801561048c57600080fd5b506103e561049b3660046141a2565b61106f565b3480156104ac57600080fd5b506040516009815260200161039b565b3480156104c857600080fd5b506008546103c490610100900460ff1681565b3480156104e757600080fd5b5061045e611120565b3480156104fc57600080fd5b506103c461050b3660046140df565b6111db565b34801561051c57600080fd5b5061045e61052b3660046140df565b61121e565b34801561053c57600080fd5b506103c461054b366004614185565b60126020526000908152604090205460ff1681565b34801561056c57600080fd5b5061045e61057b366004614185565b6112f4565b34801561058c57600080fd5b506103e561059b3660046141c9565b6113c4565b3480156105ac57600080fd5b506014546103c4907501000000000000000000000000000000000000000000900460ff1681565b3480156105df57600080fd5b5061045e6105ee366004614185565b611468565b3480156105ff57600080fd5b506103c461060e366004614185565b60066020526000908152604090205460ff1681565b34801561062f57600080fd5b506014546106509073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161039b565b34801561068157600080fd5b506103c4610690366004614185565b73ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205460ff1690565b3480156106c757600080fd5b5061045e6106d6366004614185565b6114fe565b3480156106e757600080fd5b5061045e6106f6366004614185565b611739565b34801561070757600080fd5b506010546106509073ffffffffffffffffffffffffffffffffffffffff1681565b34801561073457600080fd5b506103e5610743366004614185565b6117fc565b34801561075457600080fd5b50600f5461077e9060ff808216916101008104821691620100008204811691630100000090041684565b6040805160ff9586168152938516602085015291841691830191909152909116606082015260800161039b565b3480156107b757600080fd5b506013546106509073ffffffffffffffffffffffffffffffffffffffff1681565b3480156107e457600080fd5b506103e560155481565b3480156107fa57600080fd5b506103c4610809366004614185565b73ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205460ff1690565b34801561084057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610650565b34801561086b57600080fd5b506011546106509073ffffffffffffffffffffffffffffffffffffffff1681565b34801561089857600080fd5b5061045e6108a73660046140df565b611882565b3480156108b857600080fd5b50600e546103e5565b3480156108cd57600080fd5b5061045e611950565b3480156108e257600080fd5b506103c46108f13660046140df565b611a03565b34801561090257600080fd5b5061045e610911366004614204565b611a5f565b34801561092257600080fd5b506103c46109313660046140df565b611ba4565b34801561094257600080fd5b5061045e6109513660046141a2565b611bb9565b34801561096257600080fd5b5061045e610971366004614258565b611c56565b34801561098257600080fd5b5061045e610991366004614275565b611d5c565b3480156109a257600080fd5b5061045e6109b1366004614185565b611e33565b3480156109c257600080fd5b506103e560165481565b3480156109d857600080fd5b5061045e6109e736600461414c565b611f1b565b3480156109f857600080fd5b5061045e610a073660046141a2565b612066565b348015610a1857600080fd5b50600d546103e5565b348015610a2d57600080fd5b506103e5610a3c36600461414c565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260036020908152604080832093909416825291909152205490565b348015610a8057600080fd5b5061045e610a8f366004614185565b612140565b348015610aa057600080fd5b5061045e610aaf3660046141a2565b61220d565b348015610ac057600080fd5b5061045e610acf366004614185565b612293565b348015610ae057600080fd5b506008546103c49060ff1681565b6000610afb338484612444565b5060015b92915050565b600073ffffffffffffffffffffffffffffffffffffffff84163b15610b4457610b3f848484600860019054906101000a900460ff166125f8565b610b59565b600854610b599085908590859060ff166125f8565b610bb88433610bb38560405180606001604052806028815260200161464c6028913973ffffffffffffffffffffffffffffffffffffffff8a16600090815260036020908152604080832033845290915290205491906129ad565b612444565b5060019392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a082319060240160206040518083038186803b158015610cb057600080fd5b505afa158015610cc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce891906142a3565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390529192509084169063a9059cbb90604401602060405180830381600087803b158015610d5c57600080fd5b505af1158015610d70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9491906142bc565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090205460ff16610eaa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610c3f565b60005b60075481101561106b578173ffffffffffffffffffffffffffffffffffffffff1660078281548110610ee157610ee16142d9565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614156110595760078054610f1990600190614337565b81548110610f2957610f296142d9565b6000918252602090912001546007805473ffffffffffffffffffffffffffffffffffffffff9092169183908110610f6257610f626142d9565b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055918416815260028252604080822082905560059092522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556007805480610ffd57610ffd61434e565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690550190555050565b806110638161437d565b915050610ead565b5050565b6000600a54821115611103576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201527f65666c656374696f6e73000000000000000000000000000000000000000000006064820152608401610c3f565b600061110d6129fe565b90506111198382612a21565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b33600081815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610afb918590610bb39086612a96565b3360009081526006602052604090205460ff16611297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616c6c6572206973206e6f7420616e2061646d696e2e0000000000000000006044820152606401610c3f565b6112a18282612b0f565b6040805182815273ffffffffffffffffffffffffffffffffffffffff841660208201527ff3cea5493d790af0133817606f7350a91d7f154ea52eaa79d179d4d231e5010291015b60405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff16600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000600954831115611432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610c3f565b8161144e576000611444846001612d82565b519150610aff9050565b600061145b846001612d82565b602001519150610aff9050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146114e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b6114f2816112f4565b6114fb816114fe565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461157f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090205460ff161561160f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260016020526040902054156116905773ffffffffffffffffffffffffffffffffffffffff81166000908152600160205260409020546116699061106f565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600260205260409020555b73ffffffffffffffffffffffffffffffffffffffff16600081815260056020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146117ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b60405173ffffffffffffffffffffffffffffffffffffffff8216904780156108fc02916000818181858888f1935050505015801561106b573d6000803e3d6000fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081205460ff1615611853575073ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902054610aff9061106f565b3360009081526006602052604090205460ff166118fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616c6c6572206973206e6f7420616e2061646d696e2e0000000000000000006044820152606401610c3f565b6119058282612dfb565b6040805182815273ffffffffffffffffffffffffffffffffffffffff841660208201527ff6554c3a5d28e08c120b5a69c7edbaf52f935bd2596a60b8a18e282cd257cddb91016112e8565b60005473ffffffffffffffffffffffffffffffffffffffff1633146119d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b6000610afb3384610bb3856040518060600160405280602581526020016146746025913933600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8d16845290915290205491906129ad565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ae0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b600f805460ff8681167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009092169190911761010086831602177fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff1662010000858316027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff16176301000000918416919091021790556040517f846206d6c3449ac0b05841dfb88bf28b55aef00f96152490c69c96238048de1590600090a150505050565b6000610afb336008548590859060ff166125f8565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b611c466009600a6144d6565b611c5090826144e5565b60165550565b60005473ffffffffffffffffffffffffffffffffffffffff163314611cd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b601480548215157501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff9091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990611d5190831515815260200190565b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ddd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314611eb4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff166000908152600460209081526040808320805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092556012909352922080549091169091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314611f9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b6010805473ffffffffffffffffffffffffffffffffffffffff8085167fffffffffffffffffffffffff000000000000000000000000000000000000000092831681179093556011805491851691909216811790915560009182526004602052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009081166001908117909255928452818420805490931617909155517fffb3cd8846e7abe92a150cf0618d4e5f6c419c78b6a11e965eb40d6e63e690649190a15050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146120e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b601554600954612104906064906120fe90856130c5565b90612a21565b60158190556040805183815260208101929092527fd6f586005531e7d32112f5389278497d656f7ed9029f31f85494a3f58ca1833391016112e8565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff16600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60005473ffffffffffffffffffffffffffffffffffffffff16331461228e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b601555565b60005473ffffffffffffffffffffffffffffffffffffffff163314612314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff81166123b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610c3f565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff83166124e6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610c3f565b73ffffffffffffffffffffffffffffffffffffffff8216612589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610c3f565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60008211612688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610c3f565b612691846117fc565b821115612746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f496e7375662062616c616e63652c20636865636b2062616c616e63652061742060448201527f5361666553616c652e66696e616e636520696620796f75206861766520746f6b60648201527f656e206c6f636b00000000000000000000000000000000000000000000000000608482015260a401610c3f565b60005473ffffffffffffffffffffffffffffffffffffffff85811691161480159061278c575060005473ffffffffffffffffffffffffffffffffffffffff848116911614155b80156127ef575073ffffffffffffffffffffffffffffffffffffffff841660009081526012602052604090205460ff161580156127ef575073ffffffffffffffffffffffffffffffffffffffff831660009081526012602052604090205460ff16155b1561288657601554821115612886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785460448201527f78416d6f756e742e0000000000000000000000000000000000000000000000006064820152608401610c3f565b6000612891306117fc565b905060155481106128a157506015545b601654811080159081906128d0575060145474010000000000000000000000000000000000000000900460ff16155b80156128f7575060145473ffffffffffffffffffffffffffffffffffffffff878116911614155b801561291e57506014547501000000000000000000000000000000000000000000900460ff165b156129315760165491506129318261317a565b6000838015612996575073ffffffffffffffffffffffffffffffffffffffff871660009081526004602052604090205460ff1680612994575073ffffffffffffffffffffffffffffffffffffffff861660009081526004602052604090205460ff165b155b90506129a48787878461326e565b50505050505050565b600081848411156129eb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3f919061404a565b506129f68385614337565b949350505050565b6000806000612a0b61366e565b9092509050612a1a8282612a21565b9250505090565b6000808211612a8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610c3f565b6111198284614522565b600080612aa3838561455d565b905083811015611119576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610c3f565b60008111612b9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610c3f565b612bab6009600a6144d6565b612bb99063ee6b28006144e5565b81600954612bc7919061455d565b1115612c2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f546f74616c20737570706c792063616e6e6f74206578636565642034420000006044820152606401610c3f565b6000612c4c6009546120fe600a54856130c590919063ffffffff16565b600954909150612c5c9083612a96565b600955600a54612c6c9082612a96565b600a5573ffffffffffffffffffffffffffffffffffffffff831660009081526005602052604090205460ff1615612cf45773ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040902054612ccd9083612a96565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600260205260409020555b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054612d249082612a96565b73ffffffffffffffffffffffffffffffffffffffff84166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906125eb9086815260200190565b612dca60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b612dd48383613824565b9050612de9818484612de46129fe565b613947565b60408401526020830152815292915050565b60008111612e8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610c3f565b612e94826117fc565b811115612efd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e73756666696369656e742062616c616e63650000000000000000000000006044820152606401610c3f565b600081600954612f0d9190614337565b1015612f75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f546f74616c20737570706c792063616e6e6f742062652062656c6f77203000006044820152606401610c3f565b6000612f926009546120fe600a54856130c590919063ffffffff16565b600954909150612fa290836139eb565b600955600a54612fb290826139eb565b600a5573ffffffffffffffffffffffffffffffffffffffff831660009081526005602052604090205460ff161561303a5773ffffffffffffffffffffffffffffffffffffffff831660009081526002602052604090205461301390836139eb565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600260205260409020555b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604090205461306a90826139eb565b73ffffffffffffffffffffffffffffffffffffffff84166000818152600160205260408082209390935591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906125eb9086815260200190565b6000826130d457506000610aff565b60006130e083856144e5565b9050826130ed8583614522565b14611119576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610c3f565b601480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905560006131c6826002612a21565b905060006131d483836139eb565b9050476131e083613a61565b156132405760006131f147836139eb565b90506131fd8382613d5c565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a1505b5050601480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690555050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600160205260409020546132ae57600c80549060006132a88361437d565b91905055505b60006132ba8383612d82565b73ffffffffffffffffffffffffffffffffffffffff861660009081526005602052604090205490915060ff168015613318575073ffffffffffffffffffffffffffffffffffffffff841660009081526005602052604090205460ff16155b156133785773ffffffffffffffffffffffffffffffffffffffff851660009081526002602052604090205461334d90846139eb565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260026020526040902055613530565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602052604090205460ff161580156133d3575073ffffffffffffffffffffffffffffffffffffffff841660009081526005602052604090205460ff165b1561343757606081015173ffffffffffffffffffffffffffffffffffffffff851660009081526002602052604090205461340c91612a96565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260026020526040902055613530565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602052604090205460ff168015613491575073ffffffffffffffffffffffffffffffffffffffff841660009081526005602052604090205460ff165b156135305773ffffffffffffffffffffffffffffffffffffffff85166000908152600260205260409020546134c690846139eb565b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600260205260408082209390935560608401519187168152919091205461350991612a96565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600260205260409020555b805173ffffffffffffffffffffffffffffffffffffffff8616600090815260016020526040902054613561916139eb565b73ffffffffffffffffffffffffffffffffffffffff808716600090815260016020908152604080832094909455840151918716815291909120546135a491612a96565b73ffffffffffffffffffffffffffffffffffffffff851660009081526001602052604090205560a08101516135d890613e99565b6135ea81604001518260800151613f22565b6135fc8160e001518260c00151613f46565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836060015160405161365f91815260200190565b60405180910390a35050505050565b600a546009546000918291825b6007548110156137f45782600160006007848154811061369d5761369d6142d9565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054118061372257508160026000600784815481106136ee576136ee6142d9565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054115b1561373857600a54600954945094505050509091565b61378b6001600060078481548110613752576137526142d9565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205484906139eb565b92506137e060026000600784815481106137a7576137a76142d9565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205483906139eb565b9150806137ec8161437d565b91505061367b565b50600954600a5461380491612a21565b82101561381b57600a546009549350935050509091565b90939092509050565b61386c60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8161387d5760608101839052610aff565b600f54613895906064906120fe90869060ff166130c5565b6080820152600f546138b7906064906120fe908690610100900460ff166130c5565b60a0820152600f546138da906064906120fe90869062010000900460ff166130c5565b60c0820152600f546138fe906064906120fe9086906301000000900460ff166130c5565b8160e001818152505061393c8160e001516139368360c001516139368560a0015161393687608001518a6139eb90919063ffffffff16565b906139eb565b606082015292915050565b6000808061395586856130c5565b925084613967575081905060006139e1565b608087015161397690856130c5565b90506000613991858960a001516130c590919063ffffffff16565b905060006139ac868a60c001516130c590919063ffffffff16565b905060006139c7878b60e001516130c590919063ffffffff16565b90506139db81613936848187818c8b6139eb565b94505050505b9450945094915050565b600082821115613a57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610c3f565b6111198284614337565b604080516002808252606082018352600092839291906020830190803683370190505090503081600081518110613a9a57613a9a6142d9565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152601354604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b158015613b1457600080fd5b505afa158015613b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b4c9190614575565b81600181518110613b5f57613b5f6142d9565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920181019190915260135430600090815260038352604080822092909416815291522054831115613bee57601354613bee90309073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612444565b6013546040517f791ac94700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063791ac94790613c4d908690600090869030904290600401614592565b600060405180830381600087803b158015613c6757600080fd5b505af1925050508015613c78575060015b613cec577f22b212abbac4f28435a37f1253f735d1d9c9b444577feee64b691ca091130297604051613cdb9060208082526006908201527f4661696c65640000000000000000000000000000000000000000000000000000604082015260600190565b60405180910390a150600092915050565b7f22b212abbac4f28435a37f1253f735d1d9c9b444577feee64b691ca091130297604051613d4b9060208082526007908201527f5375636365737300000000000000000000000000000000000000000000000000604082015260600190565b60405180910390a150600192915050565b60135473ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080613d9f60005473ffffffffffffffffffffffffffffffffffffffff1690565b60405160e088901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b158015613e2757600080fd5b505af1158015613e3b573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613e60919061461d565b505060408051848152602081018490527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b9250016112e8565b6000613ea36129fe565b90506000613eb183836130c5565b30600090815260016020526040902054909150613ece9082612a96565b3060009081526001602090815260408083209390935560059052205460ff1615613f1d5730600090815260026020526040902054613f0c9084612a96565b306000908152600260205260409020555b505050565b600a54613f2f90836139eb565b600a55600b54613f3f9082612a96565b600b555050565b6000613f506129fe565b90506000613f5e84836130c5565b90506000613f6c84846130c5565b600d54909150613f7c9086612a96565b600d5560115473ffffffffffffffffffffffffffffffffffffffff16600090815260016020526040902054613fb19083612a96565b60115473ffffffffffffffffffffffffffffffffffffffff16600090815260016020526040902055600e54613fe69085612a96565b600e5560105473ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205461401b9082612a96565b60105473ffffffffffffffffffffffffffffffffffffffff166000908152600160205260409020555050505050565b600060208083528351808285015260005b818110156140775785810183015185820160400152820161405b565b81811115614089576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146114fb57600080fd5b600080604083850312156140f257600080fd5b82356140fd816140bd565b946020939093013593505050565b60008060006060848603121561412057600080fd5b833561412b816140bd565b9250602084013561413b816140bd565b929592945050506040919091013590565b6000806040838503121561415f57600080fd5b823561416a816140bd565b9150602083013561417a816140bd565b809150509250929050565b60006020828403121561419757600080fd5b8135611119816140bd565b6000602082840312156141b457600080fd5b5035919050565b80151581146114fb57600080fd5b600080604083850312156141dc57600080fd5b82359150602083013561417a816141bb565b803560ff811681146141ff57600080fd5b919050565b6000806000806080858703121561421a57600080fd5b614223856141ee565b9350614231602086016141ee565b925061423f604086016141ee565b915061424d606086016141ee565b905092959194509250565b60006020828403121561426a57600080fd5b8135611119816141bb565b6000806040838503121561428857600080fd5b8235614293816140bd565b9150602083013561417a816141bb565b6000602082840312156142b557600080fd5b5051919050565b6000602082840312156142ce57600080fd5b8151611119816141bb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561434957614349614308565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143af576143af614308565b5060010190565b600181815b8085111561440f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156143f5576143f5614308565b8085161561440257918102915b93841c93908002906143bb565b509250929050565b60008261442657506001610aff565b8161443357506000610aff565b816001811461444957600281146144535761446f565b6001915050610aff565b60ff84111561446457614464614308565b50506001821b610aff565b5060208310610133831016604e8410600b8410161715614492575081810a610aff565b61449c83836143b6565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156144ce576144ce614308565b029392505050565b600061111960ff841683614417565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561451d5761451d614308565b500290565b600082614558577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000821982111561457057614570614308565b500190565b60006020828403121561458757600080fd5b8151611119816140bd565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156145ef57845173ffffffffffffffffffffffffffffffffffffffff16835293830193918301916001016145bd565b505073ffffffffffffffffffffffffffffffffffffffff969096166060850152505050608001529392505050565b60008060006060848603121561463257600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212204ad51105d22bc77a515d6b0e9e82627854012945e1913627b4b61b7c5e19abb264736f6c63430008090033

Deployed Bytecode Sourcemap

17134:21070:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21051:83;;;;;;;;;;-1:-1:-1;21121:5:0;;;;;;;;;;;;;;;;21051:83;;;;21121:5;21051:83;:::i;:::-;;;;;;;;22011:161;;;;;;;;;;-1:-1:-1;22011:161:0;;;;;:::i;:::-;;:::i;:::-;;;1319:14:1;;1312:22;1294:41;;1282:2;1267:18;22011:161:0;1154:187:1;23309:87:0;;;;;;;;;;-1:-1:-1;23378:10:0;;23309:87;;;1492:25:1;;;1480:2;1465:18;23309:87:0;1346:177:1;21347:95:0;;;;;;;;;;-1:-1:-1;21427:7:0;;21347:95;;18094:27;;;;;;;;;;;;;;;;22180:490;;;;;;;;;;-1:-1:-1;22180:490:0;;;;;:::i;:::-;;:::i;37871:179::-;;;;;;;;;;-1:-1:-1;37871:179:0;;;;;:::i;:::-;;:::i;:::-;;24475:472;;;;;;;;;;-1:-1:-1;24475:472:0;;;;;:::i;:::-;;:::i;23876:253::-;;;;;;;;;;-1:-1:-1;23876:253:0;;;;;:::i;:::-;;:::i;21233:83::-;;;;;;;;;;-1:-1:-1;21233:83:0;;17865:1;2974:36:1;;2962:2;2947:18;21233:83:0;2832:184:1;17680:47:0;;;;;;;;;;-1:-1:-1;17680:47:0;;;;;;;;;;;20890:135;;;;;;;;;;;;;:::i;22678:218::-;;;;;;;;;;-1:-1:-1;22678:218:0;;;;;:::i;:::-;;:::i;37495:188::-;;;;;;;;;;-1:-1:-1;37495:188:0;;;;;:::i;:::-;;:::i;18866:48::-;;;;;;;;;;-1:-1:-1;18866:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;25103:111;;;;;;;;;;-1:-1:-1;25103:111:0;;;;;:::i;:::-;;:::i;23410:456::-;;;;;;;;;;-1:-1:-1;23410:456:0;;;;;:::i;:::-;;:::i;19134:40::-;;;;;;;;;;-1:-1:-1;19134:40:0;;;;;;;;;;;24955:140;;;;;;;;;;-1:-1:-1;24955:140:0;;;;;:::i;:::-;;:::i;17540:46::-;;;;;;;;;;-1:-1:-1;17540:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;19064:33;;;;;;;;;;-1:-1:-1;19064:33:0;;;;;;;;;;;3634:42:1;3622:55;;;3604:74;;3592:2;3577:18;19064:33:0;3458:226:1;25340:123:0;;;;;;;;;;-1:-1:-1;25340:123:0;;;;;:::i;:::-;25428:27;;25404:4;25428:27;;;:18;:27;;;;;;;;;25340:123;24137:330;;;;;;;;;;-1:-1:-1;24137:330:0;;;;;:::i;:::-;;:::i;38058:137::-;;;;;;;;;;-1:-1:-1;38058:137:0;;;;;:::i;:::-;;:::i;18799:29::-;;;;;;;;;;-1:-1:-1;18799:29:0;;;;;;;;21450:198;;;;;;;;;;-1:-1:-1;21450:198:0;;;;;:::i;:::-;;:::i;18386:120::-;;;;;;;;;;-1:-1:-1;18386:120:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4194:4:1;4182:17;;;4164:36;;4236:17;;;4231:2;4216:18;;4209:45;4290:17;;;4270:18;;;4263:45;;;;4344:17;;;4339:2;4324:18;;4317:45;4151:3;4136:19;18386:120:0;3949:419:1;19011:46:0;;;;;;;;;;-1:-1:-1;19011:46:0;;;;;;;;19183:56;;;;;;;;;;;;;;;;23181:120;;;;;;;;;;-1:-1:-1;23181:120:0;;;;;:::i;:::-;23273:20;;23249:4;23273:20;;;:11;:20;;;;;;;;;23181:120;10348:87;;;;;;;;;;-1:-1:-1;10394:7:0;10421:6;;;10348:87;;18835:24;;;;;;;;;;-1:-1:-1;18835:24:0;;;;;;;;37691:162;;;;;;;;;;-1:-1:-1;37691:162:0;;;;;:::i;:::-;;:::i;35687:99::-;;;;;;;;;;-1:-1:-1;35763:15:0;;35687:99;;20753:129;;;;;;;;;;;;;:::i;22904:269::-;;;;;;;;;;-1:-1:-1;22904:269:0;;;;;:::i;:::-;;:::i;25575:260::-;;;;;;;;;;-1:-1:-1;25575:260:0;;;;;:::i;:::-;;:::i;21656:194::-;;;;;;;;;;-1:-1:-1;21656:194:0;;;;;:::i;:::-;;:::i;26750:140::-;;;;;;;;;;-1:-1:-1;26750:140:0;;;;;:::i;:::-;;:::i;26898:171::-;;;;;;;;;;-1:-1:-1;26898:171:0;;;;;:::i;:::-;;:::i;35798:134::-;;;;;;;;;;-1:-1:-1;35798:134:0;;;;;:::i;:::-;;:::i;26104:170::-;;;;;;;;;;-1:-1:-1;26104:170:0;;;;;:::i;:::-;;:::i;19248:72::-;;;;;;;;;;;;;;;;25843:253;;;;;;;;;;-1:-1:-1;25843:253:0;;;;;:::i;:::-;;:::i;26281:250::-;;;;;;;;;;-1:-1:-1;26281:250:0;;;;;:::i;:::-;;:::i;35570:105::-;;;;;;;;;;-1:-1:-1;35649:18:0;;35570:105;;21860:143;;;;;;;;;;-1:-1:-1;21860:143:0;;;;;:::i;:::-;21968:18;;;;21941:7;21968:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;21860:143;25222:110;;;;;;;;;;-1:-1:-1;25222:110:0;;;;;:::i;:::-;;:::i;26543:109::-;;;;;;;;;;-1:-1:-1;26543:109:0;;;;;:::i;:::-;;:::i;10803:244::-;;;;;;;;;;-1:-1:-1;10803:244:0;;;;;:::i;:::-;;:::i;17627:46::-;;;;;;;;;;-1:-1:-1;17627:46:0;;;;;;;;22011:161;22086:4;22103:39;7781:10;22126:7;22135:6;22103:8;:39::i;:::-;-1:-1:-1;22160:4:0;22011:161;;;;;:::o;22180:490::-;22278:4;22298:17;;;9251:20;9290:8;22294:215;;22334:66;22344:6;22352:9;22363:6;22371:28;;;;;;;;;;;22334:9;:66::i;:::-;22294:215;;;22470:26;;22433:64;;22443:6;;22451:9;;22462:6;;22470:26;;22433:9;:64::i;:::-;22519:121;22528:6;7781:10;22550:89;22588:6;22550:89;;;;;;;;;;;;;;;;;:19;;;;;;;:11;:19;;;;;;;;7781:10;22550:33;;;;;;;;;;:37;:89::i;:::-;22519:8;:121::i;:::-;-1:-1:-1;22658:4:0;22180:490;;;;;:::o;37871:179::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;;;;;;;;;37974:30:::1;::::0;;;;37998:4:::1;37974:30;::::0;::::1;3604:74:1::0;37956:15:0::1;::::0;37974::::1;::::0;::::1;::::0;::::1;::::0;3577:18:1;;37974:30:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38015:27;::::0;;;;:14:::1;6957:55:1::0;;;38015:27:0::1;::::0;::::1;6939:74:1::0;7029:18;;;7022:34;;;37956:48:0;;-1:-1:-1;38015:14:0;;::::1;::::0;::::1;::::0;6912:18:1;;38015:27:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37945:105;37871:179:::0;;:::o;24475:472::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;24554:20:::1;::::0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;24546:56;;;::::0;::::1;::::0;;7519:2:1;24546:56:0::1;::::0;::::1;7501:21:1::0;7558:2;7538:18;;;7531:30;7597:25;7577:18;;;7570:53;7640:18;;24546:56:0::1;7317:347:1::0;24546:56:0::1;24618:9;24613:327;24637:9;:16:::0;24633:20;::::1;24613:327;;;24695:7;24679:23;;:9;24689:1;24679:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;:23;24675:254;;;24738:9;24748:16:::0;;:20:::1;::::0;24767:1:::1;::::0;24748:20:::1;:::i;:::-;24738:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;24723:9:::1;:12:::0;;24738:31:::1;::::0;;::::1;::::0;24733:1;;24723:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;;::::1;;::::0;;::::1;;::::0;;24788:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;24827:11:::1;:20:::0;;;;:28;;;::::1;::::0;;24874:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;;;;;;::::1;::::0;;;;;24613:327:::1;24475:472:::0;:::o;24675:254::-:1;24655:3:::0;::::1;::::0;::::1;:::i;:::-;;;;24613:327;;;;24475:472:::0;:::o;23876:253::-;23942:7;23981;;23970;:18;;23962:73;;;;;;;8768:2:1;23962:73:0;;;8750:21:1;8807:2;8787:18;;;8780:30;8846:34;8826:18;;;8819:62;8917:12;8897:18;;;8890:40;8947:19;;23962:73:0;8566:406:1;23962:73:0;24046:19;24069:10;:8;:10::i;:::-;24046:33;-1:-1:-1;24097:24:0;:7;24046:33;24097:11;:24::i;:::-;24090:31;23876:253;-1:-1:-1;;;23876:253:0:o;20890:135::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;20989:28:::1;::::0;;20957:60;;::::1;20989:28;::::0;;;::::1;;;20988:29;20957:60:::0;;::::1;;::::0;;20890:135::o;22678:218::-;7781:10;22766:4;22815:25;;;:11;:25;;;;;;;;;:34;;;;;;;;;;22766:4;;22783:83;;22806:7;;22815:50;;22854:10;22815:38;:50::i;37495:188::-;7781:10;35980:28;;;;:14;:28;;;;;;;;35972:64;;;;;;;9179:2:1;35972:64:0;;;9161:21:1;9218:2;9198:18;;;9191:30;9257:25;9237:18;;;9230:53;9300:18;;35972:64:0;8977:347:1;35972:64:0;37614:23:::1;37620:9;37631:5;37614;:23::i;:::-;37653:22;::::0;;9503:25:1;;;9576:42;9564:55;;9559:2;9544:18;;9537:83;37653:22:0::1;::::0;9476:18:1;37653:22:0::1;;;;;;;;37495:188:::0;;:::o;25103:111::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;25172:27:::1;;;::::0;;;:18:::1;:27;::::0;;;;:34;;;::::1;25202:4;25172:34;::::0;;25103:111::o;23410:456::-;23500:7;23539;;23528;:18;;23520:62;;;;;;;9833:2:1;23520:62:0;;;9815:21:1;9872:2;9852:18;;;9845:30;9911:33;9891:18;;;9884:61;9962:18;;23520:62:0;9631:355:1;23520:62:0;23598:17;23593:266;;23632:28;23663:25;23674:7;23683:4;23663:10;:25::i;:::-;23710:9;;-1:-1:-1;23703:16:0;;-1:-1:-1;23703:16:0;23593:266;23752:28;23783:25;23794:7;23803:4;23783:10;:25::i;:::-;23830:17;;;;-1:-1:-1;23823:24:0;;-1:-1:-1;23823:24:0;24955:140;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;25030:23:::1;25045:7;25030:14;:23::i;:::-;25064;25079:7;25064:14;:23::i;:::-;24955:140:::0;:::o;24137:330::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;24217:20:::1;::::0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;24216:21;24208:61;;;::::0;::::1;::::0;;10193:2:1;24208:61:0::1;::::0;::::1;10175:21:1::0;10232:2;10212:18;;;10205:30;10271:29;10251:18;;;10244:57;10318:18;;24208:61:0::1;9991:351:1::0;24208:61:0::1;24283:16;::::0;::::1;24302:1;24283:16:::0;;;:7:::1;:16;::::0;;;;;:20;24280:108:::1;;24359:16;::::0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;24339:37:::1;::::0;:19:::1;:37::i;:::-;24320:16;::::0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;24280:108:::1;24398:20;;;::::0;;;:11:::1;:20;::::0;;;;:27;;;::::1;24421:4;24398:27:::0;;::::1;::::0;;;24436:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;24137:330::o;38058:137::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;38145:42:::1;::::0;:19:::1;::::0;::::1;::::0;38165:21:::1;38145:42:::0;::::1;;;::::0;::::1;::::0;;;38165:21;38145:19;:42;::::1;;;;;;;;;;;;;::::0;::::1;;;;21450:198:::0;21540:20;;;21516:7;21540:20;;;:11;:20;;;;;;;;21536:49;;;-1:-1:-1;21569:16:0;;;;;;:7;:16;;;;;;;21450:198::o;21536:49::-;21623:16;;;;;;;:7;:16;;;;;;21603:37;;:19;:37::i;37691:162::-;7781:10;35980:28;;;;:14;:28;;;;;;;;35972:64;;;;;;;9179:2:1;35972:64:0;;;9161:21:1;9218:2;9198:18;;;9191:30;9257:25;9237:18;;;9230:53;9300:18;;35972:64:0;8977:347:1;35972:64:0;37780:25:::1;37786:11;37799:5;37780;:25::i;:::-;37821:24;::::0;;9503:25:1;;;9576:42;9564:55;;9559:2;9544:18;;9537:83;37821:24:0::1;::::0;9476:18:1;37821:24:0::1;9329:297:1::0;20753:129:0;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;20848:26:::1;::::0;;20818:56;;::::1;20848:26;::::0;;::::1;20847:27;20818:56;::::0;;20753:129::o;22904:269::-;22997:4;23014:129;7781:10;23037:7;23046:96;23085:15;23046:96;;;;;;;;;;;;;;;;;7781:10;23046:25;;;;:11;:25;;;;;;;;;:34;;;;;;;;;;;;:38;:96::i;25575:260::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;25682:8:::1;:19:::0;;::::1;::::0;;::::1;25710:24:::0;;;;;;;;25682:19:::1;25710:24:::0;;::::1;;;25781:19:::0;;25743:29;;;::::1;;25781:19:::0;;;;;;::::1;::::0;;;::::1;;::::0;;25814:13:::1;::::0;::::1;::::0;-1:-1:-1;;25814:13:0::1;25575:260:::0;;;;:::o;21656:194::-;21734:4;21751:69;7781:10;21793:26;;21775:9;;21785:6;;21793:26;;21751:9;:69::i;26750:140::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;26869:13:::1;17865:1;26869:2;:13;:::i;:::-;26857:25;::::0;:9;:25:::1;:::i;:::-;26825:29;:57:::0;-1:-1:-1;26750:140:0:o;26898:171::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;26975:21:::1;:32:::0;;;::::1;;::::0;::::1;::::0;;;::::1;;::::0;;27023:38:::1;::::0;::::1;::::0;::::1;::::0;26999:8;1319:14:1;1312:22;1294:41;;1282:2;1267:18;;1154:187;27023:38:0::1;;;;;;;;26898:171:::0;:::o;35798:134::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;35886:28:::1;::::0;;;::::1;;::::0;;;:14:::1;:28;::::0;;;;:38;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;35798:134::o;26104:170::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;26180:34:::1;;;::::0;;;:18:::1;:34;::::0;;;;;;;:41;;26217:4:::1;26180:41:::0;;;::::1;::::0;::::1;::::0;;;26230:15:::1;:31:::0;;;;;:36;;;;::::1;::::0;;::::1;::::0;;26104:170::o;25843:253::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;25922:14:::1;:26:::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;25957:9:::1;:16:::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;25922:14:::1;25982:29:::0;;;:18:::1;:29;::::0;;;;;:36;;;;;::::1;25922:26:::0;25982:36;;::::1;::::0;;;26027:24;;;;;;:31;;;;::::1;;::::0;;;26072:16;::::1;::::0;25922:14;26072:16:::1;25843:253:::0;;:::o;26281:250::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;26385:12:::1;::::0;26423:7:::1;::::0;:34:::1;::::0;26453:3:::1;::::0;26423:25:::1;::::0;26435:12;26423:11:::1;:25::i;:::-;:29:::0;::::1;:34::i;:::-;26408:12;:49:::0;;;26473:50:::1;::::0;;12257:25:1;;;12313:2;12298:18;;12291:34;;;;26473:50:0::1;::::0;12230:18:1;26473:50:0::1;12083:248:1::0;25222:110:0;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;25289:27:::1;;25319:5;25289:27:::0;;;:18:::1;:27;::::0;;;;:35;;;::::1;::::0;;25222:110::o;26543:109::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;26618:12:::1;:26:::0;26543:109::o;10803:244::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;10892:22:::1;::::0;::::1;10884:73;;;::::0;::::1;::::0;;12538:2:1;10884:73:0::1;::::0;::::1;12520:21:1::0;12577:2;12557:18;;;12550:30;12616:34;12596:18;;;12589:62;12687:8;12667:18;;;12660:36;12713:19;;10884:73:0::1;12336:402:1::0;10884:73:0::1;10994:6;::::0;;10973:38:::1;::::0;::::1;::::0;;::::1;::::0;10994:6;::::1;::::0;10973:38:::1;::::0;::::1;11022:6;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;10803:244::o;30073:337::-;30166:19;;;30158:68;;;;;;;12945:2:1;30158:68:0;;;12927:21:1;12984:2;12964:18;;;12957:30;13023:34;13003:18;;;12996:62;13094:6;13074:18;;;13067:34;13118:19;;30158:68:0;12743:400:1;30158:68:0;30245:21;;;30237:68;;;;;;;13350:2:1;30237:68:0;;;13332:21:1;13389:2;13369:18;;;13362:30;13428:34;13408:18;;;13401:62;13499:4;13479:18;;;13472:32;13521:19;;30237:68:0;13148:398:1;30237:68:0;30318:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;30370:32;;1492:25:1;;;30370:32:0;;1465:18:1;30370:32:0;;;;;;;;30073:337;;;:::o;30424:1279::-;30536:1;30527:6;:10;30519:64;;;;;;;13753:2:1;30519:64:0;;;13735:21:1;13792:2;13772:18;;;13765:30;13831:34;13811:18;;;13804:62;13902:11;13882:18;;;13875:39;13931:19;;30519:64:0;13551:405:1;30519:64:0;30612:15;30622:4;30612:9;:15::i;:::-;30602:6;:25;;30594:108;;;;;;;14163:2:1;30594:108:0;;;14145:21:1;14202:2;14182:18;;;14175:30;14241:34;14221:18;;;14214:62;14312:34;14292:18;;;14285:62;14384:9;14363:19;;;14356:38;14411:19;;30594:108:0;13961:475:1;30594:108:0;10394:7;10421:6;;30780:15;;;10421:6;;30780:15;;;;:32;;-1:-1:-1;10394:7:0;10421:6;;30799:13;;;10421:6;;30799:13;;30780:32;30779:88;;;;-1:-1:-1;30820:21:0;;;;;;;:15;:21;;;;;;;;30819:22;:47;;;;-1:-1:-1;30847:19:0;;;;;;;:15;:19;;;;;;;;30846:20;30819:47;30776:183;;;30902:12;;30892:6;:22;;30884:75;;;;;;;14643:2:1;30884:75:0;;;14625:21:1;14682:2;14662:18;;;14655:30;14721:34;14701:18;;;14694:62;14792:10;14772:18;;;14765:38;14820:19;;30884:75:0;14441:404:1;30884:75:0;30972:28;31003:24;31021:4;31003:9;:24::i;:::-;30972:55;;31067:12;;31043:20;:36;31040:103;;-1:-1:-1;31119:12:0;;31040:103;31206:29;;31182:53;;;;;;;31250:40;;-1:-1:-1;31274:16:0;;;;;;;31273:17;31250:40;:69;;;;-1:-1:-1;31302:17:0;;;31294:25;;;31302:17;;31294:25;;31250:69;:94;;;;-1:-1:-1;31323:21:0;;;;;;;31250:94;31246:259;;;31384:29;;31361:52;;31457:36;31472:20;31457:14;:36::i;:::-;31515:29;31547:7;:77;;;;-1:-1:-1;31573:24:0;;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;31601:22:0;;;;;;;:18;:22;;;;;;;;31573:50;31571:53;31547:77;31515:109;;31637:58;31652:4;31658:2;31662:6;31670:24;31637:14;:58::i;:::-;30508:1195;;;30424:1279;;;;:::o;6886:166::-;6972:7;7008:12;7000:6;;;;6992:29;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;7039:5:0;7043:1;7039;:5;:::i;:::-;7032:12;6886:166;-1:-1:-1;;;;6886:166:0:o;28974:163::-;29015:7;29036:15;29053;29072:19;:17;:19::i;:::-;29035:56;;-1:-1:-1;29035:56:0;-1:-1:-1;29109:20:0;29035:56;;29109:11;:20::i;:::-;29102:27;;;;28974:163;:::o;6256:153::-;6314:7;6346:1;6342;:5;6334:44;;;;;;;15052:2:1;6334:44:0;;;15034:21:1;15091:2;15071:18;;;15064:30;15130:28;15110:18;;;15103:56;15176:18;;6334:44:0;14850:350:1;6334:44:0;6396:5;6400:1;6396;:5;:::i;4679:179::-;4737:7;;4769:5;4773:1;4769;:5;:::i;:::-;4757:17;;4798:1;4793;:6;;4785:46;;;;;;;15819:2:1;4785:46:0;;;15801:21:1;15858:2;15838:18;;;15831:30;15897:29;15877:18;;;15870:57;15944:18;;4785:46:0;15617:351:1;36064:670:0;36150:1;36141:6;:10;36133:64;;;;;;;13753:2:1;36133:64:0;;;13735:21:1;13792:2;13772:18;;;13765:30;13831:34;13811:18;;;13804:62;13902:11;13882:18;;;13875:39;13931:19;;36133:64:0;13551:405:1;36133:64:0;36248:13;17865:1;36248:2;:13;:::i;:::-;36236:25;;:9;:25;:::i;:::-;36226:6;36216:7;;:16;;;;:::i;:::-;:45;;36208:87;;;;;;;16175:2:1;36208:87:0;;;16157:21:1;16214:2;16194:18;;;16187:30;16253:31;16233:18;;;16226:59;16302:18;;36208:87:0;15973:353:1;36208:87:0;36316:24;36343:34;36369:7;;36344:19;36355:7;;36344:6;:10;;:19;;;;:::i;36343:34::-;36408:7;;36316:61;;-1:-1:-1;36408:19:0;;36420:6;36408:11;:19::i;:::-;36398:7;:29;36448:7;;:29;;36460:16;36448:11;:29::i;:::-;36438:7;:39;36494:22;;;;;;;:11;:22;;;;;;;;36490:106;;;36554:18;;;;;;;:7;:18;;;;;;:30;;36577:6;36554:22;:30::i;:::-;36533:18;;;;;;;:7;:18;;;;;:51;36490:106;36629:18;;;;;;;:7;:18;;;;;;:40;;36652:16;36629:22;:40::i;:::-;36608:18;;;;;;;:7;:18;;;;;;:61;;;;36687:39;;36608:18;;;36687:39;;;;36719:6;1492:25:1;;1480:2;1465:18;;1346:177;27334:330:0;27407:36;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27407:36:0;27468:29;27480:7;27489;27468:11;:29::i;:::-;27456:41;;27573:52;27585:9;27596:7;27605;27614:10;:8;:10::i;:::-;27573:11;:52::i;:::-;27555:14;;;27508:117;27528:25;;;27508:117;;;27334:330;;;;:::o;36742:745::-;36832:1;36823:6;:10;36815:64;;;;;;;13753:2:1;36815:64:0;;;13735:21:1;13792:2;13772:18;;;13765:30;13831:34;13811:18;;;13804:62;13902:11;13882:18;;;13875:39;13931:19;;36815:64:0;13551:405:1;36815:64:0;36908:24;36918:13;36908:9;:24::i;:::-;36898:6;:34;;36890:67;;;;;;;16533:2:1;36890:67:0;;;16515:21:1;16572:2;16552:18;;;16545:30;16611:22;16591:18;;;16584:50;16651:18;;36890:67:0;16331:344:1;36890:67:0;36996:1;36986:6;36976:7;;:16;;;;:::i;:::-;:21;;36968:64;;;;;;;16882:2:1;36968:64:0;;;16864:21:1;16921:2;16901:18;;;16894:30;16960:32;16940:18;;;16933:60;17010:18;;36968:64:0;16680:354:1;36968:64:0;37045:24;37072:34;37098:7;;37073:19;37084:7;;37073:6;:10;;:19;;;;:::i;37072:34::-;37137:7;;37045:61;;-1:-1:-1;37137:19:0;;37149:6;37137:11;:19::i;:::-;37127:7;:29;37177:7;;:29;;37189:16;37177:11;:29::i;:::-;37167:7;:39;37223:26;;;;;;;:11;:26;;;;;;;;37219:118;;;37291:22;;;;;;;:7;:22;;;;;;:34;;37318:6;37291:26;:34::i;:::-;37266:22;;;;;;;:7;:22;;;;;:59;37219:118;37374:22;;;;;;;:7;:22;;;;;;:44;;37401:16;37374:26;:44::i;:::-;37349:22;;;;;;;:7;:22;;;;;;:69;;;;37436:43;;;;;;37472:6;1492:25:1;;1480:2;1465:18;;1346:177;5558:220:0;5616:7;5640:6;5636:20;;-1:-1:-1;5655:1:0;5648:8;;5636:20;5667:9;5679:5;5683:1;5679;:5;:::i;:::-;5667:17;-1:-1:-1;5712:1:0;5703:5;5707:1;5667:17;5703:5;:::i;:::-;:10;5695:56;;;;;;;17241:2:1;5695:56:0;;;17223:21:1;17280:2;17260:18;;;17253:30;17319:34;17299:18;;;17292:62;17390:3;17370:18;;;17363:31;17411:19;;5695:56:0;17039:397:1;33409:846:0;20064:16;:23;;;;;;;;;33560:27:::1;:20:::0;33585:1:::1;33560:24;:27::i;:::-;33545:42:::0;-1:-1:-1;33598:17:0::1;33618:30;:20:::0;33545:42;33618:24:::1;:30::i;:::-;33598:50:::0;-1:-1:-1;33951:21:0::1;33988:22;34005:4:::0;33988:16:::1;:22::i;:::-;33985:263;;;34065:18;34086:41;:21;34112:14:::0;34086:25:::1;:41::i;:::-;34065:62;;34140:35;34153:9;34164:10;34140:12;:35::i;:::-;34193:43;::::0;;17643:25:1;;;17699:2;17684:18;;17677:34;;;17727:18;;;17720:34;;;34193:43:0::1;::::0;17631:2:1;17616:18;34193:43:0::1;;;;;;;34012:236;33985:263;-1:-1:-1::0;;20110:16:0;:24;;;;;;-1:-1:-1;;33409:846:0:o;31713:1175::-;31826:18;;;;;;;:7;:18;;;;;;31822:46;;31852:12;:14;;;:12;:14;;;:::i;:::-;;;;;;31822:46;31878:28;31909;31920:7;31929;31909:10;:28::i;:::-;31954:19;;;;;;;:11;:19;;;;;;31878:59;;-1:-1:-1;31954:19:0;;:46;;;;-1:-1:-1;31978:22:0;;;;;;;:11;:22;;;;;;;;31977:23;31954:46;31950:542;;;32056:15;;;;;;;:7;:15;;;;;;:28;;32076:7;32056:19;:28::i;:::-;32038:15;;;;;;;:7;:15;;;;;:46;31950:542;;;32107:19;;;;;;;:11;:19;;;;;;;;32106:20;:46;;;;-1:-1:-1;32130:22:0;;;;;;;:11;:22;;;;;;;;32106:46;32102:390;;;32231:17;;;;32208:18;;;;;;;:7;:18;;;;;;:41;;:22;:41::i;:::-;32187:18;;;;;;;:7;:18;;;;;:62;32102:390;;;32271:19;;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;32294:22:0;;;;;;;:11;:22;;;;;;;;32271:45;32267:225;;;32371:15;;;;;;;:7;:15;;;;;;:28;;32391:7;32371:19;:28::i;:::-;32353:15;;;;;;;;:7;:15;;;;;;:46;;;;32462:17;;;;32439:18;;;;;;;;;;:41;;:22;:41::i;:::-;32418:18;;;;;;;:7;:18;;;;;:62;32267:225;32599:9;;32579:15;;;32599:9;32579:15;;;:7;:15;;;;;;:30;;:19;:30::i;:::-;32561:15;;;;;;;;:7;:15;;;;;;;;:48;;;;32664:17;;;32641:18;;;;;;;;;;:41;;:22;:41::i;:::-;32620:18;;;;;;;:7;:18;;;;;:62;32710:12;;;;32695:28;;:14;:28::i;:::-;32734:27;32746:1;:6;;;32754:1;:6;;;32734:11;:27::i;:::-;32772:44;32797:1;:6;;;32804:1;:11;;;32772:24;:44::i;:::-;32851:9;32834:46;;32843:6;32834:46;;;32862:1;:17;;;32834:46;;;;1492:25:1;;1480:2;1465:18;;1346:177;32834:46:0;;;;;;;;31811:1077;31713:1175;;;;:::o;29145:555::-;29242:7;;29278;;29195;;;;;29296:289;29320:9;:16;29316:20;;29296:289;;;29386:7;29362;:21;29370:9;29380:1;29370:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;29362:21;;;;;;;;;;;;;:31;;:66;;;29421:7;29397;:21;29405:9;29415:1;29405:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;29397:21;;;;;;;;;;;;;:31;29362:66;29358:97;;;29438:7;;29447;;29430:25;;;;;;;29145:555;;:::o;29358:97::-;29480:34;29492:7;:21;29500:9;29510:1;29500:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;29492:21;;;;;;;;;;;;;29480:7;;:11;:34::i;:::-;29470:44;;29539:34;29551:7;:21;29559:9;29569:1;29559:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;29551:21;;;;;;;;;;;;;29539:7;;:11;:34::i;:::-;29529:44;-1:-1:-1;29338:3:0;;;;:::i;:::-;;;;29296:289;;;-1:-1:-1;29621:7:0;;29609;;:20;;:11;:20::i;:::-;29599:7;:30;29595:61;;;29639:7;;29648;;29631:25;;;;;;29145:555;;:::o;29595:61::-;29675:7;;29684;;-1:-1:-1;29145:555:0;-1:-1:-1;29145:555:0:o;27672:574::-;27746:28;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27746:28:0;27793:7;27789:90;;27817:17;;;:27;;;27859:8;;27789:90;27912:8;:12;27900:34;;27930:3;;27900:25;;:7;;27912:12;;27900:11;:25::i;:34::-;27891:6;;;:43;27972:8;:18;27960:40;;27996:3;;27960:31;;:7;;27972:18;;;;;27960:11;:31::i;:40::-;27945:12;;;:55;28037:8;:17;28025:39;;28060:3;;28025:30;;:7;;28037:17;;;;;28025:11;:30::i;:39::-;28011:11;;;:53;28096:8;:12;28084:34;;28114:3;;28084:25;;:7;;28096:12;;;;;28084:11;:25::i;:34::-;28075:1;:6;;:43;;;;;28151:66;28210:1;:6;;;28151:54;28193:1;:11;;;28151:37;28175:1;:12;;;28151:19;28163:1;:6;;;28151:7;:11;;:19;;;;:::i;:::-;:23;;:37::i;:66::-;28131:17;;;:86;27672:574;;;;:::o;28254:712::-;28379:15;;;28458:24;:7;28470:11;28458;:24::i;:::-;28448:34;;28545:7;28541:65;;-1:-1:-1;28574:7:0;;-1:-1:-1;28592:1:0;28567:27;;28541:65;28625:6;;;;:23;;28636:11;28625:10;:23::i;:::-;28618:30;;28659:18;28680:29;28697:11;28680:1;:12;;;:16;;:29;;;;:::i;:::-;28659:50;;28720:17;28740:28;28756:11;28740:1;:11;;;:15;;:28;;;;:::i;:::-;28720:48;;28779:12;28794:23;28805:11;28794:1;:6;;;:10;;:23;;;;:::i;:::-;28779:38;-1:-1:-1;28848:58:0;28779:38;28848:48;28886:9;28848:48;28870:10;28848:48;:7;28860:4;28848:11;:17::i;:58::-;28830:76;;28919:39;;;28254:712;;;;;;;;;:::o;5141:158::-;5199:7;5232:1;5227;:6;;5219:49;;;;;;;17967:2:1;5219:49:0;;;17949:21:1;18006:2;17986:18;;;17979:30;18045:32;18025:18;;;18018:60;18095:18;;5219:49:0;17765:354:1;5219:49:0;5286:5;5290:1;5286;:5;:::i;34422:733::-;34535:16;;;34549:1;34535:16;;;;;;;;34486:11;;;;34535:16;34549:1;34535:16;;;;;;;;;;-1:-1:-1;34535:16:0;34511:40;;34580:4;34562;34567:1;34562:7;;;;;;;;:::i;:::-;:23;;;;:7;;;;;;;;;;:23;;;;34606:19;;:26;;;;;;;;:19;;;;;:24;;:26;;;;;34562:7;;34606:26;;;;;:19;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34596:4;34601:1;34596:7;;;;;;;;:::i;:::-;:36;;;;:7;;;;;;;;;;:36;;;;34681:19;;34666:4;21941:7;21968:18;;;:11;:18;;;;;;34681:19;;;;21968:27;;;;;;34705:11;-1:-1:-1;34645:164:0;;;34763:19;;34731:66;;34748:4;;34763:19;;34785:11;34731:8;:66::i;:::-;34825:19;;:134;;;;;:19;;;;;:70;;:134;;34910:11;;34825:19;;34924:4;;34937;;34943:15;;34825:134;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34821:325;;35079:30;;;;;19802:2:1;19784:21;;;19841:1;19821:18;;;19814:29;19879:8;19874:2;19859:18;;19852:36;19920:2;19905:18;;19600:329;35079:30:0;;;;;;;;-1:-1:-1;35129:5:0;;34422:733;-1:-1:-1;;34422:733:0:o;34821:325::-;34978:31;;;;;20136:2:1;20118:21;;;20175:1;20155:18;;;20148:29;20213:9;20208:2;20193:18;;20186:37;20255:2;20240:18;;19934:330;34978:31:0;;;;;;;;-1:-1:-1;35029:4:0;;34422:733;-1:-1:-1;;34422:733:0:o;35163:399::-;35244:19;;;;:35;35287:9;35320:4;35340:11;35244:19;;35452:7;10394;10421:6;;;;10348:87;35452:7;35244:256;;;;;;;;;;20582:42:1;20651:15;;;35244:256:0;;;20633:34:1;20683:18;;;20676:34;;;;20726:18;;;20719:34;;;;20769:18;;;20762:34;20833:15;;;20812:19;;;20805:44;35474:15:0;20865:19:1;;;20858:35;20544:19;;35244:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;35516:38:0;;;12257:25:1;;;12313:2;12298:18;;12291:34;;;35516:38:0;;-1:-1:-1;12230:18:1;35516:38:0;12083:248:1;29708:355:0;29771:19;29794:10;:8;:10::i;:::-;29771:33;-1:-1:-1;29815:18:0;29836:27;:10;29771:33;29836:14;:27::i;:::-;29915:4;29899:22;;;;:7;:22;;;;;;29815:48;;-1:-1:-1;29899:38:0;;29815:48;29899:26;:38::i;:::-;29890:4;29874:22;;;;:7;:22;;;;;;;;:63;;;;29951:11;:26;;;;;;29948:107;;;30033:4;30017:22;;;;:7;:22;;;;;;:38;;30044:10;30017:26;:38::i;:::-;30008:4;29992:22;;;;:7;:22;;;;;:63;29948:107;29760:303;;29708:355;:::o;27179:147::-;27257:7;;:17;;27269:4;27257:11;:17::i;:::-;27247:7;:27;27298:10;;:20;;27313:4;27298:14;:20::i;:::-;27285:10;:33;-1:-1:-1;;27179:147:0:o;32898:501::-;32984:19;33007:10;:8;:10::i;:::-;32984:33;-1:-1:-1;33028:19:0;33051:21;:4;32984:33;33051:8;:21::i;:::-;33028:44;-1:-1:-1;33083:17:0;33104:26;:9;33118:11;33104:13;:26::i;:::-;33162:18;;33083:47;;-1:-1:-1;33162:28:0;;33185:4;33162:22;:28::i;:::-;33141:18;:49;33230:9;;;;33222:18;;;;:7;:18;;;;;;:35;;33245:11;33222:22;:35::i;:::-;33209:9;;;;33201:18;;;;:7;:18;;;;;:56;33286:15;;:30;;33306:9;33286:19;:30::i;:::-;33268:15;:48;33361:14;;;;33353:23;;;;:7;:23;;;;;;:38;;33381:9;33353:27;:38::i;:::-;33335:14;;;;33327:23;;;;:7;:23;;;;;:64;-1:-1:-1;;;;;32898:501:0:o;14:656:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;586:2:1;574:15;591:66;570:88;555:104;;;;661:2;551:113;;14:656;-1:-1:-1;;;14:656:1:o;675:154::-;761:42;754:5;750:54;743:5;740:65;730:93;;819:1;816;809:12;834:315;902:6;910;963:2;951:9;942:7;938:23;934:32;931:52;;;979:1;976;969:12;931:52;1018:9;1005:23;1037:31;1062:5;1037:31;:::i;:::-;1087:5;1139:2;1124:18;;;;1111:32;;-1:-1:-1;;;834:315:1:o;1528:456::-;1605:6;1613;1621;1674:2;1662:9;1653:7;1649:23;1645:32;1642:52;;;1690:1;1687;1680:12;1642:52;1729:9;1716:23;1748:31;1773:5;1748:31;:::i;:::-;1798:5;-1:-1:-1;1855:2:1;1840:18;;1827:32;1868:33;1827:32;1868:33;:::i;:::-;1528:456;;1920:7;;-1:-1:-1;;;1974:2:1;1959:18;;;;1946:32;;1528:456::o;1989:401::-;2070:6;2078;2131:2;2119:9;2110:7;2106:23;2102:32;2099:52;;;2147:1;2144;2137:12;2099:52;2186:9;2173:23;2205:31;2230:5;2205:31;:::i;:::-;2255:5;-1:-1:-1;2312:2:1;2297:18;;2284:32;2325:33;2284:32;2325:33;:::i;:::-;2377:7;2367:17;;;1989:401;;;;;:::o;2395:247::-;2454:6;2507:2;2495:9;2486:7;2482:23;2478:32;2475:52;;;2523:1;2520;2513:12;2475:52;2562:9;2549:23;2581:31;2606:5;2581:31;:::i;2647:180::-;2706:6;2759:2;2747:9;2738:7;2734:23;2730:32;2727:52;;;2775:1;2772;2765:12;2727:52;-1:-1:-1;2798:23:1;;2647:180;-1:-1:-1;2647:180:1:o;3021:118::-;3107:5;3100:13;3093:21;3086:5;3083:32;3073:60;;3129:1;3126;3119:12;3144:309;3209:6;3217;3270:2;3258:9;3249:7;3245:23;3241:32;3238:52;;;3286:1;3283;3276:12;3238:52;3322:9;3309:23;3299:33;;3382:2;3371:9;3367:18;3354:32;3395:28;3417:5;3395:28;:::i;4630:156::-;4696:20;;4756:4;4745:16;;4735:27;;4725:55;;4776:1;4773;4766:12;4725:55;4630:156;;;:::o;4791:393::-;4869:6;4877;4885;4893;4946:3;4934:9;4925:7;4921:23;4917:33;4914:53;;;4963:1;4960;4953:12;4914:53;4986:27;5003:9;4986:27;:::i;:::-;4976:37;;5032:36;5064:2;5053:9;5049:18;5032:36;:::i;:::-;5022:46;;5087:36;5119:2;5108:9;5104:18;5087:36;:::i;:::-;5077:46;;5142:36;5174:2;5163:9;5159:18;5142:36;:::i;:::-;5132:46;;4791:393;;;;;;;:::o;5189:241::-;5245:6;5298:2;5286:9;5277:7;5273:23;5269:32;5266:52;;;5314:1;5311;5304:12;5266:52;5353:9;5340:23;5372:28;5394:5;5372:28;:::i;5435:382::-;5500:6;5508;5561:2;5549:9;5540:7;5536:23;5532:32;5529:52;;;5577:1;5574;5567:12;5529:52;5616:9;5603:23;5635:31;5660:5;5635:31;:::i;:::-;5685:5;-1:-1:-1;5742:2:1;5727:18;;5714:32;5755:30;5714:32;5755:30;:::i;6576:184::-;6646:6;6699:2;6687:9;6678:7;6674:23;6670:32;6667:52;;;6715:1;6712;6705:12;6667:52;-1:-1:-1;6738:16:1;;6576:184;-1:-1:-1;6576:184:1:o;7067:245::-;7134:6;7187:2;7175:9;7166:7;7162:23;7158:32;7155:52;;;7203:1;7200;7193:12;7155:52;7235:9;7229:16;7254:28;7276:5;7254:28;:::i;7669:184::-;7721:77;7718:1;7711:88;7818:4;7815:1;7808:15;7842:4;7839:1;7832:15;7858:184;7910:77;7907:1;7900:88;8007:4;8004:1;7997:15;8031:4;8028:1;8021:15;8047:125;8087:4;8115:1;8112;8109:8;8106:34;;;8120:18;;:::i;:::-;-1:-1:-1;8157:9:1;;8047:125::o;8177:184::-;8229:77;8226:1;8219:88;8326:4;8323:1;8316:15;8350:4;8347:1;8340:15;8366:195;8405:3;8436:66;8429:5;8426:77;8423:103;;;8506:18;;:::i;:::-;-1:-1:-1;8553:1:1;8542:13;;8366:195::o;10347:482::-;10436:1;10479:5;10436:1;10493:330;10514:7;10504:8;10501:21;10493:330;;;10633:4;10565:66;10561:77;10555:4;10552:87;10549:113;;;10642:18;;:::i;:::-;10692:7;10682:8;10678:22;10675:55;;;10712:16;;;;10675:55;10791:22;;;;10751:15;;;;10493:330;;;10497:3;10347:482;;;;;:::o;10834:866::-;10883:5;10913:8;10903:80;;-1:-1:-1;10954:1:1;10968:5;;10903:80;11002:4;10992:76;;-1:-1:-1;11039:1:1;11053:5;;10992:76;11084:4;11102:1;11097:59;;;;11170:1;11165:130;;;;11077:218;;11097:59;11127:1;11118:10;;11141:5;;;11165:130;11202:3;11192:8;11189:17;11186:43;;;11209:18;;:::i;:::-;-1:-1:-1;;11265:1:1;11251:16;;11280:5;;11077:218;;11379:2;11369:8;11366:16;11360:3;11354:4;11351:13;11347:36;11341:2;11331:8;11328:16;11323:2;11317:4;11314:12;11310:35;11307:77;11304:159;;;-1:-1:-1;11416:19:1;;;11448:5;;11304:159;11495:34;11520:8;11514:4;11495:34;:::i;:::-;11625:6;11557:66;11553:79;11544:7;11541:92;11538:118;;;11636:18;;:::i;:::-;11674:20;;10834:866;-1:-1:-1;;;10834:866:1:o;11705:140::-;11763:5;11792:47;11833:4;11823:8;11819:19;11813:4;11792:47;:::i;11850:228::-;11890:7;12016:1;11948:66;11944:74;11941:1;11938:81;11933:1;11926:9;11919:17;11915:105;11912:131;;;12023:18;;:::i;:::-;-1:-1:-1;12063:9:1;;11850:228::o;15205:274::-;15245:1;15271;15261:189;;15306:77;15303:1;15296:88;15407:4;15404:1;15397:15;15435:4;15432:1;15425:15;15261:189;-1:-1:-1;15464:9:1;;15205:274::o;15484:128::-;15524:3;15555:1;15551:6;15548:1;15545:13;15542:39;;;15561:18;;:::i;:::-;-1:-1:-1;15597:9:1;;15484:128::o;18313:251::-;18383:6;18436:2;18424:9;18415:7;18411:23;18407:32;18404:52;;;18452:1;18449;18442:12;18404:52;18484:9;18478:16;18503:31;18528:5;18503:31;:::i;18569:1026::-;18831:4;18879:3;18868:9;18864:19;18910:6;18899:9;18892:25;18936:2;18974:6;18969:2;18958:9;18954:18;18947:34;19017:3;19012:2;19001:9;18997:18;18990:31;19041:6;19076;19070:13;19107:6;19099;19092:22;19145:3;19134:9;19130:19;19123:26;;19184:2;19176:6;19172:15;19158:29;;19205:1;19215:218;19229:6;19226:1;19223:13;19215:218;;;19294:13;;19309:42;19290:62;19278:75;;19408:15;;;;19373:12;;;;19251:1;19244:9;19215:218;;;-1:-1:-1;;19501:42:1;19489:55;;;;19484:2;19469:18;;19462:83;-1:-1:-1;;;19576:3:1;19561:19;19554:35;19450:3;18569:1026;-1:-1:-1;;;18569:1026:1:o;20904:306::-;20992:6;21000;21008;21061:2;21049:9;21040:7;21036:23;21032:32;21029:52;;;21077:1;21074;21067:12;21029:52;21106:9;21100:16;21090:26;;21156:2;21145:9;21141:18;21135:25;21125:35;;21200:2;21189:9;21185:18;21179:25;21169:35;;20904:306;;;;;:::o

Swarm Source

ipfs://4ad51105d22bc77a515d6b0e9e82627854012945e1913627b4b61b7c5e19abb2
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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