ETH Price: $2,656.57 (+1.40%)

Token

Sushiforth (SUSF)
 

Overview

Max Total Supply

1,782,581,717,825.679236756 SUSF

Holders

1,215

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
114,510,792.612694356 SUSF

Value
$0.00
0x2A6c2299496c90379B754db23537fc073F1BB70e
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:
SUSF

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

pragma solidity ^0.6.12;

library SafeCast {

    function toUint128(uint256 value) internal pure returns (uint128) {
        require(value < 2**128, "SafeCast: value doesn\'t fit in 128 bits");
        return uint128(value);
    }

    function toUint64(uint256 value) internal pure returns (uint64) {
        require(value < 2**64, "SafeCast: value doesn\'t fit in 64 bits");
        return uint64(value);
    }

    function toUint32(uint256 value) internal pure returns (uint32) {
        require(value < 2**32, "SafeCast: value doesn\'t fit in 32 bits");
        return uint32(value);
    }

    function toUint16(uint256 value) internal pure returns (uint16) {
        require(value < 2**16, "SafeCast: value doesn\'t fit in 16 bits");
        return uint16(value);
    }

    function toUint8(uint256 value) internal pure returns (uint8) {
        require(value < 2**8, "SafeCast: value doesn\'t fit in 8 bits");
        return uint8(value);
    }
    
    function toUint256(int256 value) internal pure returns (uint256) {
        require(value >= 0, "SafeCast: value must be positive");
        return uint256(value);
    }

    function toInt256(uint256 value) internal pure returns (int256) {
        require(value < 2**255, "SafeCast: value doesn't fit in an int256");
        return int256(value);
    }
}

contract Initializable {

  bool private initialized;

  bool private initializing;

  modifier initializer() {
    require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized");

    bool isTopLevelCall = !initializing;
    if (isTopLevelCall) {
      initializing = true;
      initialized = true;
    }

    _;

    if (isTopLevelCall) {
      initializing = false;
    }
  }

  function isConstructor() private view returns (bool) {
    address self = address(this);
    uint256 cs;
    assembly { cs := extcodesize(self) }
    return cs == 0;
  }

  uint256[50] private ______gap;
}

contract ContextUpgradeSafe is Initializable {

    function __Context_init() internal initializer {
        __Context_init_unchained();
    }

    function __Context_init_unchained() internal initializer {
    }

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

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

    uint256[50] private __gap;
}

contract OwnableUpgradeSafe is Initializable, ContextUpgradeSafe {
    address private _owner;

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

    function __Ownable_init() internal initializer {
        __Context_init_unchained();
        __Ownable_init_unchained();
    }

    function __Ownable_init_unchained() internal initializer {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);

    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == _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;
    }

    uint256[49] private __gap;
}

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;
        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) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        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");
    }
}

contract ERC20UpgradeSafe is Initializable, ContextUpgradeSafe, IERC20 {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

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

    function __ERC20_init(string memory name, string memory symbol) internal initializer {
        __Context_init_unchained();
        __ERC20_init_unchained(name, symbol);
    }

    function __ERC20_init_unchained(string memory name, string memory symbol) internal initializer {


        _name = name;
        _symbol = symbol;
        _decimals = 18;

    }

    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 virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

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

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

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

    function transferFrom(address sender, address recipient, uint256 amount) public virtual 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 _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    function _approve(address owner, address spender, uint256 amount) internal virtual {
        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 _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }

    uint256[44] private __gap;
}

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 migrator() 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;
    function setMigrator(address) external;
}

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

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


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 Mint(address indexed sender, uint amount0, uint amount1);
    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 mint(address to) external returns (uint liquidity);
    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;
}

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}

