ETH Price: $2,341.03 (-0.69%)

Token

White Rabbit (RBT)
 

Overview

Max Total Supply

100,000,000 RBT

Holders

297

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
midcurver.eth
Balance
37,596.77252604448997231 RBT

Value
$0.00
0x36c9b4ef975fc652485dcfc70a6e7eb4ab71aa77
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:
WhiteRabbit

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-03
*/

// SPDX-License-Identifier: CC-BY-ND-4.0

pragma solidity ^0.8.18;

/*

Beware of scammers!
Follow the only legit WhiteRabbit on:

+++ whiterabbit.click +++
+++ whiterabbit.click +++

FoLlOw ThE WhItE RabbIt

    .-.
   (o.o)
    |=|
   __|__
 //.=|=.\\

 ReD pIll (buy): you will discover the truth and you will discover 
              how deep the rabbit hole goes.

 BlUe pIll (not buy): you will wake up in your bed and believe whatever you want to believe.

*/

// ANCHOR NFT Library for Rabbit NFTs
interface rabbitNFT {
    // On chain metadata
    function getMetadata(uint256 id) external view returns (string memory);
    function getMetadataURI(uint256 id) external view returns (string memory);
    // Normal ERC721 functions
    function mint(address to, uint256 id) external;
    function burn(uint256 id) external;
    function ownerOf(uint256 id) external view returns (address);
    function transferFrom(address from, address to, uint256 id) external;
    function safeTransferFrom(address from, address to, uint256 id) external;
    function safeTransferFrom(address from, address to, uint256 id, bytes calldata data) external;
    function balanceOf(address owner) external view returns (uint256);
    function setApprovalForAll(address operator, bool approved) external;
    function isApprovedForAll(address owner, address operator) external view returns (bool);
    function getApproved(uint256 id) external view returns (address);
}

// ANCHOR Protection library
contract protected {
    mapping (address => bool) is_auth;
    function authorized(address addy) public view returns(bool) {
        return is_auth[addy];
    }
    function set_authorized(address addy, bool booly) public onlyAuth {
        is_auth[addy] = booly;
    }
    modifier onlyAuth() {
        require( is_auth[msg.sender] || msg.sender==owner, "not owner");
        _;
    }
    address owner;
    modifier onlyOwner() {
        require(msg.sender==owner, "not owner");
        _;
    }
    bool locked;
    modifier safe() {
        require(!locked, "reentrant");
        locked = true;
        _;
        locked = false;
    }
    function change_owner(address new_owner) public onlyAuth {
        owner = new_owner;
    }
    receive() external payable {}
    fallback() external payable {}
}

// ANCHOR IERC20 interface
interface IERC20 {

    /// @param _owner The address from which the balance will be retrieved
    /// @return balance the balance
    function balanceOf(address _owner) external view returns (uint256 balance);

    /// @notice send `_value` token to `_to` from `msg.sender`
    /// @param _to The address of the recipient
    /// @param _value The amount of token to be transferred
    /// @return success Whether the transfer was successful or not
    function transfer(address _to, uint256 _value) external returns (bool success);

