ETH Price: $3,174.71 (+4.54%)

Token

Pervadefi (PVD)
 

Overview

Max Total Supply

521,779,302.529497340466017505 PVD

Holders

49

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
5,175,459.711361056276725933 PVD

Value
$0.00
0x64b80670149b3aab4aab34c3a88e9bf4b723eb21
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:
PervadefiErc

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

/********************************************************************************************

Pervadefi is a secure and growing protocol allowing leveraged yield staking on EVM chains.

Web : pervadefi.com | Community : t.me/pervadefi | Twitter : @Pervadefi | Medium : @pervadefi

*********************************************************************************************/

//SPDX-License-Identifier: UNLICENSED

pragma solidity >= 0.8.10;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address who) external view returns (uint256);
    function allowance(address _owner, address spender) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IOwnable {
    function owner() external view returns (address);
}

/**
 * @title SafeMath
 * @dev Math operations with safety checks that revert on error
 */
library SafeMath {

    int256 constant private INT256_MIN = -2**255;

    /**
    * @dev Multiplies two unsigned integers, reverts on overflow.
    */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

    /**
    * @dev Multiplies two signed integers, reverts on overflow.
    */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        require(!(a == -1 && b == INT256_MIN)); // This is the only case of overflow not detected by the check below

        int256 c = a * b;
        require(c / a == b);

        return c;
    }

    /**
    * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
    */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
    * @dev Integer division of two signed integers truncating the quotient, reverts on division by zero.
    */
    function div(int256 a, int256 b) internal pure returns (int256) {
        require(b != 0); // Solidity only automatically asserts when dividing by 0
        require(!(b == -1 && a == INT256_MIN)); // This is the only case of overflow

        int256 c = a / b;

        return c;
    }

    /**
    * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }

    /**
    * @dev Subtracts two signed integers, reverts on overflow.
    */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));

        return c;
    }

    /**
    * @dev Adds two unsigned integers, reverts on overflow.
    */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

    /**
    * @dev Adds two signed integers, reverts on overflow.
    */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));

        return c;
    }

    /**
    * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
    * reverts when dividing by zero.
    */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}

interface IBurnable {
    function burn(uint256 value) external;
    function burnFrom(address account, uint256 value) external;
}

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

interface IDEXRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    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 swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
    function swapExactTokensForTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
}

interface IDividendDistributor {
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external;
    function setShare(address shareholder, uint256 amount) external;
    function depositNative() external payable;
    function depositToken(address from, uint256 amount) external;
    function process(uint256 gas) external;
    function inSwap() external view returns (bool);
}

interface IWalletDistributor {
    function receiveToken(address token, address from, uint256 amount) external;
}

interface ITaxManager {
    receive() external payable;
    function lastSwapTime() external view returns (uint256);
    function inSwap() external view returns (bool);
    function createWalletTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external;
    function createDistributorTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external;
    function createDividendTax(string memory name, uint256 buyTax, uint256 sellTax, address dividendDistributor, bool convertToNative) external;
    function createBurnTax(string memory name, uint256 buyTax, uint256 sellTax) external;
    function createLiquidityTax(string memory name, uint256 buyTax, uint256 sellTax, address holder) external;
    function distribute() external;
    function getSellTax() external view returns (uint256);
    function getBuyTax() external view returns (uint256);
    function setTaxWallet(string memory taxName, address wallet) external;
    function setSellTax(string memory taxName, uint256 taxPercentage) external;
    function setBuyTax(string memory taxName, uint256 taxPercentage) external;
    function takeSellTax(uint256 value) external returns (uint256);
    function takeBuyTax(uint256 value) external returns (uint256);
}

interface IMevAntiBot {
  function setTokenOwner(address owner) external;
  function onPreTransferCheck(address from, address to, uint256 amount) external;
}

abstract contract BaseErc20 is IERC20, IOwnable {

    mapping (address => uint256) internal _balances;
    mapping (address => mapping (address => uint256)) internal _allowed;
    uint256 internal _totalSupply;
    bool internal _useSafeTransfer;
    
    string public symbol;
    string public  name;
    uint8 public decimals;
    
    address public override owner;
    address public operator;
    bool public isTradingEnabled = true;
    bool public launched;
    
    mapping (address => bool) public canAlwaysTrade;
    mapping (address => bool) public excludedFromSelling;
    mapping (address => bool) public exchanges;
    
    modifier onlyOwner() {
        require(msg.sender == owner, "can only be called by the contract owner");
        _;
    }
    
    modifier isLaunched() {
        require(launched, "can only be called once token is launched");
        _;
    }

    // @dev Trading is allowed before launch if the sender is the owner, we are transferring from the owner, or in canAlwaysTrade list
    modifier tradingEnabled(address from) {
        require((isTradingEnabled && launched) || from == owner || canAlwaysTrade[msg.sender], "trading not enabled");
        _;
    }
    
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    function configure(address _owner) internal virtual {
        owner = _owner;
        canAlwaysTrade[owner] = true;
        operator = owner;
    }

    /**
    * @dev Total number of tokens in existence
    */
    function totalSupply() external override view returns (uint256) {
        return _totalSupply;
    }

    /**
    * @dev Gets the balance of the specified address.
    * @param _owner The address to query the balance of.
    * @return An uint256 representing the amount owned by the passed address.
    */
    function balanceOf(address _owner) external override view returns (uint256) {
        return _balances[_owner];
    }

    /**
     * @dev Function to check the amount of tokens that an owner allowed to a spender.
     * @param _owner address The address which owns the funds.
     * @param spender address The address which will spend the funds.
     * @return A uint256 specifying the amount of tokens still available for the spender.
     */
    function allowance(address _owner, address spender) external override view returns (uint256) {
        return _allowed[_owner][spender];
    }

    /**
    * @dev Transfer token for a specified address
    * @param to The address to transfer to.
    * @param value The amount to be transferred.
    */
    function transfer(address to, uint256 value) external override tradingEnabled(msg.sender) returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    /**
     * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
     * Beware that changing an allowance with this method brings the risk that someone may use both the old
     * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
     * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     */
    function approve(address spender, uint256 value) external override tradingEnabled(msg.sender) returns (bool) {
        require(spender != address(0), "cannot approve the 0 address");

        _allowed[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    }

    /**
     * @dev Transfer tokens from one address to another.
     * Note that while this function emits an Approval event, this is not required as per the specification,
     * and other compliant implementations may not emit the event.
     * @param from address The address which you want to send tokens from
     * @param to address The address which you want to transfer to
     * @param value uint256 the amount of tokens to be transferred
     */
    function transferFrom(address from, address to, uint256 value) external override tradingEnabled(from) returns (bool) {
        _allowed[from][msg.sender] = _allowed[from][msg.sender] - value;
        _transfer(from, to, value);
        emit Approval(from, msg.sender, _allowed[from][msg.sender]);
        return true;
    }

    /**
     * @dev Increase the amount of tokens that an owner allowed to a spender.
     * approve should be called when allowed_[_spender] == 0. To increment
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     * Emits an Approval event.
     * @param spender The address which will spend the funds.
     * @param addedValue The amount of tokens to increase the allowance by.
     */
    function increaseAllowance(address spender, uint256 addedValue) external tradingEnabled(msg.sender) returns (bool) {
        require(spender != address(0), "cannot approve the 0 address");

        _allowed[msg.sender][spender] = _allowed[msg.sender][spender] + addedValue;
        emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
        return true;
    }

    /**
     * @dev Decrease the amount of tokens that an owner allowed to a spender.
     * approve should be called when allowed_[_spender] == 0. To decrement
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     * Emits an Approval event.
     * @param spender The address which will spend the funds.
     * @param subtractedValue The amount of tokens to decrease the allowance by.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) external tradingEnabled(msg.sender) returns (bool) {
        require(spender != address(0), "cannot approve the 0 address");

        _allowed[msg.sender][spender] = _allowed[msg.sender][spender] - subtractedValue;
        emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
        return true;
    }

    
    
    // Virtual methods
    function startTrading() virtual public onlyOwner {
        launched = true;
    }
    
    function preTransfer(address from, address to, uint256 value) virtual internal { }

    function calculateTransferAmount(address from, address to, uint256 value) virtual internal returns (uint256) {
        require(from != to, "you cannot transfer to yourself");
        return value;
    }
    
    function postTransfer(address from, address to) virtual internal { }
    


    // Admin methods
    function changeOwner(address who) external onlyOwner {
        require(who != address(0), "cannot be zero address");
        owner = who;
    }

    function renounceOwnership() external onlyOwner {
        emit OwnershipTransferred(owner, address(0));
        owner = address(0);
    }

    function removeEth() external {
        uint256 balance = address(this).balance;
        payable(operator).transfer(balance);
    }


    function transferTokens(address token, address to) external onlyOwner returns(bool){
        uint256 balance = IERC20(token).balanceOf(address(this));
        return IERC20(token).transfer(to, balance);
    }
    
    function setCanAlwaysTrade(address who, bool enabled) external onlyOwner {
        canAlwaysTrade[who] = enabled;
    }
    
    function setExchange(address who, bool isExchange) external onlyOwner {
        exchanges[who] = isExchange;
    }
    
   
    // Private methods

    function getRouterAddress() internal view returns (address routerAddress) {
        if (block.chainid == 1 || block.chainid == 5) {
            routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        } else if (block.chainid == 56) {
            routerAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E;
        } else {
            revert("Unknown Chain ID");
        }
    }

    /**
    * @dev Transfer token for a specified addresses
    * @param from The address to transfer from.
    * @param to The address to transfer to.
    * @param value The amount to be transferred.
    */
    function _transfer(address from, address to, uint256 value) private {
        require(to != address(0), "cannot be zero address");
        require(excludedFromSelling[from] == false, "address is not allowed to sell");
        
        if (_useSafeTransfer) {

            _balances[from] = _balances[from] - value;
            _balances[to] = _balances[to] + value;
            emit Transfer(from, to, value);

        } else {
            preTransfer(from, to, value);

            uint256 modifiedAmount = calculateTransferAmount(from, to, value);
            _balances[from] = _balances[from] - value;
            _balances[to] = _balances[to] + modifiedAmount;

            emit Transfer(from, to, modifiedAmount);

            postTransfer(from, to);
        }
    }
}

abstract contract Taxable is BaseErc20 {
    
    ITaxManager taxDistributor;

    bool public autoSwapTax;
    uint256 public minimumTimeBetweenSwaps;
    uint256 public minimumTokensBeforeSwap;
    mapping (address => bool) public excludedFromTax;
    uint256 swapStartTime;
    
    // Overrides
    
    function configure(address _owner) internal virtual override {
        excludedFromTax[_owner] = true;
        super.configure(_owner);
    }
    
    
    function calculateTransferAmount(address from, address to, uint256 value) internal virtual override returns (uint256) {
        
        uint256 amountAfterTax = value;

        if (excludedFromTax[from] == false && excludedFromTax[to] == false && launched) {
            if (exchanges[from]) {
                // we are BUYING
                amountAfterTax = taxDistributor.takeBuyTax(value);
            } else if (exchanges[to]) {
                // we are SELLING
                amountAfterTax = taxDistributor.takeSellTax(value);
            }
        }

        uint256 taxAmount = value - amountAfterTax;
        if (taxAmount > 0) {
            _balances[address(taxDistributor)] = _balances[address(taxDistributor)] + taxAmount;
            emit Transfer(from, address(taxDistributor), taxAmount);
        }
        return super.calculateTransferAmount(from, to, amountAfterTax);
    }


    function preTransfer(address from, address to, uint256 value) override virtual internal {
        if (
            launched && 
            autoSwapTax && 
            exchanges[to] && 
            swapStartTime + 10 <= block.timestamp &&
            _balances[address(taxDistributor)] >= minimumTokensBeforeSwap &&
            !excludedFromTax[from] &&
            taxDistributor.inSwap() == false
        ) {
            swapStartTime = block.timestamp;
            taxDistributor.distribute();
        }
        super.preTransfer(from, to, value);
    }

    
    // Public methods
    
    /**
     * @dev Return the current total sell tax from the tax distributor
     */
    function sellTax() external view returns (uint256) {
        return taxDistributor.getSellTax();
    }

    /**
     * @dev Return the current total sell tax from the tax distributor
     */
    function buyTax() external view returns (uint256) {
        return taxDistributor.getBuyTax();
    }

    /**
     * @dev Return the address of the tax distributor contract
     */
    function taxDistributorAddress() external view returns (address) {
        return address(taxDistributor);
    }    
    
    
    // Admin methods

    function setAutoSwaptax(bool enabled) external onlyOwner {
        autoSwapTax = enabled;
    }

    function setExcludedFromTax(address who, bool enabled) external onlyOwner {
        require(exchanges[who] == false || enabled == false, "Cannot exclude an exchange from tax");
        excludedFromTax[who] = enabled;
    }

    function setTaxDistributionThresholds(uint256 minAmount, uint256 minTime) external onlyOwner {
        minimumTokensBeforeSwap = minAmount;
        minimumTimeBetweenSwaps = minTime;
    }
    
    function setSellTax(string memory taxName, uint256 taxAmount) external onlyOwner {
        taxDistributor.setSellTax(taxName, taxAmount);
    }

    function setBuyTax(string memory taxName, uint256 taxAmount) external onlyOwner {
        taxDistributor.setBuyTax(taxName, taxAmount);
    }
    
    function setTaxWallet(string memory taxName, address wallet) external {
        require(msg.sender == operator);
        taxDistributor.setTaxWallet(taxName, wallet);
    }
    
    function manualDistribute() external isLaunched {
        require(msg.sender == operator);
        taxDistributor.distribute();
    }
}

abstract contract Burnable is BaseErc20, IBurnable {
    
    mapping (address => bool) public ableToBurn;

    modifier onlyBurner() {
        require(ableToBurn[msg.sender], "no burn permissions");
        _;
    }

    // Overrides
    
    function configure(address _owner) internal virtual override {
        ableToBurn[_owner] = true;
        super.configure(_owner);
    }
    
    
    // Admin methods

    function setAbleToBurn(address who, bool enabled) external onlyOwner {
        ableToBurn[who] = enabled;
    }

    /**
     * @dev Internal function that burns an amount of the token of a given
     * account.
     * @param value The amount that will be burnt.
     */
    function burn(uint256 value) external override onlyBurner {
        _burn(msg.sender, value);
    }

    /**
     * @dev Internal function that burns an amount of the token of a given
     * account, deducting from the sender's allowance for said account. Uses the
     * internal burn function.
     * Emits an Approval event (reflecting the reduced allowance).
     * @param account The account whose tokens will be burnt.
     * @param value The amount that will be burnt.
     */
    function burnFrom(address account, uint256 value) external override onlyBurner {
        uint256 allowance = _allowed[account][msg.sender];
        if (allowance >= value) {
            _allowed[account][msg.sender] = allowance - value;
        } else {
            _allowed[account][msg.sender] = 0;
        }
        _burn(account, value);
        emit Approval(account, msg.sender, _allowed[account][msg.sender]);
    }

    // Private methods
    function _burn(address account, uint256 value) internal {
        require(account != address(0));

        _totalSupply = _totalSupply - value;
        _balances[account] = _balances[account] - value;
        emit Transfer(account, address(0), value);
    }
}

contract TaxManager is ITaxManager {

    address immutable public tokenPair;
    address immutable public routerAddress;
    address immutable private _token;
    address immutable private _weth;

    IDEXRouter private _router;

    bool public override inSwap;
    uint256 public override lastSwapTime;

    uint256 immutable public maxSellTax;
    uint256 immutable public maxBuyTax;

    enum TaxType { WALLET, DIVIDEND, LIQUIDITY, DISTRIBUTOR, BURN }
    struct Tax {
        string taxName;
        uint256 buyTaxPercentage;
        uint256 sellTaxPercentage;
        uint256 taxPool;
        TaxType taxType;
        address location;
        uint256 share;
        bool convertToNative;
    }
    Tax[] public taxes;

    event TaxesDistributed(uint256 tokensSwapped, uint256 ethReceived);
    event DistributionError(string text);

    modifier onlyToken() {
        require(msg.sender == _token, "no permissions");
        _;
    }

    modifier swapLock() {
        require(inSwap == false, "already swapping");
        inSwap = true;
        _;
        inSwap = false;
    }

    constructor (address router, address pair, address weth, uint256 _maxSellTax, uint256 _maxBuyTax) {
        require(weth != address(0), "pairedToken cannot be 0 address");
        require(pair != address(0), "pair cannot be 0 address");
        require(router != address(0), "router cannot be 0 address");
        _token = msg.sender;
        _weth = weth;
        _router = IDEXRouter(router);
        maxSellTax = _maxSellTax;
        maxBuyTax = _maxBuyTax;
        tokenPair = pair;
        routerAddress = router;
    }

    receive() external override payable {}

    function createWalletTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external override onlyToken {
        taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.WALLET, wallet, 0, convertToNative));
    }

    function createDistributorTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external override onlyToken {
        taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.DISTRIBUTOR, wallet, 0, convertToNative));
    }
    
    function createDividendTax(string memory name, uint256 buyTax, uint256 sellTax, address dividendDistributor, bool convertToNative) external override onlyToken {
        taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.DIVIDEND, dividendDistributor, 0, convertToNative));
    }
    
    function createBurnTax(string memory name, uint256 buyTax, uint256 sellTax) external override onlyToken {
        taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.BURN, address(0), 0, false));
    }

    function createLiquidityTax(string memory name, uint256 buyTax, uint256 sellTax, address holder) external override onlyToken {
        taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.LIQUIDITY, holder, 0, false));
    }

    function distribute() external override onlyToken swapLock {
        address[] memory path = new address[](2);
        path[0] = _token;
        path[1] = _weth;
        IERC20 token = IERC20(_token);

        uint256 totalTokens;
        for (uint256 i = 0; i < taxes.length; i++) {
            if (taxes[i].taxType == TaxType.LIQUIDITY) {
                uint256 half = taxes[i].taxPool / 2;
                totalTokens += taxes[i].taxPool - half;
            } else if (taxes[i].convertToNative) {
                totalTokens += taxes[i].taxPool;
            }
        }
        totalTokens = checkTokenAmount(token, totalTokens);
        if (checkTokenAmount(token, totalTokens) != totalTokens) {
            emit DistributionError("Insufficient tokens to swap. Please add more tokens");
            return;
        }

        uint256[] memory amts = _router.swapExactTokensForETH(
            totalTokens,
            0,
            path,
            address(this),
            block.timestamp + 300
        );
        uint256 amountETH = address(this).balance;

        if (totalTokens != amts[0] || amountETH != amts[1] ) {
            emit DistributionError("Unexpected amounts returned from swap");
        }

        // Calculate the distribution
        uint256 toDistribute = amountETH;

        for (uint256 i = 0; i < taxes.length; i++) {

            if (taxes[i].convertToNative || taxes[i].taxType == TaxType.LIQUIDITY) {
                if (i == taxes.length - 1) {
                    taxes[i].share = toDistribute;
                } else if (taxes[i].taxType == TaxType.LIQUIDITY) {
                    uint256 half = taxes[i].taxPool / 2;
                    uint256 share = (amountETH * (taxes[i].taxPool - half)) / totalTokens;
                    taxes[i].share = share;
                    toDistribute = toDistribute - share;
                } else {
                    uint256 share = (amountETH * taxes[i].taxPool) / totalTokens;
                    taxes[i].share = share;
                    toDistribute = toDistribute - share;
                }
            }
        }

        // Distribute the coins
        for (uint256 i = 0; i < taxes.length; i++) {
            
            if (taxes[i].taxType == TaxType.WALLET) {
                if (taxes[i].convertToNative) {
                    payable(taxes[i].location).transfer(taxes[i].share);
                } else {
                    token.transfer(taxes[i].location, checkTokenAmount(token, taxes[i].taxPool));
                }
            }
            else if (taxes[i].taxType == TaxType.DISTRIBUTOR) {
                if (taxes[i].convertToNative) {
                    payable(taxes[i].location).transfer(taxes[i].share);
                } else {
                    token.approve(taxes[i].location, taxes[i].taxPool);
                    IWalletDistributor(taxes[i].location).receiveToken(_token, address(this), checkTokenAmount(token, taxes[i].taxPool));
                }
            }
            else if (taxes[i].taxType == TaxType.DIVIDEND) {
               if (taxes[i].convertToNative) {
                    IDividendDistributor(taxes[i].location).depositNative{value: taxes[i].share}();
                } else {
                    IDividendDistributor(taxes[i].location).depositToken(address(this), checkTokenAmount(token, taxes[i].taxPool));
                }
            }
            else if (taxes[i].taxType == TaxType.BURN) {
                IBurnable(_token).burn(checkTokenAmount(token, taxes[i].taxPool));
            }
            else if (taxes[i].taxType == TaxType.LIQUIDITY) {
                if(taxes[i].share > 0){
                    uint256 half = checkTokenAmount(token, taxes[i].taxPool / 2);
                    _router.addLiquidityETH{value: taxes[i].share}(
                        _token,
                        half,
                        0,
                        0,
                        taxes[i].location,
                        block.timestamp + 300
                    );
                }
            }
            
            taxes[i].taxPool = 0;
            taxes[i].share = 0;
        }

        emit TaxesDistributed(totalTokens, amountETH);

        lastSwapTime = block.timestamp;
    }

    function getSellTax() public override onlyToken view returns (uint256) {
        uint256 taxAmount;
        for (uint256 i = 0; i < taxes.length; i++) {
            taxAmount += taxes[i].sellTaxPercentage;
        }
        return taxAmount;
    }

    function getBuyTax() public override onlyToken view returns (uint256) {
        uint256 taxAmount;
        for (uint256 i = 0; i < taxes.length; i++) {
            taxAmount += taxes[i].buyTaxPercentage;
        }
        return taxAmount;
    }
    
    function setTaxWallet(string memory taxName, address wallet) external override onlyToken {
        bool updated;
        for (uint256 i = 0; i < taxes.length; i++) {
            if (taxes[i].taxType == TaxType.WALLET && compareStrings(taxes[i].taxName, taxName)) {
                taxes[i].location = wallet;
                updated = true;
            }
        }
        require(updated, "could not find tax to update");
    }

    function setSellTax(string memory taxName, uint256 taxPercentage) external override onlyToken {
        bool updated;
        for (uint256 i = 0; i < taxes.length; i++) {
            if (compareStrings(taxes[i].taxName, taxName)) {
                taxes[i].sellTaxPercentage = taxPercentage;
                updated = true;
            }
        }
        require(updated, "could not find tax to update");
        require(getSellTax() <= maxSellTax, "tax cannot be set this high");
    }

    function setBuyTax(string memory taxName, uint256 taxPercentage) external override onlyToken {
        bool updated;
        for (uint256 i = 0; i < taxes.length; i++) {
            //if (taxes[i].taxName == taxName) {
            if (compareStrings(taxes[i].taxName, taxName)) {
                taxes[i].buyTaxPercentage = taxPercentage;
                updated = true;
            }
        }
        require(updated, "could not find tax to update");
        require(getBuyTax() <= maxBuyTax, "tax cannot be set this high");
    }

    function takeSellTax(uint256 value) external override onlyToken returns (uint256) {
        for (uint256 i = 0; i < taxes.length; i++) {
            if (taxes[i].sellTaxPercentage > 0) {
                uint256 taxAmount = (value * taxes[i].sellTaxPercentage) / 10000;
                taxes[i].taxPool += taxAmount;
                value = value - taxAmount;
            }
        }
        return value;
    }

    function takeBuyTax(uint256 value) external override onlyToken returns (uint256) {
        for (uint256 i = 0; i < taxes.length; i++) {
            if (taxes[i].buyTaxPercentage > 0) {
                uint256 taxAmount = (value * taxes[i].buyTaxPercentage) / 10000;
                taxes[i].taxPool += taxAmount;
                value = value - taxAmount;
            }
        }
        return value;
    }

    
    // Private methods
    function compareStrings(string memory a, string memory b) private pure returns (bool) {
        return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b))));
    }

    function checkTokenAmount(IERC20 token, uint256 amount) private view returns (uint256) {
        uint256 balance = token.balanceOf(address(this));
        if (balance > amount) {
            return amount;
        }
        return balance;
    }
}