contract SUSF is ERC20UpgradeSafe, OwnableUpgradeSafe {
    
    using SafeCast for int256;
    using SafeMath for uint256;
    using Address for address;
    
    struct Transaction {
        bool enabled;
        address destination;
        bytes data;
    }

    event TransactionFailed(address indexed destination, uint index, bytes data);
	
	// Stable ordering is not guaranteed.

    Transaction[] public transactions;

    uint256 private _epoch;
    event LogRebase(uint256 indexed epoch, uint256 totalSupply);

    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;

    mapping (address => bool) private _isExcluded;
    address[] private _excluded;
	
	uint256 private _totalSupply;
   
    uint256 private constant MAX = ~uint256(0);
    uint256 private _rTotal;
    uint256 private _tFeeTotal;
    
    uint256 private constant DECIMALS = 9;
    uint256 private constant RATE_PRECISION = 10 ** DECIMALS;
    
    uint256 public _tFeePercent;
    
    address public _rebaser;
    
    uint256 public _limitTransferAmount;
    uint256 public _limitMaxBalance;
    uint256 public _limitSellFeePercent;
    
    uint256 public _limitTimestamp;

    uint256 public _presaleTimestamp;
    uint256 public _presaleEth;
    bool public endSale;
    uint256 public _presaleRate;
    mapping(address => uint256) public saleAmt;
    mapping(uint256 => bool) public locked;
    
    IUniswapV2Router02 public uniswapRouterV2;
    IUniswapV2Factory public uniswapFactory;
    
    function initialize()
        public
        initializer
    {
        __ERC20_init("Sushiforth", "SUSF");
        _setupDecimals(uint8(DECIMALS));
        __Ownable_init();
        
        _totalSupply = 12000000 * 10**9 ;
        _rTotal = (MAX - (MAX % _totalSupply));
        
        _rebaser = _msgSender();
        
        _tFeePercent = 237; //2.6682%

        _rOwned[address(this)] = _rTotal;
        emit Transfer(address(0), address(this), _totalSupply);

        _presaleTimestamp = 1609696800;
        endSale = false;
        _presaleEth = 600 ether;
        _presaleRate = 6666;
        
        excludeAccount(_msgSender());
        excludeAccount(address(this));
        
        uniswapRouterV2 = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        uniswapFactory = IUniswapV2Factory(0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f);
    }

    receive() external payable {
        require(!endSale, "PreSale Ended");
        require(now > 1609524000, "presale yet to start");
        require(_presaleEth >= msg.value, "Sold out");
        saleAmt[msg.sender] += msg.value;
        require(saleAmt[msg.sender] <=  7500000000000000000, "max presale limit reached");
        address payable wallet = address(uint160(owner()));
        wallet.transfer(msg.value.div(3));
        _presaleEth = _presaleEth.sub(msg.value);
        uint256 amountBought = msg.value.div(10**9).mul(_presaleRate);
        _transfer(address(this), msg.sender, amountBought );
    }

    function listToken() external onlyOwner() {
        require(!endSale, 'already listed');
        require(_presaleEth == 0 || _presaleTimestamp < now, "Sale has not ended yet");
        endSale = true;
        _transfer(address(this), _msgSender(), 8000000 * 10**9);
        address tokenUniswapPair = uniswapFactory.createPair(
            address(uniswapRouterV2.WETH()),
            address(address(this))
        );
        IUniswapV2Pair pair = IUniswapV2Pair(tokenUniswapPair);
        address WETH = uniswapRouterV2.WETH();
        uint256 ethToSend = address(this).balance;
        IWETH(WETH).deposit{value : ethToSend}();
        require(address(this).balance == 0 , "Transfer Failed");
        uint256 tokenToAdd = 2666666 * 10**9;
        if(_presaleEth != 0) {
            tokenToAdd = ethToSend.div(10**9).mul(_presaleRate);
            uint256 unsoldTokens = balanceOf(address(this)) - tokenToAdd; 
            _transfer(address(this), address(0), unsoldTokens);
        }
        IWETH(WETH).transfer(address(pair),ethToSend);
        _transfer(address(this), address(pair), tokenToAdd);
        pair.mint(address(this));
        IERC20(address(pair)).transfer(msg.sender, IERC20(address(pair)).balanceOf(address(this)));
    }
    
    function setRebaser(address rebaser) external onlyOwner() {
        _rebaser = rebaser;
    }
     
    function setLock(uint256 _index) external onlyOwner() {
        locked[_index] = true;
    }
    
    function setTransferFeePercent(uint256 tFeePercent) external onlyOwner() {

        _tFeePercent = tFeePercent;
    }
    
    function setLimit(uint256 transferAmount, uint256 maxBalance, uint256 sellFeePercent) external onlyOwner() {
        require(_limitTimestamp == 0, "Limit changes not allowed");
        
        _limitTransferAmount = transferAmount;
        _limitMaxBalance = maxBalance;
        _limitSellFeePercent = sellFeePercent;

        _limitTimestamp = now;
    }
    
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }
    
    function rebase(int256 supplyDelta)
        external
        returns (uint256)
    {
        require(_msgSender() == owner() || _msgSender() == _rebaser, "Sender not authorized");
        
        _epoch = _epoch.add(1);
		
        if (supplyDelta == 0) {
            emit LogRebase(_epoch, _totalSupply);
            return _totalSupply;
        }
        
        uint256 uSupplyDelta = (supplyDelta < 0 ? -supplyDelta : supplyDelta).toUint256();
        uint256 rate = uSupplyDelta.mul(RATE_PRECISION).div(_totalSupply);
        uint256 multiplier;
        
        if (supplyDelta < 0) {
            multiplier = RATE_PRECISION.sub(rate);
        } else {
            multiplier = RATE_PRECISION.add(rate);
        }
        
        if (supplyDelta < 0) {
            _totalSupply = _totalSupply.sub(uSupplyDelta);
        } else {
            _totalSupply = _totalSupply.add(uSupplyDelta);
        }
        
        if (_totalSupply > MAX) {
            _totalSupply = MAX;
        }
        
        for (uint256 i = 0; i < _excluded.length; i++) {
            if(_tOwned[_excluded[i]] > 0) {
                _tOwned[_excluded[i]] = _tOwned[_excluded[i]].mul(multiplier).div(RATE_PRECISION);
            }
        }
        
        emit LogRebase(_epoch, _totalSupply);

		for (uint i = 0; i < transactions.length; i++) {
            Transaction storage t = transactions[i];
            if (t.enabled) {
                bool result = externalCall(t.destination, t.data);
                if (!result) {
                    emit TransactionFailed(t.destination, i, t.data);
                    revert("Transaction Failed");
                }
            }
        }

        return _totalSupply;
    }
    
    /**
     * @notice Adds a transaction that gets called for a downstream receiver of rebases
     * @param destination Address of contract destination
     * @param data Transaction data payload
     */
	
    function addTransaction(address destination, bytes memory data)
        external
        onlyOwner
    {
        transactions.push(Transaction({
            enabled: true,
            destination: destination,
            data: data
        }));
    }
	
	/**
     * @param index Index of transaction to remove.
     *              Transaction ordering may have changed since adding.
     */

    function removeTransaction(uint index)
        external
        onlyOwner
    {
        require(index < transactions.length, "index out of bounds");
        require(!locked[index], "index is locked");

        if (index < transactions.length - 1) {
            transactions[index] = transactions[transactions.length - 1];
        }

        transactions.pop();
    }
	
	/**
     * @param index Index of transaction. Transaction ordering may have changed since adding.
     * @param enabled True for enabled, false for disabled.
     */

    function setTransactionEnabled(uint index, bool enabled)
        external
        onlyOwner
    {
        require(index < transactions.length, "index must be in range of stored tx list");
        transactions[index].enabled = enabled;
    }
	
	/**
     * @return Number of transactions, both enabled and disabled, in transactions list.
     */

    function transactionsSize()
        external
        view
        returns (uint256)
    {
        return transactions.length;
    }
	
	/**
     * @dev wrapper to call the encoded transactions on downstream consumers.
     * @param destination Address of destination contract.
     * @param data The encoded data payload.
     * @return True on success
     */

    function externalCall(address destination, bytes memory data)
        internal
        returns (bool)
    {
        bool result;
        assembly {  // solhint-disable-line no-inline-assembly
            // "Allocate" memory for output
            // (0x40 is where "free memory" pointer is stored by convention)
            let outputAddress := mload(0x40)

            // First 32 bytes are the padded length of data, so exclude that
            let dataAddress := add(data, 32)

            result := call(
                // 34710 is the value that solidity is currently emitting
                // It includes callGas (700) + callVeryLow (3, to pay for SUB)
                // + callValueTransferGas (9000) + callNewAccountGas
                // (25000, in case the destination address does not exist and needs creating)
                sub(gas(), 34710),


                destination,
                0, // transfer value in wei
                dataAddress,
                mload(data),  // Size of the input, in bytes. Stored in position 0 of the array.
                outputAddress,
                0  // Output is ignored, therefore the output size is zero
            )
        }
        return result;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromRefraction(_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 override returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

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

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

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

    function refract(uint256 tAmount) public {
        address sender = _msgSender();
        require(!_isExcluded[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount,,,,) = _getValues(tAmount, _tFeePercent);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }

    function refractionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
        require(tAmount <= _totalSupply, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,) = _getValues(tAmount, _tFeePercent);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,) = _getValues(tAmount, _tFeePercent);
            return rTransferAmount;
        }
    }

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

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

    function includeAccount(address account) public 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) internal override {
        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 sender, address recipient, uint256 amount) internal override {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(endSale || sender == owner() || sender == address(this), "transfer paused for sale");
        if(sender == address(this) || sender == owner()) {
            _transferBothExcluded(sender, recipient, amount, 0);
        } else if(_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount, _tFeePercent);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
                _transferToExcluded(sender, recipient, amount, _tFeePercent);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, amount, _tFeePercent);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount, 0);
        } else {
            _transferStandard(sender, recipient, amount, _tFeePercent);
        }
    }
    

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

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

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

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

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

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

    function _getTValues(uint256 tAmount, uint256 tFeePercent) private pure returns (uint256, uint256) {
        uint256 tFee = tAmount.mul(tFeePercent).div(10000);
        uint256 tTransferAmount = tAmount.sub(tFee);
        return (tTransferAmount, tFee);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee);
        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 = _totalSupply;      
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _totalSupply);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_totalSupply)) return (_rTotal, _totalSupply);
        return (rSupply, tSupply);
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalSupply","type":"uint256"}],"name":"LogRebase","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":true,"internalType":"address","name":"destination","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"TransactionFailed","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":"_limitMaxBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limitSellFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limitTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limitTransferAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_presaleEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_presaleRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_presaleTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_rebaser","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"destination","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"addTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":[],"name":"endSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"listToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"int256","name":"supplyDelta","type":"int256"}],"name":"rebase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"refract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"refractionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"removeTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"saleAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"transferAmount","type":"uint256"},{"internalType":"uint256","name":"maxBalance","type":"uint256"},{"internalType":"uint256","name":"sellFeePercent","type":"uint256"}],"name":"setLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"setLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rebaser","type":"address"}],"name":"setRebaser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setTransactionEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tFeePercent","type":"uint256"}],"name":"setTransferFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromRefraction","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":"uint256","name":"","type":"uint256"}],"name":"transactions","outputs":[{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"address","name":"destination","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transactionsSize","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":"uniswapFactory","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouterV2","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b50613d01806100206000396000f3fe60806040526004361061028c5760003560e01c8063596fa9e31161015a57806397d0677b116100c1578063d3e157471161007a578063d3e1574714610bdf578063dd62ed3e14610c09578063e46adf6214610c44578063f2cc0c1814610c77578063f2fde38b14610caa578063f84354f114610cdd57610469565b806397d0677b14610a235780639ace38c214610a55578063a457c2d714610b10578063a9059cbb14610b49578063b45a3c0e14610b82578063cba0e99614610bac57610469565b80637d449789116101135780637d449789146109a55780638129fc1c146109ba5780638bdb2afa146109cf5780638da5cb5b146109e457806391d4ec18146109f957806395d89b4114610a0e57610469565b8063596fa9e3146108cb5780635c31a713146108e057806365cccc80146109165780636e9dde991461092b57806370a082311461095d578063715018a61461099057610469565b80631f36d925116101fe578063313ce567116101b7578063313ce567146107e2578063380d831b1461080d57806339509351146108225780633aa8d4be1461085b578063456e0a5d1461088c57806346c3bd1f146108a157610469565b80631f36d9251461070c57806323b872dd146107365780632ae427dc146107795780632bc1281e1461078e5780632d7da5a4146107a3578063303bb0b6146107b857610469565b8063126e19be11610250578063126e19be146105ad57806313114a9d1461067057806314cf1bd81461068557806314f43f7e146106b857806316007d29146106e257806318160ddd146106f757610469565b8063030ba6bf1461046e57806306fdde031461048557806308d1dd8a1461050f578063095ea7b3146105365780630ab114f91461058357610469565b366104695760db5460ff16156102d9576040805162461bcd60e51b815260206004820152600d60248201526c141c9954d85b1948115b991959609a1b604482015290519081900360640190fd5b635fef63204211610328576040805162461bcd60e51b81526020600482015260146024820152731c1c995cd85b19481e595d081d1bc81cdd185c9d60621b604482015290519081900360640190fd5b3460da54101561036a576040805162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b604482015290519081900360640190fd5b33600090815260dd6020526040902080543401908190556768155a43676e000010156103dd576040805162461bcd60e51b815260206004820152601960248201527f6d61782070726573616c65206c696d6974207265616368656400000000000000604482015290519081900360640190fd5b60006103e7610d10565b90506001600160a01b0381166108fc610401346003610d1f565b6040518115909202916000818181858888f19350505050158015610429573d6000803e3d6000fd5b5060da546104379034610d6a565b60da5560dc546000906104589061045234633b9aca00610d1f565b90610dac565b9050610465303383610e05565b5050005b600080fd5b34801561047a57600080fd5b506104836110be565b005b34801561049157600080fd5b5061049a61163e565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104d45781810151838201526020016104bc565b50505050905090810190601f1680156105015780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561051b57600080fd5b506105246116d4565b60408051918252519081900360200190f35b34801561054257600080fd5b5061056f6004803603604081101561055957600080fd5b506001600160a01b0381351690602001356116da565b604080519115158252519081900360200190f35b34801561058f57600080fd5b50610524600480360360208110156105a657600080fd5b50356116f7565b3480156105b957600080fd5b50610483600480360360408110156105d057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156105fb57600080fd5b82018360208201111561060d57600080fd5b8035906020019184600183028401116401000000008311171561062f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611b98945050505050565b34801561067c57600080fd5b50610524611cb9565b34801561069157600080fd5b50610524600480360360208110156106a857600080fd5b50356001600160a01b0316611cbf565b3480156106c457600080fd5b50610483600480360360208110156106db57600080fd5b5035611cd1565b3480156106ee57600080fd5b50610524611dac565b34801561070357600080fd5b50610524611db2565b34801561071857600080fd5b506104836004803603602081101561072f57600080fd5b5035611db8565b34801561074257600080fd5b5061056f6004803603606081101561075957600080fd5b506001600160a01b03813581169160208101359091169060400135611e15565b34801561078557600080fd5b50610524611e9c565b34801561079a57600080fd5b50610524611ea2565b3480156107af57600080fd5b50610524611ea8565b3480156107c457600080fd5b50610524600480360360208110156107db57600080fd5b5035611eae565b3480156107ee57600080fd5b506107f7611f0e565b6040805160ff9092168252519081900360200190f35b34801561081957600080fd5b5061056f611f17565b34801561082e57600080fd5b5061056f6004803603604081101561084557600080fd5b506001600160a01b038135169060200135611f20565b34801561086757600080fd5b50610870611f6e565b604080516001600160a01b039092168252519081900360200190f35b34801561089857600080fd5b50610524611f7d565b3480156108ad57600080fd5b50610483600480360360208110156108c457600080fd5b5035611f83565b3480156108d757600080fd5b50610870612171565b3480156108ec57600080fd5b506104836004803603606081101561090357600080fd5b5080359060208101359060400135612180565b34801561092257600080fd5b5061052461223f565b34801561093757600080fd5b506104836004803603604081101561094e57600080fd5b50803590602001351515612245565b34801561096957600080fd5b506105246004803603602081101561098057600080fd5b50356001600160a01b031661230e565b34801561099c57600080fd5b50610483612370565b3480156109b157600080fd5b50610524612412565b3480156109c657600080fd5b50610483612418565b3480156109db57600080fd5b5061087061262f565b3480156109f057600080fd5b50610870610d10565b348015610a0557600080fd5b5061052461263e565b348015610a1a57600080fd5b5061049a612644565b348015610a2f57600080fd5b5061052460048036036040811015610a4657600080fd5b508035906020013515156126a5565b348015610a6157600080fd5b50610a7f60048036036020811015610a7857600080fd5b503561273b565b604051808415158152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610ad3578181015183820152602001610abb565b50505050905090810190601f168015610b005780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b348015610b1c57600080fd5b5061056f60048036036040811015610b3357600080fd5b506001600160a01b038135169060200135612800565b348015610b5557600080fd5b5061056f60048036036040811015610b6c57600080fd5b506001600160a01b038135169060200135612868565b348015610b8e57600080fd5b5061056f60048036036020811015610ba557600080fd5b503561287c565b348015610bb857600080fd5b5061056f60048036036020811015610bcf57600080fd5b50356001600160a01b0316612891565b348015610beb57600080fd5b5061048360048036036020811015610c0257600080fd5b50356128af565b348015610c1557600080fd5b5061052460048036036040811015610c2c57600080fd5b506001600160a01b0381358116916020013516612922565b348015610c5057600080fd5b5061048360048036036020811015610c6757600080fd5b50356001600160a01b031661294d565b348015610c8357600080fd5b5061048360048036036020811015610c9a57600080fd5b50356001600160a01b03166129c7565b348015610cb657600080fd5b5061048360048036036020811015610ccd57600080fd5b50356001600160a01b0316612b4d565b348015610ce957600080fd5b5061048360048036036020811015610d0057600080fd5b50356001600160a01b0316612c46565b6097546001600160a01b031690565b6000610d6183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612e07565b90505b92915050565b6000610d6183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ea9565b600082610dbb57506000610d64565b82820282848281610dc857fe5b0414610d615760405162461bcd60e51b8152600401808060200182810382526021815260200180613b486021913960400191505060405180910390fd5b6001600160a01b038316610e4a5760405162461bcd60e51b8152600401808060200182810382526025815260200180613c326025913960400191505060405180910390fd5b60008111610e895760405162461bcd60e51b8152600401808060200182810382526029815260200180613bb16029913960400191505060405180910390fd5b60db5460ff1680610eb25750610e9d610d10565b6001600160a01b0316836001600160a01b0316145b80610ec557506001600160a01b03831630145b610f16576040805162461bcd60e51b815260206004820152601860248201527f7472616e736665722070617573656420666f722073616c650000000000000000604482015290519081900360640190fd5b6001600160a01b038316301480610f455750610f30610d10565b6001600160a01b0316836001600160a01b0316145b15610f5c57610f578383836000612f03565b6110b9565b6001600160a01b038316600090815260ce602052604090205460ff168015610f9d57506001600160a01b038216600090815260ce602052604090205460ff16155b15610fb057610f5783838360d354613052565b6001600160a01b038316600090815260ce602052604090205460ff16158015610ff157506001600160a01b038216600090815260ce602052604090205460ff165b1561100457610f5783838360d3546130f2565b6001600160a01b038316600090815260ce602052604090205460ff1615801561104657506001600160a01b038216600090815260ce602052604090205460ff16155b1561105957610f5783838360d354613134565b6001600160a01b038316600090815260ce602052604090205460ff16801561109957506001600160a01b038216600090815260ce602052604090205460ff165b156110ab57610f578383836000612f03565b6110b983838360d354613134565b505050565b6110c6613176565b6097546001600160a01b03908116911614611116576040805162461bcd60e51b81526020600482018190526024820152600080516020613b91833981519152604482015290519081900360640190fd5b60db5460ff161561115f576040805162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481b1a5cdd195960921b604482015290519081900360640190fd5b60da54158061116f57504260d954105b6111b9576040805162461bcd60e51b815260206004820152601660248201527514d85b19481a185cc81b9bdd08195b991959081e595d60521b604482015290519081900360640190fd5b60db805460ff191660011790556111df306111d2613176565b661c6bf526340000610e05565b60e05460df54604080516315ab88c960e31b815290516000936001600160a01b039081169363c9c653969391169163ad5c464891600480820192602092909190829003018186803b15801561123357600080fd5b505afa158015611247573d6000803e3d6000fd5b505050506040513d602081101561125d57600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b0390921660048301523060248301525160448083019260209291908290030181600087803b1580156112ac57600080fd5b505af11580156112c0573d6000803e3d6000fd5b505050506040513d60208110156112d657600080fd5b505160df54604080516315ab88c960e31b8152905192935083926000926001600160a01b03169163ad5c4648916004808301926020929190829003018186803b15801561132257600080fd5b505afa158015611336573d6000803e3d6000fd5b505050506040513d602081101561134c57600080fd5b505160408051630d0e30db60e41b8152905191925047916001600160a01b0384169163d0e30db091849160048082019260009290919082900301818588803b15801561139757600080fd5b505af11580156113ab573d6000803e3d6000fd5b5050505050476000146113f7576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b604482015290519081900360640190fd5b60da54660979518faa2400901561143c5760dc5461141d9061045284633b9aca00610d1f565b905060008161142b3061230e565b03905061143a30600083610e05565b505b826001600160a01b031663a9059cbb85846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561149357600080fd5b505af11580156114a7573d6000803e3d6000fd5b505050506040513d60208110156114bd57600080fd5b506114cb9050308583610e05565b604080516335313c2160e11b815230600482015290516001600160a01b03861691636a6278429160248083019260209291908290030181600087803b15801561151357600080fd5b505af1158015611527573d6000803e3d6000fd5b505050506040513d602081101561153d57600080fd5b5050604080516370a0823160e01b815230600482015290516001600160a01b0386169163a9059cbb91339184916370a0823191602480820192602092909190829003018186803b15801561159057600080fd5b505afa1580156115a4573d6000803e3d6000fd5b505050506040513d60208110156115ba57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b15801561160b57600080fd5b505af115801561161f573d6000803e3d6000fd5b505050506040513d602081101561163557600080fd5b50505050505050565b60688054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156116ca5780601f1061169f576101008083540402835291602001916116ca565b820191906000526020600020905b8154815290600101906020018083116116ad57829003601f168201915b5050505050905090565b60d85481565b60006116ee6116e7613176565b848461317a565b50600192915050565b6000611701610d10565b6001600160a01b0316611712613176565b6001600160a01b03161480611741575060d4546001600160a01b0316611736613176565b6001600160a01b0316145b61178a576040805162461bcd60e51b815260206004820152601560248201527414d95b99195c881b9bdd08185d5d1a1bdc9a5e9959605a1b604482015290519081900360640190fd5b60ca54611798906001613266565b60ca55816117e15760ca5460d05460408051918252517f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f29181900360200190a25060d054611b93565b60006117fe600084126117f457836117f9565b836000035b6132c0565b60d05490915060009061181f9061181984633b9aca00610dac565b90610d1f565b905060008085121561184057611839633b9aca0083610d6a565b9050611851565b61184e633b9aca0083613266565b90505b600085121561186f5760d0546118679084610d6a565b60d055611880565b60d05461187c9084613266565b60d0555b60005b60cf5481101561195257600060cc600060cf84815481106118a057fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054111561194a576119136009600a0a6118198460cc600060cf87815481106118e857fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205490610dac565b60cc600060cf848154811061192457fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020555b600101611883565b5060ca5460d05460408051918252517f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f29181900360200190a260005b60c954811015611b8957600060c982815481106119a757fe5b60009182526020909120600290910201805490915060ff1615611b805780546001808301805460408051602060026101009685161587026000190190941693909304601f8101849004840282018401909252818152600095611a6f9590046001600160a01b0316939092909190830182828015611a655780601f10611a3a57610100808354040283529160200191611a65565b820191906000526020600020905b815481529060010190602001808311611a4857829003601f168201915b505050505061331b565b905080611b7e5781546040805185815260208101828152600180870180546002610100938216158402600019019091160494840185905294046001600160a01b0316937f8091ecaaa54ebb82e02d36c2c336528e0fcb9b3430fc1291ac88295032b9c263938893919290606083019084908015611b2d5780601f10611b0257610100808354040283529160200191611b2d565b820191906000526020600020905b815481529060010190602001808311611b1057829003601f168201915b5050935050505060405180910390a26040805162461bcd60e51b8152602060048201526012602482015271151c985b9cd858dd1a5bdb8811985a5b195960721b604482015290519081900360640190fd5b505b5060010161198e565b5060d05493505050505b919050565b611ba0613176565b6097546001600160a01b03908116911614611bf0576040805162461bcd60e51b81526020600482018190526024820152600080516020613b91833981519152604482015290519081900360640190fd5b6040805160608101825260018082526001600160a01b03808616602080850191825294840186815260c980549485018155600052845160029094027f66be4f155c5ef2ebd3772b228f2f00681e4ed5826cdb3b1943cc11ad15ad1d2881018054935190941661010002610100600160a81b031995151560ff19909416939093179490941691909117825551805193949193611cb2937f66be4f155c5ef2ebd3772b228f2f00681e4ed5826cdb3b1943cc11ad15ad1d2901929190910190613993565b5050505050565b60d25490565b60dd6020526000908152604090205481565b6000611cdb613176565b6001600160a01b038116600090815260ce602052604090205490915060ff1615611d365760405162461bcd60e51b815260040180806020018281038252602c815260200180613c7b602c913960400191505060405180910390fd5b6000611d448360d35461333e565b505050506001600160a01b038316600090815260cb6020526040902054909150611d6e9082610d6a565b6001600160a01b038316600090815260cb602052604090205560d154611d949082610d6a565b60d15560d254611da49084613266565b60d255505050565b60dc5481565b60d05490565b611dc0613176565b6097546001600160a01b03908116911614611e10576040805162461bcd60e51b81526020600482018190526024820152600080516020613b91833981519152604482015290519081900360640190fd5b60d355565b6000611e22848484610e05565b611e9284611e2e613176565b611e8d85604051806060016040528060288152602001613b69602891396001600160a01b038a16600090815260cd6020526040812090611e6c613176565b6001600160a01b031681526020810191909152604001600020549190612ea9565b61317a565b5060019392505050565b60d35481565b60d55481565b60d95481565b600060d154821115611ef15760405162461bcd60e51b815260040180806020018281038252602a815260200180613c08602a913960400191505060405180910390fd5b6000611efb61338c565b9050611f078382610d1f565b9392505050565b606a5460ff1690565b60db5460ff1681565b60006116ee611f2d613176565b84611e8d8560cd6000611f3e613176565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490613266565b60d4546001600160a01b031681565b60d65481565b611f8b613176565b6097546001600160a01b03908116911614611fdb576040805162461bcd60e51b81526020600482018190526024820152600080516020613b91833981519152604482015290519081900360640190fd5b60c9548110612027576040805162461bcd60e51b8152602060048201526013602482015272696e646578206f7574206f6620626f756e647360681b604482015290519081900360640190fd5b600081815260de602052604090205460ff161561207d576040805162461bcd60e51b815260206004820152600f60248201526e1a5b99195e081a5cc81b1bd8dad959608a1b604482015290519081900360640190fd5b60c9546000190181101561212e5760c98054600019810190811061209d57fe5b906000526020600020906002020160c982815481106120b857fe5b6000918252602090912082546002928302909101805460ff191660ff9092161515919091178082558354610100600160a81b0319909116610100918290046001600160a01b0316820217825560018085018054939461212a948387019492938116159092026000190190911604613a0d565b5050505b60c980548061213957fe5b60008281526020812060026000199093019283020180546001600160a81b03191681559061216a6001830182613a82565b5050905550565b60df546001600160a01b031681565b612188613176565b6097546001600160a01b039081169116146121d8576040805162461bcd60e51b81526020600482018190526024820152600080516020613b91833981519152604482015290519081900360640190fd5b60d8541561222d576040805162461bcd60e51b815260206004820152601960248201527f4c696d6974206368616e676573206e6f7420616c6c6f77656400000000000000604482015290519081900360640190fd5b60d59290925560d65560d7554260d855565b60da5481565b61224d613176565b6097546001600160a01b0390811691161461229d576040805162461bcd60e51b81526020600482018190526024820152600080516020613b91833981519152604482015290519081900360640190fd5b60c95482106122dd5760405162461bcd60e51b8152600401808060200182810382526028815260200180613b206028913960400191505060405180910390fd5b8060c983815481106122eb57fe5b60009182526020909120600290910201805460ff19169115159190911790555050565b6001600160a01b038116600090815260ce602052604081205460ff161561234e57506001600160a01b038116600090815260cc6020526040902054611b93565b6001600160a01b038216600090815260cb6020526040902054610d6490611eae565b612378613176565b6097546001600160a01b039081169116146123c8576040805162461bcd60e51b81526020600482018190526024820152600080516020613b91833981519152604482015290519081900360640190fd5b6097546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3609780546001600160a01b0319169055565b60d75481565b600054610100900460ff168061243157506124316133af565b8061243f575060005460ff16155b61247a5760405162461bcd60e51b815260040180806020018281038252602e815260200180613bda602e913960400191505060405180910390fd5b600054610100900460ff161580156124a5576000805460ff1961ff0019909116610100171660011790555b6124ed6040518060400160405280600a8152602001690a6eae6d0d2ccdee4e8d60b31b8152506040518060400160405280600481526020016329aaa9a360e11b8152506133b5565b6124f7600961346a565b6124ff613480565b662aa1efb94e000060d055661c7327917bffff1960d15561251e613176565b60d480546001600160a01b0319166001600160a01b039290921691909117905560ed60d35560d15430600081815260cb602090815260408083209490945560d05484519081529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a3635ff2062060d95560db805460ff19169055682086ac35105260000060da55611a0a60dc556125c96125c4613176565b6129c7565b6125d2306129c7565b60df80546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d1790915560e08054909116735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f179055801561262c576000805461ff00191690555b50565b60e0546001600160a01b031681565b60c95490565b60698054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156116ca5780601f1061169f576101008083540402835291602001916116ca565b600060d0548311156126fe576040805162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c7900604482015290519081900360640190fd5b8161271f5760006127118460d35461333e565b50929450610d649350505050565b600061272d8460d35461333e565b50919450610d649350505050565b60c9818154811061274857fe5b6000918252602091829020600291820201805460018083018054604080516101009483161585026000190190921696909604601f810188900488028201880190965285815260ff84169750919092046001600160a01b031694929390928301828280156127f65780601f106127cb576101008083540402835291602001916127f6565b820191906000526020600020905b8154815290600101906020018083116127d957829003601f168201915b5050505050905083565b60006116ee61280d613176565b84611e8d85604051806060016040528060258152602001613ca76025913960cd6000612837613176565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190612ea9565b60006116ee612875613176565b8484610e05565b60de6020526000908152604090205460ff1681565b6001600160a01b0316600090815260ce602052604090205460ff1690565b6128b7613176565b6097546001600160a01b03908116911614612907576040805162461bcd60e51b81526020600482018190526024820152600080516020613b91833981519152604482015290519081900360640190fd5b600090815260de60205260409020805460ff19166001179055565b6001600160a01b03918216600090815260cd6020908152604080832093909416825291909152205490565b612955613176565b6097546001600160a01b039081169116146129a5576040805162461bcd60e51b81526020600482018190526024820152600080516020613b91833981519152604482015290519081900360640190fd5b60d480546001600160a01b0319166001600160a01b0392909216919091179055565b6129cf613176565b6097546001600160a01b03908116911614612a1f576040805162461bcd60e51b81526020600482018190526024820152600080516020613b91833981519152604482015290519081900360640190fd5b6001600160a01b038116600090815260ce602052604090205460ff1615612a8d576040805162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604482015290519081900360640190fd5b6001600160a01b038116600090815260cb602052604090205415612ae7576001600160a01b038116600090815260cb6020526040902054612acd90611eae565b6001600160a01b038216600090815260cc60205260409020555b6001600160a01b0316600081815260ce60205260408120805460ff1916600190811790915560cf805491820181559091527facb8d954e2cfef495862221e91bd7523613cf8808827cb33edfe4904cc51bf290180546001600160a01b0319169091179055565b612b55613176565b6097546001600160a01b03908116911614612ba5576040805162461bcd60e51b81526020600482018190526024820152600080516020613b91833981519152604482015290519081900360640190fd5b6001600160a01b038116612bea5760405162461bcd60e51b8152600401808060200182810382526026815260200180613ad86026913960400191505060405180910390fd5b6097546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3609780546001600160a01b0319166001600160a01b0392909216919091179055565b612c4e613176565b6097546001600160a01b03908116911614612c9e576040805162461bcd60e51b81526020600482018190526024820152600080516020613b91833981519152604482015290519081900360640190fd5b6001600160a01b038116600090815260ce602052604090205460ff16612d0b576040805162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604482015290519081900360640190fd5b60005b60cf54811015612e0357816001600160a01b031660cf8281548110612d2f57fe5b6000918252602090912001546001600160a01b03161415612dfb5760cf80546000198101908110612d5c57fe5b60009182526020909120015460cf80546001600160a01b039092169183908110612d8257fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918416815260cc8252604080822082905560ce90925220805460ff1916905560cf805480612dd457fe5b600082815260209020810160001990810180546001600160a01b0319169055019055612e03565b600101612d0e565b5050565b60008183612e935760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e58578181015183820152602001612e40565b50505050905090810190601f168015612e855780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612e9f57fe5b0495945050505050565b60008184841115612efb5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612e58578181015183820152602001612e40565b505050900390565b6000806000806000612f15878761333e565b6001600160a01b038e16600090815260cc602052604090205494995092975090955093509150612f459088610d6a565b6001600160a01b038a16600090815260cc602090815260408083209390935560cb90522054612f749086610d6a565b6001600160a01b03808b16600090815260cb6020908152604080832094909455918b16815260cc9091522054612faa9083613266565b6001600160a01b038916600090815260cc602090815260408083209390935560cb90522054612fd99085613266565b6001600160a01b038916600090815260cb6020526040902055612ffc8382613531565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3505050505050505050565b6000806000806000613064878761333e565b6001600160a01b038e16600090815260cc6020526040902054949950929750909550935091506130949088610d6a565b6001600160a01b038a16600090815260cc602090815260408083209390935560cb905220546130c39086610d6a565b6001600160a01b03808b16600090815260cb602052604080822093909355908a1681522054612fd99085613266565b6000806000806000613104878761333e565b6001600160a01b038e16600090815260cb602052604090205494995092975090955093509150612f749086610d6a565b6000806000806000613146878761333e565b6001600160a01b038e16600090815260cb6020526040902054949950929750909550935091506130c39086610d6a565b3390565b6001600160a01b0383166131bf5760405162461bcd60e51b8152600401808060200182810382526024815260200180613c576024913960400191505060405180910390fd5b6001600160a01b0382166132045760405162461bcd60e51b8152600401808060200182810382526022815260200180613afe6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260cd6020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600082820183811015610d61576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080821215613317576040805162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f736974697665604482015290519081900360640190fd5b5090565b6000806040516020840160008286518360008a6187965a03f19695505050505050565b60008060008060008060006133538989613555565b91509150600061336161338c565b905060008060006133738d8686613583565b919f909e50909c50959a50939850939650505050505050565b60008060006133996135bf565b90925090506133a88282610d1f565b9250505090565b303b1590565b600054610100900460ff16806133ce57506133ce6133af565b806133dc575060005460ff16155b6134175760405162461bcd60e51b815260040180806020018281038252602e815260200180613bda602e913960400191505060405180910390fd5b600054610100900460ff16158015613442576000805460ff1961ff0019909116610100171660011790555b61344a613722565b61345483836137c2565b80156110b9576000805461ff0019169055505050565b606a805460ff191660ff92909216919091179055565b600054610100900460ff168061349957506134996133af565b806134a7575060005460ff16155b6134e25760405162461bcd60e51b815260040180806020018281038252602e815260200180613bda602e913960400191505060405180910390fd5b600054610100900460ff1615801561350d576000805460ff1961ff0019909116610100171660011790555b613515613722565b61351d61389a565b801561262c576000805461ff001916905550565b60d15461353e9083610d6a565b60d15560d25461354e9082613266565b60d2555050565b600080806135696127106118198787610dac565b905060006135778683610d6a565b96919550909350505050565b60008080806135928786610dac565b905060006135a08787610dac565b905060006135ae8383610d6a565b929992985090965090945050505050565b60d15460d0546000918291825b60cf548110156136f0578260cb600060cf84815481106135e857fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061364d57508160cc600060cf848154811061362657fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156136645760d15460d0549450945050505061371e565b6136a460cb600060cf848154811061367857fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490610d6a565b92506136e660cc600060cf84815481106136ba57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390610d6a565b91506001016135cc565b5060d05460d15461370091610d1f565b8210156137185760d15460d05493509350505061371e565b90925090505b9091565b600054610100900460ff168061373b575061373b6133af565b80613749575060005460ff16155b6137845760405162461bcd60e51b815260040180806020018281038252602e815260200180613bda602e913960400191505060405180910390fd5b600054610100900460ff1615801561351d576000805460ff1961ff001990911661010017166001179055801561262c576000805461ff001916905550565b600054610100900460ff16806137db57506137db6133af565b806137e9575060005460ff16155b6138245760405162461bcd60e51b815260040180806020018281038252602e815260200180613bda602e913960400191505060405180910390fd5b600054610100900460ff1615801561384f576000805460ff1961ff0019909116610100171660011790555b8251613862906068906020860190613993565b508151613876906069906020850190613993565b50606a805460ff1916601217905580156110b9576000805461ff0019169055505050565b600054610100900460ff16806138b357506138b36133af565b806138c1575060005460ff16155b6138fc5760405162461bcd60e51b815260040180806020018281038252602e815260200180613bda602e913960400191505060405180910390fd5b600054610100900460ff16158015613927576000805460ff1961ff0019909116610100171660011790555b6000613931613176565b609780546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561262c576000805461ff001916905550565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106139d457805160ff1916838001178555613a01565b82800160010185558215613a01579182015b82811115613a015782518255916020019190600101906139e6565b50613317929150613ac2565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a465780548555613a01565b82800160010185558215613a0157600052602060002091601f016020900482015b82811115613a01578254825591600101919060010190613a67565b50805460018160011615610100020316600290046000825580601f10613aa8575061262c565b601f01602090049060005260206000209081019061262c91905b5b808211156133175760008155600101613ac356fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373696e646578206d75737420626520696e2072616e6765206f662073746f726564207478206c697374536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564416d6f756e74206d757374206265206c657373207468616e20746f74616c2072656672616374696f6e7345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734578636c75646564206164647265737365732063616e6e6f742063616c6c20746869732066756e6374696f6e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212207e687ec60552f4110059d13b6dc7ad249a8b3a94fee3a23aa1af80ca18f7eb6f64736f6c634300060c0033

Deployed Bytecode

0x60806040526004361061028c5760003560e01c8063596fa9e31161015a57806397d0677b116100c1578063d3e157471161007a578063d3e1574714610bdf578063dd62ed3e14610c09578063e46adf6214610c44578063f2cc0c1814610c77578063f2fde38b14610caa578063f84354f114610cdd57610469565b806397d0677b14610a235780639ace38c214610a55578063a457c2d714610b10578063a9059cbb14610b49578063b45a3c0e14610b82578063cba0e99614610bac57610469565b80637d449789116101135780637d449789146109a55780638129fc1c146109ba5780638bdb2afa146109cf5780638da5cb5b146109e457806391d4ec18146109f957806395d89b4114610a0e57610469565b8063596fa9e3146108cb5780635c31a713146108e057806365cccc80146109165780636e9dde991461092b57806370a082311461095d578063715018a61461099057610469565b80631f36d925116101fe578063313ce567116101b7578063313ce567146107e2578063380d831b1461080d57806339509351146108225780633aa8d4be1461085b578063456e0a5d1461088c57806346c3bd1f146108a157610469565b80631f36d9251461070c57806323b872dd146107365780632ae427dc146107795780632bc1281e1461078e5780632d7da5a4146107a3578063303bb0b6146107b857610469565b8063126e19be11610250578063126e19be146105ad57806313114a9d1461067057806314cf1bd81461068557806314f43f7e146106b857806316007d29146106e257806318160ddd146106f757610469565b8063030ba6bf1461046e57806306fdde031461048557806308d1dd8a1461050f578063095ea7b3146105365780630ab114f91461058357610469565b366104695760db5460ff16156102d9576040805162461bcd60e51b815260206004820152600d60248201526c141c9954d85b1948115b991959609a1b604482015290519081900360640190fd5b635fef63204211610328576040805162461bcd60e51b81526020600482015260146024820152731c1c995cd85b19481e595d081d1bc81cdd185c9d60621b604482015290519081900360640190fd5b3460da54101561036a576040805162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b604482015290519081900360640190fd5b33600090815260dd6020526040902080543401908190556768155a43676e000010156103dd576040805162461bcd60e51b815260206004820152601960248201527f6d61782070726573616c65206c696d6974207265616368656400000000000000604482015290519081900360640190fd5b60006103e7610d10565b90506001600160a01b0381166108fc610401346003610d1f565b6040518115909202916000818181858888f19350505050158015610429573d6000803e3d6000fd5b5060da546104379034610d6a565b60da5560dc546000906104589061045234633b9aca00610d1f565b90610dac565b9050610465303383610e05565b5050005b600080fd5b34801561047a57600080fd5b506104836110be565b005b34801561049157600080fd5b5061049a61163e565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104d45781810151838201526020016104bc565b50505050905090810190601f1680156105015780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561051b57600080fd5b506105246116d4565b60408051918252519081900360200190f35b34801561054257600080fd5b5061056f6004803603604081101561055957600080fd5b506001600160a01b0381351690602001356116da565b604080519115158252519081900360200190f35b34801561058f57600080fd5b50610524600480360360208110156105a657600080fd5b50356116f7565b3480156105b957600080fd5b50610483600480360360408110156105d057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156105fb57600080fd5b82018360208201111561060d57600080fd5b8035906020019184600183028401116401000000008311171561062f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611b98945050505050565b34801561067c57600080fd5b50610524611cb9565b34801561069157600080fd5b50610524600480360360208110156106a857600080fd5b50356001600160a01b0316611cbf565b3480156106c457600080fd5b50610483600480360360208110156106db57600080fd5b5035611cd1565b3480156106ee57600080fd5b50610524611dac565b34801561070357600080fd5b50610524611db2565b34801561071857600080fd5b506104836004803603602081101561072f57600080fd5b5035611db8565b34801561074257600080fd5b5061056f6004803603606081101561075957600080fd5b506001600160a01b03813581169160208101359091169060400135611e15565b34801561078557600080fd5b50610524611e9c565b34801561079a57600080fd5b50610524611ea2565b3480156107af57600080fd5b50610524611ea8565b3480156107c457600080fd5b50610524600480360360208110156107db57600080fd5b5035611eae565b3480156107ee57600080fd5b506107f7611f0e565b6040805160ff9092168252519081900360200190f35b34801561081957600080fd5b5061056f611f17565b34801561082e57600080fd5b5061056f6004803603604081101561084557600080fd5b506001600160a01b038135169060200135611f20565b34801561086757600080fd5b50610870611f6e565b604080516001600160a01b039092168252519081900360200190f35b34801561089857600080fd5b50610524611f7d565b3480156108ad57600080fd5b50610483600480360360208110156108c457600080fd5b5035611f83565b3480156108d757600080fd5b50610870612171565b3480156108ec57600080fd5b506104836004803603606081101561090357600080fd5b5080359060208101359060400135612180565b34801561092257600080fd5b5061052461223f565b34801561093757600080fd5b506104836004803603604081101561094e57600080fd5b50803590602001351515612245565b34801561096957600080fd5b506105246004803603602081101561098057600080fd5b50356001600160a01b031661230e565b34801561099c57600080fd5b50610483612370565b3480156109b157600080fd5b50610524612412565b3480156109c657600080fd5b50610483612418565b3480156109db57600080fd5b5061087061262f565b3480156109f057600080fd5b50610870610d10565b348015610a0557600080fd5b5061052461263e565b348015610a1a57600080fd5b5061049a612644565b348015610a2f57600080fd5b5061052460048036036040811015610a4657600080fd5b508035906020013515156126a5565b348015610a6157600080fd5b50610a7f60048036036020811015610a7857600080fd5b503561273b565b604051808415158152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610ad3578181015183820152602001610abb565b50505050905090810190601f168015610b005780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b348015610b1c57600080fd5b5061056f60048036036040811015610b3357600080fd5b506001600160a01b038135169060200135612800565b348015610b5557600080fd5b5061056f60048036036040811015610b6c57600080fd5b506001600160a01b038135169060200135612868565b348015610b8e57600080fd5b5061056f60048036036020811015610ba557600080fd5b503561287c565b348015610bb857600080fd5b5061056f60048036036020811015610bcf57600080fd5b50356001600160a01b0316612891565b348015610beb57600080fd5b5061048360048036036020811015610c0257600080fd5b50356128af565b348015610c1557600080fd5b5061052460048036036040811015610c2c57600080fd5b506001600160a01b0381358116916020013516612922565b348015610c5057600080fd5b5061048360048036036020811015610c6757600080fd5b50356001600160a01b031661294d565b348015610c8357600080fd5b5061048360048036036020811015610c9a57600080fd5b50356001600160a01b03166129c7565b348015610cb657600080fd5b5061048360048036036020811015610ccd57600080fd5b50356001600160a01b0316612b4d565b348015610ce957600080fd5b5061048360048036036020811015610d0057600080fd5b50356001600160a01b0316612c46565b6097546001600160a01b031690565b6000610d6183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612e07565b90505b92915050565b6000610d6183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ea9565b600082610dbb57506000610d64565b82820282848281610dc857fe5b0414610d615760405162461bcd60e51b8152600401808060200182810382526021815260200180613b486021913960400191505060405180910390fd5b6001600160a01b038316610e4a5760405162461bcd60e51b8152600401808060200182810382526025815260200180613c326025913960400191505060405180910390fd5b60008111610e895760405162461bcd60e51b8152600401808060200182810382526029815260200180613bb16029913960400191505060405180910390fd5b60db5460ff1680610eb25750610e9d610d10565b6001600160a01b0316836001600160a01b0316145b80610ec557506001600160a01b03831630145b610f16576040805162461bcd60e51b815260206004820152601860248201527f7472616e736665722070617573656420666f722073616c650000000000000000604482015290519081900360640190fd5b6001600160a01b038316301480610f455750610f30610d10565b6001600160a01b0316836001600160a01b0316145b15610f5c57610f578383836000612f03565b6110b9565b6001600160a01b038316600090815260ce602052604090205460ff168015610f9d57506001600160a01b038216600090815260ce602052604090205460ff16155b15610fb057610f5783838360d354613052565b6001600160a01b038316600090815260ce602052604090205460ff16158015610ff157506001600160a01b038216600090815260ce602052604090205460ff165b1561100457610f5783838360d3546130f2565b6001600160a01b038316600090815260ce602052604090205460ff1615801561104657506001600160a01b038216600090815260ce602052604090205460ff16155b1561105957610f5783838360d354613134565b6001600160a01b038316600090815260ce602052604090205460ff16801561109957506001600160a01b038216600090815260ce602052604090205460ff165b156110ab57610f578383836000612f03565b6110b983838360d354613134565b505050565b6110c6613176565b6097546001600160a01b03908116911614611116576040805162461bcd60e51b81526020600482018190526024820152600080516020613b91833981519152604482015290519081900360640190fd5b60db5460ff161561115f576040805162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481b1a5cdd195960921b604482015290519081900360640190fd5b60da54158061116f57504260d954105b6111b9576040805162461bcd60e51b815260206004820152601660248201527514d85b19481a185cc81b9bdd08195b991959081e595d60521b604482015290519081900360640190fd5b60db805460ff191660011790556111df306111d2613176565b661c6bf526340000610e05565b60e05460df54604080516315ab88c960e31b815290516000936001600160a01b039081169363c9c653969391169163ad5c464891600480820192602092909190829003018186803b15801561123357600080fd5b505afa158015611247573d6000803e3d6000fd5b505050506040513d602081101561125d57600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b0390921660048301523060248301525160448083019260209291908290030181600087803b1580156112ac57600080fd5b505af11580156112c0573d6000803e3d6000fd5b505050506040513d60208110156112d657600080fd5b505160df54604080516315ab88c960e31b8152905192935083926000926001600160a01b03169163ad5c4648916004808301926020929190829003018186803b15801561132257600080fd5b505afa158015611336573d6000803e3d6000fd5b505050506040513d602081101561134c57600080fd5b505160408051630d0e30db60e41b8152905191925047916001600160a01b0384169163d0e30db091849160048082019260009290919082900301818588803b15801561139757600080fd5b505af11580156113ab573d6000803e3d6000fd5b5050505050476000146113f7576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b604482015290519081900360640190fd5b60da54660979518faa2400901561143c5760dc5461141d9061045284633b9aca00610d1f565b905060008161142b3061230e565b03905061143a30600083610e05565b505b826001600160a01b031663a9059cbb85846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561149357600080fd5b505af11580156114a7573d6000803e3d6000fd5b505050506040513d60208110156114bd57600080fd5b506114cb9050308583610e05565b604080516335313c2160e11b815230600482015290516001600160a01b03861691636a6278429160248083019260209291908290030181600087803b15801561151357600080fd5b505af1158015611527573d6000803e3d6000fd5b505050506040513d602081101561153d57600080fd5b5050604080516370a0823160e01b815230600482015290516001600160a01b0386169163a9059cbb91339184916370a0823191602480820192602092909190829003018186803b15801561159057600080fd5b505afa1580156115a4573d6000803e3d6000fd5b505050506040513d60208110156115ba57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b15801561160b57600080fd5b505af115801561161f573d6000803e3d6000fd5b505050506040513d602081101561163557600080fd5b50505050505050565b60688054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156116ca5780601f1061169f576101008083540402835291602001916116ca565b820191906000526020600020905b8154815290600101906020018083116116ad57829003601f168201915b5050505050905090565b60d85481565b60006116ee6116e7613176565b848461317a565b50600192915050565b6000611701610d10565b6001600160a01b0316611712613176565b6001600160a01b03161480611741575060d4546001600160a01b0316611736613176565b6001600160a01b0316145b61178a576040805162461bcd60e51b815260206004820152601560248201527414d95b99195c881b9bdd08185d5d1a1bdc9a5e9959605a1b604482015290519081900360640190fd5b60ca54611798906001613266565b60ca55816117e15760ca5460d05460408051918252517f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f29181900360200190a25060d054611b93565b60006117fe600084126117f457836117f9565b836000035b6132c0565b60d05490915060009061181f9061181984633b9aca00610dac565b90610d1f565b905060008085121561184057611839633b9aca0083610d6a565b9050611851565b61184e633b9aca0083613266565b90505b600085121561186f5760d0546118679084610d6a565b60d055611880565b60d05461187c9084613266565b60d0555b60005b60cf5481101561195257600060cc600060cf84815481106118a057fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054111561194a576119136009600a0a6118198460cc600060cf87815481106118e857fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205490610dac565b60cc600060cf848154811061192457fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020555b600101611883565b5060ca5460d05460408051918252517f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f29181900360200190a260005b60c954811015611b8957600060c982815481106119a757fe5b60009182526020909120600290910201805490915060ff1615611b805780546001808301805460408051602060026101009685161587026000190190941693909304601f8101849004840282018401909252818152600095611a6f9590046001600160a01b0316939092909190830182828015611a655780601f10611a3a57610100808354040283529160200191611a65565b820191906000526020600020905b815481529060010190602001808311611a4857829003601f168201915b505050505061331b565b905080611b7e5781546040805185815260208101828152600180870180546002610100938216158402600019019091160494840185905294046001600160a01b0316937f8091ecaaa54ebb82e02d36c2c336528e0fcb9b3430fc1291ac88295032b9c263938893919290606083019084908015611b2d5780601f10611b0257610100808354040283529160200191611b2d565b820191906000526020600020905b815481529060010190602001808311611b1057829003601f168201915b5050935050505060405180910390a26040805162461bcd60e51b8152602060048201526012602482015271151c985b9cd858dd1a5bdb8811985a5b195960721b604482015290519081900360640190fd5b505b5060010161198e565b5060d05493505050505b919050565b611ba0613176565b6097546001600160a01b03908116911614611bf0576040805162461bcd60e51b81526020600482018190526024820152600080516020613b91833981519152604482015290519081900360640190fd5b6040805160608101825260018082526001600160a01b03808616602080850191825294840186815260c980549485018155600052845160029094027f66be4f155c5ef2ebd3772b228f2f00681e4ed5826cdb3b1943cc11ad15ad1d2881018054935190941661010002610100600160a81b031995151560ff19909416939093179490941691909117825551805193949193611cb2937f66be4f155c5ef2ebd3772b228f2f00681e4ed5826cdb3b1943cc11ad15ad1d2901929190910190613993565b5050505050565b60d25490565b60dd6020526000908152604090205481565b6000611cdb613176565b6001600160a01b038116600090815260ce602052604090205490915060ff1615611d365760405162461bcd60e51b815260040180806020018281038252602c815260200180613c7b602c913960400191505060405180910390fd5b6000611d448360d35461333e565b505050506001600160a01b038316600090815260cb6020526040902054909150611d6e9082610d6a565b6001600160a01b038316600090815260cb602052604090205560d154611d949082610d6a565b60d15560d254611da49084613266565b60d255505050565b60dc5481565b60d05490565b611dc0613176565b6097546001600160a01b03908116911614611e10576040805162461bcd60e51b81526020600482018190526024820152600080516020613b91833981519152604482015290519081900360640190fd5b60d355565b6000611e22848484610e05565b611e9284611e2e613176565b611e8d85604051806060016040528060288152602001613b69602891396001600160a01b038a16600090815260cd6020526040812090611e6c613176565b6001600160a01b031681526020810191909152604001600020549190612ea9565b61317a565b5060019392505050565b60d35481565b60d55481565b60d95481565b600060d154821115611ef15760405162461bcd60e51b815260040180806020018281038252602a815260200180613c08602a913960400191505060405180910390fd5b6000611efb61338c565b9050611f078382610d1f565b9392505050565b606a5460ff1690565b60db5460ff1681565b60006116ee611f2d613176565b84611e8d8560cd6000611f3e613176565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490613266565b60d4546001600160a01b031681565b60d65481565b611f8b613176565b6097546001600160a01b03908116911614611fdb576040805162461bcd60e51b81526020600482018190526024820152600080516020613b91833981519152604482015290519081900360640190fd5b60c9548110612027576040805162461bcd60e51b8152602060048201526013602482015272696e646578206f7574206f6620626f756e647360681b604482015290519081900360640190fd5b600081815260de602052604090205460ff161561207d576040805162461bcd60e51b815260206004820152600f60248201526e1a5b99195e081a5cc81b1bd8dad959608a1b604482015290519081900360640190fd5b60c9546000190181101561212e5760c98054600019810190811061209d57fe5b906000526020600020906002020160c982815481106120b857fe5b6000918252602090912082546002928302909101805460ff191660ff9092161515919091178082558354610100600160a81b0319909116610100918290046001600160a01b0316820217825560018085018054939461212a948387019492938116159092026000190190911604613a0d565b5050505b60c980548061213957fe5b60008281526020812060026000199093019283020180546001600160a81b03191681559061216a6001830182613a82565b5050905550565b60df546001600160a01b031681565b612188613176565b6097546001600160a01b039081169116146121d8576040805162461bcd60e51b81526020600482018190526024820152600080516020613b91833981519152604482015290519081900360640190fd5b60d8541561222d576040805162461bcd60e51b815260206004820152601960248201527f4c696d6974206368616e676573206e6f7420616c6c6f77656400000000000000604482015290519081900360640190fd5b60d59290925560d65560d7554260d855565b60da5481565b61224d613176565b6097546001600160a01b0390811691161461229d576040805162461bcd60e51b81526020600482018190526024820152600080516020613b91833981519152604482015290519081900360640190fd5b60c95482106122dd5760405162461bcd60e51b8152600401808060200182810382526028815260200180613b206028913960400191505060405180910390fd5b8060c983815481106122eb57fe5b60009182526020909120600290910201805460ff19169115159190911790555050565b6001600160a01b038116600090815260ce602052604081205460ff161561234e57506001600160a01b038116600090815260cc6020526040902054611b93565b6001600160a01b038216600090815260cb6020526040902054610d6490611eae565b612378613176565b6097546001600160a01b039081169116146123c8576040805162461bcd60e51b81526020600482018190526024820152600080516020613b91833981519152604482015290519081900360640190fd5b6097546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3609780546001600160a01b0319169055565b60d75481565b600054610100900460ff168061243157506124316133af565b8061243f575060005460ff16155b61247a5760405162461bcd60e51b815260040180806020018281038252602e815260200180613bda602e913960400191505060405180910390fd5b600054610100900460ff161580156124a5576000805460ff1961ff0019909116610100171660011790555b6124ed6040518060400160405280600a8152602001690a6eae6d0d2ccdee4e8d60b31b8152506040518060400160405280600481526020016329aaa9a360e11b8152506133b5565b6124f7600961346a565b6124ff613480565b662aa1efb94e000060d055661c7327917bffff1960d15561251e613176565b60d480546001600160a01b0319166001600160a01b039290921691909117905560ed60d35560d15430600081815260cb602090815260408083209490945560d05484519081529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a3635ff2062060d95560db805460ff19169055682086ac35105260000060da55611a0a60dc556125c96125c4613176565b6129c7565b6125d2306129c7565b60df80546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d1790915560e08054909116735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f179055801561262c576000805461ff00191690555b50565b60e0546001600160a01b031681565b60c95490565b60698054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156116ca5780601f1061169f576101008083540402835291602001916116ca565b600060d0548311156126fe576040805162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c7900604482015290519081900360640190fd5b8161271f5760006127118460d35461333e565b50929450610d649350505050565b600061272d8460d35461333e565b50919450610d649350505050565b60c9818154811061274857fe5b6000918252602091829020600291820201805460018083018054604080516101009483161585026000190190921696909604601f810188900488028201880190965285815260ff84169750919092046001600160a01b031694929390928301828280156127f65780601f106127cb576101008083540402835291602001916127f6565b820191906000526020600020905b8154815290600101906020018083116127d957829003601f168201915b5050505050905083565b60006116ee61280d613176565b84611e8d85604051806060016040528060258152602001613ca76025913960cd6000612837613176565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190612ea9565b60006116ee612875613176565b8484610e05565b60de6020526000908152604090205460ff1681565b6001600160a01b0316600090815260ce602052604090205460ff1690565b6128b7613176565b6097546001600160a01b03908116911614612907576040805162461bcd60e51b81526020600482018190526024820152600080516020613b91833981519152604482015290519081900360640190fd5b600090815260de60205260409020805460ff19166001179055565b6001600160a01b03918216600090815260cd6020908152604080832093909416825291909152205490565b612955613176565b6097546001600160a01b039081169116146129a5576040805162461bcd60e51b81526020600482018190526024820152600080516020613b91833981519152604482015290519081900360640190fd5b60d480546001600160a01b0319166001600160a01b0392909216919091179055565b6129cf613176565b6097546001600160a01b03908116911614612a1f576040805162461bcd60e51b81526020600482018190526024820152600080516020613b91833981519152604482015290519081900360640190fd5b6001600160a01b038116600090815260ce602052604090205460ff1615612a8d576040805162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604482015290519081900360640190fd5b6001600160a01b038116600090815260cb602052604090205415612ae7576001600160a01b038116600090815260cb6020526040902054612acd90611eae565b6001600160a01b038216600090815260cc60205260409020555b6001600160a01b0316600081815260ce60205260408120805460ff1916600190811790915560cf805491820181559091527facb8d954e2cfef495862221e91bd7523613cf8808827cb33edfe4904cc51bf290180546001600160a01b0319169091179055565b612b55613176565b6097546001600160a01b03908116911614612ba5576040805162461bcd60e51b81526020600482018190526024820152600080516020613b91833981519152604482015290519081900360640190fd5b6001600160a01b038116612bea5760405162461bcd60e51b8152600401808060200182810382526026815260200180613ad86026913960400191505060405180910390fd5b6097546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3609780546001600160a01b0319166001600160a01b0392909216919091179055565b612c4e613176565b6097546001600160a01b03908116911614612c9e576040805162461bcd60e51b81526020600482018190526024820152600080516020613b91833981519152604482015290519081900360640190fd5b6001600160a01b038116600090815260ce602052604090205460ff16612d0b576040805162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604482015290519081900360640190fd5b60005b60cf54811015612e0357816001600160a01b031660cf8281548110612d2f57fe5b6000918252602090912001546001600160a01b03161415612dfb5760cf80546000198101908110612d5c57fe5b60009182526020909120015460cf80546001600160a01b039092169183908110612d8257fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918416815260cc8252604080822082905560ce90925220805460ff1916905560cf805480612dd457fe5b600082815260209020810160001990810180546001600160a01b0319169055019055612e03565b600101612d0e565b5050565b60008183612e935760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e58578181015183820152602001612e40565b50505050905090810190601f168015612e855780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612e9f57fe5b0495945050505050565b60008184841115612efb5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612e58578181015183820152602001612e40565b505050900390565b6000806000806000612f15878761333e565b6001600160a01b038e16600090815260cc602052604090205494995092975090955093509150612f459088610d6a565b6001600160a01b038a16600090815260cc602090815260408083209390935560cb90522054612f749086610d6a565b6001600160a01b03808b16600090815260cb6020908152604080832094909455918b16815260cc9091522054612faa9083613266565b6001600160a01b038916600090815260cc602090815260408083209390935560cb90522054612fd99085613266565b6001600160a01b038916600090815260cb6020526040902055612ffc8382613531565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3505050505050505050565b6000806000806000613064878761333e565b6001600160a01b038e16600090815260cc6020526040902054949950929750909550935091506130949088610d6a565b6001600160a01b038a16600090815260cc602090815260408083209390935560cb905220546130c39086610d6a565b6001600160a01b03808b16600090815260cb602052604080822093909355908a1681522054612fd99085613266565b6000806000806000613104878761333e565b6001600160a01b038e16600090815260cb602052604090205494995092975090955093509150612f749086610d6a565b6000806000806000613146878761333e565b6001600160a01b038e16600090815260cb6020526040902054949950929750909550935091506130c39086610d6a565b3390565b6001600160a01b0383166131bf5760405162461bcd60e51b8152600401808060200182810382526024815260200180613c576024913960400191505060405180910390fd5b6001600160a01b0382166132045760405162461bcd60e51b8152600401808060200182810382526022815260200180613afe6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260cd6020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600082820183811015610d61576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080821215613317576040805162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f736974697665604482015290519081900360640190fd5b5090565b6000806040516020840160008286518360008a6187965a03f19695505050505050565b60008060008060008060006133538989613555565b91509150600061336161338c565b905060008060006133738d8686613583565b919f909e50909c50959a50939850939650505050505050565b60008060006133996135bf565b90925090506133a88282610d1f565b9250505090565b303b1590565b600054610100900460ff16806133ce57506133ce6133af565b806133dc575060005460ff16155b6134175760405162461bcd60e51b815260040180806020018281038252602e815260200180613bda602e913960400191505060405180910390fd5b600054610100900460ff16158015613442576000805460ff1961ff0019909116610100171660011790555b61344a613722565b61345483836137c2565b80156110b9576000805461ff0019169055505050565b606a805460ff191660ff92909216919091179055565b600054610100900460ff168061349957506134996133af565b806134a7575060005460ff16155b6134e25760405162461bcd60e51b815260040180806020018281038252602e815260200180613bda602e913960400191505060405180910390fd5b600054610100900460ff1615801561350d576000805460ff1961ff0019909116610100171660011790555b613515613722565b61351d61389a565b801561262c576000805461ff001916905550565b60d15461353e9083610d6a565b60d15560d25461354e9082613266565b60d2555050565b600080806135696127106118198787610dac565b905060006135778683610d6a565b96919550909350505050565b60008080806135928786610dac565b905060006135a08787610dac565b905060006135ae8383610d6a565b929992985090965090945050505050565b60d15460d0546000918291825b60cf548110156136f0578260cb600060cf84815481106135e857fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061364d57508160cc600060cf848154811061362657fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156136645760d15460d0549450945050505061371e565b6136a460cb600060cf848154811061367857fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490610d6a565b92506136e660cc600060cf84815481106136ba57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390610d6a565b91506001016135cc565b5060d05460d15461370091610d1f565b8210156137185760d15460d05493509350505061371e565b90925090505b9091565b600054610100900460ff168061373b575061373b6133af565b80613749575060005460ff16155b6137845760405162461bcd60e51b815260040180806020018281038252602e815260200180613bda602e913960400191505060405180910390fd5b600054610100900460ff1615801561351d576000805460ff1961ff001990911661010017166001179055801561262c576000805461ff001916905550565b600054610100900460ff16806137db57506137db6133af565b806137e9575060005460ff16155b6138245760405162461bcd60e51b815260040180806020018281038252602e815260200180613bda602e913960400191505060405180910390fd5b600054610100900460ff1615801561384f576000805460ff1961ff0019909116610100171660011790555b8251613862906068906020860190613993565b508151613876906069906020850190613993565b50606a805460ff1916601217905580156110b9576000805461ff0019169055505050565b600054610100900460ff16806138b357506138b36133af565b806138c1575060005460ff16155b6138fc5760405162461bcd60e51b815260040180806020018281038252602e815260200180613bda602e913960400191505060405180910390fd5b600054610100900460ff16158015613927576000805460ff1961ff0019909116610100171660011790555b6000613931613176565b609780546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561262c576000805461ff001916905550565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106139d457805160ff1916838001178555613a01565b82800160010185558215613a01579182015b82811115613a015782518255916020019190600101906139e6565b50613317929150613ac2565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a465780548555613a01565b82800160010185558215613a0157600052602060002091601f016020900482015b82811115613a01578254825591600101919060010190613a67565b50805460018160011615610100020316600290046000825580601f10613aa8575061262c565b601f01602090049060005260206000209081019061262c91905b5b808211156133175760008155600101613ac356fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373696e646578206d75737420626520696e2072616e6765206f662073746f726564207478206c697374536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564416d6f756e74206d757374206265206c657373207468616e20746f74616c2072656672616374696f6e7345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734578636c75646564206164647265737365732063616e6e6f742063616c6c20746869732066756e6374696f6e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212207e687ec60552f4110059d13b6dc7ad249a8b3a94fee3a23aa1af80ca18f7eb6f64736f6c634300060c0033

Deployed Bytecode Sourcemap

18793:19725:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21409:7;;;;21408:8;21400:34;;;;;-1:-1:-1;;;21400:34:0;;;;;;;;;;;;-1:-1:-1;;;21400:34:0;;;;;;;;;;;;;;;21459:10;21453:3;:16;21445:49;;;;;-1:-1:-1;;;21445:49:0;;;;;;;;;;;;-1:-1:-1;;;21445:49:0;;;;;;;;;;;;;;;21528:9;21513:11;;:24;;21505:45;;;;;-1:-1:-1;;;21505:45:0;;;;;;;;;;;;-1:-1:-1;;;21505:45:0;;;;;;;;;;;;;;;21569:10;21561:19;;;;:7;:19;;;;;:32;;21584:9;21561:32;;;;;21636:19;-1:-1:-1;21612:43:0;21604:81;;;;;-1:-1:-1;;;21604:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21696:22;21737:7;:5;:7::i;:::-;21696:50;-1:-1:-1;;;;;;21757:15:0;;:33;21773:16;:9;21787:1;21773:13;:16::i;:::-;21757:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21815:11:0;;:26;;21831:9;21815:15;:26::i;:::-;21801:11;:40;21900:12;;21852:20;;21875:38;;:20;:9;21889:5;21875:13;:20::i;:::-;:24;;:38::i;:::-;21852:61;;21924:51;21942:4;21949:10;21961:12;21924:9;:51::i;:::-;21362:621;;18793:19725;;;;;21991:1266;;;;;;;;;;;;;:::i;:::-;;7529:83;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20080:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;29593:161;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29593:161:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;24103:1761;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24103:1761:0;;:::i;26090:260::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26090:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26090:260:0;;-1:-1:-1;26090:260:0;;-1:-1:-1;;;;;26090:260:0:i;30722:87::-;;;;;;;;;;;;;:::i;20251:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20251:42:0;-1:-1:-1;;;;;20251:42:0;;:::i;30817:390::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30817:390:0;;:::i;20217:27::-;;;;;;;;;;;;;:::i;23991:100::-;;;;;;;;;;;;;:::i;23483:120::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23483:120:0;;:::i;29762:313::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29762:313:0;;;;;;;;;;;;;;;;;:::i;19876:27::-;;;;;;;;;;;;;:::i;19952:35::-;;;;;;;;;;;;;:::i;20119:32::-;;;;;;;;;;;;;:::i;31690:253::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31690:253:0;;:::i;7715:83::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20191:19;;;;;;;;;;;;;:::i;30083:227::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30083:227:0;;;;;;;;:::i;19916:23::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;19916:23:0;;;;;;;;;;;;;;19994:31;;;;;;;;;;;;;:::i;26502:378::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26502:378:0;;:::i;20351:41::-;;;;;;;;;;;;;:::i;23615:364::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23615:364:0;;;;;;;;;;;;:::i;20158:26::-;;;;;;;;;;;;;:::i;27062:246::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27062:246:0;;;;;;;;;:::i;29061:198::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29061:198:0;-1:-1:-1;;;;;29061:198:0;;:::i;3393:148::-;;;;;;;;;;;;;:::i;20032:35::-;;;;;;;;;;;;;:::i;20451:903::-;;;;;;;;;;;;;:::i;20399:39::-;;;;;;;;;;;;;:::i;3179:79::-;;;;;;;;;;;;;:::i;27423:137::-;;;;;;;;;;;;;:::i;7620:87::-;;;;;;;;;;;;;:::i;31215:467::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31215:467:0;;;;;;;;;:::i;19200:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19200:33:0;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;19200:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30318:278;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30318:278:0;;;;;;;;:::i;29267:167::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29267:167:0;;;;;;;;:::i;20300:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20300:38:0;;:::i;30604:110::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30604:110:0;-1:-1:-1;;;;;30604:110:0;;:::i;23377:94::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23377:94:0;;:::i;29442:143::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29442:143:0;;;;;;;;;;:::i;23269:95::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23269:95:0;-1:-1:-1;;;;;23269:95:0;;:::i;31951:330::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31951:330:0;-1:-1:-1;;;;;31951:330:0;;:::i;3549:244::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3549:244:0;-1:-1:-1;;;;;3549:244:0;;:::i;32289:476::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32289:476:0;-1:-1:-1;;;;;32289:476:0;;:::i;3179:79::-;3244:6;;-1:-1:-1;;;;;3244:6:0;3179:79;:::o;5349:132::-;5407:7;5434:39;5438:1;5441;5434:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;5427:46;;5349:132;;;;;:::o;4743:136::-;4801:7;4828:43;4832:1;4835;4828:43;;;;;;;;;;;;;;;;;:3;:43::i;5091:250::-;5149:7;5173:6;5169:47;;-1:-1:-1;5203:1:0;5196:8;;5169:47;5240:5;;;5244:1;5240;:5;:1;5264:5;;;;;:10;5256:56;;;;-1:-1:-1;;;5256:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33128:1157;-1:-1:-1;;;;;33235:20:0;;33227:70;;;;-1:-1:-1;;;33227:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33325:1;33316:6;:10;33308:64;;;;-1:-1:-1;;;33308:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33391:7;;;;;:28;;;33412:7;:5;:7::i;:::-;-1:-1:-1;;;;;33402:17:0;:6;-1:-1:-1;;;;;33402:17:0;;33391:28;:55;;;-1:-1:-1;;;;;;33423:23:0;;33441:4;33423:23;33391:55;33383:92;;;;;-1:-1:-1;;;33383:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33489:23:0;;33507:4;33489:23;;:44;;;33526:7;:5;:7::i;:::-;-1:-1:-1;;;;;33516:17:0;:6;-1:-1:-1;;;;;33516:17:0;;33489:44;33486:792;;;33550:51;33572:6;33580:9;33591:6;33599:1;33550:21;:51::i;:::-;33486:792;;;-1:-1:-1;;;;;33622:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;33646:22:0;;;;;;:11;:22;;;;;;;;33645:23;33622:46;33619:659;;;33685:62;33707:6;33715:9;33726:6;33734:12;;33685:21;:62::i;33619:659::-;-1:-1:-1;;;;;33770:19:0;;;;;;:11;:19;;;;;;;;33769:20;:46;;;;-1:-1:-1;;;;;;33793:22:0;;;;;;:11;:22;;;;;;;;33769:46;33765:513;;;33836:60;33856:6;33864:9;33875:6;33883:12;;33836:19;:60::i;33765:513::-;-1:-1:-1;;;;;33919:19:0;;;;;;:11;:19;;;;;;;;33918:20;:47;;;;-1:-1:-1;;;;;;33943:22:0;;;;;;:11;:22;;;;;;;;33942:23;33918:47;33914:364;;;33982:58;34000:6;34008:9;34019:6;34027:12;;33982:17;:58::i;33914:364::-;-1:-1:-1;;;;;34062:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;34085:22:0;;;;;;:11;:22;;;;;;;;34062:45;34058:220;;;34124:51;34146:6;34154:9;34165:6;34173:1;34124:21;:51::i;34058:220::-;34208:58;34226:6;34234:9;34245:6;34253:12;;34208:17;:58::i;:::-;33128:1157;;;:::o;21991:1266::-;3316:12;:10;:12::i;:::-;3306:6;;-1:-1:-1;;;;;3306:6:0;;;:22;;;3298:67;;;;;-1:-1:-1;;;3298:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3298:67:0;;;;;;;;;;;;;;;22053:7:::1;::::0;::::1;;22052:8;22044:35;;;::::0;;-1:-1:-1;;;22044:35:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22044:35:0;;;;;;;;;;;;;::::1;;22098:11;::::0;:16;;:43:::1;;;22138:3;22118:17;;:23;22098:43;22090:78;;;::::0;;-1:-1:-1;;;22090:78:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22090:78:0;;;;;;;;;;;;;::::1;;22179:7;:14:::0;;-1:-1:-1;;22179:14:0::1;22189:4;22179:14;::::0;;22204:55:::1;22222:4;22229:12;:10;:12::i;:::-;22243:15;22204:9;:55::i;:::-;22297:14;::::0;22345:15:::1;::::0;:22:::1;::::0;;-1:-1:-1;;;22345:22:0;;;;22270:24:::1;::::0;-1:-1:-1;;;;;22297:14:0;;::::1;::::0;:25:::1;::::0;22345:15;::::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;:15;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;22345:22:0;22297:119:::1;::::0;;-1:-1:-1;;;;;;22297:119:0::1;::::0;;;;;;-1:-1:-1;;;;;22297:119:0;;::::1;;::::0;::::1;::::0;22399:4:::1;22297:119:::0;;;;;;;;;;22345:22:::1;::::0;22297:119;;;;;;;-1:-1:-1;22297:119:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;22297:119:0;22507:15:::1;::::0;:22:::1;::::0;;-1:-1:-1;;;22507:22:0;;;;22297:119;;-1:-1:-1;22297:119:0;;22427:19:::1;::::0;-1:-1:-1;;;;;22507:15:0::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;22297:119:::1;::::0;22507:22;;;;;;;:15;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;22507:22:0;22592:40:::1;::::0;;-1:-1:-1;;;22592:40:0;;;;22507:22;;-1:-1:-1;22560:21:0::1;::::0;-1:-1:-1;;;;;22592:19:0;::::1;::::0;::::1;::::0;22560:21;;22592:40:::1;::::0;;::::1;::::0;22540:17:::1;::::0;22592:40;;;;;;;;22560:21;22592:19;:40;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;22651:21;22676:1;22651:26;22643:55;;;::::0;;-1:-1:-1;;;22643:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22643:55:0;;;;;;;;;;;;;::::1;;22759:11;::::0;22730:15:::1;::::0;22759:16;22756:240:::1;;22830:12;::::0;22805:38:::1;::::0;:20:::1;:9:::0;22819:5:::1;22805:13;:20::i;:38::-;22792:51;;22858:20;22908:10;22881:24;22899:4;22881:9;:24::i;:::-;:37;22858:60;;22934:50;22952:4;22967:1;22971:12;22934:9;:50::i;:::-;22756:240;;23012:4;-1:-1:-1::0;;;;;23006:20:0::1;;23035:4;23041:9;23006:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;23006:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23062:51:0::1;::::0;-1:-1:-1;23080:4:0::1;23095::::0;23102:10;23062:9:::1;:51::i;:::-;23124:24;::::0;;-1:-1:-1;;;23124:24:0;;23142:4:::1;23124:24;::::0;::::1;::::0;;;-1:-1:-1;;;;;23124:9:0;::::1;::::0;::::1;::::0;:24;;;;;::::1;::::0;;;;;;;;-1:-1:-1;23124:9:0;:24;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;23202:46:0::1;::::0;;-1:-1:-1;;;23202:46:0;;23242:4:::1;23202:46;::::0;::::1;::::0;;;-1:-1:-1;;;;;23159:30:0;::::1;::::0;::::1;::::0;23190:10:::1;::::0;23159:30;;23202:31:::1;::::0;:46;;;;;23124:24:::1;::::0;23202:46;;;;;;;;23159:30;23202:46;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23202:46:0;23159:90:::1;::::0;;-1:-1:-1;;;;;;23159:90:0::1;::::0;;;;;;-1:-1:-1;;;;;23159:90:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;23202:46:::1;::::0;23159:90;;;;;;;-1:-1:-1;23159:90:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;;;;;21991:1266:0:o;7529:83::-;7599:5;7592:12;;;;;;;;-1:-1:-1;;7592:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7566:13;;7592:12;;7599:5;;7592:12;;7599:5;7592:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7529:83;:::o;20080:30::-;;;;:::o;29593:161::-;29668:4;29685:39;29694:12;:10;:12::i;:::-;29708:7;29717:6;29685:8;:39::i;:::-;-1:-1:-1;29742:4:0;29593:161;;;;:::o;24103:1761::-;24175:7;24224;:5;:7::i;:::-;-1:-1:-1;;;;;24208:23:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;24208:23:0;;:51;;;-1:-1:-1;24251:8:0;;-1:-1:-1;;;;;24251:8:0;24235:12;:10;:12::i;:::-;-1:-1:-1;;;;;24235:24:0;;24208:51;24200:85;;;;;-1:-1:-1;;;24200:85:0;;;;;;;;;;;;-1:-1:-1;;;24200:85:0;;;;;;;;;;;;;;;24315:6;;:13;;24326:1;24315:10;:13::i;:::-;24306:6;:22;24347:16;24343:119;;24395:6;;24403:12;;24385:31;;;;;;;;;;;;;;;;-1:-1:-1;24438:12:0;;24431:19;;24343:119;24482:20;24505:58;24520:1;24506:11;:15;:44;;24539:11;24506:44;;;24525:11;24524:12;;24506:44;24505:56;:58::i;:::-;24626:12;;24482:81;;-1:-1:-1;24574:12:0;;24589:50;;:32;24482:81;19849:14;24589:16;:32::i;:::-;:36;;:50::i;:::-;24574:65;;24650:18;24707:1;24693:11;:15;24689:155;;;24738:24;19849:14;24757:4;24738:18;:24::i;:::-;24725:37;;24689:155;;;24808:24;19849:14;24827:4;24808:18;:24::i;:::-;24795:37;;24689:155;24882:1;24868:11;:15;24864:171;;;24915:12;;:30;;24932:12;24915:16;:30::i;:::-;24900:12;:45;24864:171;;;24993:12;;:30;;25010:12;24993:16;:30::i;:::-;24978:12;:45;24864:171;25149:9;25144:219;25168:9;:16;25164:20;;25144:219;;;25233:1;25209:7;:21;25217:9;25227:1;25217:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25217:12:0;25209:21;;;;;;;;;;;;;:25;25206:146;;;25279:57;19799:1;19849:2;:14;25279:37;25305:10;25279:7;:21;25287:9;25297:1;25287:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25287:12:0;25279:21;;;;;;;;;;;;;;:25;:37::i;:57::-;25255:7;:21;25263:9;25273:1;25263:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25263:12:0;25255:21;;;;;;;;;;;;:81;25206:146;25186:3;;25144:219;;;-1:-1:-1;25398:6:0;;25406:12;;25388:31;;;;;;;;;;;;;;;;25431:6;25426:399;25447:12;:19;25443:23;;25426:399;;;25488:21;25512:12;25525:1;25512:15;;;;;;;;;;;;;;;;;;;;;25546:9;;25512:15;;-1:-1:-1;25546:9:0;;25542:272;;;25603:13;;;25618:6;;;25590:35;;;;;;;25603:13;25590:35;;;;;;-1:-1:-1;;25590:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25590:35:0;;25603:13;;-1:-1:-1;;;;;25603:13:0;;25590:35;;25618:6;;25590:35;;;25618:6;25590:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:35::i;:::-;25576:49;;25649:6;25644:155;;25703:13;;25685:43;;;;;;;;;;;;25703:13;25721:6;;;25685:43;;;25703:13;25685:43;;;;;;-1:-1:-1;;25685:43:0;;;;;;;;;;;25703:13;;-1:-1:-1;;;;;25703:13:0;;25685:43;;;;25721:6;;25685:43;;;;;25721:6;;25685:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25751:28;;;-1:-1:-1;;;25751:28:0;;;;;;;;;;;;-1:-1:-1;;;25751:28:0;;;;;;;;;;;;;;25644:155;25542:272;;-1:-1:-1;25468:3:0;;25426:399;;;;25844:12;;25837:19;;;;;24103:1761;;;;:::o;26090:260::-;3316:12;:10;:12::i;:::-;3306:6;;-1:-1:-1;;;;;3306:6:0;;;:22;;;3298:67;;;;;-1:-1:-1;;;3298:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3298:67:0;;;;;;;;;;;;;;;26225:116:::1;::::0;;::::1;::::0;::::1;::::0;;26261:4:::1;26225:116:::0;;;-1:-1:-1;;;;;26225:116:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;26207:12:::1;:135:::0;;;;::::1;::::0;;-1:-1:-1;26207:135:0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;::::1;;;-1:-1:-1::0;;;;;;26207:135:0;::::1;;-1:-1:-1::0;;26207:135:0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;;;26225:116;;26207:135;;::::1;::::0;;;;;;;::::1;::::0;::::1;:::i;:::-;;;;26090:260:::0;;:::o;30722:87::-;30791:10;;30722:87;:::o;20251:42::-;;;;;;;;;;;;;:::o;30817:390::-;30869:14;30886:12;:10;:12::i;:::-;-1:-1:-1;;;;;30918:19:0;;;;;;:11;:19;;;;;;30869:29;;-1:-1:-1;30918:19:0;;30917:20;30909:77;;;;-1:-1:-1;;;30909:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30998:15;31021:33;31032:7;31041:12;;31021:10;:33::i;:::-;-1:-1:-1;;;;;;;;;31083:15:0;;;;;;:7;:15;;;;;;30997:57;;-1:-1:-1;31083:28:0;;30997:57;31083:19;:28::i;:::-;-1:-1:-1;;;;;31065:15:0;;;;;;:7;:15;;;;;:46;31132:7;;:20;;31144:7;31132:11;:20::i;:::-;31122:7;:30;31176:10;;:23;;31191:7;31176:14;:23::i;:::-;31163:10;:36;-1:-1:-1;;;30817:390:0:o;20217:27::-;;;;:::o;23991:100::-;24071:12;;23991:100;:::o;23483:120::-;3316:12;:10;:12::i;:::-;3306:6;;-1:-1:-1;;;;;3306:6:0;;;:22;;;3298:67;;;;;-1:-1:-1;;;3298:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3298:67:0;;;;;;;;;;;;;;;23569:12:::1;:26:::0;23483:120::o;29762:313::-;29860:4;29877:36;29887:6;29895:9;29906:6;29877:9;:36::i;:::-;29924:121;29933:6;29941:12;:10;:12::i;:::-;29955:89;29993:6;29955:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29955:19:0;;;;;;:11;:19;;;;;;29975:12;:10;:12::i;:::-;-1:-1:-1;;;;;29955:33:0;;;;;;;;;;;;-1:-1:-1;29955:33:0;;;:89;:37;:89::i;:::-;29924:8;:121::i;:::-;-1:-1:-1;30063:4:0;29762:313;;;;;:::o;19876:27::-;;;;:::o;19952:35::-;;;;:::o;20119:32::-;;;;:::o;31690:253::-;31756:7;31795;;31784;:18;;31776:73;;;;-1:-1:-1;;;31776:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31860:19;31883:10;:8;:10::i;:::-;31860:33;-1:-1:-1;31911:24:0;:7;31860:33;31911:11;:24::i;:::-;31904:31;31690:253;-1:-1:-1;;;31690:253:0:o;7715:83::-;7781:9;;;;7715:83;:::o;20191:19::-;;;;;;:::o;30083:227::-;30180:4;30197:83;30206:12;:10;:12::i;:::-;30220:7;30229:50;30268:10;30229:11;:25;30241:12;:10;:12::i;:::-;-1:-1:-1;;;;;30229:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;30229:25:0;;;:34;;;;;;;;;;;:38;:50::i;19916:23::-;;;-1:-1:-1;;;;;19916:23:0;;:::o;19994:31::-;;;;:::o;26502:378::-;3316:12;:10;:12::i;:::-;3306:6;;-1:-1:-1;;;;;3306:6:0;;;:22;;;3298:67;;;;;-1:-1:-1;;;3298:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3298:67:0;;;;;;;;;;;;;;;26610:12:::1;:19:::0;26602:27;::::1;26594:59;;;::::0;;-1:-1:-1;;;26594:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26594:59:0;;;;;;;;;;;;;::::1;;26673:13;::::0;;;:6:::1;:13;::::0;;;;;::::1;;26672:14;26664:42;;;::::0;;-1:-1:-1;;;26664:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26664:42:0;;;;;;;;;;;;;::::1;;26731:12;:19:::0;-1:-1:-1;;26731:23:0;26723:31;::::1;26719:123;;;26793:12;26806:19:::0;;-1:-1:-1;;26806:23:0;;;26793:37;::::1;;;;;;;;;;;;;;;26771:12;26784:5;26771:19;;;;;;;;;::::0;;;::::1;::::0;;;:59;;:19:::1;::::0;;::::1;::::0;;::::1;:59:::0;;-1:-1:-1;;26771:59:0::1;;::::0;;::::1;;;::::0;;;::::1;::::0;;;;;-1:-1:-1;;;;;;26771:59:0;;::::1;;::::0;;;::::1;-1:-1:-1::0;;;;;26771:59:0::1;::::0;::::1;;::::0;;-1:-1:-1;26771:59:0;;::::1;::::0;;:19;;:59:::1;::::0;;;::::1;::::0;;;;::::1;;::::0;;::::1;-1:-1:-1::0;;26771:59:0;;;::::1;;;:::i;:::-;-1:-1:-1::0;;;26719:123:0::1;26854:12;:18;;;;;;;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;26854:18:0;;;;;::::1;;::::0;;-1:-1:-1;;;;;;26854:18:0;;;;::::1;;::::0;::::1;::::0;::::1;:::i;:::-;;;;;26502:378:::0;:::o;20351:41::-;;;-1:-1:-1;;;;;20351:41:0;;:::o;23615:364::-;3316:12;:10;:12::i;:::-;3306:6;;-1:-1:-1;;;;;3306:6:0;;;:22;;;3298:67;;;;;-1:-1:-1;;;3298:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3298:67:0;;;;;;;;;;;;;;;23741:15:::1;::::0;:20;23733:58:::1;;;::::0;;-1:-1:-1;;;23733:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;23812:20;:37:::0;;;;23860:16:::1;:29:::0;23900:20:::1;:37:::0;23968:3:::1;23950:15;:21:::0;23615:364::o;20158:26::-;;;;:::o;27062:246::-;3316:12;:10;:12::i;:::-;3306:6;;-1:-1:-1;;;;;3306:6:0;;;:22;;;3298:67;;;;;-1:-1:-1;;;3298:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3298:67:0;;;;;;;;;;;;;;;27188:12:::1;:19:::0;27180:27;::::1;27172:80;;;;-1:-1:-1::0;;;27172:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27293:7;27263:12;27276:5;27263:19;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:37:::0;;-1:-1:-1;;27263:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;;27062:246:0:o;29061:198::-;-1:-1:-1;;;;;29151:20:0;;29127:7;29151:20;;;:11;:20;;;;;;;;29147:49;;;-1:-1:-1;;;;;;29180:16:0;;;;;;:7;:16;;;;;;29173:23;;29147:49;-1:-1:-1;;;;;29234:16:0;;;;;;:7;:16;;;;;;29214:37;;:19;:37::i;3393:148::-;3316:12;:10;:12::i;:::-;3306:6;;-1:-1:-1;;;;;3306:6:0;;;:22;;;3298:67;;;;;-1:-1:-1;;;3298:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3298:67:0;;;;;;;;;;;;;;;3484:6:::1;::::0;3463:40:::1;::::0;3500:1:::1;::::0;-1:-1:-1;;;;;3484:6:0::1;::::0;3463:40:::1;::::0;3500:1;;3463:40:::1;3514:6;:19:::0;;-1:-1:-1;;;;;;3514:19:0::1;::::0;;3393:148::o;20032:35::-;;;;:::o;20451:903::-;1491:12;;;;;;;;:31;;;1507:15;:13;:15::i;:::-;1491:47;;;-1:-1:-1;1527:11:0;;;;1526:12;1491:47;1483:106;;;;-1:-1:-1;;;1483:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1598:19;1621:12;;;;;;1620:13;1640:83;;;;1669:12;:19;;-1:-1:-1;;;;1669:19:0;;;;;1697:18;1684:4;1697:18;;;1640:83;20526:34:::1;;;;;;;;;;;;;;-1:-1:-1::0;;;20526:34:0::1;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;20526:34:0::1;;::::0;:12:::1;:34::i;:::-;20571:31;19799:1;20571:14;:31::i;:::-;20613:16;:14;:16::i;:::-;20665;20650:12;:31:::0;-1:-1:-1;;20693:7:0::1;:38:::0;20763:12:::1;:10;:12::i;:::-;20752:8;:23:::0;;-1:-1:-1;;;;;;20752:23:0::1;-1:-1:-1::0;;;;;20752:23:0;;;::::1;::::0;;;::::1;::::0;;20811:3:::1;20796:12;:18:::0;20862:7:::1;::::0;20853:4:::1;-1:-1:-1::0;20837:22:0;;;:7:::1;:22;::::0;;;;;;;:32;;;;20921:12:::1;::::0;20885:49;;;;;;;20853:4;;-1:-1:-1;;20885:49:0::1;::::0;;;;;;;;::::1;20967:10;20947:17;:30:::0;20988:7:::1;:15:::0;;-1:-1:-1;;20988:15:0::1;::::0;;21028:9:::1;21014:11;:23:::0;21063:4:::1;21048:12;:19:::0;21088:28:::1;21103:12;:10;:12::i;:::-;21088:14;:28::i;:::-;21127:29;21150:4;21127:14;:29::i;:::-;21177:15;:80:::0;;-1:-1:-1;;;;;;21177:80:0;;::::1;21214:42;21177:80;::::0;;;21268:14:::1;:78:::0;;;;::::1;21303:42;21268:78;::::0;;1741:57;;;;1785:5;1770:20;;-1:-1:-1;;1770:20:0;;;1741:57;20451:903;:::o;20399:39::-;;;-1:-1:-1;;;;;20399:39:0;;:::o;27423:137::-;27533:12;:19;27423:137;:::o;7620:87::-;7692:7;7685:14;;;;;;;;-1:-1:-1;;7685:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7659:13;;7685:14;;7692:7;;7685:14;;7692:7;7685:14;;;;;;;;;;;;;;;;;;;;;;;;31215:467;31305:7;31344:12;;31333:7;:23;;31325:67;;;;;-1:-1:-1;;;31325:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31408:17;31403:272;;31443:15;31466:33;31477:7;31486:12;;31466:10;:33::i;:::-;-1:-1:-1;31442:57:0;;-1:-1:-1;31514:14:0;;-1:-1:-1;;;;31514:14:0;31403:272;31563:23;31593:33;31604:7;31613:12;;31593:10;:33::i;:::-;-1:-1:-1;31561:65:0;;-1:-1:-1;31641:22:0;;-1:-1:-1;;;;31641:22:0;19200:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19200:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19200:33:0;;;;-1:-1:-1;;;;;19200:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30318:278::-;30420:4;30437:129;30446:12;:10;:12::i;:::-;30460:7;30469:96;30508:15;30469:96;;;;;;;;;;;;;;;;;:11;:25;30481:12;:10;:12::i;:::-;-1:-1:-1;;;;;30469:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;30469:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;29267:167::-;29345:4;29362:42;29372:12;:10;:12::i;:::-;29386:9;29397:6;29362:9;:42::i;20300:38::-;;;;;;;;;;;;;;;:::o;30604:110::-;-1:-1:-1;;;;;30686:20:0;30662:4;30686:20;;;:11;:20;;;;;;;;;30604:110::o;23377:94::-;3316:12;:10;:12::i;:::-;3306:6;;-1:-1:-1;;;;;3306:6:0;;;:22;;;3298:67;;;;;-1:-1:-1;;;3298:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3298:67:0;;;;;;;;;;;;;;;23442:14:::1;::::0;;;:6:::1;:14;::::0;;;;:21;;-1:-1:-1;;23442:21:0::1;23459:4;23442:21;::::0;;23377:94::o;29442:143::-;-1:-1:-1;;;;;29550:18:0;;;29523:7;29550:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;29442:143::o;23269:95::-;3316:12;:10;:12::i;:::-;3306:6;;-1:-1:-1;;;;;3306:6:0;;;:22;;;3298:67;;;;;-1:-1:-1;;;3298:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3298:67:0;;;;;;;;;;;;;;;23338:8:::1;:18:::0;;-1:-1:-1;;;;;;23338:18:0::1;-1:-1:-1::0;;;;;23338:18:0;;;::::1;::::0;;;::::1;::::0;;23269:95::o;31951:330::-;3316:12;:10;:12::i;:::-;3306:6;;-1:-1:-1;;;;;3306:6:0;;;:22;;;3298:67;;;;;-1:-1:-1;;;3298:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3298:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32031:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;32030:21;32022:61;;;::::0;;-1:-1:-1;;;32022:61:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;32097:16:0;::::1;32116:1;32097:16:::0;;;:7:::1;:16;::::0;;;;;:20;32094:108:::1;;-1:-1:-1::0;;;;;32173:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;32153:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;32134:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;32094:108:::1;-1:-1:-1::0;;;;;32212:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;32212:27:0::1;32235:4;32212:27:::0;;::::1;::::0;;;32250:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;32250:23:0::1;::::0;;::::1;::::0;;31951:330::o;3549:244::-;3316:12;:10;:12::i;:::-;3306:6;;-1:-1:-1;;;;;3306:6:0;;;:22;;;3298:67;;;;;-1:-1:-1;;;3298:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3298:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;3638:22:0;::::1;3630:73;;;;-1:-1:-1::0;;;3630:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3740:6;::::0;3719:38:::1;::::0;-1:-1:-1;;;;;3719:38:0;;::::1;::::0;3740:6:::1;::::0;3719:38:::1;::::0;3740:6:::1;::::0;3719:38:::1;3768:6;:17:::0;;-1:-1:-1;;;;;;3768:17:0::1;-1:-1:-1::0;;;;;3768:17:0;;;::::1;::::0;;;::::1;::::0;;3549:244::o;32289:476::-;3316:12;:10;:12::i;:::-;3306:6;;-1:-1:-1;;;;;3306:6:0;;;:22;;;3298:67;;;;;-1:-1:-1;;;3298:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3298:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32368:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;32360:60;;;::::0;;-1:-1:-1;;;32360:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;32436:9;32431:327;32455:9;:16:::0;32451:20;::::1;32431:327;;;32513:7;-1:-1:-1::0;;;;;32497:23:0::1;:9;32507:1;32497:12;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;32497:12:0::1;:23;32493:254;;;32556:9;32566:16:::0;;-1:-1:-1;;32566:20:0;;;32556:31;::::1;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;32541:9:::1;:12:::0;;-1:-1:-1;;;;;32556:31:0;;::::1;::::0;32551:1;;32541:12;::::1;;;;;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;32541:46:0::1;-1:-1:-1::0;;;;;32541:46:0;;::::1;;::::0;;32606:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;32645:11:::1;:20:::0;;;;:28;;-1:-1:-1;;32645:28:0::1;::::0;;32692:9:::1;:15:::0;;;::::1;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;32692:15:0;;;;;-1:-1:-1;;;;;;32692:15:0::1;::::0;;;;;32726:5:::1;;32493:254;32473:3;;32431:327;;;;32289:476:::0;:::o;5489:189::-;5575:7;5610:12;5603:5;5595:28;;;;-1:-1:-1;;;5595:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5634:9;5650:1;5646;:5;;;;;;;5489:189;-1:-1:-1;;;;;5489:189:0:o;4887:192::-;4973:7;5009:12;5001:6;;;;4993:29;;;;-1:-1:-1;;;4993:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5045:5:0;;;4887:192::o;35915:619::-;36039:15;36056:23;36081:12;36095:23;36120:12;36136:32;36147:7;36156:11;36136:10;:32::i;:::-;-1:-1:-1;;;;;36197:15:0;;;;;;:7;:15;;;;;;36038:130;;-1:-1:-1;36038:130:0;;-1:-1:-1;36038:130:0;;-1:-1:-1;36038:130:0;-1:-1:-1;36038:130:0;-1:-1:-1;36197:28:0;;36217:7;36197:19;:28::i;:::-;-1:-1:-1;;;;;36179:15:0;;;;;;:7;:15;;;;;;;;:46;;;;36254:7;:15;;;;:28;;36274:7;36254:19;:28::i;:::-;-1:-1:-1;;;;;36236:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;36314:18;;;;;:7;:18;;;;;:39;;36337:15;36314:22;:39::i;:::-;-1:-1:-1;;;;;36293:18:0;;;;;;:7;:18;;;;;;;;:60;;;;36385:7;:18;;;;:39;;36408:15;36385:22;:39::i;:::-;-1:-1:-1;;;;;36364:18:0;;;;;;:7;:18;;;;;:60;36443:23;36455:4;36461;36443:11;:23::i;:::-;36499:9;-1:-1:-1;;;;;36482:44:0;36491:6;-1:-1:-1;;;;;36482:44:0;;36510:15;36482:44;;;;;;;;;;;;;;;;;;35915:619;;;;;;;;;:::o;35364:543::-;35488:15;35505:23;35530:12;35544:23;35569:12;35585:32;35596:7;35605:11;35585:10;:32::i;:::-;-1:-1:-1;;;;;35646:15:0;;;;;;:7;:15;;;;;;35487:130;;-1:-1:-1;35487:130:0;;-1:-1:-1;35487:130:0;;-1:-1:-1;35487:130:0;-1:-1:-1;35487:130:0;-1:-1:-1;35646:28:0;;35666:7;35646:19;:28::i;:::-;-1:-1:-1;;;;;35628:15:0;;;;;;:7;:15;;;;;;;;:46;;;;35703:7;:15;;;;:28;;35723:7;35703:19;:28::i;:::-;-1:-1:-1;;;;;35685:15:0;;;;;;;:7;:15;;;;;;:46;;;;35763:18;;;;;;;:39;;35786:15;35763:22;:39::i;34793:563::-;34915:15;34932:23;34957:12;34971:23;34996:12;35012:32;35023:7;35032:11;35012:10;:32::i;:::-;-1:-1:-1;;;;;35073:15:0;;;;;;:7;:15;;;;;;34914:130;;-1:-1:-1;34914:130:0;;-1:-1:-1;34914:130:0;;-1:-1:-1;34914:130:0;-1:-1:-1;34914:130:0;-1:-1:-1;35073:28:0;;34914:130;35073:19;:28::i;34299:486::-;34419:15;34436:23;34461:12;34475:23;34500:12;34516:32;34527:7;34536:11;34516:10;:32::i;:::-;-1:-1:-1;;;;;34577:15:0;;;;;;:7;:15;;;;;;34418:130;;-1:-1:-1;34418:130:0;;-1:-1:-1;34418:130:0;;-1:-1:-1;34418:130:0;-1:-1:-1;34418:130:0;-1:-1:-1;34577:28:0;;34418:130;34577:19;:28::i;2253:106::-;2341:10;2253:106;:::o;32773:347::-;-1:-1:-1;;;;;32876:19:0;;32868:68;;;;-1:-1:-1;;;32868:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32955:21:0;;32947:68;;;;-1:-1:-1;;;32947:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33028:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;33080:32;;;;;;;;;;;;;;;;;32773:347;;;:::o;4554:181::-;4612:7;4644:5;;;4668:6;;;;4660:46;;;;;-1:-1:-1;;;4660:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;993:171;1049:7;1086:1;1077:5;:10;;1069:55;;;;;-1:-1:-1;;;1069:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1150:5:0;993:171::o;27803:1250::-;27901:4;27923:11;28163:4;28157:11;28291:2;28285:4;28281:13;28938:1;28906:13;28814:4;28808:11;28778;28733:1;28703:11;28674:5;28667;28663:17;28320:691;28310:701;27803:1250;-1:-1:-1;;;;;;27803:1250:0:o;36697:445::-;36777:7;36786;36795;36804;36813;36834:23;36859:12;36875:33;36887:7;36896:11;36875;:33::i;:::-;36833:75;;;;36919:19;36942:10;:8;:10::i;:::-;36919:33;;36964:15;36981:23;37006:12;37022:39;37034:7;37043:4;37049:11;37022;:39::i;:::-;36963:98;;;;-1:-1:-1;36963:98:0;;-1:-1:-1;37112:15:0;;-1:-1:-1;37129:4:0;;-1:-1:-1;36697:445:0;;-1:-1:-1;;;;;;;36697:445:0:o;37763:163::-;37804:7;37825:15;37842;37861:19;:17;:19::i;:::-;37824:56;;-1:-1:-1;37824:56:0;-1:-1:-1;37898:20:0;37824:56;;37898:11;:20::i;:::-;37891:27;;;;37763:163;:::o;1809:174::-;1892:4;1938:17;1970:7;1809:174;:::o;7152:177::-;1491:12;;;;;;;;:31;;;1507:15;:13;:15::i;:::-;1491:47;;;-1:-1:-1;1527:11:0;;;;1526:12;1491:47;1483:106;;;;-1:-1:-1;;;1483:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1598:19;1621:12;;;;;;1620:13;1640:83;;;;1669:12;:19;;-1:-1:-1;;;;1669:19:0;;;;;1697:18;1684:4;1697:18;;;1640:83;7248:26:::1;:24;:26::i;:::-;7285:36;7308:4;7314:6;7285:22;:36::i;:::-;1745:14:::0;1741:57;;;1785:5;1770:20;;-1:-1:-1;;1770:20:0;;;7152:177;;;:::o;10317:90::-;10378:9;:21;;-1:-1:-1;;10378:21:0;;;;;;;;;;;;10317:90::o;2836:129::-;1491:12;;;;;;;;:31;;;1507:15;:13;:15::i;:::-;1491:47;;;-1:-1:-1;1527:11:0;;;;1526:12;1491:47;1483:106;;;;-1:-1:-1;;;1483:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1598:19;1621:12;;;;;;1620:13;1640:83;;;;1669:12;:19;;-1:-1:-1;;;;1669:19:0;;;;;1697:18;1684:4;1697:18;;;1640:83;2894:26:::1;:24;:26::i;:::-;2931;:24;:26::i;:::-;1745:14:::0;1741:57;;;1785:5;1770:20;;-1:-1:-1;;1770:20:0;;;2836:129;:::o;36542:147::-;36620:7;;:17;;36632:4;36620:11;:17::i;:::-;36610:7;:27;36661:10;;:20;;36676:4;36661:14;:20::i;:::-;36648:10;:33;-1:-1:-1;;36542:147:0:o;37150:263::-;37231:7;;;37275:35;37304:5;37275:24;:7;37287:11;37275;:24::i;:35::-;37260:50;-1:-1:-1;37321:23:0;37347:17;:7;37260:50;37347:11;:17::i;:::-;37321:43;37400:4;;-1:-1:-1;37150:263:0;;-1:-1:-1;;;;37150:263:0:o;37421:334::-;37516:7;;;;37572:24;:7;37584:11;37572;:24::i;:::-;37554:42;-1:-1:-1;37607:12:0;37622:21;:4;37631:11;37622:8;:21::i;:::-;37607:36;-1:-1:-1;37654:23:0;37680:17;:7;37607:36;37680:11;:17::i;:::-;37716:7;;;;-1:-1:-1;37742:4:0;;-1:-1:-1;37421:334:0;;-1:-1:-1;;;;;37421:334:0:o;37934:581::-;38031:7;;38067:12;;37984:7;;;;;38096:294;38120:9;:16;38116:20;;38096:294;;;38186:7;38162;:21;38170:9;38180:1;38170:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38170:12:0;38162:21;;;;;;;;;;;;;:31;;:66;;;38221:7;38197;:21;38205:9;38215:1;38205:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38205:12:0;38197:21;;;;;;;;;;;;;:31;38162:66;38158:102;;;38238:7;;38247:12;;38230:30;;;;;;;;;38158:102;38285:34;38297:7;:21;38305:9;38315:1;38305:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38305:12:0;38297:21;;;;;;;;;;;;;38285:7;;:11;:34::i;:::-;38275:44;;38344:34;38356:7;:21;38364:9;38374:1;38364:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38364:12:0;38356:21;;;;;;;;;;;;;38344:7;;:11;:34::i;:::-;38334:44;-1:-1:-1;38138:3:0;;38096:294;;;-1:-1:-1;38426:12:0;;38414:7;;:25;;:11;:25::i;:::-;38404:7;:35;38400:71;;;38449:7;;38458:12;;38441:30;;;;;;;;38400:71;38490:7;;-1:-1:-1;38499:7:0;-1:-1:-1;37934:581:0;;;:::o;2180:65::-;1491:12;;;;;;;;:31;;;1507:15;:13;:15::i;:::-;1491:47;;;-1:-1:-1;1527:11:0;;;;1526:12;1491:47;1483:106;;;;-1:-1:-1;;;1483:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1598:19;1621:12;;;;;;1620:13;1640:83;;;;1669:12;:19;;-1:-1:-1;;;;1669:19:0;;;;;1697:18;1684:4;1697:18;;;1745:14;1741:57;;;1785:5;1770:20;;-1:-1:-1;;1770:20:0;;;2180:65;:::o;7337:184::-;1491:12;;;;;;;;:31;;;1507:15;:13;:15::i;:::-;1491:47;;;-1:-1:-1;1527:11:0;;;;1526:12;1491:47;1483:106;;;;-1:-1:-1;;;1483:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1598:19;1621:12;;;;;;1620:13;1640:83;;;;1669:12;:19;;-1:-1:-1;;;;1669:19:0;;;;;1697:18;1684:4;1697:18;;;1640:83;7447:12;;::::1;::::0;:5:::1;::::0;:12:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;7470:16:0;;::::1;::::0;:7:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;7497:9:0::1;:14:::0;;-1:-1:-1;;7497:14:0::1;7509:2;7497:14;::::0;;1741:57;;;;1785:5;1770:20;;-1:-1:-1;;1770:20:0;;;7337:184;;;:::o;2973:198::-;1491:12;;;;;;;;:31;;;1507:15;:13;:15::i;:::-;1491:47;;;-1:-1:-1;1527:11:0;;;;1526:12;1491:47;1483:106;;;;-1:-1:-1;;;1483:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1598:19;1621:12;;;;;;1620:13;1640:83;;;;1669:12;:19;;-1:-1:-1;;;;1669:19:0;;;;;1697:18;1684:4;1697:18;;;1640:83;3041:17:::1;3061:12;:10;:12::i;:::-;3084:6;:18:::0;;-1:-1:-1;;;;;;3084:18:0::1;-1:-1:-1::0;;;;;3084:18:0;::::1;::::0;;::::1;::::0;;;3118:43:::1;::::0;3084:18;;-1:-1:-1;3084:18:0;-1:-1:-1;;3118:43:0::1;::::0;-1:-1:-1;;3118:43:0::1;1731:1;1745:14:::0;1741:57;;;1785:5;1770:20;;-1:-1:-1;;1770:20:0;;;2973:198;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

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