ETH Price: $2,472.08 (+0.93%)
 

Overview

Max Total Supply

1,000,000,000 FWG

Holders

922

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
14,762.468894576 FWG

Value
$0.00
0xF2BB16811DaE82c3968Ba205f517F87aeB2d0882
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:
FantasyWorldGold

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

/**
 *Submitted for verification at Etherscan.io on 2021-11-27
*/

// SPDX-License-Identifier: Unlicensed

pragma solidity ^0.8.5;

abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return payable(msg.sender);
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this;
        return msg.data;
    }
}


interface IERC20 {

    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    

}

library SafeMath {

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }


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

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

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

library Address {

    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }


    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

contract Ownable is Context {
    address private _creator;
    address private _owner;
    address private _previousOwner;
    uint256 private _lockTime;

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

    constructor () {
        address msgSender = _msgSender();
        _creator = msgSender;
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }   
    
    modifier onlyOwner() {
        require(_owner == _msgSender() || _creator == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
    
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }

    function getUnlockTime() public view returns (uint256) {
        return _lockTime;
    }
    
    function getTime() public view returns (uint256) {
        return block.timestamp;
    }

    function lock(uint256 time) public virtual onlyOwner {
        _previousOwner = _owner;
        _owner = address(0);
        _lockTime = block.timestamp + time;
        emit OwnershipTransferred(_owner, address(0));
    }
    
    function unlock() public virtual {
        require(_previousOwner == msg.sender, "You don't have permission to unlock");
        require(block.timestamp > _lockTime , "Contract is locked until 7 days");
        emit OwnershipTransferred(_owner, _previousOwner);
        _owner = _previousOwner;
    }
}

// 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;
}


// pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

// 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);
}



// 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;
}