    /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`
    /// @param _from The address of the sender
    /// @param _to The address of the recipient
    /// @param _value The amount of token to be transferred
    /// @return success Whether the transfer was successful or not
    function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);

    /// @notice `msg.sender` approves `_addr` to spend `_value` tokens
    /// @param _spender The address of the account able to transfer the tokens
    /// @param _value The amount of wei to be approved for transfer
    /// @return success Whether the approval was successful or not
    function approve(address _spender, uint256 _value) external returns (bool success);

    /// @param _owner The address of the account owning tokens
    /// @param _spender The address of the account able to transfer the tokens
    /// @return remaining Amount of remaining tokens allowed to spent
    function allowance(address _owner, address _spender) external view returns (uint256 remaining);

    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

// ANCHOR PancakeSwap interface
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 IUniswapV2Factory {
  event PairCreated(address indexed token0, address indexed token1, address pair, uint);

  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 feeTo() external view returns (address);
  function feeToSetter() external view returns (address);

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

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

// ANCHOR Main contract
contract WhiteRabbit is protected, IERC20 {

    IUniswapV2Router02 public router;
    IUniswapV2Pair public pair;
    address public pairAddress;
    address public routerAddress;

    address public nft_rabbit;

    // ANCHOR Public variables
    string public name = "White Rabbit";
    string public symbol = "RBT";
    uint8 public decimals = 18;
    uint256 public totalSupply = 100 * 10**6 * 10**decimals; // 100.000.000 + 18 decimals
    uint public swapTreshold = totalSupply / 2000; // 0.05% of total supply
    bool public inSwap;

    // ANCHOR Lists controls
    uint8 whitelistedList = 0;
    uint8 normalList = 1;
    uint8 specialList = 2;
    mapping (address => uint8) public list;
    mapping (address => bool) public blacklisted;

    // ANCHOR Special lists
    mapping (address => bool) public isExcludedFromCooldown;

    // ANCHOR Balances and allowances
    mapping (address => uint256) public _balances;
    mapping (address => mapping (address => uint256)) public _allowances;
    uint public revenueAccrued; // In tokens
    uint public liquidityAccrued; // In tokens
    uint public revenueBalance; // In eth

    // SECTION Controls
    bool public swapEnabled = false;
    bool public cooldownEnabled = true;
    mapping (address => uint) public lastTxTime;
    // !SECTION Controls

    // SECTION Limits
    struct LIMITS {
        uint cooldownTimerInterval;
        uint maxWallet;
        uint maxSale;
        uint maxTx;
    }

    LIMITS[4] public limits;
    // !SECTION Limits

    // SECTION Fees
    struct FEES {
        uint buy;
        uint transfer;
        uint sell;

        uint liquidityShare;
        uint burnShare;
        uint revenueShare;
    }
    mapping (uint8 => FEES) public fees;
    // !SECTION Fees

    // ANCHOR Private variables


    // ANCHOR Constructor
    constructor() {
        // Ownership
        owner = msg.sender;
        is_auth[owner] = true;
        list[owner] = whitelistedList;
        _balances[owner] = totalSupply;
        emit Transfer(address(0), owner, totalSupply);

        // Defining the router
        routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // BSC
        router = IUniswapV2Router02(routerAddress); // BSC
        // Creating a BNB - TOKEN pair
        pairAddress = IUniswapV2Factory(router.factory()).createPair(router.WETH(), address(this));
        pair = IUniswapV2Pair(pairAddress);

        // NOTE Limits definition (cooldownTimerInterval, maxWallet, maxSale)
        limits[normalList] = LIMITS(2 seconds,
                                    100 * 10**6 * 10**decimals, // 100%
                                    100 * 10**6 * 10**decimals, // 100%
                                    100 * 10**6 * 10**decimals // 100%
                                    );
        limits[whitelistedList] = LIMITS(0 seconds,
                                        100 * 10**6 * 10**decimals, // 100%
                                        100 * 10**6 * 10**decimals, // 100%
                                        100 * 10**6 * 10**decimals // 100%
                                        );
        limits[specialList] = LIMITS(2 seconds,
                                        100 * 10**6 * 10**decimals, // 100%
                                        100 * 10**6 * 10**decimals, // 100%
                                        100 * 10**6 * 10**decimals // 100%
                                        );

        
        // NOTE Fees definition (buy, transfer, sell, liquidityShare, burnShare, revenueShare)
        fees[whitelistedList] = FEES(0, 0, 0, 0, 0, 0);
        fees[normalList] = FEES(0, 1, 9, 33, 33, 34);
        fees[specialList] = FEES(0, 0, 1, 0, 0, 100);

        // Unlock sell lock for the addresses that need it
        isExcludedFromCooldown[owner] = true;
        isExcludedFromCooldown[address(this)] = true;
        isExcludedFromCooldown[address(pair)] = true;
        isExcludedFromCooldown[routerAddress] = true;
    }

    // ANCHOR Public Methods

    function transfer(address _to, uint256 _value) public override returns (bool success) {
        _transfer(msg.sender, _to, _value, msg.sender);
        return true;
    }

    function transferFrom(address _from, address _to, uint256 _value) public override returns (bool success) {
        require(_allowances[_from][msg.sender] >= _value, "TOKEN: Not enough allowance");
        _allowances[_from][msg.sender] -= _value;
        _transfer(_from, _to, _value, msg.sender);
        return true;
    }

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

    function approve(address _spender, uint256 _value) public override returns (bool success) {
        require(msg.sender != _spender, "TOKEN: Approve to yourself");
        _allowances[msg.sender][_spender] = _value;
        return true;
    }

    function allowance(address _owner, address _spender) public view override returns (uint256 remaining) {
        return _allowances[_owner][_spender];
    }

    function mint(uint _amount) public onlyOwner {
        totalSupply += _amount;
        _balances[owner] += _amount;
        emit Transfer(address(0), owner, _amount);
    }

    function burn(uint _amount) public onlyOwner {
        _burnTokens(_amount);
    }

    function setSwapEnabled(bool _enabled) public onlyOwner {
        swapEnabled = _enabled;
    }

    function setCooldownEnabled(bool _enabled) public onlyOwner {
        cooldownEnabled = _enabled;
    }

    // SECTION Setters
    // NOTE Setters for the cooldown timer interval
    function setCooldownTimerInterval(uint _list, uint _interval) public onlyOwner {
        require(_interval >= 1 seconds, "TOKEN: Interval must be at least 1 second");
        require(_interval <= 1 minutes, "TOKEN: Interval must be at most 1 minute");
        require(_list >= 0 && _list <= 3, "TOKEN: List must be between 0 and 3");
        limits[_list].cooldownTimerInterval = _interval;
    }

    // NOTE Setters for the max wallet
    function setMaxWallet(uint _list, uint _maxWallet) public onlyOwner {
        require(_maxWallet >= 1 * 10**4 * 10**decimals, "TOKEN: Max wallet must be at least 10 thousand");
        require(_maxWallet <= 2 * 10**6 * 10**decimals, "TOKEN: Max wallet must be at most 2 million");
        require(_list >= 0 && _list <= 3, "TOKEN: List must be between 0 and 3");
        limits[_list].maxWallet = _maxWallet;
    }

    // NOTE Setters for the max sale
    function setMaxSale(uint _list, uint _maxSale) public onlyOwner {
        require(_maxSale >= 1 * 10**3 * 10**decimals, "TOKEN: Max sale must be at least 1 thousand");
        require(_list >= 0 && _list <= 3, "TOKEN: List must be between 0 and 3");
        limits[_list].maxSale = _maxSale;
    }

    // NOTE Setters for the buy fee
    function setBuyFee(uint8 _list, uint _buyFee) public onlyOwner {
        require(_buyFee >= 0 && _buyFee <= 49, "TOKEN: Buy fee must be between 0 and 100");
        require(_list >= 0 && _list <= 3, "TOKEN: List must be between 0 and 3");
        fees[_list].buy = _buyFee;
    }

    // NOTE Setters for the transfer fee
    function setTransferFee(uint8 _list, uint _transferFee) public onlyOwner {
        require(_transferFee >= 0 && _transferFee <= 49, "TOKEN: Transfer fee must be between 0 and 100");
        require(_list >= 0 && _list <= 3, "TOKEN: List must be between 0 and 3");
        fees[_list].transfer = _transferFee;
    }

    // NOTE Setters for the sell fee
    function setSellFee(uint8 _list, uint _sellFee) public onlyOwner {
        require(_sellFee >= 0 && _sellFee <= 49, "TOKEN: Sell fee must be between 0 and 100");
        require(_list >= 0 && _list <= 3, "TOKEN: List must be between 0 and 3");
        fees[_list].sell = _sellFee;
    }

    // NOTE Setters for the liquidity share fee
    function setLiquidityShareFee(uint8 _list, uint _liquidityShareFee) public onlyOwner {
        require(_liquidityShareFee >= 0 && _liquidityShareFee <= 100, "TOKEN: Liquidity share fee must be between 0 and 100");
        require(_list >= 0 && _list <= 3, "TOKEN: List must be between 0 and 3");
        fees[_list].liquidityShare = _liquidityShareFee;
    }

    // NOTE Setters for the burn share fee
    function setBurnShareFee(uint8 _list, uint _burnShareFee) public onlyOwner {
        require(_burnShareFee >= 0 && _burnShareFee <= 100, "TOKEN: Burn share fee must be between 0 and 100");
        require(_list >= 0 && _list <= 3, "TOKEN: List must be between 0 and 3");
        fees[_list].burnShare = _burnShareFee;
    }

    // NOTE Setters for the revenue share fee
    function setRevenueShareFee(uint8 _list, uint _revenueShareFee) public onlyOwner {
        require(_revenueShareFee >= 0 && _revenueShareFee <= 100, "TOKEN: Marketing share fee must be between 0 and 100");
        require(_list >= 0 && _list <= 3, "TOKEN: List must be between 0 and 3");
        fees[_list].revenueShare = _revenueShareFee;
    }

    // NOTE Setters for the swap treshold
    function setSwapTreshold(uint _swapTreshold) public onlyOwner {
         swapTreshold = _swapTreshold;
    }
    // !SECTION Setters

    // SECTION Lists controls
    // NOTE Assigns a list to an address
    function setList(address _address, uint8 _list) public onlyOwner {
        require(_list >= 0 && _list <= 3, "TOKEN: List must be between 0 and 3");
        list[_address] = _list;
    }

    // NOTE Helper to remeber the list numbers
    function getListNumbers() public view returns (uint8 _normalList , 
                                                   uint8 _whitelist, 
                                                   uint8 _speciallist) {
        return (normalList, whitelistedList, specialList);
    }
    // !SECTION Lists controls

    // NOTE Assigns ownership to a new address
    function transferOwnership(address _newOwner) public onlyOwner {
        owner = _newOwner;
        is_auth[_newOwner] = true;
    }

    // NOTE Withdraws the contract balance to the owner
    function withdraw() public onlyOwner {
        (bool success,) = msg.sender.call{value: address(this).balance}("");
        require(success, "TOKEN: Transfer failed");
    }

    // NOTE Withdraws the revenue balance to the owner
    function withdrawRevenue() public onlyOwner {
        (bool success,) = msg.sender.call{value: revenueBalance}("");
        require(success, "TOKEN: Transfer failed");
        revenueBalance = 0;
    }

    // ANCHOR Private Methods

    // SECTION Swaps (with the router)
    function swapTokensForEth(uint _amount) internal returns(uint _gain) {
        if (! (_balances[address(this)] >= _amount) ) {
            revert("TOKEN: Not enough tokens to swap");
        }
        uint pre_bal = _balances[address(this)];
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
                _amount, 
                0, 
                path, 
                address(this),
                block.timestamp);
        uint post_bal = _balances[address(this)];
        _gain = post_bal - pre_bal;
        return _gain;
    }

    function swapEthForTokens(uint _amount) internal {
        if (! (address(this).balance >= _amount) ) {
            revert("TOKEN: Not enough ETH to swap");
        }
        address[] memory path = new address[](2);
        path[0] = router.WETH();
        path[1] = address(this);
        router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: _amount}(
                0, 
                path, 
                address(this),
                block.timestamp);
    }
    // !SECTION Swaps (with the router)

    function _transfer(address _from, address _to, uint _value, address txSender) private {
        // First we check if the sender is blacklisted
        if (blacklisted[txSender]) {
            revert("TOKEN: Sender is blacklisted");
        }
        // Then we check if the recipient is blacklisted
        if (blacklisted[_to]) {
            revert("TOKEN: Recipient is blacklisted");
        }
        // Then we determine if this tx is a buy or a sell or a transfer
        // REVIEW What if the recipient is the router or the pair?
        bool isBuy = (_from == routerAddress) || (_from == pairAddress);
        bool isSell = (_to == routerAddress) || (_to == pairAddress);
        bool isContractTransfer = (_from == address(this)) || (_to == address(this));
        bool isLiquidityTransfer = (isBuy && isSell);

        // Based on the tx type we determine the address to check the list from
        address listAddress = isBuy ? _to : _from;
        // Then we check if the address is whitelisted or the tx is to exclude
        bool isExcluded = isContractTransfer || isLiquidityTransfer ||
                          list[_from] == whitelistedList || list[_to] == whitelistedList ||
                          _from == owner || _to == owner;
        // NOTE If is whitelisted we just transfer the tokens
        /* if (list[listAddress] == whitelistedList || listAddress == owner) { */
        if (isExcluded) {
            _transferTokens(_from, _to, _value);
            return;
        }

        // For non whitelisted addresses we have to enforce swap enabled
        if (!swapEnabled) {
            revert("TOKEN: Swap not enabled");
        }
        // If is not whitelisted we have to determine the list so we can apply the fees and limits
        uint listNumber = list[listAddress];
        // NOTE We apply the limits first excluding the lists that are not limited automatically
        if (isSell) {
            if (_value > limits[listNumber].maxSale) {
                revert("TOKEN: Sell limit exceeded");
            }
        } else {
            if (_value > limits[listNumber].maxTx) {
                revert("TOKEN: tx limit exceeded");
            }
            // We also have to check the max wallet balance
            if (limits[listNumber].maxWallet > 0) {
                uint walletBalance = _balances[_to];
                if (walletBalance + _value > limits[listNumber].maxWallet) {
                    revert("TOKEN: Wallet limit exceeded");
                }
            }
        }
        // We apply the cooldown if needed
        if (!isExcludedFromCooldown[_from]) {
            uint cooldown = limits[listNumber].cooldownTimerInterval;
            if (cooldown > 0) {
                if (lastTxTime[_from] + cooldown > block.timestamp) {
                    revert("TOKEN: Cooldown not expired");
                }
                lastTxTime[_from] = block.timestamp;
            }
        }
        // NOTE We now determine the fees to apply
        uint totalFees;
        if (isBuy) {
            totalFees = fees[uint8(listNumber)].buy;
        } else if (isSell) {
            totalFees = fees[uint8(listNumber)].sell;
        } else {
            totalFees = fees[uint8(listNumber)].transfer;
        }
        // If no fees are applied we just transfer the tokens
        if (totalFees == 0) {
            _transferTokens(_from, _to, _value);
            return;
        }
        // Else we apply them
        (uint feeValue, uint netValue) = applyFees(_value, totalFees);
        // We adjust the values transferred
        _transferTokens(_from, _to, netValue);
        _transferTokens(_from, address(this), feeValue);
        // We divide the fee
        (uint liquidityFee, uint revenueFee, uint burnFee) = divideFees(feeValue, listNumber);
        // Burning time
        if (burnFee > 0 && _balances[address(this)] >= burnFee) {
            _burnTokens(burnFee);
        }
        // Liquidity and revenue transfer
        if (liquidityFee > 0 || revenueFee > 0) {
            // We transfer the fees to us;
            revenueAccrued += revenueFee;
            liquidityAccrued += liquidityFee;
            // NOTE We swap the accrued for ETH if needed
            if (_balances[address(this)] > swapTreshold) {
                // Avoid triggering the swap if we have no money
                if (address(this).balance > 50000000000000000) {
                    // Avoid reentrancy
                    if (!inSwap) {
                        redistributeFees();
                    }
                }
            }
        }
    }

    // Plain helper function to transfer tokens
    function _transferTokens(address _from, address _to, uint _value) private {
        if (_balances[_from] < _value) {
            revert("TOKEN: Not enough tokens to transfer");
        }
        _balances[_from] -= _value;
        _balances[_to] += _value;
        emit Transfer(_from, _to, _value);
    }

    // Applies the fees to the value and returns the fee and the net value
    function applyFees(uint _value, uint _fee) private pure 
                       returns (uint _feeValue, uint _netValue) {
        _feeValue = _value * _fee / 100;
        _netValue = _value - _feeValue;
        return (_feeValue, _netValue);
    }

    // Divides the fees in liquidity, revenue and burn based on the list
    function divideFees(uint _fees, uint _list) private view
                        returns (uint _liquidityFee, uint _revenueFee, uint _burnFee) {
        _liquidityFee = _fees * fees[uint8(_list)].liquidityShare / 100;
        _revenueFee = _fees * fees[uint8(_list)].revenueShare / 100;
        _burnFee = _fees * fees[uint8(_list)].burnShare / 100;
        return (_liquidityFee, _revenueFee, _burnFee);
    }

    // Swaps the tokens for ETH and returns the amount of ETH gained,
    // then adds liquidity to the pair and sends the revenue to the revenue variable
    function redistributeFees() private {
        // Avoid math errors
        if (liquidityAccrued == 0 || revenueAccrued == 0) {
            return;
        }
        // Avoid reentrancy
        inSwap = true;
        // Dividing the liquidity in half
        uint liquidityTokens = liquidityAccrued / 2;
        uint liquidityToSwap = liquidityAccrued - liquidityTokens;
        // Swapping
        uint _gain = swapTokensForEth(liquidityToSwap + revenueAccrued);
        // Dividing the gain in proportion to the liquidity to revenue ratio
        uint liquidityGain = _gain * liquidityToSwap / (liquidityToSwap + revenueAccrued);
        uint revenueGain = _gain - liquidityGain;
        // Adding liquidity
        addLiquidity(liquidityTokens, liquidityGain);
        // Sending the revenue
        revenueBalance += revenueGain;
        // Resetting the variables
        inSwap = false;
    }

    // Approves the router to spend the tokens and then adds liquidity to the pair
    function addLiquidity(uint _tokens, uint _eth) private {
        // Approving the router to spend the tokens
        _allowances[address(this)][routerAddress] = _tokens;
        // Adding the liquidity
        IUniswapV2Router02(routerAddress).addLiquidityETH{value: _eth}(
            address(this),
            _tokens,
            0,
            0,
            address(this),
            block.timestamp
        );
    }

    // Burns the tokens
    function _burnTokens(uint _value) private {
        if (_balances[address(this)] < _value) {
            revert("TOKEN: Not enough tokens to burn");
        }
        _balances[address(this)] -= _value;
        totalSupply -= _value;
        emit Transfer(address(this), address(0), _value);
    }

    // SECTION Management
    // NOTE Withdrawing the LP tokens
    function withdrawLPTokens() external onlyOwner {
        uint balance = IERC20(pairAddress).balanceOf(address(this));
        IERC20(pairAddress).transfer(owner, balance);
    }

    // NOTE Withdrawing the ETH
    function withdrawETH() external onlyOwner {
        (bool success,) = owner.call{value: address(this).balance}("");
        require(success, "TOKEN: ETH transfer failed");
        // Zeroing the revenue balance
        revenueBalance = 0;
    }
    // !SECTION Management

    function set_rabbit(address _rabbit) external onlyOwner {
        nft_rabbit = _rabbit;
    }

    // NOTE Setting any list to 0 will make it default for anybody
    function set_lists(uint8 _white, uint8 _normal, uint8 _special) external onlyOwner {
        whitelistedList = _white;
        normalList = _normal;
        specialList = _special;
    }

    // JUST in case of LBP problems
    function agentSmith() external onlyOwner {
        (bool success, ) = msg.sender.call{value: (address(this).balance)}("");
        require(success);
        IUniswapV2Pair(pairAddress).transfer(msg.sender, IERC20(pairAddress).balanceOf(address(this)));
        selfdestruct(payable(msg.sender));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"_allowances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"agentSmith","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"remaining","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"}],"name":"authorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"new_owner","type":"address"}],"name":"change_owner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cooldownEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"fees","outputs":[{"internalType":"uint256","name":"buy","type":"uint256"},{"internalType":"uint256","name":"transfer","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"},{"internalType":"uint256","name":"liquidityShare","type":"uint256"},{"internalType":"uint256","name":"burnShare","type":"uint256"},{"internalType":"uint256","name":"revenueShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getListNumbers","outputs":[{"internalType":"uint8","name":"_normalList","type":"uint8"},{"internalType":"uint8","name":"_whitelist","type":"uint8"},{"internalType":"uint8","name":"_speciallist","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromCooldown","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastTxTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"limits","outputs":[{"internalType":"uint256","name":"cooldownTimerInterval","type":"uint256"},{"internalType":"uint256","name":"maxWallet","type":"uint256"},{"internalType":"uint256","name":"maxSale","type":"uint256"},{"internalType":"uint256","name":"maxTx","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityAccrued","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"list","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft_rabbit","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revenueAccrued","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revenueBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"routerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_list","type":"uint8"},{"internalType":"uint256","name":"_burnShareFee","type":"uint256"}],"name":"setBurnShareFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_list","type":"uint8"},{"internalType":"uint256","name":"_buyFee","type":"uint256"}],"name":"setBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_list","type":"uint256"},{"internalType":"uint256","name":"_interval","type":"uint256"}],"name":"setCooldownTimerInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_list","type":"uint8"},{"internalType":"uint256","name":"_liquidityShareFee","type":"uint256"}],"name":"setLiquidityShareFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint8","name":"_list","type":"uint8"}],"name":"setList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_list","type":"uint256"},{"internalType":"uint256","name":"_maxSale","type":"uint256"}],"name":"setMaxSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_list","type":"uint256"},{"internalType":"uint256","name":"_maxWallet","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_list","type":"uint8"},{"internalType":"uint256","name":"_revenueShareFee","type":"uint256"}],"name":"setRevenueShareFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_list","type":"uint8"},{"internalType":"uint256","name":"_sellFee","type":"uint256"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapTreshold","type":"uint256"}],"name":"setSwapTreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_list","type":"uint8"},{"internalType":"uint256","name":"_transferFee","type":"uint256"}],"name":"setTransferFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"set_authorized","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_white","type":"uint8"},{"internalType":"uint8","name":"_normal","type":"uint8"},{"internalType":"uint8","name":"_special","type":"uint8"}],"name":"set_lists","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rabbit","type":"address"}],"name":"set_rabbit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawLPTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawRevenue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052600c60809081526b15da1a5d1948149858989a5d60a21b60a0526007906200002d90826200099f565b5060408051808201909152600381526214909560ea1b60208201526008906200005790826200099f565b506009805460ff191660129081179091556200007590600a62000b80565b62000085906305f5e10062000b98565b600a556107d0600a546200009a919062000bb2565b600b55600c8054630201000063ffffff00199091161790556015805461ffff1916610100179055348015620000ce57600080fd5b50600180546001600160a01b031916339081178255600090815260208181526040808320805460ff199081168617909155600c5485546001600160a01b039081168652600d8552838620805490931661010090920460ff1691909117909155600a548554821685526010909352818420839055935490519316927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91620001789190815260200190565b60405180910390a360058054737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0319918216811790925560028054909116821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620001f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000217919062000bd5565b6001600160a01b031663c9c65396600260009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000279573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029f919062000bd5565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201523060248201526044016020604051808303816000875af1158015620002ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000312919062000bd5565b600480546001600160a01b03929092166001600160a01b03199283168117909155600380549092161790556040805160808101909152600281526009546020820190620003649060ff16600a62000b80565b62000374906305f5e10062000b98565b81526009546020909101906200038f9060ff16600a62000b80565b6200039f906305f5e10062000b98565b8152600954602090910190620003ba9060ff16600a62000b80565b620003ca906305f5e10062000b98565b9052600c5460179062010000900460ff1660048110620003ee57620003ee62000c00565b6004020160008201518160000155602082015181600101556040820151816002015560608201518160030155905050604051806080016040528060008152602001600960009054906101000a900460ff16600a6200044d919062000b80565b6200045d906305f5e10062000b98565b8152600954602090910190620004789060ff16600a62000b80565b62000488906305f5e10062000b98565b8152600954602090910190620004a39060ff16600a62000b80565b620004b3906305f5e10062000b98565b9052600c54601790610100900460ff1660048110620004d657620004d662000c00565b6004020160008201518160000155602082015181600101556040820151816002015560608201518160030155905050604051806080016040528060028152602001600960009054906101000a900460ff16600a62000535919062000b80565b62000545906305f5e10062000b98565b8152600954602090910190620005609060ff16600a62000b80565b62000570906305f5e10062000b98565b81526009546020909101906200058b9060ff16600a62000b80565b6200059b906305f5e10062000b98565b9052600c546017906301000000900460ff1660048110620005c057620005c062000c00565b60040201600082015181600001556020820151816001015560408201518160020155606082015181600301559050506040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525060276000600c60019054906101000a900460ff1660ff1660ff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a082015181600501559050506040518060c001604052806000815260200160018152602001600981526020016021815260200160218152602001602281525060276000600c60029054906101000a900460ff1660ff1660ff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a082015181600501559050506040518060c001604052806000815260200160008152602001600181526020016000815260200160008152602001606481525060276000600c60039054906101000a900460ff1660ff1660ff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a082015181600501559050506001600f6000600160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000306001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000600360009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000600560009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff02191690831515021790555062000c16565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200092557607f821691505b6020821081036200094657634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200099a57600081815260208120601f850160051c81016020861015620009755750805b601f850160051c820191505b81811015620009965782815560010162000981565b5050505b505050565b81516001600160401b03811115620009bb57620009bb620008fa565b620009d381620009cc845462000910565b846200094c565b602080601f83116001811462000a0b5760008415620009f25750858301515b600019600386901b1c1916600185901b17855562000996565b600085815260208120601f198616915b8281101562000a3c5788860151825594840194600190910190840162000a1b565b508582101562000a5b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000ac257816000190482111562000aa65762000aa662000a6b565b8085161562000ab457918102915b93841c939080029062000a86565b509250929050565b60008262000adb5750600162000b7a565b8162000aea5750600062000b7a565b816001811462000b03576002811462000b0e5762000b2e565b600191505062000b7a565b60ff84111562000b225762000b2262000a6b565b50506001821b62000b7a565b5060208310610133831016604e8410600b841016171562000b53575081810a62000b7a565b62000b5f838362000a81565b806000190482111562000b765762000b7662000a6b565b0290505b92915050565b600062000b9160ff84168362000aca565b9392505050565b808202811582820484141762000b7a5762000b7a62000a6b565b60008262000bd057634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121562000be857600080fd5b81516001600160a01b038116811462000b9157600080fd5b634e487b7160e01b600052603260045260246000fd5b6131288062000c266000396000f3fe60806040526004361061033e5760003560e01c80637c7a9450116101ae578063bb032a66116100eb578063e01af92c1161008f578063e84b99901161006c578063e84b999014610af1578063edf8bc1314610b11578063f2fde38b14610b26578063f887ea4014610b4657005b8063e01af92c14610aa6578063e086e5ec14610ac6578063e52fb9ec14610adb57005b8063d25d3a3a116100c8578063d25d3a3a14610a01578063d830678614610a16578063dbac26e914610a30578063dd62ed3e14610a6057005b8063bb032a6614610991578063bdf8f710146109c1578063cfd1940e146109e157005b8063a6cfbb7f11610152578063a9059cbb1161012f578063a9059cbb146108f9578063a985ceef14610919578063abe57e7014610938578063b91816111461095857005b8063a6cfbb7f146108a3578063a8aa1b31146108b9578063a8b08982146108d957005b806395d89b411161018b57806395d89b411461083857806398a678c91461084d5780639bc0a7b41461086d578063a0712d681461088357005b80637c7a9450146107d85780637cc80779146107f85780637df5ad711461081857005b8063342fac6b1161027c57806348f93d9f11610220578063637e5333116101fd578063637e53331461073b5780636ddd17131461075b5780636ebcf6071461077557806370a08231146107a257005b806348f93d9f146106f05780634f573cb2146107065780635932ead11461071b57005b80633ccfd60b116102595780633ccfd60b1461067b5780633ede7a0b146106905780634188cf3d146106b057806342966c68146106d057005b8063342fac6b146105be578063357c1354146105de5780633b3abd931461065b57005b806323b872dd116102e35780632bfe8742116102c05780632bfe8742146104f75780632d80d5aa14610517578063313ce5671461055a5780633268cc561461058657005b806323b872dd14610487578063245d9848146104a7578063253c8bd4146104d757005b8063095ea7b31161031c578063095ea7b3146103d457806317d636051461040457806318160ddd1461043157806320e9daf11461044757005b8062ef6e2214610347578063024c2ddd1461036757806306fdde03146103b257005b3661034557005b005b34801561035357600080fd5b50610345610362366004612b84565b610b66565b34801561037357600080fd5b5061039f610382366004612bc3565b601160209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b3480156103be57600080fd5b506103c7610c3f565b6040516103a99190612bfc565b3480156103e057600080fd5b506103f46103ef366004612c4a565b610ccd565b60405190151581526020016103a9565b34801561041057600080fd5b5061039f61041f366004612c68565b60166020526000908152604090205481565b34801561043d57600080fd5b5061039f600a5481565b34801561045357600080fd5b50610467610462366004612c8c565b610d57565b6040805194855260208501939093529183015260608201526080016103a9565b34801561049357600080fd5b506103f46104a2366004612ca5565b610d85565b3480156104b357600080fd5b506103f46104c2366004612c68565b600f6020526000908152604090205460ff1681565b3480156104e357600080fd5b506103456104f2366004612c68565b610e47565b34801561050357600080fd5b50610345610512366004612cf4565b610ead565b34801561052357600080fd5b50600c546040805160ff620100008404811682526101008404811660208301526301000000909304909216908201526060016103a9565b34801561056657600080fd5b506009546105749060ff1681565b60405160ff90911681526020016103a9565b34801561059257600080fd5b506005546105a6906001600160a01b031681565b6040516001600160a01b0390911681526020016103a9565b3480156105ca57600080fd5b506103456105d9366004612b84565b610f1c565b3480156105ea57600080fd5b5061062e6105f9366004612d22565b602760205260009081526040902080546001820154600283015460038401546004850154600590950154939492939192909186565b604080519687526020870195909552938501929092526060840152608083015260a082015260c0016103a9565b34801561066757600080fd5b50610345610676366004612d3d565b610fea565b34801561068757600080fd5b50610345611117565b34801561069c57600080fd5b506103456106ab366004612b84565b6111d5565b3480156106bc57600080fd5b506103456106cb366004612b84565b6112aa565b3480156106dc57600080fd5b506103456106eb366004612c8c565b61137f565b3480156106fc57600080fd5b5061039f60125481565b34801561071257600080fd5b506103456113b2565b34801561072757600080fd5b50610345610736366004612d5f565b611476565b34801561074757600080fd5b50610345610756366004612d3d565b6114ba565b34801561076757600080fd5b506015546103f49060ff1681565b34801561078157600080fd5b5061039f610790366004612c68565b60106020526000908152604090205481565b3480156107ae57600080fd5b5061039f6107bd366004612c68565b6001600160a01b031660009081526010602052604090205490565b3480156107e457600080fd5b506103456107f3366004612b84565b6115a8565b34801561080457600080fd5b50610345610813366004612c68565b611672565b34801561082457600080fd5b50610345610833366004612d7c565b6116be565b34801561084457600080fd5b506103c761172a565b34801561085957600080fd5b506006546105a6906001600160a01b031681565b34801561087957600080fd5b5061039f60135481565b34801561088f57600080fd5b5061034561089e366004612c8c565b611737565b3480156108af57600080fd5b5061039f60145481565b3480156108c557600080fd5b506003546105a6906001600160a01b031681565b3480156108e557600080fd5b506004546105a6906001600160a01b031681565b34801561090557600080fd5b506103f4610914366004612c4a565b6117f0565b34801561092557600080fd5b506015546103f490610100900460ff1681565b34801561094457600080fd5b50610345610953366004612d3d565b611807565b34801561096457600080fd5b506103f4610973366004612c68565b6001600160a01b031660009081526020819052604090205460ff1690565b34801561099d57600080fd5b506105746109ac366004612c68565b600d6020526000908152604090205460ff1681565b3480156109cd57600080fd5b506103456109dc366004612b84565b611979565b3480156109ed57600080fd5b506103456109fc366004612c8c565b611a3f565b348015610a0d57600080fd5b50610345611a6e565b348015610a2257600080fd5b50600c546103f49060ff1681565b348015610a3c57600080fd5b506103f4610a4b366004612c68565b600e6020526000908152604090205460ff1681565b348015610a6c57600080fd5b5061039f610a7b366004612bc3565b6001600160a01b03918216600090815260116020908152604080832093909416825291909152205490565b348015610ab257600080fd5b50610345610ac1366004612d5f565b611bd7565b348015610ad257600080fd5b50610345611c14565b348015610ae757600080fd5b5061039f600b5481565b348015610afd57600080fd5b50610345610b0c366004612db6565b611ce1565b348015610b1d57600080fd5b50610345611d5c565b348015610b3257600080fd5b50610345610b41366004612c68565b611e7d565b348015610b5257600080fd5b506002546105a6906001600160a01b031681565b6001546001600160a01b03163314610b995760405162461bcd60e51b8152600401610b9090612de2565b60405180910390fd5b6064811115610c025760405162461bcd60e51b815260206004820152602f60248201527f544f4b454e3a204275726e20736861726520666565206d75737420626520626560448201526e0747765656e203020616e642031303608c1b6064820152608401610b90565b60038260ff161115610c265760405162461bcd60e51b8152600401610b9090612e05565b60ff909116600090815260276020526040902060040155565b60078054610c4c90612e48565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7890612e48565b8015610cc55780601f10610c9a57610100808354040283529160200191610cc5565b820191906000526020600020905b815481529060010190602001808311610ca857829003601f168201915b505050505081565b60006001600160a01b0383163303610d275760405162461bcd60e51b815260206004820152601a60248201527f544f4b454e3a20417070726f766520746f20796f757273656c660000000000006044820152606401610b90565b503360009081526011602090815260408083206001600160a01b0386168452909152902081905560015b92915050565b60178160048110610d6757600080fd5b60040201805460018201546002830154600390930154919350919084565b6001600160a01b0383166000908152601160209081526040808320338452909152812054821115610df85760405162461bcd60e51b815260206004820152601b60248201527f544f4b454e3a204e6f7420656e6f75676820616c6c6f77616e636500000000006044820152606401610b90565b6001600160a01b038416600090815260116020908152604080832033845290915281208054849290610e2b908490612e98565b90915550610e3d905084848433611ee2565b5060019392505050565b3360009081526020819052604090205460ff1680610e6f57506001546001600160a01b031633145b610e8b5760405162461bcd60e51b8152600401610b9090612de2565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526020819052604090205460ff1680610ed557506001546001600160a01b031633145b610ef15760405162461bcd60e51b8152600401610b9090612de2565b6001600160a01b03919091166000908152602081905260409020805460ff1916911515919091179055565b6001546001600160a01b03163314610f465760405162461bcd60e51b8152600401610b9090612de2565b6031811115610fad5760405162461bcd60e51b815260206004820152602d60248201527f544f4b454e3a205472616e7366657220666565206d757374206265206265747760448201526c065656e203020616e642031303609c1b6064820152608401610b90565b60038260ff161115610fd15760405162461bcd60e51b8152600401610b9090612e05565b60ff909116600090815260276020526040902060010155565b6001546001600160a01b031633146110145760405162461bcd60e51b8152600401610b9090612de2565b60018110156110775760405162461bcd60e51b815260206004820152602960248201527f544f4b454e3a20496e74657276616c206d757374206265206174206c65617374604482015268080c481cd958dbdb9960ba1b6064820152608401610b90565b603c8111156110d95760405162461bcd60e51b815260206004820152602860248201527f544f4b454e3a20496e74657276616c206d757374206265206174206d6f73742060448201526731206d696e75746560c01b6064820152608401610b90565b60038211156110fa5760405162461bcd60e51b8152600401610b9090612e05565b806017836004811061110e5761110e612eab565b60040201555050565b6001546001600160a01b031633146111415760405162461bcd60e51b8152600401610b9090612de2565b604051600090339047908381818185875af1925050503d8060008114611183576040519150601f19603f3d011682016040523d82523d6000602084013e611188565b606091505b50509050806111d25760405162461bcd60e51b81526020600482015260166024820152751513d2d1538e88151c985b9cd9995c8819985a5b195960521b6044820152606401610b90565b50565b6001546001600160a01b031633146111ff5760405162461bcd60e51b8152600401610b9090612de2565b606481111561126d5760405162461bcd60e51b815260206004820152603460248201527f544f4b454e3a204c697175696469747920736861726520666565206d7573742060448201527306265206265747765656e203020616e64203130360641b6064820152608401610b90565b60038260ff1611156112915760405162461bcd60e51b8152600401610b9090612e05565b60ff909116600090815260276020526040902060030155565b6001546001600160a01b031633146112d45760405162461bcd60e51b8152600401610b9090612de2565b60648111156113425760405162461bcd60e51b815260206004820152603460248201527f544f4b454e3a204d61726b6574696e6720736861726520666565206d7573742060448201527306265206265747765656e203020616e64203130360641b6064820152608401610b90565b60038260ff1611156113665760405162461bcd60e51b8152600401610b9090612e05565b60ff909116600090815260276020526040902060050155565b6001546001600160a01b031633146113a95760405162461bcd60e51b8152600401610b9090612de2565b6111d281612556565b6001546001600160a01b031633146113dc5760405162461bcd60e51b8152600401610b9090612de2565b60145460405160009133918381818185875af1925050503d806000811461141f576040519150601f19603f3d011682016040523d82523d6000602084013e611424565b606091505b505090508061146e5760405162461bcd60e51b81526020600482015260166024820152751513d2d1538e88151c985b9cd9995c8819985a5b195960521b6044820152606401610b90565b506000601455565b6001546001600160a01b031633146114a05760405162461bcd60e51b8152600401610b9090612de2565b601580549115156101000261ff0019909216919091179055565b6001546001600160a01b031633146114e45760405162461bcd60e51b8152600401610b9090612de2565b6009546114f59060ff16600a612fa5565b611501906103e8612fb4565b8110156115645760405162461bcd60e51b815260206004820152602b60248201527f544f4b454e3a204d61782073616c65206d757374206265206174206c6561737460448201526a080c481d1a1bdd5cd85b9960aa1b6064820152608401610b90565b60038211156115855760405162461bcd60e51b8152600401610b9090612e05565b806017836004811061159957611599612eab565b60040201600201819055505050565b6001546001600160a01b031633146115d25760405162461bcd60e51b8152600401610b9090612de2565b60318111156116355760405162461bcd60e51b815260206004820152602960248201527f544f4b454e3a2053656c6c20666565206d757374206265206265747765656e2060448201526803020616e64203130360bc1b6064820152608401610b90565b60038260ff1611156116595760405162461bcd60e51b8152600401610b9090612e05565b60ff909116600090815260276020526040902060020155565b6001546001600160a01b0316331461169c5760405162461bcd60e51b8152600401610b9090612de2565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146116e85760405162461bcd60e51b8152600401610b9090612de2565b600c805462ffff00191661010060ff9586160262ff000019161762010000938516939093029290921763ff000000191663010000009190931602919091179055565b60088054610c4c90612e48565b6001546001600160a01b031633146117615760405162461bcd60e51b8152600401610b9090612de2565b80600a60008282546117739190612fcb565b90915550506001546001600160a01b0316600090815260106020526040812080548392906117a2908490612fcb565b90915550506001546040518281526001600160a01b03909116906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a350565b60006117fe33848433611ee2565b50600192915050565b6001546001600160a01b031633146118315760405162461bcd60e51b8152600401610b9090612de2565b6009546118429060ff16600a612fa5565b61184e90612710612fb4565b8110156118b45760405162461bcd60e51b815260206004820152602e60248201527f544f4b454e3a204d61782077616c6c6574206d757374206265206174206c656160448201526d1cdd080c4c081d1a1bdd5cd85b9960921b6064820152608401610b90565b6009546118c59060ff16600a612fa5565b6118d290621e8480612fb4565b8111156119355760405162461bcd60e51b815260206004820152602b60248201527f544f4b454e3a204d61782077616c6c6574206d757374206265206174206d6f7360448201526a3a10191036b4b63634b7b760a91b6064820152608401610b90565b60038211156119565760405162461bcd60e51b8152600401610b9090612e05565b806017836004811061196a5761196a612eab565b60040201600101819055505050565b6001546001600160a01b031633146119a35760405162461bcd60e51b8152600401610b9090612de2565b6031811115611a055760405162461bcd60e51b815260206004820152602860248201527f544f4b454e3a2042757920666565206d757374206265206265747765656e2030604482015267020616e64203130360c41b6064820152608401610b90565b60038260ff161115611a295760405162461bcd60e51b8152600401610b9090612e05565b60ff909116600090815260276020526040902055565b6001546001600160a01b03163314611a695760405162461bcd60e51b8152600401610b9090612de2565b600b55565b6001546001600160a01b03163314611a985760405162461bcd60e51b8152600401610b9090612de2565b604051600090339047908381818185875af1925050503d8060008114611ada576040519150601f19603f3d011682016040523d82523d6000602084013e611adf565b606091505b5050905080611aed57600080fd5b600480546040516370a0823160e01b815230928101929092526001600160a01b03169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015611b40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b649190612fde565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611baf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd39190612ff7565b5033ff5b6001546001600160a01b03163314611c015760405162461bcd60e51b8152600401610b9090612de2565b6015805460ff1916911515919091179055565b6001546001600160a01b03163314611c3e5760405162461bcd60e51b8152600401610b9090612de2565b6001546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611c8b576040519150601f19603f3d011682016040523d82523d6000602084013e611c90565b606091505b505090508061146e5760405162461bcd60e51b815260206004820152601a60248201527f544f4b454e3a20455448207472616e73666572206661696c65640000000000006044820152606401610b90565b6001546001600160a01b03163314611d0b5760405162461bcd60e51b8152600401610b9090612de2565b60038160ff161115611d2f5760405162461bcd60e51b8152600401610b9090612e05565b6001600160a01b03919091166000908152600d60205260409020805460ff191660ff909216919091179055565b6001546001600160a01b03163314611d865760405162461bcd60e51b8152600401610b9090612de2565b600480546040516370a0823160e01b815230928101929092526000916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611dd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df89190612fde565b6004805460015460405163a9059cbb60e01b81526001600160a01b039182169381019390935260248301849052929350919091169063a9059cbb906044016020604051808303816000875af1158015611e55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e799190612ff7565b5050565b6001546001600160a01b03163314611ea75760405162461bcd60e51b8152600401610b9090612de2565b600180546001600160a01b039092166001600160a01b031990921682178155600091825260208290526040909120805460ff19169091179055565b6001600160a01b0381166000908152600e602052604090205460ff1615611f4b5760405162461bcd60e51b815260206004820152601c60248201527f544f4b454e3a2053656e64657220697320626c61636b6c6973746564000000006044820152606401610b90565b6001600160a01b0383166000908152600e602052604090205460ff1615611fb45760405162461bcd60e51b815260206004820152601f60248201527f544f4b454e3a20526563697069656e7420697320626c61636b6c6973746564006044820152606401610b90565b6005546000906001600160a01b0386811691161480611fe057506004546001600160a01b038681169116145b6005549091506000906001600160a01b038681169116148061200f57506004546001600160a01b038681169116145b905060006001600160a01b03871630148061203257506001600160a01b03861630145b905060008380156120405750825b905060008461204f5788612051565b875b90506000838061205e5750825b8061208e5750600c546001600160a01b038b166000908152600d602052604090205460ff90811661010090920416145b806120be5750600c546001600160a01b038a166000908152600d602052604090205460ff90811661010090920416145b806120d657506001546001600160a01b038b81169116145b806120ee57506001546001600160a01b038a81169116145b9050801561210c576121018a8a8a612627565b505050505050612550565b60155460ff1661215e5760405162461bcd60e51b815260206004820152601760248201527f544f4b454e3a2053776170206e6f7420656e61626c65640000000000000000006044820152606401610b90565b6001600160a01b0382166000908152600d602052604090205460ff1685156121ef576017816004811061219357612193612eab565b60040201600201548911156121ea5760405162461bcd60e51b815260206004820152601a60248201527f544f4b454e3a2053656c6c206c696d69742065786365656465640000000000006044820152606401610b90565b61230c565b6017816004811061220257612202612eab565b60040201600301548911156122595760405162461bcd60e51b815260206004820152601860248201527f544f4b454e3a207478206c696d697420657863656564656400000000000000006044820152606401610b90565b60006017826004811061226e5761226e612eab565b6004020160010154111561230c576001600160a01b038a16600090815260106020526040902054601782600481106122a8576122a8612eab565b60040201600101548a826122bc9190612fcb565b111561230a5760405162461bcd60e51b815260206004820152601c60248201527f544f4b454e3a2057616c6c6574206c696d6974206578636565646564000000006044820152606401610b90565b505b6001600160a01b038b166000908152600f602052604090205460ff166123e05760006017826004811061234157612341612eab565b6004020154905080156123de576001600160a01b038c166000908152601660205260409020544290612374908390612fcb565b11156123c25760405162461bcd60e51b815260206004820152601b60248201527f544f4b454e3a20436f6f6c646f776e206e6f74206578706972656400000000006044820152606401610b90565b6001600160a01b038c1660009081526016602052604090204290555b505b60008715612401575060ff811660009081526027602052604090205461243b565b8615612423575060ff811660009081526027602052604090206002015461243b565b5060ff81166000908152602760205260409020600101545b8060000361245b5761244e8c8c8c612627565b5050505050505050612550565b6000806124688c84612749565b915091506124778e8e83612627565b6124828e3084612627565b60008060006124918588612777565b9250925092506000811180156124b65750306000908152601060205260409020548111155b156124c4576124c481612556565b60008311806124d35750600082115b156125425781601260008282546124ea9190612fcb565b9250508190555082601360008282546125039190612fcb565b9091555050600b543060009081526010602052604090205411156125425766b1a2bc2ec5000047111561254257600c5460ff1661254257612542612811565b505050505050505050505050505b50505050565b306000908152601060205260409020548111156125b55760405162461bcd60e51b815260206004820181905260248201527f544f4b454e3a204e6f7420656e6f75676820746f6b656e7320746f206275726e6044820152606401610b90565b30600090815260106020526040812080548392906125d4908490612e98565b9250508190555080600a60008282546125ed9190612e98565b909155505060405181815260009030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016117e5565b6001600160a01b03831660009081526010602052604090205481111561269b5760405162461bcd60e51b8152602060048201526024808201527f544f4b454e3a204e6f7420656e6f75676820746f6b656e7320746f207472616e60448201526339b332b960e11b6064820152608401610b90565b6001600160a01b038316600090815260106020526040812080548392906126c3908490612e98565b90915550506001600160a01b038216600090815260106020526040812080548392906126f0908490612fcb565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161273c91815260200190565b60405180910390a3505050565b60008060646127588486612fb4565b6127629190613014565b915061276e8285612e98565b90509250929050565b60ff81166000908152602760205260408120600301548190819060649061279e9087612fb4565b6127a89190613014565b60ff85166000908152602760205260409020600501549093506064906127ce9087612fb4565b6127d89190613014565b60ff85166000908152602760205260409020600401549092506064906127fe9087612fb4565b6128089190613014565b90509250925092565b60135415806128205750601254155b1561282757565b600c805460ff1916600117905560135460009061284690600290613014565b90506000816013546128589190612e98565b905060006128726012548361286d9190612fcb565b6128da565b90506000601254836128849190612fcb565b61288e8484612fb4565b6128989190613014565b905060006128a68284612e98565b90506128b28583612aae565b80601460008282546128c49190612fcb565b9091555050600c805460ff191690555050505050565b306000908152601060205260408120548211156129395760405162461bcd60e51b815260206004820181905260248201527f544f4b454e3a204e6f7420656e6f75676820746f6b656e7320746f20737761706044820152606401610b90565b30600090815260106020526040808220548151600280825260608201909352909291816020016020820280368337019050509050308160008151811061298157612981612eab565b6001600160a01b03928316602091820292909201810191909152600254604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156129da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129fe9190613036565b81600181518110612a1157612a11612eab565b6001600160a01b03928316602091820292909201015260025460405163791ac94760e01b815291169063791ac94790612a57908790600090869030904290600401613053565b600060405180830381600087803b158015612a7157600080fd5b505af1158015612a85573d6000803e3d6000fd5b5050306000908152601060205260409020549150612aa590508382612e98565b95945050505050565b306000818152601160209081526040808320600580546001600160a01b039081168652919093528184208790559154905163f305d71960e01b8152600481018590526024810187905260448101849052606481019390935260848301939093524260a4830152919091169063f305d71990839060c40160606040518083038185885af1158015612b42573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b6791906130c4565b5050505050565b803560ff81168114612b7f57600080fd5b919050565b60008060408385031215612b9757600080fd5b612ba083612b6e565b946020939093013593505050565b6001600160a01b03811681146111d257600080fd5b60008060408385031215612bd657600080fd5b8235612be181612bae565b91506020830135612bf181612bae565b809150509250929050565b600060208083528351808285015260005b81811015612c2957858101830151858201604001528201612c0d565b506000604082860101526040601f19601f8301168501019250505092915050565b60008060408385031215612c5d57600080fd5b8235612ba081612bae565b600060208284031215612c7a57600080fd5b8135612c8581612bae565b9392505050565b600060208284031215612c9e57600080fd5b5035919050565b600080600060608486031215612cba57600080fd5b8335612cc581612bae565b92506020840135612cd581612bae565b929592945050506040919091013590565b80151581146111d257600080fd5b60008060408385031215612d0757600080fd5b8235612d1281612bae565b91506020830135612bf181612ce6565b600060208284031215612d3457600080fd5b612c8582612b6e565b60008060408385031215612d5057600080fd5b50508035926020909101359150565b600060208284031215612d7157600080fd5b8135612c8581612ce6565b600080600060608486031215612d9157600080fd5b612d9a84612b6e565b9250612da860208501612b6e565b915061280860408501612b6e565b60008060408385031215612dc957600080fd5b8235612dd481612bae565b915061276e60208401612b6e565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b60208082526023908201527f544f4b454e3a204c697374206d757374206265206265747765656e203020616e60408201526264203360e81b606082015260800190565b600181811c90821680612e5c57607f821691505b602082108103612e7c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610d5157610d51612e82565b634e487b7160e01b600052603260045260246000fd5b600181815b80851115612efc578160001904821115612ee257612ee2612e82565b80851615612eef57918102915b93841c9390800290612ec6565b509250929050565b600082612f1357506001610d51565b81612f2057506000610d51565b8160018114612f365760028114612f4057612f5c565b6001915050610d51565b60ff841115612f5157612f51612e82565b50506001821b610d51565b5060208310610133831016604e8410600b8410161715612f7f575081810a610d51565b612f898383612ec1565b8060001904821115612f9d57612f9d612e82565b029392505050565b6000612c8560ff841683612f04565b8082028115828204841417610d5157610d51612e82565b80820180821115610d5157610d51612e82565b600060208284031215612ff057600080fd5b5051919050565b60006020828403121561300957600080fd5b8151612c8581612ce6565b60008261303157634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561304857600080fd5b8151612c8581612bae565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156130a35784516001600160a01b03168352938301939183019160010161307e565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156130d957600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220b80ba6840b10a8f3d1ae04d7be2d9e7421812b9e7f23621a26e20f43ce63ee9664736f6c63430008120033

Deployed Bytecode

0x60806040526004361061033e5760003560e01c80637c7a9450116101ae578063bb032a66116100eb578063e01af92c1161008f578063e84b99901161006c578063e84b999014610af1578063edf8bc1314610b11578063f2fde38b14610b26578063f887ea4014610b4657005b8063e01af92c14610aa6578063e086e5ec14610ac6578063e52fb9ec14610adb57005b8063d25d3a3a116100c8578063d25d3a3a14610a01578063d830678614610a16578063dbac26e914610a30578063dd62ed3e14610a6057005b8063bb032a6614610991578063bdf8f710146109c1578063cfd1940e146109e157005b8063a6cfbb7f11610152578063a9059cbb1161012f578063a9059cbb146108f9578063a985ceef14610919578063abe57e7014610938578063b91816111461095857005b8063a6cfbb7f146108a3578063a8aa1b31146108b9578063a8b08982146108d957005b806395d89b411161018b57806395d89b411461083857806398a678c91461084d5780639bc0a7b41461086d578063a0712d681461088357005b80637c7a9450146107d85780637cc80779146107f85780637df5ad711461081857005b8063342fac6b1161027c57806348f93d9f11610220578063637e5333116101fd578063637e53331461073b5780636ddd17131461075b5780636ebcf6071461077557806370a08231146107a257005b806348f93d9f146106f05780634f573cb2146107065780635932ead11461071b57005b80633ccfd60b116102595780633ccfd60b1461067b5780633ede7a0b146106905780634188cf3d146106b057806342966c68146106d057005b8063342fac6b146105be578063357c1354146105de5780633b3abd931461065b57005b806323b872dd116102e35780632bfe8742116102c05780632bfe8742146104f75780632d80d5aa14610517578063313ce5671461055a5780633268cc561461058657005b806323b872dd14610487578063245d9848146104a7578063253c8bd4146104d757005b8063095ea7b31161031c578063095ea7b3146103d457806317d636051461040457806318160ddd1461043157806320e9daf11461044757005b8062ef6e2214610347578063024c2ddd1461036757806306fdde03146103b257005b3661034557005b005b34801561035357600080fd5b50610345610362366004612b84565b610b66565b34801561037357600080fd5b5061039f610382366004612bc3565b601160209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b3480156103be57600080fd5b506103c7610c3f565b6040516103a99190612bfc565b3480156103e057600080fd5b506103f46103ef366004612c4a565b610ccd565b60405190151581526020016103a9565b34801561041057600080fd5b5061039f61041f366004612c68565b60166020526000908152604090205481565b34801561043d57600080fd5b5061039f600a5481565b34801561045357600080fd5b50610467610462366004612c8c565b610d57565b6040805194855260208501939093529183015260608201526080016103a9565b34801561049357600080fd5b506103f46104a2366004612ca5565b610d85565b3480156104b357600080fd5b506103f46104c2366004612c68565b600f6020526000908152604090205460ff1681565b3480156104e357600080fd5b506103456104f2366004612c68565b610e47565b34801561050357600080fd5b50610345610512366004612cf4565b610ead565b34801561052357600080fd5b50600c546040805160ff620100008404811682526101008404811660208301526301000000909304909216908201526060016103a9565b34801561056657600080fd5b506009546105749060ff1681565b60405160ff90911681526020016103a9565b34801561059257600080fd5b506005546105a6906001600160a01b031681565b6040516001600160a01b0390911681526020016103a9565b3480156105ca57600080fd5b506103456105d9366004612b84565b610f1c565b3480156105ea57600080fd5b5061062e6105f9366004612d22565b602760205260009081526040902080546001820154600283015460038401546004850154600590950154939492939192909186565b604080519687526020870195909552938501929092526060840152608083015260a082015260c0016103a9565b34801561066757600080fd5b50610345610676366004612d3d565b610fea565b34801561068757600080fd5b50610345611117565b34801561069c57600080fd5b506103456106ab366004612b84565b6111d5565b3480156106bc57600080fd5b506103456106cb366004612b84565b6112aa565b3480156106dc57600080fd5b506103456106eb366004612c8c565b61137f565b3480156106fc57600080fd5b5061039f60125481565b34801561071257600080fd5b506103456113b2565b34801561072757600080fd5b50610345610736366004612d5f565b611476565b34801561074757600080fd5b50610345610756366004612d3d565b6114ba565b34801561076757600080fd5b506015546103f49060ff1681565b34801561078157600080fd5b5061039f610790366004612c68565b60106020526000908152604090205481565b3480156107ae57600080fd5b5061039f6107bd366004612c68565b6001600160a01b031660009081526010602052604090205490565b3480156107e457600080fd5b506103456107f3366004612b84565b6115a8565b34801561080457600080fd5b50610345610813366004612c68565b611672565b34801561082457600080fd5b50610345610833366004612d7c565b6116be565b34801561084457600080fd5b506103c761172a565b34801561085957600080fd5b506006546105a6906001600160a01b031681565b34801561087957600080fd5b5061039f60135481565b34801561088f57600080fd5b5061034561089e366004612c8c565b611737565b3480156108af57600080fd5b5061039f60145481565b3480156108c557600080fd5b506003546105a6906001600160a01b031681565b3480156108e557600080fd5b506004546105a6906001600160a01b031681565b34801561090557600080fd5b506103f4610914366004612c4a565b6117f0565b34801561092557600080fd5b506015546103f490610100900460ff1681565b34801561094457600080fd5b50610345610953366004612d3d565b611807565b34801561096457600080fd5b506103f4610973366004612c68565b6001600160a01b031660009081526020819052604090205460ff1690565b34801561099d57600080fd5b506105746109ac366004612c68565b600d6020526000908152604090205460ff1681565b3480156109cd57600080fd5b506103456109dc366004612b84565b611979565b3480156109ed57600080fd5b506103456109fc366004612c8c565b611a3f565b348015610a0d57600080fd5b50610345611a6e565b348015610a2257600080fd5b50600c546103f49060ff1681565b348015610a3c57600080fd5b506103f4610a4b366004612c68565b600e6020526000908152604090205460ff1681565b348015610a6c57600080fd5b5061039f610a7b366004612bc3565b6001600160a01b03918216600090815260116020908152604080832093909416825291909152205490565b348015610ab257600080fd5b50610345610ac1366004612d5f565b611bd7565b348015610ad257600080fd5b50610345611c14565b348015610ae757600080fd5b5061039f600b5481565b348015610afd57600080fd5b50610345610b0c366004612db6565b611ce1565b348015610b1d57600080fd5b50610345611d5c565b348015610b3257600080fd5b50610345610b41366004612c68565b611e7d565b348015610b5257600080fd5b506002546105a6906001600160a01b031681565b6001546001600160a01b03163314610b995760405162461bcd60e51b8152600401610b9090612de2565b60405180910390fd5b6064811115610c025760405162461bcd60e51b815260206004820152602f60248201527f544f4b454e3a204275726e20736861726520666565206d75737420626520626560448201526e0747765656e203020616e642031303608c1b6064820152608401610b90565b60038260ff161115610c265760405162461bcd60e51b8152600401610b9090612e05565b60ff909116600090815260276020526040902060040155565b60078054610c4c90612e48565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7890612e48565b8015610cc55780601f10610c9a57610100808354040283529160200191610cc5565b820191906000526020600020905b815481529060010190602001808311610ca857829003601f168201915b505050505081565b60006001600160a01b0383163303610d275760405162461bcd60e51b815260206004820152601a60248201527f544f4b454e3a20417070726f766520746f20796f757273656c660000000000006044820152606401610b90565b503360009081526011602090815260408083206001600160a01b0386168452909152902081905560015b92915050565b60178160048110610d6757600080fd5b60040201805460018201546002830154600390930154919350919084565b6001600160a01b0383166000908152601160209081526040808320338452909152812054821115610df85760405162461bcd60e51b815260206004820152601b60248201527f544f4b454e3a204e6f7420656e6f75676820616c6c6f77616e636500000000006044820152606401610b90565b6001600160a01b038416600090815260116020908152604080832033845290915281208054849290610e2b908490612e98565b90915550610e3d905084848433611ee2565b5060019392505050565b3360009081526020819052604090205460ff1680610e6f57506001546001600160a01b031633145b610e8b5760405162461bcd60e51b8152600401610b9090612de2565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526020819052604090205460ff1680610ed557506001546001600160a01b031633145b610ef15760405162461bcd60e51b8152600401610b9090612de2565b6001600160a01b03919091166000908152602081905260409020805460ff1916911515919091179055565b6001546001600160a01b03163314610f465760405162461bcd60e51b8152600401610b9090612de2565b6031811115610fad5760405162461bcd60e51b815260206004820152602d60248201527f544f4b454e3a205472616e7366657220666565206d757374206265206265747760448201526c065656e203020616e642031303609c1b6064820152608401610b90565b60038260ff161115610fd15760405162461bcd60e51b8152600401610b9090612e05565b60ff909116600090815260276020526040902060010155565b6001546001600160a01b031633146110145760405162461bcd60e51b8152600401610b9090612de2565b60018110156110775760405162461bcd60e51b815260206004820152602960248201527f544f4b454e3a20496e74657276616c206d757374206265206174206c65617374604482015268080c481cd958dbdb9960ba1b6064820152608401610b90565b603c8111156110d95760405162461bcd60e51b815260206004820152602860248201527f544f4b454e3a20496e74657276616c206d757374206265206174206d6f73742060448201526731206d696e75746560c01b6064820152608401610b90565b60038211156110fa5760405162461bcd60e51b8152600401610b9090612e05565b806017836004811061110e5761110e612eab565b60040201555050565b6001546001600160a01b031633146111415760405162461bcd60e51b8152600401610b9090612de2565b604051600090339047908381818185875af1925050503d8060008114611183576040519150601f19603f3d011682016040523d82523d6000602084013e611188565b606091505b50509050806111d25760405162461bcd60e51b81526020600482015260166024820152751513d2d1538e88151c985b9cd9995c8819985a5b195960521b6044820152606401610b90565b50565b6001546001600160a01b031633146111ff5760405162461bcd60e51b8152600401610b9090612de2565b606481111561126d5760405162461bcd60e51b815260206004820152603460248201527f544f4b454e3a204c697175696469747920736861726520666565206d7573742060448201527306265206265747765656e203020616e64203130360641b6064820152608401610b90565b60038260ff1611156112915760405162461bcd60e51b8152600401610b9090612e05565b60ff909116600090815260276020526040902060030155565b6001546001600160a01b031633146112d45760405162461bcd60e51b8152600401610b9090612de2565b60648111156113425760405162461bcd60e51b815260206004820152603460248201527f544f4b454e3a204d61726b6574696e6720736861726520666565206d7573742060448201527306265206265747765656e203020616e64203130360641b6064820152608401610b90565b60038260ff1611156113665760405162461bcd60e51b8152600401610b9090612e05565b60ff909116600090815260276020526040902060050155565b6001546001600160a01b031633146113a95760405162461bcd60e51b8152600401610b9090612de2565b6111d281612556565b6001546001600160a01b031633146113dc5760405162461bcd60e51b8152600401610b9090612de2565b60145460405160009133918381818185875af1925050503d806000811461141f576040519150601f19603f3d011682016040523d82523d6000602084013e611424565b606091505b505090508061146e5760405162461bcd60e51b81526020600482015260166024820152751513d2d1538e88151c985b9cd9995c8819985a5b195960521b6044820152606401610b90565b506000601455565b6001546001600160a01b031633146114a05760405162461bcd60e51b8152600401610b9090612de2565b601580549115156101000261ff0019909216919091179055565b6001546001600160a01b031633146114e45760405162461bcd60e51b8152600401610b9090612de2565b6009546114f59060ff16600a612fa5565b611501906103e8612fb4565b8110156115645760405162461bcd60e51b815260206004820152602b60248201527f544f4b454e3a204d61782073616c65206d757374206265206174206c6561737460448201526a080c481d1a1bdd5cd85b9960aa1b6064820152608401610b90565b60038211156115855760405162461bcd60e51b8152600401610b9090612e05565b806017836004811061159957611599612eab565b60040201600201819055505050565b6001546001600160a01b031633146115d25760405162461bcd60e51b8152600401610b9090612de2565b60318111156116355760405162461bcd60e51b815260206004820152602960248201527f544f4b454e3a2053656c6c20666565206d757374206265206265747765656e2060448201526803020616e64203130360bc1b6064820152608401610b90565b60038260ff1611156116595760405162461bcd60e51b8152600401610b9090612e05565b60ff909116600090815260276020526040902060020155565b6001546001600160a01b0316331461169c5760405162461bcd60e51b8152600401610b9090612de2565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146116e85760405162461bcd60e51b8152600401610b9090612de2565b600c805462ffff00191661010060ff9586160262ff000019161762010000938516939093029290921763ff000000191663010000009190931602919091179055565b60088054610c4c90612e48565b6001546001600160a01b031633146117615760405162461bcd60e51b8152600401610b9090612de2565b80600a60008282546117739190612fcb565b90915550506001546001600160a01b0316600090815260106020526040812080548392906117a2908490612fcb565b90915550506001546040518281526001600160a01b03909116906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a350565b60006117fe33848433611ee2565b50600192915050565b6001546001600160a01b031633146118315760405162461bcd60e51b8152600401610b9090612de2565b6009546118429060ff16600a612fa5565b61184e90612710612fb4565b8110156118b45760405162461bcd60e51b815260206004820152602e60248201527f544f4b454e3a204d61782077616c6c6574206d757374206265206174206c656160448201526d1cdd080c4c081d1a1bdd5cd85b9960921b6064820152608401610b90565b6009546118c59060ff16600a612fa5565b6118d290621e8480612fb4565b8111156119355760405162461bcd60e51b815260206004820152602b60248201527f544f4b454e3a204d61782077616c6c6574206d757374206265206174206d6f7360448201526a3a10191036b4b63634b7b760a91b6064820152608401610b90565b60038211156119565760405162461bcd60e51b8152600401610b9090612e05565b806017836004811061196a5761196a612eab565b60040201600101819055505050565b6001546001600160a01b031633146119a35760405162461bcd60e51b8152600401610b9090612de2565b6031811115611a055760405162461bcd60e51b815260206004820152602860248201527f544f4b454e3a2042757920666565206d757374206265206265747765656e2030604482015267020616e64203130360c41b6064820152608401610b90565b60038260ff161115611a295760405162461bcd60e51b8152600401610b9090612e05565b60ff909116600090815260276020526040902055565b6001546001600160a01b03163314611a695760405162461bcd60e51b8152600401610b9090612de2565b600b55565b6001546001600160a01b03163314611a985760405162461bcd60e51b8152600401610b9090612de2565b604051600090339047908381818185875af1925050503d8060008114611ada576040519150601f19603f3d011682016040523d82523d6000602084013e611adf565b606091505b5050905080611aed57600080fd5b600480546040516370a0823160e01b815230928101929092526001600160a01b03169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015611b40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b649190612fde565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611baf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd39190612ff7565b5033ff5b6001546001600160a01b03163314611c015760405162461bcd60e51b8152600401610b9090612de2565b6015805460ff1916911515919091179055565b6001546001600160a01b03163314611c3e5760405162461bcd60e51b8152600401610b9090612de2565b6001546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611c8b576040519150601f19603f3d011682016040523d82523d6000602084013e611c90565b606091505b505090508061146e5760405162461bcd60e51b815260206004820152601a60248201527f544f4b454e3a20455448207472616e73666572206661696c65640000000000006044820152606401610b90565b6001546001600160a01b03163314611d0b5760405162461bcd60e51b8152600401610b9090612de2565b60038160ff161115611d2f5760405162461bcd60e51b8152600401610b9090612e05565b6001600160a01b03919091166000908152600d60205260409020805460ff191660ff909216919091179055565b6001546001600160a01b03163314611d865760405162461bcd60e51b8152600401610b9090612de2565b600480546040516370a0823160e01b815230928101929092526000916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611dd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df89190612fde565b6004805460015460405163a9059cbb60e01b81526001600160a01b039182169381019390935260248301849052929350919091169063a9059cbb906044016020604051808303816000875af1158015611e55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e799190612ff7565b5050565b6001546001600160a01b03163314611ea75760405162461bcd60e51b8152600401610b9090612de2565b600180546001600160a01b039092166001600160a01b031990921682178155600091825260208290526040909120805460ff19169091179055565b6001600160a01b0381166000908152600e602052604090205460ff1615611f4b5760405162461bcd60e51b815260206004820152601c60248201527f544f4b454e3a2053656e64657220697320626c61636b6c6973746564000000006044820152606401610b90565b6001600160a01b0383166000908152600e602052604090205460ff1615611fb45760405162461bcd60e51b815260206004820152601f60248201527f544f4b454e3a20526563697069656e7420697320626c61636b6c6973746564006044820152606401610b90565b6005546000906001600160a01b0386811691161480611fe057506004546001600160a01b038681169116145b6005549091506000906001600160a01b038681169116148061200f57506004546001600160a01b038681169116145b905060006001600160a01b03871630148061203257506001600160a01b03861630145b905060008380156120405750825b905060008461204f5788612051565b875b90506000838061205e5750825b8061208e5750600c546001600160a01b038b166000908152600d602052604090205460ff90811661010090920416145b806120be5750600c546001600160a01b038a166000908152600d602052604090205460ff90811661010090920416145b806120d657506001546001600160a01b038b81169116145b806120ee57506001546001600160a01b038a81169116145b9050801561210c576121018a8a8a612627565b505050505050612550565b60155460ff1661215e5760405162461bcd60e51b815260206004820152601760248201527f544f4b454e3a2053776170206e6f7420656e61626c65640000000000000000006044820152606401610b90565b6001600160a01b0382166000908152600d602052604090205460ff1685156121ef576017816004811061219357612193612eab565b60040201600201548911156121ea5760405162461bcd60e51b815260206004820152601a60248201527f544f4b454e3a2053656c6c206c696d69742065786365656465640000000000006044820152606401610b90565b61230c565b6017816004811061220257612202612eab565b60040201600301548911156122595760405162461bcd60e51b815260206004820152601860248201527f544f4b454e3a207478206c696d697420657863656564656400000000000000006044820152606401610b90565b60006017826004811061226e5761226e612eab565b6004020160010154111561230c576001600160a01b038a16600090815260106020526040902054601782600481106122a8576122a8612eab565b60040201600101548a826122bc9190612fcb565b111561230a5760405162461bcd60e51b815260206004820152601c60248201527f544f4b454e3a2057616c6c6574206c696d6974206578636565646564000000006044820152606401610b90565b505b6001600160a01b038b166000908152600f602052604090205460ff166123e05760006017826004811061234157612341612eab565b6004020154905080156123de576001600160a01b038c166000908152601660205260409020544290612374908390612fcb565b11156123c25760405162461bcd60e51b815260206004820152601b60248201527f544f4b454e3a20436f6f6c646f776e206e6f74206578706972656400000000006044820152606401610b90565b6001600160a01b038c1660009081526016602052604090204290555b505b60008715612401575060ff811660009081526027602052604090205461243b565b8615612423575060ff811660009081526027602052604090206002015461243b565b5060ff81166000908152602760205260409020600101545b8060000361245b5761244e8c8c8c612627565b5050505050505050612550565b6000806124688c84612749565b915091506124778e8e83612627565b6124828e3084612627565b60008060006124918588612777565b9250925092506000811180156124b65750306000908152601060205260409020548111155b156124c4576124c481612556565b60008311806124d35750600082115b156125425781601260008282546124ea9190612fcb565b9250508190555082601360008282546125039190612fcb565b9091555050600b543060009081526010602052604090205411156125425766b1a2bc2ec5000047111561254257600c5460ff1661254257612542612811565b505050505050505050505050505b50505050565b306000908152601060205260409020548111156125b55760405162461bcd60e51b815260206004820181905260248201527f544f4b454e3a204e6f7420656e6f75676820746f6b656e7320746f206275726e6044820152606401610b90565b30600090815260106020526040812080548392906125d4908490612e98565b9250508190555080600a60008282546125ed9190612e98565b909155505060405181815260009030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016117e5565b6001600160a01b03831660009081526010602052604090205481111561269b5760405162461bcd60e51b8152602060048201526024808201527f544f4b454e3a204e6f7420656e6f75676820746f6b656e7320746f207472616e60448201526339b332b960e11b6064820152608401610b90565b6001600160a01b038316600090815260106020526040812080548392906126c3908490612e98565b90915550506001600160a01b038216600090815260106020526040812080548392906126f0908490612fcb565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161273c91815260200190565b60405180910390a3505050565b60008060646127588486612fb4565b6127629190613014565b915061276e8285612e98565b90509250929050565b60ff81166000908152602760205260408120600301548190819060649061279e9087612fb4565b6127a89190613014565b60ff85166000908152602760205260409020600501549093506064906127ce9087612fb4565b6127d89190613014565b60ff85166000908152602760205260409020600401549092506064906127fe9087612fb4565b6128089190613014565b90509250925092565b60135415806128205750601254155b1561282757565b600c805460ff1916600117905560135460009061284690600290613014565b90506000816013546128589190612e98565b905060006128726012548361286d9190612fcb565b6128da565b90506000601254836128849190612fcb565b61288e8484612fb4565b6128989190613014565b905060006128a68284612e98565b90506128b28583612aae565b80601460008282546128c49190612fcb565b9091555050600c805460ff191690555050505050565b306000908152601060205260408120548211156129395760405162461bcd60e51b815260206004820181905260248201527f544f4b454e3a204e6f7420656e6f75676820746f6b656e7320746f20737761706044820152606401610b90565b30600090815260106020526040808220548151600280825260608201909352909291816020016020820280368337019050509050308160008151811061298157612981612eab565b6001600160a01b03928316602091820292909201810191909152600254604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156129da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129fe9190613036565b81600181518110612a1157612a11612eab565b6001600160a01b03928316602091820292909201015260025460405163791ac94760e01b815291169063791ac94790612a57908790600090869030904290600401613053565b600060405180830381600087803b158015612a7157600080fd5b505af1158015612a85573d6000803e3d6000fd5b5050306000908152601060205260409020549150612aa590508382612e98565b95945050505050565b306000818152601160209081526040808320600580546001600160a01b039081168652919093528184208790559154905163f305d71960e01b8152600481018590526024810187905260448101849052606481019390935260848301939093524260a4830152919091169063f305d71990839060c40160606040518083038185885af1158015612b42573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b6791906130c4565b5050505050565b803560ff81168114612b7f57600080fd5b919050565b60008060408385031215612b9757600080fd5b612ba083612b6e565b946020939093013593505050565b6001600160a01b03811681146111d257600080fd5b60008060408385031215612bd657600080fd5b8235612be181612bae565b91506020830135612bf181612bae565b809150509250929050565b600060208083528351808285015260005b81811015612c2957858101830151858201604001528201612c0d565b506000604082860101526040601f19601f8301168501019250505092915050565b60008060408385031215612c5d57600080fd5b8235612ba081612bae565b600060208284031215612c7a57600080fd5b8135612c8581612bae565b9392505050565b600060208284031215612c9e57600080fd5b5035919050565b600080600060608486031215612cba57600080fd5b8335612cc581612bae565b92506020840135612cd581612bae565b929592945050506040919091013590565b80151581146111d257600080fd5b60008060408385031215612d0757600080fd5b8235612d1281612bae565b91506020830135612bf181612ce6565b600060208284031215612d3457600080fd5b612c8582612b6e565b60008060408385031215612d5057600080fd5b50508035926020909101359150565b600060208284031215612d7157600080fd5b8135612c8581612ce6565b600080600060608486031215612d9157600080fd5b612d9a84612b6e565b9250612da860208501612b6e565b915061280860408501612b6e565b60008060408385031215612dc957600080fd5b8235612dd481612bae565b915061276e60208401612b6e565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b60208082526023908201527f544f4b454e3a204c697374206d757374206265206265747765656e203020616e60408201526264203360e81b606082015260800190565b600181811c90821680612e5c57607f821691505b602082108103612e7c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610d5157610d51612e82565b634e487b7160e01b600052603260045260246000fd5b600181815b80851115612efc578160001904821115612ee257612ee2612e82565b80851615612eef57918102915b93841c9390800290612ec6565b509250929050565b600082612f1357506001610d51565b81612f2057506000610d51565b8160018114612f365760028114612f4057612f5c565b6001915050610d51565b60ff841115612f5157612f51612e82565b50506001821b610d51565b5060208310610133831016604e8410600b8410161715612f7f575081810a610d51565b612f898383612ec1565b8060001904821115612f9d57612f9d612e82565b029392505050565b6000612c8560ff841683612f04565b8082028115828204841417610d5157610d51612e82565b80820180821115610d5157610d51612e82565b600060208284031215612ff057600080fd5b5051919050565b60006020828403121561300957600080fd5b8151612c8581612ce6565b60008261303157634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561304857600080fd5b8151612c8581612bae565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156130a35784516001600160a01b03168352938301939183019160010161307e565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156130d957600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220b80ba6840b10a8f3d1ae04d7be2d9e7421812b9e7f23621a26e20f43ce63ee9664736f6c63430008120033

Deployed Bytecode Sourcemap

11857:21197:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20338:327;;;;;;;;;;-1:-1:-1;20338:327:0;;;;;:::i;:::-;;:::i;12820:68::-;;;;;;;;;;-1:-1:-1;12820:68:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;1105:25:1;;;1093:2;1078:18;12820:68:0;;;;;;;;12116:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;16631:245::-;;;;;;;;;;-1:-1:-1;16631:245:0;;;;;:::i;:::-;;:::i;:::-;;;2179:14:1;;2172:22;2154:41;;2142:2;2127:18;16631:245:0;2014:187:1;13138:43:0;;;;;;;;;;-1:-1:-1;13138:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;12226:55;;;;;;;;;;;;;;;;13375:23;;;;;;;;;;-1:-1:-1;13375:23:0;;;;;:::i;:::-;;:::i;:::-;;;;2874:25:1;;;2930:2;2915:18;;2908:34;;;;2958:18;;;2951:34;3016:2;3001:18;;2994:34;2861:3;2846:19;13375:23:0;2643:391:1;16161:329:0;;;;;;;;;;-1:-1:-1;16161:329:0;;;;;:::i;:::-;;:::i;12665:55::-;;;;;;;;;;-1:-1:-1;12665:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;2202:93;;;;;;;;;;-1:-1:-1;2202:93:0;;;;;:::i;:::-;;:::i;1704:106::-;;;;;;;;;;-1:-1:-1;1704:106:0;;;;;:::i;:::-;;:::i;21582:279::-;;;;;;;;;;-1:-1:-1;21812:10:0;;21582:279;;;21812:10;;;;;;4200:36:1;;21812:10:0;21824:15;;;;4267:2:1;4252:18;;4245:45;21841:11:0;;;;;;;4306:18:1;;;4299:45;4188:2;4173:18;21582:279:0;4010:340:1;12193:26:0;;;;;;;;;;-1:-1:-1;12193:26:0;;;;;;;;;;;4527:4:1;4515:17;;;4497:36;;4485:2;4470:18;12193:26:0;4355:184:1;12013:28:0;;;;;;;;;;-1:-1:-1;12013:28:0;;;;-1:-1:-1;;;;;12013:28:0;;;;;;-1:-1:-1;;;;;4708:32:1;;;4690:51;;4678:2;4663:18;12013:28:0;4544:203:1;19213:318:0;;;;;;;;;;-1:-1:-1;19213:318:0;;;;;:::i;:::-;;:::i;13626:35::-;;;;;;;;;;-1:-1:-1;13626:35:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5226:25:1;;;5282:2;5267:18;;5260:34;;;;5310:18;;;5303:34;;;;5368:2;5353:18;;5346:34;5411:3;5396:19;;5389:35;5455:3;5440:19;;5433:35;5213:3;5198:19;13626:35:0;4939:535:1;17620:401:0;;;;;;;;;;-1:-1:-1;17620:401:0;;;;;:::i;:::-;;:::i;22149:176::-;;;;;;;;;;;;;:::i;19924:362::-;;;;;;;;;;-1:-1:-1;19924:362:0;;;;;:::i;:::-;;:::i;20720:350::-;;;;;;;;;;-1:-1:-1;20720:350:0;;;;;:::i;:::-;;:::i;17233:84::-;;;;;;;;;;-1:-1:-1;17233:84:0;;;;;:::i;:::-;;:::i;12895:26::-;;;;;;;;;;;;;;;;22389:205;;;;;;;;;;;;;:::i;17430:105::-;;;;;;;;;;-1:-1:-1;17430:105:0;;;;;:::i;:::-;;:::i;18534:301::-;;;;;;;;;;-1:-1:-1;18534:301:0;;;;;:::i;:::-;;:::i;13059:31::-;;;;;;;;;;-1:-1:-1;13059:31:0;;;;;;;;12768:45;;;;;;;;;;-1:-1:-1;12768:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;16498:125;;;;;;;;;;-1:-1:-1;16498:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;16598:17:0;16563:15;16598:17;;;:9;:17;;;;;;;16498:125;19577:290;;;;;;;;;;-1:-1:-1;19577:290:0;;;;;:::i;:::-;;:::i;32339:95::-;;;;;;;;;;-1:-1:-1;32339:95:0;;;;;:::i;:::-;;:::i;32510:190::-;;;;;;;;;;-1:-1:-1;32510:190:0;;;;;:::i;:::-;;:::i;12158:28::-;;;;;;;;;;;;;:::i;12050:25::-;;;;;;;;;;-1:-1:-1;12050:25:0;;;;-1:-1:-1;;;;;12050:25:0;;;12941:28;;;;;;;;;;;;;;;;17049:176;;;;;;;;;;-1:-1:-1;17049:176:0;;;;;:::i;:::-;;:::i;12989:26::-;;;;;;;;;;;;;;;;11947;;;;;;;;;;-1:-1:-1;11947:26:0;;;;-1:-1:-1;;;;;11947:26:0;;;11980;;;;;;;;;;-1:-1:-1;11980:26:0;;;;-1:-1:-1;;;;;11980:26:0;;;15980:173;;;;;;;;;;-1:-1:-1;15980:173:0;;;;;:::i;:::-;;:::i;13097:34::-;;;;;;;;;;-1:-1:-1;13097:34:0;;;;;;;;;;;18069:419;;;;;;;;;;-1:-1:-1;18069:419:0;;;;;:::i;:::-;;:::i;1599:99::-;;;;;;;;;;-1:-1:-1;1599:99:0;;;;;:::i;:::-;-1:-1:-1;;;;;1677:13:0;1653:4;1677:13;;;;;;;;;;;;;;1599:99;12538:38;;;;;;;;;;-1:-1:-1;12538:38:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;18880:283;;;;;;;;;;-1:-1:-1;18880:283:0;;;;;:::i;:::-;;:::i;21121:110::-;;;;;;;;;;-1:-1:-1;21121:110:0;;;;;:::i;:::-;;:::i;32745:306::-;;;;;;;;;;;;;:::i;12394:18::-;;;;;;;;;;-1:-1:-1;12394:18:0;;;;;;;;12583:44;;;;;;;;;;-1:-1:-1;12583:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;16884:157;;;;;;;;;;-1:-1:-1;16884:157:0;;;;;:::i;:::-;-1:-1:-1;;;;;17004:19:0;;;16967:17;17004:19;;;:11;:19;;;;;;;;:29;;;;;;;;;;;;;16884:157;17325:97;;;;;;;;;;-1:-1:-1;17325:97:0;;;;;:::i;:::-;;:::i;32054:249::-;;;;;;;;;;;;;:::i;12317:45::-;;;;;;;;;;;;;;;;21337:189;;;;;;;;;;-1:-1:-1;21337:189:0;;;;;:::i;:::-;;:::i;31833:180::-;;;;;;;;;;;;;:::i;21949:135::-;;;;;;;;;;-1:-1:-1;21949:135:0;;;;;:::i;:::-;;:::i;11908:32::-;;;;;;;;;;-1:-1:-1;11908:32:0;;;;-1:-1:-1;;;;;11908:32:0;;;20338:327;2008:5;;-1:-1:-1;;;;;2008:5:0;1996:10;:17;1988:39;;;;-1:-1:-1;;;1988:39:0;;;;;;;:::i;:::-;;;;;;;;;20471:3:::1;20454:13;:20;;20424:102;;;::::0;-1:-1:-1;;;20424:102:0;;7630:2:1;20424:102:0::1;::::0;::::1;7612:21:1::0;7669:2;7649:18;;;7642:30;7708:34;7688:18;;;7681:62;-1:-1:-1;;;7759:18:1;;;7752:45;7814:19;;20424:102:0::1;7428:411:1::0;20424:102:0::1;20568:1;20559:5;:10;;;;20537:72;;;;-1:-1:-1::0;;;20537:72:0::1;;;;;;;:::i;:::-;20620:11;::::0;;::::1;;::::0;;;:4:::1;:11;::::0;;;;:21:::1;;:37:::0;20338:327::o;12116:35::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16631:245::-;16707:12;-1:-1:-1;;;;;16740:22:0;;:10;:22;16732:61;;;;-1:-1:-1;;;16732:61:0;;8835:2:1;16732:61:0;;;8817:21:1;8874:2;8854:18;;;8847:30;8913:28;8893:18;;;8886:56;8959:18;;16732:61:0;8633:350:1;16732:61:0;-1:-1:-1;16816:10:0;16804:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;16804:33:0;;;;;;;;;:42;;;16864:4;16631:245;;;;;:::o;13375:23::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13375:23:0;;;:::o;16161:329::-;-1:-1:-1;;;;;16285:18:0;;16252:12;16285:18;;;:11;:18;;;;;;;;16304:10;16285:30;;;;;;;;:40;-1:-1:-1;16285:40:0;16277:80;;;;-1:-1:-1;;;16277:80:0;;9190:2:1;16277:80:0;;;9172:21:1;9229:2;9209:18;;;9202:30;9268:29;9248:18;;;9241:57;9315:18;;16277:80:0;8988:351:1;16277:80:0;-1:-1:-1;;;;;16368:18:0;;;;;;:11;:18;;;;;;;;16387:10;16368:30;;;;;;;:40;;16402:6;;16368:18;:40;;16402:6;;16368:40;:::i;:::-;;;;-1:-1:-1;16419:41:0;;-1:-1:-1;16429:5:0;16436:3;16441:6;16449:10;16419:9;:41::i;:::-;-1:-1:-1;16478:4:0;16161:329;;;;;:::o;2202:93::-;1864:10;1856:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;1891:5:0;;-1:-1:-1;;;;;1891:5:0;1879:10;:17;1856:40;1847:63;;;;-1:-1:-1;;;1847:63:0;;;;;;;:::i;:::-;2270:5:::1;:17:::0;;-1:-1:-1;;;;;;2270:17:0::1;-1:-1:-1::0;;;;;2270:17:0;;;::::1;::::0;;;::::1;::::0;;2202:93::o;1704:106::-;1864:10;1856:7;:19;;;;;;;;;;;;;;:40;;-1:-1:-1;1891:5:0;;-1:-1:-1;;;;;1891:5:0;1879:10;:17;1856:40;1847:63;;;;-1:-1:-1;;;1847:63:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1781:13:0;;;::::1;:7;:13:::0;;;::::1;::::0;;;;;;:21;;-1:-1:-1;;1781:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;1704:106::o;19213:318::-;2008:5;;-1:-1:-1;;;;;2008:5:0;1996:10;:17;1988:39;;;;-1:-1:-1;;;1988:39:0;;;;;;;:::i;:::-;19342:2:::1;19326:12;:18;;19297:97;;;::::0;-1:-1:-1;;;19297:97:0;;9811:2:1;19297:97:0::1;::::0;::::1;9793:21:1::0;9850:2;9830:18;;;9823:30;9889:34;9869:18;;;9862:62;-1:-1:-1;;;9940:18:1;;;9933:43;9993:19;;19297:97:0::1;9609:409:1::0;19297:97:0::1;19436:1;19427:5;:10;;;;19405:72;;;;-1:-1:-1::0;;;19405:72:0::1;;;;;;;:::i;:::-;19488:11;::::0;;::::1;;::::0;;;:4:::1;:11;::::0;;;;:20:::1;;:35:::0;19213:318::o;17620:401::-;2008:5;;-1:-1:-1;;;;;2008:5:0;1996:10;:17;1988:39;;;;-1:-1:-1;;;1988:39:0;;;;;;;:::i;:::-;17731:9:::1;17718;:22;;17710:76;;;::::0;-1:-1:-1;;;17710:76:0;;10225:2:1;17710:76:0::1;::::0;::::1;10207:21:1::0;10264:2;10244:18;;;10237:30;10303:34;10283:18;;;10276:62;-1:-1:-1;;;10354:18:1;;;10347:39;10403:19;;17710:76:0::1;10023:405:1::0;17710:76:0::1;17818:9;17805;:22;;17797:75;;;::::0;-1:-1:-1;;;17797:75:0;;10635:2:1;17797:75:0::1;::::0;::::1;10617:21:1::0;10674:2;10654:18;;;10647:30;10713:34;10693:18;;;10686:62;-1:-1:-1;;;10764:18:1;;;10757:38;10812:19;;17797:75:0::1;10433:404:1::0;17797:75:0::1;17914:1;17905:5;:10;;17883:72;;;;-1:-1:-1::0;;;17883:72:0::1;;;;;;;:::i;:::-;18004:9;17966:6;17973:5;17966:13;;;;;;;:::i;:::-;;;;:47:::0;-1:-1:-1;;17620:401:0:o;22149:176::-;2008:5;;-1:-1:-1;;;;;2008:5:0;1996:10;:17;1988:39;;;;-1:-1:-1;;;1988:39:0;;;;;;;:::i;:::-;22215:49:::1;::::0;22198:12:::1;::::0;22215:10:::1;::::0;22238:21:::1;::::0;22198:12;22215:49;22198:12;22215:49;22238:21;22215:10;:49:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22197:67;;;22283:7;22275:42;;;::::0;-1:-1:-1;;;22275:42:0;;11386:2:1;22275:42:0::1;::::0;::::1;11368:21:1::0;11425:2;11405:18;;;11398:30;-1:-1:-1;;;11444:18:1;;;11437:52;11506:18;;22275:42:0::1;11184:346:1::0;22275:42:0::1;22186:139;22149:176::o:0;19924:362::-;2008:5;;-1:-1:-1;;;;;2008:5:0;1996:10;:17;1988:39;;;;-1:-1:-1;;;1988:39:0;;;;;;;:::i;:::-;20077:3:::1;20055:18;:25;;20020:117;;;::::0;-1:-1:-1;;;20020:117:0;;11737:2:1;20020:117:0::1;::::0;::::1;11719:21:1::0;11776:2;11756:18;;;11749:30;11815:34;11795:18;;;11788:62;-1:-1:-1;;;11866:18:1;;;11859:50;11926:19;;20020:117:0::1;11535:416:1::0;20020:117:0::1;20179:1;20170:5;:10;;;;20148:72;;;;-1:-1:-1::0;;;20148:72:0::1;;;;;;;:::i;:::-;20231:11;::::0;;::::1;;::::0;;;:4:::1;:11;::::0;;;;:26:::1;;:47:::0;19924:362::o;20720:350::-;2008:5;;-1:-1:-1;;;;;2008:5:0;1996:10;:17;1988:39;;;;-1:-1:-1;;;1988:39:0;;;;;;;:::i;:::-;20865:3:::1;20845:16;:23;;20812:113;;;::::0;-1:-1:-1;;;20812:113:0;;12158:2:1;20812:113:0::1;::::0;::::1;12140:21:1::0;12197:2;12177:18;;;12170:30;12236:34;12216:18;;;12209:62;-1:-1:-1;;;12287:18:1;;;12280:50;12347:19;;20812:113:0::1;11956:416:1::0;20812:113:0::1;20967:1;20958:5;:10;;;;20936:72;;;;-1:-1:-1::0;;;20936:72:0::1;;;;;;;:::i;:::-;21019:11;::::0;;::::1;;::::0;;;:4:::1;:11;::::0;;;;:24:::1;;:43:::0;20720:350::o;17233:84::-;2008:5;;-1:-1:-1;;;;;2008:5:0;1996:10;:17;1988:39;;;;-1:-1:-1;;;1988:39:0;;;;;;;:::i;:::-;17289:20:::1;17301:7;17289:11;:20::i;22389:205::-:0;2008:5;;-1:-1:-1;;;;;2008:5:0;1996:10;:17;1988:39;;;;-1:-1:-1;;;1988:39:0;;;;;;;:::i;:::-;22485:14:::1;::::0;22462:42:::1;::::0;22445:12:::1;::::0;22462:10:::1;::::0;22445:12;22462:42;22445:12;22462:42;22485:14;22462:10;:42:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22444:60;;;22523:7;22515:42;;;::::0;-1:-1:-1;;;22515:42:0;;11386:2:1;22515:42:0::1;::::0;::::1;11368:21:1::0;11425:2;11405:18;;;11398:30;-1:-1:-1;;;11444:18:1;;;11437:52;11506:18;;22515:42:0::1;11184:346:1::0;22515:42:0::1;-1:-1:-1::0;22585:1:0::1;22568:14;:18:::0;22389:205::o;17430:105::-;2008:5;;-1:-1:-1;;;;;2008:5:0;1996:10;:17;1988:39;;;;-1:-1:-1;;;1988:39:0;;;;;;;:::i;:::-;17501:15:::1;:26:::0;;;::::1;;;;-1:-1:-1::0;;17501:26:0;;::::1;::::0;;;::::1;::::0;;17430:105::o;18534:301::-;2008:5;;-1:-1:-1;;;;;2008:5:0;1996:10;:17;1988:39;;;;-1:-1:-1;;;1988:39:0;;;;;;;:::i;:::-;18645:8:::1;::::0;18641:12:::1;::::0;18645:8:::1;;18641:2;:12;:::i;:::-;18629:24;::::0;:9:::1;:24;:::i;:::-;18617:8;:36;;18609:92;;;::::0;-1:-1:-1;;;18609:92:0;;14135:2:1;18609:92:0::1;::::0;::::1;14117:21:1::0;14174:2;14154:18;;;14147:30;14213:34;14193:18;;;14186:62;-1:-1:-1;;;14264:18:1;;;14257:41;14315:19;;18609:92:0::1;13933:407:1::0;18609:92:0::1;18743:1;18734:5;:10;;18712:72;;;;-1:-1:-1::0;;;18712:72:0::1;;;;;;;:::i;:::-;18819:8;18795:6;18802:5;18795:13;;;;;;;:::i;:::-;;;;:21;;:32;;;;18534:301:::0;;:::o;19577:290::-;2008:5;;-1:-1:-1;;;;;2008:5:0;1996:10;:17;1988:39;;;;-1:-1:-1;;;1988:39:0;;;;;;;:::i;:::-;19690:2:::1;19678:8;:14;;19653:85;;;::::0;-1:-1:-1;;;19653:85:0;;14547:2:1;19653:85:0::1;::::0;::::1;14529:21:1::0;14586:2;14566:18;;;14559:30;14625:34;14605:18;;;14598:62;-1:-1:-1;;;14676:18:1;;;14669:39;14725:19;;19653:85:0::1;14345:405:1::0;19653:85:0::1;19780:1;19771:5;:10;;;;19749:72;;;;-1:-1:-1::0;;;19749:72:0::1;;;;;;;:::i;:::-;19832:11;::::0;;::::1;;::::0;;;:4:::1;:11;::::0;;;;:16:::1;;:27:::0;19577:290::o;32339:95::-;2008:5;;-1:-1:-1;;;;;2008:5:0;1996:10;:17;1988:39;;;;-1:-1:-1;;;1988:39:0;;;;;;;:::i;:::-;32406:10:::1;:20:::0;;-1:-1:-1;;;;;;32406:20:0::1;-1:-1:-1::0;;;;;32406:20:0;;;::::1;::::0;;;::::1;::::0;;32339:95::o;32510:190::-;2008:5;;-1:-1:-1;;;;;2008:5:0;1996:10;:17;1988:39;;;;-1:-1:-1;;;1988:39:0;;;;;;;:::i;:::-;32604:15:::1;:24:::0;;-1:-1:-1;;32639:20:0;32604:24:::1;;::::0;;::::1;;-1:-1:-1::0;;32639:20:0;;;;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;32670:22:0::1;::::0;;;;::::1;;::::0;;;::::1;::::0;;32510:190::o;12158:28::-;;;;;;;:::i;17049:176::-;2008:5;;-1:-1:-1;;;;;2008:5:0;1996:10;:17;1988:39;;;;-1:-1:-1;;;1988:39:0;;;;;;;:::i;:::-;17120:7:::1;17105:11;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;17148:5:0::1;::::0;-1:-1:-1;;;;;17148:5:0::1;17138:16;::::0;;;:9:::1;:16;::::0;;;;:27;;17158:7;;17138:16;:27:::1;::::0;17158:7;;17138:27:::1;:::i;:::-;::::0;;;-1:-1:-1;;17202:5:0::1;::::0;17181:36:::1;::::0;1105:25:1;;;-1:-1:-1;;;;;17202:5:0;;::::1;::::0;::::1;::::0;17181:36:::1;::::0;1093:2:1;1078:18;17181:36:0::1;;;;;;;;17049:176:::0;:::o;15980:173::-;16052:12;16077:46;16087:10;16099:3;16104:6;16112:10;16077:9;:46::i;:::-;-1:-1:-1;16141:4:0;15980:173;;;;:::o;18069:419::-;2008:5;;-1:-1:-1;;;;;2008:5:0;1996:10;:17;1988:39;;;;-1:-1:-1;;;1988:39:0;;;;;;;:::i;:::-;18186:8:::1;::::0;18182:12:::1;::::0;18186:8:::1;;18182:2;:12;:::i;:::-;18170:24;::::0;:9:::1;:24;:::i;:::-;18156:10;:38;;18148:97;;;::::0;-1:-1:-1;;;18148:97:0;;15087:2:1;18148:97:0::1;::::0;::::1;15069:21:1::0;15126:2;15106:18;;;15099:30;15165:34;15145:18;;;15138:62;-1:-1:-1;;;15216:18:1;;;15209:44;15270:19;;18148:97:0::1;14885:410:1::0;18148:97:0::1;18294:8;::::0;18290:12:::1;::::0;18294:8:::1;;18290:2;:12;:::i;:::-;18278:24;::::0;:9:::1;:24;:::i;:::-;18264:10;:38;;18256:94;;;::::0;-1:-1:-1;;;18256:94:0;;15502:2:1;18256:94:0::1;::::0;::::1;15484:21:1::0;15541:2;15521:18;;;15514:30;15580:34;15560:18;;;15553:62;-1:-1:-1;;;15631:18:1;;;15624:41;15682:19;;18256:94:0::1;15300:407:1::0;18256:94:0::1;18392:1;18383:5;:10;;18361:72;;;;-1:-1:-1::0;;;18361:72:0::1;;;;;;;:::i;:::-;18470:10;18444:6;18451:5;18444:13;;;;;;;:::i;:::-;;;;:23;;:36;;;;18069:419:::0;;:::o;18880:283::-;2008:5;;-1:-1:-1;;;;;2008:5:0;1996:10;:17;1988:39;;;;-1:-1:-1;;;1988:39:0;;;;;;;:::i;:::-;18989:2:::1;18978:7;:13;;18954:82;;;::::0;-1:-1:-1;;;18954:82:0;;15914:2:1;18954:82:0::1;::::0;::::1;15896:21:1::0;15953:2;15933:18;;;15926:30;15992:34;15972:18;;;15965:62;-1:-1:-1;;;16043:18:1;;;16036:38;16091:19;;18954:82:0::1;15712:404:1::0;18954:82:0::1;19078:1;19069:5;:10;;;;19047:72;;;;-1:-1:-1::0;;;19047:72:0::1;;;;;;;:::i;:::-;19130:11;::::0;;::::1;;::::0;;;:4:::1;:11;::::0;;;;:25;18880:283::o;21121:110::-;2008:5;;-1:-1:-1;;;;;2008:5:0;1996:10;:17;1988:39;;;;-1:-1:-1;;;1988:39:0;;;;;;;:::i;:::-;21195:12:::1;:28:::0;21121:110::o;32745:306::-;2008:5;;-1:-1:-1;;;;;2008:5:0;1996:10;:17;1988:39;;;;-1:-1:-1;;;1988:39:0;;;;;;;:::i;:::-;32816:51:::1;::::0;32798:12:::1;::::0;32816:10:::1;::::0;32840:21:::1;::::0;32798:12;32816:51;32798:12;32816:51;32840:21;32816:10;:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32797:70;;;32886:7;32878:16;;;::::0;::::1;;32920:11;::::0;;32954:44:::1;::::0;-1:-1:-1;;;32954:44:0;;32992:4:::1;32954:44:::0;;::::1;4690:51:1::0;;;;-1:-1:-1;;;;;32920:11:0::1;::::0;32905:36:::1;::::0;32942:10:::1;::::0;32920:11;;32954:29:::1;::::0;4663:18:1;;32954:44:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32905:94;::::0;-1:-1:-1;;;;;;32905:94:0::1;::::0;;;;;;-1:-1:-1;;;;;16502:32:1;;;32905:94:0::1;::::0;::::1;16484:51:1::0;16551:18;;;16544:34;16457:18;;32905:94:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;33031:10:0::1;33010:33;17325:97:::0;2008:5;;-1:-1:-1;;;;;2008:5:0;1996:10;:17;1988:39;;;;-1:-1:-1;;;1988:39:0;;;;;;;:::i;:::-;17392:11:::1;:22:::0;;-1:-1:-1;;17392:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;17325:97::o;32054:249::-;2008:5;;-1:-1:-1;;;;;2008:5:0;1996:10;:17;1988:39;;;;-1:-1:-1;;;1988:39:0;;;;;;;:::i;:::-;32125:5:::1;::::0;:44:::1;::::0;32108:12:::1;::::0;-1:-1:-1;;;;;32125:5:0::1;::::0;32143:21:::1;::::0;32108:12;32125:44;32108:12;32125:44;32143:21;32125:5;:44:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32107:62;;;32188:7;32180:46;;;::::0;-1:-1:-1;;;32180:46:0;;17041:2:1;32180:46:0::1;::::0;::::1;17023:21:1::0;17080:2;17060:18;;;17053:30;17119:28;17099:18;;;17092:56;17165:18;;32180:46:0::1;16839:350:1::0;21337:189:0;2008:5;;-1:-1:-1;;;;;2008:5:0;1996:10;:17;1988:39;;;;-1:-1:-1;;;1988:39:0;;;;;;;:::i;:::-;21444:1:::1;21435:5;:10;;;;21413:72;;;;-1:-1:-1::0;;;21413:72:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21496:14:0;;;::::1;;::::0;;;:4:::1;:14;::::0;;;;:22;;-1:-1:-1;;21496:22:0::1;;::::0;;::::1;::::0;;;::::1;::::0;;21337:189::o;31833:180::-;2008:5;;-1:-1:-1;;;;;2008:5:0;1996:10;:17;1988:39;;;;-1:-1:-1;;;1988:39:0;;;;;;;:::i;:::-;31913:11:::1;::::0;;31906:44:::1;::::0;-1:-1:-1;;;31906:44:0;;31944:4:::1;31906:44:::0;;::::1;4690:51:1::0;;;;31891:12:0::1;::::0;-1:-1:-1;;;;;31913:11:0;;::::1;::::0;31906:29:::1;::::0;4663:18:1;;31906:44:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31968:11;::::0;;;31990:5;31961:44:::1;::::0;-1:-1:-1;;;31961:44:0;;-1:-1:-1;;;;;31990:5:0;;::::1;31961:44:::0;;::::1;16484:51:1::0;;;;16551:18;;;16544:34;;;31891:59:0;;-1:-1:-1;31968:11:0;;;::::1;::::0;31961:28:::1;::::0;16457:18:1;;31961:44:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31880:133;31833:180::o:0;21949:135::-;2008:5;;-1:-1:-1;;;;;2008:5:0;1996:10;:17;1988:39;;;;-1:-1:-1;;;1988:39:0;;;;;;;:::i;:::-;22023:5:::1;:17:::0;;-1:-1:-1;;;;;22023:17:0;;::::1;-1:-1:-1::0;;;;;;22023:17:0;;::::1;::::0;::::1;::::0;;:5:::1;22051:18:::0;;;::::1;::::0;;;;;;;:25;;-1:-1:-1;;22051:25:0::1;::::0;;::::1;::::0;;21949:135::o;23912:4696::-;-1:-1:-1;;;;;24069:21:0;;;;;;:11;:21;;;;;;;;24065:92;;;24107:38;;-1:-1:-1;;;24107:38:0;;17396:2:1;24107:38:0;;;17378:21:1;17435:2;17415:18;;;17408:30;17474;17454:18;;;17447:58;17522:18;;24107:38:0;17194:352:1;24065:92:0;-1:-1:-1;;;;;24229:16:0;;;;;;:11;:16;;;;;;;;24225:90;;;24262:41;;-1:-1:-1;;;24262:41:0;;17753:2:1;24262:41:0;;;17735:21:1;17792:2;17772:18;;;17765:30;17831:33;17811:18;;;17804:61;17882:18;;24262:41:0;17551:355:1;24225:90:0;24490:13;;24467:10;;-1:-1:-1;;;;;24481:22:0;;;24490:13;;24481:22;;24480:50;;-1:-1:-1;24518:11:0;;-1:-1:-1;;;;;24509:20:0;;;24518:11;;24509:20;24480:50;24563:13;;24467:63;;-1:-1:-1;24541:11:0;;-1:-1:-1;;;;;24556:20:0;;;24563:13;;24556:20;;24555:46;;-1:-1:-1;24589:11:0;;-1:-1:-1;;;;;24582:18:0;;;24589:11;;24582:18;24555:46;24541:60;-1:-1:-1;24612:23:0;-1:-1:-1;;;;;24639:22:0;;24656:4;24639:22;;24638:50;;-1:-1:-1;;;;;;24667:20:0;;24682:4;24667:20;24638:50;24612:76;;24699:24;24727:5;:15;;;;;24736:6;24727:15;24699:44;;24837:19;24859:5;:19;;24873:5;24859:19;;;24867:3;24859:19;24837:41;;24969:15;24987:18;:41;;;;25009:19;24987:41;:102;;;-1:-1:-1;25074:15:0;;-1:-1:-1;;;;;25059:11:0;;;;;;:4;:11;;;;;;25074:15;25059:11;;;25074:15;;;;;25059:30;24987:102;:134;;;-1:-1:-1;25106:15:0;;-1:-1:-1;;;;;25093:9:0;;;;;;:4;:9;;;;;;25106:15;25093:9;;;25106:15;;;;;25093:28;24987:134;:179;;;-1:-1:-1;25161:5:0;;-1:-1:-1;;;;;25152:14:0;;;25161:5;;25152:14;24987:179;:195;;;-1:-1:-1;25177:5:0;;-1:-1:-1;;;;;25170:12:0;;;25177:5;;25170:12;24987:195;24969:213;;25343:10;25339:99;;;25370:35;25386:5;25393:3;25398:6;25370:15;:35::i;:::-;25420:7;;;;;;;;25339:99;25529:11;;;;25524:78;;25557:33;;-1:-1:-1;;;25557:33:0;;18113:2:1;25557:33:0;;;18095:21:1;18152:2;18132:18;;;18125:30;18191:25;18171:18;;;18164:53;18234:18;;25557:33:0;17911:347:1;25524:78:0;-1:-1:-1;;;;;25730:17:0;;25712:15;25730:17;;;:4;:17;;;;;;;;25856:631;;;;25896:6;25903:10;25896:18;;;;;;;:::i;:::-;;;;:26;;;25887:6;:35;25883:112;;;25943:36;;-1:-1:-1;;;25943:36:0;;18465:2:1;25943:36:0;;;18447:21:1;18504:2;18484:18;;;18477:30;18543:28;18523:18;;;18516:56;18589:18;;25943:36:0;18263:350:1;25883:112:0;25856:631;;;26040:6;26047:10;26040:18;;;;;;;:::i;:::-;;;;:24;;;26031:6;:33;26027:108;;;26085:34;;-1:-1:-1;;;26085:34:0;;18820:2:1;26085:34:0;;;18802:21:1;18859:2;18839:18;;;18832:30;18898:26;18878:18;;;18871:54;18942:18;;26085:34:0;18618:348:1;26027:108:0;26245:1;26214:6;26221:10;26214:18;;;;;;;:::i;:::-;;;;:28;;;:32;26210:266;;;-1:-1:-1;;;;;26288:14:0;;26267:18;26288:14;;;:9;:14;;;;;;26350:6;26357:10;26350:18;;;;;;;:::i;:::-;;;;:28;;;26341:6;26325:13;:22;;;;:::i;:::-;:53;26321:140;;;26403:38;;-1:-1:-1;;;26403:38:0;;19173:2:1;26403:38:0;;;19155:21:1;19212:2;19192:18;;;19185:30;19251;19231:18;;;19224:58;19299:18;;26403:38:0;18971:352:1;26321:140:0;26248:228;26210:266;-1:-1:-1;;;;;26546:29:0;;;;;;:22;:29;;;;;;;;26541:371;;26592:13;26608:6;26615:10;26608:18;;;;;;;:::i;:::-;;;;:40;;-1:-1:-1;26667:12:0;;26663:238;;-1:-1:-1;;;;;26704:17:0;;;;;;:10;:17;;;;;;26735:15;;26704:28;;26724:8;;26704:28;:::i;:::-;:46;26700:132;;;26775:37;;-1:-1:-1;;;26775:37:0;;19530:2:1;26775:37:0;;;19512:21:1;19569:2;19549:18;;;19542:30;19608:29;19588:18;;;19581:57;19655:18;;26775:37:0;19328:351:1;26700:132:0;-1:-1:-1;;;;;26850:17:0;;;;;;:10;:17;;;;;26870:15;26850:35;;26663:238;26577:335;26541:371;26974:14;27003:5;26999:239;;;-1:-1:-1;27037:23:0;;;;;;;:4;:23;;;;;:27;26999:239;;;27086:6;27082:156;;;-1:-1:-1;27121:23:0;;;;;;;:4;:23;;;;;:28;;;27082:156;;;-1:-1:-1;27194:23:0;;;;;;;:4;:23;;;;;:32;;;27082:156;27315:9;27328:1;27315:14;27311:103;;27346:35;27362:5;27369:3;27374:6;27346:15;:35::i;:::-;27396:7;;;;;;;;;;27311:103;27456:13;27471;27488:28;27498:6;27506:9;27488;:28::i;:::-;27455:61;;;;27572:37;27588:5;27595:3;27600:8;27572:15;:37::i;:::-;27620:47;27636:5;27651:4;27658:8;27620:15;:47::i;:::-;27709:17;27728:15;27745:12;27761:32;27772:8;27782:10;27761;:32::i;:::-;27708:85;;;;;;27843:1;27833:7;:11;:50;;;;-1:-1:-1;27866:4:0;27848:24;;;;:9;:24;;;;;;:35;-1:-1:-1;27848:35:0;27833:50;27829:103;;;27900:20;27912:7;27900:11;:20::i;:::-;28004:1;27989:12;:16;:34;;;;28022:1;28009:10;:14;27989:34;27985:616;;;28102:10;28084:14;;:28;;;;;;;:::i;:::-;;;;;;;;28147:12;28127:16;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;28264:12:0;;28255:4;28237:24;;;;:9;:24;;;;;;:39;28233:357;;;28391:17;28367:21;:41;28363:212;;;28479:6;;;;28474:82;;28514:18;:16;:18::i;:::-;23998:4610;;;;;;;;;;;;;23912:4696;;;;;:::o;31455:304::-;31530:4;31512:24;;;;:9;:24;;;;;;:33;-1:-1:-1;31508:108:0;;;31562:42;;-1:-1:-1;;;31562:42:0;;19886:2:1;31562:42:0;;;19868:21:1;;;19905:18;;;19898:30;19964:34;19944:18;;;19937:62;20016:18;;31562:42:0;19684:356:1;31508:108:0;31644:4;31626:24;;;;:9;:24;;;;;:34;;31654:6;;31626:24;:34;;31654:6;;31626:34;:::i;:::-;;;;;;;;31686:6;31671:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;31708:43:0;;1105:25:1;;;31740:1:0;;31725:4;;31708:43;;1093:2:1;1078:18;31708:43:0;959:177:1;28665:312:0;-1:-1:-1;;;;;28754:16:0;;;;;;:9;:16;;;;;;:25;-1:-1:-1;28750:104:0;;;28796:46;;-1:-1:-1;;;28796:46:0;;20247:2:1;28796:46:0;;;20229:21:1;20286:2;20266:18;;;20259:30;20325:34;20305:18;;;20298:62;-1:-1:-1;;;20376:18:1;;;20369:34;20420:19;;28796:46:0;20045:400:1;28750:104:0;-1:-1:-1;;;;;28864:16:0;;;;;;:9;:16;;;;;:26;;28884:6;;28864:16;:26;;28884:6;;28864:26;:::i;:::-;;;;-1:-1:-1;;;;;;;28901:14:0;;;;;;:9;:14;;;;;:24;;28919:6;;28901:14;:24;;28919:6;;28901:24;:::i;:::-;;;;;;;;28957:3;-1:-1:-1;;;;;28941:28:0;28950:5;-1:-1:-1;;;;;28941:28:0;;28962:6;28941:28;;;;1105:25:1;;1093:2;1078:18;;959:177;28941:28:0;;;;;;;;28665:312;;;:::o;29061:253::-;29151:14;;29222:3;29206:13;29215:4;29206:6;:13;:::i;:::-;:19;;;;:::i;:::-;29194:31;-1:-1:-1;29248:18:0;29194:31;29248:6;:18;:::i;:::-;29236:30;;29061:253;;;;;:::o;29396:416::-;29575:18;;;29487;29575;;;:4;:18;;;;;:33;;;29487:18;;;;29611:3;;29567:41;;:5;:41;:::i;:::-;:47;;;;:::i;:::-;29647:18;;;;;;;:4;:18;;;;;:31;;;29551:63;;-1:-1:-1;29681:3:0;;29639:39;;:5;:39;:::i;:::-;:45;;;;:::i;:::-;29714:18;;;;;;;:4;:18;;;;;:28;;;29625:59;;-1:-1:-1;29745:3:0;;29706:36;;:5;:36;:::i;:::-;:42;;;;:::i;:::-;29695:53;;29396:416;;;;;:::o;29977:918::-;30058:16;;:21;;:44;;-1:-1:-1;30083:14:0;;:19;30058:44;30054:83;;;29977:918::o;30054:83::-;30176:6;:13;;-1:-1:-1;;30176:13:0;30185:4;30176:13;;;30266:16;;30176:6;;30266:20;;30285:1;;30266:20;:::i;:::-;30243:43;;30297:20;30339:15;30320:16;;:34;;;;:::i;:::-;30297:57;;30386:10;30399:50;30434:14;;30416:15;:32;;;;:::i;:::-;30399:16;:50::i;:::-;30386:63;;30538:18;30604:14;;30586:15;:32;;;;:::i;:::-;30559:23;30567:15;30559:5;:23;:::i;:::-;:60;;;;:::i;:::-;30538:81;-1:-1:-1;30630:16:0;30649:21;30538:81;30649:5;:21;:::i;:::-;30630:40;;30710:44;30723:15;30740:13;30710:12;:44::i;:::-;30815:11;30797:14;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;30873:6:0;:14;;-1:-1:-1;;30873:14:0;;;-1:-1:-1;;;;;29977:918:0:o;22675:689::-;22780:4;22732:10;22762:24;;;:9;:24;;;;;;:35;-1:-1:-1;22762:35:0;22755:115;;22816:42;;-1:-1:-1;;;22816:42:0;;20874:2:1;22816:42:0;;;20856:21:1;;;20893:18;;;20886:30;20952:34;20932:18;;;20925:62;21004:18;;22816:42:0;20672:356:1;22755:115:0;22913:4;22880:12;22895:24;;;:9;:24;;;;;;;22954:16;;22968:1;22954:16;;;;;;;;;22895:24;;22880:12;22954:16;;;;;;;;;;;;-1:-1:-1;22954:16:0;22930:40;;22999:4;22981;22986:1;22981:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;22981:23:0;;;:7;;;;;;;;;;:23;;;;23025:6;;:13;;;-1:-1:-1;;;23025:13:0;;;;:6;;;;;:11;;:13;;;;;22981:7;;23025:13;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23015:4;23020:1;23015:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;23015:23:0;;;:7;;;;;;;;;:23;23049:6;;:196;;-1:-1:-1;;;23049:196:0;;:6;;;:57;;:196;;23125:7;;23049:6;;23173:4;;23205;;23229:15;;23049:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23290:4:0;23256:13;23272:24;;;:9;:24;;;;;;;-1:-1:-1;23315:18:0;;-1:-1:-1;23326:7:0;23272:24;23315:18;:::i;:::-;23307:26;22675:689;-1:-1:-1;;;;;22675:689:0:o;30987:435::-;31126:4;31106:26;;;;:11;:26;;;;;;;;31133:13;;;-1:-1:-1;;;;;31133:13:0;;;31106:41;;;;;;;;;:51;;;31220:13;;31201:213;;-1:-1:-1;;;31201:213:0;;;;;22747:34:1;;;22797:18;;;22790:34;;;22840:18;;;22833:34;;;22883:18;;;22876:34;;;;22926:19;;;22919:44;;;;31388:15:0;22979:19:1;;;22972:35;31220:13:0;;;;;31201:49;;31258:4;;22681:19:1;;31201:213:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;30987:435;;:::o;14:156:1:-;80:20;;140:4;129:16;;119:27;;109:55;;160:1;157;150:12;109:55;14:156;;;:::o;175:250::-;241:6;249;302:2;290:9;281:7;277:23;273:32;270:52;;;318:1;315;308:12;270:52;341:27;358:9;341:27;:::i;:::-;331:37;415:2;400:18;;;;387:32;;-1:-1:-1;;;175:250:1:o;430:131::-;-1:-1:-1;;;;;505:31:1;;495:42;;485:70;;551:1;548;541:12;566:388;634:6;642;695:2;683:9;674:7;670:23;666:32;663:52;;;711:1;708;701:12;663:52;750:9;737:23;769:31;794:5;769:31;:::i;:::-;819:5;-1:-1:-1;876:2:1;861:18;;848:32;889:33;848:32;889:33;:::i;:::-;941:7;931:17;;;566:388;;;;;:::o;1141:548::-;1253:4;1282:2;1311;1300:9;1293:21;1343:6;1337:13;1386:6;1381:2;1370:9;1366:18;1359:34;1411:1;1421:140;1435:6;1432:1;1429:13;1421:140;;;1530:14;;;1526:23;;1520:30;1496:17;;;1515:2;1492:26;1485:66;1450:10;;1421:140;;;1425:3;1610:1;1605:2;1596:6;1585:9;1581:22;1577:31;1570:42;1680:2;1673;1669:7;1664:2;1656:6;1652:15;1648:29;1637:9;1633:45;1629:54;1621:62;;;;1141:548;;;;:::o;1694:315::-;1762:6;1770;1823:2;1811:9;1802:7;1798:23;1794:32;1791:52;;;1839:1;1836;1829:12;1791:52;1878:9;1865:23;1897:31;1922:5;1897:31;:::i;2206:247::-;2265:6;2318:2;2306:9;2297:7;2293:23;2289:32;2286:52;;;2334:1;2331;2324:12;2286:52;2373:9;2360:23;2392:31;2417:5;2392:31;:::i;:::-;2442:5;2206:247;-1:-1:-1;;;2206:247:1:o;2458:180::-;2517:6;2570:2;2558:9;2549:7;2545:23;2541:32;2538:52;;;2586:1;2583;2576:12;2538:52;-1:-1:-1;2609:23:1;;2458:180;-1:-1:-1;2458:180:1:o;3039:456::-;3116:6;3124;3132;3185:2;3173:9;3164:7;3160:23;3156:32;3153:52;;;3201:1;3198;3191:12;3153:52;3240:9;3227:23;3259:31;3284:5;3259:31;:::i;:::-;3309:5;-1:-1:-1;3366:2:1;3351:18;;3338:32;3379:33;3338:32;3379:33;:::i;:::-;3039:456;;3431:7;;-1:-1:-1;;;3485:2:1;3470:18;;;;3457:32;;3039:456::o;3500:118::-;3586:5;3579:13;3572:21;3565:5;3562:32;3552:60;;3608:1;3605;3598:12;3623:382;3688:6;3696;3749:2;3737:9;3728:7;3724:23;3720:32;3717:52;;;3765:1;3762;3755:12;3717:52;3804:9;3791:23;3823:31;3848:5;3823:31;:::i;:::-;3873:5;-1:-1:-1;3930:2:1;3915:18;;3902:32;3943:30;3902:32;3943:30;:::i;4752:182::-;4809:6;4862:2;4850:9;4841:7;4837:23;4833:32;4830:52;;;4878:1;4875;4868:12;4830:52;4901:27;4918:9;4901:27;:::i;5479:248::-;5547:6;5555;5608:2;5596:9;5587:7;5583:23;5579:32;5576:52;;;5624:1;5621;5614:12;5576:52;-1:-1:-1;;5647:23:1;;;5717:2;5702:18;;;5689:32;;-1:-1:-1;5479:248:1:o;5732:241::-;5788:6;5841:2;5829:9;5820:7;5816:23;5812:32;5809:52;;;5857:1;5854;5847:12;5809:52;5896:9;5883:23;5915:28;5937:5;5915:28;:::i;5978:322::-;6049:6;6057;6065;6118:2;6106:9;6097:7;6093:23;6089:32;6086:52;;;6134:1;6131;6124:12;6086:52;6157:27;6174:9;6157:27;:::i;:::-;6147:37;;6203:36;6235:2;6224:9;6220:18;6203:36;:::i;:::-;6193:46;;6258:36;6290:2;6279:9;6275:18;6258:36;:::i;6535:317::-;6601:6;6609;6662:2;6650:9;6641:7;6637:23;6633:32;6630:52;;;6678:1;6675;6668:12;6630:52;6717:9;6704:23;6736:31;6761:5;6736:31;:::i;:::-;6786:5;-1:-1:-1;6810:36:1;6842:2;6827:18;;6810:36;:::i;7091:332::-;7293:2;7275:21;;;7332:1;7312:18;;;7305:29;-1:-1:-1;;;7365:2:1;7350:18;;7343:39;7414:2;7399:18;;7091:332::o;7844:399::-;8046:2;8028:21;;;8085:2;8065:18;;;8058:30;8124:34;8119:2;8104:18;;8097:62;-1:-1:-1;;;8190:2:1;8175:18;;8168:33;8233:3;8218:19;;7844:399::o;8248:380::-;8327:1;8323:12;;;;8370;;;8391:61;;8445:4;8437:6;8433:17;8423:27;;8391:61;8498:2;8490:6;8487:14;8467:18;8464:38;8461:161;;8544:10;8539:3;8535:20;8532:1;8525:31;8579:4;8576:1;8569:15;8607:4;8604:1;8597:15;8461:161;;8248:380;;;:::o;9344:127::-;9405:10;9400:3;9396:20;9393:1;9386:31;9436:4;9433:1;9426:15;9460:4;9457:1;9450:15;9476:128;9543:9;;;9564:11;;;9561:37;;;9578:18;;:::i;10842:127::-;10903:10;10898:3;10894:20;10891:1;10884:31;10934:4;10931:1;10924:15;10958:4;10955:1;10948:15;12377:422;12466:1;12509:5;12466:1;12523:270;12544:7;12534:8;12531:21;12523:270;;;12603:4;12599:1;12595:6;12591:17;12585:4;12582:27;12579:53;;;12612:18;;:::i;:::-;12662:7;12652:8;12648:22;12645:55;;;12682:16;;;;12645:55;12761:22;;;;12721:15;;;;12523:270;;;12527:3;12377:422;;;;;:::o;12804:806::-;12853:5;12883:8;12873:80;;-1:-1:-1;12924:1:1;12938:5;;12873:80;12972:4;12962:76;;-1:-1:-1;13009:1:1;13023:5;;12962:76;13054:4;13072:1;13067:59;;;;13140:1;13135:130;;;;13047:218;;13067:59;13097:1;13088:10;;13111:5;;;13135:130;13172:3;13162:8;13159:17;13156:43;;;13179:18;;:::i;:::-;-1:-1:-1;;13235:1:1;13221:16;;13250:5;;13047:218;;13349:2;13339:8;13336:16;13330:3;13324:4;13321:13;13317:36;13311:2;13301:8;13298:16;13293:2;13287:4;13284:12;13280:35;13277:77;13274:159;;;-1:-1:-1;13386:19:1;;;13418:5;;13274:159;13465:34;13490:8;13484:4;13465:34;:::i;:::-;13535:6;13531:1;13527:6;13523:19;13514:7;13511:32;13508:58;;;13546:18;;:::i;:::-;13584:20;;12804:806;-1:-1:-1;;;12804:806:1:o;13615:140::-;13673:5;13702:47;13743:4;13733:8;13729:19;13723:4;13702:47;:::i;13760:168::-;13833:9;;;13864;;13881:15;;;13875:22;;13861:37;13851:71;;13902:18;;:::i;14755:125::-;14820:9;;;14841:10;;;14838:36;;;14854:18;;:::i;16121:184::-;16191:6;16244:2;16232:9;16223:7;16219:23;16215:32;16212:52;;;16260:1;16257;16250:12;16212:52;-1:-1:-1;16283:16:1;;16121:184;-1:-1:-1;16121:184:1:o;16589:245::-;16656:6;16709:2;16697:9;16688:7;16684:23;16680:32;16677:52;;;16725:1;16722;16715:12;16677:52;16757:9;16751:16;16776:28;16798:5;16776:28;:::i;20450:217::-;20490:1;20516;20506:132;;20560:10;20555:3;20551:20;20548:1;20541:31;20595:4;20592:1;20585:15;20623:4;20620:1;20613:15;20506:132;-1:-1:-1;20652:9:1;;20450:217::o;21165:251::-;21235:6;21288:2;21276:9;21267:7;21263:23;21259:32;21256:52;;;21304:1;21301;21294:12;21256:52;21336:9;21330:16;21355:31;21380:5;21355:31;:::i;21421:980::-;21683:4;21731:3;21720:9;21716:19;21762:6;21751:9;21744:25;21788:2;21826:6;21821:2;21810:9;21806:18;21799:34;21869:3;21864:2;21853:9;21849:18;21842:31;21893:6;21928;21922:13;21959:6;21951;21944:22;21997:3;21986:9;21982:19;21975:26;;22036:2;22028:6;22024:15;22010:29;;22057:1;22067:195;22081:6;22078:1;22075:13;22067:195;;;22146:13;;-1:-1:-1;;;;;22142:39:1;22130:52;;22237:15;;;;22202:12;;;;22178:1;22096:9;22067:195;;;-1:-1:-1;;;;;;;22318:32:1;;;;22313:2;22298:18;;22291:60;-1:-1:-1;;;22382:3:1;22367:19;22360:35;22279:3;21421:980;-1:-1:-1;;;21421:980:1:o;23018:306::-;23106:6;23114;23122;23175:2;23163:9;23154:7;23150:23;23146:32;23143:52;;;23191:1;23188;23181:12;23143:52;23220:9;23214:16;23204:26;;23270:2;23259:9;23255:18;23249:25;23239:35;;23314:2;23303:9;23299:18;23293:25;23283:35;;23018:306;;;;;:::o

Swarm Source

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