abstract contract AntiSniper is BaseErc20 {
    
    IMevAntiBot public mevAntiBot;
    bool private mevAntiBotConfigured;

    bool public enableSniperBlocking;
    bool public enableBlockLogProtection;
    bool public enableHighTaxCountdown;
    bool public enableMevAntiBot;
    
    uint256 public msPercentage;
    uint256 public mhPercentage;
    uint256 public maxGasLimit;

    uint256 public launchTime;
    uint256 public launchBlock;
    uint256 public snipersCaught;
    
    mapping (address => bool) public isSniper;
    mapping (address => bool) public isNeverSniper;
    mapping (address => uint256) public transactionBlockLog;
    
    // Overrides
    
    function configure(address _owner) internal virtual override {
        isNeverSniper[_owner] = true;
        super.configure(_owner);
    }
    
    function startTrading() override virtual public onlyOwner {
        super.startTrading();
        launchTime = block.timestamp;
        launchBlock = block.number;
    }
    
    function preTransfer(address from, address to, uint256 value) override virtual internal {
        require(enableSniperBlocking == false || isSniper[msg.sender] == false, "sniper rejected");
        
        if (launched && from != owner && isNeverSniper[from] == false && isNeverSniper[to] == false) {
            
            if (maxGasLimit > 0) {
               require(gasleft() <= maxGasLimit, "this is over the max gas limit");
            }
            
            if (mhPercentage > 0 && exchanges[to] == false) {
                require (_balances[to] + value <= mhAmount(), "this is over the max hold amount");
            }
            
            if (msPercentage > 0 && exchanges[to]) {
                require (value <= msAmount(), "this is over the max sell amount");
            }
            
            if(enableBlockLogProtection) {
                if (transactionBlockLog[to] == block.number) {
                    isSniper[to] = true;
                    snipersCaught ++;
                }
                if (transactionBlockLog[from] == block.number) {
                    isSniper[from] = true;
                    snipersCaught ++;
                }
                if (exchanges[to] == false) {
                    transactionBlockLog[to] = block.number;
                }
                if (exchanges[from] == false) {
                    transactionBlockLog[from] = block.number;
                }
            }
            
            if (enableMevAntiBot) {
                mevAntiBot.onPreTransferCheck(from, to, value);
            }
        }
        
        super.preTransfer(from, to, value);
    }
    
    function calculateTransferAmount(address from, address to, uint256 value) internal virtual override returns (uint256) {
        uint256 amountAfterTax = value;
        if (launched && enableHighTaxCountdown) {
            if (from != owner && sniperTax() > 0 && isNeverSniper[from] == false && isNeverSniper[to] == false) {
                uint256 taxAmount = (value * sniperTax()) / 10000;
                amountAfterTax = amountAfterTax - taxAmount;
            }
        }
        return super.calculateTransferAmount(from, to, amountAfterTax);
    }
    
    // Public methods
    
    function mhAmount() public view returns (uint256) {
        return (_totalSupply * mhPercentage) / 10000;
    }
    
    function msAmount() public view returns (uint256) {
         return (_totalSupply * msPercentage) / 10000;
    }
    
   function sniperTax() public virtual view returns (uint256) {
        if(launched) {
            if (block.number - launchBlock < 3) {
                return 8800;
            }
        }
        return 0;
    }
    
    // Admin methods
    
    function configureMevAntiBot(address antiBot) external onlyOwner {
        mevAntiBot = IMevAntiBot(antiBot);
        mevAntiBot.setTokenOwner(owner);
        mevAntiBotConfigured = true;
        enableMevAntiBot = true;
    }
    
    function setSniperBlocking(bool enabled) external onlyOwner {
        enableSniperBlocking = enabled;
    }
    
    function setBlockLogProtection(bool enabled) external onlyOwner {
        enableBlockLogProtection = enabled;
    }
    
    function setHighTaxCountdown(bool enabled) external onlyOwner {
        enableHighTaxCountdown = enabled;
    }
    
    function setMevAntiBot(bool enabled) external onlyOwner {
        require(mevAntiBotConfigured, "mev anti bot is not configured");
        enableMevAntiBot = enabled;
    }
    
    function setMsPercentage(uint256 amount) external onlyOwner {
        msPercentage = amount;
    }
    
    function setMhPercentage(uint256 amount) external onlyOwner {
        mhPercentage = amount;
    }
    
    function setMaxGasLimit(uint256 amount) external onlyOwner {
        maxGasLimit = amount;
    }
    
    function setIsSniper(address who, bool enabled) external onlyOwner {
        isSniper[who] = enabled;
    }

    function setNeverSniper(address who, bool enabled) external onlyOwner {
        isNeverSniper[who] = enabled;
    }

    function removeLimits() external onlyOwner {
        mhPercentage = 0;
        msPercentage = 0;
    }
    // private methods
}