contract FantasyWorldGold is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;
    
    address payable public marketingAddress; // Marketing Address
    address public immutable deadAddress = 0x000000000000000000000000000000000000dEaD;
    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;
    address[] private _excluded;
   
    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal;
    uint256 private _rTotal;
    uint256 private _tFeeTotal;

    string private _name;
    string private _symbol;
    uint8 private _decimals;


    uint256 public _taxFee;
    uint256 private _previousTaxFee;
    
    uint256 private _liquidityFee;
    uint256 private _previousLiquidityFee;
    
    uint256 public buybackFee;
    uint256 private previousBuybackFee;
    
    uint256 public marketingFee;
    uint256 private previousMarketingFee;
    
    
    uint256 public _maxTxAmount;
    uint256 private _previousMaxTxAmount;
    uint256 private minimumTokensBeforeSwap; 
    uint256 private buyBackUpperLimit;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    bool public buyBackEnabled = true;

    
    event RewardLiquidityProviders(uint256 tokenAmount);
    event BuyBackEnabledUpdated(bool enabled);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    
    event SwapETHForTokens(
        uint256 amountIn,
        address[] path
    );
    
    event SwapTokensForETH(
        uint256 amountIn,
        address[] path
    );
    
    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }
    
    constructor () {
        _name = "Fantasy World Gold";
        _symbol = "FWG";
        _decimals = 9;
        _tTotal = 1000000000 * 10**_decimals;
        _rTotal = (MAX - (MAX % _tTotal));
        
        marketingAddress = payable(0xce39b2dFb7aE928A2C9801A23d7ed423356258b0);
        
        _taxFee = 0;
        _previousTaxFee = _taxFee;
        buybackFee = 0;
        previousBuybackFee = buybackFee;
        marketingFee = 75;
        previousMarketingFee = marketingFee;
        _liquidityFee = buybackFee + marketingFee;
        _previousLiquidityFee = _liquidityFee;
        _maxTxAmount = _tTotal.div(1000).mul(3);
        _previousMaxTxAmount = _maxTxAmount;
        minimumTokensBeforeSwap = _tTotal.div(10000).mul(2);
        buyBackUpperLimit = 100000 * 10**18;
        
        
        _rOwned[_msgSender()] = _rTotal;
        
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;

        
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view returns (uint8) {
        return _decimals;
    }

    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);
        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) {
        _transfer(sender, recipient, amount);
        _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 _tFeeTotal;
    }
    
    function minimumTokensBeforeSwapAmount() public view returns (uint256) {
        return minimumTokensBeforeSwap;
    }
    
    function buyBackUpperLimitAmount() public view returns (uint256) {
        return buyBackUpperLimit;
    }
    
    function deliver(uint256 tAmount) public {
        address sender = _msgSender();
        require(!_isExcluded[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount,,,,,) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }
  

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,,) = _getValues(tAmount);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,,) = _getValues(tAmount);
            return 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 excludeFromReward(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 includeInReward(address account) external onlyOwner() {
        require(_isExcluded[account], "Account is already 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 _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
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        if(from != owner() && to != owner()) {
            require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinimumTokenBalance = contractTokenBalance >= minimumTokensBeforeSwap;
        
        if (!inSwapAndLiquify && swapAndLiquifyEnabled && to == uniswapV2Pair) {
            if (overMinimumTokenBalance) {
                contractTokenBalance = minimumTokensBeforeSwap;
                swapTokens(contractTokenBalance);    
            }
	        uint256 balance = address(this).balance;
            if (buyBackEnabled && balance > uint256(1 * 10**18)) {
                
                if (balance > buyBackUpperLimit)
                    balance = buyBackUpperLimit;
                
                buyBackTokens(balance.div(100));
            }
        }
        
        bool takeFee = true;
        
        //if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
            takeFee = false;
        }
        
        _tokenTransfer(from,to,amount,takeFee);
    }

    function swapTokens(uint256 contractTokenBalance) private lockTheSwap {
       
        uint256 initialBalance = address(this).balance;
        swapTokensForEth(contractTokenBalance);
        uint256 transferredBalance = address(this).balance.sub(initialBalance);

        //Send to Marketing address
        
        transferToAddressETH(marketingAddress, transferredBalance.div(_liquidityFee).mul(marketingFee));        
    }
    

    function buyBackTokens(uint256 amount) private lockTheSwap {
    	if (amount > 0) {
    	    swapETHForTokens(amount);
	    }
    }
    
    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this), // The contract
            block.timestamp
        );
        
        emit SwapTokensForETH(tokenAmount, path);
    }
    
    function swapETHForTokens(uint256 amount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = address(this);

      // make the swap
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
            0, // accept any amount of Tokens
            path,
            deadAddress, // Burn address
            block.timestamp.add(300)
        );
        
        emit SwapETHForTokens(amount, path);
    }
    
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            owner(),
            block.timestamp
        );
    }

    function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee) private {
        if(!takeFee)
            removeAllFee();
        
        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }
        
        if(!takeFee)
            restoreAllFee();
    }

    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
	    _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);           
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
    	_tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);   
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
    	_tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);        
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, _getRate());
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity);
    }

    function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256) {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity);
        return (tTransferAmount, tFee, tLiquidity);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity);
        return (rAmount, rTransferAmount, rFee);
    }

    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 calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxFee).div(
            10**3
        );
    }
    
    function calculateLiquidityFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_liquidityFee).div(
            10**3
        );
    }
    
    function removeAllFee() private {
        if(_taxFee == 0 && _liquidityFee == 0) return;
        
        _previousTaxFee = _taxFee;
        _previousLiquidityFee = _liquidityFee;
        previousBuybackFee = buybackFee;
        previousMarketingFee = marketingFee;
        
        _taxFee = 0;
        _liquidityFee = 0;
        buybackFee = 0;
        marketingFee = 0;
    }
    
    function restoreAllFee() private {
        _taxFee = _previousTaxFee;
        _liquidityFee = _previousLiquidityFee;
        buybackFee = previousBuybackFee;
        marketingFee = previousMarketingFee;
    }

    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }
    
    function excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;
    }
    
    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = false;
    }
    
    function setTaxFee(uint256 taxFee) external onlyOwner() {
        _taxFee = taxFee;
    }
    
    function setBuybackFee(uint256 _buybackFee) external onlyOwner() {
        buybackFee = _buybackFee;
        _liquidityFee = buybackFee.add(marketingFee);
    }
    
    function setMaxTxAmount(uint256 maxTxAmount) external onlyOwner() {
        _maxTxAmount = maxTxAmount;
    }
    
    function setMarketingFee(uint256 _marketingFee) external onlyOwner() {
        marketingFee = _marketingFee;
        _liquidityFee = buybackFee.add(marketingFee);
    }

    function setNumTokensSellToAddToLiquidity(uint256 _minimumTokensBeforeSwap) external onlyOwner() {
        minimumTokensBeforeSwap = _minimumTokensBeforeSwap;
    }
    
     function setBuybackUpperLimit(uint256 buyBackLimit) external onlyOwner() {
        buyBackUpperLimit = buyBackLimit;
    }

    function setMarketingAddress(address _marketingAddress) external onlyOwner() {
        marketingAddress = payable(_marketingAddress);
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }
    
    function setBuyBackEnabled(bool _enabled) public onlyOwner {
        buyBackEnabled = _enabled;
        emit BuyBackEnabledUpdated(_enabled);
    }
    
    function presale(bool _presale) external onlyOwner {
        if (_presale) {
            setSwapAndLiquifyEnabled(false);
            removeAllFee();
            _previousMaxTxAmount = _maxTxAmount;
            _maxTxAmount = totalSupply();
        } else {
            setSwapAndLiquifyEnabled(true);
            restoreAllFee();
            _maxTxAmount = _previousMaxTxAmount;
        }
    }
    

    function transferToAddressETH(address payable recipient, uint256 amount) private {
        recipient.transfer(amount);
    }

    function withdrawETH() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }
     //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}
}

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":"bool","name":"enabled","type":"bool"}],"name":"BuyBackEnabledUpdated","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":"tokenAmount","type":"uint256"}],"name":"RewardLiquidityProviders","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","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":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapETHForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapTokensForETH","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"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"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":[],"name":"buyBackEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBackUpperLimitAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"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":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwapAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_presale","type":"bool"}],"name":"presale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setBuyBackEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buybackFee","type":"uint256"}],"name":"setBuybackFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyBackLimit","type":"uint256"}],"name":"setBuybackUpperLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingAddress","type":"address"}],"name":"setMarketingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"}],"name":"setMarketingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxAmount","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumTokensBeforeSwap","type":"uint256"}],"name":"setNumTokensSellToAddToLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxFee","type":"uint256"}],"name":"setTaxFee","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":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","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":"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":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040526ddead000000000000000000000000608052601d805462ffff001916620101001790553480156200003457600080fd5b5060008054336001600160a01b031991821681178355600180549092168117909155604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506040805180820190915260128082527111985b9d185cde4815dbdc9b190811dbdb1960721b6020909201918252620000be91600e91620005a1565b506040805180820190915260038082526246574760e81b6020909201918252620000eb91600f91620005a1565b506010805460ff191660099081179091556200010990600a62000745565b6200011990633b9aca0062000804565b600b8190556200012c906000196200087d565b6200013a9060001962000826565b600c55600480546001600160a01b03191673ce39b2dfb7ae928a2c9801a23d7ed423356258b017905560006011819055601281905560158190556016819055604b601781905560188190556200019091620006ca565b6013819055601455600b54620001d190600390620001bd906103e862000487602090811b620018dd17901c565b620004da60201b6200191f1790919060201c565b6019819055601a55600b54620001fe90600290620001bd9061271062000487602090811b620018dd17901c565b601b5569152d02c7e14af6800000601c55600c543360009081526005602090815260409182902092909255805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d92839263c45a01559260048083019392829003018186803b1580156200027157600080fd5b505afa15801562000286573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ac919062000647565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620002f557600080fd5b505afa1580156200030a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000330919062000647565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200037957600080fd5b505af11580156200038e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003b4919062000647565b6001600160601b0319606091821b811660c0529082901b1660a052600160086000620003e86001546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526008909252902080549091166001179055620004303390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600b546040516200047891815260200190565b60405180910390a350620008c0565b6000620004d183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506200056560201b60201c565b90505b92915050565b600082620004eb57506000620004d4565b6000620004f9838562000804565b905082620005088583620006e5565b14620004d15760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084015b60405180910390fd5b60008183620005895760405162461bcd60e51b81526004016200055c919062000672565b506000620005988486620006e5565b95945050505050565b828054620005af9062000840565b90600052602060002090601f016020900481019282620005d357600085556200061e565b82601f10620005ee57805160ff19168380011785556200061e565b828001600101855582156200061e579182015b828111156200061e57825182559160200191906001019062000601565b506200062c92915062000630565b5090565b5b808211156200062c576000815560010162000631565b6000602082840312156200065a57600080fd5b81516001600160a01b0381168114620004d157600080fd5b600060208083528351808285015260005b81811015620006a15785810183015185820160400152820162000683565b81811115620006b4576000604083870101525b50601f01601f1916929092016040019392505050565b60008219821115620006e057620006e062000894565b500190565b600082620006f757620006f7620008aa565b500490565b600181815b808511156200073d57816000190482111562000721576200072162000894565b808516156200072f57918102915b93841c939080029062000701565b509250929050565b6000620004d160ff8416836000826200076157506001620004d4565b816200077057506000620004d4565b81600181146200078957600281146200079457620007b4565b6001915050620004d4565b60ff841115620007a857620007a862000894565b50506001821b620004d4565b5060208310610133831016604e8410600b8410161715620007d9575081810a620004d4565b620007e58383620006fc565b8060001904821115620007fc57620007fc62000894565b029392505050565b600081600019048311821515161562000821576200082162000894565b500290565b6000828210156200083b576200083b62000894565b500390565b600181811c908216806200085557607f821691505b602082108114156200087757634e487b7160e01b600052602260045260246000fd5b50919050565b6000826200088f576200088f620008aa565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b60805160601c60a05160601c60c05160601c612f5a6200092a600039600081816105850152611cb60152600081816103800152818161239e01528181612466015281816124a2015281816125ad015261269b01526000818161040101526126c60152612f5a6000f3fe6080604052600436106102e85760003560e01c8063625e764c11610190578063a69df4b5116100dc578063dd62ed3e11610095578063ec28438a1161006f578063ec28438a1461090e578063edc2fcfb1461092e578063f0f165af1461094e578063f2fde38b1461096e57600080fd5b8063dd62ed3e14610893578063e086e5ec146108d9578063ea2f0b37146108ee57600080fd5b8063a69df4b5146107e9578063a9059cbb146107fe578063bdc653ef1461081e578063c4081a4c14610833578063c49b9a8014610853578063dd4670641461087357600080fd5b806388f820201161014957806395d89b411161012357806395d89b411461077f578063a073d37f14610794578063a457c2d7146107a9578063a5ece941146107c957600080fd5b806388f82020146107085780638da5cb5b14610741578063906e9dd01461075f57600080fd5b8063625e764c146106675780636b67c4df1461068757806370a082311461069d578063715018a6146106bd5780637d1db4a5146106d257806382d2a4bb146106e857600080fd5b80633b124fe71161024f57806349bd5a5e116102085780635342acb4116101e25780635342acb4146105e6578063557ed1ba1461061f578063602bc62b146106325780636053a0e31461064757600080fd5b806349bd5a5e146105735780634a74bb02146105a757806352390c02146105c657600080fd5b80633b124fe7146104c75780633b2d081c146104dd5780633bd5d173146104f3578063437823ec146105135780634549b039146105335780634567bfba1461055357600080fd5b806327c8f835116102a157806327c8f835146103ef57806329370cc6146104235780632d83811914610445578063313ce567146104655780633685d4191461048757806339509351146104a757600080fd5b806306fdde03146102f4578063095ea7b31461031f57806313114a9d1461034f5780631694505e1461036e57806318160ddd146103ba57806323b872dd146103cf57600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b5061030961098e565b6040516103169190612cb3565b60405180910390f35b34801561032b57600080fd5b5061033f61033a366004612bae565b610a20565b6040519015158152602001610316565b34801561035b57600080fd5b50600d545b604051908152602001610316565b34801561037a57600080fd5b506103a27f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610316565b3480156103c657600080fd5b50600b54610360565b3480156103db57600080fd5b5061033f6103ea366004612b6d565b610a37565b3480156103fb57600080fd5b506103a27f000000000000000000000000000000000000000000000000000000000000000081565b34801561042f57600080fd5b5061044361043e366004612bda565b610aa0565b005b34801561045157600080fd5b50610360610460366004612bf5565b610b3e565b34801561047157600080fd5b5060105460405160ff9091168152602001610316565b34801561049357600080fd5b506104436104a2366004612afa565b610bc2565b3480156104b357600080fd5b5061033f6104c2366004612bae565b610d8e565b3480156104d357600080fd5b5061036060115481565b3480156104e957600080fd5b5061036060155481565b3480156104ff57600080fd5b5061044361050e366004612bf5565b610dc4565b34801561051f57600080fd5b5061044361052e366004612afa565b610eae565b34801561053f57600080fd5b5061036061054e366004612c0e565b610f11565b34801561055f57600080fd5b5061044361056e366004612bf5565b610f9e565b34801561057f57600080fd5b506103a27f000000000000000000000000000000000000000000000000000000000000000081565b3480156105b357600080fd5b50601d5461033f90610100900460ff1681565b3480156105d257600080fd5b506104436105e1366004612afa565b610ff6565b3480156105f257600080fd5b5061033f610601366004612afa565b6001600160a01b031660009081526008602052604090205460ff1690565b34801561062b57600080fd5b5042610360565b34801561063e57600080fd5b50600354610360565b34801561065357600080fd5b50601d5461033f9062010000900460ff1681565b34801561067357600080fd5b50610443610682366004612bf5565b61115e565b34801561069357600080fd5b5061036060175481565b3480156106a957600080fd5b506103606106b8366004612afa565b6111af565b3480156106c957600080fd5b5061044361120e565b3480156106de57600080fd5b5061036060195481565b3480156106f457600080fd5b50610443610703366004612bf5565b611285565b34801561071457600080fd5b5061033f610723366004612afa565b6001600160a01b031660009081526009602052604090205460ff1690565b34801561074d57600080fd5b506001546001600160a01b03166103a2565b34801561076b57600080fd5b5061044361077a366004612afa565b6112c9565b34801561078b57600080fd5b5061030961132a565b3480156107a057600080fd5b50601b54610360565b3480156107b557600080fd5b5061033f6107c4366004612bae565b611339565b3480156107d557600080fd5b506004546103a2906001600160a01b031681565b3480156107f557600080fd5b50610443611388565b34801561080a57600080fd5b5061033f610819366004612bae565b611490565b34801561082a57600080fd5b50601c54610360565b34801561083f57600080fd5b5061044361084e366004612bf5565b61149d565b34801561085f57600080fd5b5061044361086e366004612bda565b6114e1565b34801561087f57600080fd5b5061044361088e366004612bf5565b611569565b34801561089f57600080fd5b506103606108ae366004612b34565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b3480156108e557600080fd5b50610443611603565b3480156108fa57600080fd5b50610443610909366004612afa565b611671565b34801561091a57600080fd5b50610443610929366004612bf5565b6116d1565b34801561093a57600080fd5b50610443610949366004612bda565b611715565b34801561095a57600080fd5b50610443610969366004612bf5565b6117ab565b34801561097a57600080fd5b50610443610989366004612afa565b6117ef565b6060600e805461099d90612e0a565b80601f01602080910402602001604051908101604052809291908181526020018280546109c990612e0a565b8015610a165780601f106109eb57610100808354040283529160200191610a16565b820191906000526020600020905b8154815290600101906020018083116109f957829003601f168201915b5050505050905090565b6000610a2d33848461199e565b5060015b92915050565b6000610a44848484611ac2565b610a968433610a9185604051806060016040528060288152602001612eb8602891396001600160a01b038a1660009081526007602090815260408083203384529091529020549190611dac565b61199e565b5060019392505050565b6001546001600160a01b0316331480610ac357506000546001600160a01b031633145b610ae85760405162461bcd60e51b8152600401610adf90612d08565b60405180910390fd5b601d8054821515620100000262ff0000199091161790556040517f3794234fa370c9f3b948dda3e3040530785b2ef1eb27dda3ffde478f4e2643c090610b3390831515815260200190565b60405180910390a150565b6000600c54821115610ba55760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610adf565b6000610baf611de6565b9050610bbb83826118dd565b9392505050565b6001546001600160a01b0316331480610be557506000546001600160a01b031633145b610c015760405162461bcd60e51b8152600401610adf90612d08565b6001600160a01b03811660009081526009602052604090205460ff16610c695760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610adf565b60005b600a54811015610d8a57816001600160a01b0316600a8281548110610c9357610c93612e8c565b6000918252602090912001546001600160a01b03161415610d7857600a8054610cbe90600190612df3565b81548110610cce57610cce612e8c565b600091825260209091200154600a80546001600160a01b039092169183908110610cfa57610cfa612e8c565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600682526040808220829055600990925220805460ff19169055600a805480610d5257610d52612e76565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610d8281612e45565b915050610c6c565b5050565b3360008181526007602090815260408083206001600160a01b03871684529091528120549091610a2d918590610a919086611e09565b3360008181526009602052604090205460ff1615610e395760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610adf565b6000610e4483611e68565b505050506001600160a01b038416600090815260056020526040902054919250610e7091905082611eb7565b6001600160a01b038316600090815260056020526040902055600c54610e969082611eb7565b600c55600d54610ea69084611e09565b600d55505050565b6001546001600160a01b0316331480610ed157506000546001600160a01b031633145b610eed5760405162461bcd60e51b8152600401610adf90612d08565b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b6000600b54831115610f655760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610adf565b81610f84576000610f7584611e68565b50939550610a31945050505050565b6000610f8f84611e68565b50929550610a31945050505050565b6001546001600160a01b0316331480610fc157506000546001600160a01b031633145b610fdd5760405162461bcd60e51b8152600401610adf90612d08565b6015819055601754610ff0908290611e09565b60135550565b6001546001600160a01b031633148061101957506000546001600160a01b031633145b6110355760405162461bcd60e51b8152600401610adf90612d08565b6001600160a01b03811660009081526009602052604090205460ff161561109e5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610adf565b6001600160a01b038116600090815260056020526040902054156110f8576001600160a01b0381166000908152600560205260409020546110de90610b3e565b6001600160a01b0382166000908152600660205260409020555b6001600160a01b03166000818152600960205260408120805460ff19166001908117909155600a805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319169091179055565b6001546001600160a01b031633148061118157506000546001600160a01b031633145b61119d5760405162461bcd60e51b8152600401610adf90612d08565b6017819055601554610ff09082611e09565b6001600160a01b03811660009081526009602052604081205460ff16156111ec57506001600160a01b031660009081526006602052604090205490565b6001600160a01b038216600090815260056020526040902054610a3190610b3e565b6001546001600160a01b031633148061123157506000546001600160a01b031633145b61124d5760405162461bcd60e51b8152600401610adf90612d08565b6001546040516000916001600160a01b031690600080516020612ee0833981519152908390a3600180546001600160a01b0319169055565b6001546001600160a01b03163314806112a857506000546001600160a01b031633145b6112c45760405162461bcd60e51b8152600401610adf90612d08565b601c55565b6001546001600160a01b03163314806112ec57506000546001600160a01b031633145b6113085760405162461bcd60e51b8152600401610adf90612d08565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6060600f805461099d90612e0a565b6000610a2d3384610a9185604051806060016040528060258152602001612f00602591393360009081526007602090815260408083206001600160a01b038d1684529091529020549190611dac565b6002546001600160a01b031633146113ee5760405162461bcd60e51b815260206004820152602360248201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6044820152626f636b60e81b6064820152608401610adf565b600354421161143f5760405162461bcd60e51b815260206004820152601f60248201527f436f6e7472616374206973206c6f636b656420756e74696c20372064617973006044820152606401610adf565b6002546001546040516001600160a01b039283169290911690600080516020612ee083398151915290600090a3600254600180546001600160a01b0319166001600160a01b03909216919091179055565b6000610a2d338484611ac2565b6001546001600160a01b03163314806114c057506000546001600160a01b031633145b6114dc5760405162461bcd60e51b8152600401610adf90612d08565b601155565b6001546001600160a01b031633148061150457506000546001600160a01b031633145b6115205760405162461bcd60e51b8152600401610adf90612d08565b601d80548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610b3390831515815260200190565b6001546001600160a01b031633148061158c57506000546001600160a01b031633145b6115a85760405162461bcd60e51b8152600401610adf90612d08565b60018054600280546001600160a01b03199081166001600160a01b038416179091551690556115d78142612d9a565b6003556001546040516000916001600160a01b031690600080516020612ee0833981519152908390a350565b6001546001600160a01b031633148061162657506000546001600160a01b031633145b6116425760405162461bcd60e51b8152600401610adf90612d08565b60405133904780156108fc02916000818181858888f1935050505015801561166e573d6000803e3d6000fd5b50565b6001546001600160a01b031633148061169457506000546001600160a01b031633145b6116b05760405162461bcd60e51b8152600401610adf90612d08565b6001600160a01b03166000908152600860205260409020805460ff19169055565b6001546001600160a01b03163314806116f457506000546001600160a01b031633145b6117105760405162461bcd60e51b8152600401610adf90612d08565b601955565b6001546001600160a01b031633148061173857506000546001600160a01b031633145b6117545760405162461bcd60e51b8152600401610adf90612d08565b801561177b5761176460006114e1565b61176c611ef9565b601954601a55600b5460195550565b61178560016114e1565b6117a2601254601155601454601355601654601555601854601755565b601a5460195550565b6001546001600160a01b03163314806117ce57506000546001600160a01b031633145b6117ea5760405162461bcd60e51b8152600401610adf90612d08565b601b55565b6001546001600160a01b031633148061181257506000546001600160a01b031633145b61182e5760405162461bcd60e51b8152600401610adf90612d08565b6001600160a01b0381166118935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610adf565b6001546040516001600160a01b03808416921690600080516020612ee083398151915290600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000610bbb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611f3c565b60008261192e57506000610a31565b600061193a8385612dd4565b9050826119478583612db2565b14610bbb5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610adf565b6001600160a01b038316611a005760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610adf565b6001600160a01b038216611a615760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610adf565b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611b265760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610adf565b6001600160a01b038216611b885760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610adf565b60008111611bea5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610adf565b6001546001600160a01b03848116911614801590611c1657506001546001600160a01b03838116911614155b15611c7e57601954811115611c7e5760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610adf565b6000611c89306111af565b601b54601d549192508210159060ff16158015611cad5750601d54610100900460ff165b8015611cea57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316145b15611d4d578015611d0357601b549150611d0382611f6a565b601d54479062010000900460ff168015611d245750670de0b6b3a764000081115b15611d4b57601c54811115611d385750601c545b611d4b611d468260646118dd565b611fd3565b505b6001600160a01b03851660009081526008602052604090205460019060ff1680611d8f57506001600160a01b03851660009081526008602052604090205460ff165b15611d98575060005b611da486868684611ffc565b505050505050565b60008184841115611dd05760405162461bcd60e51b8152600401610adf9190612cb3565b506000611ddd8486612df3565b95945050505050565b6000806000611df3612133565b9092509050611e0282826118dd565b9250505090565b600080611e168385612d9a565b905083811015610bbb5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610adf565b6000806000806000806000806000611e7f8a6122b5565b9250925092506000806000611e9d8d8686611e98611de6565b6122f7565b919f909e50909c50959a5093985091965092945050505050565b6000610bbb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611dac565b601154158015611f095750601354155b15611f1057565b601180546012556013805460145560158054601655601780546018556000938490559183905582905555565b60008183611f5d5760405162461bcd60e51b8152600401610adf9190612cb3565b506000611ddd8486612db2565b601d805460ff1916600117905547611f8182612347565b6000611f8d4783611eb7565b600454601754601354929350611fc4926001600160a01b0390921691611fbf9190611fb99086906118dd565b9061191f565b61254f565b5050601d805460ff1916905550565b601d805460ff191660011790558015611fef57611fef8161258a565b50601d805460ff19169055565b8061200957612009611ef9565b6001600160a01b03841660009081526009602052604090205460ff16801561204a57506001600160a01b03831660009081526009602052604090205460ff16155b1561205f5761205a848484612773565b61210b565b6001600160a01b03841660009081526009602052604090205460ff161580156120a057506001600160a01b03831660009081526009602052604090205460ff165b156120b05761205a848484612899565b6001600160a01b03841660009081526009602052604090205460ff1680156120f057506001600160a01b03831660009081526009602052604090205460ff165b156121005761205a848484612942565b61210b8484846129b5565b8061212d5761212d601254601155601454601355601654601555601854601755565b50505050565b600c54600b546000918291825b600a54811015612285578260056000600a848154811061216257612162612e8c565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806121cd57508160066000600a84815481106121a6576121a6612e8c565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156121e357600c54600b54945094505050509091565b61222960056000600a84815481106121fd576121fd612e8c565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611eb7565b925061227160066000600a848154811061224557612245612e8c565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611eb7565b91508061227d81612e45565b915050612140565b50600b54600c54612295916118dd565b8210156122ac57600c54600b549350935050509091565b90939092509050565b6000806000806122c4856129f9565b905060006122d186612a1c565b905060006122e9826122e38986611eb7565b90611eb7565b979296509094509092505050565b6000808080612306888661191f565b90506000612314888761191f565b90506000612322888861191f565b90506000612334826122e38686611eb7565b939b939a50919850919650505050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061237c5761237c612e8c565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156123f557600080fd5b505afa158015612409573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242d9190612b17565b8160018151811061244057612440612e8c565b60200260200101906001600160a01b031690816001600160a01b03168152505061248b307f00000000000000000000000000000000000000000000000000000000000000008461199e565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906124e0908590600090869030904290600401612d5e565b600060405180830381600087803b1580156124fa57600080fd5b505af115801561250e573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051612543929190612d3d565b60405180910390a15050565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612585573d6000803e3d6000fd5b505050565b6040805160028082526060820183526000926020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561260457600080fd5b505afa158015612618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263c9190612b17565b8160008151811061264f5761264f612e8c565b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061268357612683612e8c565b6001600160a01b0392831660209182029290920101527f00000000000000000000000000000000000000000000000000000000000000001663b6f9de95836000847f00000000000000000000000000000000000000000000000000000000000000006126f14261012c611e09565b6040518663ffffffff1660e01b81526004016127109493929190612c7e565b6000604051808303818588803b15801561272957600080fd5b505af115801561273d573d6000803e3d6000fd5b50505050507f6fd378a9d8b7345c2e5b18229aaf1e39d32b177b501d0a0d26a0a858a23a96248282604051612543929190612d3d565b60008060008060008061278587611e68565b6001600160a01b038f16600090815260066020526040902054959b509399509197509550935091506127b79088611eb7565b6001600160a01b038a166000908152600660209081526040808320939093556005905220546127e69087611eb7565b6001600160a01b03808b1660009081526005602052604080822093909355908a16815220546128159086611e09565b6001600160a01b03891660009081526005602052604090205561283781612a39565b6128418483612ac1565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161288691815260200190565b60405180910390a3505050505050505050565b6000806000806000806128ab87611e68565b6001600160a01b038f16600090815260056020526040902054959b509399509197509550935091506128dd9087611eb7565b6001600160a01b03808b16600090815260056020908152604080832094909455918b168152600690915220546129139084611e09565b6001600160a01b0389166000908152600660209081526040808320939093556005905220546128159086611e09565b60008060008060008061295487611e68565b6001600160a01b038f16600090815260066020526040902054959b509399509197509550935091506129869088611eb7565b6001600160a01b038a166000908152600660209081526040808320939093556005905220546128dd9087611eb7565b6000806000806000806129c787611e68565b6001600160a01b038f16600090815260056020526040902054959b509399509197509550935091506127e69087611eb7565b6000610a316103e8612a166011548561191f90919063ffffffff16565b906118dd565b6000610a316103e8612a166013548561191f90919063ffffffff16565b6000612a43611de6565b90506000612a51838361191f565b30600090815260056020526040902054909150612a6e9082611e09565b3060009081526005602090815260408083209390935560099052205460ff16156125855730600090815260066020526040902054612aac9084611e09565b30600090815260066020526040902055505050565b600c54612ace9083611eb7565b600c55600d54612ade9082611e09565b600d555050565b80358015158114612af557600080fd5b919050565b600060208284031215612b0c57600080fd5b8135610bbb81612ea2565b600060208284031215612b2957600080fd5b8151610bbb81612ea2565b60008060408385031215612b4757600080fd5b8235612b5281612ea2565b91506020830135612b6281612ea2565b809150509250929050565b600080600060608486031215612b8257600080fd5b8335612b8d81612ea2565b92506020840135612b9d81612ea2565b929592945050506040919091013590565b60008060408385031215612bc157600080fd5b8235612bcc81612ea2565b946020939093013593505050565b600060208284031215612bec57600080fd5b610bbb82612ae5565b600060208284031215612c0757600080fd5b5035919050565b60008060408385031215612c2157600080fd5b82359150612c3160208401612ae5565b90509250929050565b600081518084526020808501945080840160005b83811015612c735781516001600160a01b031687529582019590820190600101612c4e565b509495945050505050565b848152608060208201526000612c976080830186612c3a565b6001600160a01b03949094166040830152506060015292915050565b600060208083528351808285015260005b81811015612ce057858101830151858201604001528201612cc4565b81811115612cf2576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b828152604060208201526000612d566040830184612c3a565b949350505050565b85815284602082015260a060408201526000612d7d60a0830186612c3a565b6001600160a01b0394909416606083015250608001529392505050565b60008219821115612dad57612dad612e60565b500190565b600082612dcf57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612dee57612dee612e60565b500290565b600082821015612e0557612e05612e60565b500390565b600181811c90821680612e1e57607f821691505b60208210811415612e3f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612e5957612e59612e60565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038116811461166e57600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e045524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212207d332894e24235aafe2e5c540cbcaefb92d894bf6e482aebd56ec0234329d13264736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102e85760003560e01c8063625e764c11610190578063a69df4b5116100dc578063dd62ed3e11610095578063ec28438a1161006f578063ec28438a1461090e578063edc2fcfb1461092e578063f0f165af1461094e578063f2fde38b1461096e57600080fd5b8063dd62ed3e14610893578063e086e5ec146108d9578063ea2f0b37146108ee57600080fd5b8063a69df4b5146107e9578063a9059cbb146107fe578063bdc653ef1461081e578063c4081a4c14610833578063c49b9a8014610853578063dd4670641461087357600080fd5b806388f820201161014957806395d89b411161012357806395d89b411461077f578063a073d37f14610794578063a457c2d7146107a9578063a5ece941146107c957600080fd5b806388f82020146107085780638da5cb5b14610741578063906e9dd01461075f57600080fd5b8063625e764c146106675780636b67c4df1461068757806370a082311461069d578063715018a6146106bd5780637d1db4a5146106d257806382d2a4bb146106e857600080fd5b80633b124fe71161024f57806349bd5a5e116102085780635342acb4116101e25780635342acb4146105e6578063557ed1ba1461061f578063602bc62b146106325780636053a0e31461064757600080fd5b806349bd5a5e146105735780634a74bb02146105a757806352390c02146105c657600080fd5b80633b124fe7146104c75780633b2d081c146104dd5780633bd5d173146104f3578063437823ec146105135780634549b039146105335780634567bfba1461055357600080fd5b806327c8f835116102a157806327c8f835146103ef57806329370cc6146104235780632d83811914610445578063313ce567146104655780633685d4191461048757806339509351146104a757600080fd5b806306fdde03146102f4578063095ea7b31461031f57806313114a9d1461034f5780631694505e1461036e57806318160ddd146103ba57806323b872dd146103cf57600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b5061030961098e565b6040516103169190612cb3565b60405180910390f35b34801561032b57600080fd5b5061033f61033a366004612bae565b610a20565b6040519015158152602001610316565b34801561035b57600080fd5b50600d545b604051908152602001610316565b34801561037a57600080fd5b506103a27f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610316565b3480156103c657600080fd5b50600b54610360565b3480156103db57600080fd5b5061033f6103ea366004612b6d565b610a37565b3480156103fb57600080fd5b506103a27f000000000000000000000000000000000000000000000000000000000000dead81565b34801561042f57600080fd5b5061044361043e366004612bda565b610aa0565b005b34801561045157600080fd5b50610360610460366004612bf5565b610b3e565b34801561047157600080fd5b5060105460405160ff9091168152602001610316565b34801561049357600080fd5b506104436104a2366004612afa565b610bc2565b3480156104b357600080fd5b5061033f6104c2366004612bae565b610d8e565b3480156104d357600080fd5b5061036060115481565b3480156104e957600080fd5b5061036060155481565b3480156104ff57600080fd5b5061044361050e366004612bf5565b610dc4565b34801561051f57600080fd5b5061044361052e366004612afa565b610eae565b34801561053f57600080fd5b5061036061054e366004612c0e565b610f11565b34801561055f57600080fd5b5061044361056e366004612bf5565b610f9e565b34801561057f57600080fd5b506103a27f00000000000000000000000094bec9bbc7b6449c51475d52aa3f6da805a88bed81565b3480156105b357600080fd5b50601d5461033f90610100900460ff1681565b3480156105d257600080fd5b506104436105e1366004612afa565b610ff6565b3480156105f257600080fd5b5061033f610601366004612afa565b6001600160a01b031660009081526008602052604090205460ff1690565b34801561062b57600080fd5b5042610360565b34801561063e57600080fd5b50600354610360565b34801561065357600080fd5b50601d5461033f9062010000900460ff1681565b34801561067357600080fd5b50610443610682366004612bf5565b61115e565b34801561069357600080fd5b5061036060175481565b3480156106a957600080fd5b506103606106b8366004612afa565b6111af565b3480156106c957600080fd5b5061044361120e565b3480156106de57600080fd5b5061036060195481565b3480156106f457600080fd5b50610443610703366004612bf5565b611285565b34801561071457600080fd5b5061033f610723366004612afa565b6001600160a01b031660009081526009602052604090205460ff1690565b34801561074d57600080fd5b506001546001600160a01b03166103a2565b34801561076b57600080fd5b5061044361077a366004612afa565b6112c9565b34801561078b57600080fd5b5061030961132a565b3480156107a057600080fd5b50601b54610360565b3480156107b557600080fd5b5061033f6107c4366004612bae565b611339565b3480156107d557600080fd5b506004546103a2906001600160a01b031681565b3480156107f557600080fd5b50610443611388565b34801561080a57600080fd5b5061033f610819366004612bae565b611490565b34801561082a57600080fd5b50601c54610360565b34801561083f57600080fd5b5061044361084e366004612bf5565b61149d565b34801561085f57600080fd5b5061044361086e366004612bda565b6114e1565b34801561087f57600080fd5b5061044361088e366004612bf5565b611569565b34801561089f57600080fd5b506103606108ae366004612b34565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b3480156108e557600080fd5b50610443611603565b3480156108fa57600080fd5b50610443610909366004612afa565b611671565b34801561091a57600080fd5b50610443610929366004612bf5565b6116d1565b34801561093a57600080fd5b50610443610949366004612bda565b611715565b34801561095a57600080fd5b50610443610969366004612bf5565b6117ab565b34801561097a57600080fd5b50610443610989366004612afa565b6117ef565b6060600e805461099d90612e0a565b80601f01602080910402602001604051908101604052809291908181526020018280546109c990612e0a565b8015610a165780601f106109eb57610100808354040283529160200191610a16565b820191906000526020600020905b8154815290600101906020018083116109f957829003601f168201915b5050505050905090565b6000610a2d33848461199e565b5060015b92915050565b6000610a44848484611ac2565b610a968433610a9185604051806060016040528060288152602001612eb8602891396001600160a01b038a1660009081526007602090815260408083203384529091529020549190611dac565b61199e565b5060019392505050565b6001546001600160a01b0316331480610ac357506000546001600160a01b031633145b610ae85760405162461bcd60e51b8152600401610adf90612d08565b60405180910390fd5b601d8054821515620100000262ff0000199091161790556040517f3794234fa370c9f3b948dda3e3040530785b2ef1eb27dda3ffde478f4e2643c090610b3390831515815260200190565b60405180910390a150565b6000600c54821115610ba55760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610adf565b6000610baf611de6565b9050610bbb83826118dd565b9392505050565b6001546001600160a01b0316331480610be557506000546001600160a01b031633145b610c015760405162461bcd60e51b8152600401610adf90612d08565b6001600160a01b03811660009081526009602052604090205460ff16610c695760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610adf565b60005b600a54811015610d8a57816001600160a01b0316600a8281548110610c9357610c93612e8c565b6000918252602090912001546001600160a01b03161415610d7857600a8054610cbe90600190612df3565b81548110610cce57610cce612e8c565b600091825260209091200154600a80546001600160a01b039092169183908110610cfa57610cfa612e8c565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600682526040808220829055600990925220805460ff19169055600a805480610d5257610d52612e76565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610d8281612e45565b915050610c6c565b5050565b3360008181526007602090815260408083206001600160a01b03871684529091528120549091610a2d918590610a919086611e09565b3360008181526009602052604090205460ff1615610e395760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610adf565b6000610e4483611e68565b505050506001600160a01b038416600090815260056020526040902054919250610e7091905082611eb7565b6001600160a01b038316600090815260056020526040902055600c54610e969082611eb7565b600c55600d54610ea69084611e09565b600d55505050565b6001546001600160a01b0316331480610ed157506000546001600160a01b031633145b610eed5760405162461bcd60e51b8152600401610adf90612d08565b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b6000600b54831115610f655760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610adf565b81610f84576000610f7584611e68565b50939550610a31945050505050565b6000610f8f84611e68565b50929550610a31945050505050565b6001546001600160a01b0316331480610fc157506000546001600160a01b031633145b610fdd5760405162461bcd60e51b8152600401610adf90612d08565b6015819055601754610ff0908290611e09565b60135550565b6001546001600160a01b031633148061101957506000546001600160a01b031633145b6110355760405162461bcd60e51b8152600401610adf90612d08565b6001600160a01b03811660009081526009602052604090205460ff161561109e5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610adf565b6001600160a01b038116600090815260056020526040902054156110f8576001600160a01b0381166000908152600560205260409020546110de90610b3e565b6001600160a01b0382166000908152600660205260409020555b6001600160a01b03166000818152600960205260408120805460ff19166001908117909155600a805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319169091179055565b6001546001600160a01b031633148061118157506000546001600160a01b031633145b61119d5760405162461bcd60e51b8152600401610adf90612d08565b6017819055601554610ff09082611e09565b6001600160a01b03811660009081526009602052604081205460ff16156111ec57506001600160a01b031660009081526006602052604090205490565b6001600160a01b038216600090815260056020526040902054610a3190610b3e565b6001546001600160a01b031633148061123157506000546001600160a01b031633145b61124d5760405162461bcd60e51b8152600401610adf90612d08565b6001546040516000916001600160a01b031690600080516020612ee0833981519152908390a3600180546001600160a01b0319169055565b6001546001600160a01b03163314806112a857506000546001600160a01b031633145b6112c45760405162461bcd60e51b8152600401610adf90612d08565b601c55565b6001546001600160a01b03163314806112ec57506000546001600160a01b031633145b6113085760405162461bcd60e51b8152600401610adf90612d08565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6060600f805461099d90612e0a565b6000610a2d3384610a9185604051806060016040528060258152602001612f00602591393360009081526007602090815260408083206001600160a01b038d1684529091529020549190611dac565b6002546001600160a01b031633146113ee5760405162461bcd60e51b815260206004820152602360248201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6044820152626f636b60e81b6064820152608401610adf565b600354421161143f5760405162461bcd60e51b815260206004820152601f60248201527f436f6e7472616374206973206c6f636b656420756e74696c20372064617973006044820152606401610adf565b6002546001546040516001600160a01b039283169290911690600080516020612ee083398151915290600090a3600254600180546001600160a01b0319166001600160a01b03909216919091179055565b6000610a2d338484611ac2565b6001546001600160a01b03163314806114c057506000546001600160a01b031633145b6114dc5760405162461bcd60e51b8152600401610adf90612d08565b601155565b6001546001600160a01b031633148061150457506000546001600160a01b031633145b6115205760405162461bcd60e51b8152600401610adf90612d08565b601d80548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610b3390831515815260200190565b6001546001600160a01b031633148061158c57506000546001600160a01b031633145b6115a85760405162461bcd60e51b8152600401610adf90612d08565b60018054600280546001600160a01b03199081166001600160a01b038416179091551690556115d78142612d9a565b6003556001546040516000916001600160a01b031690600080516020612ee0833981519152908390a350565b6001546001600160a01b031633148061162657506000546001600160a01b031633145b6116425760405162461bcd60e51b8152600401610adf90612d08565b60405133904780156108fc02916000818181858888f1935050505015801561166e573d6000803e3d6000fd5b50565b6001546001600160a01b031633148061169457506000546001600160a01b031633145b6116b05760405162461bcd60e51b8152600401610adf90612d08565b6001600160a01b03166000908152600860205260409020805460ff19169055565b6001546001600160a01b03163314806116f457506000546001600160a01b031633145b6117105760405162461bcd60e51b8152600401610adf90612d08565b601955565b6001546001600160a01b031633148061173857506000546001600160a01b031633145b6117545760405162461bcd60e51b8152600401610adf90612d08565b801561177b5761176460006114e1565b61176c611ef9565b601954601a55600b5460195550565b61178560016114e1565b6117a2601254601155601454601355601654601555601854601755565b601a5460195550565b6001546001600160a01b03163314806117ce57506000546001600160a01b031633145b6117ea5760405162461bcd60e51b8152600401610adf90612d08565b601b55565b6001546001600160a01b031633148061181257506000546001600160a01b031633145b61182e5760405162461bcd60e51b8152600401610adf90612d08565b6001600160a01b0381166118935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610adf565b6001546040516001600160a01b03808416921690600080516020612ee083398151915290600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000610bbb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611f3c565b60008261192e57506000610a31565b600061193a8385612dd4565b9050826119478583612db2565b14610bbb5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610adf565b6001600160a01b038316611a005760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610adf565b6001600160a01b038216611a615760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610adf565b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611b265760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610adf565b6001600160a01b038216611b885760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610adf565b60008111611bea5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610adf565b6001546001600160a01b03848116911614801590611c1657506001546001600160a01b03838116911614155b15611c7e57601954811115611c7e5760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610adf565b6000611c89306111af565b601b54601d549192508210159060ff16158015611cad5750601d54610100900460ff165b8015611cea57507f00000000000000000000000094bec9bbc7b6449c51475d52aa3f6da805a88bed6001600160a01b0316846001600160a01b0316145b15611d4d578015611d0357601b549150611d0382611f6a565b601d54479062010000900460ff168015611d245750670de0b6b3a764000081115b15611d4b57601c54811115611d385750601c545b611d4b611d468260646118dd565b611fd3565b505b6001600160a01b03851660009081526008602052604090205460019060ff1680611d8f57506001600160a01b03851660009081526008602052604090205460ff165b15611d98575060005b611da486868684611ffc565b505050505050565b60008184841115611dd05760405162461bcd60e51b8152600401610adf9190612cb3565b506000611ddd8486612df3565b95945050505050565b6000806000611df3612133565b9092509050611e0282826118dd565b9250505090565b600080611e168385612d9a565b905083811015610bbb5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610adf565b6000806000806000806000806000611e7f8a6122b5565b9250925092506000806000611e9d8d8686611e98611de6565b6122f7565b919f909e50909c50959a5093985091965092945050505050565b6000610bbb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611dac565b601154158015611f095750601354155b15611f1057565b601180546012556013805460145560158054601655601780546018556000938490559183905582905555565b60008183611f5d5760405162461bcd60e51b8152600401610adf9190612cb3565b506000611ddd8486612db2565b601d805460ff1916600117905547611f8182612347565b6000611f8d4783611eb7565b600454601754601354929350611fc4926001600160a01b0390921691611fbf9190611fb99086906118dd565b9061191f565b61254f565b5050601d805460ff1916905550565b601d805460ff191660011790558015611fef57611fef8161258a565b50601d805460ff19169055565b8061200957612009611ef9565b6001600160a01b03841660009081526009602052604090205460ff16801561204a57506001600160a01b03831660009081526009602052604090205460ff16155b1561205f5761205a848484612773565b61210b565b6001600160a01b03841660009081526009602052604090205460ff161580156120a057506001600160a01b03831660009081526009602052604090205460ff165b156120b05761205a848484612899565b6001600160a01b03841660009081526009602052604090205460ff1680156120f057506001600160a01b03831660009081526009602052604090205460ff165b156121005761205a848484612942565b61210b8484846129b5565b8061212d5761212d601254601155601454601355601654601555601854601755565b50505050565b600c54600b546000918291825b600a54811015612285578260056000600a848154811061216257612162612e8c565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806121cd57508160066000600a84815481106121a6576121a6612e8c565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156121e357600c54600b54945094505050509091565b61222960056000600a84815481106121fd576121fd612e8c565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611eb7565b925061227160066000600a848154811061224557612245612e8c565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611eb7565b91508061227d81612e45565b915050612140565b50600b54600c54612295916118dd565b8210156122ac57600c54600b549350935050509091565b90939092509050565b6000806000806122c4856129f9565b905060006122d186612a1c565b905060006122e9826122e38986611eb7565b90611eb7565b979296509094509092505050565b6000808080612306888661191f565b90506000612314888761191f565b90506000612322888861191f565b90506000612334826122e38686611eb7565b939b939a50919850919650505050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061237c5761237c612e8c565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156123f557600080fd5b505afa158015612409573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242d9190612b17565b8160018151811061244057612440612e8c565b60200260200101906001600160a01b031690816001600160a01b03168152505061248b307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8461199e565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac947906124e0908590600090869030904290600401612d5e565b600060405180830381600087803b1580156124fa57600080fd5b505af115801561250e573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051612543929190612d3d565b60405180910390a15050565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612585573d6000803e3d6000fd5b505050565b6040805160028082526060820183526000926020830190803683370190505090507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561260457600080fd5b505afa158015612618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263c9190612b17565b8160008151811061264f5761264f612e8c565b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061268357612683612e8c565b6001600160a01b0392831660209182029290920101527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1663b6f9de95836000847f000000000000000000000000000000000000000000000000000000000000dead6126f14261012c611e09565b6040518663ffffffff1660e01b81526004016127109493929190612c7e565b6000604051808303818588803b15801561272957600080fd5b505af115801561273d573d6000803e3d6000fd5b50505050507f6fd378a9d8b7345c2e5b18229aaf1e39d32b177b501d0a0d26a0a858a23a96248282604051612543929190612d3d565b60008060008060008061278587611e68565b6001600160a01b038f16600090815260066020526040902054959b509399509197509550935091506127b79088611eb7565b6001600160a01b038a166000908152600660209081526040808320939093556005905220546127e69087611eb7565b6001600160a01b03808b1660009081526005602052604080822093909355908a16815220546128159086611e09565b6001600160a01b03891660009081526005602052604090205561283781612a39565b6128418483612ac1565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161288691815260200190565b60405180910390a3505050505050505050565b6000806000806000806128ab87611e68565b6001600160a01b038f16600090815260056020526040902054959b509399509197509550935091506128dd9087611eb7565b6001600160a01b03808b16600090815260056020908152604080832094909455918b168152600690915220546129139084611e09565b6001600160a01b0389166000908152600660209081526040808320939093556005905220546128159086611e09565b60008060008060008061295487611e68565b6001600160a01b038f16600090815260066020526040902054959b509399509197509550935091506129869088611eb7565b6001600160a01b038a166000908152600660209081526040808320939093556005905220546128dd9087611eb7565b6000806000806000806129c787611e68565b6001600160a01b038f16600090815260056020526040902054959b509399509197509550935091506127e69087611eb7565b6000610a316103e8612a166011548561191f90919063ffffffff16565b906118dd565b6000610a316103e8612a166013548561191f90919063ffffffff16565b6000612a43611de6565b90506000612a51838361191f565b30600090815260056020526040902054909150612a6e9082611e09565b3060009081526005602090815260408083209390935560099052205460ff16156125855730600090815260066020526040902054612aac9084611e09565b30600090815260066020526040902055505050565b600c54612ace9083611eb7565b600c55600d54612ade9082611e09565b600d555050565b80358015158114612af557600080fd5b919050565b600060208284031215612b0c57600080fd5b8135610bbb81612ea2565b600060208284031215612b2957600080fd5b8151610bbb81612ea2565b60008060408385031215612b4757600080fd5b8235612b5281612ea2565b91506020830135612b6281612ea2565b809150509250929050565b600080600060608486031215612b8257600080fd5b8335612b8d81612ea2565b92506020840135612b9d81612ea2565b929592945050506040919091013590565b60008060408385031215612bc157600080fd5b8235612bcc81612ea2565b946020939093013593505050565b600060208284031215612bec57600080fd5b610bbb82612ae5565b600060208284031215612c0757600080fd5b5035919050565b60008060408385031215612c2157600080fd5b82359150612c3160208401612ae5565b90509250929050565b600081518084526020808501945080840160005b83811015612c735781516001600160a01b031687529582019590820190600101612c4e565b509495945050505050565b848152608060208201526000612c976080830186612c3a565b6001600160a01b03949094166040830152506060015292915050565b600060208083528351808285015260005b81811015612ce057858101830151858201604001528201612cc4565b81811115612cf2576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b828152604060208201526000612d566040830184612c3a565b949350505050565b85815284602082015260a060408201526000612d7d60a0830186612c3a565b6001600160a01b0394909416606083015250608001529392505050565b60008219821115612dad57612dad612e60565b500190565b600082612dcf57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612dee57612dee612e60565b500290565b600082821015612e0557612e05612e60565b500390565b600181811c90821680612e1e57607f821691505b60208210811415612e3f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612e5957612e59612e60565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038116811461166e57600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e045524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212207d332894e24235aafe2e5c540cbcaefb92d894bf6e482aebd56ec0234329d13264736f6c63430008070033

