ETH Price: $2,489.73 (+3.04%)

Token

Cantic Finance (CNC)
 

Overview

Max Total Supply

1,000,000,000 CNC

Holders

57

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
16,739,900.893274580665521868 CNC

Value
$0.00
0x128f0b163b89d8777efebde9ad74b9760dc74a02
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:
CanticFinance

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-12-05
*/

/**
Why does CNC exist?
Ultimately, CNC allows users to shift liquidity of an asset across multiple Curve pools. This is achieved by Cantic DAO liquidity allocation votes (LAVs), which update the liquidity allocation weights of each Curve pool that is used by Cantic Omnipools.

What is an Omnipool?
Omnipools are liquidity pools that Cantic utilizes to allocate a single underlying asset across multiple Curve pools. For example the USDC Omnipool accepts deposits of USDC, and will allocate that to several Curve pools that have USDC as an underlying token. 

Web: https://cantic.finance
Twitter: https://twitter.com/CanticFinance
Telegram: https://t.me/CanticFinance_Official
Medium: https://medium.com/@cantic.finance
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.19;

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

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

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

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

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

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

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

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

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

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

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

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

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

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    function _createInitialSupply(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");
        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

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

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

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

contract Ownable is Context {
    address private _owner;

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

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

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

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

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

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

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );
}

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

contract CanticFinance is ERC20, Ownable {

    uint256 public maxBuyAmount;
    uint256 public maxSellAmount;
    uint256 public maxWalletAmount;

    IUniswapRouter public dexRouter;
    address public lpPair;

    bool private swapping;
    uint256 public swapTokensAtAmount;

    address operationsAddress;
    address devAddress;

    uint256 public tradingActiveBlock = 0; // 0 means trading is not active
    uint256 public blockForPenaltyEnd;
    mapping (address => bool) public boughtEarly;
    uint256 public botsCaught;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;

     // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = true;

    uint256 public buyTotalFees;
    uint256 public buyOperationsFee;
    uint256 public buyLiquidityFee;
    uint256 public buyDevFee;
    uint256 public buyBurnFee;

    uint256 public sellTotalFees;
    uint256 public sellOperationsFee;
    uint256 public sellLiquidityFee;
    uint256 public sellDevFee;
    uint256 public sellBurnFee;

    uint256 public tokensForOperations;
    uint256 public tokensForLiquidity;
    uint256 public tokensForDev;
    uint256 public tokensForBurn;

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

    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) public _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event UpdatedMaxBuyAmount(uint256 newAmount);

    event UpdatedMaxSellAmount(uint256 newAmount);

    event UpdatedMaxWalletAmount(uint256 newAmount);

    event UpdatedOperationsAddress(address indexed newWallet);

    event MaxTransactionExclusion(address _address, bool excluded);

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    constructor() ERC20(unicode"Cantic Finance", unicode"CNC") {

        address newOwner = msg.sender; // can leave alone if owner is deployer.

        IUniswapRouter _dexRouter = IUniswapRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        dexRouter = _dexRouter;

        // create pair
        lpPair = IDexFactory(_dexRouter.factory()).createPair(address(this), _dexRouter.WETH());
        _excludeFromMaxTransaction(address(lpPair), true);
        _setAutomatedMarketMakerPair(address(lpPair), true);

        uint256 totalSupply = 1 * 1e9 * 1e18;

        maxBuyAmount = totalSupply * 25 / 1000;
        maxSellAmount = totalSupply * 25 / 1000;
        maxWalletAmount = totalSupply * 25 / 1000;
        swapTokensAtAmount = totalSupply / 100000;

        buyOperationsFee = 25;
        buyLiquidityFee = 0;
        buyDevFee = 0;
        buyBurnFee = 0;
        buyTotalFees = buyOperationsFee + buyLiquidityFee + buyDevFee + buyBurnFee;

        sellOperationsFee = 25;
        sellLiquidityFee = 0;
        sellDevFee = 0;
        sellBurnFee = 0;
        sellTotalFees = sellOperationsFee + sellLiquidityFee + sellDevFee + sellBurnFee;

        operationsAddress = 0x0C590ad9Ed8f44111fE21DBaAf7757cd028D7b18;
        devAddress = msg.sender;

        _excludeFromMaxTransaction(newOwner, true);
        _excludeFromMaxTransaction(address(this), true);
        _excludeFromMaxTransaction(address(0xdead), true);

        excludeFromFees(newOwner, true);
        excludeFromFees(address(this), true);
        excludeFromFees(operationsAddress, true);
        _approve(lpPair, operationsAddress, totalSupply);
        excludeFromFees(address(0xdead), true);

        _createInitialSupply(newOwner, totalSupply);
        transferOwnership(newOwner);
    }

    receive() external payable {}

    // only enable if no plan to airdrop

    function enableTrading(uint256 deadBlocks) external onlyOwner {
        require(!tradingActive, "Cannot reenable trading");
        tradingActive = true;
        swapEnabled = true;
        tradingActiveBlock = block.number;
        blockForPenaltyEnd = tradingActiveBlock + deadBlocks;
    }

    // remove limits after token is stable
    function removeLimits() external onlyOwner {
        limitsInEffect = false;
        transferDelayEnabled = false;
        
        buyOperationsFee = 3;
        buyLiquidityFee = 0;
        buyDevFee = 0;
        buyBurnFee = 0;
        buyTotalFees = buyOperationsFee + buyLiquidityFee + buyDevFee + buyBurnFee;

        sellOperationsFee = 3;
        sellLiquidityFee = 0;
        sellDevFee = 0;
        sellBurnFee = 0;
        sellTotalFees = sellOperationsFee + sellLiquidityFee + sellDevFee + sellBurnFee;
    }

    function updateMaxBuyAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 2 / 1000)/1e18, "Cannot set max buy amount lower than 0.2%");
        maxBuyAmount = newNum * (10**18);
        emit UpdatedMaxBuyAmount(maxBuyAmount);
    }

    function updateMaxSellAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 2 / 1000)/1e18, "Cannot set max sell amount lower than 0.2%");
        maxSellAmount = newNum * (10**18);
        emit UpdatedMaxSellAmount(maxSellAmount);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 3 / 1000)/1e18, "Cannot set max wallet amount lower than 0.3%");
        maxWalletAmount = newNum * (10**18);
        emit UpdatedMaxWalletAmount(maxWalletAmount);
    }

    // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner {
  	    require(newAmount >= totalSupply() * 1 / 100000, "Swap amount cannot be lower than 0.001% total supply.");
  	    require(newAmount <= totalSupply() * 1 / 1000, "Swap amount cannot be higher than 0.1% total supply.");
  	    swapTokensAtAmount = newAmount;
  	}

    function _excludeFromMaxTransaction(address updAds, bool isExcluded) private {
        _isExcludedMaxTransactionAmount[updAds] = isExcluded;
        emit MaxTransactionExclusion(updAds, isExcluded);
    }

    function excludeFromMaxTransaction(address updAds, bool isEx) external onlyOwner {
        if(!isEx){
            require(updAds != lpPair, "Cannot remove uniswap pair from max txn");
        }
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner {
        require(pair != lpPair, "The pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        _excludeFromMaxTransaction(pair, value);

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateBuyFees(uint256 _operationsFee, uint256 _liquidityFee, uint256 _devFee, uint256 _burnFee) external onlyOwner {
        buyOperationsFee = _operationsFee;
        buyLiquidityFee = _liquidityFee;
        buyDevFee = _devFee;
        buyBurnFee = _burnFee;
        buyTotalFees = buyOperationsFee + buyLiquidityFee + buyDevFee + buyBurnFee;
        require(buyTotalFees <= 10, "Must keep fees at 10% or less");
    }

    function updateSellFees(uint256 _operationsFee, uint256 _liquidityFee, uint256 _devFee, uint256 _burnFee) external onlyOwner {
        sellOperationsFee = _operationsFee;
        sellLiquidityFee = _liquidityFee;
        sellDevFee = _devFee;
        sellBurnFee = _burnFee;
        sellTotalFees = sellOperationsFee + sellLiquidityFee + sellDevFee + sellBurnFee;
        require(sellTotalFees <= 10, "Must keep fees at 10% or less");
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function _transfer(address from, address to, uint256 amount) internal override {

        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "amount must be greater than 0");

        if(!tradingActive){
            require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active.");
        }

        if(blockForPenaltyEnd > 0){
            require(!boughtEarly[from] || to == owner() || to == address(0xdead), "Bots cannot transfer tokens in or out except to owner or dead address.");
        }

        if(limitsInEffect){
            if (from != owner() && to != owner() && to != address(0) && to != address(0xdead) && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]){

                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.
                if (transferDelayEnabled){
                    if (to != address(dexRouter) && to != address(lpPair)){
                        require(_holderLastTransferTimestamp[tx.origin] < block.number - 2 && _holderLastTransferTimestamp[to] < block.number - 2, "_transfer:: Transfer Delay enabled.  Try again later.");
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                        _holderLastTransferTimestamp[to] = block.number;
                    }
                }
    
                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                        require(amount <= maxBuyAmount, "Buy transfer amount exceeds the max buy.");
                        require(amount + balanceOf(to) <= maxWalletAmount, "Cannot Exceed max wallet");
                }
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                        require(amount <= maxSellAmount, "Sell transfer amount exceeds the max sell.");
                }
                else if (!_isExcludedMaxTransactionAmount[to]){
                    require(amount + balanceOf(to) <= maxWalletAmount, "Cannot Exceed max wallet");
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount && amount > swapTokensAtAmount;

        if(canSwap && swapEnabled && !swapping && automatedMarketMakerPairs[to] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
            swapping = true;

            swapBack();

            swapping = false;
        }

        bool takeFee = true;
        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if(takeFee){
            // bot/sniper penalty.
            if(earlyBuyPenaltyInEffect() && automatedMarketMakerPairs[from] && !automatedMarketMakerPairs[to] && buyTotalFees > 0){

                if(!boughtEarly[to]){
                    boughtEarly[to] = true;
                    botsCaught += 1;
                }

                fees = amount * 30 / 100;
        	    tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees;
                tokensForOperations += fees * buyOperationsFee / buyTotalFees;
                tokensForDev += fees * buyDevFee / buyTotalFees;
                tokensForBurn += fees * buyBurnFee / buyTotalFees;
            }

            // on sell
            else if (automatedMarketMakerPairs[to] && sellTotalFees > 0){
                fees = amount * sellTotalFees / 100;
                tokensForLiquidity += fees * sellLiquidityFee / sellTotalFees;
                tokensForOperations += fees * sellOperationsFee / sellTotalFees;
                tokensForDev += fees * sellDevFee / sellTotalFees;
                tokensForBurn += fees * sellBurnFee / sellTotalFees;
            }

            // on buy
            else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) {
        	    fees = amount * buyTotalFees / 100;
        	    tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees;
                tokensForOperations += fees * buyOperationsFee / buyTotalFees;
                tokensForDev += fees * buyDevFee / buyTotalFees;
                tokensForBurn += fees * buyBurnFee / buyTotalFees;
            }

            if(fees > 0){
                super._transfer(from, address(this), fees);
            }

        	amount -= fees;
        }

        super._transfer(from, to, amount);
    }

    function earlyBuyPenaltyInEffect() public view returns (bool){
        return block.number < blockForPenaltyEnd;
    }

    function swapTokensForEth(uint256 tokenAmount) private {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = dexRouter.WETH();

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

        // make the swap
        dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(dexRouter), tokenAmount);

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

    function swapBack() private {

        if(tokensForBurn > 0 && balanceOf(address(this)) >= tokensForBurn) {
            _burn(address(this), tokensForBurn);
        }
        tokensForBurn = 0;

        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForOperations + tokensForDev;

        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}

        // if(contractBalance > swapTokensAtAmount * 60){
        //     contractBalance = swapTokensAtAmount * 60;
        // }

        bool success;

        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2;

        swapTokensForEth(contractBalance - liquidityTokens);

        uint256 ethBalance = address(this).balance;
        uint256 ethForLiquidity = ethBalance;

        uint256 ethForOperations = ethBalance * tokensForOperations / (totalTokensToSwap - (tokensForLiquidity/2));
        uint256 ethForDev = ethBalance * tokensForDev / (totalTokensToSwap - (tokensForLiquidity/2));

        ethForLiquidity -= ethForOperations + ethForDev;

        tokensForLiquidity = 0;
        tokensForOperations = 0;
        tokensForDev = 0;
        tokensForBurn = 0;

        if(liquidityTokens > 0 && ethForLiquidity > 0){
            addLiquidity(liquidityTokens, ethForLiquidity);
        }

        (success,) = address(devAddress).call{value: ethForDev}("");
        payable(operationsAddress).transfer(address(this).balance);        
    }

    function transferForeignToken(address _token, address _to) external onlyOwner returns (bool _sent) {
        require(_token != address(0), "_token address cannot be 0");
        require(_token != address(this), "Can't withdraw native tokens");
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        _sent = IERC20(_token).transfer(_to, _contractBalance);
    }

    // withdraw ETH if stuck or someone sends to the address
    function withdrawStuckETH() external onlyOwner {
        bool success;
        (success,) = address(msg.sender).call{value: address(this).balance}("");
    }

    function setOperationsAddress(address _operationsAddress) external onlyOwner {
        require(_operationsAddress != address(0), "_operationsAddress address cannot be 0");
        operationsAddress = payable(_operationsAddress);
    }

    function setDevAddress(address _devAddress) external onlyOwner {
        require(_devAddress != address(0), "_devAddress address cannot be 0");
        devAddress = payable(_devAddress);
    }

    // force Swap back if slippage issues.
    function forceSwapBack() external onlyOwner {
        require(balanceOf(address(this)) >= swapTokensAtAmount, "Can only swap when token amount is at or higher than restriction");
        swapping = true;
        swapBack();
        swapping = false;
    }

    // useful for buybacks or to reclaim any ETH on the contract in a way that helps holders.
    function buyBackTokens(uint256 amountInWei) external onlyOwner {
        require(amountInWei <= 10 ether, "May not buy more than 10 ETH in a single buy to reduce sandwich attacks");

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

        // make the swap
        dexRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amountInWei}(
            0, // accept any amount of Ethereum
            path,
            address(0xdead),
            block.timestamp
        );
    }
}

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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"MaxTransactionExclusion","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":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxBuyAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxSellAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxWalletAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedOperationsAddress","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","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":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockForPenaltyEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"botsCaught","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"boughtEarly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountInWei","type":"uint256"}],"name":"buyBackTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyBurnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyOperationsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IUniswapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyBuyPenaltyInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"deadBlocks","type":"uint256"}],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSwapBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellBurnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellOperationsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devAddress","type":"address"}],"name":"setDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operationsAddress","type":"address"}],"name":"setOperationsAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForDev","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForOperations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferForeignToken","outputs":[{"internalType":"bool","name":"_sent","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_operationsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxBuyAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxSellAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_operationsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000600e556012805462ffffff191660019081179091556014805460ff191690911790553480156200003557600080fd5b506040518060400160405280600e81526020016d43616e7469632046696e616e636560901b81525060405180604001604052806003815260200162434e4360e81b81525081600390816200008a9190620009b6565b506004620000998282620009b6565b5050506000620000ae6200048660201b60201c565b600580546001600160a01b0319166001600160a01b03831690811790915560405191925090600090600080516020620041be833981519152908290a350600980546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b81529051339291829163c45a0155916004808201926020929091908290030181865afa15801562000155573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200017b919062000a82565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001c9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ef919062000a82565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200023d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000263919062000a82565b600a80546001600160a01b0319166001600160a01b039290921691821790556200028f9060016200048a565b600a54620002a8906001600160a01b03166001620004ed565b6b033b2e3c9fd0803ce80000006103e8620002c582601962000aca565b620002d1919062000aea565b6006556103e8620002e482601962000aca565b620002f0919062000aea565b6007556103e86200030382601962000aca565b6200030f919062000aea565b60085562000321620186a08262000aea565b600b55601960168190556000601781905560188190558082559081906200034a90829062000b0d565b62000356919062000b0d565b62000362919062000b0d565b6015556019601b8190556000601c819055601d819055601e8190559081906200038d90829062000b0d565b62000399919062000b0d565b620003a5919062000b0d565b601a55600c80546001600160a01b0319908116730c590ad9ed8f44111fe21dbaaf7757cd028d7b1817909155600d805490911633179055620003e98360016200048a565b620003f63060016200048a565b6200040561dead60016200048a565b6200041283600162000559565b6200041f30600162000559565b600c5462000438906001600160a01b0316600162000559565b600a54600c5462000457916001600160a01b0390811691168362000607565b6200046661dead600162000559565b6200047283826200072f565b6200047d8362000814565b50505062000b23565b3390565b6001600160a01b038216600081815260246020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b6001600160a01b0382166000908152602560205260409020805460ff19168215151790556200051d82826200048a565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03163314620005a85760405162461bcd60e51b815260206004820181905260248201526000805160206200419e83398151915260448201526064015b60405180910390fd5b6001600160a01b038216600081815260236020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b0383166200066b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016200059f565b6001600160a01b038216620006ce5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016200059f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038216620007875760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200059f565b80600260008282546200079b919062000b0d565b90915550506001600160a01b03821660009081526020819052604081208054839290620007ca90849062000b0d565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6005546001600160a01b031633146200085f5760405162461bcd60e51b815260206004820181905260248201526000805160206200419e83398151915260448201526064016200059f565b6001600160a01b038116620008c65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016200059f565b6005546040516001600160a01b03808416921690600080516020620041be83398151915290600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200093c57607f821691505b6020821081036200095d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620009b157600081815260208120601f850160051c810160208610156200098c5750805b601f850160051c820191505b81811015620009ad5782815560010162000998565b5050505b505050565b81516001600160401b03811115620009d257620009d262000911565b620009ea81620009e3845462000927565b8462000963565b602080601f83116001811462000a22576000841562000a095750858301515b600019600386901b1c1916600185901b178555620009ad565b600085815260208120601f198616915b8281101562000a535788860151825594840194600190910190840162000a32565b508582101562000a725787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000a9557600080fd5b81516001600160a01b038116811462000aad57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141762000ae45762000ae462000ab4565b92915050565b60008262000b0857634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111562000ae45762000ae462000ab4565b61366b8062000b336000396000f3fe6080604052600436106103b15760003560e01c80638da5cb5b116101e7578063c876d0b91161010d578063e7ad9fcd116100a0578063f5648a4f1161006f578063f5648a4f14610a81578063f637434214610a96578063fb002c9714610aac578063fc155d1d14610ac257600080fd5b8063e7ad9fcd14610a15578063ee40166e14610a35578063f11a24d314610a4b578063f2fde38b14610a6157600080fd5b8063dc3f0d0f116100dc578063dc3f0d0f14610983578063dd62ed3e146109a3578063e2f45605146109e9578063e71dc3f5146109ff57600080fd5b8063c876d0b914610913578063d0d41fe11461092d578063d257b34f1461094d578063d85ba0631461096d57600080fd5b8063a62068ce11610185578063b62496f511610154578063b62496f514610884578063bbc0c742146108b4578063c0246668146108d3578063c18bc195146108f357600080fd5b8063a62068ce14610822578063a9059cbb14610838578063aa4bde2814610858578063adb873bd1461086e57600080fd5b80639c3b4fdc116101c15780639c3b4fdc146107c05780639fccce32146107d6578063a0d82dc5146107ec578063a457c2d71461080257600080fd5b80638da5cb5b1461076d57806395d89b411461078b5780639a7a23d6146107a057600080fd5b80634f77f6c0116102d757806370a082311161026a57806382aa7c681161023957806382aa7c68146106e75780638366e79a1461070757806385ecfd281461072757806388e765ff1461075757600080fd5b806370a082311461067d578063715018a61461069d578063751039fc146106b25780637571336a146106c757600080fd5b806366d602ae116102a657806366d602ae1461061b5780636a486a8e146106315780636b0a894c146106475780636ddd17131461065d57600080fd5b80634f77f6c0146105c357806351f205e4146105d957806358a6d531146105ee5780635a139dd41461060557600080fd5b806323b872dd1161034f578063395093511161031e5780633950935114610549578063452ed4f114610569578063499b8394146105895780634a62bb65146105a957600080fd5b806323b872dd146104cb5780632be32b61146104eb5780632e6ed7ef1461050d578063313ce5671461052d57600080fd5b806310d5de531161038b57806310d5de531461045057806318160ddd146104805780631a8145bb1461049f5780631d777856146104b557600080fd5b806306fdde03146103bd5780630758d924146103e8578063095ea7b31461042057600080fd5b366103b857005b600080fd5b3480156103c957600080fd5b506103d2610ae2565b6040516103df91906131c6565b60405180910390f35b3480156103f457600080fd5b50600954610408906001600160a01b031681565b6040516001600160a01b0390911681526020016103df565b34801561042c57600080fd5b5061044061043b36600461322c565b610b74565b60405190151581526020016103df565b34801561045c57600080fd5b5061044061046b366004613258565b60246020526000908152604090205460ff1681565b34801561048c57600080fd5b506002545b6040519081526020016103df565b3480156104ab57600080fd5b5061049160205481565b3480156104c157600080fd5b5061049160225481565b3480156104d757600080fd5b506104406104e636600461327c565b610b8b565b3480156104f757600080fd5b5061050b6105063660046132bd565b610c3a565b005b34801561051957600080fd5b5061050b6105283660046132d6565b610d47565b34801561053957600080fd5b50604051601281526020016103df565b34801561055557600080fd5b5061044061056436600461322c565b610e00565b34801561057557600080fd5b50600a54610408906001600160a01b031681565b34801561059557600080fd5b5061050b6105a4366004613258565b610e3c565b3480156105b557600080fd5b506012546104409060ff1681565b3480156105cf57600080fd5b50610491601b5481565b3480156105e557600080fd5b5061050b610eed565b3480156105fa57600080fd5b50600f544310610440565b34801561061157600080fd5b5061049160165481565b34801561062757600080fd5b5061049160075481565b34801561063d57600080fd5b50610491601a5481565b34801561065357600080fd5b5061049160115481565b34801561066957600080fd5b506012546104409062010000900460ff1681565b34801561068957600080fd5b50610491610698366004613258565b610fc3565b3480156106a957600080fd5b5061050b610fde565b3480156106be57600080fd5b5061050b611052565b3480156106d357600080fd5b5061050b6106e2366004613316565b61110e565b3480156106f357600080fd5b5061050b6107023660046132bd565b6111d6565b34801561071357600080fd5b5061044061072236600461334f565b611280565b34801561073357600080fd5b50610440610742366004613258565b60106020526000908152604090205460ff1681565b34801561076357600080fd5b5061049160065481565b34801561077957600080fd5b506005546001600160a01b0316610408565b34801561079757600080fd5b506103d2611445565b3480156107ac57600080fd5b5061050b6107bb366004613316565b611454565b3480156107cc57600080fd5b5061049160185481565b3480156107e257600080fd5b5061049160215481565b3480156107f857600080fd5b50610491601d5481565b34801561080e57600080fd5b5061044061081d36600461322c565b611548565b34801561082e57600080fd5b50610491600f5481565b34801561084457600080fd5b5061044061085336600461322c565b6115e1565b34801561086457600080fd5b5061049160085481565b34801561087a57600080fd5b50610491601e5481565b34801561089057600080fd5b5061044061089f366004613258565b60256020526000908152604090205460ff1681565b3480156108c057600080fd5b5060125461044090610100900460ff1681565b3480156108df57600080fd5b5061050b6108ee366004613316565b6115ee565b3480156108ff57600080fd5b5061050b61090e3660046132bd565b611677565b34801561091f57600080fd5b506014546104409060ff1681565b34801561093957600080fd5b5061050b610948366004613258565b611780565b34801561095957600080fd5b5061050b6109683660046132bd565b611822565b34801561097957600080fd5b5061049160155481565b34801561098f57600080fd5b5061050b61099e3660046132bd565b61196d565b3480156109af57600080fd5b506104916109be36600461334f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156109f557600080fd5b50610491600b5481565b348015610a0b57600080fd5b5061049160195481565b348015610a2157600080fd5b5061050b610a303660046132d6565b611a74565b348015610a4157600080fd5b50610491600e5481565b348015610a5757600080fd5b5061049160175481565b348015610a6d57600080fd5b5061050b610a7c366004613258565b611b27565b348015610a8d57600080fd5b5061050b611c12565b348015610aa257600080fd5b50610491601c5481565b348015610ab857600080fd5b50610491601f5481565b348015610ace57600080fd5b5061050b610add3660046132bd565b611c7e565b606060038054610af19061337d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1d9061337d565b8015610b6a5780601f10610b3f57610100808354040283529160200191610b6a565b820191906000526020600020905b815481529060010190602001808311610b4d57829003601f168201915b5050505050905090565b6000610b81338484611e89565b5060015b92915050565b6000610b98848484611fae565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610c225760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b610c2f8533858403611e89565b506001949350505050565b6005546001600160a01b03163314610c645760405162461bcd60e51b8152600401610c19906133b7565b670de0b6b3a76400006103e8610c7960025490565b610c84906002613402565b610c8e9190613419565b610c989190613419565b811015610cf95760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152687468616e20302e322560b81b6064820152608401610c19565b610d0b81670de0b6b3a7640000613402565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b6005546001600160a01b03163314610d715760405162461bcd60e51b8152600401610c19906133b7565b60168490556017839055601882905560198190558082610d91858761343b565b610d9b919061343b565b610da5919061343b565b6015819055600a1015610dfa5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610c19565b50505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610b81918590610e3790869061343b565b611e89565b6005546001600160a01b03163314610e665760405162461bcd60e51b8152600401610c19906133b7565b6001600160a01b038116610ecb5760405162461bcd60e51b815260206004820152602660248201527f5f6f7065726174696f6e734164647265737320616464726573732063616e6e6f60448201526507420626520360d41b6064820152608401610c19565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610f175760405162461bcd60e51b8152600401610c19906133b7565b600b54610f2330610fc3565b1015610f99576040805162461bcd60e51b81526020600482015260248101919091527f43616e206f6e6c792073776170207768656e20746f6b656e20616d6f756e742060448201527f6973206174206f7220686967686572207468616e207265737472696374696f6e6064820152608401610c19565b600a805460ff60a01b1916600160a01b179055610fb4612aac565b600a805460ff60a01b19169055565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146110085760405162461bcd60e51b8152600401610c19906133b7565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b0316331461107c5760405162461bcd60e51b8152600401610c19906133b7565b6012805460ff199081169091556014805490911690556003601681905560006017819055601881905560198190559081906110b890829061343b565b6110c2919061343b565b6110cc919061343b565b6015556003601b8190556000601c819055601d819055601e8190559081906110f590829061343b565b6110ff919061343b565b611109919061343b565b601a55565b6005546001600160a01b031633146111385760405162461bcd60e51b8152600401610c19906133b7565b806111ab57600a546001600160a01b03908116908316036111ab5760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610c19565b6001600160a01b03919091166000908152602460205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146112005760405162461bcd60e51b8152600401610c19906133b7565b601254610100900460ff16156112585760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207265656e61626c652074726164696e670000000000000000006044820152606401610c19565b6012805462ffff0019166201010017905543600e81905561127a90829061343b565b600f5550565b6005546000906001600160a01b031633146112ad5760405162461bcd60e51b8152600401610c19906133b7565b6001600160a01b0383166113035760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610c19565b306001600160a01b0384160361135b5760405162461bcd60e51b815260206004820152601c60248201527f43616e2774207769746864726177206e617469766520746f6b656e73000000006044820152606401610c19565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa1580156113a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c6919061344e565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af1158015611419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143d9190613467565b949350505050565b606060048054610af19061337d565b6005546001600160a01b0316331461147e5760405162461bcd60e51b8152600401610c19906133b7565b600a546001600160a01b03908116908316036115025760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610c19565b61150c8282612caa565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156115ca5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610c19565b6115d73385858403611e89565b5060019392505050565b6000610b81338484611fae565b6005546001600160a01b031633146116185760405162461bcd60e51b8152600401610c19906133b7565b6001600160a01b038216600081815260236020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146116a15760405162461bcd60e51b8152600401610c19906133b7565b670de0b6b3a76400006103e86116b660025490565b6116c1906003613402565b6116cb9190613419565b6116d59190613419565b8110156117395760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e332560a01b6064820152608401610c19565b61174b81670de0b6b3a7640000613402565b60088190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc90602001610d3c565b6005546001600160a01b031633146117aa5760405162461bcd60e51b8152600401610c19906133b7565b6001600160a01b0381166118005760405162461bcd60e51b815260206004820152601f60248201527f5f6465764164647265737320616464726573732063616e6e6f742062652030006044820152606401610c19565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461184c5760405162461bcd60e51b8152600401610c19906133b7565b620186a061185960025490565b611864906001613402565b61186e9190613419565b8110156118db5760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610c19565b6103e86118e760025490565b6118f2906001613402565b6118fc9190613419565b8111156119685760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610c19565b600b55565b6005546001600160a01b031633146119975760405162461bcd60e51b8152600401610c19906133b7565b670de0b6b3a76400006103e86119ac60025490565b6119b7906002613402565b6119c19190613419565b6119cb9190613419565b811015611a2d5760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f776572604482015269207468616e20302e322560b01b6064820152608401610c19565b611a3f81670de0b6b3a7640000613402565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e90602001610d3c565b6005546001600160a01b03163314611a9e5760405162461bcd60e51b8152600401610c19906133b7565b601b849055601c839055601d829055601e8190558082611abe858761343b565b611ac8919061343b565b611ad2919061343b565b601a819055600a1015610dfa5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610c19565b6005546001600160a01b03163314611b515760405162461bcd60e51b8152600401610c19906133b7565b6001600160a01b038116611bb65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c19565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611c3c5760405162461bcd60e51b8152600401610c19906133b7565b604051600090339047908381818185875af1925050503d8060008114610dfa576040519150601f19603f3d011682016040523d82523d6000602084013e610dfa565b6005546001600160a01b03163314611ca85760405162461bcd60e51b8152600401610c19906133b7565b678ac7230489e80000811115611d365760405162461bcd60e51b815260206004820152604760248201527f4d6179206e6f7420627579206d6f7265207468616e2031302045544820696e2060448201527f612073696e676c652062757920746f207265647563652073616e64776963682060648201526661747461636b7360c81b608482015260a401610c19565b6040805160028082526060820183526000926020830190803683375050600954604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611da0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc49190613484565b81600081518110611dd757611dd76134a1565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611e0b57611e0b6134a1565b6001600160a01b03928316602091820292909201015260095460405163b6f9de9560e01b815291169063b6f9de95908490611e5390600090869061dead9042906004016134fb565b6000604051808303818588803b158015611e6c57600080fd5b505af1158015611e80573d6000803e3d6000fd5b50505050505050565b6001600160a01b038316611eeb5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c19565b6001600160a01b038216611f4c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c19565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316611fd45760405162461bcd60e51b8152600401610c1990613530565b6001600160a01b038216611ffa5760405162461bcd60e51b8152600401610c1990613575565b6000811161204a5760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610c19565b601254610100900460ff166120dd576001600160a01b03831660009081526023602052604090205460ff168061209857506001600160a01b03821660009081526023602052604090205460ff165b6120dd5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610c19565b600f54156121b0576001600160a01b03831660009081526010602052604090205460ff16158061211a57506005546001600160a01b038381169116145b8061212f57506001600160a01b03821661dead145b6121b05760405162461bcd60e51b815260206004820152604660248201527f426f74732063616e6e6f74207472616e7366657220746f6b656e7320696e206f60448201527f72206f75742065786365707420746f206f776e6572206f722064656164206164606482015265323932b9b99760d11b608482015260a401610c19565b60125460ff16156125ac576005546001600160a01b038481169116148015906121e757506005546001600160a01b03838116911614155b80156121fb57506001600160a01b03821615155b801561221257506001600160a01b03821661dead14155b801561223757506001600160a01b03831660009081526023602052604090205460ff16155b801561225c57506001600160a01b03821660009081526023602052604090205460ff16155b156125ac5760145460ff1615612375576009546001600160a01b038381169116148015906122985750600a546001600160a01b03838116911614155b15612375576122a86002436135b8565b326000908152601360205260409020541080156122e657506122cb6002436135b8565b6001600160a01b038316600090815260136020526040902054105b6123505760405162461bcd60e51b815260206004820152603560248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527432b21710102a393c9030b3b0b4b7103630ba32b91760591b6064820152608401610c19565b3260009081526013602052604080822043908190556001600160a01b03851683529120555b6001600160a01b03831660009081526025602052604090205460ff1680156123b657506001600160a01b03821660009081526024602052604090205460ff16155b156124825760065481111561241e5760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610c19565b60085461242a83610fc3565b612434908361343b565b111561247d5760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610c19565b6125ac565b6001600160a01b03821660009081526025602052604090205460ff1680156124c357506001600160a01b03831660009081526024602052604090205460ff16155b1561252d5760075481111561247d5760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610c19565b6001600160a01b03821660009081526024602052604090205460ff166125ac5760085461255983610fc3565b612563908361343b565b11156125ac5760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610c19565b60006125b730610fc3565b90506000600b5482101580156125ce5750600b5483115b90508080156125e5575060125462010000900460ff165b80156125fb5750600a54600160a01b900460ff16155b801561261f57506001600160a01b03841660009081526025602052604090205460ff165b801561264457506001600160a01b03851660009081526023602052604090205460ff16155b801561266957506001600160a01b03841660009081526023602052604090205460ff16155b1561269757600a805460ff60a01b1916600160a01b179055612689612aac565b600a805460ff60a01b191690555b6001600160a01b03851660009081526023602052604090205460019060ff16806126d957506001600160a01b03851660009081526023602052604090205460ff165b156126e2575060005b60008115612aa157600f544310801561271357506001600160a01b03871660009081526025602052604090205460ff165b801561273857506001600160a01b03861660009081526025602052604090205460ff16155b801561274657506000601554115b1561288a576001600160a01b03861660009081526010602052604090205460ff166127aa576001600160a01b0386166000908152601060205260408120805460ff1916600190811790915560118054919290916127a490849061343b565b90915550505b60646127b786601e613402565b6127c19190613419565b9050601554601754826127d49190613402565b6127de9190613419565b602060008282546127ef919061343b565b90915550506015546016546128049083613402565b61280e9190613419565b601f600082825461281f919061343b565b90915550506015546018546128349083613402565b61283e9190613419565b6021600082825461284f919061343b565b90915550506015546019546128649083613402565b61286e9190613419565b6022600082825461287f919061343b565b90915550612a839050565b6001600160a01b03861660009081526025602052604090205460ff1680156128b457506000601a54115b15612976576064601a54866128c99190613402565b6128d39190613419565b9050601a54601c54826128e69190613402565b6128f09190613419565b60206000828254612901919061343b565b9091555050601a54601b546129169083613402565b6129209190613419565b601f6000828254612931919061343b565b9091555050601a54601d546129469083613402565b6129509190613419565b60216000828254612961919061343b565b9091555050601a54601e546128649083613402565b6001600160a01b03871660009081526025602052604090205460ff1680156129a057506000601554115b15612a83576064601554866129b59190613402565b6129bf9190613419565b9050601554601754826129d29190613402565b6129dc9190613419565b602060008282546129ed919061343b565b9091555050601554601654612a029083613402565b612a0c9190613419565b601f6000828254612a1d919061343b565b9091555050601554601854612a329083613402565b612a3c9190613419565b60216000828254612a4d919061343b565b9091555050601554601954612a629083613402565b612a6c9190613419565b60226000828254612a7d919061343b565b90915550505b8015612a9457612a94873083612cd8565b612a9e81866135b8565b94505b611e80878787612cd8565b6000602254118015612ac85750602254612ac530610fc3565b10155b15612ad957612ad930602254612e2d565b60006022819055612ae930610fc3565b90506000602154601f54602054612b00919061343b565b612b0a919061343b565b9050811580612b17575080155b15612b20575050565b60008060028360205486612b349190613402565b612b3e9190613419565b612b489190613419565b9050612b5c612b5782866135b8565b612f57565b60205447908190600090612b7290600290613419565b612b7c90876135b8565b601f54612b899085613402565b612b939190613419565b905060006002602054612ba69190613419565b612bb090886135b8565b602154612bbd9086613402565b612bc79190613419565b9050612bd3818361343b565b612bdd90846135b8565b60006020819055601f819055602181905560225592508415801590612c025750600083115b15612c1157612c1185846130b1565b600d546040516001600160a01b03909116908290600081818185875af1925050503d8060008114612c5e576040519150601f19603f3d011682016040523d82523d6000602084013e612c63565b606091505b5050600c546040519197506001600160a01b0316904780156108fc02916000818181858888f19350505050158015612c9f573d6000803e3d6000fd5b505050505050505050565b6001600160a01b0382166000908152602560205260409020805460ff191682151517905561150c8282613163565b6001600160a01b038316612cfe5760405162461bcd60e51b8152600401610c1990613530565b6001600160a01b038216612d245760405162461bcd60e51b8152600401610c1990613575565b6001600160a01b03831660009081526020819052604090205481811015612d9c5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610c19565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290612dd390849061343b565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612e1f91815260200190565b60405180910390a350505050565b6001600160a01b038216612e8d5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610c19565b6001600160a01b03821660009081526020819052604090205481811015612f015760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610c19565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611fa1565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f8c57612f8c6134a1565b6001600160a01b03928316602091820292909201810191909152600954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612fe5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130099190613484565b8160018151811061301c5761301c6134a1565b6001600160a01b0392831660209182029290920101526009546130429130911684611e89565b60095460405163791ac94760e01b81526001600160a01b039091169063791ac9479061307b9085906000908690309042906004016135cb565b600060405180830381600087803b15801561309557600080fd5b505af11580156130a9573d6000803e3d6000fd5b505050505050565b6009546130c99030906001600160a01b031684611e89565b60095460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015613137573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061315c9190613607565b5050505050565b6001600160a01b038216600081815260246020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b600060208083528351808285015260005b818110156131f3578581018301518582016040015282016131d7565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461322957600080fd5b50565b6000806040838503121561323f57600080fd5b823561324a81613214565b946020939093013593505050565b60006020828403121561326a57600080fd5b813561327581613214565b9392505050565b60008060006060848603121561329157600080fd5b833561329c81613214565b925060208401356132ac81613214565b929592945050506040919091013590565b6000602082840312156132cf57600080fd5b5035919050565b600080600080608085870312156132ec57600080fd5b5050823594602084013594506040840135936060013592509050565b801515811461322957600080fd5b6000806040838503121561332957600080fd5b823561333481613214565b9150602083013561334481613308565b809150509250929050565b6000806040838503121561336257600080fd5b823561336d81613214565b9150602083013561334481613214565b600181811c9082168061339157607f821691505b6020821081036133b157634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610b8557610b856133ec565b60008261343657634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610b8557610b856133ec565b60006020828403121561346057600080fd5b5051919050565b60006020828403121561347957600080fd5b815161327581613308565b60006020828403121561349657600080fd5b815161327581613214565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156134f05781516001600160a01b0316875295820195908201906001016134cb565b509495945050505050565b84815260806020820152600061351460808301866134b7565b6001600160a01b03949094166040830152506060015292915050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610b8557610b856133ec565b85815284602082015260a0604082015260006135ea60a08301866134b7565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561361c57600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220820a8293c2688ef4db593a12135b7814eb909722ed7dd92ef843e036844f795864736f6c634300081300334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65728be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0

Deployed Bytecode

0x6080604052600436106103b15760003560e01c80638da5cb5b116101e7578063c876d0b91161010d578063e7ad9fcd116100a0578063f5648a4f1161006f578063f5648a4f14610a81578063f637434214610a96578063fb002c9714610aac578063fc155d1d14610ac257600080fd5b8063e7ad9fcd14610a15578063ee40166e14610a35578063f11a24d314610a4b578063f2fde38b14610a6157600080fd5b8063dc3f0d0f116100dc578063dc3f0d0f14610983578063dd62ed3e146109a3578063e2f45605146109e9578063e71dc3f5146109ff57600080fd5b8063c876d0b914610913578063d0d41fe11461092d578063d257b34f1461094d578063d85ba0631461096d57600080fd5b8063a62068ce11610185578063b62496f511610154578063b62496f514610884578063bbc0c742146108b4578063c0246668146108d3578063c18bc195146108f357600080fd5b8063a62068ce14610822578063a9059cbb14610838578063aa4bde2814610858578063adb873bd1461086e57600080fd5b80639c3b4fdc116101c15780639c3b4fdc146107c05780639fccce32146107d6578063a0d82dc5146107ec578063a457c2d71461080257600080fd5b80638da5cb5b1461076d57806395d89b411461078b5780639a7a23d6146107a057600080fd5b80634f77f6c0116102d757806370a082311161026a57806382aa7c681161023957806382aa7c68146106e75780638366e79a1461070757806385ecfd281461072757806388e765ff1461075757600080fd5b806370a082311461067d578063715018a61461069d578063751039fc146106b25780637571336a146106c757600080fd5b806366d602ae116102a657806366d602ae1461061b5780636a486a8e146106315780636b0a894c146106475780636ddd17131461065d57600080fd5b80634f77f6c0146105c357806351f205e4146105d957806358a6d531146105ee5780635a139dd41461060557600080fd5b806323b872dd1161034f578063395093511161031e5780633950935114610549578063452ed4f114610569578063499b8394146105895780634a62bb65146105a957600080fd5b806323b872dd146104cb5780632be32b61146104eb5780632e6ed7ef1461050d578063313ce5671461052d57600080fd5b806310d5de531161038b57806310d5de531461045057806318160ddd146104805780631a8145bb1461049f5780631d777856146104b557600080fd5b806306fdde03146103bd5780630758d924146103e8578063095ea7b31461042057600080fd5b366103b857005b600080fd5b3480156103c957600080fd5b506103d2610ae2565b6040516103df91906131c6565b60405180910390f35b3480156103f457600080fd5b50600954610408906001600160a01b031681565b6040516001600160a01b0390911681526020016103df565b34801561042c57600080fd5b5061044061043b36600461322c565b610b74565b60405190151581526020016103df565b34801561045c57600080fd5b5061044061046b366004613258565b60246020526000908152604090205460ff1681565b34801561048c57600080fd5b506002545b6040519081526020016103df565b3480156104ab57600080fd5b5061049160205481565b3480156104c157600080fd5b5061049160225481565b3480156104d757600080fd5b506104406104e636600461327c565b610b8b565b3480156104f757600080fd5b5061050b6105063660046132bd565b610c3a565b005b34801561051957600080fd5b5061050b6105283660046132d6565b610d47565b34801561053957600080fd5b50604051601281526020016103df565b34801561055557600080fd5b5061044061056436600461322c565b610e00565b34801561057557600080fd5b50600a54610408906001600160a01b031681565b34801561059557600080fd5b5061050b6105a4366004613258565b610e3c565b3480156105b557600080fd5b506012546104409060ff1681565b3480156105cf57600080fd5b50610491601b5481565b3480156105e557600080fd5b5061050b610eed565b3480156105fa57600080fd5b50600f544310610440565b34801561061157600080fd5b5061049160165481565b34801561062757600080fd5b5061049160075481565b34801561063d57600080fd5b50610491601a5481565b34801561065357600080fd5b5061049160115481565b34801561066957600080fd5b506012546104409062010000900460ff1681565b34801561068957600080fd5b50610491610698366004613258565b610fc3565b3480156106a957600080fd5b5061050b610fde565b3480156106be57600080fd5b5061050b611052565b3480156106d357600080fd5b5061050b6106e2366004613316565b61110e565b3480156106f357600080fd5b5061050b6107023660046132bd565b6111d6565b34801561071357600080fd5b5061044061072236600461334f565b611280565b34801561073357600080fd5b50610440610742366004613258565b60106020526000908152604090205460ff1681565b34801561076357600080fd5b5061049160065481565b34801561077957600080fd5b506005546001600160a01b0316610408565b34801561079757600080fd5b506103d2611445565b3480156107ac57600080fd5b5061050b6107bb366004613316565b611454565b3480156107cc57600080fd5b5061049160185481565b3480156107e257600080fd5b5061049160215481565b3480156107f857600080fd5b50610491601d5481565b34801561080e57600080fd5b5061044061081d36600461322c565b611548565b34801561082e57600080fd5b50610491600f5481565b34801561084457600080fd5b5061044061085336600461322c565b6115e1565b34801561086457600080fd5b5061049160085481565b34801561087a57600080fd5b50610491601e5481565b34801561089057600080fd5b5061044061089f366004613258565b60256020526000908152604090205460ff1681565b3480156108c057600080fd5b5060125461044090610100900460ff1681565b3480156108df57600080fd5b5061050b6108ee366004613316565b6115ee565b3480156108ff57600080fd5b5061050b61090e3660046132bd565b611677565b34801561091f57600080fd5b506014546104409060ff1681565b34801561093957600080fd5b5061050b610948366004613258565b611780565b34801561095957600080fd5b5061050b6109683660046132bd565b611822565b34801561097957600080fd5b5061049160155481565b34801561098f57600080fd5b5061050b61099e3660046132bd565b61196d565b3480156109af57600080fd5b506104916109be36600461334f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156109f557600080fd5b50610491600b5481565b348015610a0b57600080fd5b5061049160195481565b348015610a2157600080fd5b5061050b610a303660046132d6565b611a74565b348015610a4157600080fd5b50610491600e5481565b348015610a5757600080fd5b5061049160175481565b348015610a6d57600080fd5b5061050b610a7c366004613258565b611b27565b348015610a8d57600080fd5b5061050b611c12565b348015610aa257600080fd5b50610491601c5481565b348015610ab857600080fd5b50610491601f5481565b348015610ace57600080fd5b5061050b610add3660046132bd565b611c7e565b606060038054610af19061337d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1d9061337d565b8015610b6a5780601f10610b3f57610100808354040283529160200191610b6a565b820191906000526020600020905b815481529060010190602001808311610b4d57829003601f168201915b5050505050905090565b6000610b81338484611e89565b5060015b92915050565b6000610b98848484611fae565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610c225760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b610c2f8533858403611e89565b506001949350505050565b6005546001600160a01b03163314610c645760405162461bcd60e51b8152600401610c19906133b7565b670de0b6b3a76400006103e8610c7960025490565b610c84906002613402565b610c8e9190613419565b610c989190613419565b811015610cf95760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152687468616e20302e322560b81b6064820152608401610c19565b610d0b81670de0b6b3a7640000613402565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b6005546001600160a01b03163314610d715760405162461bcd60e51b8152600401610c19906133b7565b60168490556017839055601882905560198190558082610d91858761343b565b610d9b919061343b565b610da5919061343b565b6015819055600a1015610dfa5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610c19565b50505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610b81918590610e3790869061343b565b611e89565b6005546001600160a01b03163314610e665760405162461bcd60e51b8152600401610c19906133b7565b6001600160a01b038116610ecb5760405162461bcd60e51b815260206004820152602660248201527f5f6f7065726174696f6e734164647265737320616464726573732063616e6e6f60448201526507420626520360d41b6064820152608401610c19565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610f175760405162461bcd60e51b8152600401610c19906133b7565b600b54610f2330610fc3565b1015610f99576040805162461bcd60e51b81526020600482015260248101919091527f43616e206f6e6c792073776170207768656e20746f6b656e20616d6f756e742060448201527f6973206174206f7220686967686572207468616e207265737472696374696f6e6064820152608401610c19565b600a805460ff60a01b1916600160a01b179055610fb4612aac565b600a805460ff60a01b19169055565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146110085760405162461bcd60e51b8152600401610c19906133b7565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b0316331461107c5760405162461bcd60e51b8152600401610c19906133b7565b6012805460ff199081169091556014805490911690556003601681905560006017819055601881905560198190559081906110b890829061343b565b6110c2919061343b565b6110cc919061343b565b6015556003601b8190556000601c819055601d819055601e8190559081906110f590829061343b565b6110ff919061343b565b611109919061343b565b601a55565b6005546001600160a01b031633146111385760405162461bcd60e51b8152600401610c19906133b7565b806111ab57600a546001600160a01b03908116908316036111ab5760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610c19565b6001600160a01b03919091166000908152602460205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146112005760405162461bcd60e51b8152600401610c19906133b7565b601254610100900460ff16156112585760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207265656e61626c652074726164696e670000000000000000006044820152606401610c19565b6012805462ffff0019166201010017905543600e81905561127a90829061343b565b600f5550565b6005546000906001600160a01b031633146112ad5760405162461bcd60e51b8152600401610c19906133b7565b6001600160a01b0383166113035760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610c19565b306001600160a01b0384160361135b5760405162461bcd60e51b815260206004820152601c60248201527f43616e2774207769746864726177206e617469766520746f6b656e73000000006044820152606401610c19565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa1580156113a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c6919061344e565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af1158015611419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143d9190613467565b949350505050565b606060048054610af19061337d565b6005546001600160a01b0316331461147e5760405162461bcd60e51b8152600401610c19906133b7565b600a546001600160a01b03908116908316036115025760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610c19565b61150c8282612caa565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156115ca5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610c19565b6115d73385858403611e89565b5060019392505050565b6000610b81338484611fae565b6005546001600160a01b031633146116185760405162461bcd60e51b8152600401610c19906133b7565b6001600160a01b038216600081815260236020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146116a15760405162461bcd60e51b8152600401610c19906133b7565b670de0b6b3a76400006103e86116b660025490565b6116c1906003613402565b6116cb9190613419565b6116d59190613419565b8110156117395760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e332560a01b6064820152608401610c19565b61174b81670de0b6b3a7640000613402565b60088190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc90602001610d3c565b6005546001600160a01b031633146117aa5760405162461bcd60e51b8152600401610c19906133b7565b6001600160a01b0381166118005760405162461bcd60e51b815260206004820152601f60248201527f5f6465764164647265737320616464726573732063616e6e6f742062652030006044820152606401610c19565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461184c5760405162461bcd60e51b8152600401610c19906133b7565b620186a061185960025490565b611864906001613402565b61186e9190613419565b8110156118db5760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610c19565b6103e86118e760025490565b6118f2906001613402565b6118fc9190613419565b8111156119685760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610c19565b600b55565b6005546001600160a01b031633146119975760405162461bcd60e51b8152600401610c19906133b7565b670de0b6b3a76400006103e86119ac60025490565b6119b7906002613402565b6119c19190613419565b6119cb9190613419565b811015611a2d5760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f776572604482015269207468616e20302e322560b01b6064820152608401610c19565b611a3f81670de0b6b3a7640000613402565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e90602001610d3c565b6005546001600160a01b03163314611a9e5760405162461bcd60e51b8152600401610c19906133b7565b601b849055601c839055601d829055601e8190558082611abe858761343b565b611ac8919061343b565b611ad2919061343b565b601a819055600a1015610dfa5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610c19565b6005546001600160a01b03163314611b515760405162461bcd60e51b8152600401610c19906133b7565b6001600160a01b038116611bb65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c19565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611c3c5760405162461bcd60e51b8152600401610c19906133b7565b604051600090339047908381818185875af1925050503d8060008114610dfa576040519150601f19603f3d011682016040523d82523d6000602084013e610dfa565b6005546001600160a01b03163314611ca85760405162461bcd60e51b8152600401610c19906133b7565b678ac7230489e80000811115611d365760405162461bcd60e51b815260206004820152604760248201527f4d6179206e6f7420627579206d6f7265207468616e2031302045544820696e2060448201527f612073696e676c652062757920746f207265647563652073616e64776963682060648201526661747461636b7360c81b608482015260a401610c19565b6040805160028082526060820183526000926020830190803683375050600954604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611da0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc49190613484565b81600081518110611dd757611dd76134a1565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611e0b57611e0b6134a1565b6001600160a01b03928316602091820292909201015260095460405163b6f9de9560e01b815291169063b6f9de95908490611e5390600090869061dead9042906004016134fb565b6000604051808303818588803b158015611e6c57600080fd5b505af1158015611e80573d6000803e3d6000fd5b50505050505050565b6001600160a01b038316611eeb5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c19565b6001600160a01b038216611f4c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c19565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316611fd45760405162461bcd60e51b8152600401610c1990613530565b6001600160a01b038216611ffa5760405162461bcd60e51b8152600401610c1990613575565b6000811161204a5760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610c19565b601254610100900460ff166120dd576001600160a01b03831660009081526023602052604090205460ff168061209857506001600160a01b03821660009081526023602052604090205460ff165b6120dd5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610c19565b600f54156121b0576001600160a01b03831660009081526010602052604090205460ff16158061211a57506005546001600160a01b038381169116145b8061212f57506001600160a01b03821661dead145b6121b05760405162461bcd60e51b815260206004820152604660248201527f426f74732063616e6e6f74207472616e7366657220746f6b656e7320696e206f60448201527f72206f75742065786365707420746f206f776e6572206f722064656164206164606482015265323932b9b99760d11b608482015260a401610c19565b60125460ff16156125ac576005546001600160a01b038481169116148015906121e757506005546001600160a01b03838116911614155b80156121fb57506001600160a01b03821615155b801561221257506001600160a01b03821661dead14155b801561223757506001600160a01b03831660009081526023602052604090205460ff16155b801561225c57506001600160a01b03821660009081526023602052604090205460ff16155b156125ac5760145460ff1615612375576009546001600160a01b038381169116148015906122985750600a546001600160a01b03838116911614155b15612375576122a86002436135b8565b326000908152601360205260409020541080156122e657506122cb6002436135b8565b6001600160a01b038316600090815260136020526040902054105b6123505760405162461bcd60e51b815260206004820152603560248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527432b21710102a393c9030b3b0b4b7103630ba32b91760591b6064820152608401610c19565b3260009081526013602052604080822043908190556001600160a01b03851683529120555b6001600160a01b03831660009081526025602052604090205460ff1680156123b657506001600160a01b03821660009081526024602052604090205460ff16155b156124825760065481111561241e5760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610c19565b60085461242a83610fc3565b612434908361343b565b111561247d5760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610c19565b6125ac565b6001600160a01b03821660009081526025602052604090205460ff1680156124c357506001600160a01b03831660009081526024602052604090205460ff16155b1561252d5760075481111561247d5760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610c19565b6001600160a01b03821660009081526024602052604090205460ff166125ac5760085461255983610fc3565b612563908361343b565b11156125ac5760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610c19565b60006125b730610fc3565b90506000600b5482101580156125ce5750600b5483115b90508080156125e5575060125462010000900460ff165b80156125fb5750600a54600160a01b900460ff16155b801561261f57506001600160a01b03841660009081526025602052604090205460ff165b801561264457506001600160a01b03851660009081526023602052604090205460ff16155b801561266957506001600160a01b03841660009081526023602052604090205460ff16155b1561269757600a805460ff60a01b1916600160a01b179055612689612aac565b600a805460ff60a01b191690555b6001600160a01b03851660009081526023602052604090205460019060ff16806126d957506001600160a01b03851660009081526023602052604090205460ff165b156126e2575060005b60008115612aa157600f544310801561271357506001600160a01b03871660009081526025602052604090205460ff165b801561273857506001600160a01b03861660009081526025602052604090205460ff16155b801561274657506000601554115b1561288a576001600160a01b03861660009081526010602052604090205460ff166127aa576001600160a01b0386166000908152601060205260408120805460ff1916600190811790915560118054919290916127a490849061343b565b90915550505b60646127b786601e613402565b6127c19190613419565b9050601554601754826127d49190613402565b6127de9190613419565b602060008282546127ef919061343b565b90915550506015546016546128049083613402565b61280e9190613419565b601f600082825461281f919061343b565b90915550506015546018546128349083613402565b61283e9190613419565b6021600082825461284f919061343b565b90915550506015546019546128649083613402565b61286e9190613419565b6022600082825461287f919061343b565b90915550612a839050565b6001600160a01b03861660009081526025602052604090205460ff1680156128b457506000601a54115b15612976576064601a54866128c99190613402565b6128d39190613419565b9050601a54601c54826128e69190613402565b6128f09190613419565b60206000828254612901919061343b565b9091555050601a54601b546129169083613402565b6129209190613419565b601f6000828254612931919061343b565b9091555050601a54601d546129469083613402565b6129509190613419565b60216000828254612961919061343b565b9091555050601a54601e546128649083613402565b6001600160a01b03871660009081526025602052604090205460ff1680156129a057506000601554115b15612a83576064601554866129b59190613402565b6129bf9190613419565b9050601554601754826129d29190613402565b6129dc9190613419565b602060008282546129ed919061343b565b9091555050601554601654612a029083613402565b612a0c9190613419565b601f6000828254612a1d919061343b565b9091555050601554601854612a329083613402565b612a3c9190613419565b60216000828254612a4d919061343b565b9091555050601554601954612a629083613402565b612a6c9190613419565b60226000828254612a7d919061343b565b90915550505b8015612a9457612a94873083612cd8565b612a9e81866135b8565b94505b611e80878787612cd8565b6000602254118015612ac85750602254612ac530610fc3565b10155b15612ad957612ad930602254612e2d565b60006022819055612ae930610fc3565b90506000602154601f54602054612b00919061343b565b612b0a919061343b565b9050811580612b17575080155b15612b20575050565b60008060028360205486612b349190613402565b612b3e9190613419565b612b489190613419565b9050612b5c612b5782866135b8565b612f57565b60205447908190600090612b7290600290613419565b612b7c90876135b8565b601f54612b899085613402565b612b939190613419565b905060006002602054612ba69190613419565b612bb090886135b8565b602154612bbd9086613402565b612bc79190613419565b9050612bd3818361343b565b612bdd90846135b8565b60006020819055601f819055602181905560225592508415801590612c025750600083115b15612c1157612c1185846130b1565b600d546040516001600160a01b03909116908290600081818185875af1925050503d8060008114612c5e576040519150601f19603f3d011682016040523d82523d6000602084013e612c63565b606091505b5050600c546040519197506001600160a01b0316904780156108fc02916000818181858888f19350505050158015612c9f573d6000803e3d6000fd5b505050505050505050565b6001600160a01b0382166000908152602560205260409020805460ff191682151517905561150c8282613163565b6001600160a01b038316612cfe5760405162461bcd60e51b8152600401610c1990613530565b6001600160a01b038216612d245760405162461bcd60e51b8152600401610c1990613575565b6001600160a01b03831660009081526020819052604090205481811015612d9c5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610c19565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290612dd390849061343b565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612e1f91815260200190565b60405180910390a350505050565b6001600160a01b038216612e8d5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610c19565b6001600160a01b03821660009081526020819052604090205481811015612f015760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610c19565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611fa1565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f8c57612f8c6134a1565b6001600160a01b03928316602091820292909201810191909152600954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612fe5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130099190613484565b8160018151811061301c5761301c6134a1565b6001600160a01b0392831660209182029290920101526009546130429130911684611e89565b60095460405163791ac94760e01b81526001600160a01b039091169063791ac9479061307b9085906000908690309042906004016135cb565b600060405180830381600087803b15801561309557600080fd5b505af11580156130a9573d6000803e3d6000fd5b505050505050565b6009546130c99030906001600160a01b031684611e89565b60095460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015613137573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061315c9190613607565b5050505050565b6001600160a01b038216600081815260246020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b600060208083528351808285015260005b818110156131f3578581018301518582016040015282016131d7565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461322957600080fd5b50565b6000806040838503121561323f57600080fd5b823561324a81613214565b946020939093013593505050565b60006020828403121561326a57600080fd5b813561327581613214565b9392505050565b60008060006060848603121561329157600080fd5b833561329c81613214565b925060208401356132ac81613214565b929592945050506040919091013590565b6000602082840312156132cf57600080fd5b5035919050565b600080600080608085870312156132ec57600080fd5b5050823594602084013594506040840135936060013592509050565b801515811461322957600080fd5b6000806040838503121561332957600080fd5b823561333481613214565b9150602083013561334481613308565b809150509250929050565b6000806040838503121561336257600080fd5b823561336d81613214565b9150602083013561334481613214565b600181811c9082168061339157607f821691505b6020821081036133b157634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610b8557610b856133ec565b60008261343657634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610b8557610b856133ec565b60006020828403121561346057600080fd5b5051919050565b60006020828403121561347957600080fd5b815161327581613308565b60006020828403121561349657600080fd5b815161327581613214565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156134f05781516001600160a01b0316875295820195908201906001016134cb565b509495945050505050565b84815260806020820152600061351460808301866134b7565b6001600160a01b03949094166040830152506060015292915050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610b8557610b856133ec565b85815284602082015260a0604082015260006135ea60a08301866134b7565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561361c57600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220820a8293c2688ef4db593a12135b7814eb909722ed7dd92ef843e036844f795864736f6c63430008130033

Deployed Bytecode Sourcemap

10554:18375:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4439:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10712:31;;;;;;;;;;-1:-1:-1;10712:31:0;;;;-1:-1:-1;;;;;10712:31:0;;;;;;-1:-1:-1;;;;;753:32:1;;;735:51;;723:2;708:18;10712:31:0;567:225:1;5353:169:0;;;;;;;;;;-1:-1:-1;5353:169:0;;;;;:::i;:::-;;:::i;:::-;;;1418:14:1;;1411:22;1393:41;;1381:2;1366:18;5353:169:0;1253:187:1;12104:64:0;;;;;;;;;;-1:-1:-1;12104:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;4760:108;;;;;;;;;;-1:-1:-1;4848:12:0;;4760:108;;;1843:25:1;;;1831:2;1816:18;4760:108:0;1697:177:1;11852:33:0;;;;;;;;;;;;;;;;11926:28;;;;;;;;;;;;;;;;5530:492;;;;;;;;;;-1:-1:-1;5530:492:0;;;;;:::i;:::-;;:::i;15779:269::-;;;;;;;;;;-1:-1:-1;15779:269:0;;;;;:::i;:::-;;:::i;:::-;;18080:436;;;;;;;;;;-1:-1:-1;18080:436:0;;;;;:::i;:::-;;:::i;4659:93::-;;;;;;;;;;-1:-1:-1;4659:93:0;;4742:2;3057:36:1;;3045:2;3030:18;4659:93:0;2915:184:1;6030:215:0;;;;;;;;;;-1:-1:-1;6030:215:0;;;;;:::i;:::-;;:::i;10750:21::-;;;;;;;;;;-1:-1:-1;10750:21:0;;;;-1:-1:-1;;;;;10750:21:0;;;27500:237;;;;;;;;;;-1:-1:-1;27500:237:0;;;;;:::i;:::-;;:::i;11111:33::-;;;;;;;;;;-1:-1:-1;11111:33:0;;;;;;;;11667:32;;;;;;;;;;;;;;;;27992:260;;;;;;;;;;;;;:::i;24041:120::-;;;;;;;;;;-1:-1:-1;24135:18:0;;24120:12;:33;24041:120;;11492:31;;;;;;;;;;;;;;;;10638:28;;;;;;;;;;;;;;;;11632;;;;;;;;;;;;;;;;11077:25;;;;;;;;;;;;;;;;11191:31;;;;;;;;;;-1:-1:-1;11191:31:0;;;;;;;;;;;4876:127;;;;;;;;;;-1:-1:-1;4876:127:0;;;;;:::i;:::-;;:::i;9074:150::-;;;;;;;;;;;;;:::i;15237:534::-;;;;;;;;;;;;;:::i;17261:260::-;;;;;;;;;;-1:-1:-1;17261:260:0;;;;;:::i;:::-;;:::i;14887:298::-;;;;;;;;;;-1:-1:-1;14887:298:0;;;;;:::i;:::-;;:::i;26868:394::-;;;;;;;;;;-1:-1:-1;26868:394:0;;;;;:::i;:::-;;:::i;11026:44::-;;;;;;;;;;-1:-1:-1;11026:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;10604:27;;;;;;;;;;;;;;;;8860:79;;;;;;;;;;-1:-1:-1;8925:6:0;;-1:-1:-1;;;;;8925:6:0;8860:79;;4547:104;;;;;;;;;;;;;:::i;17529:295::-;;;;;;;;;;-1:-1:-1;17529:295:0;;;;;:::i;:::-;;:::i;11567:24::-;;;;;;;;;;;;;;;;11892:27;;;;;;;;;;;;;;;;11744:25;;;;;;;;;;;;;;;;6253:413;;;;;;;;;;-1:-1:-1;6253:413:0;;;;;:::i;:::-;;:::i;10986:33::-;;;;;;;;;;;;;;;;5011:175;;;;;;;;;;-1:-1:-1;5011:175:0;;;;;:::i;:::-;;:::i;10673:30::-;;;;;;;;;;;;;;;;11776:26;;;;;;;;;;;;;;;;12326:58;;;;;;;;;;-1:-1:-1;12326:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;11151:33;;;;;;;;;;-1:-1:-1;11151:33:0;;;;;;;;;;;18979:182;;;;;;;;;;-1:-1:-1;18979:182:0;;;;;:::i;:::-;;:::i;16338:284::-;;;;;;;;;;-1:-1:-1;16338:284:0;;;;;:::i;:::-;;:::i;11410:39::-;;;;;;;;;;-1:-1:-1;11410:39:0;;;;;;;;27745:195;;;;;;;;;;-1:-1:-1;27745:195:0;;;;;:::i;:::-;;:::i;16692:346::-;;;;;;;;;;-1:-1:-1;16692:346:0;;;;;:::i;:::-;;:::i;11458:27::-;;;;;;;;;;;;;;;;16056:274;;;;;;;;;;-1:-1:-1;16056:274:0;;;;;:::i;:::-;;:::i;5194:151::-;;;;;;;;;;-1:-1:-1;5194:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;5310:18:0;;;5283:7;5310:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;5194:151;10808:33;;;;;;;;;;;;;;;;11598:25;;;;;;;;;;;;;;;;18524:447;;;;;;;;;;-1:-1:-1;18524:447:0;;;;;:::i;:::-;;:::i;10909:37::-;;;;;;;;;;;;;;;;11530:30;;;;;;;;;;;;;;;;9232:244;;;;;;;;;;-1:-1:-1;9232:244:0;;;;;:::i;:::-;;:::i;27332:160::-;;;;;;;;;;;;;:::i;11706:31::-;;;;;;;;;;;;;;;;11811:34;;;;;;;;;;;;;;;;28355:571;;;;;;;;;;-1:-1:-1;28355:571:0;;;;;:::i;:::-;;:::i;4439:100::-;4493:13;4526:5;4519:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4439:100;:::o;5353:169::-;5436:4;5453:39;4010:10;5476:7;5485:6;5453:8;:39::i;:::-;-1:-1:-1;5510:4:0;5353:169;;;;;:::o;5530:492::-;5670:4;5687:36;5697:6;5705:9;5716:6;5687:9;:36::i;:::-;-1:-1:-1;;;;;5763:19:0;;5736:24;5763:19;;;:11;:19;;;;;;;;4010:10;5763:33;;;;;;;;5815:26;;;;5807:79;;;;-1:-1:-1;;;5807:79:0;;4802:2:1;5807:79:0;;;4784:21:1;4841:2;4821:18;;;4814:30;4880:34;4860:18;;;4853:62;-1:-1:-1;;;4931:18:1;;;4924:38;4979:19;;5807:79:0;;;;;;;;;5922:57;5931:6;4010:10;5972:6;5953:16;:25;5922:8;:57::i;:::-;-1:-1:-1;6010:4:0;;5530:492;-1:-1:-1;;;;5530:492:0:o;15779:269::-;8987:6;;-1:-1:-1;;;;;8987:6:0;4010:10;8987:22;8979:67;;;;-1:-1:-1;;;8979:67:0;;;;;;;:::i;:::-;15898:4:::1;15892;15872:13;4848:12:::0;;;4760:108;15872:13:::1;:17;::::0;15888:1:::1;15872:17;:::i;:::-;:24;;;;:::i;:::-;15871:31;;;;:::i;:::-;15861:6;:41;;15853:95;;;::::0;-1:-1:-1;;;15853:95:0;;6099:2:1;15853:95:0::1;::::0;::::1;6081:21:1::0;6138:2;6118:18;;;6111:30;6177:34;6157:18;;;6150:62;-1:-1:-1;;;6228:18:1;;;6221:39;6277:19;;15853:95:0::1;5897:405:1::0;15853:95:0::1;15974:17;:6:::0;15984::::1;15974:17;:::i;:::-;15959:12;:32:::0;;;16007:33:::1;::::0;1843:25:1;;;16007:33:0::1;::::0;1831:2:1;1816:18;16007:33:0::1;;;;;;;;15779:269:::0;:::o;18080:436::-;8987:6;;-1:-1:-1;;;;;8987:6:0;4010:10;8987:22;8979:67;;;;-1:-1:-1;;;8979:67:0;;;;;;;:::i;:::-;18215:16:::1;:33:::0;;;18259:15:::1;:31:::0;;;18301:9:::1;:19:::0;;;18331:10:::1;:21:::0;;;18344:8;18313:7;18378:34:::1;18277:13:::0;18234:14;18378:34:::1;:::i;:::-;:46;;;;:::i;:::-;:59;;;;:::i;:::-;18363:12;:74:::0;;;18472:2:::1;-1:-1:-1::0;18456:18:0::1;18448:60;;;::::0;-1:-1:-1;;;18448:60:0;;6639:2:1;18448:60:0::1;::::0;::::1;6621:21:1::0;6678:2;6658:18;;;6651:30;6717:31;6697:18;;;6690:59;6766:18;;18448:60:0::1;6437:353:1::0;18448:60:0::1;18080:436:::0;;;;:::o;6030:215::-;4010:10;6118:4;6167:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6167:34:0;;;;;;;;;;6118:4;;6135:80;;6158:7;;6167:47;;6204:10;;6167:47;:::i;:::-;6135:8;:80::i;27500:237::-;8987:6;;-1:-1:-1;;;;;8987:6:0;4010:10;8987:22;8979:67;;;;-1:-1:-1;;;8979:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27596:32:0;::::1;27588:83;;;::::0;-1:-1:-1;;;27588:83:0;;6997:2:1;27588:83:0::1;::::0;::::1;6979:21:1::0;7036:2;7016:18;;;7009:30;7075:34;7055:18;;;7048:62;-1:-1:-1;;;7126:18:1;;;7119:36;7172:19;;27588:83:0::1;6795:402:1::0;27588:83:0::1;27682:17;:47:::0;;-1:-1:-1;;;;;;27682:47:0::1;-1:-1:-1::0;;;;;27682:47:0;;;::::1;::::0;;;::::1;::::0;;27500:237::o;27992:260::-;8987:6;;-1:-1:-1;;;;;8987:6:0;4010:10;8987:22;8979:67;;;;-1:-1:-1;;;8979:67:0;;;;;;;:::i;:::-;28083:18:::1;;28055:24;28073:4;28055:9;:24::i;:::-;:46;;28047:123;;;::::0;;-1:-1:-1;;;28047:123:0;;7404:2:1;28047:123:0::1;::::0;::::1;7386:21:1::0;7423:18;;;7416:30;;;;7482:34;7462:18;;;7455:62;7553:34;7533:18;;;7526:62;7605:19;;28047:123:0::1;7202:428:1::0;28047:123:0::1;28181:8;:15:::0;;-1:-1:-1;;;;28181:15:0::1;-1:-1:-1::0;;;28181:15:0::1;::::0;;28207:10:::1;:8;:10::i;:::-;28228:8;:16:::0;;-1:-1:-1;;;;28228:16:0::1;::::0;;27992:260::o;4876:127::-;-1:-1:-1;;;;;4977:18:0;4950:7;4977:18;;;;;;;;;;;;4876:127::o;9074:150::-;8987:6;;-1:-1:-1;;;;;8987:6:0;4010:10;8987:22;8979:67;;;;-1:-1:-1;;;8979:67:0;;;;;;;:::i;:::-;9167:6:::1;::::0;9146:40:::1;::::0;9183:1:::1;::::0;-1:-1:-1;;;;;9167:6:0::1;::::0;9146:40:::1;::::0;9183:1;;9146:40:::1;9197:6;:19:::0;;-1:-1:-1;;;;;;9197:19:0::1;::::0;;9074:150::o;15237:534::-;8987:6;;-1:-1:-1;;;;;8987:6:0;4010:10;8987:22;8979:67;;;;-1:-1:-1;;;8979:67:0;;;;;;;:::i;:::-;15291:14:::1;:22:::0;;-1:-1:-1;;15291:22:0;;::::1;::::0;;;15324:20:::1;:28:::0;;;;::::1;::::0;;15392:1:::1;15373:16;:20:::0;;;15308:5:::1;15404:15;:19:::0;;;15434:9:::1;:13:::0;;;15458:10:::1;:14:::0;;;15308:5;;;15498:34:::1;::::0;15308:5;;15498:34:::1;:::i;:::-;:46;;;;:::i;:::-;:59;;;;:::i;:::-;15483:12;:74:::0;15590:1:::1;15570:17;:21:::0;;;-1:-1:-1;15602:16:0::1;:20:::0;;;15633:10:::1;:14:::0;;;15658:11:::1;:15:::0;;;-1:-1:-1;;;15700:36:0::1;::::0;-1:-1:-1;;15700:36:0::1;:::i;:::-;:49;;;;:::i;:::-;:63;;;;:::i;:::-;15684:13;:79:::0;15237:534::o;17261:260::-;8987:6;;-1:-1:-1;;;;;8987:6:0;4010:10;8987:22;8979:67;;;;-1:-1:-1;;;8979:67:0;;;;;;;:::i;:::-;17357:4:::1;17353:104;;17395:6;::::0;-1:-1:-1;;;;;17395:6:0;;::::1;17385:16:::0;;::::1;::::0;17377:68:::1;;;::::0;-1:-1:-1;;;17377:68:0;;7837:2:1;17377:68:0::1;::::0;::::1;7819:21:1::0;7876:2;7856:18;;;7849:30;7915:34;7895:18;;;7888:62;-1:-1:-1;;;7966:18:1;;;7959:37;8013:19;;17377:68:0::1;7635:403:1::0;17377:68:0::1;-1:-1:-1::0;;;;;17467:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;17467:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;17261:260::o;14887:298::-;8987:6;;-1:-1:-1;;;;;8987:6:0;4010:10;8987:22;8979:67;;;;-1:-1:-1;;;8979:67:0;;;;;;;:::i;:::-;14969:13:::1;::::0;::::1;::::0;::::1;;;14968:14;14960:50;;;::::0;-1:-1:-1;;;14960:50:0;;8245:2:1;14960:50:0::1;::::0;::::1;8227:21:1::0;8284:2;8264:18;;;8257:30;8323:25;8303:18;;;8296:53;8366:18;;14960:50:0::1;8043:347:1::0;14960:50:0::1;15021:13;:20:::0;;-1:-1:-1;;15052:18:0;;;;;15102:12:::1;15081:18;:33:::0;;;15146:31:::1;::::0;15167:10;;15146:31:::1;:::i;:::-;15125:18;:52:::0;-1:-1:-1;14887:298:0:o;26868:394::-;8987:6;;26955:10;;-1:-1:-1;;;;;8987:6:0;4010:10;8987:22;8979:67;;;;-1:-1:-1;;;8979:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26986:20:0;::::1;26978:59;;;::::0;-1:-1:-1;;;26978:59:0;;8597:2:1;26978:59:0::1;::::0;::::1;8579:21:1::0;8636:2;8616:18;;;8609:30;8675:28;8655:18;;;8648:56;8721:18;;26978:59:0::1;8395:350:1::0;26978:59:0::1;27074:4;-1:-1:-1::0;;;;;27056:23:0;::::1;::::0;27048:64:::1;;;::::0;-1:-1:-1;;;27048:64:0;;8952:2:1;27048:64:0::1;::::0;::::1;8934:21:1::0;8991:2;8971:18;;;8964:30;9030;9010:18;;;9003:58;9078:18;;27048:64:0::1;8750:352:1::0;27048:64:0::1;27150:39;::::0;-1:-1:-1;;;27150:39:0;;27183:4:::1;27150:39;::::0;::::1;735:51:1::0;27123:24:0::1;::::0;-1:-1:-1;;;;;27150:24:0;::::1;::::0;::::1;::::0;708:18:1;;27150:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27208:46;::::0;-1:-1:-1;;;27208:46:0;;-1:-1:-1;;;;;9488:32:1;;;27208:46:0::1;::::0;::::1;9470:51:1::0;9537:18;;;9530:34;;;27123:66:0;;-1:-1:-1;27208:23:0;;::::1;::::0;::::1;::::0;9443:18:1;;27208:46:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27200:54:::0;26868:394;-1:-1:-1;;;;26868:394:0:o;4547:104::-;4603:13;4636:7;4629:14;;;;;:::i;17529:295::-;8987:6;;-1:-1:-1;;;;;8987:6:0;4010:10;8987:22;8979:67;;;;-1:-1:-1;;;8979:67:0;;;;;;;:::i;:::-;17638:6:::1;::::0;-1:-1:-1;;;;;17638:6:0;;::::1;17630:14:::0;;::::1;::::0;17622:84:::1;;;::::0;-1:-1:-1;;;17622:84:0;;10027:2:1;17622:84:0::1;::::0;::::1;10009:21:1::0;10066:2;10046:18;;;10039:30;10105:34;10085:18;;;10078:62;10176:27;10156:18;;;10149:55;10221:19;;17622:84:0::1;9825:421:1::0;17622:84:0::1;17719:41;17748:4;17754:5;17719:28;:41::i;:::-;17776:40;::::0;;::::1;;::::0;-1:-1:-1;;;;;17776:40:0;::::1;::::0;::::1;::::0;;;::::1;17529:295:::0;;:::o;6253:413::-;4010:10;6346:4;6390:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6390:34:0;;;;;;;;;;6443:35;;;;6435:85;;;;-1:-1:-1;;;6435:85:0;;10453:2:1;6435:85:0;;;10435:21:1;10492:2;10472:18;;;10465:30;10531:34;10511:18;;;10504:62;-1:-1:-1;;;10582:18:1;;;10575:35;10627:19;;6435:85:0;10251:401:1;6435:85:0;6556:67;4010:10;6579:7;6607:15;6588:16;:34;6556:8;:67::i;:::-;-1:-1:-1;6654:4:0;;6253:413;-1:-1:-1;;;6253:413:0:o;5011:175::-;5097:4;5114:42;4010:10;5138:9;5149:6;5114:9;:42::i;18979:182::-;8987:6;;-1:-1:-1;;;;;8987:6:0;4010:10;8987:22;8979:67;;;;-1:-1:-1;;;8979:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19064:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;19064:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;19119:34;;1393:41:1;;;19119:34:0::1;::::0;1366:18:1;19119:34:0::1;;;;;;;18979:182:::0;;:::o;16338:284::-;8987:6;;-1:-1:-1;;;;;8987:6:0;4010:10;8987:22;8979:67;;;;-1:-1:-1;;;8979:67:0;;;;;;;:::i;:::-;16460:4:::1;16454;16434:13;4848:12:::0;;;4760:108;16434:13:::1;:17;::::0;16450:1:::1;16434:17;:::i;:::-;:24;;;;:::i;:::-;16433:31;;;;:::i;:::-;16423:6;:41;;16415:98;;;::::0;-1:-1:-1;;;16415:98:0;;10859:2:1;16415:98:0::1;::::0;::::1;10841:21:1::0;10898:2;10878:18;;;10871:30;10937:34;10917:18;;;10910:62;-1:-1:-1;;;10988:18:1;;;10981:42;11040:19;;16415:98:0::1;10657:408:1::0;16415:98:0::1;16542:17;:6:::0;16552::::1;16542:17;:::i;:::-;16524:15;:35:::0;;;16575:39:::1;::::0;1843:25:1;;;16575:39:0::1;::::0;1831:2:1;1816:18;16575:39:0::1;1697:177:1::0;27745:195:0;8987:6;;-1:-1:-1;;;;;8987:6:0;4010:10;8987:22;8979:67;;;;-1:-1:-1;;;8979:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27827:25:0;::::1;27819:69;;;::::0;-1:-1:-1;;;27819:69:0;;11272:2:1;27819:69:0::1;::::0;::::1;11254:21:1::0;11311:2;11291:18;;;11284:30;11350:33;11330:18;;;11323:61;11401:18;;27819:69:0::1;11070:355:1::0;27819:69:0::1;27899:10;:33:::0;;-1:-1:-1;;;;;;27899:33:0::1;-1:-1:-1::0;;;;;27899:33:0;;;::::1;::::0;;;::::1;::::0;;27745:195::o;16692:346::-;8987:6;;-1:-1:-1;;;;;8987:6:0;4010:10;8987:22;8979:67;;;;-1:-1:-1;;;8979:67:0;;;;;;;:::i;:::-;16815:6:::1;16795:13;4848:12:::0;;;4760:108;16795:13:::1;:17;::::0;16811:1:::1;16795:17;:::i;:::-;:26;;;;:::i;:::-;16782:9;:39;;16774:105;;;::::0;-1:-1:-1;;;16774:105:0;;11632:2:1;16774:105:0::1;::::0;::::1;11614:21:1::0;11671:2;11651:18;;;11644:30;11710:34;11690:18;;;11683:62;-1:-1:-1;;;11761:18:1;;;11754:51;11822:19;;16774:105:0::1;11430:417:1::0;16774:105:0::1;16930:4;16910:13;4848:12:::0;;;4760:108;16910:13:::1;:17;::::0;16926:1:::1;16910:17;:::i;:::-;:24;;;;:::i;:::-;16897:9;:37;;16889:102;;;::::0;-1:-1:-1;;;16889:102:0;;12054:2:1;16889:102:0::1;::::0;::::1;12036:21:1::0;12093:2;12073:18;;;12066:30;12132:34;12112:18;;;12105:62;-1:-1:-1;;;12183:18:1;;;12176:50;12243:19;;16889:102:0::1;11852:416:1::0;16889:102:0::1;17001:18;:30:::0;16692:346::o;16056:274::-;8987:6;;-1:-1:-1;;;;;8987:6:0;4010:10;8987:22;8979:67;;;;-1:-1:-1;;;8979:67:0;;;;;;;:::i;:::-;16176:4:::1;16170;16150:13;4848:12:::0;;;4760:108;16150:13:::1;:17;::::0;16166:1:::1;16150:17;:::i;:::-;:24;;;;:::i;:::-;16149:31;;;;:::i;:::-;16139:6;:41;;16131:96;;;::::0;-1:-1:-1;;;16131:96:0;;12475:2:1;16131:96:0::1;::::0;::::1;12457:21:1::0;12514:2;12494:18;;;12487:30;12553:34;12533:18;;;12526:62;-1:-1:-1;;;12604:18:1;;;12597:40;12654:19;;16131:96:0::1;12273:406:1::0;16131:96:0::1;16254:17;:6:::0;16264::::1;16254:17;:::i;:::-;16238:13;:33:::0;;;16287:35:::1;::::0;1843:25:1;;;16287:35:0::1;::::0;1831:2:1;1816:18;16287:35:0::1;1697:177:1::0;18524:447:0;8987:6;;-1:-1:-1;;;;;8987:6:0;4010:10;8987:22;8979:67;;;;-1:-1:-1;;;8979:67:0;;;;;;;:::i;:::-;18660:17:::1;:34:::0;;;18705:16:::1;:32:::0;;;18748:10:::1;:20:::0;;;18779:11:::1;:22:::0;;;18793:8;18761:7;18828:36:::1;18724:13:::0;18680:14;18828:36:::1;:::i;:::-;:49;;;;:::i;:::-;:63;;;;:::i;:::-;18812:13;:79:::0;;;18927:2:::1;-1:-1:-1::0;18910:19:0::1;18902:61;;;::::0;-1:-1:-1;;;18902:61:0;;6639:2:1;18902:61:0::1;::::0;::::1;6621:21:1::0;6678:2;6658:18;;;6651:30;6717:31;6697:18;;;6690:59;6766:18;;18902:61:0::1;6437:353:1::0;9232:244:0;8987:6;;-1:-1:-1;;;;;8987:6:0;4010:10;8987:22;8979:67;;;;-1:-1:-1;;;8979:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9321:22:0;::::1;9313:73;;;::::0;-1:-1:-1;;;9313:73:0;;12886:2:1;9313:73:0::1;::::0;::::1;12868:21:1::0;12925:2;12905:18;;;12898:30;12964:34;12944:18;;;12937:62;-1:-1:-1;;;13015:18:1;;;13008:36;13061:19;;9313:73:0::1;12684:402:1::0;9313:73:0::1;9423:6;::::0;9402:38:::1;::::0;-1:-1:-1;;;;;9402:38:0;;::::1;::::0;9423:6:::1;::::0;9402:38:::1;::::0;9423:6:::1;::::0;9402:38:::1;9451:6;:17:::0;;-1:-1:-1;;;;;;9451:17:0::1;-1:-1:-1::0;;;;;9451:17:0;;;::::1;::::0;;;::::1;::::0;;9232:244::o;27332:160::-;8987:6;;-1:-1:-1;;;;;8987:6:0;4010:10;8987:22;8979:67;;;;-1:-1:-1;;;8979:67:0;;;;;;;:::i;:::-;27426:58:::1;::::0;27390:12:::1;::::0;27434:10:::1;::::0;27458:21:::1;::::0;27390:12;27426:58;27390:12;27426:58;27458:21;27434:10;27426:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28355:571:::0;8987:6;;-1:-1:-1;;;;;8987:6:0;4010:10;8987:22;8979:67;;;;-1:-1:-1;;;8979:67:0;;;;;;;:::i;:::-;28452:8:::1;28437:11;:23;;28429:107;;;::::0;-1:-1:-1;;;28429:107:0;;13503:2:1;28429:107:0::1;::::0;::::1;13485:21:1::0;13542:2;13522:18;;;13515:30;13581:34;13561:18;;;13554:62;13652:34;13632:18;;;13625:62;-1:-1:-1;;;13703:19:1;;;13696:38;13751:19;;28429:107:0::1;13301:475:1::0;28429:107:0::1;28573:16;::::0;;28587:1:::1;28573:16:::0;;;;;::::1;::::0;;28549:21:::1;::::0;28573:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;28610:9:0::1;::::0;:16:::1;::::0;;-1:-1:-1;;;28610:16:0;;;;28549:40;;-1:-1:-1;;;;;;28610:9:0;;::::1;::::0;:14:::1;::::0;-1:-1:-1;28610:16:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:9;:16:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28600:4;28605:1;28600:7;;;;;;;;:::i;:::-;;;;;;:26;-1:-1:-1::0;;;;;28600:26:0::1;;;-1:-1:-1::0;;;;;28600:26:0::1;;;::::0;::::1;28655:4;28637;28642:1;28637:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;28637:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;28699:9:::1;::::0;:219:::1;::::0;-1:-1:-1;;;28699:219:0;;:9;::::1;::::0;:60:::1;::::0;28767:11;;28699:219:::1;::::0;:9:::1;::::0;28843:4;;28870:6:::1;::::0;28892:15:::1;::::0;28699:219:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;28418:508;28355:571:::0;:::o;8153:380::-;-1:-1:-1;;;;;8289:19:0;;8281:68;;;;-1:-1:-1;;;8281:68:0;;15484:2:1;8281:68:0;;;15466:21:1;15523:2;15503:18;;;15496:30;15562:34;15542:18;;;15535:62;-1:-1:-1;;;15613:18:1;;;15606:34;15657:19;;8281:68:0;15282:400:1;8281:68:0;-1:-1:-1;;;;;8368:21:0;;8360:68;;;;-1:-1:-1;;;8360:68:0;;15889:2:1;8360:68:0;;;15871:21:1;15928:2;15908:18;;;15901:30;15967:34;15947:18;;;15940:62;-1:-1:-1;;;16018:18:1;;;16011:32;16060:19;;8360:68:0;15687:398:1;8360:68:0;-1:-1:-1;;;;;8441:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;8493:32;;1843:25:1;;;8493:32:0;;1816:18:1;8493:32:0;;;;;;;;8153:380;;;:::o;19169:4864::-;-1:-1:-1;;;;;19269:18:0;;19261:68;;;;-1:-1:-1;;;19261:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19348:16:0;;19340:64;;;;-1:-1:-1;;;19340:64:0;;;;;;;:::i;:::-;19432:1;19423:6;:10;19415:52;;;;-1:-1:-1;;;19415:52:0;;17102:2:1;19415:52:0;;;17084:21:1;17141:2;17121:18;;;17114:30;17180:31;17160:18;;;17153:59;17229:18;;19415:52:0;16900:353:1;19415:52:0;19484:13;;;;;;;19480:132;;-1:-1:-1;;;;;19521:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;19550:23:0;;;;;;:19;:23;;;;;;;;19521:52;19513:87;;;;-1:-1:-1;;;19513:87:0;;17460:2:1;19513:87:0;;;17442:21:1;17499:2;17479:18;;;17472:30;-1:-1:-1;;;17518:18:1;;;17511:52;17580:18;;19513:87:0;17258:346:1;19513:87:0;19627:18;;:22;19624:196;;-1:-1:-1;;;;;19674:17:0;;;;;;:11;:17;;;;;;;;19673:18;;:35;;-1:-1:-1;8925:6:0;;-1:-1:-1;;;;;19695:13:0;;;8925:6;;19695:13;19673:35;:60;;;-1:-1:-1;;;;;;19712:21:0;;19726:6;19712:21;19673:60;19665:143;;;;-1:-1:-1;;;19665:143:0;;17811:2:1;19665:143:0;;;17793:21:1;17850:2;17830:18;;;17823:30;17889:34;17869:18;;;17862:62;17960:34;17940:18;;;17933:62;-1:-1:-1;;;18011:19:1;;;18004:37;18058:19;;19665:143:0;17609:474:1;19665:143:0;19835:14;;;;19832:1653;;;8925:6;;-1:-1:-1;;;;;19869:15:0;;;8925:6;;19869:15;;;;:32;;-1:-1:-1;8925:6:0;;-1:-1:-1;;;;;19888:13:0;;;8925:6;;19888:13;;19869:32;:52;;;;-1:-1:-1;;;;;;19905:16:0;;;;19869:52;:77;;;;-1:-1:-1;;;;;;19925:21:0;;19939:6;19925:21;;19869:77;:107;;;;-1:-1:-1;;;;;;19951:25:0;;;;;;:19;:25;;;;;;;;19950:26;19869:107;:135;;;;-1:-1:-1;;;;;;19981:23:0;;;;;;:19;:23;;;;;;;;19980:24;19869:135;19865:1609;;;20162:20;;;;20158:506;;;20224:9;;-1:-1:-1;;;;;20210:24:0;;;20224:9;;20210:24;;;;:49;;-1:-1:-1;20252:6:0;;-1:-1:-1;;;;;20238:21:0;;;20252:6;;20238:21;;20210:49;20206:439;;;20337:16;20352:1;20337:12;:16;:::i;:::-;20324:9;20295:39;;;;:28;:39;;;;;;:58;:113;;;;-1:-1:-1;20392:16:0;20407:1;20392:12;:16;:::i;:::-;-1:-1:-1;;;;;20357:32:0;;;;;;:28;:32;;;;;;:51;20295:113;20287:179;;;;-1:-1:-1;;;20287:179:0;;18423:2:1;20287:179:0;;;18405:21:1;18462:2;18442:18;;;18435:30;18501:34;18481:18;;;18474:62;-1:-1:-1;;;18552:18:1;;;18545:51;18613:19;;20287:179:0;18221:417:1;20287:179:0;20522:9;20493:39;;;;:28;:39;;;;;;20535:12;20493:54;;;;-1:-1:-1;;;;;20574:32:0;;;;;;:47;20206:439;-1:-1:-1;;;;;20720:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;20756:35:0;;;;;;:31;:35;;;;;;;;20755:36;20720:71;20716:743;;;20838:12;;20828:6;:22;;20820:75;;;;-1:-1:-1;;;20820:75:0;;18845:2:1;20820:75:0;;;18827:21:1;18884:2;18864:18;;;18857:30;18923:34;18903:18;;;18896:62;-1:-1:-1;;;18974:18:1;;;18967:38;19022:19;;20820:75:0;18643:404:1;20820:75:0;20956:15;;20939:13;20949:2;20939:9;:13::i;:::-;20930:22;;:6;:22;:::i;:::-;:41;;20922:78;;;;-1:-1:-1;;;20922:78:0;;19254:2:1;20922:78:0;;;19236:21:1;19293:2;19273:18;;;19266:30;-1:-1:-1;;;19312:18:1;;;19305:54;19376:18;;20922:78:0;19052:348:1;20922:78:0;20716:743;;;-1:-1:-1;;;;;21076:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;21110:37:0;;;;;;:31;:37;;;;;;;;21109:38;21076:71;21072:387;;;21194:13;;21184:6;:23;;21176:78;;;;-1:-1:-1;;;21176:78:0;;19607:2:1;21176:78:0;;;19589:21:1;19646:2;19626:18;;;19619:30;19685:34;19665:18;;;19658:62;-1:-1:-1;;;19736:18:1;;;19729:40;19786:19;;21176:78:0;19405:406:1;21072:387:0;-1:-1:-1;;;;;21302:35:0;;;;;;:31;:35;;;;;;;;21297:162;;21395:15;;21378:13;21388:2;21378:9;:13::i;:::-;21369:22;;:6;:22;:::i;:::-;:41;;21361:78;;;;-1:-1:-1;;;21361:78:0;;19254:2:1;21361:78:0;;;19236:21:1;19293:2;19273:18;;;19266:30;-1:-1:-1;;;19312:18:1;;;19305:54;19376:18;;21361:78:0;19052:348:1;21361:78:0;21497:28;21528:24;21546:4;21528:9;:24::i;:::-;21497:55;;21565:12;21604:18;;21580:20;:42;;:73;;;;;21635:18;;21626:6;:27;21580:73;21565:88;;21669:7;:22;;;;-1:-1:-1;21680:11:0;;;;;;;21669:22;:35;;;;-1:-1:-1;21696:8:0;;-1:-1:-1;;;21696:8:0;;;;21695:9;21669:35;:68;;;;-1:-1:-1;;;;;;21708:29:0;;;;;;:25;:29;;;;;;;;21669:68;:98;;;;-1:-1:-1;;;;;;21742:25:0;;;;;;:19;:25;;;;;;;;21741:26;21669:98;:126;;;;-1:-1:-1;;;;;;21772:23:0;;;;;;:19;:23;;;;;;;;21771:24;21669:126;21666:233;;;21812:8;:15;;-1:-1:-1;;;;21812:15:0;-1:-1:-1;;;21812:15:0;;;21844:10;:8;:10::i;:::-;21871:8;:16;;-1:-1:-1;;;;21871:16:0;;;21666:233;-1:-1:-1;;;;;22029:25:0;;21911:12;22029:25;;;:19;:25;;;;;;21926:4;;22029:25;;;:52;;-1:-1:-1;;;;;;22058:23:0;;;;;;:19;:23;;;;;;;;22029:52;22026:99;;;-1:-1:-1;22108:5:0;22026:99;22137:12;22241:7;22238:1742;;;24135:18;;24120:12;:33;22303:60;;;;-1:-1:-1;;;;;;22332:31:0;;;;;;:25;:31;;;;;;;;22303:60;:94;;;;-1:-1:-1;;;;;;22368:29:0;;;;;;:25;:29;;;;;;;;22367:30;22303:94;:114;;;;;22416:1;22401:12;;:16;22303:114;22300:1536;;;-1:-1:-1;;;;;22443:15:0;;;;;;:11;:15;;;;;;;;22439:123;;-1:-1:-1;;;;;22482:15:0;;;;;;:11;:15;;;;;:22;;-1:-1:-1;;22482:22:0;22500:4;22482:22;;;;;;22527:10;:15;;22500:4;;22527:10;;:15;;22500:4;;22527:15;:::i;:::-;;;;-1:-1:-1;;22439:123:0;22603:3;22589:11;:6;22598:2;22589:11;:::i;:::-;:17;;;;:::i;:::-;22582:24;;22669:12;;22651:15;;22644:4;:22;;;;:::i;:::-;:37;;;;:::i;:::-;22622:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;22749:12:0;;22730:16;;22723:23;;:4;:23;:::i;:::-;:38;;;;:::i;:::-;22700:19;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;22815:12:0;;22803:9;;22796:16;;:4;:16;:::i;:::-;:31;;;;:::i;:::-;22780:12;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;22883:12:0;;22870:10;;22863:17;;:4;:17;:::i;:::-;:32;;;;:::i;:::-;22846:13;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;22300:1536:0;;-1:-1:-1;22300:1536:0;;-1:-1:-1;;;;;22960:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;23009:1;22993:13;;:17;22960:50;22956:880;;;23062:3;23046:13;;23037:6;:22;;;;:::i;:::-;:28;;;;:::i;:::-;23030:35;;23132:13;;23113:16;;23106:4;:23;;;;:::i;:::-;:39;;;;:::i;:::-;23084:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;23214:13:0;;23194:17;;23187:24;;:4;:24;:::i;:::-;:40;;;;:::i;:::-;23164:19;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;23282:13:0;;23269:10;;23262:17;;:4;:17;:::i;:::-;:33;;;;:::i;:::-;23246:12;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;23352:13:0;;23338:11;;23331:18;;:4;:18;:::i;22956:880::-;-1:-1:-1;;;;;23428:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;23478:1;23463:12;;:16;23428:51;23425:411;;;23528:3;23513:12;;23504:6;:21;;;;:::i;:::-;:27;;;;:::i;:::-;23497:34;;23594:12;;23576:15;;23569:4;:22;;;;:::i;:::-;:37;;;;:::i;:::-;23547:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;23674:12:0;;23655:16;;23648:23;;:4;:23;:::i;:::-;:38;;;;:::i;:::-;23625:19;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;23740:12:0;;23728:9;;23721:16;;:4;:16;:::i;:::-;:31;;;;:::i;:::-;23705:12;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;23808:12:0;;23795:10;;23788:17;;:4;:17;:::i;:::-;:32;;;;:::i;:::-;23771:13;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;23425:411:0;23855:8;;23852:89;;23883:42;23899:4;23913;23920;23883:15;:42::i;:::-;23954:14;23964:4;23954:14;;:::i;:::-;;;22238:1742;23992:33;24008:4;24014:2;24018:6;23992:15;:33::i;25267:1593::-;25327:1;25311:13;;:17;:62;;;;;25360:13;;25332:24;25350:4;25332:9;:24::i;:::-;:41;;25311:62;25308:129;;;25390:35;25404:4;25411:13;;25390:5;:35::i;:::-;25463:1;25447:13;:17;;;25503:24;25521:4;25503:9;:24::i;:::-;25477:50;;25538:25;25609:12;;25587:19;;25566:18;;:40;;;;:::i;:::-;:55;;;;:::i;:::-;25538:83;-1:-1:-1;25637:20:0;;;:46;;-1:-1:-1;25661:22:0;;25637:46;25634:60;;;25686:7;;25267:1593::o;25634:60::-;25840:12;25914:23;25999:1;25979:17;25958:18;;25940:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;25914:86;-1:-1:-1;26013:51:0;26030:33;25914:86;26030:15;:33;:::i;:::-;26013:16;:51::i;:::-;26263:18;;26098:21;;;;26077:18;;26263:20;;26282:1;;26263:20;:::i;:::-;26242:42;;:17;:42;:::i;:::-;26219:19;;26206:32;;:10;:32;:::i;:::-;:79;;;;:::i;:::-;26179:106;;26296:17;26385:1;26366:18;;:20;;;;:::i;:::-;26345:42;;:17;:42;:::i;:::-;26329:12;;26316:25;;:10;:25;:::i;:::-;:72;;;;:::i;:::-;26296:92;-1:-1:-1;26420:28:0;26296:92;26420:16;:28;:::i;:::-;26401:47;;;;:::i;:::-;26482:1;26461:18;:22;;;26494:19;:23;;;26528:12;:16;;;26555:13;:17;26401:47;-1:-1:-1;26588:19:0;;;;;:42;;;26629:1;26611:15;:19;26588:42;26585:119;;;26646:46;26659:15;26676;26646:12;:46::i;:::-;26737:10;;26729:46;;-1:-1:-1;;;;;26737:10:0;;;;26761:9;;26729:46;;;;26761:9;26737:10;26729:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26794:17:0;;26786:58;;26716:59;;-1:-1:-1;;;;;;26794:17:0;;26822:21;26786:58;;;;;26794:17;26786:58;26794:17;26786:58;26822:21;26794:17;26786:58;;;;;;;;;;;;;;;;;;;;;25295:1565;;;;;;;;25267:1593::o;17832:240::-;-1:-1:-1;;;;;17915:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;17915:39:0;;;;;;;17967;17915:31;:39;17967:26;:39::i;6674:614::-;-1:-1:-1;;;;;6814:20:0;;6806:70;;;;-1:-1:-1;;;6806:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6895:23:0;;6887:71;;;;-1:-1:-1;;;6887:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6995:17:0;;6971:21;6995:17;;;;;;;;;;;7031:23;;;;7023:74;;;;-1:-1:-1;;;7023:74:0;;20018:2:1;7023:74:0;;;20000:21:1;20057:2;20037:18;;;20030:30;20096:34;20076:18;;;20069:62;-1:-1:-1;;;20147:18:1;;;20140:36;20193:19;;7023:74:0;19816:402:1;7023:74:0;-1:-1:-1;;;;;7133:17:0;;;:9;:17;;;;;;;;;;;7153:22;;;7133:42;;7197:20;;;;;;;;:30;;7169:6;;7133:9;7197:30;;7169:6;;7197:30;:::i;:::-;;;;;;;;7262:9;-1:-1:-1;;;;;7245:35:0;7254:6;-1:-1:-1;;;;;7245:35:0;;7273:6;7245:35;;;;1843:25:1;;1831:2;1816:18;;1697:177;7245:35:0;;;;;;;;6795:493;6674:614;;;:::o;7595:550::-;-1:-1:-1;;;;;7679:21:0;;7671:67;;;;-1:-1:-1;;;7671:67:0;;20425:2:1;7671:67:0;;;20407:21:1;20464:2;20444:18;;;20437:30;20503:34;20483:18;;;20476:62;-1:-1:-1;;;20554:18:1;;;20547:31;20595:19;;7671:67:0;20223:397:1;7671:67:0;-1:-1:-1;;;;;7774:18:0;;7749:22;7774:18;;;;;;;;;;;7811:24;;;;7803:71;;;;-1:-1:-1;;;7803:71:0;;20827:2:1;7803:71:0;;;20809:21:1;20866:2;20846:18;;;20839:30;20905:34;20885:18;;;20878:62;-1:-1:-1;;;20956:18:1;;;20949:32;20998:19;;7803:71:0;20625:398:1;7803:71:0;-1:-1:-1;;;;;7910:18:0;;:9;:18;;;;;;;;;;;7931:23;;;7910:44;;8049:12;:22;;;;;;;8100:37;1843:25:1;;;7910:9:0;;:18;8100:37;;1816:18:1;8100:37:0;1697:177:1;24169:573:0;24321:16;;;24335:1;24321:16;;;;;;;;24297:21;;24321:16;;;;;;;;;;-1:-1:-1;24321:16:0;24297:40;;24366:4;24348;24353:1;24348:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24348:23:0;;;:7;;;;;;;;;;:23;;;;24392:9;;:16;;;-1:-1:-1;;;24392:16:0;;;;:9;;;;;:14;;:16;;;;;24348:7;;24392:16;;;;;:9;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24382:4;24387:1;24382:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24382:26:0;;;:7;;;;;;;;;:26;24453:9;;24421:56;;24438:4;;24453:9;24465:11;24421:8;:56::i;:::-;24516:9;;:218;;-1:-1:-1;;;24516:218:0;;-1:-1:-1;;;;;24516:9:0;;;;:60;;:218;;24591:11;;24516:9;;24661:4;;24688;;24708:15;;24516:218;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24224:518;24169:573;:::o;24750:509::-;24930:9;;24898:56;;24915:4;;-1:-1:-1;;;;;24930:9:0;24942:11;24898:8;:56::i;:::-;24997:9;;:254;;-1:-1:-1;;;24997:254:0;;25063:4;24997:254;;;21956:34:1;22006:18;;;21999:34;;;24997:9:0;22049:18:1;;;22042:34;;;22092:18;;;22085:34;25203:6:0;22135:19:1;;;22128:44;25225:15:0;22188:19:1;;;22181:35;-1:-1:-1;;;;;24997:9:0;;;;:25;;25030:9;;21890:19:1;;24997:254:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;24750:509;;:::o;17046:207::-;-1:-1:-1;;;;;17134:39:0;;;;;;:31;:39;;;;;;;;;:52;;-1:-1:-1;;17134:52:0;;;;;;;;;;17202:43;;22706:51:1;;;22773:18;;;22766:50;17202:43:0;;22679:18:1;17202:43:0;;;;;;;17046:207;;:::o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;797:131::-;-1:-1:-1;;;;;872:31:1;;862:42;;852:70;;918:1;915;908:12;852:70;797:131;:::o;933:315::-;1001:6;1009;1062:2;1050:9;1041:7;1037:23;1033:32;1030:52;;;1078:1;1075;1068:12;1030:52;1117:9;1104:23;1136:31;1161:5;1136:31;:::i;:::-;1186:5;1238:2;1223:18;;;;1210:32;;-1:-1:-1;;;933:315:1:o;1445:247::-;1504:6;1557:2;1545:9;1536:7;1532:23;1528:32;1525:52;;;1573:1;1570;1563:12;1525:52;1612:9;1599:23;1631:31;1656:5;1631:31;:::i;:::-;1681:5;1445:247;-1:-1:-1;;;1445:247:1:o;1879:456::-;1956:6;1964;1972;2025:2;2013:9;2004:7;2000:23;1996:32;1993:52;;;2041:1;2038;2031:12;1993:52;2080:9;2067:23;2099:31;2124:5;2099:31;:::i;:::-;2149:5;-1:-1:-1;2206:2:1;2191:18;;2178:32;2219:33;2178:32;2219:33;:::i;:::-;1879:456;;2271:7;;-1:-1:-1;;;2325:2:1;2310:18;;;;2297:32;;1879:456::o;2340:180::-;2399:6;2452:2;2440:9;2431:7;2427:23;2423:32;2420:52;;;2468:1;2465;2458:12;2420:52;-1:-1:-1;2491:23:1;;2340:180;-1:-1:-1;2340:180:1:o;2525:385::-;2611:6;2619;2627;2635;2688:3;2676:9;2667:7;2663:23;2659:33;2656:53;;;2705:1;2702;2695:12;2656:53;-1:-1:-1;;2728:23:1;;;2798:2;2783:18;;2770:32;;-1:-1:-1;2849:2:1;2834:18;;2821:32;;2900:2;2885:18;2872:32;;-1:-1:-1;2525:385:1;-1:-1:-1;2525:385:1:o;3312:118::-;3398:5;3391:13;3384:21;3377:5;3374:32;3364:60;;3420:1;3417;3410:12;3435:382;3500:6;3508;3561:2;3549:9;3540:7;3536:23;3532:32;3529:52;;;3577:1;3574;3567:12;3529:52;3616:9;3603:23;3635:31;3660:5;3635:31;:::i;:::-;3685:5;-1:-1:-1;3742:2:1;3727:18;;3714:32;3755:30;3714:32;3755:30;:::i;:::-;3804:7;3794:17;;;3435:382;;;;;:::o;3822:388::-;3890:6;3898;3951:2;3939:9;3930:7;3926:23;3922:32;3919:52;;;3967:1;3964;3957:12;3919:52;4006:9;3993:23;4025:31;4050:5;4025:31;:::i;:::-;4075:5;-1:-1:-1;4132:2:1;4117:18;;4104:32;4145:33;4104:32;4145:33;:::i;4215:380::-;4294:1;4290:12;;;;4337;;;4358:61;;4412:4;4404:6;4400:17;4390:27;;4358:61;4465:2;4457:6;4454:14;4434:18;4431:38;4428:161;;4511:10;4506:3;4502:20;4499:1;4492:31;4546:4;4543:1;4536:15;4574:4;4571:1;4564:15;4428:161;;4215:380;;;:::o;5009:356::-;5211:2;5193:21;;;5230:18;;;5223:30;5289:34;5284:2;5269:18;;5262:62;5356:2;5341:18;;5009:356::o;5370:127::-;5431:10;5426:3;5422:20;5419:1;5412:31;5462:4;5459:1;5452:15;5486:4;5483:1;5476:15;5502:168;5575:9;;;5606;;5623:15;;;5617:22;;5603:37;5593:71;;5644:18;;:::i;5675:217::-;5715:1;5741;5731:132;;5785:10;5780:3;5776:20;5773:1;5766:31;5820:4;5817:1;5810:15;5848:4;5845:1;5838:15;5731:132;-1:-1:-1;5877:9:1;;5675:217::o;6307:125::-;6372:9;;;6393:10;;;6390:36;;;6406:18;;:::i;9107:184::-;9177:6;9230:2;9218:9;9209:7;9205:23;9201:32;9198:52;;;9246:1;9243;9236:12;9198:52;-1:-1:-1;9269:16:1;;9107:184;-1:-1:-1;9107:184:1:o;9575:245::-;9642:6;9695:2;9683:9;9674:7;9670:23;9666:32;9663:52;;;9711:1;9708;9701:12;9663:52;9743:9;9737:16;9762:28;9784:5;9762:28;:::i;13913:251::-;13983:6;14036:2;14024:9;14015:7;14011:23;14007:32;14004:52;;;14052:1;14049;14042:12;14004:52;14084:9;14078:16;14103:31;14128:5;14103:31;:::i;14169:127::-;14230:10;14225:3;14221:20;14218:1;14211:31;14261:4;14258:1;14251:15;14285:4;14282:1;14275:15;14301:461;14354:3;14392:5;14386:12;14419:6;14414:3;14407:19;14445:4;14474:2;14469:3;14465:12;14458:19;;14511:2;14504:5;14500:14;14532:1;14542:195;14556:6;14553:1;14550:13;14542:195;;;14621:13;;-1:-1:-1;;;;;14617:39:1;14605:52;;14677:12;;;;14712:15;;;;14653:1;14571:9;14542:195;;;-1:-1:-1;14753:3:1;;14301:461;-1:-1:-1;;;;;14301:461:1:o;14767:510::-;15038:6;15027:9;15020:25;15081:3;15076:2;15065:9;15061:18;15054:31;15001:4;15102:57;15154:3;15143:9;15139:19;15131:6;15102:57;:::i;:::-;-1:-1:-1;;;;;15195:32:1;;;;15190:2;15175:18;;15168:60;-1:-1:-1;15259:2:1;15244:18;15237:34;15094:65;14767:510;-1:-1:-1;;14767:510:1:o;16090:401::-;16292:2;16274:21;;;16331:2;16311:18;;;16304:30;16370:34;16365:2;16350:18;;16343:62;-1:-1:-1;;;16436:2:1;16421:18;;16414:35;16481:3;16466:19;;16090:401::o;16496:399::-;16698:2;16680:21;;;16737:2;16717:18;;;16710:30;16776:34;16771:2;16756:18;;16749:62;-1:-1:-1;;;16842:2:1;16827:18;;16820:33;16885:3;16870:19;;16496:399::o;18088:128::-;18155:9;;;18176:11;;;18173:37;;;18190:18;;:::i;21028:582::-;21327:6;21316:9;21309:25;21370:6;21365:2;21354:9;21350:18;21343:34;21413:3;21408:2;21397:9;21393:18;21386:31;21290:4;21434:57;21486:3;21475:9;21471:19;21463:6;21434:57;:::i;:::-;-1:-1:-1;;;;;21527:32:1;;;;21522:2;21507:18;;21500:60;-1:-1:-1;21591:3:1;21576:19;21569:35;21426:65;21028:582;-1:-1:-1;;;21028:582:1:o;22227:306::-;22315:6;22323;22331;22384:2;22372:9;22363:7;22359:23;22355:32;22352:52;;;22400:1;22397;22390:12;22352:52;22429:9;22423:16;22413:26;;22479:2;22468:9;22464:18;22458:25;22448:35;;22523:2;22512:9;22508:18;22502:25;22492:35;;22227:306;;;;;:::o

Swarm Source

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