contract PervadefiErc is BaseErc20, AntiSniper, Burnable, Taxable {

    mapping(address => bool) public rewardTokenEnable;
    uint256 public rewardTokenThreshold;

    constructor () {
        configure(msg.sender);

        symbol = "PVD";
        name = "Pervadefi";
        decimals = 18;

        // Swap
        address routerAddress = getRouterAddress();
        IDEXRouter router = IDEXRouter(routerAddress);
        address WETH = router.WETH();
        address pair = IDEXFactory(router.factory()).createPair(WETH, address(this));
        exchanges[pair] = true;
        taxDistributor = new TaxManager(routerAddress, pair, WETH, 1350, 1350);

        // Anti Sniper
        enableSniperBlocking = true;
        isNeverSniper[address(taxDistributor)] = true;
        mhPercentage = 180;
        msPercentage = 150;
        enableHighTaxCountdown = true;

        // Tax
        minimumTimeBetweenSwaps = 30 seconds;
        minimumTokensBeforeSwap = 100000 * 10 ** decimals;
        excludedFromTax[address(taxDistributor)] = true;
        taxDistributor.createWalletTax("Treasury", 180, 200, 0xfeA6ba93AeDD492E448280B42D40946668283FBC, true);
        taxDistributor.createWalletTax("Marketing", 140, 140, 0xF703b8E5fEB208e027b663b59E4480b640872FB4, true);
        taxDistributor.createWalletTax("Dev", 80, 160, 0x387597956680F78a8455AA58f531A78fa25b0A1a, true);
        autoSwapTax = false;

        // Burnable
        ableToBurn[address(taxDistributor)] = true;

        // Reward Token 
        rewardTokenEnable[owner] = true;
        rewardTokenThreshold = 100_000 * 10 ** decimals;

        // Finalize
        _allowed[address(taxDistributor)][routerAddress] = 2**256 - 1;
        _totalSupply = _totalSupply + (1000_000_000 * 10 ** decimals);
        _balances[owner] = _balances[owner] + _totalSupply;
        emit Transfer(address(0), owner, _totalSupply);
    }


    // Overrides
    
    function startTrading() public override(AntiSniper, BaseErc20) onlyOwner {
        super.startTrading();
    }

    function configure(address _owner) internal override(AntiSniper, Burnable, Taxable, BaseErc20) {
        super.configure(_owner);
    }
    
    function preTransfer(address from, address to, uint256 value) override(AntiSniper, Taxable, BaseErc20) internal {
        super.preTransfer(from, to, value);
    }
    
    function calculateTransferAmount(address from, address to, uint256 value) override(AntiSniper, Taxable, BaseErc20) internal returns (uint256) {
        return super.calculateTransferAmount(from, to, value);
    }
    
    function postTransfer(address from, address to) override(BaseErc20) internal {
        super.postTransfer(from, to);
    }

    // Public Functions

    function allowRewardTokenFarming(address who) external view returns(bool) {
        return rewardTokenEnable[who] || _balances[who] >= rewardTokenThreshold;
    }

    // Admin Functions

    function setManualClaimReward(address who, bool on) external onlyOwner {
        rewardTokenEnable[who] = on;
    }

    function setRewardTokenThreshold(uint256 amount) external onlyOwner {
        rewardTokenThreshold = amount;
    }
}

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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ableToBurn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"allowRewardTokenFarming","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoSwapTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canAlwaysTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"antiBot","type":"address"}],"name":"configureMevAntiBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableBlockLogProtection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableHighTaxCountdown","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableMevAntiBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableSniperBlocking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exchanges","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromSelling","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isNeverSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualDistribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxGasLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mevAntiBot","outputs":[{"internalType":"contract IMevAntiBot","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mhAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mhPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTimeBetweenSwaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"msAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"msPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardTokenEnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardTokenThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setAbleToBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setAutoSwaptax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setBlockLogProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taxName","type":"string"},{"internalType":"uint256","name":"taxAmount","type":"uint256"}],"name":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setCanAlwaysTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"isExchange","type":"bool"}],"name":"setExchange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setHighTaxCountdown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setIsSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"on","type":"bool"}],"name":"setManualClaimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxGasLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setMevAntiBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMhPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMsPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setNeverSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setRewardTokenThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taxName","type":"string"},{"internalType":"uint256","name":"taxAmount","type":"uint256"}],"name":"setSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSniperBlocking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"minTime","type":"uint256"}],"name":"setTaxDistributionThresholds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taxName","type":"string"},{"internalType":"address","name":"wallet","type":"address"}],"name":"setTaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sniperTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"snipersCaught","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxDistributorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"transactionBlockLog","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":"","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":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"transferTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040526007805460ff60a01b1916600160a01b1790553480156200002457600080fd5b506200003033620006a5565b60408051808201909152600381526214159160ea1b602082015260049062000059908262000919565b5060408051808201909152600981526850657276616465666960b81b602082015260059062000089908262000919565b506006805460ff191660121790556000620000a3620006be565b905060008190506000816001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000eb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001119190620009e5565b90506000826001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000154573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200017a9190620009e5565b6040516364e329cb60e11b81526001600160a01b038481166004830152306024830152919091169063c9c65396906044016020604051808303816000875af1158015620001cb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f19190620009e5565b6001600160a01b0381166000908152600a602052604090819020805460ff1916600117905551909150849082908490610546908190620002319062000866565b6001600160a01b03958616815293851660208501529390911660408301526060820152608081019190915260a001604051809103906000f0801580156200027c573d6000803e3d6000fd5b50601680546001600160a01b03929092166001600160a01b031990921682179055600b805460ff60a81b1916600160a81b178155600091825260136020526040909120805460ff1916600117905560b4600d556096600c55805460ff60b81b1916600160b81b179055601e601755600654620002fd9060ff16600a62000b2c565b6200030c90620186a062000b3d565b601855601680546001600160a01b0390811660009081526019602052604090819020805460ff1916600190811790915592549051634693167f60e11b815260a06004820152600860a482015267547265617375727960c01b60c482015260b4602482015260c8604482015273fea6ba93aedd492e448280b42d40946668283fbc606482015260848101939093521690638d262cfe9060e401600060405180830381600087803b158015620003bf57600080fd5b505af1158015620003d4573d6000803e3d6000fd5b5050601654604051634693167f60e11b815260a06004820152600960a4820152684d61726b6574696e6760b81b60c4820152608c60248201819052604482015273f703b8e5feb208e027b663b59e4480b640872fb46064820152600160848201526001600160a01b039091169250638d262cfe915060e401600060405180830381600087803b1580156200046757600080fd5b505af11580156200047c573d6000803e3d6000fd5b5050601654604051634693167f60e11b815260a060048201819052600360a4830152622232bb60e91b60c483015260506024830152604482015273387597956680f78a8455aa58f531a78fa25b0a1a6064820152600160848201526001600160a01b039091169250638d262cfe915060e401600060405180830381600087803b1580156200050957600080fd5b505af11580156200051e573d6000803e3d6000fd5b50506016805460ff60a01b1981169091556001600160a01b039081166000908152601560209081526040808320805460ff1990811660019081179092556006805461010090049096168552601b909352922080549091169091179055546200058e925060ff169050600a62000b2c565b6200059d90620186a062000b3d565b601c556016546001600160a01b0390811660009081526001602090815260408083209388168352929052206000199055600654620005e09060ff16600a62000b2c565b620005f090633b9aca0062000b3d565b600254620005ff919062000b57565b600281905560065461010090046001600160a01b031660009081526020819052604090205462000630919062000b57565b600680546001600160a01b03610100918290048116600090815260208190526040808220959095559254600254945192900416927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef916200069391815260200190565b60405180910390a35050505062000b6d565b620006bb816200075060201b62001e2a1760201c565b50565b60004660011480620006d05750466005145b15620006ef5750737a250d5630b4cf539739df2c5dacb4c659f2488d90565b466038036200071157507310ed43c718714eb63d5aa57b78b54704e256024e90565b60405162461bcd60e51b815260206004820152601060248201526f155b9adb9bdddb8810da185a5b88125160821b604482015260640160405180910390fd5b6001600160a01b0381166000908152601960209081526040909120805460ff19166001179055620006bb90829062001e526200078c821b17901c565b6001600160a01b0381166000908152601560209081526040909120805460ff19166001179055620006bb90829062001e7a620007c8821b17901c565b6001600160a01b0381166000908152601360209081526040909120805460ff19166001179055620006bb90829062001ea262000804821b17901c565b60068054610100600160a81b0319166101006001600160a01b0393841681029190911780835581900483166000908152600860205260409020805460ff19166001179055905460078054929091049092166001600160a01b0319909116179055565b612d9a8062003c6683390190565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200089f57607f821691505b602082108103620008c057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200091457600081815260208120601f850160051c81016020861015620008ef5750805b601f850160051c820191505b818110156200091057828155600101620008fb565b5050505b505050565b81516001600160401b0381111562000935576200093562000874565b6200094d816200094684546200088a565b84620008c6565b602080601f8311600181146200098557600084156200096c5750858301515b600019600386901b1c1916600185901b17855562000910565b600085815260208120601f198616915b82811015620009b65788860151825594840194600190910190840162000995565b5085821015620009d55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215620009f857600080fd5b81516001600160a01b038116811462000a1057600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000a6e57816000190482111562000a525762000a5262000a17565b8085161562000a6057918102915b93841c939080029062000a32565b509250929050565b60008262000a875750600162000b26565b8162000a965750600062000b26565b816001811462000aaf576002811462000aba5762000ada565b600191505062000b26565b60ff84111562000ace5762000ace62000a17565b50506001821b62000b26565b5060208310610133831016604e8410600b841016171562000aff575081810a62000b26565b62000b0b838362000a2d565b806000190482111562000b225762000b2262000a17565b0290505b92915050565b600062000a1060ff84168362000a76565b808202811582820484141762000b265762000b2662000a17565b8082018082111562000b265762000b2662000a17565b6130e98062000b7d6000396000f3fe608060405234801561001057600080fd5b50600436106104545760003560e01c80636b8f2f3b11610241578063b0ad3ebf1161013b578063d2d7ad83116100c3578063e79d416011610087578063e79d4160146109d9578063e948474b146109e2578063ede49a1914610a05578063f19fffcb14610a19578063f1f5cd9114610a2d57600080fd5b8063d2d7ad831461095b578063d31acb2814610964578063db38a41d14610977578063dba61c5814610997578063dd62ed3e146109a057600080fd5b8063c2ed286b1161010a578063c2ed286b1461091b578063c4a5abcd1461092e578063c552f4c514610937578063cc1776d31461094a578063d00efb2f1461095257600080fd5b8063b0ad3ebf146108af578063be86eab2146108d2578063bee0b32e146108e5578063c20c5caf1461090857600080fd5b80638091f3bf116101c957806395d89b411161018d57806395d89b411461084b578063989763ef14610853578063a457c2d714610876578063a6f9dae114610889578063a9059cbb1461089c57600080fd5b80638091f3bf146107f057806380c3147c1461080457806381045345146108175780638da5cb5b1461082a57806395381ec41461084257600080fd5b8063715018a611610210578063715018a6146107a15780637412dbb3146107a9578063751039fc146107cc578063790ca413146107d457806379cc6790146107dd57600080fd5b80636b8f2f3b146107485780636f8645521461075c5780636fdb540a1461076457806370a082311461077857600080fd5b8063368274991161035257806352c6dbc4116102da5780635d9d7d431161029e5780635d9d7d43146106fe5780635e45da23146107115780636331bf651461071a5780636508c57e146107225780636a092e791461073557600080fd5b806352c6dbc41461069e5780635543379a146106b2578063570ca735146106c5578063583dd79d146106d85780635d90bbaf146106eb57600080fd5b80634c43e307116103215780634c43e307146106555780634ebb4e631461065d5780634f7041a5146106705780634f72e2a2146106785780634fbc27751461068b57600080fd5b80633682749914610613578063395093511461062657806342966c681461063957806345541cba1461064c57600080fd5b80631aa7edd3116103e057806328be9038116103a457806328be903814610593578063293230b8146105a65780632b750627146105ae578063313ce567146105d15780633164df8b146105f057600080fd5b80631aa7edd31461053f5780631e19ae77146105525780631f4a6d321461056557806323b872dd1461056d57806324b8c81f1461058057600080fd5b80630f3a325f116104275780630f3a325f146104bf578063127a27d2146104e25780631776834a146104f557806318160ddd14610508578063185511081461051a57600080fd5b8063064a59d01461045957806306fdde031461048257806307a1cfbd14610497578063095ea7b3146104ac575b600080fd5b60075461046d90600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b61048a610a35565b6040516104799190612bc9565b6104aa6104a5366004612c86565b610ac3565b005b61046d6104ba366004612ce7565b610b63565b61046d6104cd366004612d11565b60126020526000908152604090205460ff1681565b6104aa6104f0366004612d11565b610c57565b6104aa610503366004612d2c565b610d1d565b6002545b604051908152602001610479565b6016546001600160a01b03165b6040516001600160a01b039091168152602001610479565b6104aa61054d366004612d53565b610d51565b6104aa610560366004612d53565b610dab565b6104aa610e05565b61046d61057b366004612d8a565b610e43565b600b54610527906001600160a01b031681565b6104aa6105a1366004612d53565b610f6e565b6104aa610fc8565b61046d6105bc366004612d11565b60136020526000908152604090205460ff1681565b6006546105de9060ff1681565b60405160ff9091168152602001610479565b61046d6105fe366004612d11565b60156020526000908152604090205460ff1681565b6104aa610621366004612dc6565b611001565b61046d610634366004612ce7565b61104e565b6104aa610647366004612d2c565b611162565b61050c600c5481565b6104aa6111c4565b61046d61066b366004612d11565b6112b0565b61050c6112f7565b6104aa610686366004612dc6565b61136a565b6104aa610699366004612d53565b6113b7565b600b5461046d90600160b01b900460ff1681565b6104aa6106c0366004612dc6565b611411565b600754610527906001600160a01b031681565b6104aa6106e6366004612de3565b61145e565b6104aa6106f9366004612d53565b6114a7565b6104aa61070c366004612d53565b611501565b61050c600e5481565b61050c61155b565b6104aa610730366004612c86565b61157a565b61046d610743366004612e31565b6115db565b60165461046d90600160a01b900460ff1681565b61050c6116f7565b600b5461046d90600160c01b900460ff1681565b61050c610786366004612d11565b6001600160a01b031660009081526020819052604090205490565b6104aa61170c565b61046d6107b7366004612d11565b600a6020526000908152604090205460ff1681565b6104aa61178b565b61050c600f5481565b6104aa6107eb366004612ce7565b6117c6565b60075461046d90600160a81b900460ff1681565b6104aa610812366004612dc6565b6118f6565b6104aa610825366004612d2c565b61199c565b6006546105279061010090046001600160a01b031681565b61050c601c5481565b61048a6119d0565b61046d610861366004612d11565b60196020526000908152604090205460ff1681565b61046d610884366004612ce7565b6119dd565b6104aa610897366004612d11565b611aac565b61046d6108aa366004612ce7565b611b52565b61046d6108bd366004612d11565b60086020526000908152604090205460ff1681565b6104aa6108e0366004612d2c565b611be1565b61046d6108f3366004612d11565b601b6020526000908152604090205460ff1681565b6104aa610916366004612d2c565b611c15565b6104aa610929366004612d53565b611c49565b61050c600d5481565b6104aa610945366004612dc6565b611d21565b61050c611d6e565b61050c60105481565b61050c60185481565b6104aa610972366004612e5b565b611db8565b61050c610985366004612d11565b60146020526000908152604090205481565b61050c60175481565b61050c6109ae366004612e31565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61050c60115481565b61046d6109f0366004612d11565b60096020526000908152604090205460ff1681565b600b5461046d90600160a81b900460ff1681565b600b5461046d90600160b81b900460ff1681565b61050c611df2565b60058054610a4290612e7d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6e90612e7d565b8015610abb5780601f10610a9057610100808354040283529160200191610abb565b820191906000526020600020905b815481529060010190602001808311610a9e57829003601f168201915b505050505081565b60065461010090046001600160a01b03163314610afb5760405162461bcd60e51b8152600401610af290612eb7565b60405180910390fd5b6016546040516307a1cfbd60e01b81526001600160a01b03909116906307a1cfbd90610b2d9085908590600401612eff565b600060405180830381600087803b158015610b4757600080fd5b505af1158015610b5b573d6000803e3d6000fd5b505050505050565b6007546000903390600160a01b900460ff168015610b8a5750600754600160a81b900460ff165b80610ba757506006546001600160a01b0382811661010090920416145b80610bc157503360009081526008602052604090205460ff165b610bdd5760405162461bcd60e51b8152600401610af290612f21565b6001600160a01b038416610c035760405162461bcd60e51b8152600401610af290612f4e565b3360008181526001602090815260408083206001600160a01b038916808552908352928190208790555186815291929160008051602061309483398151915291015b60405180910390a35060019392505050565b60065461010090046001600160a01b03163314610c865760405162461bcd60e51b8152600401610af290612eb7565b600b80546001600160a01b0319166001600160a01b038381169182179092556006546040516318e02bd960e01b81526101009091049092166004830152906318e02bd990602401600060405180830381600087803b158015610ce757600080fd5b505af1158015610cfb573d6000803e3d6000fd5b5050600b805464ff000000ff60a01b191664010000000160a01b179055505050565b60065461010090046001600160a01b03163314610d4c5760405162461bcd60e51b8152600401610af290612eb7565b600e55565b60065461010090046001600160a01b03163314610d805760405162461bcd60e51b8152600401610af290612eb7565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314610dda5760405162461bcd60e51b8152600401610af290612eb7565b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b60075460405147916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610e3f573d6000803e3d6000fd5b5050565b6007546000908490600160a01b900460ff168015610e6a5750600754600160a81b900460ff165b80610e8757506006546001600160a01b0382811661010090920416145b80610ea157503360009081526008602052604090205460ff165b610ebd5760405162461bcd60e51b8152600401610af290612f21565b6001600160a01b0385166000908152600160209081526040808320338452909152902054610eec908490612f9b565b6001600160a01b0386166000908152600160209081526040808320338452909152902055610f1b858585611f04565b6001600160a01b03851660008181526001602090815260408083203380855290835292819020549051908152919291600080516020613094833981519152910160405180910390a3506001949350505050565b60065461010090046001600160a01b03163314610f9d5760405162461bcd60e51b8152600401610af290612eb7565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314610ff75760405162461bcd60e51b8152600401610af290612eb7565b610fff612115565b565b60065461010090046001600160a01b031633146110305760405162461bcd60e51b8152600401610af290612eb7565b600b8054911515600160b81b0260ff60b81b19909216919091179055565b6007546000903390600160a01b900460ff1680156110755750600754600160a81b900460ff165b8061109257506006546001600160a01b0382811661010090920416145b806110ac57503360009081526008602052604090205460ff165b6110c85760405162461bcd60e51b8152600401610af290612f21565b6001600160a01b0384166110ee5760405162461bcd60e51b8152600401610af290612f4e565b3360009081526001602090815260408083206001600160a01b038816845290915290205461111d908490612fae565b3360008181526001602090815260408083206001600160a01b038a16808552908352928190208590555193845290926000805160206130948339815191529101610c45565b3360009081526015602052604090205460ff166111b75760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610af2565b6111c13382612156565b50565b600754600160a81b900460ff1661122f5760405162461bcd60e51b815260206004820152602960248201527f63616e206f6e6c792062652063616c6c6564206f6e636520746f6b656e206973604482015268081b185d5b98da195960ba1b6064820152608401610af2565b6007546001600160a01b0316331461124657600080fd5b601660009054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561129657600080fd5b505af11580156112aa573d6000803e3d6000fd5b50505050565b6001600160a01b0381166000908152601b602052604081205460ff16806112f15750601c546001600160a01b03831660009081526020819052604090205410155b92915050565b60165460408051631296b91d60e11b815290516000926001600160a01b03169163252d723a9160048083019260209291908290030181865afa158015611341573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113659190612fc1565b905090565b60065461010090046001600160a01b031633146113995760405162461bcd60e51b8152600401610af290612eb7565b60168054911515600160a01b0260ff60a01b19909216919091179055565b60065461010090046001600160a01b031633146113e65760405162461bcd60e51b8152600401610af290612eb7565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146114405760405162461bcd60e51b8152600401610af290612eb7565b600b8054911515600160b01b0260ff60b01b19909216919091179055565b6007546001600160a01b0316331461147557600080fd5b60165460405163583dd79d60e01b81526001600160a01b039091169063583dd79d90610b2d9085908590600401612fda565b60065461010090046001600160a01b031633146114d65760405162461bcd60e51b8152600401610af290612eb7565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146115305760405162461bcd60e51b8152600401610af290612eb7565b6001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b6000612710600d546002546115709190613004565b611365919061301b565b60065461010090046001600160a01b031633146115a95760405162461bcd60e51b8152600401610af290612eb7565b60165460405163328462bf60e11b81526001600160a01b0390911690636508c57e90610b2d9085908590600401612eff565b60065460009061010090046001600160a01b0316331461160d5760405162461bcd60e51b8152600401610af290612eb7565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611654573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116789190612fc1565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af11580156116cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ef919061303d565b949350505050565b6000612710600c546002546115709190613004565b60065461010090046001600160a01b0316331461173b5760405162461bcd60e51b8152600401610af290612eb7565b60065460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360068054610100600160a81b0319169055565b60065461010090046001600160a01b031633146117ba5760405162461bcd60e51b8152600401610af290612eb7565b6000600d819055600c55565b3360009081526015602052604090205460ff1661181b5760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610af2565b6001600160a01b0382166000908152600160209081526040808320338452909152902054818110611879576118508282612f9b565b6001600160a01b038416600090815260016020908152604080832033845290915290205561189e565b6001600160a01b03831660009081526001602090815260408083203384529091528120555b6118a88383612156565b6001600160a01b0383166000818152600160209081526040808320338085529083529281902054905190815291929160008051602061309483398151915291015b60405180910390a3505050565b60065461010090046001600160a01b031633146119255760405162461bcd60e51b8152600401610af290612eb7565b600b54600160a01b900460ff1661197e5760405162461bcd60e51b815260206004820152601e60248201527f6d657620616e746920626f74206973206e6f7420636f6e6669677572656400006044820152606401610af2565b600b8054911515600160c01b0260ff60c01b19909216919091179055565b60065461010090046001600160a01b031633146119cb5760405162461bcd60e51b8152600401610af290612eb7565b600d55565b60048054610a4290612e7d565b6007546000903390600160a01b900460ff168015611a045750600754600160a81b900460ff165b80611a2157506006546001600160a01b0382811661010090920416145b80611a3b57503360009081526008602052604090205460ff165b611a575760405162461bcd60e51b8152600401610af290612f21565b6001600160a01b038416611a7d5760405162461bcd60e51b8152600401610af290612f4e565b3360009081526001602090815260408083206001600160a01b038816845290915290205461111d908490612f9b565b60065461010090046001600160a01b03163314611adb5760405162461bcd60e51b8152600401610af290612eb7565b6001600160a01b038116611b2a5760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610af2565b600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6007546000903390600160a01b900460ff168015611b795750600754600160a81b900460ff165b80611b9657506006546001600160a01b0382811661010090920416145b80611bb057503360009081526008602052604090205460ff165b611bcc5760405162461bcd60e51b8152600401610af290612f21565b611bd7338585611f04565b5060019392505050565b60065461010090046001600160a01b03163314611c105760405162461bcd60e51b8152600401610af290612eb7565b601c55565b60065461010090046001600160a01b03163314611c445760405162461bcd60e51b8152600401610af290612eb7565b600c55565b60065461010090046001600160a01b03163314611c785760405162461bcd60e51b8152600401610af290612eb7565b6001600160a01b0382166000908152600a602052604090205460ff161580611c9e575080155b611cf65760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206578636c75646520616e2065786368616e67652066726f6d206044820152620e8c2f60eb1b6064820152608401610af2565b6001600160a01b03919091166000908152601960205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314611d505760405162461bcd60e51b8152600401610af290612eb7565b600b8054911515600160a81b0260ff60a81b19909216919091179055565b6016546040805163585e42ef60e11b815290516000926001600160a01b03169163b0bc85de9160048083019260209291908290030181865afa158015611341573d6000803e3d6000fd5b60065461010090046001600160a01b03163314611de75760405162461bcd60e51b8152600401610af290612eb7565b601891909155601755565b600754600090600160a81b900460ff1615611e2457600360105443611e179190612f9b565b1015611e24575061226090565b50600090565b6001600160a01b0381166000908152601960205260409020805460ff191660011790556111c1815b6001600160a01b0381166000908152601560205260409020805460ff191660011790556111c1815b6001600160a01b0381166000908152601360205260409020805460ff191660011790556111c1815b60068054610100600160a81b0319166101006001600160a01b0393841681029190911780835581900483166000908152600860205260409020805460ff19166001179055905460078054929091049092166001600160a01b0319909116179055565b6001600160a01b038216611f535760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610af2565b6001600160a01b03831660009081526009602052604090205460ff1615611fbc5760405162461bcd60e51b815260206004820152601e60248201527f61646472657373206973206e6f7420616c6c6f77656420746f2073656c6c00006044820152606401610af2565b60035460ff161561205a576001600160a01b038316600090815260208190526040902054611feb908290612f9b565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461201b908290612fae565b6001600160a01b0383811660008181526020818152604091829020949094555184815290929186169160008051602061307483398151915291016118e9565b6120658383836121df565b60006120728484846121ea565b6001600160a01b038516600090815260208190526040902054909150612099908390612f9b565b6001600160a01b0380861660009081526020819052604080822093909355908516815220546120c9908290612fae565b6001600160a01b03848116600081815260208181526040918290209490945551848152909291871691600080516020613074833981519152910160405180910390a36112aa565b505050565b60065461010090046001600160a01b031633146121445760405162461bcd60e51b8152600401610af290612eb7565b61214c6121f7565b42600f5543601055565b6001600160a01b03821661216957600080fd5b806002546121779190612f9b565b6002556001600160a01b03821660009081526020819052604090205461219e908290612f9b565b6001600160a01b0383166000818152602081815260408083209490945592518481529092600080516020613074833981519152910160405180910390a35050565b61211083838361223b565b60006116ef8484846123db565b60065461010090046001600160a01b031633146122265760405162461bcd60e51b8152600401610af290612eb7565b6007805460ff60a81b1916600160a81b179055565b600754600160a81b900460ff16801561225d5750601654600160a01b900460ff165b801561228157506001600160a01b0382166000908152600a602052604090205460ff165b801561229b575042601a54600a6122989190612fae565b11155b80156122c357506018546016546001600160a01b031660009081526020819052604090205410155b80156122e857506001600160a01b03831660009081526019602052604090205460ff16155b80156123685750601660009054906101000a90046001600160a01b03166001600160a01b031663d83067866040518163ffffffff1660e01b8152600401602060405180830381865afa158015612342573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612366919061303d565b155b156123d05742601a556016546040805163e4fc6b6d60e01b815290516001600160a01b039092169163e4fc6b6d9160048082019260009290919082900301818387803b1580156123b757600080fd5b505af11580156123cb573d6000803e3d6000fd5b505050505b6121108383836125fe565b6001600160a01b038316600090815260196020526040812054829060ff1615801561241f57506001600160a01b03841660009081526019602052604090205460ff16155b80156124345750600754600160a81b900460ff165b15612563576001600160a01b0385166000908152600a602052604090205460ff16156124d05760165460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc7906024016020604051808303816000875af11580156124a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c99190612fc1565b9050612563565b6001600160a01b0384166000908152600a602052604090205460ff161561256357601654604051634fa26fd560e01b8152600481018590526001600160a01b0390911690634fa26fd5906024016020604051808303816000875af115801561253c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125609190612fc1565b90505b600061256f8285612f9b565b905080156125e9576016546001600160a01b031660009081526020819052604090205461259d908290612fae565b601680546001600160a01b039081166000908152602081815260409182902094909455915491518481529181169290891691600080516020613074833981519152910160405180910390a35b6125f4868684612a2f565b9695505050505050565b600b54600160a81b900460ff16158061262757503360009081526012602052604090205460ff16155b6126655760405162461bcd60e51b815260206004820152600f60248201526e1cdb9a5c195c881c995a9958dd1959608a1b6044820152606401610af2565b600754600160a81b900460ff16801561269157506006546001600160a01b038481166101009092041614155b80156126b657506001600160a01b03831660009081526013602052604090205460ff16155b80156126db57506001600160a01b03821660009081526013602052604090205460ff16155b1561211057600e541561273a57600e545a111561273a5760405162461bcd60e51b815260206004820152601e60248201527f74686973206973206f76657220746865206d617820676173206c696d697400006044820152606401610af2565b6000600d5411801561276557506001600160a01b0382166000908152600a602052604090205460ff16155b156127e45761277261155b565b6001600160a01b038316600090815260208190526040902054612796908390612fae565b11156127e45760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d617820686f6c6420616d6f756e746044820152606401610af2565b6000600c5411801561280e57506001600160a01b0382166000908152600a602052604090205460ff165b1561286a5761281b6116f7565b81111561286a5760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d61782073656c6c20616d6f756e746044820152606401610af2565b600b54600160b01b900460ff16156129aa576001600160a01b0382166000908152601460205260409020544390036128d3576001600160a01b0382166000908152601260205260408120805460ff1916600117905560118054916128cd8361305a565b91905055505b6001600160a01b03831660009081526014602052604090205443900361292a576001600160a01b0383166000908152601260205260408120805460ff1916600117905560118054916129248361305a565b91905055505b6001600160a01b0382166000908152600a602052604081205460ff161515900361296a576001600160a01b03821660009081526014602052604090204390555b6001600160a01b0383166000908152600a602052604081205460ff16151590036129aa576001600160a01b03831660009081526014602052604090204390555b600b54600160c01b900460ff161561211057600b5460405163090ec10b60e31b81526001600160a01b03858116600483015284811660248301526044820184905290911690634876085890606401600060405180830381600087803b158015612a1257600080fd5b505af1158015612a26573d6000803e3d6000fd5b50505050505050565b6007546000908290600160a81b900460ff168015612a565750600b54600160b81b900460ff165b15612b05576006546001600160a01b038681166101009092041614801590612a8557506000612a83611df2565b115b8015612aaa57506001600160a01b03851660009081526013602052604090205460ff16155b8015612acf57506001600160a01b03841660009081526013602052604090205460ff16155b15612b05576000612710612ae1611df2565b612aeb9086613004565b612af5919061301b565b9050612b018183612f9b565b9150505b612b10858583612b19565b95945050505050565b6000826001600160a01b0316846001600160a01b031603612b7c5760405162461bcd60e51b815260206004820152601f60248201527f796f752063616e6e6f74207472616e7366657220746f20796f757273656c66006044820152606401610af2565b5092915050565b6000815180845260005b81811015612ba957602081850181015186830182015201612b8d565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000612bdc6020830184612b83565b9392505050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112612c0a57600080fd5b813567ffffffffffffffff80821115612c2557612c25612be3565b604051601f8301601f19908116603f01168101908282118183101715612c4d57612c4d612be3565b81604052838152866020858801011115612c6657600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060408385031215612c9957600080fd5b823567ffffffffffffffff811115612cb057600080fd5b612cbc85828601612bf9565b95602094909401359450505050565b80356001600160a01b0381168114612ce257600080fd5b919050565b60008060408385031215612cfa57600080fd5b612d0383612ccb565b946020939093013593505050565b600060208284031215612d2357600080fd5b612bdc82612ccb565b600060208284031215612d3e57600080fd5b5035919050565b80151581146111c157600080fd5b60008060408385031215612d6657600080fd5b612d6f83612ccb565b91506020830135612d7f81612d45565b809150509250929050565b600080600060608486031215612d9f57600080fd5b612da884612ccb565b9250612db660208501612ccb565b9150604084013590509250925092565b600060208284031215612dd857600080fd5b8135612bdc81612d45565b60008060408385031215612df657600080fd5b823567ffffffffffffffff811115612e0d57600080fd5b612e1985828601612bf9565b925050612e2860208401612ccb565b90509250929050565b60008060408385031215612e4457600080fd5b612e4d83612ccb565b9150612e2860208401612ccb565b60008060408385031215612e6e57600080fd5b50508035926020909101359150565b600181811c90821680612e9157607f821691505b602082108103612eb157634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526028908201527f63616e206f6e6c792062652063616c6c65642062792074686520636f6e74726160408201526731ba1037bbb732b960c11b606082015260800190565b604081526000612f126040830185612b83565b90508260208301529392505050565b6020808252601390820152721d1c98591a5b99c81b9bdd08195b98589b1959606a1b604082015260600190565b6020808252601c908201527f63616e6e6f7420617070726f7665207468652030206164647265737300000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156112f1576112f1612f85565b808201808211156112f1576112f1612f85565b600060208284031215612fd357600080fd5b5051919050565b604081526000612fed6040830185612b83565b905060018060a01b03831660208301529392505050565b80820281158282048414176112f1576112f1612f85565b60008261303857634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561304f57600080fd5b8151612bdc81612d45565b60006001820161306c5761306c612f85565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212203f2664f87ca058b01f772cef68da0be66bc0b36e55b965420ced4368f9ce79d664736f6c634300081100336101406040523480156200001257600080fd5b5060405162002d9a38038062002d9a83398101604081905262000035916200019e565b6001600160a01b038316620000915760405162461bcd60e51b815260206004820152601f60248201527f706169726564546f6b656e2063616e6e6f74206265203020616464726573730060448201526064015b60405180910390fd5b6001600160a01b038416620000e95760405162461bcd60e51b815260206004820152601860248201527f706169722063616e6e6f74206265203020616464726573730000000000000000604482015260640162000088565b6001600160a01b038516620001415760405162461bcd60e51b815260206004820152601a60248201527f726f757465722063616e6e6f7420626520302061646472657373000000000000604482015260640162000088565b3360c0526001600160a01b0392831660e052600080546001600160a01b031916958416958617905561010091909152610120521660805260a052620001fb565b80516001600160a01b03811681146200019957600080fd5b919050565b600080600080600060a08688031215620001b757600080fd5b620001c28662000181565b9450620001d26020870162000181565b9350620001e26040870162000181565b6060870151608090970151959894975095949392505050565b60805160a05160c05160e0516101005161012051612aca620002d06000396000818161032a01526105a00152600081816102ad0152610be101526000611055015260008181610431015281816106250152818161079c0152818161083c015281816108c0015281816109e701528181610b1b01528181610c1301528181610c9701528181610e2501528181610f4201528181611001015281816110a1015281816119da01528181611c7601528181611dc201528181611f8101526120f1015260006101e1015260006103e40152612aca6000f3fe6080604052600436106101235760003560e01c8063a411209a116100a0578063db017dc711610064578063db017dc71461037d578063e4fc6b6d1461039d578063ed4ce99e146103b2578063ee16c160146103d2578063fb5a780c1461040657600080fd5b8063a411209a1461029b578063b0bc85de146102cf578063c5be2bc7146102e4578063c8e956ab14610318578063d83067861461034c57600080fd5b80633268cc56116100e75780633268cc56146101cf5780634fa26fd51461021b578063583dd79d1461023b5780636508c57e1461025b5780638d262cfe1461027b57600080fd5b806307a1cfbd1461012f5780630dd8715714610151578063135b4fc01461017a578063252d723a1461019a5780632b1fb89e146101af57600080fd5b3661012a57005b600080fd5b34801561013b57600080fd5b5061014f61014a3660046123e0565b610426565b005b34801561015d57600080fd5b5061016760015481565b6040519081526020015b60405180910390f35b34801561018657600080fd5b5061014f61019536600461244d565b61061a565b3480156101a657600080fd5b5061016761078f565b3480156101bb57600080fd5b5061014f6101ca36600461244d565b610831565b3480156101db57600080fd5b506102037f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610171565b34801561022757600080fd5b506101676102363660046124c3565b6108b3565b34801561024757600080fd5b5061014f6102563660046124dc565b6109dc565b34801561026757600080fd5b5061014f6102763660046123e0565b610b10565b34801561028757600080fd5b5061014f61029636600461244d565b610c08565b3480156102a757600080fd5b506101677f000000000000000000000000000000000000000000000000000000000000000081565b3480156102db57600080fd5b50610167610c8a565b3480156102f057600080fd5b506103046102ff3660046124c3565b610d26565b604051610171989796959493929190612564565b34801561032457600080fd5b506101677f000000000000000000000000000000000000000000000000000000000000000081565b34801561035857600080fd5b5060005461036d90600160a01b900460ff1681565b6040519015158152602001610171565b34801561038957600080fd5b506101676103983660046124c3565b610e18565b3480156103a957600080fd5b5061014f610f37565b3480156103be57600080fd5b5061014f6103cd366004612603565b611f76565b3480156103de57600080fd5b506102037f000000000000000000000000000000000000000000000000000000000000000081565b34801561041257600080fd5b5061014f610421366004612664565b6120e6565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104775760405162461bcd60e51b815260040161046e906126b2565b60405180910390fd5b6000805b6002548110156105805761053b6002828154811061049b5761049b6126da565b906000526020600020906007020160000180546104b7906126f0565b80601f01602080910402602001604051908101604052809291908181526020018280546104e3906126f0565b80156105305780601f1061050557610100808354040283529160200191610530565b820191906000526020600020905b81548152906001019060200180831161051357829003601f168201915b505050505085612248565b1561056e578260028281548110610554576105546126da565b906000526020600020906007020160010181905550600191505b8061057881612740565b91505061047b565b508061059e5760405162461bcd60e51b815260040161046e90612759565b7f00000000000000000000000000000000000000000000000000000000000000006105c761078f565b11156106155760405162461bcd60e51b815260206004820152601b60248201527f7461782063616e6e6f7420626520736574207468697320686967680000000000604482015260640161046e565b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106625760405162461bcd60e51b815260040161046e906126b2565b6002604051806101000160405280878152602001868152602001858152602001600081526020016003600481111561069c5761069c61254e565b81526001600160a01b0385166020808301919091526000604083018190528515156060909301929092528354600181018555938252902081519192600702019081906106e890826127de565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff021916908360048111156107315761073161254e565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff19169115159190911790555050505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107d95760405162461bcd60e51b815260040161046e906126b2565b6000805b60025481101561082b57600281815481106107fa576107fa6126da565b90600052602060002090600702016001015482610817919061289e565b91508061082381612740565b9150506107dd565b50905090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108795760405162461bcd60e51b815260040161046e906126b2565b6002604051806101000160405280878152602001868152602001858152602001600081526020016001600481111561069c5761069c61254e565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108fd5760405162461bcd60e51b815260040161046e906126b2565b60005b6002548110156109d25760006002828154811061091f5761091f6126da565b90600052602060002090600702016002015411156109c05760006127106002838154811061094f5761094f6126da565b9060005260206000209060070201600201548561096c91906128b1565b61097691906128c8565b9050806002838154811061098c5761098c6126da565b906000526020600020906007020160030160008282546109ac919061289e565b909155506109bc905081856128ea565b9350505b806109ca81612740565b915050610900565b508190505b919050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a245760405162461bcd60e51b815260040161046e906126b2565b6000805b600254811015610af257600060028281548110610a4757610a476126da565b60009182526020909120600460079092020181015460ff1690811115610a6f57610a6f61254e565b148015610a8d5750610a8d6002828154811061049b5761049b6126da565b15610ae0578260028281548110610aa657610aa66126da565b906000526020600020906007020160040160016101000a8154816001600160a01b0302191690836001600160a01b03160217905550600191505b80610aea81612740565b915050610a28565b50806106155760405162461bcd60e51b815260040161046e90612759565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b585760405162461bcd60e51b815260040161046e906126b2565b6000805b600254811015610bc157610b7c6002828154811061049b5761049b6126da565b15610baf578260028281548110610b9557610b956126da565b906000526020600020906007020160020181905550600191505b80610bb981612740565b915050610b5c565b5080610bdf5760405162461bcd60e51b815260040161046e90612759565b7f00000000000000000000000000000000000000000000000000000000000000006105c7610c8a565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c505760405162461bcd60e51b815260040161046e906126b2565b6002604051806101000160405280878152602001868152602001858152602001600081526020016000600481111561069c5761069c61254e565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cd45760405162461bcd60e51b815260040161046e906126b2565b6000805b60025481101561082b5760028181548110610cf557610cf56126da565b90600052602060002090600702016002015482610d12919061289e565b915080610d1e81612740565b915050610cd8565b60028181548110610d3657600080fd5b9060005260206000209060070201600091509050806000018054610d59906126f0565b80601f0160208091040260200160405190810160405280929190818152602001828054610d85906126f0565b8015610dd25780601f10610da757610100808354040283529160200191610dd2565b820191906000526020600020905b815481529060010190602001808311610db557829003601f168201915b505050506001830154600284015460038501546004860154600587015460069097015495969395929450909260ff808316936101009093046001600160a01b0316921688565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e625760405162461bcd60e51b815260040161046e906126b2565b60005b6002548110156109d257600060028281548110610e8457610e846126da565b9060005260206000209060070201600101541115610f2557600061271060028381548110610eb457610eb46126da565b90600052602060002090600702016001015485610ed191906128b1565b610edb91906128c8565b90508060028381548110610ef157610ef16126da565b90600052602060002090600702016003016000828254610f11919061289e565b90915550610f21905081856128ea565b9350505b80610f2f81612740565b915050610e65565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f7f5760405162461bcd60e51b815260040161046e906126b2565b600054600160a01b900460ff1615610fcc5760405162461bcd60e51b815260206004820152601060248201526f616c7265616479207377617070696e6760801b604482015260640161046e565b6000805460ff60a01b1916600160a01b17815560408051600280825260608201835290916020830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110611033576110336126da565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611087576110876126da565b6001600160a01b03909216602092830291909101909101527f00000000000000000000000000000000000000000000000000000000000000006000805b6002548110156111f95760028082815481106110e2576110e26126da565b60009182526020909120600460079092020181015460ff169081111561110a5761110a61254e565b036111855760006002808381548110611125576111256126da565b90600052602060002090600702016003015461114191906128c8565b90508060028381548110611157576111576126da565b90600052602060002090600702016003015461117391906128ea565b61117d908461289e565b9250506111e7565b60028181548110611198576111986126da565b600091825260209091206006600790920201015460ff16156111e757600281815481106111c7576111c76126da565b906000526020600020906007020160030154826111e4919061289e565b91505b806111f181612740565b9150506110c4565b5061120482826122a2565b90508061121183836122a2565b146112a1577fde3142f93c040ab4be0d03a16ac06c502816c1205865dd41d9848727102570d16040516112919060208082526033908201527f496e73756666696369656e7420746f6b656e7320746f20737761702e20506c6560408201527261736520616464206d6f726520746f6b656e7360681b606082015260800190565b60405180910390a1505050611f67565b600080546001600160a01b03166318cbafe5838387306112c34261012c61289e565b6040518663ffffffff1660e01b81526004016112e39594939291906128fd565b6000604051808303816000875af1158015611302573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261132a919081019061296e565b9050600047905081600081518110611344576113446126da565b602002602001015183141580611374575081600181518110611368576113686126da565b60200260200101518114155b156113ef577fde3142f93c040ab4be0d03a16ac06c502816c1205865dd41d9848727102570d16040516113e69060208082526025908201527f556e657870656374656420616d6f756e74732072657475726e65642066726f6d604082015264020737761760dc1b606082015260800190565b60405180910390a15b8060005b6002548110156116335760028181548110611410576114106126da565b600091825260209091206006600790920201015460ff168061146b57506002808281548110611441576114416126da565b60009182526020909120600460079092020181015460ff16908111156114695761146961254e565b145b156116215760025461147f906001906128ea565b81036114b3578160028281548110611499576114996126da565b906000526020600020906007020160050181905550611621565b60028082815481106114c7576114c76126da565b60009182526020909120600460079092020181015460ff16908111156114ef576114ef61254e565b036115ac576000600280838154811061150a5761150a6126da565b90600052602060002090600702016003015461152691906128c8565b9050600086826002858154811061153f5761153f6126da565b90600052602060002090600702016003015461155b91906128ea565b61156590876128b1565b61156f91906128c8565b90508060028481548110611585576115856126da565b60009182526020909120600560079092020101556115a381856128ea565b93505050611621565b600085600283815481106115c2576115c26126da565b906000526020600020906007020160030154856115df91906128b1565b6115e991906128c8565b905080600283815481106115ff576115ff6126da565b600091825260209091206005600790920201015561161d81846128ea565b9250505b8061162b81612740565b9150506113f3565b5060005b600254811015611f2257600060028281548110611656576116566126da565b60009182526020909120600460079092020181015460ff169081111561167e5761167e61254e565b036118305760028181548110611696576116966126da565b600091825260209091206006600790920201015460ff161561174c57600281815481106116c5576116c56126da565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b03166108fc60028381548110611709576117096126da565b9060005260206000209060070201600501549081150290604051600060405180830381858888f19350505050158015611746573d6000803e3d6000fd5b50611ebd565b856001600160a01b031663a9059cbb6002838154811061176e5761176e6126da565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166117c189600286815481106117aa576117aa6126da565b9060005260206000209060070201600301546122a2565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561180c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117469190612a14565b600360028281548110611845576118456126da565b60009182526020909120600460079092020181015460ff169081111561186d5761186d61254e565b03611a7e5760028181548110611885576118856126da565b600091825260209091206006600790920201015460ff16156118b457600281815481106116c5576116c56126da565b856001600160a01b031663095ea7b3600283815481106118d6576118d66126da565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166002848154811061190e5761190e6126da565b60009182526020909120600360079092020101546040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561196d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119919190612a14565b50600281815481106119a5576119a56126da565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b0316634ec109f47f000000000000000000000000000000000000000000000000000000000000000030611a118a600287815481106117aa576117aa6126da565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064015b600060405180830381600087803b158015611a6157600080fd5b505af1158015611a75573d6000803e3d6000fd5b50505050611ebd565b600160028281548110611a9357611a936126da565b60009182526020909120600460079092020181015460ff1690811115611abb57611abb61254e565b03611c325760028181548110611ad357611ad36126da565b600091825260209091206006600790920201015460ff1615611ba35760028181548110611b0257611b026126da565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b031663db6b524660028381548110611b4857611b486126da565b9060005260206000209060070201600501546040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b8557600080fd5b505af1158015611b99573d6000803e3d6000fd5b5050505050611ebd565b60028181548110611bb657611bb66126da565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b031663338b5dea30611c0189600286815481106117aa576117aa6126da565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401611a47565b600460028281548110611c4757611c476126da565b60009182526020909120600460079092020181015460ff1690811115611c6f57611c6f61254e565b03611cd8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166342966c68611cba88600285815481106117aa576117aa6126da565b6040518263ffffffff1660e01b8152600401611a4791815260200190565b6002808281548110611cec57611cec6126da565b60009182526020909120600460079092020181015460ff1690811115611d1457611d1461254e565b03611ebd57600060028281548110611d2e57611d2e6126da565b9060005260206000209060070201600501541115611ebd576000611d81876002808581548110611d6057611d606126da565b906000526020600020906007020160030154611d7c91906128c8565b6122a2565b600054600280549293506001600160a01b039091169163f305d719919085908110611dae57611dae6126da565b9060005260206000209060070201600501547f00000000000000000000000000000000000000000000000000000000000000008460008060028981548110611df857611df86126da565b600091825260209091206007909102016004015461010090046001600160a01b0316611e264261012c61289e565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af1158015611e93573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611eb89190612a31565b505050505b600060028281548110611ed257611ed26126da565b906000526020600020906007020160030181905550600060028281548110611efc57611efc6126da565b600091825260209091206005600790920201015580611f1a81612740565b915050611637565b5060408051858152602081018490527f5e20c9aee521e656eed033c4ae35378c79c584706f5ce7f410ab3fba389607a1910160405180910390a1505042600155505050505b6000805460ff60a01b19169055565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611fbe5760405162461bcd60e51b815260040161046e906126b2565b60026040518061010001604052808681526020018581526020018481526020016000815260200160026004811115611ff857611ff861254e565b81526001600160a01b038416602080830191909152600060408301819052606090920182905283546001810185559382529020815191926007020190819061204090826127de565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff021916908360048111156120895761208961254e565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff191691151591909117905550505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461212e5760405162461bcd60e51b815260040161046e906126b2565b6002604051806101000160405280858152602001848152602001838152602001600081526020016004808111156121675761216761254e565b81526000602080830182905260408301829052606090920181905283546001810185559381522081519192600702019081906121a390826127de565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff021916908360048111156121ec576121ec61254e565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff1916911515919091179055505050565b60008160405160200161225b9190612a5f565b60405160208183030381529060405280519060200120836040516020016122829190612a5f565b604051602081830303815290604052805190602001201490505b92915050565b6040516370a0823160e01b815230600482015260009081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156122eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230f9190612a7b565b905082811115612322578291505061229c565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561236857612368612329565b604052919050565b600082601f83011261238157600080fd5b813567ffffffffffffffff81111561239b5761239b612329565b6123ae601f8201601f191660200161233f565b8181528460208386010111156123c357600080fd5b816020850160208301376000918101602001919091529392505050565b600080604083850312156123f357600080fd5b823567ffffffffffffffff81111561240a57600080fd5b61241685828601612370565b95602094909401359450505050565b80356001600160a01b03811681146109d757600080fd5b801515811461244a57600080fd5b50565b600080600080600060a0868803121561246557600080fd5b853567ffffffffffffffff81111561247c57600080fd5b61248888828901612370565b95505060208601359350604086013592506124a560608701612425565b915060808601356124b58161243c565b809150509295509295909350565b6000602082840312156124d557600080fd5b5035919050565b600080604083850312156124ef57600080fd5b823567ffffffffffffffff81111561250657600080fd5b61251285828601612370565b92505061252160208401612425565b90509250929050565b60005b8381101561254557818101518382015260200161252d565b50506000910152565b634e487b7160e01b600052602160045260246000fd5b60006101008083528a51808285015261012091506125888183860160208f0161252a565b602084018b9052604084018a905260608401899052601f01601f19168301019050600586106125c757634e487b7160e01b600052602160045260246000fd5b8560808301526125e260a08301866001600160a01b03169052565b8360c08301526125f660e083018415159052565b9998505050505050505050565b6000806000806080858703121561261957600080fd5b843567ffffffffffffffff81111561263057600080fd5b61263c87828801612370565b945050602085013592506040850135915061265960608601612425565b905092959194509250565b60008060006060848603121561267957600080fd5b833567ffffffffffffffff81111561269057600080fd5b61269c86828701612370565b9660208601359650604090950135949350505050565b6020808252600e908201526d6e6f207065726d697373696f6e7360901b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168061270457607f821691505b60208210810361272457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000600182016127525761275261272a565b5060010190565b6020808252601c908201527f636f756c64206e6f742066696e642074617820746f2075706461746500000000604082015260600190565b601f82111561061557600081815260208120601f850160051c810160208610156127b75750805b601f850160051c820191505b818110156127d6578281556001016127c3565b505050505050565b815167ffffffffffffffff8111156127f8576127f8612329565b61280c8161280684546126f0565b84612790565b602080601f83116001811461284157600084156128295750858301515b600019600386901b1c1916600185901b1785556127d6565b600085815260208120601f198616915b8281101561287057888601518255948401946001909101908401612851565b508582101561288e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8082018082111561229c5761229c61272a565b808202811582820484141761229c5761229c61272a565b6000826128e557634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561229c5761229c61272a565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561294d5784516001600160a01b031683529383019391830191600101612928565b50506001600160a01b03969096166060850152505050608001529392505050565b6000602080838503121561298157600080fd5b825167ffffffffffffffff8082111561299957600080fd5b818501915085601f8301126129ad57600080fd5b8151818111156129bf576129bf612329565b8060051b91506129d084830161233f565b81815291830184019184810190888411156129ea57600080fd5b938501935b83851015612a08578451825293850193908501906129ef565b98975050505050505050565b600060208284031215612a2657600080fd5b81516123228161243c565b600080600060608486031215612a4657600080fd5b8351925060208401519150604084015190509250925092565b60008251612a7181846020870161252a565b9190910192915050565b600060208284031215612a8d57600080fd5b505191905056fea2646970667358221220087d20dd27fcf41815d0e7d221e132eeaae212461c9d9886737f71dfd632977764736f6c63430008110033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106104545760003560e01c80636b8f2f3b11610241578063b0ad3ebf1161013b578063d2d7ad83116100c3578063e79d416011610087578063e79d4160146109d9578063e948474b146109e2578063ede49a1914610a05578063f19fffcb14610a19578063f1f5cd9114610a2d57600080fd5b8063d2d7ad831461095b578063d31acb2814610964578063db38a41d14610977578063dba61c5814610997578063dd62ed3e146109a057600080fd5b8063c2ed286b1161010a578063c2ed286b1461091b578063c4a5abcd1461092e578063c552f4c514610937578063cc1776d31461094a578063d00efb2f1461095257600080fd5b8063b0ad3ebf146108af578063be86eab2146108d2578063bee0b32e146108e5578063c20c5caf1461090857600080fd5b80638091f3bf116101c957806395d89b411161018d57806395d89b411461084b578063989763ef14610853578063a457c2d714610876578063a6f9dae114610889578063a9059cbb1461089c57600080fd5b80638091f3bf146107f057806380c3147c1461080457806381045345146108175780638da5cb5b1461082a57806395381ec41461084257600080fd5b8063715018a611610210578063715018a6146107a15780637412dbb3146107a9578063751039fc146107cc578063790ca413146107d457806379cc6790146107dd57600080fd5b80636b8f2f3b146107485780636f8645521461075c5780636fdb540a1461076457806370a082311461077857600080fd5b8063368274991161035257806352c6dbc4116102da5780635d9d7d431161029e5780635d9d7d43146106fe5780635e45da23146107115780636331bf651461071a5780636508c57e146107225780636a092e791461073557600080fd5b806352c6dbc41461069e5780635543379a146106b2578063570ca735146106c5578063583dd79d146106d85780635d90bbaf146106eb57600080fd5b80634c43e307116103215780634c43e307146106555780634ebb4e631461065d5780634f7041a5146106705780634f72e2a2146106785780634fbc27751461068b57600080fd5b80633682749914610613578063395093511461062657806342966c681461063957806345541cba1461064c57600080fd5b80631aa7edd3116103e057806328be9038116103a457806328be903814610593578063293230b8146105a65780632b750627146105ae578063313ce567146105d15780633164df8b146105f057600080fd5b80631aa7edd31461053f5780631e19ae77146105525780631f4a6d321461056557806323b872dd1461056d57806324b8c81f1461058057600080fd5b80630f3a325f116104275780630f3a325f146104bf578063127a27d2146104e25780631776834a146104f557806318160ddd14610508578063185511081461051a57600080fd5b8063064a59d01461045957806306fdde031461048257806307a1cfbd14610497578063095ea7b3146104ac575b600080fd5b60075461046d90600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b61048a610a35565b6040516104799190612bc9565b6104aa6104a5366004612c86565b610ac3565b005b61046d6104ba366004612ce7565b610b63565b61046d6104cd366004612d11565b60126020526000908152604090205460ff1681565b6104aa6104f0366004612d11565b610c57565b6104aa610503366004612d2c565b610d1d565b6002545b604051908152602001610479565b6016546001600160a01b03165b6040516001600160a01b039091168152602001610479565b6104aa61054d366004612d53565b610d51565b6104aa610560366004612d53565b610dab565b6104aa610e05565b61046d61057b366004612d8a565b610e43565b600b54610527906001600160a01b031681565b6104aa6105a1366004612d53565b610f6e565b6104aa610fc8565b61046d6105bc366004612d11565b60136020526000908152604090205460ff1681565b6006546105de9060ff1681565b60405160ff9091168152602001610479565b61046d6105fe366004612d11565b60156020526000908152604090205460ff1681565b6104aa610621366004612dc6565b611001565b61046d610634366004612ce7565b61104e565b6104aa610647366004612d2c565b611162565b61050c600c5481565b6104aa6111c4565b61046d61066b366004612d11565b6112b0565b61050c6112f7565b6104aa610686366004612dc6565b61136a565b6104aa610699366004612d53565b6113b7565b600b5461046d90600160b01b900460ff1681565b6104aa6106c0366004612dc6565b611411565b600754610527906001600160a01b031681565b6104aa6106e6366004612de3565b61145e565b6104aa6106f9366004612d53565b6114a7565b6104aa61070c366004612d53565b611501565b61050c600e5481565b61050c61155b565b6104aa610730366004612c86565b61157a565b61046d610743366004612e31565b6115db565b60165461046d90600160a01b900460ff1681565b61050c6116f7565b600b5461046d90600160c01b900460ff1681565b61050c610786366004612d11565b6001600160a01b031660009081526020819052604090205490565b6104aa61170c565b61046d6107b7366004612d11565b600a6020526000908152604090205460ff1681565b6104aa61178b565b61050c600f5481565b6104aa6107eb366004612ce7565b6117c6565b60075461046d90600160a81b900460ff1681565b6104aa610812366004612dc6565b6118f6565b6104aa610825366004612d2c565b61199c565b6006546105279061010090046001600160a01b031681565b61050c601c5481565b61048a6119d0565b61046d610861366004612d11565b60196020526000908152604090205460ff1681565b61046d610884366004612ce7565b6119dd565b6104aa610897366004612d11565b611aac565b61046d6108aa366004612ce7565b611b52565b61046d6108bd366004612d11565b60086020526000908152604090205460ff1681565b6104aa6108e0366004612d2c565b611be1565b61046d6108f3366004612d11565b601b6020526000908152604090205460ff1681565b6104aa610916366004612d2c565b611c15565b6104aa610929366004612d53565b611c49565b61050c600d5481565b6104aa610945366004612dc6565b611d21565b61050c611d6e565b61050c60105481565b61050c60185481565b6104aa610972366004612e5b565b611db8565b61050c610985366004612d11565b60146020526000908152604090205481565b61050c60175481565b61050c6109ae366004612e31565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61050c60115481565b61046d6109f0366004612d11565b60096020526000908152604090205460ff1681565b600b5461046d90600160a81b900460ff1681565b600b5461046d90600160b81b900460ff1681565b61050c611df2565b60058054610a4290612e7d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6e90612e7d565b8015610abb5780601f10610a9057610100808354040283529160200191610abb565b820191906000526020600020905b815481529060010190602001808311610a9e57829003601f168201915b505050505081565b60065461010090046001600160a01b03163314610afb5760405162461bcd60e51b8152600401610af290612eb7565b60405180910390fd5b6016546040516307a1cfbd60e01b81526001600160a01b03909116906307a1cfbd90610b2d9085908590600401612eff565b600060405180830381600087803b158015610b4757600080fd5b505af1158015610b5b573d6000803e3d6000fd5b505050505050565b6007546000903390600160a01b900460ff168015610b8a5750600754600160a81b900460ff165b80610ba757506006546001600160a01b0382811661010090920416145b80610bc157503360009081526008602052604090205460ff165b610bdd5760405162461bcd60e51b8152600401610af290612f21565b6001600160a01b038416610c035760405162461bcd60e51b8152600401610af290612f4e565b3360008181526001602090815260408083206001600160a01b038916808552908352928190208790555186815291929160008051602061309483398151915291015b60405180910390a35060019392505050565b60065461010090046001600160a01b03163314610c865760405162461bcd60e51b8152600401610af290612eb7565b600b80546001600160a01b0319166001600160a01b038381169182179092556006546040516318e02bd960e01b81526101009091049092166004830152906318e02bd990602401600060405180830381600087803b158015610ce757600080fd5b505af1158015610cfb573d6000803e3d6000fd5b5050600b805464ff000000ff60a01b191664010000000160a01b179055505050565b60065461010090046001600160a01b03163314610d4c5760405162461bcd60e51b8152600401610af290612eb7565b600e55565b60065461010090046001600160a01b03163314610d805760405162461bcd60e51b8152600401610af290612eb7565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314610dda5760405162461bcd60e51b8152600401610af290612eb7565b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b60075460405147916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610e3f573d6000803e3d6000fd5b5050565b6007546000908490600160a01b900460ff168015610e6a5750600754600160a81b900460ff165b80610e8757506006546001600160a01b0382811661010090920416145b80610ea157503360009081526008602052604090205460ff165b610ebd5760405162461bcd60e51b8152600401610af290612f21565b6001600160a01b0385166000908152600160209081526040808320338452909152902054610eec908490612f9b565b6001600160a01b0386166000908152600160209081526040808320338452909152902055610f1b858585611f04565b6001600160a01b03851660008181526001602090815260408083203380855290835292819020549051908152919291600080516020613094833981519152910160405180910390a3506001949350505050565b60065461010090046001600160a01b03163314610f9d5760405162461bcd60e51b8152600401610af290612eb7565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314610ff75760405162461bcd60e51b8152600401610af290612eb7565b610fff612115565b565b60065461010090046001600160a01b031633146110305760405162461bcd60e51b8152600401610af290612eb7565b600b8054911515600160b81b0260ff60b81b19909216919091179055565b6007546000903390600160a01b900460ff1680156110755750600754600160a81b900460ff165b8061109257506006546001600160a01b0382811661010090920416145b806110ac57503360009081526008602052604090205460ff165b6110c85760405162461bcd60e51b8152600401610af290612f21565b6001600160a01b0384166110ee5760405162461bcd60e51b8152600401610af290612f4e565b3360009081526001602090815260408083206001600160a01b038816845290915290205461111d908490612fae565b3360008181526001602090815260408083206001600160a01b038a16808552908352928190208590555193845290926000805160206130948339815191529101610c45565b3360009081526015602052604090205460ff166111b75760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610af2565b6111c13382612156565b50565b600754600160a81b900460ff1661122f5760405162461bcd60e51b815260206004820152602960248201527f63616e206f6e6c792062652063616c6c6564206f6e636520746f6b656e206973604482015268081b185d5b98da195960ba1b6064820152608401610af2565b6007546001600160a01b0316331461124657600080fd5b601660009054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561129657600080fd5b505af11580156112aa573d6000803e3d6000fd5b50505050565b6001600160a01b0381166000908152601b602052604081205460ff16806112f15750601c546001600160a01b03831660009081526020819052604090205410155b92915050565b60165460408051631296b91d60e11b815290516000926001600160a01b03169163252d723a9160048083019260209291908290030181865afa158015611341573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113659190612fc1565b905090565b60065461010090046001600160a01b031633146113995760405162461bcd60e51b8152600401610af290612eb7565b60168054911515600160a01b0260ff60a01b19909216919091179055565b60065461010090046001600160a01b031633146113e65760405162461bcd60e51b8152600401610af290612eb7565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146114405760405162461bcd60e51b8152600401610af290612eb7565b600b8054911515600160b01b0260ff60b01b19909216919091179055565b6007546001600160a01b0316331461147557600080fd5b60165460405163583dd79d60e01b81526001600160a01b039091169063583dd79d90610b2d9085908590600401612fda565b60065461010090046001600160a01b031633146114d65760405162461bcd60e51b8152600401610af290612eb7565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146115305760405162461bcd60e51b8152600401610af290612eb7565b6001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b6000612710600d546002546115709190613004565b611365919061301b565b60065461010090046001600160a01b031633146115a95760405162461bcd60e51b8152600401610af290612eb7565b60165460405163328462bf60e11b81526001600160a01b0390911690636508c57e90610b2d9085908590600401612eff565b60065460009061010090046001600160a01b0316331461160d5760405162461bcd60e51b8152600401610af290612eb7565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611654573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116789190612fc1565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af11580156116cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ef919061303d565b949350505050565b6000612710600c546002546115709190613004565b60065461010090046001600160a01b0316331461173b5760405162461bcd60e51b8152600401610af290612eb7565b60065460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360068054610100600160a81b0319169055565b60065461010090046001600160a01b031633146117ba5760405162461bcd60e51b8152600401610af290612eb7565b6000600d819055600c55565b3360009081526015602052604090205460ff1661181b5760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610af2565b6001600160a01b0382166000908152600160209081526040808320338452909152902054818110611879576118508282612f9b565b6001600160a01b038416600090815260016020908152604080832033845290915290205561189e565b6001600160a01b03831660009081526001602090815260408083203384529091528120555b6118a88383612156565b6001600160a01b0383166000818152600160209081526040808320338085529083529281902054905190815291929160008051602061309483398151915291015b60405180910390a3505050565b60065461010090046001600160a01b031633146119255760405162461bcd60e51b8152600401610af290612eb7565b600b54600160a01b900460ff1661197e5760405162461bcd60e51b815260206004820152601e60248201527f6d657620616e746920626f74206973206e6f7420636f6e6669677572656400006044820152606401610af2565b600b8054911515600160c01b0260ff60c01b19909216919091179055565b60065461010090046001600160a01b031633146119cb5760405162461bcd60e51b8152600401610af290612eb7565b600d55565b60048054610a4290612e7d565b6007546000903390600160a01b900460ff168015611a045750600754600160a81b900460ff165b80611a2157506006546001600160a01b0382811661010090920416145b80611a3b57503360009081526008602052604090205460ff165b611a575760405162461bcd60e51b8152600401610af290612f21565b6001600160a01b038416611a7d5760405162461bcd60e51b8152600401610af290612f4e565b3360009081526001602090815260408083206001600160a01b038816845290915290205461111d908490612f9b565b60065461010090046001600160a01b03163314611adb5760405162461bcd60e51b8152600401610af290612eb7565b6001600160a01b038116611b2a5760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610af2565b600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6007546000903390600160a01b900460ff168015611b795750600754600160a81b900460ff165b80611b9657506006546001600160a01b0382811661010090920416145b80611bb057503360009081526008602052604090205460ff165b611bcc5760405162461bcd60e51b8152600401610af290612f21565b611bd7338585611f04565b5060019392505050565b60065461010090046001600160a01b03163314611c105760405162461bcd60e51b8152600401610af290612eb7565b601c55565b60065461010090046001600160a01b03163314611c445760405162461bcd60e51b8152600401610af290612eb7565b600c55565b60065461010090046001600160a01b03163314611c785760405162461bcd60e51b8152600401610af290612eb7565b6001600160a01b0382166000908152600a602052604090205460ff161580611c9e575080155b611cf65760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206578636c75646520616e2065786368616e67652066726f6d206044820152620e8c2f60eb1b6064820152608401610af2565b6001600160a01b03919091166000908152601960205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314611d505760405162461bcd60e51b8152600401610af290612eb7565b600b8054911515600160a81b0260ff60a81b19909216919091179055565b6016546040805163585e42ef60e11b815290516000926001600160a01b03169163b0bc85de9160048083019260209291908290030181865afa158015611341573d6000803e3d6000fd5b60065461010090046001600160a01b03163314611de75760405162461bcd60e51b8152600401610af290612eb7565b601891909155601755565b600754600090600160a81b900460ff1615611e2457600360105443611e179190612f9b565b1015611e24575061226090565b50600090565b6001600160a01b0381166000908152601960205260409020805460ff191660011790556111c1815b6001600160a01b0381166000908152601560205260409020805460ff191660011790556111c1815b6001600160a01b0381166000908152601360205260409020805460ff191660011790556111c1815b60068054610100600160a81b0319166101006001600160a01b0393841681029190911780835581900483166000908152600860205260409020805460ff19166001179055905460078054929091049092166001600160a01b0319909116179055565b6001600160a01b038216611f535760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610af2565b6001600160a01b03831660009081526009602052604090205460ff1615611fbc5760405162461bcd60e51b815260206004820152601e60248201527f61646472657373206973206e6f7420616c6c6f77656420746f2073656c6c00006044820152606401610af2565b60035460ff161561205a576001600160a01b038316600090815260208190526040902054611feb908290612f9b565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461201b908290612fae565b6001600160a01b0383811660008181526020818152604091829020949094555184815290929186169160008051602061307483398151915291016118e9565b6120658383836121df565b60006120728484846121ea565b6001600160a01b038516600090815260208190526040902054909150612099908390612f9b565b6001600160a01b0380861660009081526020819052604080822093909355908516815220546120c9908290612fae565b6001600160a01b03848116600081815260208181526040918290209490945551848152909291871691600080516020613074833981519152910160405180910390a36112aa565b505050565b60065461010090046001600160a01b031633146121445760405162461bcd60e51b8152600401610af290612eb7565b61214c6121f7565b42600f5543601055565b6001600160a01b03821661216957600080fd5b806002546121779190612f9b565b6002556001600160a01b03821660009081526020819052604090205461219e908290612f9b565b6001600160a01b0383166000818152602081815260408083209490945592518481529092600080516020613074833981519152910160405180910390a35050565b61211083838361223b565b60006116ef8484846123db565b60065461010090046001600160a01b031633146122265760405162461bcd60e51b8152600401610af290612eb7565b6007805460ff60a81b1916600160a81b179055565b600754600160a81b900460ff16801561225d5750601654600160a01b900460ff165b801561228157506001600160a01b0382166000908152600a602052604090205460ff165b801561229b575042601a54600a6122989190612fae565b11155b80156122c357506018546016546001600160a01b031660009081526020819052604090205410155b80156122e857506001600160a01b03831660009081526019602052604090205460ff16155b80156123685750601660009054906101000a90046001600160a01b03166001600160a01b031663d83067866040518163ffffffff1660e01b8152600401602060405180830381865afa158015612342573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612366919061303d565b155b156123d05742601a556016546040805163e4fc6b6d60e01b815290516001600160a01b039092169163e4fc6b6d9160048082019260009290919082900301818387803b1580156123b757600080fd5b505af11580156123cb573d6000803e3d6000fd5b505050505b6121108383836125fe565b6001600160a01b038316600090815260196020526040812054829060ff1615801561241f57506001600160a01b03841660009081526019602052604090205460ff16155b80156124345750600754600160a81b900460ff165b15612563576001600160a01b0385166000908152600a602052604090205460ff16156124d05760165460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc7906024016020604051808303816000875af11580156124a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c99190612fc1565b9050612563565b6001600160a01b0384166000908152600a602052604090205460ff161561256357601654604051634fa26fd560e01b8152600481018590526001600160a01b0390911690634fa26fd5906024016020604051808303816000875af115801561253c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125609190612fc1565b90505b600061256f8285612f9b565b905080156125e9576016546001600160a01b031660009081526020819052604090205461259d908290612fae565b601680546001600160a01b039081166000908152602081815260409182902094909455915491518481529181169290891691600080516020613074833981519152910160405180910390a35b6125f4868684612a2f565b9695505050505050565b600b54600160a81b900460ff16158061262757503360009081526012602052604090205460ff16155b6126655760405162461bcd60e51b815260206004820152600f60248201526e1cdb9a5c195c881c995a9958dd1959608a1b6044820152606401610af2565b600754600160a81b900460ff16801561269157506006546001600160a01b038481166101009092041614155b80156126b657506001600160a01b03831660009081526013602052604090205460ff16155b80156126db57506001600160a01b03821660009081526013602052604090205460ff16155b1561211057600e541561273a57600e545a111561273a5760405162461bcd60e51b815260206004820152601e60248201527f74686973206973206f76657220746865206d617820676173206c696d697400006044820152606401610af2565b6000600d5411801561276557506001600160a01b0382166000908152600a602052604090205460ff16155b156127e45761277261155b565b6001600160a01b038316600090815260208190526040902054612796908390612fae565b11156127e45760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d617820686f6c6420616d6f756e746044820152606401610af2565b6000600c5411801561280e57506001600160a01b0382166000908152600a602052604090205460ff165b1561286a5761281b6116f7565b81111561286a5760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d61782073656c6c20616d6f756e746044820152606401610af2565b600b54600160b01b900460ff16156129aa576001600160a01b0382166000908152601460205260409020544390036128d3576001600160a01b0382166000908152601260205260408120805460ff1916600117905560118054916128cd8361305a565b91905055505b6001600160a01b03831660009081526014602052604090205443900361292a576001600160a01b0383166000908152601260205260408120805460ff1916600117905560118054916129248361305a565b91905055505b6001600160a01b0382166000908152600a602052604081205460ff161515900361296a576001600160a01b03821660009081526014602052604090204390555b6001600160a01b0383166000908152600a602052604081205460ff16151590036129aa576001600160a01b03831660009081526014602052604090204390555b600b54600160c01b900460ff161561211057600b5460405163090ec10b60e31b81526001600160a01b03858116600483015284811660248301526044820184905290911690634876085890606401600060405180830381600087803b158015612a1257600080fd5b505af1158015612a26573d6000803e3d6000fd5b50505050505050565b6007546000908290600160a81b900460ff168015612a565750600b54600160b81b900460ff165b15612b05576006546001600160a01b038681166101009092041614801590612a8557506000612a83611df2565b115b8015612aaa57506001600160a01b03851660009081526013602052604090205460ff16155b8015612acf57506001600160a01b03841660009081526013602052604090205460ff16155b15612b05576000612710612ae1611df2565b612aeb9086613004565b612af5919061301b565b9050612b018183612f9b565b9150505b612b10858583612b19565b95945050505050565b6000826001600160a01b0316846001600160a01b031603612b7c5760405162461bcd60e51b815260206004820152601f60248201527f796f752063616e6e6f74207472616e7366657220746f20796f757273656c66006044820152606401610af2565b5092915050565b6000815180845260005b81811015612ba957602081850181015186830182015201612b8d565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000612bdc6020830184612b83565b9392505050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112612c0a57600080fd5b813567ffffffffffffffff80821115612c2557612c25612be3565b604051601f8301601f19908116603f01168101908282118183101715612c4d57612c4d612be3565b81604052838152866020858801011115612c6657600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060408385031215612c9957600080fd5b823567ffffffffffffffff811115612cb057600080fd5b612cbc85828601612bf9565b95602094909401359450505050565b80356001600160a01b0381168114612ce257600080fd5b919050565b60008060408385031215612cfa57600080fd5b612d0383612ccb565b946020939093013593505050565b600060208284031215612d2357600080fd5b612bdc82612ccb565b600060208284031215612d3e57600080fd5b5035919050565b80151581146111c157600080fd5b60008060408385031215612d6657600080fd5b612d6f83612ccb565b91506020830135612d7f81612d45565b809150509250929050565b600080600060608486031215612d9f57600080fd5b612da884612ccb565b9250612db660208501612ccb565b9150604084013590509250925092565b600060208284031215612dd857600080fd5b8135612bdc81612d45565b60008060408385031215612df657600080fd5b823567ffffffffffffffff811115612e0d57600080fd5b612e1985828601612bf9565b925050612e2860208401612ccb565b90509250929050565b60008060408385031215612e4457600080fd5b612e4d83612ccb565b9150612e2860208401612ccb565b60008060408385031215612e6e57600080fd5b50508035926020909101359150565b600181811c90821680612e9157607f821691505b602082108103612eb157634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526028908201527f63616e206f6e6c792062652063616c6c65642062792074686520636f6e74726160408201526731ba1037bbb732b960c11b606082015260800190565b604081526000612f126040830185612b83565b90508260208301529392505050565b6020808252601390820152721d1c98591a5b99c81b9bdd08195b98589b1959606a1b604082015260600190565b6020808252601c908201527f63616e6e6f7420617070726f7665207468652030206164647265737300000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156112f1576112f1612f85565b808201808211156112f1576112f1612f85565b600060208284031215612fd357600080fd5b5051919050565b604081526000612fed6040830185612b83565b905060018060a01b03831660208301529392505050565b80820281158282048414176112f1576112f1612f85565b60008261303857634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561304f57600080fd5b8151612bdc81612d45565b60006001820161306c5761306c612f85565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212203f2664f87ca058b01f772cef68da0be66bc0b36e55b965420ced4368f9ce79d664736f6c63430008110033