Deployed Bytecode Sourcemap

15201:21134:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18748:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19660:161;;;;;;;;;;-1:-1:-1;19660:161:0;;;;;:::i;:::-;;:::i;:::-;;;3547:14:1;;3540:22;3522:41;;3510:2;3495:18;19660:161:0;3382:187:1;20781:87:0;;;;;;;;;;-1:-1:-1;20850:10:0;;20781:87;;;11339:25:1;;;11327:2;11312:18;20781:87:0;11193:177:1;16547:51:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3114:32:1;;;3096:51;;3084:2;3069:18;16547:51:0;2950:203:1;19025:95:0;;;;;;;;;;-1:-1:-1;19105:7:0;;19025:95;;19829:313;;;;;;;;;;-1:-1:-1;19829:313:0;;;;;:::i;:::-;;:::i;15400:81::-;;;;;;;;;;;;;;;35412:150;;;;;;;;;;-1:-1:-1;35412:150:0;;;;;:::i;:::-;;:::i;:::-;;21965:253;;;;;;;;;;-1:-1:-1;21965:253:0;;;;;:::i;:::-;;:::i;18934:83::-;;;;;;;;;;-1:-1:-1;19000:9:0;;18934:83;;19000:9;;;;12441:36:1;;12429:2;12414:18;18934:83:0;12299:184:1;22569:479:0;;;;;;;;;;-1:-1:-1;22569:479:0;;;;;:::i;:::-;;:::i;20150:218::-;;;;;;;;;;-1:-1:-1;20150:218:0;;;;;:::i;:::-;;:::i;16054:22::-;;;;;;;;;;;;;;;;16213:25;;;;;;;;;;;;;;;;21132:377;;;;;;;;;;-1:-1:-1;21132:377:0;;;;;:::i;:::-;;:::i;33944:111::-;;;;;;;;;;-1:-1:-1;33944:111:0;;;;;:::i;:::-;;:::i;21521:436::-;;;;;;;;;;-1:-1:-1;21521:436:0;;;;;:::i;:::-;;:::i;34292:163::-;;;;;;;;;;-1:-1:-1;34292:163:0;;;;;:::i;:::-;;:::i;16605:38::-;;;;;;;;;;;;;;;16684:40;;;;;;;;;;-1:-1:-1;16684:40:0;;;;;;;;;;;22226:335;;;;;;;;;;-1:-1:-1;22226:335:0;;;;;:::i;:::-;;:::i;33809:123::-;;;;;;;;;;-1:-1:-1;33809:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;33897:27:0;33873:4;33897:27;;;:18;:27;;;;;;;;;33809:123;6591:90;;;;;;;;;;-1:-1:-1;6658:15:0;6591:90;;6489;;;;;;;;;;-1:-1:-1;6562:9:0;;6489:90;;16731:33;;;;;;;;;;-1:-1:-1;16731:33:0;;;;;;;;;;;34590:171;;;;;;;;;;-1:-1:-1;34590:171:0;;;;;:::i;:::-;;:::i;16292:27::-;;;;;;;;;;;;;;;;19128:198;;;;;;;;;;-1:-1:-1;19128:198:0;;;;;:::i;:::-;;:::i;6081:148::-;;;;;;;;;;;;;:::i;16381:27::-;;;;;;;;;;;;;;;;34948:124;;;;;;;;;;-1:-1:-1;34948:124:0;;;;;:::i;:::-;;:::i;20653:120::-;;;;;;;;;;-1:-1:-1;20653:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;20745:20:0;20721:4;20745:20;;;:11;:20;;;;;;;;;20653:120;5828:79;;;;;;;;;;-1:-1:-1;5893:6:0;;-1:-1:-1;;;;;5893:6:0;5828:79;;35080:141;;;;;;;;;;-1:-1:-1;35080:141:0;;;;;:::i;:::-;;:::i;18839:87::-;;;;;;;;;;;;;:::i;20880:120::-;;;;;;;;;;-1:-1:-1;20969:23:0;;20880:120;;20376:269;;;;;;;;;;-1:-1:-1;20376:269:0;;;;;:::i;:::-;;:::i;15333:39::-;;;;;;;;;;-1:-1:-1;15333:39:0;;;;-1:-1:-1;;;;;15333:39:0;;;6927:305;;;;;;;;;;;;;:::i;19334:167::-;;;;;;;;;;-1:-1:-1;19334:167:0;;;;;:::i;:::-;;:::i;21012:108::-;;;;;;;;;;-1:-1:-1;21095:17:0;;21012:108;;34189:91;;;;;;;;;;-1:-1:-1;34189:91:0;;;;;:::i;:::-;;:::i;35229:171::-;;;;;;;;;;-1:-1:-1;35229:171:0;;;;;:::i;:::-;;:::i;6689:226::-;;;;;;;;;;-1:-1:-1;6689:226:0;;;;;:::i;:::-;;:::i;19509:143::-;;;;;;;;;;-1:-1:-1;19509:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;19617:18:0;;;19590:7;19617:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;19509:143;36128:112;;;;;;;;;;;;;:::i;34067:110::-;;;;;;;;;;-1:-1:-1;34067:110:0;;;;;:::i;:::-;;:::i;34467:111::-;;;;;;;;;;-1:-1:-1;34467:111:0;;;;;:::i;:::-;;:::i;35574:406::-;;;;;;;;;;-1:-1:-1;35574:406:0;;;;;:::i;:::-;;:::i;34769:166::-;;;;;;;;;;-1:-1:-1;34769:166:0;;;;;:::i;:::-;;:::i;6237:244::-;;;;;;;;;;-1:-1:-1;6237:244:0;;;;;:::i;:::-;;:::i;18748:83::-;18785:13;18818:5;18811:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18748:83;:::o;19660:161::-;19735:4;19752:39;269:10;19775:7;19784:6;19752:8;:39::i;:::-;-1:-1:-1;19809:4:0;19660:161;;;;;:::o;19829:313::-;19927:4;19944:36;19954:6;19962:9;19973:6;19944:9;:36::i;:::-;19991:121;20000:6;269:10;20022:89;20060:6;20022:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20022:19:0;;;;;;:11;:19;;;;;;;;269:10;20022:33;;;;;;;;;;:37;:89::i;:::-;19991:8;:121::i;:::-;-1:-1:-1;20130:4:0;19829:313;;;;;:::o;35412:150::-;5962:6;;-1:-1:-1;;;;;5962:6:0;269:10;5962:22;;:50;;-1:-1:-1;5988:8:0;;-1:-1:-1;;;;;5988:8:0;269:10;5988:24;5962:50;5954:95;;;;-1:-1:-1;;;5954:95:0;;;;;;;:::i;:::-;;;;;;;;;35482:14:::1;:25:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;35482:25:0;;::::1;;::::0;;35523:31:::1;::::0;::::1;::::0;::::1;::::0;35499:8;3547:14:1;3540:22;3522:41;;3510:2;3495:18;;3382:187;35523:31:0::1;;;;;;;;35412:150:::0;:::o;21965:253::-;22031:7;22070;;22059;:18;;22051:73;;;;-1:-1:-1;;;22051:73:0;;5532:2:1;22051:73:0;;;5514:21:1;5571:2;5551:18;;;5544:30;5610:34;5590:18;;;5583:62;-1:-1:-1;;;5661:18:1;;;5654:40;5711:19;;22051:73:0;5330:406:1;22051:73:0;22135:19;22158:10;:8;:10::i;:::-;22135:33;-1:-1:-1;22186:24:0;:7;22135:33;22186:11;:24::i;:::-;22179:31;21965:253;-1:-1:-1;;;21965:253:0:o;22569:479::-;5962:6;;-1:-1:-1;;;;;5962:6:0;269:10;5962:22;;:50;;-1:-1:-1;5988:8:0;;-1:-1:-1;;;;;5988:8:0;269:10;5988:24;5962:50;5954:95;;;;-1:-1:-1;;;5954:95:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22651:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;22643:60;;;::::0;-1:-1:-1;;;22643:60:0;;7109:2:1;22643:60:0::1;::::0;::::1;7091:21:1::0;7148:2;7128:18;;;7121:30;7187:29;7167:18;;;7160:57;7234:18;;22643:60:0::1;6907:351:1::0;22643:60:0::1;22719:9;22714:327;22738:9;:16:::0;22734:20;::::1;22714:327;;;22796:7;-1:-1:-1::0;;;;;22780:23:0::1;:9;22790:1;22780:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;22780:12:0::1;:23;22776:254;;;22839:9;22849:16:::0;;:20:::1;::::0;22868:1:::1;::::0;22849:20:::1;:::i;:::-;22839:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;22824:9:::1;:12:::0;;-1:-1:-1;;;;;22839:31:0;;::::1;::::0;22834:1;;22824:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;22824:46:0::1;-1:-1:-1::0;;;;;22824:46:0;;::::1;;::::0;;22889:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;22928:11:::1;:20:::0;;;;:28;;-1:-1:-1;;22928:28:0::1;::::0;;22975:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;22975:15:0;;;;;-1:-1:-1;;;;;;22975:15:0::1;::::0;;;;;22714:327:::1;22569:479:::0;:::o;22776:254::-:1;22756:3:::0;::::1;::::0;::::1;:::i;:::-;;;;22714:327;;;;22569:479:::0;:::o;20150:218::-;269:10;20238:4;20287:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;20287:34:0;;;;;;;;;;20238:4;;20255:83;;20278:7;;20287:50;;20326:10;20287:38;:50::i;21132:377::-;269:10;21184:14;21233:19;;;:11;:19;;;;;;;;21232:20;21224:77;;;;-1:-1:-1;;;21224:77:0;;10578:2:1;21224:77:0;;;10560:21:1;10617:2;10597:18;;;10590:30;10656:34;10636:18;;;10629:62;-1:-1:-1;;;10707:18:1;;;10700:42;10759:19;;21224:77:0;10376:408:1;21224:77:0;21313:15;21337:19;21348:7;21337:10;:19::i;:::-;-1:-1:-1;;;;;;;;;21385:15:0;;;;;;:7;:15;;;;;;21312:44;;-1:-1:-1;21385:28:0;;:15;-1:-1:-1;21312:44:0;21385:19;:28::i;:::-;-1:-1:-1;;;;;21367:15:0;;;;;;:7;:15;;;;;:46;21434:7;;:20;;21446:7;21434:11;:20::i;:::-;21424:7;:30;21478:10;;:23;;21493:7;21478:14;:23::i;:::-;21465:10;:36;-1:-1:-1;;;21132:377:0:o;33944:111::-;5962:6;;-1:-1:-1;;;;;5962:6:0;269:10;5962:22;;:50;;-1:-1:-1;5988:8:0;;-1:-1:-1;;;;;5988:8:0;269:10;5988:24;5962:50;5954:95;;;;-1:-1:-1;;;5954:95:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34013:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;34013:34:0::1;34043:4;34013:34;::::0;;33944:111::o;21521:436::-;21611:7;21650;;21639;:18;;21631:62;;;;-1:-1:-1;;;21631:62:0;;7465:2:1;21631:62:0;;;7447:21:1;7504:2;7484:18;;;7477:30;7543:33;7523:18;;;7516:61;7594:18;;21631:62:0;7263:355:1;21631:62:0;21709:17;21704:246;;21744:15;21768:19;21779:7;21768:10;:19::i;:::-;-1:-1:-1;21743:44:0;;-1:-1:-1;21802:14:0;;-1:-1:-1;;;;;21802:14:0;21704:246;21851:23;21882:19;21893:7;21882:10;:19::i;:::-;-1:-1:-1;21849:52:0;;-1:-1:-1;21916:22:0;;-1:-1:-1;;;;;21916:22:0;34292:163;5962:6;;-1:-1:-1;;;;;5962:6:0;269:10;5962:22;;:50;;-1:-1:-1;5988:8:0;;-1:-1:-1;;;;;5988:8:0;269:10;5988:24;5962:50;5954:95;;;;-1:-1:-1;;;5954:95:0;;;;;;;:::i;:::-;34368:10:::1;:24:::0;;;34434:12:::1;::::0;34419:28:::1;::::0;34381:11;;34419:14:::1;:28::i;:::-;34403:13;:44:::0;-1:-1:-1;34292:163:0:o;22226:335::-;5962:6;;-1:-1:-1;;;;;5962:6:0;269:10;5962:22;;:50;;-1:-1:-1;5988:8:0;;-1:-1:-1;;;;;5988:8:0;269:10;5988:24;5962:50;5954:95;;;;-1:-1:-1;;;5954:95:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22311:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;22310:21;22302:61;;;::::0;-1:-1:-1;;;22302:61:0;;7109:2:1;22302:61:0::1;::::0;::::1;7091:21:1::0;7148:2;7128:18;;;7121:30;7187:29;7167:18;;;7160:57;7234:18;;22302:61:0::1;6907:351:1::0;22302:61:0::1;-1:-1:-1::0;;;;;22377:16:0;::::1;22396:1;22377:16:::0;;;:7:::1;:16;::::0;;;;;:20;22374:108:::1;;-1:-1:-1::0;;;;;22453:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;22433:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;22414:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;22374:108:::1;-1:-1:-1::0;;;;;22492:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;22492:27:0::1;22515:4;22492:27:::0;;::::1;::::0;;;22530:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;22530:23:0::1;::::0;;::::1;::::0;;22226:335::o;34590:171::-;5962:6;;-1:-1:-1;;;;;5962:6:0;269:10;5962:22;;:50;;-1:-1:-1;5988:8:0;;-1:-1:-1;;;;;5988:8:0;269:10;5988:24;5962:50;5954:95;;;;-1:-1:-1;;;5954:95:0;;;;;;;:::i;:::-;34670:12:::1;:28:::0;;;34725:10:::1;::::0;:28:::1;::::0;34685:13;34725:14:::1;:28::i;19128:198::-:0;-1:-1:-1;;;;;19218:20:0;;19194:7;19218:20;;;:11;:20;;;;;;;;19214:49;;;-1:-1:-1;;;;;;19247:16:0;;;;;:7;:16;;;;;;;19128:198::o;19214:49::-;-1:-1:-1;;;;;19301:16:0;;;;;;:7;:16;;;;;;19281:37;;:19;:37::i;6081:148::-;5962:6;;-1:-1:-1;;;;;5962:6:0;269:10;5962:22;;:50;;-1:-1:-1;5988:8:0;;-1:-1:-1;;;;;5988:8:0;269:10;5988:24;5962:50;5954:95;;;;-1:-1:-1;;;5954:95:0;;;;;;;:::i;:::-;6172:6:::1;::::0;6151:40:::1;::::0;6188:1:::1;::::0;-1:-1:-1;;;;;6172:6:0::1;::::0;-1:-1:-1;;;;;;;;;;;6151:40:0;6188:1;;6151:40:::1;6202:6;:19:::0;;-1:-1:-1;;;;;;6202:19:0::1;::::0;;6081:148::o;34948:124::-;5962:6;;-1:-1:-1;;;;;5962:6:0;269:10;5962:22;;:50;;-1:-1:-1;5988:8:0;;-1:-1:-1;;;;;5988:8:0;269:10;5988:24;5962:50;5954:95;;;;-1:-1:-1;;;5954:95:0;;;;;;;:::i;:::-;35032:17:::1;:32:::0;34948:124::o;35080:141::-;5962:6;;-1:-1:-1;;;;;5962:6:0;269:10;5962:22;;:50;;-1:-1:-1;5988:8:0;;-1:-1:-1;;;;;5988:8:0;269:10;5988:24;5962:50;5954:95;;;;-1:-1:-1;;;5954:95:0;;;;;;;:::i;:::-;35168:16:::1;:45:::0;;-1:-1:-1;;;;;;35168:45:0::1;-1:-1:-1::0;;;;;35168:45:0;;;::::1;::::0;;;::::1;::::0;;35080:141::o;18839:87::-;18878:13;18911:7;18904:14;;;;;:::i;20376:269::-;20469:4;20486:129;269:10;20509:7;20518:96;20557:15;20518:96;;;;;;;;;;;;;;;;;269:10;20518:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;20518:34:0;;;;;;;;;;;;:38;:96::i;6927:305::-;6979:14;;-1:-1:-1;;;;;6979:14:0;6997:10;6979:28;6971:76;;;;-1:-1:-1;;;6971:76:0;;10991:2:1;6971:76:0;;;10973:21:1;11030:2;11010:18;;;11003:30;11069:34;11049:18;;;11042:62;-1:-1:-1;;;11120:18:1;;;11113:33;11163:19;;6971:76:0;10789:399:1;6971:76:0;7084:9;;7066:15;:27;7058:72;;;;-1:-1:-1;;;7058:72:0;;10218:2:1;7058:72:0;;;10200:21:1;10257:2;10237:18;;;10230:30;10296:33;10276:18;;;10269:61;10347:18;;7058:72:0;10016:355:1;7058:72:0;7175:14;;;7167:6;7146:44;;-1:-1:-1;;;;;7175:14:0;;;;7167:6;;;;-1:-1:-1;;;;;;;;;;;7146:44:0;7175:14;;7146:44;7210:14;;;7201:23;;-1:-1:-1;;;;;;7201:23:0;-1:-1:-1;;;;;7210:14:0;;;7201:23;;;;;;6927:305::o;19334:167::-;19412:4;19429:42;269:10;19453:9;19464:6;19429:9;:42::i;34189:91::-;5962:6;;-1:-1:-1;;;;;5962:6:0;269:10;5962:22;;:50;;-1:-1:-1;5988:8:0;;-1:-1:-1;;;;;5988:8:0;269:10;5988:24;5962:50;5954:95;;;;-1:-1:-1;;;5954:95:0;;;;;;;:::i;:::-;34256:7:::1;:16:::0;34189:91::o;35229:171::-;5962:6;;-1:-1:-1;;;;;5962:6:0;269:10;5962:22;;:50;;-1:-1:-1;5988:8:0;;-1:-1:-1;;;;;5988:8:0;269:10;5988:24;5962:50;5954:95;;;;-1:-1:-1;;;5954:95:0;;;;;;;:::i;:::-;35306:21:::1;:32:::0;;;::::1;;;;-1:-1:-1::0;;35306:32:0;;::::1;;::::0;;35354:38:::1;::::0;::::1;::::0;::::1;::::0;35330:8;3547:14:1;3540:22;3522:41;;3510:2;3495:18;;3382:187;6689:226:0;5962:6;;-1:-1:-1;;;;;5962:6:0;269:10;5962:22;;:50;;-1:-1:-1;5988:8:0;;-1:-1:-1;;;;;5988:8:0;269:10;5988:24;5962:50;5954:95;;;;-1:-1:-1;;;5954:95:0;;;;;;;:::i;:::-;6770:6:::1;::::0;;6753:14:::1;:23:::0;;-1:-1:-1;;;;;;6753:23:0;;::::1;-1:-1:-1::0;;;;;6770:6:0;::::1;6753:23;::::0;;;6787:19:::1;::::0;;6829:22:::1;6847:4:::0;6829:15:::1;:22;:::i;:::-;6817:9;:34:::0;6888:6:::1;::::0;6867:40:::1;::::0;6904:1:::1;::::0;-1:-1:-1;;;;;6888:6:0::1;::::0;-1:-1:-1;;;;;;;;;;;6867:40:0;6904:1;;6867:40:::1;6689:226:::0;:::o;36128:112::-;5962:6;;-1:-1:-1;;;;;5962:6:0;269:10;5962:22;;:50;;-1:-1:-1;5988:8:0;;-1:-1:-1;;;;;5988:8:0;269:10;5988:24;5962:50;5954:95;;;;-1:-1:-1;;;5954:95:0;;;;;;;:::i;:::-;36181:51:::1;::::0;36189:10:::1;::::0;36210:21:::1;36181:51:::0;::::1;;;::::0;::::1;::::0;;;36210:21;36189:10;36181:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;36128:112::o:0;34067:110::-;5962:6;;-1:-1:-1;;;;;5962:6:0;269:10;5962:22;;:50;;-1:-1:-1;5988:8:0;;-1:-1:-1;;;;;5988:8:0;269:10;5988:24;5962:50;5954:95;;;;-1:-1:-1;;;5954:95:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34134:27:0::1;34164:5;34134:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;34134:35:0::1;::::0;;34067:110::o;34467:111::-;5962:6;;-1:-1:-1;;;;;5962:6:0;269:10;5962:22;;:50;;-1:-1:-1;5988:8:0;;-1:-1:-1;;;;;5988:8:0;269:10;5988:24;5962:50;5954:95;;;;-1:-1:-1;;;5954:95:0;;;;;;;:::i;:::-;34544:12:::1;:26:::0;34467:111::o;35574:406::-;5962:6;;-1:-1:-1;;;;;5962:6:0;269:10;5962:22;;:50;;-1:-1:-1;5988:8:0;;-1:-1:-1;;;;;5988:8:0;269:10;5988:24;5962:50;5954:95;;;;-1:-1:-1;;;5954:95:0;;;;;;;:::i;:::-;35640:8:::1;35636:337;;;35665:31;35690:5;35665:24;:31::i;:::-;35711:14;:12;:14::i;:::-;35763:12;::::0;35740:20:::1;:35:::0;19105:7;;35790:12:::1;:28:::0;36181:51:::1;36128:112::o:0;35636:337::-:1;35851:30;35876:4;35851:24;:30::i;:::-;35896:15;33642::::0;;33632:7;:25;33684:21;;33668:13;:37;33729:18;;33716:10;:31;33773:20;;33758:12;:35;33588:213;35896:15:::1;35941:20;::::0;35926:12:::1;:35:::0;35574:406;:::o;34769:166::-;5962:6;;-1:-1:-1;;;;;5962:6:0;269:10;5962:22;;:50;;-1:-1:-1;5988:8:0;;-1:-1:-1;;;;;5988:8:0;269:10;5988:24;5962:50;5954:95;;;;-1:-1:-1;;;5954:95:0;;;;;;;:::i;:::-;34877:23:::1;:50:::0;34769:166::o;6237:244::-;5962:6;;-1:-1:-1;;;;;5962:6:0;269:10;5962:22;;:50;;-1:-1:-1;5988:8:0;;-1:-1:-1;;;;;5988:8:0;269:10;5988:24;5962:50;5954:95;;;;-1:-1:-1;;;5954:95:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6326:22:0;::::1;6318:73;;;::::0;-1:-1:-1;;;6318:73:0;;5943:2:1;6318:73:0::1;::::0;::::1;5925:21:1::0;5982:2;5962:18;;;5955:30;6021:34;6001:18;;;5994:62;-1:-1:-1;;;6072:18:1;;;6065:36;6118:19;;6318:73:0::1;5741:402:1::0;6318:73:0::1;6428:6;::::0;6407:38:::1;::::0;-1:-1:-1;;;;;6407:38:0;;::::1;::::0;6428:6:::1;::::0;-1:-1:-1;;;;;;;;;;;6407:38:0;6428:6:::1;::::0;6407:38:::1;6456:6;:17:::0;;-1:-1:-1;;;;;;6456:17:0::1;-1:-1:-1::0;;;;;6456:17:0;;;::::1;::::0;;;::::1;::::0;;6237:244::o;1925:132::-;1983:7;2010:39;2014:1;2017;2010:39;;;;;;;;;;;;;;;;;:3;:39::i;1665:250::-;1723:7;1747:6;1743:47;;-1:-1:-1;1777:1:0;1770:8;;1743:47;1802:9;1814:5;1818:1;1814;:5;:::i;:::-;1802:17;-1:-1:-1;1847:1:0;1838:5;1842:1;1802:17;1838:5;:::i;:::-;:10;1830:56;;;;-1:-1:-1;;;1830:56:0;;8234:2:1;1830:56:0;;;8216:21:1;8273:2;8253:18;;;8246:30;8312:34;8292:18;;;8285:62;-1:-1:-1;;;8363:18:1;;;8356:31;8404:19;;1830:56:0;8032:397:1;23056:337:0;-1:-1:-1;;;;;23149:19:0;;23141:68;;;;-1:-1:-1;;;23141:68:0;;9813:2:1;23141:68:0;;;9795:21:1;9852:2;9832:18;;;9825:30;9891:34;9871:18;;;9864:62;-1:-1:-1;;;9942:18:1;;;9935:34;9986:19;;23141:68:0;9611:400:1;23141:68:0;-1:-1:-1;;;;;23228:21:0;;23220:68;;;;-1:-1:-1;;;23220:68:0;;6350:2:1;23220:68:0;;;6332:21:1;6389:2;6369:18;;;6362:30;6428:34;6408:18;;;6401:62;-1:-1:-1;;;6479:18:1;;;6472:32;6521:19;;23220:68:0;6148:398:1;23220:68:0;-1:-1:-1;;;;;23301:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;23353:32;;11339:25:1;;;23353:32:0;;11312:18:1;23353:32:0;;;;;;;23056:337;;;:::o;23401:1547::-;-1:-1:-1;;;;;23523:18:0;;23515:68;;;;-1:-1:-1;;;23515:68:0;;9407:2:1;23515:68:0;;;9389:21:1;9446:2;9426:18;;;9419:30;9485:34;9465:18;;;9458:62;-1:-1:-1;;;9536:18:1;;;9529:35;9581:19;;23515:68:0;9205:401:1;23515:68:0;-1:-1:-1;;;;;23602:16:0;;23594:64;;;;-1:-1:-1;;;23594:64:0;;5128:2:1;23594:64:0;;;5110:21:1;5167:2;5147:18;;;5140:30;5206:34;5186:18;;;5179:62;-1:-1:-1;;;5257:18:1;;;5250:33;5300:19;;23594:64:0;4926:399:1;23594:64:0;23686:1;23677:6;:10;23669:64;;;;-1:-1:-1;;;23669:64:0;;8997:2:1;23669:64:0;;;8979:21:1;9036:2;9016:18;;;9009:30;9075:34;9055:18;;;9048:62;-1:-1:-1;;;9126:18:1;;;9119:39;9175:19;;23669:64:0;8795:405:1;23669:64:0;5893:6;;-1:-1:-1;;;;;23747:15:0;;;5893:6;;23747:15;;;;:32;;-1:-1:-1;5893:6:0;;-1:-1:-1;;;;;23766:13:0;;;5893:6;;23766:13;;23747:32;23744:139;;;23814:12;;23804:6;:22;;23796:75;;;;-1:-1:-1;;;23796:75:0;;7825:2:1;23796:75:0;;;7807:21:1;7864:2;7844:18;;;7837:30;7903:34;7883:18;;;7876:62;-1:-1:-1;;;7954:18:1;;;7947:38;8002:19;;23796:75:0;7623:404:1;23796:75:0;23895:28;23926:24;23944:4;23926:9;:24::i;:::-;24016:23;;24065:16;;23895:55;;-1:-1:-1;23992:47:0;;;;24065:16;;24064:17;:42;;;;-1:-1:-1;24085:21:0;;;;;;;24064:42;:65;;;;;24116:13;-1:-1:-1;;;;;24110:19:0;:2;-1:-1:-1;;;;;24110:19:0;;24064:65;24060:582;;;24150:23;24146:165;;;24217:23;;24194:46;;24259:32;24270:20;24259:10;:32::i;:::-;24380:14;;24340:21;;24380:14;;;;;:47;;;;;24416:10;24398:7;:29;24380:47;24376:255;;;24480:17;;24470:7;:27;24466:81;;;-1:-1:-1;24530:17:0;;24466:81;24584:31;24598:16;:7;24610:3;24598:11;:16::i;:::-;24584:13;:31::i;:::-;24131:511;24060:582;-1:-1:-1;;;;;24789:24:0;;24662:12;24789:24;;;:18;:24;;;;;;24677:4;;24789:24;;;:50;;-1:-1:-1;;;;;;24817:22:0;;;;;;:18;:22;;;;;;;;24789:50;24786:96;;;-1:-1:-1;24865:5:0;24786:96;24902:38;24917:4;24922:2;24925:6;24932:7;24902:14;:38::i;:::-;23504:1444;;;23401:1547;;;:::o;1465:192::-;1551:7;1587:12;1579:6;;;;1571:29;;;;-1:-1:-1;;;1571:29:0;;;;;;;;:::i;:::-;-1:-1:-1;1611:9:0;1623:5;1627:1;1623;:5;:::i;:::-;1611:17;1465:192;-1:-1:-1;;;;;1465:192:0:o;31731:163::-;31772:7;31793:15;31810;31829:19;:17;:19::i;:::-;31792:56;;-1:-1:-1;31792:56:0;-1:-1:-1;31866:20:0;31792:56;;31866:11;:20::i;:::-;31859:27;;;;31731:163;:::o;1132:181::-;1190:7;;1222:5;1226:1;1222;:5;:::i;:::-;1210:17;;1251:1;1246;:6;;1238:46;;;;-1:-1:-1;;;1238:46:0;;6753:2:1;1238:46:0;;;6735:21:1;6792:2;6772:18;;;6765:30;6831:29;6811:18;;;6804:57;6878:18;;1238:46:0;6551:351:1;30529:419:0;30588:7;30597;30606;30615;30624;30633;30654:23;30679:12;30693:18;30715:20;30727:7;30715:11;:20::i;:::-;30653:82;;;;;;30747:15;30764:23;30789:12;30805:50;30817:7;30826:4;30832:10;30844;:8;:10::i;:::-;30805:11;:50::i;:::-;30746:109;;;;-1:-1:-1;30746:109:0;;-1:-1:-1;30906:15:0;;-1:-1:-1;30923:4:0;;-1:-1:-1;30929:10:0;;-1:-1:-1;30529:419:0;;-1:-1:-1;;;;;30529:419:0:o;1321:136::-;1379:7;1406:43;1410:1;1413;1406:43;;;;;;;;;;;;;;;;;:3;:43::i;33186:390::-;33232:7;;:12;:34;;;;-1:-1:-1;33248:13:0;;:18;33232:34;33229:46;;;33186:390::o;33229:46::-;33313:7;;;33295:15;:25;33355:13;;;33331:21;:37;33400:10;;;33379:18;:31;33444:12;;;33421:20;:35;-1:-1:-1;33477:11:0;;;;33499:17;;;;33527:14;;;33552:16;33186:390::o;2065:278::-;2151:7;2186:12;2179:5;2171:28;;;;-1:-1:-1;;;2171:28:0;;;;;;;;:::i;:::-;-1:-1:-1;2210:9:0;2222:5;2226:1;2222;:5;:::i;24956:437::-;17299:16;:23;;-1:-1:-1;;17299:23:0;17318:4;17299:23;;;25071:21:::1;25103:38;25120:20:::0;25103:16:::1;:38::i;:::-;25152:26;25181:41;:21;25207:14:::0;25181:25:::1;:41::i;:::-;25303:16;::::0;25363:12:::1;::::0;25344:13:::1;::::0;25152:70;;-1:-1:-1;25282:95:0::1;::::0;-1:-1:-1;;;;;25303:16:0;;::::1;::::0;25321:55:::1;::::0;25363:12;25321:37:::1;::::0;25152:70;;25321:22:::1;:37::i;:::-;:41:::0;::::1;:55::i;:::-;25282:20;:95::i;:::-;-1:-1:-1::0;;17345:16:0;:24;;-1:-1:-1;;17345:24:0;;;-1:-1:-1;24956:437:0:o;25407:135::-;17299:16;:23;;-1:-1:-1;;17299:23:0;17318:4;17299:23;;;25478:10;;25474:61:::1;;25502:24;25519:6;25502:16;:24::i;:::-;-1:-1:-1::0;17345:16:0;:24;;-1:-1:-1;;17345:24:0;;;25407:135::o;27343:704::-;27454:7;27450:40;;27476:14;:12;:14::i;:::-;-1:-1:-1;;;;;27515:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;27539:22:0;;;;;;:11;:22;;;;;;;;27538:23;27515:46;27511:467;;;27578:48;27600:6;27608:9;27619:6;27578:21;:48::i;:::-;27511:467;;;-1:-1:-1;;;;;27649:19:0;;;;;;:11;:19;;;;;;;;27648:20;:46;;;;-1:-1:-1;;;;;;27672:22:0;;;;;;:11;:22;;;;;;;;27648:46;27644:334;;;27711:46;27731:6;27739:9;27750:6;27711:19;:46::i;27644:334::-;-1:-1:-1;;;;;27779:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;27802:22:0;;;;;;:11;:22;;;;;;;;27779:45;27775:203;;;27841:48;27863:6;27871:9;27882:6;27841:21;:48::i;27775:203::-;27922:44;27940:6;27948:9;27959:6;27922:17;:44::i;:::-;28002:7;27998:41;;28024:15;33642;;33632:7;:25;33684:21;;33668:13;:37;33729:18;;33716:10;:31;33773:20;;33758:12;:35;33588:213;28024:15;27343:704;;;;:::o;31902:561::-;31999:7;;32035;;31952;;;;;32059:289;32083:9;:16;32079:20;;32059:289;;;32149:7;32125;:21;32133:9;32143:1;32133:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;32133:12:0;32125:21;;;;;;;;;;;;;:31;;:66;;;32184:7;32160;:21;32168:9;32178:1;32168:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;32168:12:0;32160:21;;;;;;;;;;;;;:31;32125:66;32121:97;;;32201:7;;32210;;32193:25;;;;;;;31902:561;;:::o;32121:97::-;32243:34;32255:7;:21;32263:9;32273:1;32263:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;32263:12:0;32255:21;;;;;;;;;;;;;32243:7;;:11;:34::i;:::-;32233:44;;32302:34;32314:7;:21;32322:9;32332:1;32322:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;32322:12:0;32314:21;;;;;;;;;;;;;32302:7;;:11;:34::i;:::-;32292:44;-1:-1:-1;32101:3:0;;;;:::i;:::-;;;;32059:289;;;-1:-1:-1;32384:7:0;;32372;;:20;;:11;:20::i;:::-;32362:7;:30;32358:61;;;32402:7;;32411;;32394:25;;;;;;31902:561;;:::o;32358:61::-;32438:7;;32447;;-1:-1:-1;31902:561:0;-1:-1:-1;31902:561:0:o;30956:330::-;31016:7;31025;31034;31054:12;31069:24;31085:7;31069:15;:24::i;:::-;31054:39;;31104:18;31125:30;31147:7;31125:21;:30::i;:::-;31104:51;-1:-1:-1;31166:23:0;31192:33;31104:51;31192:17;:7;31204:4;31192:11;:17::i;:::-;:21;;:33::i;:::-;31166:59;31261:4;;-1:-1:-1;31267:10:0;;-1:-1:-1;30956:330:0;;-1:-1:-1;;;30956:330:0:o;31294:429::-;31409:7;;;;31465:24;:7;31477:11;31465;:24::i;:::-;31447:42;-1:-1:-1;31500:12:0;31515:21;:4;31524:11;31515:8;:21::i;:::-;31500:36;-1:-1:-1;31547:18:0;31568:27;:10;31583:11;31568:14;:27::i;:::-;31547:48;-1:-1:-1;31606:23:0;31632:33;31547:48;31632:17;:7;31644:4;31632:11;:17::i;:33::-;31684:7;;;;-1:-1:-1;31710:4:0;;-1:-1:-1;31294:429:0;;-1:-1:-1;;;;;;;31294:429:0:o;25554:666::-;25704:16;;;25718:1;25704:16;;;;;;;;25680:21;;25704:16;;;;;;;;;;-1:-1:-1;25704:16:0;25680:40;;25749:4;25731;25736:1;25731:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;25731:23:0;;;-1:-1:-1;;;;;25731:23:0;;;;;25775:15;-1:-1:-1;;;;;25775:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25765:4;25770:1;25765:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;25765:32:0;;;-1:-1:-1;;;;;25765:32:0;;;;;25810:62;25827:4;25842:15;25860:11;25810:8;:62::i;:::-;25911:240;;-1:-1:-1;;;25911:240:0;;-1:-1:-1;;;;;25911:15:0;:66;;;;:240;;25992:11;;26018:1;;26062:4;;26089;;26125:15;;25911:240;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26177:35;26194:11;26207:4;26177:35;;;;;;;:::i;:::-;;;;;;;;25609:611;25554:666;:::o;35994:126::-;36086:26;;-1:-1:-1;;;;;36086:18:0;;;:26;;;;;36105:6;;36086:26;;;;36105:6;36086:18;:26;;;;;;;;;;;;;;;;;;;;;35994:126;;:::o;26232:578::-;26377:16;;;26391:1;26377:16;;;;;;;;26353:21;;26377:16;;;;;;;;;;-1:-1:-1;26377:16:0;26353:40;;26414:15;-1:-1:-1;;;;;26414:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26404:4;26409:1;26404:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;26404:32:0;;;-1:-1:-1;;;;;26404:32:0;;;;;26465:4;26447;26452:1;26447:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;26447:23:0;;;:7;;;;;;;;;:23;26507:15;:66;;26581:6;26603:1;26650:4;26669:11;26711:24;:15;26731:3;26711:19;:24::i;:::-;26507:239;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26772:30;26789:6;26797:4;26772:30;;;;;;;:::i;29156:563::-;29259:15;29276:23;29301:12;29315:23;29340:12;29354:18;29376:19;29387:7;29376:10;:19::i;:::-;-1:-1:-1;;;;;29421:15:0;;;;;;:7;:15;;;;;;29258:137;;-1:-1:-1;29258:137:0;;-1:-1:-1;29258:137:0;;-1:-1:-1;29258:137:0;-1:-1:-1;29258:137:0;-1:-1:-1;29258:137:0;-1:-1:-1;29421:28:0;;29441:7;29421:19;:28::i;:::-;-1:-1:-1;;;;;29403:15:0;;;;;;:7;:15;;;;;;;;:46;;;;29478:7;:15;;;;:28;;29498:7;29478:19;:28::i;:::-;-1:-1:-1;;;;;29460:15:0;;;;;;;:7;:15;;;;;;:46;;;;29538:18;;;;;;;:39;;29561:15;29538:22;:39::i;:::-;-1:-1:-1;;;;;29517:18:0;;;;;;:7;:18;;;;;:60;29591:26;29606:10;29591:14;:26::i;:::-;29628:23;29640:4;29646;29628:11;:23::i;:::-;29684:9;-1:-1:-1;;;;;29667:44:0;29676:6;-1:-1:-1;;;;;29667:44:0;;29695:15;29667:44;;;;11339:25:1;;11327:2;11312:18;;11193:177;29667:44:0;;;;;;;;29247:472;;;;;;29156:563;;;:::o;28565:583::-;28666:15;28683:23;28708:12;28722:23;28747:12;28761:18;28783:19;28794:7;28783:10;:19::i;:::-;-1:-1:-1;;;;;28828:15:0;;;;;;:7;:15;;;;;;28665:137;;-1:-1:-1;28665:137:0;;-1:-1:-1;28665:137:0;;-1:-1:-1;28665:137:0;-1:-1:-1;28665:137:0;-1:-1:-1;28665:137:0;-1:-1:-1;28828:28:0;;28665:137;28828:19;:28::i;:::-;-1:-1:-1;;;;;28810:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;28888:18;;;;;:7;:18;;;;;:39;;28911:15;28888:22;:39::i;:::-;-1:-1:-1;;;;;28867:18:0;;;;;;:7;:18;;;;;;;;:60;;;;28959:7;:18;;;;:39;;28982:15;28959:22;:39::i;29727:639::-;29830:15;29847:23;29872:12;29886:23;29911:12;29925:18;29947:19;29958:7;29947:10;:19::i;:::-;-1:-1:-1;;;;;29992:15:0;;;;;;:7;:15;;;;;;29829:137;;-1:-1:-1;29829:137:0;;-1:-1:-1;29829:137:0;;-1:-1:-1;29829:137:0;-1:-1:-1;29829:137:0;-1:-1:-1;29829:137:0;-1:-1:-1;29992:28:0;;30012:7;29992:19;:28::i;:::-;-1:-1:-1;;;;;29974:15:0;;;;;;:7;:15;;;;;;;;:46;;;;30049:7;:15;;;;:28;;30069:7;30049:19;:28::i;28055:502::-;28154:15;28171:23;28196:12;28210:23;28235:12;28249:18;28271:19;28282:7;28271:10;:19::i;:::-;-1:-1:-1;;;;;28319:15:0;;;;;;:7;:15;;;;;;28153:137;;-1:-1:-1;28153:137:0;;-1:-1:-1;28153:137:0;;-1:-1:-1;28153:137:0;-1:-1:-1;28153:137:0;-1:-1:-1;28153:137:0;-1:-1:-1;28319:28:0;;28153:137;28319:19;:28::i;32842:154::-;32906:7;32933:55;32972:5;32933:20;32945:7;;32933;:11;;:20;;;;:::i;:::-;:24;;:55::i;33008:166::-;33078:7;33105:61;33150:5;33105:26;33117:13;;33105:7;:11;;:26;;;;:::i;32475:355::-;32538:19;32561:10;:8;:10::i;:::-;32538:33;-1:-1:-1;32582:18:0;32603:27;:10;32538:33;32603:14;:27::i;:::-;32682:4;32666:22;;;;:7;:22;;;;;;32582:48;;-1:-1:-1;32666:38:0;;32582:48;32666:26;:38::i;:::-;32657:4;32641:22;;;;:7;:22;;;;;;;;:63;;;;32718:11;:26;;;;;;32715:107;;;32800:4;32784:22;;;;:7;:22;;;;;;:38;;32811:10;32784:26;:38::i;:::-;32775:4;32759:22;;;;:7;:22;;;;;:63;32527:303;;32475:355;:::o;30374:147::-;30452:7;;:17;;30464:4;30452:11;:17::i;:::-;30442:7;:27;30493:10;;:20;;30508:4;30493:14;:20::i;:::-;30480:10;:33;-1:-1:-1;;30374:147:0:o;14:160:1:-;79:20;;135:13;;128:21;118:32;;108:60;;164:1;161;154:12;108:60;14:160;;;:::o;179:247::-;238:6;291:2;279:9;270:7;266:23;262:32;259:52;;;307:1;304;297:12;259:52;346:9;333:23;365:31;390:5;365:31;:::i;431:251::-;501:6;554:2;542:9;533:7;529:23;525:32;522:52;;;570:1;567;560:12;522:52;602:9;596:16;621:31;646:5;621:31;:::i;687:388::-;755:6;763;816:2;804:9;795:7;791:23;787:32;784:52;;;832:1;829;822:12;784:52;871:9;858:23;890:31;915:5;890:31;:::i;:::-;940:5;-1:-1:-1;997:2:1;982:18;;969:32;1010:33;969:32;1010:33;:::i;:::-;1062:7;1052:17;;;687:388;;;;;:::o;1080:456::-;1157:6;1165;1173;1226:2;1214:9;1205:7;1201:23;1197:32;1194:52;;;1242:1;1239;1232:12;1194:52;1281:9;1268:23;1300:31;1325:5;1300:31;:::i;:::-;1350:5;-1:-1:-1;1407:2:1;1392:18;;1379:32;1420:33;1379:32;1420:33;:::i;:::-;1080:456;;1472:7;;-1:-1:-1;;;1526:2:1;1511:18;;;;1498:32;;1080:456::o;1541:315::-;1609:6;1617;1670:2;1658:9;1649:7;1645:23;1641:32;1638:52;;;1686:1;1683;1676:12;1638:52;1725:9;1712:23;1744:31;1769:5;1744:31;:::i;:::-;1794:5;1846:2;1831:18;;;;1818:32;;-1:-1:-1;;;1541:315:1:o;1861:180::-;1917:6;1970:2;1958:9;1949:7;1945:23;1941:32;1938:52;;;1986:1;1983;1976:12;1938:52;2009:26;2025:9;2009:26;:::i;2046:180::-;2105:6;2158:2;2146:9;2137:7;2133:23;2129:32;2126:52;;;2174:1;2171;2164:12;2126:52;-1:-1:-1;2197:23:1;;2046:180;-1:-1:-1;2046:180:1:o;2231:248::-;2296:6;2304;2357:2;2345:9;2336:7;2332:23;2328:32;2325:52;;;2373:1;2370;2363:12;2325:52;2409:9;2396:23;2386:33;;2438:35;2469:2;2458:9;2454:18;2438:35;:::i;:::-;2428:45;;2231:248;;;;;:::o;2484:461::-;2537:3;2575:5;2569:12;2602:6;2597:3;2590:19;2628:4;2657:2;2652:3;2648:12;2641:19;;2694:2;2687:5;2683:14;2715:1;2725:195;2739:6;2736:1;2733:13;2725:195;;;2804:13;;-1:-1:-1;;;;;2800:39:1;2788:52;;2860:12;;;;2895:15;;;;2836:1;2754:9;2725:195;;;-1:-1:-1;2936:3:1;;2484:461;-1:-1:-1;;;;;2484:461:1:o;3809:510::-;4080:6;4069:9;4062:25;4123:3;4118:2;4107:9;4103:18;4096:31;4043:4;4144:57;4196:3;4185:9;4181:19;4173:6;4144:57;:::i;:::-;-1:-1:-1;;;;;4237:32:1;;;;4232:2;4217:18;;4210:60;-1:-1:-1;4301:2:1;4286:18;4279:34;4136:65;3809:510;-1:-1:-1;;3809:510:1:o;4324:597::-;4436:4;4465:2;4494;4483:9;4476:21;4526:6;4520:13;4569:6;4564:2;4553:9;4549:18;4542:34;4594:1;4604:140;4618:6;4615:1;4612:13;4604:140;;;4713:14;;;4709:23;;4703:30;4679:17;;;4698:2;4675:26;4668:66;4633:10;;4604:140;;;4762:6;4759:1;4756:13;4753:91;;;4832:1;4827:2;4818:6;4807:9;4803:22;4799:31;4792:42;4753:91;-1:-1:-1;4905:2:1;4884:15;-1:-1:-1;;4880:29:1;4865:45;;;;4912:2;4861:54;;4324:597;-1:-1:-1;;;4324:597:1:o;8434:356::-;8636:2;8618:21;;;8655:18;;;8648:30;8714:34;8709:2;8694:18;;8687:62;8781:2;8766:18;;8434:356::o;11375:332::-;11582:6;11571:9;11564:25;11625:2;11620;11609:9;11605:18;11598:30;11545:4;11645:56;11697:2;11686:9;11682:18;11674:6;11645:56;:::i;:::-;11637:64;11375:332;-1:-1:-1;;;;11375:332:1:o;11712:582::-;12011:6;12000:9;11993:25;12054:6;12049:2;12038:9;12034:18;12027:34;12097:3;12092:2;12081:9;12077:18;12070:31;11974:4;12118:57;12170:3;12159:9;12155:19;12147:6;12118:57;:::i;:::-;-1:-1:-1;;;;;12211:32:1;;;;12206:2;12191:18;;12184:60;-1:-1:-1;12275:3:1;12260:19;12253:35;12110:65;11712:582;-1:-1:-1;;;11712:582:1:o;12488:128::-;12528:3;12559:1;12555:6;12552:1;12549:13;12546:39;;;12565:18;;:::i;:::-;-1:-1:-1;12601:9:1;;12488:128::o;12621:217::-;12661:1;12687;12677:132;;12731:10;12726:3;12722:20;12719:1;12712:31;12766:4;12763:1;12756:15;12794:4;12791:1;12784:15;12677:132;-1:-1:-1;12823:9:1;;12621:217::o;12843:168::-;12883:7;12949:1;12945;12941:6;12937:14;12934:1;12931:21;12926:1;12919:9;12912:17;12908:45;12905:71;;;12956:18;;:::i;:::-;-1:-1:-1;12996:9:1;;12843:168::o;13016:125::-;13056:4;13084:1;13081;13078:8;13075:34;;;13089:18;;:::i;:::-;-1:-1:-1;13126:9:1;;13016:125::o;13146:380::-;13225:1;13221:12;;;;13268;;;13289:61;;13343:4;13335:6;13331:17;13321:27;;13289:61;13396:2;13388:6;13385:14;13365:18;13362:38;13359:161;;;13442:10;13437:3;13433:20;13430:1;13423:31;13477:4;13474:1;13467:15;13505:4;13502:1;13495:15;13359:161;;13146:380;;;:::o;13531:135::-;13570:3;-1:-1:-1;;13591:17:1;;13588:43;;;13611:18;;:::i;:::-;-1:-1:-1;13658:1:1;13647:13;;13531:135::o;13671:127::-;13732:10;13727:3;13723:20;13720:1;13713:31;13763:4;13760:1;13753:15;13787:4;13784:1;13777:15;13803:127;13864:10;13859:3;13855:20;13852:1;13845:31;13895:4;13892:1;13885:15;13919:4;13916:1;13909:15;13935:127;13996:10;13991:3;13987:20;13984:1;13977:31;14027:4;14024:1;14017:15;14051:4;14048:1;14041:15;14199:131;-1:-1:-1;;;;;14274:31:1;;14264:42;;14254:70;;14320:1;14317;14310:12

Swarm Source

ipfs://7d332894e24235aafe2e5c540cbcaefb92d894bf6e482aebd56ec0234329d132
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.