Deployed Bytecode Sourcemap

39281:3239:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8529:35;;;;;-1:-1:-1;;;8529:35:0;;;;;;;;;179:14:1;;172:22;154:41;;142:2;127:18;8529:35:0;;;;;;;;8403:19;;;:::i;:::-;;;;;;;:::i;20804:143::-;;;;;;:::i;:::-;;:::i;:::-;;11591:314;;;;;;:::i;:::-;;:::i;34430:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;37764:231;;;;;;:::i;:::-;;:::i;38793:98::-;;;;;;:::i;:::-;;:::i;9673:102::-;9755:12;;9673:102;;;3069:25:1;;;3057:2;3042:18;9673:102:0;2923:177:1;19950:114:0;20041:14;;-1:-1:-1;;;;;20041:14:0;19950:114;;;-1:-1:-1;;;;;3269:32:1;;;3251:51;;3239:2;3224:18;19950:114:0;3105:203:1;42276:117:0;;;;;;:::i;:::-;;:::i;21725:113::-;;;;;;:::i;:::-;;:::i;15367:134::-;;;:::i;12378:328::-;;;;;;:::i;:::-;;:::i;33979:29::-;;;;;-1:-1:-1;;;;;33979:29:0;;;15867:116;;;;;;:::i;:::-;;:::i;41247:112::-;;;:::i;34478:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;8429:21;;;;;;;;;;;;4488:4:1;4476:17;;;4458:36;;4446:2;4431:18;8429:21:0;4316:184:1;21353:43:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;38257:113;;;;;;:::i;:::-;;:::i;13221:381::-;;;;;;:::i;:::-;;:::i;22009:101::-;;;;;;:::i;:::-;;:::i;34221:27::-;;;;;;21146:136;;;:::i;42078:164::-;;;;;;:::i;:::-;;:::i;19758:102::-;;;:::i;20110:97::-;;;;;;:::i;:::-;;:::i;15734:121::-;;;;;;:::i;:::-;;:::i;34096:36::-;;;;;-1:-1:-1;;;34096:36:0;;;;;;38128:117;;;;;;:::i;:::-;;:::i;8499:23::-;;;;;-1:-1:-1;;;;;8499:23:0;;;20959:175;;;;;;:::i;:::-;;:::i;38903:109::-;;;;;;:::i;:::-;;:::i;39020:117::-;;;;;;:::i;:::-;;:::i;34289:26::-;;;;;;37257:113;;;:::i;20651:145::-;;;;;;:::i;:::-;;:::i;15511:211::-;;;;;;:::i;:::-;;:::i;17532:23::-;;;;;-1:-1:-1;;;17532:23:0;;;;;;37382:114;;;:::i;34180:28::-;;;;;-1:-1:-1;;;34180:28:0;;;;;;9992:119;;;;;;:::i;:::-;-1:-1:-1;;;;;10086:17:0;10059:7;10086:17;;;;;;;;;;;;9992:119;15219:140;;;:::i;8717:42::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39145:105;;;:::i;34324:25::-;;;;;;22509:431;;;;;;:::i;:::-;;:::i;8571:20::-;;;;;-1:-1:-1;;;8571:20:0;;;;;;38382:175;;;;;;:::i;:::-;;:::i;38681:100::-;;;;;;:::i;:::-;;:::i;8463:29::-;;;;;;;;-1:-1:-1;;;;;8463:29:0;;;39412:35;;;;;;8376:20;;;:::i;17652:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;14122:391;;;;;;:::i;:::-;;:::i;15065:146::-;;;;;;:::i;:::-;;:::i;10766:178::-;;;;;;:::i;:::-;;:::i;8604:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;42401:116;;;;;;:::i;:::-;;:::i;39356:49::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;38569:100;;;;;;:::i;:::-;;:::i;20215:225::-;;;;;;:::i;:::-;;:::i;34255:27::-;;;;;;38007:109;;;;;;:::i;:::-;;:::i;19556:104::-;;;:::i;34356:26::-;;;;;;17607:38;;;;;;20448:191;;;;;;:::i;:::-;;:::i;34531:55::-;;;;;;:::i;:::-;;;;;;;;;;;;;;17562:38;;;;;;10451:144;;;;;;:::i;:::-;-1:-1:-1;;;;;10562:16:0;;;10535:7;10562:16;;;:8;:16;;;;;;;;:25;;;;;;;;;;;;;10451:144;34389:28;;;;;;8658:52;;;;;;:::i;:::-;;;;;;;;;;;;;;;;34057:32;;;;;-1:-1:-1;;;34057:32:0;;;;;;34139:34;;;;;-1:-1:-1;;;34139:34:0;;;;;;37507:217;;;:::i;8403:19::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20804:143::-;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;;;;;;;;;20895:14:::1;::::0;:44:::1;::::0;-1:-1:-1;;;20895:44:0;;-1:-1:-1;;;;;20895:14:0;;::::1;::::0;:24:::1;::::0;:44:::1;::::0;20920:7;;20929:9;;20895:44:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;20804:143:::0;;:::o;11591:314::-;9225:16;;11694:4;;11673:10;;-1:-1:-1;;;9225:16:0;;;;:28;;;;-1:-1:-1;9245:8:0;;-1:-1:-1;;;9245:8:0;;;;9225:28;9224:47;;;-1:-1:-1;9266:5:0;;-1:-1:-1;;;;;9258:13:0;;;9266:5;;;;;9258:13;9224:47;:77;;;-1:-1:-1;9290:10:0;9275:26;;;;:14;:26;;;;;;;;9224:77;9216:109;;;;-1:-1:-1;;;9216:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11719:21:0;::::1;11711:62;;;;-1:-1:-1::0;;;11711:62:0::1;;;;;;;:::i;:::-;11795:10;11786:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;11786:29:0;::::1;::::0;;;;;;;;;;:37;;;11839:36;3069:25:1;;;11786:29:0;;11795:10;-1:-1:-1;;;;;;;;;;;11839:36:0;3042:18:1;11839:36:0::1;;;;;;;;-1:-1:-1::0;11893:4:0::1;::::0;11591:314;-1:-1:-1;;;11591:314:0:o;37764:231::-;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;37840:10:::1;:33:::0;;-1:-1:-1;;;;;;37840:33:0::1;-1:-1:-1::0;;;;;37840:33:0;;::::1;::::0;;::::1;::::0;;;37909:5:::1;::::0;37884:31:::1;::::0;-1:-1:-1;;;37884:31:0;;37840:33:::1;37909:5:::0;;::::1;::::0;;::::1;37884:31;::::0;::::1;3251:51:1::0;37840:33:0;37884:24:::1;::::0;3224:18:1;;37884:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;37926:20:0::1;:27:::0;;-1:-1:-1;;;;37964:23:0;-1:-1:-1;;;37964:23:0;;;-1:-1:-1;;;37764:231:0:o;38793:98::-;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;38863:11:::1;:20:::0;38793:98::o;42276:117::-;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42358:22:0;;;::::1;;::::0;;;:17:::1;:22;::::0;;;;:27;;-1:-1:-1;;42358:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;42276:117::o;21725:113::-;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21805:15:0;;;::::1;;::::0;;;:10:::1;:15;::::0;;;;:25;;-1:-1:-1;;21805:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;21725:113::o;15367:134::-;15466:8;;15458:35;;15426:21;;-1:-1:-1;;;;;15466:8:0;;15458:35;;;;;15426:21;;15408:15;15458:35;15408:15;15458:35;15426:21;15466:8;15458:35;;;;;;;;;;;;;;;;;;;;;15397:104;15367:134::o;12378:328::-;9225:16;;12489:4;;12474;;-1:-1:-1;;;9225:16:0;;;;:28;;;;-1:-1:-1;9245:8:0;;-1:-1:-1;;;9245:8:0;;;;9225:28;9224:47;;;-1:-1:-1;9266:5:0;;-1:-1:-1;;;;;9258:13:0;;;9266:5;;;;;9258:13;9224:47;:77;;;-1:-1:-1;9290:10:0;9275:26;;;;:14;:26;;;;;;;;9224:77;9216:109;;;;-1:-1:-1;;;9216:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12535:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;12550:10:::1;12535:26:::0;;;;;;;;:34:::1;::::0;12564:5;;12535:34:::1;:::i;:::-;-1:-1:-1::0;;;;;12506:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;12521:10:::1;12506:26:::0;;;;;;;:63;12580:26:::1;12515:4:::0;12596:2;12600:5;12580:9:::1;:26::i;:::-;-1:-1:-1::0;;;;;12622:54:0;::::1;12649:14;::::0;;;:8:::1;:14;::::0;;;;;;;12637:10:::1;12649:26:::0;;;;;;;;;;;12622:54;;3069:25:1;;;12637:10:0;;12622:54;-1:-1:-1;;;;;;;;;;;12622:54:0;3042:18:1;12622:54:0::1;;;;;;;-1:-1:-1::0;12694:4:0::1;::::0;12378:328;-1:-1:-1;;;;12378:328:0:o;15867:116::-;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15948:14:0;;;::::1;;::::0;;;:9:::1;:14;::::0;;;;:27;;-1:-1:-1;;15948:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;15867:116::o;41247:112::-;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;41331:20:::1;:18;:20::i;:::-;41247:112::o:0;38257:113::-;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;38330:22:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;38330:32:0::1;-1:-1:-1::0;;;;38330:32:0;;::::1;::::0;;;::::1;::::0;;38257:113::o;13221:381::-;9225:16;;13330:4;;13309:10;;-1:-1:-1;;;9225:16:0;;;;:28;;;;-1:-1:-1;9245:8:0;;-1:-1:-1;;;9245:8:0;;;;9225:28;9224:47;;;-1:-1:-1;9266:5:0;;-1:-1:-1;;;;;9258:13:0;;;9266:5;;;;;9258:13;9224:47;:77;;;-1:-1:-1;9290:10:0;9275:26;;;;:14;:26;;;;;;;;9224:77;9216:109;;;;-1:-1:-1;;;9216:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13355:21:0;::::1;13347:62;;;;-1:-1:-1::0;;;13347:62:0::1;;;;;;;:::i;:::-;13463:10;13454:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;13454:29:0;::::1;::::0;;;;;;;;:42:::1;::::0;13486:10;;13454:42:::1;:::i;:::-;13431:10;13422:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;13422:29:0;::::1;::::0;;;;;;;;;;:74;;;13512:60;3069:25:1;;;13422:29:0;;-1:-1:-1;;;;;;;;;;;13512:60:0;3042:18:1;13512:60:0::1;2923:177:1::0;22009:101:0;21457:10;21446:22;;;;:10;:22;;;;;;;;21438:54;;;;-1:-1:-1;;;21438:54:0;;8062:2:1;21438:54:0;;;8044:21:1;8101:2;8081:18;;;8074:30;-1:-1:-1;;;8120:18:1;;;8113:49;8179:18;;21438:54:0;7860:343:1;21438:54:0;22078:24:::1;22084:10;22096:5;22078;:24::i;:::-;22009:101:::0;:::o;21146:136::-;8949:8;;-1:-1:-1;;;8949:8:0;;;;8941:62;;;;-1:-1:-1;;;8941:62:0;;8410:2:1;8941:62:0;;;8392:21:1;8449:2;8429:18;;;8422:30;8488:34;8468:18;;;8461:62;-1:-1:-1;;;8539:18:1;;;8532:39;8588:19;;8941:62:0;8208:405:1;8941:62:0;21227:8:::1;::::0;-1:-1:-1;;;;;21227:8:0::1;21213:10;:22;21205:31;;;::::0;::::1;;21247:14;;;;;;;;;-1:-1:-1::0;;;;;21247:14:0::1;-1:-1:-1::0;;;;;21247:25:0::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;21146:136::o:0;42078:164::-;-1:-1:-1;;;;;42170:22:0;;42146:4;42170:22;;;:17;:22;;;;;;;;;:64;;-1:-1:-1;42214:20:0;;-1:-1:-1;;;;;42196:14:0;;:9;:14;;;;;;;;;;;:38;;42170:64;42163:71;42078:164;-1:-1:-1;;42078:164:0:o;19758:102::-;19826:14;;:26;;;-1:-1:-1;;;19826:26:0;;;;19799:7;;-1:-1:-1;;;;;19826:14:0;;:24;;:26;;;;;;;;;;;;;;:14;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19819:33;;19758:102;:::o;20110:97::-;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;20178:11:::1;:21:::0;;;::::1;;-1:-1:-1::0;;;20178:21:0::1;-1:-1:-1::0;;;;20178:21:0;;::::1;::::0;;;::::1;::::0;;20110:97::o;15734:121::-;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15818:19:0;;;::::1;;::::0;;;:14:::1;:19;::::0;;;;:29;;-1:-1:-1;;15818:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;15734:121::o;38128:117::-;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;38203:24:::1;:34:::0;;;::::1;;-1:-1:-1::0;;;38203:34:0::1;-1:-1:-1::0;;;;38203:34:0;;::::1;::::0;;;::::1;::::0;;38128:117::o;20959:175::-;21062:8;;-1:-1:-1;;;;;21062:8:0;21048:10;:22;21040:31;;;;;;21082:14;;:44;;-1:-1:-1;;;21082:44:0;;-1:-1:-1;;;;;21082:14:0;;;;:27;;:44;;21110:7;;21119:6;;21082:44;;;:::i;38903:109::-;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38981:13:0;;;::::1;;::::0;;;:8:::1;:13;::::0;;;;:23;;-1:-1:-1;;38981:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;38903:109::o;39020:117::-;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39101:18:0;;;::::1;;::::0;;;:13:::1;:18;::::0;;;;:28;;-1:-1:-1;;39101:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;39020:117::o;37257:113::-;37298:7;37357:5;37341:12;;37326;;:27;;;;:::i;:::-;37325:37;;;;:::i;20651:145::-;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;20743:14:::1;::::0;:45:::1;::::0;-1:-1:-1;;;20743:45:0;;-1:-1:-1;;;;;20743:14:0;;::::1;::::0;:25:::1;::::0;:45:::1;::::0;20769:7;;20778:9;;20743:45:::1;;;:::i;15511:211::-:0;8826:5;;15589:4;;8826:5;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;15623:38:::1;::::0;-1:-1:-1;;;15623:38:0;;15655:4:::1;15623:38;::::0;::::1;3251:51:1::0;15605:15:0::1;::::0;-1:-1:-1;;;;;15623:23:0;::::1;::::0;::::1;::::0;3224:18:1;;15623:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15679:35;::::0;-1:-1:-1;;;15679:35:0;;-1:-1:-1;;;;;9716:32:1;;;15679:35:0::1;::::0;::::1;9698:51:1::0;9765:18;;;9758:34;;;15605:56:0;;-1:-1:-1;15679:22:0;;::::1;::::0;::::1;::::0;9671:18:1;;15679:35:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15672:42:::0;15511:211;-1:-1:-1;;;;15511:211:0:o;37382:114::-;37423:7;37483:5;37467:12;;37452;;:27;;;;:::i;15219:140::-;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;15304:5:::1;::::0;15283:39:::1;::::0;15319:1:::1;::::0;15304:5:::1;::::0;::::1;-1:-1:-1::0;;;;;15304:5:0::1;::::0;15283:39:::1;::::0;15319:1;;15283:39:::1;15333:5;:18:::0;;-1:-1:-1;;;;;;15333:18:0::1;::::0;;15219:140::o;39145:105::-;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;39214:1:::1;39199:12;:16:::0;;;39226:12:::1;:16:::0;39145:105::o;22509:431::-;21457:10;21446:22;;;;:10;:22;;;;;;;;21438:54;;;;-1:-1:-1;;;21438:54:0;;8062:2:1;21438:54:0;;;8044:21:1;8101:2;8081:18;;;8074:30;-1:-1:-1;;;8120:18:1;;;8113:49;8179:18;;21438:54:0;7860:343:1;21438:54:0;-1:-1:-1;;;;;22619:17:0;::::1;22599;22619::::0;;;:8:::1;:17;::::0;;;;;;;22637:10:::1;22619:29:::0;;;;;;;;22663:18;;::::1;22659:166;;22730:17;22742:5:::0;22730:9;:17:::1;:::i;:::-;-1:-1:-1::0;;;;;22698:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;;;;22716:10:::1;22698:29:::0;;;;;;;:49;22659:166:::1;;;-1:-1:-1::0;;;;;22780:17:0;::::1;22812:1;22780:17:::0;;;:8:::1;:17;::::0;;;;;;;22798:10:::1;22780:29:::0;;;;;;;:33;22659:166:::1;22835:21;22841:7;22850:5;22835;:21::i;:::-;-1:-1:-1::0;;;;;22872:60:0;::::1;22902:17;::::0;;;:8:::1;:17;::::0;;;;;;;22890:10:::1;22902:29:::0;;;;;;;;;;;22872:60;;3069:25:1;;;22890:10:0;;22872:60;-1:-1:-1;;;;;;;;;;;22872:60:0;3042:18:1;22872:60:0::1;;;;;;;;22588:352;22509:431:::0;;:::o;38382:175::-;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;38457:20:::1;::::0;-1:-1:-1;;;38457:20:0;::::1;;;38449:63;;;::::0;-1:-1:-1;;;38449:63:0;;10255:2:1;38449:63:0::1;::::0;::::1;10237:21:1::0;10294:2;10274:18;;;10267:30;10333:32;10313:18;;;10306:60;10383:18;;38449:63:0::1;10053:354:1::0;38449:63:0::1;38523:16;:26:::0;;;::::1;;-1:-1:-1::0;;;38523:26:0::1;-1:-1:-1::0;;;;38523:26:0;;::::1;::::0;;;::::1;::::0;;38382:175::o;38681:100::-;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;38752:12:::1;:21:::0;38681:100::o;8376:20::-;;;;;;;:::i;14122:391::-;9225:16;;14236:4;;14215:10;;-1:-1:-1;;;9225:16:0;;;;:28;;;;-1:-1:-1;9245:8:0;;-1:-1:-1;;;9245:8:0;;;;9225:28;9224:47;;;-1:-1:-1;9266:5:0;;-1:-1:-1;;;;;9258:13:0;;;9266:5;;;;;9258:13;9224:47;:77;;;-1:-1:-1;9290:10:0;9275:26;;;;:14;:26;;;;;;;;9224:77;9216:109;;;;-1:-1:-1;;;9216:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14261:21:0;::::1;14253:62;;;;-1:-1:-1::0;;;14253:62:0::1;;;;;;;:::i;:::-;14369:10;14360:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;14360:29:0;::::1;::::0;;;;;;;;:47:::1;::::0;14392:15;;14360:47:::1;:::i;15065:146::-:0;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15137:17:0;::::1;15129:52;;;::::0;-1:-1:-1;;;15129:52:0;;10614:2:1;15129:52:0::1;::::0;::::1;10596:21:1::0;10653:2;10633:18;;;10626:30;-1:-1:-1;;;10672:18:1;;;10665:52;10734:18;;15129:52:0::1;10412:346:1::0;15129:52:0::1;15192:5;:11:::0;;-1:-1:-1;;;;;15192:11:0;;::::1;;;-1:-1:-1::0;;;;;;15192:11:0;;::::1;::::0;;;::::1;::::0;;15065:146::o;10766:178::-;9225:16;;10865:4;;10844:10;;-1:-1:-1;;;9225:16:0;;;;:28;;;;-1:-1:-1;9245:8:0;;-1:-1:-1;;;9245:8:0;;;;9225:28;9224:47;;;-1:-1:-1;9266:5:0;;-1:-1:-1;;;;;9258:13:0;;;9266:5;;;;;9258:13;9224:47;:77;;;-1:-1:-1;9290:10:0;9275:26;;;;:14;:26;;;;;;;;9224:77;9216:109;;;;-1:-1:-1;;;9216:109:0;;;;;;;:::i;:::-;10882:32:::1;10892:10;10904:2;10908:5;10882:9;:32::i;:::-;-1:-1:-1::0;10932:4:0::1;::::0;10766:178;-1:-1:-1;;;10766:178:0:o;42401:116::-;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;42480:20:::1;:29:::0;42401:116::o;38569:100::-;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;38640:12:::1;:21:::0;38569:100::o;20215:225::-;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20308:14:0;::::1;;::::0;;;:9:::1;:14;::::0;;;;;::::1;;:23;::::0;:43:::1;;-1:-1:-1::0;20335:16:0;::::1;20308:43;20300:91;;;::::0;-1:-1:-1;;;20300:91:0;;10965:2:1;20300:91:0::1;::::0;::::1;10947:21:1::0;11004:2;10984:18;;;10977:30;11043:34;11023:18;;;11016:62;-1:-1:-1;;;11094:18:1;;;11087:33;11137:19;;20300:91:0::1;10763:399:1::0;20300:91:0::1;-1:-1:-1::0;;;;;20402:20:0;;;::::1;;::::0;;;:15:::1;:20;::::0;;;;:30;;-1:-1:-1;;20402:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;20215:225::o;38007:109::-;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;38078:20:::1;:30:::0;;;::::1;;-1:-1:-1::0;;;38078:30:0::1;-1:-1:-1::0;;;;38078:30:0;;::::1;::::0;;;::::1;::::0;;38007:109::o;19556:104::-;19625:14;;:27;;;-1:-1:-1;;;19625:27:0;;;;19598:7;;-1:-1:-1;;;;;19625:14:0;;:25;;:27;;;;;;;;;;;;;;:14;:27;;;;;;;;;;;;;;20448:191;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;20552:23:::1;:35:::0;;;;20598:23:::1;:33:::0;20448:191::o;37507:217::-;37580:8;;37557:7;;-1:-1:-1;;;37580:8:0;;;;37577:121;;;37638:1;37624:11;;37609:12;:26;;;;:::i;:::-;:30;37605:82;;;-1:-1:-1;37667:4:0;;37507:217::o;37605:82::-;-1:-1:-1;37715:1:0;;37507:217::o;17765:144::-;-1:-1:-1;;;;;17837:23:0;;;;;;:15;:23;;;;;:30;;-1:-1:-1;;17837:30:0;17863:4;17837:30;;;17878:23;17853:6;21544:139;-1:-1:-1;;;;;21616:18:0;;;;;;:10;:18;;;;;:25;;-1:-1:-1;;21616:25:0;21637:4;21616:25;;;21652:23;21627:6;34623:142;-1:-1:-1;;;;;34695:21:0;;;;;;:13;:21;;;;;:28;;-1:-1:-1;;34695:28:0;34719:4;34695:28;;;34734:23;34709:6;9449:151;9512:5;:14;;-1:-1:-1;;;;;;9512:14:0;;-1:-1:-1;;;;;9512:14:0;;;;;;;;;;;;9552:5;;;;;-1:-1:-1;9537:21:0;;;:14;:21;;;;;:28;;-1:-1:-1;;9537:28:0;-1:-1:-1;9537:28:0;;;9587:5;;9576:8;:16;;9587:5;;;;;;;-1:-1:-1;;;;;;9576:16:0;;;;;;9449:151::o;16646:792::-;-1:-1:-1;;;;;16733:16:0;;16725:51;;;;-1:-1:-1;;;16725:51:0;;10614:2:1;16725:51:0;;;10596:21:1;10653:2;10633:18;;;10626:30;-1:-1:-1;;;10672:18:1;;;10665:52;10734:18;;16725:51:0;10412:346:1;16725:51:0;-1:-1:-1;;;;;16795:25:0;;;;;;:19;:25;;;;;;;;:34;16787:77;;;;-1:-1:-1;;;16787:77:0;;11369:2:1;16787:77:0;;;11351:21:1;11408:2;11388:18;;;11381:30;11447:32;11427:18;;;11420:60;11497:18;;16787:77:0;11167:354:1;16787:77:0;16889:16;;;;16885:546;;;-1:-1:-1;;;;;16942:15:0;;:9;:15;;;;;;;;;;;:23;;16960:5;;16942:23;:::i;:::-;-1:-1:-1;;;;;16924:15:0;;;:9;:15;;;;;;;;;;;:41;;;;16996:13;;;;;;;:21;;17012:5;;16996:21;:::i;:::-;-1:-1:-1;;;;;16980:13:0;;;:9;:13;;;;;;;;;;;;:37;;;;17037:25;3069::1;;;16980:13:0;;17037:25;;;;-1:-1:-1;;;;;;;;;;;17037:25:0;3042:18:1;17037:25:0;2923:177:1;16885:546:0;17097:28;17109:4;17115:2;17119:5;17097:11;:28::i;:::-;17142:22;17167:40;17191:4;17197:2;17201:5;17167:23;:40::i;:::-;-1:-1:-1;;;;;17240:15:0;;:9;:15;;;;;;;;;;;17142:65;;-1:-1:-1;17240:23:0;;17258:5;;17240:23;:::i;:::-;-1:-1:-1;;;;;17222:15:0;;;:9;:15;;;;;;;;;;;:41;;;;17294:13;;;;;;;:30;;17310:14;;17294:30;:::i;:::-;-1:-1:-1;;;;;17278:13:0;;;:9;:13;;;;;;;;;;;;:46;;;;17346:34;3069:25:1;;;17278:13:0;;17346:34;;;;-1:-1:-1;;;;;;;;;;;17346:34:0;3042:18:1;17346:34:0;;;;;;;17397:22;15367:134;16885:546;16646:792;;;:::o;34777:173::-;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;34846:20:::1;:18;:20::i;:::-;34890:15;34877:10;:28:::0;34930:12:::1;34916:11;:26:::0;34777:173::o;22972:263::-;-1:-1:-1;;;;;23047:21:0;;23039:30;;;;;;23112:5;23097:12;;:20;;;;:::i;:::-;23082:12;:35;-1:-1:-1;;;;;23149:18:0;;:9;:18;;;;;;;;;;;:26;;23170:5;;23149:26;:::i;:::-;-1:-1:-1;;;;;23128:18:0;;:9;:18;;;;;;;;;;;:47;;;;23191:36;;3069:25:1;;;23128:9:0;;-1:-1:-1;;;;;;;;;;;23191:36:0;3042:18:1;23191:36:0;;;;;;;22972:263;;:::o;41516:165::-;41639:34;41657:4;41663:2;41667:5;41639:17;:34::i;41693:214::-;41826:7;41853:46;41883:4;41889:2;41893:5;41853:29;:46::i;14557:83::-;8826:5;;;;;-1:-1:-1;;;;;8826:5:0;8812:10;:19;8804:72;;;;-1:-1:-1;;;8804:72:0;;;;;;;:::i;:::-;14617:8:::1;:15:::0;;-1:-1:-1;;;;14617:15:0::1;-1:-1:-1::0;;;14617:15:0::1;::::0;;14557:83::o;18853:570::-;18970:8;;-1:-1:-1;;;18970:8:0;;;;:37;;;;-1:-1:-1;18996:11:0;;-1:-1:-1;;;18996:11:0;;;;18970:37;:68;;;;-1:-1:-1;;;;;;19025:13:0;;;;;;:9;:13;;;;;;;;18970:68;:123;;;;;19078:15;19056:13;;19072:2;19056:18;;;;:::i;:::-;:37;;18970:123;:201;;;;-1:-1:-1;19148:23:0;;19128:14;;-1:-1:-1;;;;;19128:14:0;19110:9;:34;;;;;;;;;;;:61;;18970:201;:240;;;;-1:-1:-1;;;;;;19189:21:0;;;;;;:15;:21;;;;;;;;19188:22;18970:240;:289;;;;;19227:14;;;;;;;;;-1:-1:-1;;;;;19227:14:0;-1:-1:-1;;;;;19227:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;18970:289;18952:419;;;19302:15;19286:13;:31;19332:14;;:27;;;-1:-1:-1;;;19332:27:0;;;;-1:-1:-1;;;;;19332:14:0;;;;:25;;:27;;;;;:14;;:27;;;;;;;;:14;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18952:419;19381:34;19399:4;19405:2;19409:5;19381:17;:34::i;17927:916::-;-1:-1:-1;;;;;18113:21:0;;18036:7;18113:21;;;:15;:21;;;;;;18091:5;;18113:21;;:30;;;:62;;-1:-1:-1;;;;;;18147:19:0;;;;;;:15;:19;;;;;;;;:28;18113:62;:74;;;;-1:-1:-1;18179:8:0;;-1:-1:-1;;;18179:8:0;;;;18113:74;18109:390;;;-1:-1:-1;;;;;18208:15:0;;;;;;:9;:15;;;;;;;;18204:284;;;18295:14;;:32;;-1:-1:-1;;;18295:32:0;;;;;3069:25:1;;;-1:-1:-1;;;;;18295:14:0;;;;:25;;3042:18:1;;18295:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18278:49;;18204:284;;;-1:-1:-1;;;;;18353:13:0;;;;;;:9;:13;;;;;;;;18349:139;;;18439:14;;:33;;-1:-1:-1;;;18439:33:0;;;;;3069:25:1;;;-1:-1:-1;;;;;18439:14:0;;;;:26;;3042:18:1;;18439:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18422:50;;18349:139;18511:17;18531:22;18539:14;18531:5;:22;:::i;:::-;18511:42;-1:-1:-1;18568:13:0;;18564:199;;18653:14;;-1:-1:-1;;;;;18653:14:0;18635:9;:34;;;;;;;;;;;:46;;18672:9;;18635:46;:::i;:::-;18616:14;;;-1:-1:-1;;;;;18616:14:0;;;18598:9;:34;;;;;;;;;;;;:83;;;;18724:14;;18701:50;;3069:25:1;;;18724:14:0;;;;18701:50;;;;-1:-1:-1;;;;;;;;;;;18701:50:0;3042:18:1;18701:50:0;;;;;;;18564:199;18780:55;18810:4;18816:2;18820:14;18780:29;:55::i;:::-;18773:62;17927:916;-1:-1:-1;;;;;;17927:916:0:o;34962:1680::-;35069:20;;-1:-1:-1;;;35069:20:0;;;;:29;;:62;;-1:-1:-1;35111:10:0;35102:20;;;;:8;:20;;;;;;;;:29;35069:62;35061:90;;;;-1:-1:-1;;;35061:90:0;;11728:2:1;35061:90:0;;;11710:21:1;11767:2;11747:18;;;11740:30;-1:-1:-1;;;11786:18:1;;;11779:45;11841:18;;35061:90:0;11526:339:1;35061:90:0;35176:8;;-1:-1:-1;;;35176:8:0;;;;:25;;;;-1:-1:-1;35196:5:0;;-1:-1:-1;;;;;35188:13:0;;;35196:5;;;;;35188:13;;35176:25;:57;;;;-1:-1:-1;;;;;;35205:19:0;;;;;;:13;:19;;;;;;;;:28;35176:57;:87;;;;-1:-1:-1;;;;;;35237:17:0;;;;;;:13;:17;;;;;;;;:26;35176:87;35172:1408;;;35298:11;;:15;35294:122;;35354:11;;35341:9;:24;;35333:67;;;;-1:-1:-1;;;35333:67:0;;12072:2:1;35333:67:0;;;12054:21:1;12111:2;12091:18;;;12084:30;12150:32;12130:18;;;12123:60;12200:18;;35333:67:0;11870:354:1;35333:67:0;35463:1;35448:12;;:16;:42;;;;-1:-1:-1;;;;;;35468:13:0;;;;;;:9;:13;;;;;;;;:22;35448:42;35444:164;;;35545:10;:8;:10::i;:::-;-1:-1:-1;;;;;35520:13:0;;:9;:13;;;;;;;;;;;:21;;35536:5;;35520:21;:::i;:::-;:35;;35511:81;;;;-1:-1:-1;;;35511:81:0;;12431:2:1;35511:81:0;;;12413:21:1;;;12450:18;;;12443:30;12509:34;12489:18;;;12482:62;12561:18;;35511:81:0;12229:356:1;35511:81:0;35655:1;35640:12;;:16;:33;;;;-1:-1:-1;;;;;;35660:13:0;;;;;;:9;:13;;;;;;;;35640:33;35636:139;;;35712:10;:8;:10::i;:::-;35703:5;:19;;35694:65;;;;-1:-1:-1;;;35694:65:0;;12792:2:1;35694:65:0;;;12774:21:1;;;12811:18;;;12804:30;12870:34;12850:18;;;12843:62;12922:18;;35694:65:0;12590:356:1;35694:65:0;35806:24;;-1:-1:-1;;;35806:24:0;;;;35803:635;;;-1:-1:-1;;;;;35855:23:0;;;;;;:19;:23;;;;;;35882:12;35855:39;;35851:146;;-1:-1:-1;;;;;35919:12:0;;;;;;:8;:12;;;;;:19;;-1:-1:-1;;35919:19:0;35934:4;35919:19;;;35961:13;:16;;;;;;:::i;:::-;;;;;;35851:146;-1:-1:-1;;;;;36019:25:0;;;;;;:19;:25;;;;;;36048:12;36019:41;;36015:150;;-1:-1:-1;;;;;36085:14:0;;;;;;:8;:14;;;;;:21;;-1:-1:-1;;36085:21:0;36102:4;36085:21;;;36129:13;:16;;;;;;:::i;:::-;;;;;;36015:150;-1:-1:-1;;;;;36187:13:0;;;;;;:9;:13;;;;;;;;:22;;;;36183:109;;-1:-1:-1;;;;;36234:23:0;;;;;;:19;:23;;;;;36260:12;36234:38;;36183:109;-1:-1:-1;;;;;36314:15:0;;;;;;:9;:15;;;;;;;;:24;;;;36310:113;;-1:-1:-1;;;;;36363:25:0;;;;;;:19;:25;;;;;36391:12;36363:40;;36310:113;36470:16;;-1:-1:-1;;;36470:16:0;;;;36466:103;;;36507:10;;:46;;-1:-1:-1;;;36507:46:0;;-1:-1:-1;;;;;13349:15:1;;;36507:46:0;;;13331:34:1;13401:15;;;13381:18;;;13374:43;13433:18;;;13426:34;;;36507:10:0;;;;:29;;13266:18:1;;36507:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16646:792;;;:::o;36654:562::-;36828:8;;36763:7;;36808:5;;-1:-1:-1;;;36828:8:0;;;;:34;;;;-1:-1:-1;36840:22:0;;-1:-1:-1;;;36840:22:0;;;;36828:34;36824:312;;;36891:5;;-1:-1:-1;;;;;36883:13:0;;;36891:5;;;;;36883:13;;;;:32;;;36914:1;36900:11;:9;:11::i;:::-;:15;36883:32;:64;;;;-1:-1:-1;;;;;;36919:19:0;;;;;;:13;:19;;;;;;;;:28;36883:64;:94;;;;-1:-1:-1;;;;;;36951:17:0;;;;;;:13;:17;;;;;;;;:26;36883:94;36879:246;;;36998:17;37042:5;37027:11;:9;:11::i;:::-;37019:19;;:5;:19;:::i;:::-;37018:29;;;;:::i;:::-;36998:49;-1:-1:-1;37083:26:0;36998:49;37083:14;:26;:::i;:::-;37066:43;;36979:146;36879:246;37153:55;37183:4;37189:2;37193:14;37153:29;:55::i;:::-;37146:62;36654:562;-1:-1:-1;;;;;36654:562:0:o;14742:205::-;14842:7;14878:2;-1:-1:-1;;;;;14870:10:0;:4;-1:-1:-1;;;;;14870:10:0;;14862:54;;;;-1:-1:-1;;;14862:54:0;;13673:2:1;14862:54:0;;;13655:21:1;13712:2;13692:18;;;13685:30;13751:33;13731:18;;;13724:61;13802:18;;14862:54:0;13471:355:1;14862:54:0;-1:-1:-1;14934:5:0;14742:205;-1:-1:-1;;14742:205:0:o;206:423:1:-;248:3;286:5;280:12;313:6;308:3;301:19;338:1;348:162;362:6;359:1;356:13;348:162;;;424:4;480:13;;;476:22;;470:29;452:11;;;448:20;;441:59;377:12;348:162;;;352:3;555:1;548:4;539:6;534:3;530:16;526:27;519:38;618:4;611:2;607:7;602:2;594:6;590:15;586:29;581:3;577:39;573:50;566:57;;;206:423;;;;:::o;634:220::-;783:2;772:9;765:21;746:4;803:45;844:2;833:9;829:18;821:6;803:45;:::i;:::-;795:53;634:220;-1:-1:-1;;;634:220:1:o;859:127::-;920:10;915:3;911:20;908:1;901:31;951:4;948:1;941:15;975:4;972:1;965:15;991:719;1034:5;1087:3;1080:4;1072:6;1068:17;1064:27;1054:55;;1105:1;1102;1095:12;1054:55;1141:6;1128:20;1167:18;1204:2;1200;1197:10;1194:36;;;1210:18;;:::i;:::-;1285:2;1279:9;1253:2;1339:13;;-1:-1:-1;;1335:22:1;;;1359:2;1331:31;1327:40;1315:53;;;1383:18;;;1403:22;;;1380:46;1377:72;;;1429:18;;:::i;:::-;1469:10;1465:2;1458:22;1504:2;1496:6;1489:18;1550:3;1543:4;1538:2;1530:6;1526:15;1522:26;1519:35;1516:55;;;1567:1;1564;1557:12;1516:55;1631:2;1624:4;1616:6;1612:17;1605:4;1597:6;1593:17;1580:54;1678:1;1671:4;1666:2;1658:6;1654:15;1650:26;1643:37;1698:6;1689:15;;;;;;991:719;;;;:::o;1715:390::-;1793:6;1801;1854:2;1842:9;1833:7;1829:23;1825:32;1822:52;;;1870:1;1867;1860:12;1822:52;1910:9;1897:23;1943:18;1935:6;1932:30;1929:50;;;1975:1;1972;1965:12;1929:50;1998;2040:7;2031:6;2020:9;2016:22;1998:50;:::i;:::-;1988:60;2095:2;2080:18;;;;2067:32;;-1:-1:-1;;;;1715:390:1:o;2110:173::-;2178:20;;-1:-1:-1;;;;;2227:31:1;;2217:42;;2207:70;;2273:1;2270;2263:12;2207:70;2110:173;;;:::o;2288:254::-;2356:6;2364;2417:2;2405:9;2396:7;2392:23;2388:32;2385:52;;;2433:1;2430;2423:12;2385:52;2456:29;2475:9;2456:29;:::i;:::-;2446:39;2532:2;2517:18;;;;2504:32;;-1:-1:-1;;;2288:254:1:o;2547:186::-;2606:6;2659:2;2647:9;2638:7;2634:23;2630:32;2627:52;;;2675:1;2672;2665:12;2627:52;2698:29;2717:9;2698:29;:::i;2738:180::-;2797:6;2850:2;2838:9;2829:7;2825:23;2821:32;2818:52;;;2866:1;2863;2856:12;2818:52;-1:-1:-1;2889:23:1;;2738:180;-1:-1:-1;2738:180:1:o;3313:118::-;3399:5;3392:13;3385:21;3378:5;3375:32;3365:60;;3421:1;3418;3411:12;3436:315;3501:6;3509;3562:2;3550:9;3541:7;3537:23;3533:32;3530:52;;;3578:1;3575;3568:12;3530:52;3601:29;3620:9;3601:29;:::i;:::-;3591:39;;3680:2;3669:9;3665:18;3652:32;3693:28;3715:5;3693:28;:::i;:::-;3740:5;3730:15;;;3436:315;;;;;:::o;3756:328::-;3833:6;3841;3849;3902:2;3890:9;3881:7;3877:23;3873:32;3870:52;;;3918:1;3915;3908:12;3870:52;3941:29;3960:9;3941:29;:::i;:::-;3931:39;;3989:38;4023:2;4012:9;4008:18;3989:38;:::i;:::-;3979:48;;4074:2;4063:9;4059:18;4046:32;4036:42;;3756:328;;;;;:::o;4505:241::-;4561:6;4614:2;4602:9;4593:7;4589:23;4585:32;4582:52;;;4630:1;4627;4620:12;4582:52;4669:9;4656:23;4688:28;4710:5;4688:28;:::i;4751:396::-;4829:6;4837;4890:2;4878:9;4869:7;4865:23;4861:32;4858:52;;;4906:1;4903;4896:12;4858:52;4946:9;4933:23;4979:18;4971:6;4968:30;4965:50;;;5011:1;5008;5001:12;4965:50;5034;5076:7;5067:6;5056:9;5052:22;5034:50;:::i;:::-;5024:60;;;5103:38;5137:2;5126:9;5122:18;5103:38;:::i;:::-;5093:48;;4751:396;;;;;:::o;5152:260::-;5220:6;5228;5281:2;5269:9;5260:7;5256:23;5252:32;5249:52;;;5297:1;5294;5287:12;5249:52;5320:29;5339:9;5320:29;:::i;:::-;5310:39;;5368:38;5402:2;5391:9;5387:18;5368:38;:::i;5417:248::-;5485:6;5493;5546:2;5534:9;5525:7;5521:23;5517:32;5514:52;;;5562:1;5559;5552:12;5514:52;-1:-1:-1;;5585:23:1;;;5655:2;5640:18;;;5627:32;;-1:-1:-1;5417:248:1:o;5670:380::-;5749:1;5745:12;;;;5792;;;5813:61;;5867:4;5859:6;5855:17;5845:27;;5813:61;5920:2;5912:6;5909:14;5889:18;5886:38;5883:161;;5966:10;5961:3;5957:20;5954:1;5947:31;6001:4;5998:1;5991:15;6029:4;6026:1;6019:15;5883:161;;5670:380;;;:::o;6055:404::-;6257:2;6239:21;;;6296:2;6276:18;;;6269:30;6335:34;6330:2;6315:18;;6308:62;-1:-1:-1;;;6401:2:1;6386:18;;6379:38;6449:3;6434:19;;6055:404::o;6464:291::-;6641:2;6630:9;6623:21;6604:4;6661:45;6702:2;6691:9;6687:18;6679:6;6661:45;:::i;:::-;6653:53;;6742:6;6737:2;6726:9;6722:18;6715:34;6464:291;;;;;:::o;6760:343::-;6962:2;6944:21;;;7001:2;6981:18;;;6974:30;-1:-1:-1;;;7035:2:1;7020:18;;7013:49;7094:2;7079:18;;6760:343::o;7108:352::-;7310:2;7292:21;;;7349:2;7329:18;;;7322:30;7388;7383:2;7368:18;;7361:58;7451:2;7436:18;;7108:352::o;7465:127::-;7526:10;7521:3;7517:20;7514:1;7507:31;7557:4;7554:1;7547:15;7581:4;7578:1;7571:15;7597:128;7664:9;;;7685:11;;;7682:37;;;7699:18;;:::i;7730:125::-;7795:9;;;7816:10;;;7813:36;;;7829:18;;:::i;8618:184::-;8688:6;8741:2;8729:9;8720:7;8716:23;8712:32;8709:52;;;8757:1;8754;8747:12;8709:52;-1:-1:-1;8780:16:1;;8618:184;-1:-1:-1;8618:184:1:o;8807:317::-;8984:2;8973:9;8966:21;8947:4;9004:45;9045:2;9034:9;9030:18;9022:6;9004:45;:::i;:::-;8996:53;;9114:1;9110;9105:3;9101:11;9097:19;9089:6;9085:32;9080:2;9069:9;9065:18;9058:60;8807:317;;;;;:::o;9129:168::-;9202:9;;;9233;;9250:15;;;9244:22;;9230:37;9220:71;;9271:18;;:::i;9302:217::-;9342:1;9368;9358:132;;9412:10;9407:3;9403:20;9400:1;9393:31;9447:4;9444:1;9437:15;9475:4;9472:1;9465:15;9358:132;-1:-1:-1;9504:9:1;;9302:217::o;9803:245::-;9870:6;9923:2;9911:9;9902:7;9898:23;9894:32;9891:52;;;9939:1;9936;9929:12;9891:52;9971:9;9965:16;9990:28;10012:5;9990:28;:::i;12951:135::-;12990:3;13011:17;;;13008:43;;13031:18;;:::i;:::-;-1:-1:-1;13078:1:1;13067:13;;12951:135::o

Swarm Source

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