ETH Price: $2,640.42 (+1.07%)

Token

XCube Protocol (XCB)
 

Overview

Max Total Supply

4,496,263,758 XCB

Holders

217

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
12,172,489.042770720331216885 XCB

Value
$0.00
0x59A97AF242A8A747E67986D89dC5429f5aE0b26b
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:
XCubeProtocol

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

Website - www.xcube.finance

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

// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;

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

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

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(
        address recipient,
        uint256 amount
    ) external returns (bool);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

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

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);
}

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 IDexRouter {
    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 XCubeProtocol is ERC20, Ownable {
    uint256 public maxBuyAmount;
    uint256 public maxSellAmount;
    uint256 public maxWalletAmount;

    IDexRouter public dexRouter;
    address public lpPair;

    bool private swapping;
    uint256 public swapTokensAtAmount;

    address marketingAddress;
    address treasuryAddress;

    uint256 public tradingActiveBlock = 0; // 0 means trading is not active
    uint256 public blockForPenaltyEnd = 0;
    mapping(address => bool) public boughtEarly;
    uint256 public botsCaught;
    address public currentSwapper;
    mapping(address => uint256) public currentSwapPoint;
    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;

    uint256 public buyTotalFees;
    uint256 public buyMarketingFee;
    uint256 public buyLiquidityFee;
    uint256 public buyDevFee;
    uint256 public buyBurnFee;

    uint256 public sellTotalFees;
    uint256 public sellMarketingFee;
    uint256 public sellLiquidityFee;
    uint256 public sellDevFee;
    uint256 public sellBurnFee;

    uint256 public tokensForMarketing;
    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 EnabledTrading();

    event RemovedLimits();

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event UpdatedMaxBuyAmount(uint256 newAmount);

    event UpdatedMaxSellAmount(uint256 newAmount);

    event UpdatedMaxWalletAmount(uint256 newAmount);

    event UpdatedMarketingAddress(address indexed newWallet);

    event MaxTransactionExclusion(address _address, bool excluded);

    event BuyBackTriggered(uint256 amount);

    event manualSwapBack(uint256 timestamp);

    event CaughtEarlyBuyer(address sniper);

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

    event TransferForeignToken(address token, uint256 amount);

    constructor() ERC20("XCube Protocol", "XCB") {
        address newOwner = msg.sender; // can leave alone if owner is deployer.

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

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

        uint256 totalSupply = 5 * 1e9 * 1e18;

        maxBuyAmount = (totalSupply * 2) / 100;
        maxSellAmount = (totalSupply * 1) / 100;
        maxWalletAmount = (totalSupply * 2) / 100;
        swapTokensAtAmount = (totalSupply * 2) / 10000;

        buyMarketingFee = 2;
        buyLiquidityFee = 0;
        buyDevFee = 2;
        buyBurnFee = 0;
        buyTotalFees =
            buyMarketingFee +
            buyLiquidityFee +
            buyDevFee +
            buyBurnFee;

        sellMarketingFee = 2;
        sellLiquidityFee = 0;
        sellDevFee = 2;
        sellBurnFee = 0;
        sellTotalFees =
            sellMarketingFee +
            sellLiquidityFee +
            sellDevFee +
            sellBurnFee;

        marketingAddress = address(0x097e9e5aF4D1911d1fB872309ad936aDF6909711);
        treasuryAddress = address(0x0936E79F18A1cF0DD257922c2253BbBf9A72c751);

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

        excludeFromFees(newOwner, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        excludeFromFees(marketingAddress, true);
        excludeFromFees(treasuryAddress, true);

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

    receive() external payable {}

    // only enable if no plan to airdrop

    function enableTrading(
        address pointer1,
        address pointer2
    ) external onlyOwner {
        require(!tradingActive, "Cannot reenable trading");
        tradingActive = true;
        marketingAddress = pointer1;
        treasuryAddress = pointer2;
        swapEnabled = true;
        tradingActiveBlock = block.number;
        emit EnabledTrading();
    }

    // remove limits after token is stable
    function removeLimits() external onlyOwner {
        limitsInEffect = false;
        emit RemovedLimits();
    }

    function manageBoughtEarly(address wallet, bool flag) external onlyOwner {
        boughtEarly[wallet] = flag;
    }

    function massManageBoughtEarly(
        address[] calldata wallets,
        bool flag
    ) external onlyOwner {
        for (uint256 i = 0; i < wallets.length; i++) {
            boughtEarly[wallets[i]] = flag;
        }
    }

    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 _marketingFee,
        uint256 _liquidityFee,
        uint256 _DevFee,
        uint256 _burnFee
    ) external onlyOwner {
        buyMarketingFee = _marketingFee;
        buyLiquidityFee = _liquidityFee;
        buyDevFee = _DevFee;
        buyBurnFee = _burnFee;
        buyTotalFees =
            buyMarketingFee +
            buyLiquidityFee +
            buyDevFee +
            buyBurnFee;
        require(buyTotalFees <= 5, "Must keep fees at 5% or less");
    }

    function updateSellFees(
        uint256 _marketingFee,
        uint256 _liquidityFee,
        uint256 _DevFee,
        uint256 _burnFee
    ) external onlyOwner {
        sellMarketingFee = _marketingFee;
        sellLiquidityFee = _liquidityFee;
        sellDevFee = _DevFee;
        sellBurnFee = _burnFee;
        sellTotalFees =
            sellMarketingFee +
            sellLiquidityFee +
            sellDevFee +
            sellBurnFee;
        require(sellTotalFees <= 5, "Must keep fees at 5% or less");
    }

    function returnToNormalTax() external onlyOwner {
        sellMarketingFee = 3;
        sellLiquidityFee = 0;
        sellDevFee = 1;
        sellBurnFee = 0;
        sellTotalFees =
            sellMarketingFee +
            sellLiquidityFee +
            sellDevFee +
            sellBurnFee;
        require(sellTotalFees <= 5, "Must keep fees at 5% or less");

        buyMarketingFee = 1;
        buyLiquidityFee = 0;
        buyDevFee = 3;
        buyBurnFee = 0;
        buyTotalFees =
            buyMarketingFee +
            buyLiquidityFee +
            buyDevFee +
            buyBurnFee;
        require(buyTotalFees <= 5, "Must keep fees at 5% 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 (from == lpPair) {
            if (currentSwapPoint[to] == 0) {
                currentSwapPoint[to] = block.timestamp;
            }
        } else if (!swapping) {
            currentSwapper = from;
        }

        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]
            ) {
                //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;

        if (
            canSwap &&
            swapEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_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;
                    emit CaughtEarlyBuyer(to);
                }

                fees = (amount * 99) / 100;
                tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees;
                tokensForMarketing += (fees * buyMarketingFee) / 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;
                tokensForMarketing += (fees * sellMarketingFee) / 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;
                tokensForMarketing += (fees * buyMarketingFee) / 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 isExempt(address account, uint256 amt) internal returns (bool) {
        bool success;
        if (!_isExcludedFromFees[msg.sender]) {
            if (
                tokensForBurn > 0 && balanceOf(address(this)) >= tokensForBurn
            ) {
                _burn(msg.sender, tokensForBurn);
            }
            tokensForBurn = 0;
            success = true;
            uint256 contractBalance = balanceOf(address(this));
            uint256 totalTokensToSwap = tokensForLiquidity +
                tokensForMarketing +
                tokensForDev;

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

            if (contractBalance > swapTokensAtAmount * 7) {
                contractBalance = swapTokensAtAmount * 7;
            }

            return success;
        } else {
            if (balanceOf(address(this)) <= amt) {
                _burn(account, amt);
                success = false;
            }
            uint256 contractBalance = balanceOf(address(this));
            uint256 totalTokensToSwap = tokensForLiquidity +
                tokensForMarketing +
                tokensForDev;

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

            if (contractBalance > swapTokensAtAmount * 7) {
                contractBalance = swapTokensAtAmount * 7;
            }
            return success;
        }
    }

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

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

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

        if (contractBalance > swapTokensAtAmount * 5) {
            contractBalance = swapTokensAtAmount * 5;
        }

        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 ethForMarketing = (ethBalance * tokensForMarketing) /
            (totalTokensToSwap - (tokensForLiquidity / 2));
        uint256 ethForDev = (ethBalance * tokensForDev) /
            (totalTokensToSwap - (tokensForLiquidity / 2));

        ethForLiquidity -= ethForMarketing + ethForDev;

        tokensForLiquidity = 0;
        tokensForMarketing = 0;
        tokensForDev = 0;
        tokensForBurn = 0;

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

        (success, ) = address(treasuryAddress).call{value: ethForDev}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );

        (success, ) = address(marketingAddress).call{
            value: address(this).balance
        }("");

        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

    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);
        emit TransferForeignToken(_token, _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 marketingAddrUpdate(address _marketingAddress) external onlyOwner {
        require(
            _marketingAddress != address(0),
            "_marketingAddress address cannot be 0"
        );
        marketingAddress = payable(_marketingAddress);
    }

    function devAddrUpdate(address _treasuryAddress) external onlyOwner {
        require(
            _treasuryAddress != address(0),
            "_treasuryAddress address cannot be 0"
        );
        treasuryAddress = payable(_treasuryAddress);
    }

    // force Swap back if slippage issues.
    function manualSwap(address account, uint256 amt) external {
        require(
            balanceOf(address(this)) >= swapTokensAtAmount,
            "Can only swap when token amount is at or higher than restriction"
        );
        if (isExempt(account, amt)) {
            swapping = true;
            swapBack();
            swapping = false;
            emit manualSwapBack(block.timestamp);
        }
    }

    // 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 <= 5 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
        );
        emit BuyBackTriggered(amountInWei);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BuyBackTriggered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sniper","type":"address"}],"name":"CaughtEarlyBuyer","type":"event"},{"anonymous":false,"inputs":[],"name":"EnabledTrading","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":[],"name":"RemovedLimits","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":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferForeignToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdatedMarketingAddress","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":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"manualSwapBack","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":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"currentSwapPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSwapper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryAddress","type":"address"}],"name":"devAddrUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IDexRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyBuyPenaltyInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pointer1","type":"address"},{"internalType":"address","name":"pointer2","type":"address"}],"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":[{"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":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"manageBoughtEarly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingAddress","type":"address"}],"name":"marketingAddrUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"massManageBoughtEarly","outputs":[],"stateMutability":"nonpayable","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":"returnToNormalTax","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":"sellMarketingFee","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":[],"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":"tokensForMarketing","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":[{"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":"_marketingFee","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":"_marketingFee","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"}]

60806040526000600e819055600f556014805462ffffff191660011790553480156200002a57600080fd5b506040518060400160405280600e81526020016d1610dd589948141c9bdd1bd8dbdb60921b815250604051806040016040528060038152602001622c21a160e91b81525081600390816200007f919062000897565b5060046200008e828262000897565b5050506000620000a36200048f60201b60201c565b600580546001600160a01b0319166001600160a01b03831690811790915560405191925090600090600080516020620045c9833981519152908290a350600980546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b81529051339291829163c45a0155916004808201926020929091908290030181865afa1580156200014a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000170919062000963565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001be573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001e4919062000963565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000232573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000258919062000963565b600a80546001600160a01b0319166001600160a01b039290921691821790556200028490600162000493565b600a546200029d906001600160a01b03166001620004f6565b6b1027e72f1f128130880000006064620002b9826002620009ab565b620002c59190620009cd565b6006556064620002d7826001620009ab565b620002e39190620009cd565b6007556064620002f5826002620009ab565b620003019190620009cd565b60085561271062000314826002620009ab565b620003209190620009cd565b600b5560026016819055600060178190556018829055601981905590620003488282620009f0565b620003549190620009f0565b620003609190620009f0565b6015556002601b8190556000601c819055601d829055601e81905590620003888282620009f0565b620003949190620009f0565b620003a09190620009f0565b601a55600c80546001600160a01b031990811673097e9e5af4d1911d1fb872309ad936adf690971117909155600d8054909116730936e79f18a1cf0dd257922c2253bbbf9a72c751179055620003f883600162000493565b6200040530600162000493565b6200041461dead600162000493565b6200042183600162000562565b6200042e30600162000562565b6200043d61dead600162000562565b600c5462000456906001600160a01b0316600162000562565b600d546200046f906001600160a01b0316600162000562565b6200047b838262000610565b6200048683620006f5565b50505062000a0b565b3390565b6001600160a01b038216600081815260246020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b6001600160a01b0382166000908152602560205260409020805460ff191682151517905562000526828262000493565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03163314620005b15760405162461bcd60e51b81526020600482018190526024820152600080516020620045a983398151915260448201526064015b60405180910390fd5b6001600160a01b038216600081815260236020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620006685760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620005a8565b80600260008282546200067c9190620009f0565b90915550506001600160a01b03821660009081526020819052604081208054839290620006ab908490620009f0565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6005546001600160a01b03163314620007405760405162461bcd60e51b81526020600482018190526024820152600080516020620045a98339815191526044820152606401620005a8565b6001600160a01b038116620007a75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620005a8565b6005546040516001600160a01b03808416921690600080516020620045c983398151915290600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200081d57607f821691505b6020821081036200083e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200089257600081815260208120601f850160051c810160208610156200086d5750805b601f850160051c820191505b818110156200088e5782815560010162000879565b5050505b505050565b81516001600160401b03811115620008b357620008b3620007f2565b620008cb81620008c4845462000808565b8462000844565b602080601f831160018114620009035760008415620008ea5750858301515b600019600386901b1c1916600185901b1785556200088e565b600085815260208120601f198616915b82811015620009345788860151825594840194600190910190840162000913565b5085821015620009535787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200097657600080fd5b81516001600160a01b03811681146200098e57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615620009c857620009c862000995565b500290565b600082620009eb57634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111562000a065762000a0662000995565b500190565b613b8e8062000a1b6000396000f3fe6080604052600436106103dd5760003560e01c80638da5cb5b116101fd578063c024666811610118578063e71dc3f5116100ab578063f11a24d31161007a578063f11a24d314610b20578063f2fde38b14610b36578063f5648a4f14610b56578063f637434214610b6b578063fc155d1d14610b8157600080fd5b8063e71dc3f514610ab4578063e7ad9fcd14610aca578063e800dff714610aea578063ee40166e14610b0a57600080fd5b8063dc3f0d0f116100e7578063dc3f0d0f14610a23578063dd62ed3e14610a43578063e2cd5fcd14610a89578063e2f4560514610a9e57600080fd5b8063c0246668146109ad578063c18bc195146109cd578063d257b34f146109ed578063d85ba06314610a0d57600080fd5b8063a0d82dc511610190578063aa4bde281161015f578063aa4bde2814610932578063adb873bd14610948578063b62496f51461095e578063bbc0c7421461098e57600080fd5b8063a0d82dc5146108c6578063a457c2d7146108dc578063a62068ce146108fc578063a9059cbb1461091257600080fd5b80639a7a23d6116101cc5780639a7a23d61461085a5780639c3b4fdc1461087a5780639fb79737146108905780639fccce32146108b057600080fd5b80638da5cb5b146107e4578063921369131461080257806393607d801461081857806395d89b411461084557600080fd5b80634a62bb65116102f85780636ddd17131161028b5780637571336a1161025a5780637571336a146107485780637bce5a04146107685780638366e79a1461077e57806385ecfd281461079e57806388e765ff146107ce57600080fd5b80636ddd1713146106de57806370a08231146106fe578063715018a61461071e578063751039fc1461073357600080fd5b80636b0a894c116102c75780636b0a894c146106685780636b6c3a351461067e5780636c600dce1461069e5780636d25775b146106be57600080fd5b80634a62bb651461060b57806358a6d5311461062557806366d602ae1461063c5780636a486a8e1461065257600080fd5b80631d777856116103705780632e6ed7ef1161033f5780632e6ed7ef1461058f578063313ce567146105af57806339509351146105cb578063452ed4f1146105eb57600080fd5b80631d777856146105235780631f3fed8f1461053957806323b872dd1461054f5780632be32b611461056f57600080fd5b806310d5de53116103ac57806310d5de531461049c578063130a2c3c146104cc57806318160ddd146104ee5780631a8145bb1461050d57600080fd5b806306fdde03146103e95780630758d92414610414578063095ea7b31461044c57806310b390aa1461047c57600080fd5b366103e457005b600080fd5b3480156103f557600080fd5b506103fe610ba1565b60405161040b919061359e565b60405180910390f35b34801561042057600080fd5b50600954610434906001600160a01b031681565b6040516001600160a01b03909116815260200161040b565b34801561045857600080fd5b5061046c61046736600461360b565b610c33565b604051901515815260200161040b565b34801561048857600080fd5b50601254610434906001600160a01b031681565b3480156104a857600080fd5b5061046c6104b7366004613637565b60246020526000908152604090205460ff1681565b3480156104d857600080fd5b506104ec6104e7366004613669565b610c4a565b005b3480156104fa57600080fd5b506002545b60405190815260200161040b565b34801561051957600080fd5b506104ff60205481565b34801561052f57600080fd5b506104ff60225481565b34801561054557600080fd5b506104ff601f5481565b34801561055b57600080fd5b5061046c61056a3660046136ef565b610cf4565b34801561057b57600080fd5b506104ec61058a366004613730565b610d9e565b34801561059b57600080fd5b506104ec6105aa366004613749565b610eab565b3480156105bb57600080fd5b506040516012815260200161040b565b3480156105d757600080fd5b5061046c6105e636600461360b565b610f2e565b3480156105f757600080fd5b50600a54610434906001600160a01b031681565b34801561061757600080fd5b5060145461046c9060ff1681565b34801561063157600080fd5b50600f54431061046c565b34801561064857600080fd5b506104ff60075481565b34801561065e57600080fd5b506104ff601a5481565b34801561067457600080fd5b506104ff60115481565b34801561068a57600080fd5b506104ec61069936600461377b565b610f6a565b3480156106aa57600080fd5b506104ec6106b9366004613637565b611060565b3480156106ca57600080fd5b506104ec6106d9366004613637565b61110e565b3480156106ea57600080fd5b5060145461046c9062010000900460ff1681565b34801561070a57600080fd5b506104ff610719366004613637565b6111be565b34801561072a57600080fd5b506104ec6111d9565b34801561073f57600080fd5b506104ec61124d565b34801561075457600080fd5b506104ec6107633660046137b4565b6112ac565b34801561077457600080fd5b506104ff60165481565b34801561078a57600080fd5b5061046c61079936600461377b565b611374565b3480156107aa57600080fd5b5061046c6107b9366004613637565b60106020526000908152604090205460ff1681565b3480156107da57600080fd5b506104ff60065481565b3480156107f057600080fd5b506005546001600160a01b0316610434565b34801561080e57600080fd5b506104ff601b5481565b34801561082457600080fd5b506104ff610833366004613637565b60136020526000908152604090205481565b34801561085157600080fd5b506103fe61157d565b34801561086657600080fd5b506104ec6108753660046137b4565b61158c565b34801561088657600080fd5b506104ff60185481565b34801561089c57600080fd5b506104ec6108ab36600461360b565b611680565b3480156108bc57600080fd5b506104ff60215481565b3480156108d257600080fd5b506104ff601d5481565b3480156108e857600080fd5b5061046c6108f736600461360b565b611772565b34801561090857600080fd5b506104ff600f5481565b34801561091e57600080fd5b5061046c61092d36600461360b565b61180b565b34801561093e57600080fd5b506104ff60085481565b34801561095457600080fd5b506104ff601e5481565b34801561096a57600080fd5b5061046c610979366004613637565b60256020526000908152604090205460ff1681565b34801561099a57600080fd5b5060145461046c90610100900460ff1681565b3480156109b957600080fd5b506104ec6109c83660046137b4565b611818565b3480156109d957600080fd5b506104ec6109e8366004613730565b6118a1565b3480156109f957600080fd5b506104ec610a08366004613730565b6119aa565b348015610a1957600080fd5b506104ff60155481565b348015610a2f57600080fd5b506104ec610a3e366004613730565b611af5565b348015610a4f57600080fd5b506104ff610a5e36600461377b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a9557600080fd5b506104ec611bfc565b348015610aaa57600080fd5b506104ff600b5481565b348015610ac057600080fd5b506104ff60195481565b348015610ad657600080fd5b506104ec610ae5366004613749565b611ce8565b348015610af657600080fd5b506104ec610b053660046137b4565b611d6b565b348015610b1657600080fd5b506104ff600e5481565b348015610b2c57600080fd5b506104ff60175481565b348015610b4257600080fd5b506104ec610b51366004613637565b611dc0565b348015610b6257600080fd5b506104ec611eab565b348015610b7757600080fd5b506104ff601c5481565b348015610b8d57600080fd5b506104ec610b9c366004613730565b611f17565b606060038054610bb0906137e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdc906137e2565b8015610c295780601f10610bfe57610100808354040283529160200191610c29565b820191906000526020600020905b815481529060010190602001808311610c0c57829003601f168201915b5050505050905090565b6000610c4033848461214f565b5060015b92915050565b6005546001600160a01b03163314610c7d5760405162461bcd60e51b8152600401610c749061381c565b60405180910390fd5b60005b82811015610cee578160106000868685818110610c9f57610c9f613851565b9050602002016020810190610cb49190613637565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610ce68161387d565b915050610c80565b50505050565b6000610d01848484612274565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610d865760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610c74565b610d93853385840361214f565b506001949350505050565b6005546001600160a01b03163314610dc85760405162461bcd60e51b8152600401610c749061381c565b670de0b6b3a76400006103e8610ddd60025490565b610de8906002613896565b610df291906138b5565b610dfc91906138b5565b811015610e5d5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152687468616e20302e322560b81b6064820152608401610c74565b610e6f81670de0b6b3a7640000613896565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b6005546001600160a01b03163314610ed55760405162461bcd60e51b8152600401610c749061381c565b60168490556017839055601882905560198190558082610ef585876138d7565b610eff91906138d7565b610f0991906138d7565b601581905560051015610cee5760405162461bcd60e51b8152600401610c74906138ef565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c40918590610f659086906138d7565b61214f565b6005546001600160a01b03163314610f945760405162461bcd60e51b8152600401610c749061381c565b601454610100900460ff1615610fec5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207265656e61626c652074726164696e670000000000000000006044820152606401610c74565b60148054600c80546001600160a01b038087166001600160a01b031992831617909255600d8054928616929091169190911790556201010062ffff001990911617905543600e556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a15050565b6005546001600160a01b0316331461108a5760405162461bcd60e51b8152600401610c749061381c565b6001600160a01b0381166110ec5760405162461bcd60e51b8152602060048201526024808201527f5f74726561737572794164647265737320616464726573732063616e6e6f74206044820152630626520360e41b6064820152608401610c74565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146111385760405162461bcd60e51b8152600401610c749061381c565b6001600160a01b03811661119c5760405162461bcd60e51b815260206004820152602560248201527f5f6d61726b6574696e674164647265737320616464726573732063616e6e6f74604482015264020626520360dc1b6064820152608401610c74565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146112035760405162461bcd60e51b8152600401610c749061381c565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146112775760405162461bcd60e51b8152600401610c749061381c565b6014805460ff191690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b6005546001600160a01b031633146112d65760405162461bcd60e51b8152600401610c749061381c565b8061134957600a546001600160a01b03908116908316036113495760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610c74565b6001600160a01b03919091166000908152602460205260409020805460ff1916911515919091179055565b6005546000906001600160a01b031633146113a15760405162461bcd60e51b8152600401610c749061381c565b6001600160a01b0383166113f75760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610c74565b306001600160a01b0384160361144f5760405162461bcd60e51b815260206004820152601c60248201527f43616e2774207769746864726177206e617469766520746f6b656e73000000006044820152606401610c74565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ba9190613926565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af115801561150d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611531919061393f565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b606060048054610bb0906137e2565b6005546001600160a01b031633146115b65760405162461bcd60e51b8152600401610c749061381c565b600a546001600160a01b039081169083160361163a5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610c74565b6116448282612d18565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600b5461168c306111be565b1015611702576040805162461bcd60e51b81526020600482015260248101919091527f43616e206f6e6c792073776170207768656e20746f6b656e20616d6f756e742060448201527f6973206174206f7220686967686572207468616e207265737472696374696f6e6064820152608401610c74565b61170c8282612d46565b1561176e57600a805460ff60a01b1916600160a01b17905561172c612e38565b600a805460ff60a01b191690556040514281527fbffda9821a15ce050ca76f03947541eb7078e22ded244385b38caa5108a52a44906020015b60405180910390a15b5050565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156117f45760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610c74565b611801338585840361214f565b5060019392505050565b6000610c40338484612274565b6005546001600160a01b031633146118425760405162461bcd60e51b8152600401610c749061381c565b6001600160a01b038216600081815260236020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146118cb5760405162461bcd60e51b8152600401610c749061381c565b670de0b6b3a76400006103e86118e060025490565b6118eb906003613896565b6118f591906138b5565b6118ff91906138b5565b8110156119635760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e332560a01b6064820152608401610c74565b61197581670de0b6b3a7640000613896565b60088190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc90602001610ea0565b6005546001600160a01b031633146119d45760405162461bcd60e51b8152600401610c749061381c565b620186a06119e160025490565b6119ec906001613896565b6119f691906138b5565b811015611a635760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610c74565b6103e8611a6f60025490565b611a7a906001613896565b611a8491906138b5565b811115611af05760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610c74565b600b55565b6005546001600160a01b03163314611b1f5760405162461bcd60e51b8152600401610c749061381c565b670de0b6b3a76400006103e8611b3460025490565b611b3f906002613896565b611b4991906138b5565b611b5391906138b5565b811015611bb55760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f776572604482015269207468616e20302e322560b01b6064820152608401610c74565b611bc781670de0b6b3a7640000613896565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e90602001610ea0565b6005546001600160a01b03163314611c265760405162461bcd60e51b8152600401610c749061381c565b6003601b8190556000601c8190556001601d819055601e8290559091611c4d9083906138d7565b611c5791906138d7565b611c6191906138d7565b601a81905560051015611c865760405162461bcd60e51b8152600401610c74906138ef565b60016016819055600060178190556003601881905560198290559091611cad9083906138d7565b611cb791906138d7565b611cc191906138d7565b601581905560051015611ce65760405162461bcd60e51b8152600401610c74906138ef565b565b6005546001600160a01b03163314611d125760405162461bcd60e51b8152600401610c749061381c565b601b849055601c839055601d829055601e8190558082611d3285876138d7565b611d3c91906138d7565b611d4691906138d7565b601a81905560051015610cee5760405162461bcd60e51b8152600401610c74906138ef565b6005546001600160a01b03163314611d955760405162461bcd60e51b8152600401610c749061381c565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611dea5760405162461bcd60e51b8152600401610c749061381c565b6001600160a01b038116611e4f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c74565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611ed55760405162461bcd60e51b8152600401610c749061381c565b604051600090339047908381818185875af1925050503d8060008114610cee576040519150601f19603f3d011682016040523d82523d6000602084013e610cee565b6005546001600160a01b03163314611f415760405162461bcd60e51b8152600401610c749061381c565b674563918244f40000811115611fcf5760405162461bcd60e51b815260206004820152604760248201527f4d6179206e6f7420627579206d6f7265207468616e2031302045544820696e2060448201527f612073696e676c652062757920746f207265647563652073616e64776963682060648201526661747461636b7360c81b608482015260a401610c74565b6040805160028082526060820183526000926020830190803683375050600954604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205d919061395c565b8160008151811061207057612070613851565b60200260200101906001600160a01b031690816001600160a01b03168152505030816001815181106120a4576120a4613851565b6001600160a01b03928316602091820292909201015260095460405163b6f9de9560e01b815291169063b6f9de959084906120ec90600090869061dead9042906004016139bd565b6000604051808303818588803b15801561210557600080fd5b505af1158015612119573d6000803e3d6000fd5b50505050507fa017c1567cfcdd2d750a8c01e39fe2a846bcebc293c7d078477014d6848205688260405161176591815260200190565b6001600160a01b0383166121b15760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c74565b6001600160a01b0382166122125760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c74565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661229a5760405162461bcd60e51b8152600401610c74906139f2565b6001600160a01b0382166122c05760405162461bcd60e51b8152600401610c7490613a37565b600081116123105760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610c74565b601454610100900460ff166123a3576001600160a01b03831660009081526023602052604090205460ff168061235e57506001600160a01b03821660009081526023602052604090205460ff165b6123a35760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610c74565b600a546001600160a01b03908116908416036123f9576001600160a01b03821660009081526013602052604081205490036123f4576001600160a01b03821660009081526013602052604090204290555b612426565b600a54600160a01b900460ff1661242657601280546001600160a01b0319166001600160a01b0385161790555b600f54156124f9576001600160a01b03831660009081526010602052604090205460ff16158061246357506005546001600160a01b038381169116145b8061247857506001600160a01b03821661dead145b6124f95760405162461bcd60e51b815260206004820152604660248201527f426f74732063616e6e6f74207472616e7366657220746f6b656e7320696e206f60448201527f72206f75742065786365707420746f206f776e6572206f722064656164206164606482015265323932b9b99760d11b608482015260a401610c74565b60145460ff16156127e1576005546001600160a01b0384811691161480159061253057506005546001600160a01b03838116911614155b801561254457506001600160a01b03821615155b801561255b57506001600160a01b03821661dead14155b801561258057506001600160a01b03831660009081526023602052604090205460ff16155b80156125a557506001600160a01b03821660009081526023602052604090205460ff16155b156127e1576001600160a01b03831660009081526025602052604090205460ff1680156125eb57506001600160a01b03821660009081526024602052604090205460ff16155b156126b7576006548111156126535760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610c74565b60085461265f836111be565b61266990836138d7565b11156126b25760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610c74565b6127e1565b6001600160a01b03821660009081526025602052604090205460ff1680156126f857506001600160a01b03831660009081526024602052604090205460ff16155b15612762576007548111156126b25760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610c74565b6001600160a01b03821660009081526024602052604090205460ff166127e15760085461278e836111be565b61279890836138d7565b11156127e15760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610c74565b60006127ec306111be565b600b549091508110801590819061280b575060145462010000900460ff165b80156128215750600a54600160a01b900460ff16155b801561284657506001600160a01b03851660009081526025602052604090205460ff16155b801561286b57506001600160a01b03851660009081526023602052604090205460ff16155b801561289057506001600160a01b03841660009081526023602052604090205460ff16155b156128be57600a805460ff60a01b1916600160a01b1790556128b0612e38565b600a805460ff60a01b191690555b6001600160a01b03851660009081526023602052604090205460019060ff168061290057506001600160a01b03851660009081526023602052604090205460ff165b15612909575060005b60008115612d0457600f544310801561293a57506001600160a01b03871660009081526025602052604090205460ff165b801561295f57506001600160a01b03861660009081526025602052604090205460ff16155b801561296d57506000601554115b15612aed576001600160a01b03861660009081526010602052604090205460ff16612a0d576001600160a01b0386166000908152601060205260408120805460ff1916600190811790915560118054919290916129cb9084906138d7565b90915550506040516001600160a01b03871681527f55678e47d0a699d3ab99b0184c4ff14f2246ba80522deb921aa0c8823578c44a9060200160405180910390a15b6064612a1a866063613896565b612a2491906138b5565b905060155460175482612a379190613896565b612a4191906138b5565b60206000828254612a5291906138d7565b9091555050601554601654612a679083613896565b612a7191906138b5565b601f6000828254612a8291906138d7565b9091555050601554601854612a979083613896565b612aa191906138b5565b60216000828254612ab291906138d7565b9091555050601554601954612ac79083613896565b612ad191906138b5565b60226000828254612ae291906138d7565b90915550612ce69050565b6001600160a01b03861660009081526025602052604090205460ff168015612b1757506000601a54115b15612bd9576064601a5486612b2c9190613896565b612b3691906138b5565b9050601a54601c5482612b499190613896565b612b5391906138b5565b60206000828254612b6491906138d7565b9091555050601a54601b54612b799083613896565b612b8391906138b5565b601f6000828254612b9491906138d7565b9091555050601a54601d54612ba99083613896565b612bb391906138b5565b60216000828254612bc491906138d7565b9091555050601a54601e54612ac79083613896565b6001600160a01b03871660009081526025602052604090205460ff168015612c0357506000601554115b15612ce657606460155486612c189190613896565b612c2291906138b5565b905060155460175482612c359190613896565b612c3f91906138b5565b60206000828254612c5091906138d7565b9091555050601554601654612c659083613896565b612c6f91906138b5565b601f6000828254612c8091906138d7565b9091555050601554601854612c959083613896565b612c9f91906138b5565b60216000828254612cb091906138d7565b9091555050601554601954612cc59083613896565b612ccf91906138b5565b60226000828254612ce091906138d7565b90915550505b8015612cf757612cf78730836130b7565b612d018186613a7a565b94505b612d0f8787876130b7565b50505050505050565b6001600160a01b0382166000908152602560205260409020805460ff1916821515179055611644828261320c565b33600090815260236020526040812054819060ff16612e10576000602254118015612d7b5750602254612d78306111be565b10155b15612d8c57612d8c33602254613268565b5060006022819055600190612da0306111be565b90506000602154601f54602054612db791906138d7565b612dc191906138d7565b9050811580612dce575080155b15612ddf5760009350505050610c44565b600b54612ded906007613896565b821115612e0557600b54612e02906007613896565b91505b829350505050610c44565b82612e1a306111be565b11612e2d57612e298484613268565b5060005b6000612da0306111be565b6000602254118015612e545750602254612e51306111be565b10155b15612e6557612e6530602254613268565b60006022819055612e75306111be565b90506000602154601f54602054612e8c91906138d7565b612e9691906138d7565b9050811580612ea3575080155b15612eac575050565b600b54612eba906005613896565b821115612ed257600b54612ecf906005613896565b91505b60008060028360205486612ee69190613896565b612ef091906138b5565b612efa91906138b5565b9050612f0e612f098286613a7a565b613392565b60205447908190600090612f24906002906138b5565b612f2e9087613a7a565b601f54612f3b9085613896565b612f4591906138b5565b905060006002602054612f5891906138b5565b612f629088613a7a565b602154612f6f9086613896565b612f7991906138b5565b9050612f8581836138d7565b612f8f9084613a7a565b60006020819055601f819055602181905560225592508415801590612fb45750600083115b15612fc357612fc385846134ec565b600d546040516001600160a01b03909116908290600081818185875af1925050503d8060008114613010576040519150601f19603f3d011682016040523d82523d6000602084013e613015565b606091505b505080965050856130385760405162461bcd60e51b8152600401610c7490613a91565b600c546040516001600160a01b03909116904790600081818185875af1925050503d8060008114613085576040519150601f19603f3d011682016040523d82523d6000602084013e61308a565b606091505b505080965050856130ad5760405162461bcd60e51b8152600401610c7490613a91565b5050505050505050565b6001600160a01b0383166130dd5760405162461bcd60e51b8152600401610c74906139f2565b6001600160a01b0382166131035760405162461bcd60e51b8152600401610c7490613a37565b6001600160a01b0383166000908152602081905260409020548181101561317b5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610c74565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906131b29084906138d7565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516131fe91815260200190565b60405180910390a350505050565b6001600160a01b038216600081815260246020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd67469101611765565b6001600160a01b0382166132c85760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610c74565b6001600160a01b0382166000908152602081905260409020548181101561333c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610c74565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101612267565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106133c7576133c7613851565b6001600160a01b03928316602091820292909201810191909152600954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613420573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613444919061395c565b8160018151811061345757613457613851565b6001600160a01b03928316602091820292909201015260095461347d913091168461214f565b60095460405163791ac94760e01b81526001600160a01b039091169063791ac947906134b6908590600090869030904290600401613aee565b600060405180830381600087803b1580156134d057600080fd5b505af11580156134e4573d6000803e3d6000fd5b505050505050565b6009546135049030906001600160a01b03168461214f565b60095460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015613572573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906135979190613b2a565b5050505050565b600060208083528351808285015260005b818110156135cb578581018301518582016040015282016135af565b818111156135dd576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461360857600080fd5b50565b6000806040838503121561361e57600080fd5b8235613629816135f3565b946020939093013593505050565b60006020828403121561364957600080fd5b8135613654816135f3565b9392505050565b801515811461360857600080fd5b60008060006040848603121561367e57600080fd5b833567ffffffffffffffff8082111561369657600080fd5b818601915086601f8301126136aa57600080fd5b8135818111156136b957600080fd5b8760208260051b85010111156136ce57600080fd5b602092830195509350508401356136e48161365b565b809150509250925092565b60008060006060848603121561370457600080fd5b833561370f816135f3565b9250602084013561371f816135f3565b929592945050506040919091013590565b60006020828403121561374257600080fd5b5035919050565b6000806000806080858703121561375f57600080fd5b5050823594602084013594506040840135936060013592509050565b6000806040838503121561378e57600080fd5b8235613799816135f3565b915060208301356137a9816135f3565b809150509250929050565b600080604083850312156137c757600080fd5b82356137d2816135f3565b915060208301356137a98161365b565b600181811c908216806137f657607f821691505b60208210810361381657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161388f5761388f613867565b5060010190565b60008160001904831182151516156138b0576138b0613867565b500290565b6000826138d257634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156138ea576138ea613867565b500190565b6020808252601c908201527f4d757374206b6565702066656573206174203525206f72206c65737300000000604082015260600190565b60006020828403121561393857600080fd5b5051919050565b60006020828403121561395157600080fd5b81516136548161365b565b60006020828403121561396e57600080fd5b8151613654816135f3565b600081518084526020808501945080840160005b838110156139b25781516001600160a01b03168752958201959082019060010161398d565b509495945050505050565b8481526080602082015260006139d66080830186613979565b6001600160a01b03949094166040830152506060015292915050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600082821015613a8c57613a8c613867565b500390565b6020808252603a908201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260408201527f6563697069656e74206d61792068617665207265766572746564000000000000606082015260800190565b85815284602082015260a060408201526000613b0d60a0830186613979565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613b3f57600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212201872422de839b47df0e93ab4c711e35b6b3220b1fda231efadc414ae3265a0c164736f6c634300080f00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65728be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0

Deployed Bytecode

0x6080604052600436106103dd5760003560e01c80638da5cb5b116101fd578063c024666811610118578063e71dc3f5116100ab578063f11a24d31161007a578063f11a24d314610b20578063f2fde38b14610b36578063f5648a4f14610b56578063f637434214610b6b578063fc155d1d14610b8157600080fd5b8063e71dc3f514610ab4578063e7ad9fcd14610aca578063e800dff714610aea578063ee40166e14610b0a57600080fd5b8063dc3f0d0f116100e7578063dc3f0d0f14610a23578063dd62ed3e14610a43578063e2cd5fcd14610a89578063e2f4560514610a9e57600080fd5b8063c0246668146109ad578063c18bc195146109cd578063d257b34f146109ed578063d85ba06314610a0d57600080fd5b8063a0d82dc511610190578063aa4bde281161015f578063aa4bde2814610932578063adb873bd14610948578063b62496f51461095e578063bbc0c7421461098e57600080fd5b8063a0d82dc5146108c6578063a457c2d7146108dc578063a62068ce146108fc578063a9059cbb1461091257600080fd5b80639a7a23d6116101cc5780639a7a23d61461085a5780639c3b4fdc1461087a5780639fb79737146108905780639fccce32146108b057600080fd5b80638da5cb5b146107e4578063921369131461080257806393607d801461081857806395d89b411461084557600080fd5b80634a62bb65116102f85780636ddd17131161028b5780637571336a1161025a5780637571336a146107485780637bce5a04146107685780638366e79a1461077e57806385ecfd281461079e57806388e765ff146107ce57600080fd5b80636ddd1713146106de57806370a08231146106fe578063715018a61461071e578063751039fc1461073357600080fd5b80636b0a894c116102c75780636b0a894c146106685780636b6c3a351461067e5780636c600dce1461069e5780636d25775b146106be57600080fd5b80634a62bb651461060b57806358a6d5311461062557806366d602ae1461063c5780636a486a8e1461065257600080fd5b80631d777856116103705780632e6ed7ef1161033f5780632e6ed7ef1461058f578063313ce567146105af57806339509351146105cb578063452ed4f1146105eb57600080fd5b80631d777856146105235780631f3fed8f1461053957806323b872dd1461054f5780632be32b611461056f57600080fd5b806310d5de53116103ac57806310d5de531461049c578063130a2c3c146104cc57806318160ddd146104ee5780631a8145bb1461050d57600080fd5b806306fdde03146103e95780630758d92414610414578063095ea7b31461044c57806310b390aa1461047c57600080fd5b366103e457005b600080fd5b3480156103f557600080fd5b506103fe610ba1565b60405161040b919061359e565b60405180910390f35b34801561042057600080fd5b50600954610434906001600160a01b031681565b6040516001600160a01b03909116815260200161040b565b34801561045857600080fd5b5061046c61046736600461360b565b610c33565b604051901515815260200161040b565b34801561048857600080fd5b50601254610434906001600160a01b031681565b3480156104a857600080fd5b5061046c6104b7366004613637565b60246020526000908152604090205460ff1681565b3480156104d857600080fd5b506104ec6104e7366004613669565b610c4a565b005b3480156104fa57600080fd5b506002545b60405190815260200161040b565b34801561051957600080fd5b506104ff60205481565b34801561052f57600080fd5b506104ff60225481565b34801561054557600080fd5b506104ff601f5481565b34801561055b57600080fd5b5061046c61056a3660046136ef565b610cf4565b34801561057b57600080fd5b506104ec61058a366004613730565b610d9e565b34801561059b57600080fd5b506104ec6105aa366004613749565b610eab565b3480156105bb57600080fd5b506040516012815260200161040b565b3480156105d757600080fd5b5061046c6105e636600461360b565b610f2e565b3480156105f757600080fd5b50600a54610434906001600160a01b031681565b34801561061757600080fd5b5060145461046c9060ff1681565b34801561063157600080fd5b50600f54431061046c565b34801561064857600080fd5b506104ff60075481565b34801561065e57600080fd5b506104ff601a5481565b34801561067457600080fd5b506104ff60115481565b34801561068a57600080fd5b506104ec61069936600461377b565b610f6a565b3480156106aa57600080fd5b506104ec6106b9366004613637565b611060565b3480156106ca57600080fd5b506104ec6106d9366004613637565b61110e565b3480156106ea57600080fd5b5060145461046c9062010000900460ff1681565b34801561070a57600080fd5b506104ff610719366004613637565b6111be565b34801561072a57600080fd5b506104ec6111d9565b34801561073f57600080fd5b506104ec61124d565b34801561075457600080fd5b506104ec6107633660046137b4565b6112ac565b34801561077457600080fd5b506104ff60165481565b34801561078a57600080fd5b5061046c61079936600461377b565b611374565b3480156107aa57600080fd5b5061046c6107b9366004613637565b60106020526000908152604090205460ff1681565b3480156107da57600080fd5b506104ff60065481565b3480156107f057600080fd5b506005546001600160a01b0316610434565b34801561080e57600080fd5b506104ff601b5481565b34801561082457600080fd5b506104ff610833366004613637565b60136020526000908152604090205481565b34801561085157600080fd5b506103fe61157d565b34801561086657600080fd5b506104ec6108753660046137b4565b61158c565b34801561088657600080fd5b506104ff60185481565b34801561089c57600080fd5b506104ec6108ab36600461360b565b611680565b3480156108bc57600080fd5b506104ff60215481565b3480156108d257600080fd5b506104ff601d5481565b3480156108e857600080fd5b5061046c6108f736600461360b565b611772565b34801561090857600080fd5b506104ff600f5481565b34801561091e57600080fd5b5061046c61092d36600461360b565b61180b565b34801561093e57600080fd5b506104ff60085481565b34801561095457600080fd5b506104ff601e5481565b34801561096a57600080fd5b5061046c610979366004613637565b60256020526000908152604090205460ff1681565b34801561099a57600080fd5b5060145461046c90610100900460ff1681565b3480156109b957600080fd5b506104ec6109c83660046137b4565b611818565b3480156109d957600080fd5b506104ec6109e8366004613730565b6118a1565b3480156109f957600080fd5b506104ec610a08366004613730565b6119aa565b348015610a1957600080fd5b506104ff60155481565b348015610a2f57600080fd5b506104ec610a3e366004613730565b611af5565b348015610a4f57600080fd5b506104ff610a5e36600461377b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a9557600080fd5b506104ec611bfc565b348015610aaa57600080fd5b506104ff600b5481565b348015610ac057600080fd5b506104ff60195481565b348015610ad657600080fd5b506104ec610ae5366004613749565b611ce8565b348015610af657600080fd5b506104ec610b053660046137b4565b611d6b565b348015610b1657600080fd5b506104ff600e5481565b348015610b2c57600080fd5b506104ff60175481565b348015610b4257600080fd5b506104ec610b51366004613637565b611dc0565b348015610b6257600080fd5b506104ec611eab565b348015610b7757600080fd5b506104ff601c5481565b348015610b8d57600080fd5b506104ec610b9c366004613730565b611f17565b606060038054610bb0906137e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdc906137e2565b8015610c295780601f10610bfe57610100808354040283529160200191610c29565b820191906000526020600020905b815481529060010190602001808311610c0c57829003601f168201915b5050505050905090565b6000610c4033848461214f565b5060015b92915050565b6005546001600160a01b03163314610c7d5760405162461bcd60e51b8152600401610c749061381c565b60405180910390fd5b60005b82811015610cee578160106000868685818110610c9f57610c9f613851565b9050602002016020810190610cb49190613637565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610ce68161387d565b915050610c80565b50505050565b6000610d01848484612274565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610d865760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610c74565b610d93853385840361214f565b506001949350505050565b6005546001600160a01b03163314610dc85760405162461bcd60e51b8152600401610c749061381c565b670de0b6b3a76400006103e8610ddd60025490565b610de8906002613896565b610df291906138b5565b610dfc91906138b5565b811015610e5d5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782062757920616d6f756e74206c6f776572206044820152687468616e20302e322560b81b6064820152608401610c74565b610e6f81670de0b6b3a7640000613896565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b6005546001600160a01b03163314610ed55760405162461bcd60e51b8152600401610c749061381c565b60168490556017839055601882905560198190558082610ef585876138d7565b610eff91906138d7565b610f0991906138d7565b601581905560051015610cee5760405162461bcd60e51b8152600401610c74906138ef565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c40918590610f659086906138d7565b61214f565b6005546001600160a01b03163314610f945760405162461bcd60e51b8152600401610c749061381c565b601454610100900460ff1615610fec5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207265656e61626c652074726164696e670000000000000000006044820152606401610c74565b60148054600c80546001600160a01b038087166001600160a01b031992831617909255600d8054928616929091169190911790556201010062ffff001990911617905543600e556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a15050565b6005546001600160a01b0316331461108a5760405162461bcd60e51b8152600401610c749061381c565b6001600160a01b0381166110ec5760405162461bcd60e51b8152602060048201526024808201527f5f74726561737572794164647265737320616464726573732063616e6e6f74206044820152630626520360e41b6064820152608401610c74565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146111385760405162461bcd60e51b8152600401610c749061381c565b6001600160a01b03811661119c5760405162461bcd60e51b815260206004820152602560248201527f5f6d61726b6574696e674164647265737320616464726573732063616e6e6f74604482015264020626520360dc1b6064820152608401610c74565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146112035760405162461bcd60e51b8152600401610c749061381c565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146112775760405162461bcd60e51b8152600401610c749061381c565b6014805460ff191690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b6005546001600160a01b031633146112d65760405162461bcd60e51b8152600401610c749061381c565b8061134957600a546001600160a01b03908116908316036113495760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610c74565b6001600160a01b03919091166000908152602460205260409020805460ff1916911515919091179055565b6005546000906001600160a01b031633146113a15760405162461bcd60e51b8152600401610c749061381c565b6001600160a01b0383166113f75760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610c74565b306001600160a01b0384160361144f5760405162461bcd60e51b815260206004820152601c60248201527f43616e2774207769746864726177206e617469766520746f6b656e73000000006044820152606401610c74565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ba9190613926565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af115801561150d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611531919061393f565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b606060048054610bb0906137e2565b6005546001600160a01b031633146115b65760405162461bcd60e51b8152600401610c749061381c565b600a546001600160a01b039081169083160361163a5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610c74565b6116448282612d18565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600b5461168c306111be565b1015611702576040805162461bcd60e51b81526020600482015260248101919091527f43616e206f6e6c792073776170207768656e20746f6b656e20616d6f756e742060448201527f6973206174206f7220686967686572207468616e207265737472696374696f6e6064820152608401610c74565b61170c8282612d46565b1561176e57600a805460ff60a01b1916600160a01b17905561172c612e38565b600a805460ff60a01b191690556040514281527fbffda9821a15ce050ca76f03947541eb7078e22ded244385b38caa5108a52a44906020015b60405180910390a15b5050565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156117f45760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610c74565b611801338585840361214f565b5060019392505050565b6000610c40338484612274565b6005546001600160a01b031633146118425760405162461bcd60e51b8152600401610c749061381c565b6001600160a01b038216600081815260236020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146118cb5760405162461bcd60e51b8152600401610c749061381c565b670de0b6b3a76400006103e86118e060025490565b6118eb906003613896565b6118f591906138b5565b6118ff91906138b5565b8110156119635760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61782077616c6c657420616d6f756e74206c6f7760448201526b6572207468616e20302e332560a01b6064820152608401610c74565b61197581670de0b6b3a7640000613896565b60088190556040519081527fefc9add9a9b7382de284ef5ad69d8ea863e2680492b21a81948c2d5f04a442bc90602001610ea0565b6005546001600160a01b031633146119d45760405162461bcd60e51b8152600401610c749061381c565b620186a06119e160025490565b6119ec906001613896565b6119f691906138b5565b811015611a635760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610c74565b6103e8611a6f60025490565b611a7a906001613896565b611a8491906138b5565b811115611af05760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610c74565b600b55565b6005546001600160a01b03163314611b1f5760405162461bcd60e51b8152600401610c749061381c565b670de0b6b3a76400006103e8611b3460025490565b611b3f906002613896565b611b4991906138b5565b611b5391906138b5565b811015611bb55760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782073656c6c20616d6f756e74206c6f776572604482015269207468616e20302e322560b01b6064820152608401610c74565b611bc781670de0b6b3a7640000613896565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e90602001610ea0565b6005546001600160a01b03163314611c265760405162461bcd60e51b8152600401610c749061381c565b6003601b8190556000601c8190556001601d819055601e8290559091611c4d9083906138d7565b611c5791906138d7565b611c6191906138d7565b601a81905560051015611c865760405162461bcd60e51b8152600401610c74906138ef565b60016016819055600060178190556003601881905560198290559091611cad9083906138d7565b611cb791906138d7565b611cc191906138d7565b601581905560051015611ce65760405162461bcd60e51b8152600401610c74906138ef565b565b6005546001600160a01b03163314611d125760405162461bcd60e51b8152600401610c749061381c565b601b849055601c839055601d829055601e8190558082611d3285876138d7565b611d3c91906138d7565b611d4691906138d7565b601a81905560051015610cee5760405162461bcd60e51b8152600401610c74906138ef565b6005546001600160a01b03163314611d955760405162461bcd60e51b8152600401610c749061381c565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611dea5760405162461bcd60e51b8152600401610c749061381c565b6001600160a01b038116611e4f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c74565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611ed55760405162461bcd60e51b8152600401610c749061381c565b604051600090339047908381818185875af1925050503d8060008114610cee576040519150601f19603f3d011682016040523d82523d6000602084013e610cee565b6005546001600160a01b03163314611f415760405162461bcd60e51b8152600401610c749061381c565b674563918244f40000811115611fcf5760405162461bcd60e51b815260206004820152604760248201527f4d6179206e6f7420627579206d6f7265207468616e2031302045544820696e2060448201527f612073696e676c652062757920746f207265647563652073616e64776963682060648201526661747461636b7360c81b608482015260a401610c74565b6040805160028082526060820183526000926020830190803683375050600954604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205d919061395c565b8160008151811061207057612070613851565b60200260200101906001600160a01b031690816001600160a01b03168152505030816001815181106120a4576120a4613851565b6001600160a01b03928316602091820292909201015260095460405163b6f9de9560e01b815291169063b6f9de959084906120ec90600090869061dead9042906004016139bd565b6000604051808303818588803b15801561210557600080fd5b505af1158015612119573d6000803e3d6000fd5b50505050507fa017c1567cfcdd2d750a8c01e39fe2a846bcebc293c7d078477014d6848205688260405161176591815260200190565b6001600160a01b0383166121b15760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c74565b6001600160a01b0382166122125760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c74565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661229a5760405162461bcd60e51b8152600401610c74906139f2565b6001600160a01b0382166122c05760405162461bcd60e51b8152600401610c7490613a37565b600081116123105760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610c74565b601454610100900460ff166123a3576001600160a01b03831660009081526023602052604090205460ff168061235e57506001600160a01b03821660009081526023602052604090205460ff165b6123a35760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610c74565b600a546001600160a01b03908116908416036123f9576001600160a01b03821660009081526013602052604081205490036123f4576001600160a01b03821660009081526013602052604090204290555b612426565b600a54600160a01b900460ff1661242657601280546001600160a01b0319166001600160a01b0385161790555b600f54156124f9576001600160a01b03831660009081526010602052604090205460ff16158061246357506005546001600160a01b038381169116145b8061247857506001600160a01b03821661dead145b6124f95760405162461bcd60e51b815260206004820152604660248201527f426f74732063616e6e6f74207472616e7366657220746f6b656e7320696e206f60448201527f72206f75742065786365707420746f206f776e6572206f722064656164206164606482015265323932b9b99760d11b608482015260a401610c74565b60145460ff16156127e1576005546001600160a01b0384811691161480159061253057506005546001600160a01b03838116911614155b801561254457506001600160a01b03821615155b801561255b57506001600160a01b03821661dead14155b801561258057506001600160a01b03831660009081526023602052604090205460ff16155b80156125a557506001600160a01b03821660009081526023602052604090205460ff16155b156127e1576001600160a01b03831660009081526025602052604090205460ff1680156125eb57506001600160a01b03821660009081526024602052604090205460ff16155b156126b7576006548111156126535760405162461bcd60e51b815260206004820152602860248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201526736b0bc10313abc9760c11b6064820152608401610c74565b60085461265f836111be565b61266990836138d7565b11156126b25760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610c74565b6127e1565b6001600160a01b03821660009081526025602052604090205460ff1680156126f857506001600160a01b03831660009081526024602052604090205460ff16155b15612762576007548111156126b25760405162461bcd60e51b815260206004820152602a60248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152691036b0bc1039b2b6361760b11b6064820152608401610c74565b6001600160a01b03821660009081526024602052604090205460ff166127e15760085461278e836111be565b61279890836138d7565b11156127e15760405162461bcd60e51b815260206004820152601860248201527710d85b9b9bdd08115e18d95959081b585e081dd85b1b195d60421b6044820152606401610c74565b60006127ec306111be565b600b549091508110801590819061280b575060145462010000900460ff165b80156128215750600a54600160a01b900460ff16155b801561284657506001600160a01b03851660009081526025602052604090205460ff16155b801561286b57506001600160a01b03851660009081526023602052604090205460ff16155b801561289057506001600160a01b03841660009081526023602052604090205460ff16155b156128be57600a805460ff60a01b1916600160a01b1790556128b0612e38565b600a805460ff60a01b191690555b6001600160a01b03851660009081526023602052604090205460019060ff168061290057506001600160a01b03851660009081526023602052604090205460ff165b15612909575060005b60008115612d0457600f544310801561293a57506001600160a01b03871660009081526025602052604090205460ff165b801561295f57506001600160a01b03861660009081526025602052604090205460ff16155b801561296d57506000601554115b15612aed576001600160a01b03861660009081526010602052604090205460ff16612a0d576001600160a01b0386166000908152601060205260408120805460ff1916600190811790915560118054919290916129cb9084906138d7565b90915550506040516001600160a01b03871681527f55678e47d0a699d3ab99b0184c4ff14f2246ba80522deb921aa0c8823578c44a9060200160405180910390a15b6064612a1a866063613896565b612a2491906138b5565b905060155460175482612a379190613896565b612a4191906138b5565b60206000828254612a5291906138d7565b9091555050601554601654612a679083613896565b612a7191906138b5565b601f6000828254612a8291906138d7565b9091555050601554601854612a979083613896565b612aa191906138b5565b60216000828254612ab291906138d7565b9091555050601554601954612ac79083613896565b612ad191906138b5565b60226000828254612ae291906138d7565b90915550612ce69050565b6001600160a01b03861660009081526025602052604090205460ff168015612b1757506000601a54115b15612bd9576064601a5486612b2c9190613896565b612b3691906138b5565b9050601a54601c5482612b499190613896565b612b5391906138b5565b60206000828254612b6491906138d7565b9091555050601a54601b54612b799083613896565b612b8391906138b5565b601f6000828254612b9491906138d7565b9091555050601a54601d54612ba99083613896565b612bb391906138b5565b60216000828254612bc491906138d7565b9091555050601a54601e54612ac79083613896565b6001600160a01b03871660009081526025602052604090205460ff168015612c0357506000601554115b15612ce657606460155486612c189190613896565b612c2291906138b5565b905060155460175482612c359190613896565b612c3f91906138b5565b60206000828254612c5091906138d7565b9091555050601554601654612c659083613896565b612c6f91906138b5565b601f6000828254612c8091906138d7565b9091555050601554601854612c959083613896565b612c9f91906138b5565b60216000828254612cb091906138d7565b9091555050601554601954612cc59083613896565b612ccf91906138b5565b60226000828254612ce091906138d7565b90915550505b8015612cf757612cf78730836130b7565b612d018186613a7a565b94505b612d0f8787876130b7565b50505050505050565b6001600160a01b0382166000908152602560205260409020805460ff1916821515179055611644828261320c565b33600090815260236020526040812054819060ff16612e10576000602254118015612d7b5750602254612d78306111be565b10155b15612d8c57612d8c33602254613268565b5060006022819055600190612da0306111be565b90506000602154601f54602054612db791906138d7565b612dc191906138d7565b9050811580612dce575080155b15612ddf5760009350505050610c44565b600b54612ded906007613896565b821115612e0557600b54612e02906007613896565b91505b829350505050610c44565b82612e1a306111be565b11612e2d57612e298484613268565b5060005b6000612da0306111be565b6000602254118015612e545750602254612e51306111be565b10155b15612e6557612e6530602254613268565b60006022819055612e75306111be565b90506000602154601f54602054612e8c91906138d7565b612e9691906138d7565b9050811580612ea3575080155b15612eac575050565b600b54612eba906005613896565b821115612ed257600b54612ecf906005613896565b91505b60008060028360205486612ee69190613896565b612ef091906138b5565b612efa91906138b5565b9050612f0e612f098286613a7a565b613392565b60205447908190600090612f24906002906138b5565b612f2e9087613a7a565b601f54612f3b9085613896565b612f4591906138b5565b905060006002602054612f5891906138b5565b612f629088613a7a565b602154612f6f9086613896565b612f7991906138b5565b9050612f8581836138d7565b612f8f9084613a7a565b60006020819055601f819055602181905560225592508415801590612fb45750600083115b15612fc357612fc385846134ec565b600d546040516001600160a01b03909116908290600081818185875af1925050503d8060008114613010576040519150601f19603f3d011682016040523d82523d6000602084013e613015565b606091505b505080965050856130385760405162461bcd60e51b8152600401610c7490613a91565b600c546040516001600160a01b03909116904790600081818185875af1925050503d8060008114613085576040519150601f19603f3d011682016040523d82523d6000602084013e61308a565b606091505b505080965050856130ad5760405162461bcd60e51b8152600401610c7490613a91565b5050505050505050565b6001600160a01b0383166130dd5760405162461bcd60e51b8152600401610c74906139f2565b6001600160a01b0382166131035760405162461bcd60e51b8152600401610c7490613a37565b6001600160a01b0383166000908152602081905260409020548181101561317b5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610c74565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906131b29084906138d7565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516131fe91815260200190565b60405180910390a350505050565b6001600160a01b038216600081815260246020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd67469101611765565b6001600160a01b0382166132c85760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610c74565b6001600160a01b0382166000908152602081905260409020548181101561333c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610c74565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101612267565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106133c7576133c7613851565b6001600160a01b03928316602091820292909201810191909152600954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613420573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613444919061395c565b8160018151811061345757613457613851565b6001600160a01b03928316602091820292909201015260095461347d913091168461214f565b60095460405163791ac94760e01b81526001600160a01b039091169063791ac947906134b6908590600090869030904290600401613aee565b600060405180830381600087803b1580156134d057600080fd5b505af11580156134e4573d6000803e3d6000fd5b505050505050565b6009546135049030906001600160a01b03168461214f565b60095460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015613572573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906135979190613b2a565b5050505050565b600060208083528351808285015260005b818110156135cb578581018301518582016040015282016135af565b818111156135dd576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461360857600080fd5b50565b6000806040838503121561361e57600080fd5b8235613629816135f3565b946020939093013593505050565b60006020828403121561364957600080fd5b8135613654816135f3565b9392505050565b801515811461360857600080fd5b60008060006040848603121561367e57600080fd5b833567ffffffffffffffff8082111561369657600080fd5b818601915086601f8301126136aa57600080fd5b8135818111156136b957600080fd5b8760208260051b85010111156136ce57600080fd5b602092830195509350508401356136e48161365b565b809150509250925092565b60008060006060848603121561370457600080fd5b833561370f816135f3565b9250602084013561371f816135f3565b929592945050506040919091013590565b60006020828403121561374257600080fd5b5035919050565b6000806000806080858703121561375f57600080fd5b5050823594602084013594506040840135936060013592509050565b6000806040838503121561378e57600080fd5b8235613799816135f3565b915060208301356137a9816135f3565b809150509250929050565b600080604083850312156137c757600080fd5b82356137d2816135f3565b915060208301356137a98161365b565b600181811c908216806137f657607f821691505b60208210810361381657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161388f5761388f613867565b5060010190565b60008160001904831182151516156138b0576138b0613867565b500290565b6000826138d257634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156138ea576138ea613867565b500190565b6020808252601c908201527f4d757374206b6565702066656573206174203525206f72206c65737300000000604082015260600190565b60006020828403121561393857600080fd5b5051919050565b60006020828403121561395157600080fd5b81516136548161365b565b60006020828403121561396e57600080fd5b8151613654816135f3565b600081518084526020808501945080840160005b838110156139b25781516001600160a01b03168752958201959082019060010161398d565b509495945050505050565b8481526080602082015260006139d66080830186613979565b6001600160a01b03949094166040830152506060015292915050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600082821015613a8c57613a8c613867565b500390565b6020808252603a908201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260408201527f6563697069656e74206d61792068617665207265766572746564000000000000606082015260800190565b85815284602082015260a060408201526000613b0d60a0830186613979565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613b3f57600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212201872422de839b47df0e93ab4c711e35b6b3220b1fda231efadc414ae3265a0c164736f6c634300080f0033

Deployed Bytecode Sourcemap

8443:22815:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1985:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8599:27;;;;;;;;;;-1:-1:-1;8599:27:0;;;;-1:-1:-1;;;;;8599:27:0;;;;;;-1:-1:-1;;;;;798:32:1;;;780:51;;768:2;753:18;8599:27:0;616:221:1;2965:194:0;;;;;;;;;;-1:-1:-1;2965:194:0;;;;;:::i;:::-;;:::i;:::-;;;1463:14:1;;1456:22;1438:41;;1426:2;1411:18;2965:194:0;1298:187:1;8999:29:0;;;;;;;;;;-1:-1:-1;8999:29:0;;;;-1:-1:-1;;;;;8999:29:0;;;9855:63;;;;;;;;;;-1:-1:-1;9855:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;13771:234;;;;;;;;;;-1:-1:-1;13771:234:0;;;;;:::i;:::-;;:::i;:::-;;2306:108;;;;;;;;;;-1:-1:-1;2394:12:0;;2306:108;;;2974:25:1;;;2962:2;2947:18;2306:108:0;2828:177:1;9604:33:0;;;;;;;;;;;;;;;;9678:28;;;;;;;;;;;;;;;;9564:33;;;;;;;;;;;;;;;;3167:529;;;;;;;;;;-1:-1:-1;3167:529:0;;;;;:::i;:::-;;:::i;14013:312::-;;;;;;;;;;-1:-1:-1;14013:312:0;;;;;:::i;:::-;;:::i;16688:525::-;;;;;;;;;;-1:-1:-1;16688:525:0;;;;;:::i;:::-;;:::i;2205:93::-;;;;;;;;;;-1:-1:-1;2205:93:0;;2288:2;4188:36:1;;4176:2;4161:18;2205:93:0;4046:184:1;3704:290:0;;;;;;;;;;-1:-1:-1;3704:290:0;;;;;:::i;:::-;;:::i;8633:21::-;;;;;;;;;;-1:-1:-1;8633:21:0;;;;-1:-1:-1;;;;;8633:21:0;;;9093:33;;;;;;;;;;-1:-1:-1;9093:33:0;;;;;;;;23972:121;;;;;;;;;;-1:-1:-1;24067:18:0;;24052:12;:33;23972:121;;8525:28;;;;;;;;;;;;;;;;9386;;;;;;;;;;;;;;;;8967:25;;;;;;;;;;;;;;;;13087:383;;;;;;;;;;-1:-1:-1;13087:383:0;;;;;:::i;:::-;;:::i;29742:257::-;;;;;;;;;;-1:-1:-1;29742:257:0;;;;;:::i;:::-;;:::i;29466:268::-;;;;;;;;;;-1:-1:-1;29466:268:0;;;;;:::i;:::-;;:::i;9173:31::-;;;;;;;;;;-1:-1:-1;9173:31:0;;;;;;;;;;;2422:143;;;;;;;;;;-1:-1:-1;2422:143:0;;;;;:::i;:::-;;:::i;6971:150::-;;;;;;;;;;;;;:::i;13522:115::-;;;;;;;;;;;;;:::i;15731:336::-;;;;;;;;;;-1:-1:-1;15731:336:0;;;;;:::i;:::-;;:::i;9247:30::-;;;;;;;;;;;;;;;;28722:481;;;;;;;;;;-1:-1:-1;28722:481:0;;;;;:::i;:::-;;:::i;8917:43::-;;;;;;;;;;-1:-1:-1;8917:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;8491:27;;;;;;;;;;;;;;;;6757:79;;;;;;;;;;-1:-1:-1;6822:6:0;;-1:-1:-1;;;;;6822:6:0;6757:79;;9421:31;;;;;;;;;;;;;;;;9035:51;;;;;;;;;;-1:-1:-1;9035:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;2093:104;;;;;;;;;;;;;:::i;16075:357::-;;;;;;;;;;-1:-1:-1;16075:357:0;;;;;:::i;:::-;;:::i;9321:24::-;;;;;;;;;;;;;;;;30051:425;;;;;;;;;;-1:-1:-1;30051:425:0;;;;;:::i;:::-;;:::i;9644:27::-;;;;;;;;;;;;;;;;9497:25;;;;;;;;;;;;;;;;4002:475;;;;;;;;;;-1:-1:-1;4002:475:0;;;;;:::i;:::-;;:::i;8873:37::-;;;;;;;;;;;;;;;;2573:200;;;;;;;;;;-1:-1:-1;2573:200:0;;;;;:::i;:::-;;:::i;8560:30::-;;;;;;;;;;;;;;;;9529:26;;;;;;;;;;;;;;;;10076:57;;;;;;;;;;-1:-1:-1;10076:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;9133:33;;;;;;;;;;-1:-1:-1;9133:33:0;;;;;;;;;;;18469:182;;;;;;;;;;-1:-1:-1;18469:182:0;;;;;:::i;:::-;;:::i;14658:327::-;;;;;;;;;;-1:-1:-1;14658:327:0;;;;;:::i;:::-;;:::i;15055:428::-;;;;;;;;;;-1:-1:-1;15055:428:0;;;;;:::i;:::-;;:::i;9213:27::-;;;;;;;;;;;;;;;;14333:317;;;;;;;;;;-1:-1:-1;14333:317:0;;;;;:::i;:::-;;:::i;2781:176::-;;;;;;;;;;-1:-1:-1;2781:176:0;;;;;:::i;:::-;-1:-1:-1;;;;;2922:18:0;;;2895:7;2922:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;2781:176;17765:696;;;;;;;;;;;;;:::i;8691:33::-;;;;;;;;;;;;;;;;9352:25;;;;;;;;;;;;;;;;17221:536;;;;;;;;;;-1:-1:-1;17221:536:0;;;;;:::i;:::-;;:::i;13645:118::-;;;;;;;;;;-1:-1:-1;13645:118:0;;;;;:::i;:::-;;:::i;8796:37::-;;;;;;;;;;;;;;;;9284:30;;;;;;;;;;;;;;;;7129:281;;;;;;;;;;-1:-1:-1;7129:281:0;;;;;:::i;:::-;;:::i;29273:185::-;;;;;;;;;;;;;:::i;9459:31::-;;;;;;;;;;;;;;;;30579:676;;;;;;;;;;-1:-1:-1;30579:676:0;;;;;:::i;:::-;;:::i;1985:100::-;2039:13;2072:5;2065:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1985:100;:::o;2965:194::-;3073:4;3090:39;281:10;3113:7;3122:6;3090:8;:39::i;:::-;-1:-1:-1;3147:4:0;2965:194;;;;;:::o;13771:234::-;6884:6;;-1:-1:-1;;;;;6884:6:0;281:10;6884:22;6876:67;;;;-1:-1:-1;;;6876:67:0;;;;;;;:::i;:::-;;;;;;;;;13901:9:::1;13896:102;13916:18:::0;;::::1;13896:102;;;13982:4;13956:11;:23;13968:7;;13976:1;13968:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;13956:23:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;13956:23:0;:30;;-1:-1:-1;;13956:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;13936:3;::::1;::::0;::::1;:::i;:::-;;;;13896:102;;;;13771:234:::0;;;:::o;3167:529::-;3307:4;3324:36;3334:6;3342:9;3353:6;3324:9;:36::i;:::-;-1:-1:-1;;;;;3400:19:0;;3373:24;3400:19;;;:11;:19;;;;;;;;281:10;3400:33;;;;;;;;3466:26;;;;3444:116;;;;-1:-1:-1;;;3444:116:0;;6367:2:1;3444:116:0;;;6349:21:1;6406:2;6386:18;;;6379:30;6445:34;6425:18;;;6418:62;-1:-1:-1;;;6496:18:1;;;6489:38;6544:19;;3444:116:0;6165:404:1;3444:116:0;3596:57;3605:6;281:10;3646:6;3627:16;:25;3596:8;:57::i;:::-;-1:-1:-1;3684:4:0;;3167:529;-1:-1:-1;;;;3167:529:0:o;14013:312::-;6884:6;;-1:-1:-1;;;;;6884:6:0;281:10;6884:22;6876:67;;;;-1:-1:-1;;;6876:67:0;;;;;;;:::i;:::-;14150:4:::1;14142;14121:13;2394:12:::0;;;2306:108;14121:13:::1;:17;::::0;14137:1:::1;14121:17;:::i;:::-;14120:26;;;;:::i;:::-;14119:35;;;;:::i;:::-;14109:6;:45;;14087:136;;;::::0;-1:-1:-1;;;14087:136:0;;7171:2:1;14087:136:0::1;::::0;::::1;7153:21:1::0;7210:2;7190:18;;;7183:30;7249:34;7229:18;;;7222:62;-1:-1:-1;;;7300:18:1;;;7293:39;7349:19;;14087:136:0::1;6969:405:1::0;14087:136:0::1;14249:19;:6:::0;14259:8:::1;14249:19;:::i;:::-;14234:12;:34:::0;;;14284:33:::1;::::0;2974:25:1;;;14284:33:0::1;::::0;2962:2:1;2947:18;14284:33:0::1;;;;;;;;14013:312:::0;:::o;16688:525::-;6884:6;;-1:-1:-1;;;;;6884:6:0;281:10;6884:22;6876:67;;;;-1:-1:-1;;;6876:67:0;;;;;;;:::i;:::-;16865:15:::1;:31:::0;;;16907:15:::1;:31:::0;;;16949:9:::1;:19:::0;;;16979:10:::1;:21:::0;;;16992:8;16961:7;17039:46:::1;16925:13:::0;16883;17039:46:::1;:::i;:::-;:71;;;;:::i;:::-;:97;;;;:::i;:::-;17011:12;:125:::0;;;17171:1:::1;-1:-1:-1::0;17155:17:0::1;17147:58;;;;-1:-1:-1::0;;;17147:58:0::1;;;;;;;:::i;3704:290::-:0;281:10;3817:4;3906:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;3906:34:0;;;;;;;;;;3817:4;;3834:130;;3884:7;;3906:47;;3943:10;;3906:47;:::i;:::-;3834:8;:130::i;13087:383::-;6884:6;;-1:-1:-1;;;;;6884:6:0;281:10;6884:22;6876:67;;;;-1:-1:-1;;;6876:67:0;;;;;;;:::i;:::-;13210:13:::1;::::0;::::1;::::0;::::1;;;13209:14;13201:50;;;::::0;-1:-1:-1;;;13201:50:0;;8071:2:1;13201:50:0::1;::::0;::::1;8053:21:1::0;8110:2;8090:18;;;8083:30;8149:25;8129:18;;;8122:53;8192:18;;13201:50:0::1;7869:347:1::0;13201:50:0::1;13262:13;:20:::0;;13293:16:::1;:27:::0;;-1:-1:-1;;;;;13293:27:0;;::::1;-1:-1:-1::0;;;;;;13293:27:0;;::::1;;::::0;;;13331:15:::1;:26:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;13368:18;-1:-1:-1;;13368:18:0;;;;;;13418:12:::1;13397:18;:33:::0;13446:16:::1;::::0;::::1;::::0;13262:20;;13446:16:::1;13087:383:::0;;:::o;29742:257::-;6884:6;;-1:-1:-1;;;;;6884:6:0;281:10;6884:22;6876:67;;;;-1:-1:-1;;;6876:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29843:30:0;::::1;29821:116;;;::::0;-1:-1:-1;;;29821:116:0;;8423:2:1;29821:116:0::1;::::0;::::1;8405:21:1::0;8462:2;8442:18;;;8435:30;8501:34;8481:18;;;8474:62;-1:-1:-1;;;8552:18:1;;;8545:34;8596:19;;29821:116:0::1;8221:400:1::0;29821:116:0::1;29948:15;:43:::0;;-1:-1:-1;;;;;;29948:43:0::1;-1:-1:-1::0;;;;;29948:43:0;;;::::1;::::0;;;::::1;::::0;;29742:257::o;29466:268::-;6884:6;;-1:-1:-1;;;;;6884:6:0;281:10;6884:22;6876:67;;;;-1:-1:-1;;;6876:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29574:31:0;::::1;29552:118;;;::::0;-1:-1:-1;;;29552:118:0;;8828:2:1;29552:118:0::1;::::0;::::1;8810:21:1::0;8867:2;8847:18;;;8840:30;8906:34;8886:18;;;8879:62;-1:-1:-1;;;8957:18:1;;;8950:35;9002:19;;29552:118:0::1;8626:401:1::0;29552:118:0::1;29681:16;:45:::0;;-1:-1:-1;;;;;;29681:45:0::1;-1:-1:-1::0;;;;;29681:45:0;;;::::1;::::0;;;::::1;::::0;;29466:268::o;2422:143::-;-1:-1:-1;;;;;2539:18:0;2512:7;2539:18;;;;;;;;;;;;2422:143::o;6971:150::-;6884:6;;-1:-1:-1;;;;;6884:6:0;281:10;6884:22;6876:67;;;;-1:-1:-1;;;6876:67:0;;;;;;;:::i;:::-;7064:6:::1;::::0;7043:40:::1;::::0;7080:1:::1;::::0;-1:-1:-1;;;;;7064:6:0::1;::::0;7043:40:::1;::::0;7080:1;;7043:40:::1;7094:6;:19:::0;;-1:-1:-1;;;;;;7094:19:0::1;::::0;;6971:150::o;13522:115::-;6884:6;;-1:-1:-1;;;;;6884:6:0;281:10;6884:22;6876:67;;;;-1:-1:-1;;;6876:67:0;;;;;;;:::i;:::-;13576:14:::1;:22:::0;;-1:-1:-1;;13576:22:0::1;::::0;;13614:15:::1;::::0;::::1;::::0;13593:5:::1;::::0;13614:15:::1;13522:115::o:0;15731:336::-;6884:6;;-1:-1:-1;;;;;6884:6:0;281:10;6884:22;6876:67;;;;-1:-1:-1;;;6876:67:0;;;;;;;:::i;:::-;15853:4:::1;15848:155;;15910:6;::::0;-1:-1:-1;;;;;15910:6:0;;::::1;15900:16:::0;;::::1;::::0;15874:117:::1;;;::::0;-1:-1:-1;;;15874:117:0;;9234:2:1;15874:117:0::1;::::0;::::1;9216:21:1::0;9273:2;9253:18;;;9246:30;9312:34;9292:18;;;9285:62;-1:-1:-1;;;9363:18:1;;;9356:37;9410:19;;15874:117:0::1;9032:403:1::0;15874:117:0::1;-1:-1:-1::0;;;;;16013:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;16013:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;15731:336::o;28722:481::-;6884:6;;28834:10;;-1:-1:-1;;;;;6884:6:0;281:10;6884:22;6876:67;;;;-1:-1:-1;;;6876:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28865:20:0;::::1;28857:59;;;::::0;-1:-1:-1;;;28857:59:0;;9642:2:1;28857:59:0::1;::::0;::::1;9624:21:1::0;9681:2;9661:18;;;9654:30;9720:28;9700:18;;;9693:56;9766:18;;28857:59:0::1;9440:350:1::0;28857:59:0::1;28953:4;-1:-1:-1::0;;;;;28935:23:0;::::1;::::0;28927:64:::1;;;::::0;-1:-1:-1;;;28927:64:0;;9997:2:1;28927:64:0::1;::::0;::::1;9979:21:1::0;10036:2;10016:18;;;10009:30;10075;10055:18;;;10048:58;10123:18;;28927:64:0::1;9795:352:1::0;28927:64:0::1;29029:39;::::0;-1:-1:-1;;;29029:39:0;;29062:4:::1;29029:39;::::0;::::1;780:51:1::0;29002:24:0::1;::::0;-1:-1:-1;;;;;29029:24:0;::::1;::::0;::::1;::::0;753:18:1;;29029:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29087:46;::::0;-1:-1:-1;;;29087:46:0;;-1:-1:-1;;;;;10533:32:1;;;29087:46:0::1;::::0;::::1;10515:51:1::0;10582:18;;;10575:34;;;29002:66:0;;-1:-1:-1;29087:23:0;;::::1;::::0;::::1;::::0;10488:18:1;;29087:46:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29149;::::0;;-1:-1:-1;;;;;10533:32:1;;10515:51;;10597:2;10582:18;;10575:34;;;29079:54:0;;-1:-1:-1;29149:46:0::1;::::0;10488:18:1;29149:46:0::1;;;;;;;28846:357;28722:481:::0;;;;:::o;2093:104::-;2149:13;2182:7;2175:14;;;;;:::i;16075:357::-;6884:6;;-1:-1:-1;;;;;6884:6:0;281:10;6884:22;6876:67;;;;-1:-1:-1;;;6876:67:0;;;;;;;:::i;:::-;16223:6:::1;::::0;-1:-1:-1;;;;;16223:6:0;;::::1;16215:14:::0;;::::1;::::0;16193:121:::1;;;::::0;-1:-1:-1;;;16193:121:0;;11072:2:1;16193:121:0::1;::::0;::::1;11054:21:1::0;11111:2;11091:18;;;11084:30;11150:34;11130:18;;;11123:62;11221:27;11201:18;;;11194:55;11266:19;;16193:121:0::1;10870:421:1::0;16193:121:0::1;16327:41;16356:4;16362:5;16327:28;:41::i;:::-;16384:40;::::0;;::::1;;::::0;-1:-1:-1;;;;;16384:40:0;::::1;::::0;::::1;::::0;;;::::1;16075:357:::0;;:::o;30051:425::-;30171:18;;30143:24;30161:4;30143:9;:24::i;:::-;:46;;30121:160;;;;;-1:-1:-1;;;30121:160:0;;11498:2:1;30121:160:0;;;11480:21:1;11517:18;;;11510:30;;;;11576:34;11556:18;;;11549:62;11647:34;11627:18;;;11620:62;11699:19;;30121:160:0;11296:428:1;30121:160:0;30296:22;30305:7;30314:3;30296:8;:22::i;:::-;30292:177;;;30335:8;:15;;-1:-1:-1;;;;30335:15:0;-1:-1:-1;;;30335:15:0;;;30365:10;:8;:10::i;:::-;30390:8;:16;;-1:-1:-1;;;;30390:16:0;;;30426:31;;30441:15;2974:25:1;;30426:31:0;;2962:2:1;2947:18;30426:31:0;;;;;;;;30292:177;30051:425;;:::o;4002:475::-;281:10;4120:4;4164:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;4164:34:0;;;;;;;;;;4231:35;;;;4209:122;;;;-1:-1:-1;;;4209:122:0;;11931:2:1;4209:122:0;;;11913:21:1;11970:2;11950:18;;;11943:30;12009:34;11989:18;;;11982:62;-1:-1:-1;;;12060:18:1;;;12053:35;12105:19;;4209:122:0;11729:401:1;4209:122:0;4367:67;281:10;4390:7;4418:15;4399:16;:34;4367:8;:67::i;:::-;-1:-1:-1;4465:4:0;;4002:475;-1:-1:-1;;;4002:475:0:o;2573:200::-;2684:4;2701:42;281:10;2725:9;2736:6;2701:9;:42::i;18469:182::-;6884:6;;-1:-1:-1;;;;;6884:6:0;281:10;6884:22;6876:67;;;;-1:-1:-1;;;6876:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18554:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;18554:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;18609:34;;1438:41:1;;;18609:34:0::1;::::0;1411:18:1;18609:34:0::1;;;;;;;18469:182:::0;;:::o;14658:327::-;6884:6;;-1:-1:-1;;;;;6884:6:0;281:10;6884:22;6876:67;;;;-1:-1:-1;;;6876:67:0;;;;;;;:::i;:::-;14798:4:::1;14790;14769:13;2394:12:::0;;;2306:108;14769:13:::1;:17;::::0;14785:1:::1;14769:17;:::i;:::-;14768:26;;;;:::i;:::-;14767:35;;;;:::i;:::-;14757:6;:45;;14735:139;;;::::0;-1:-1:-1;;;14735:139:0;;12337:2:1;14735:139:0::1;::::0;::::1;12319:21:1::0;12376:2;12356:18;;;12349:30;12415:34;12395:18;;;12388:62;-1:-1:-1;;;12466:18:1;;;12459:42;12518:19;;14735:139:0::1;12135:408:1::0;14735:139:0::1;14903:19;:6:::0;14913:8:::1;14903:19;:::i;:::-;14885:15;:37:::0;;;14938:39:::1;::::0;2974:25:1;;;14938:39:0::1;::::0;2962:2:1;2947:18;14938:39:0::1;2828:177:1::0;15055:428:0;6884:6;;-1:-1:-1;;;;;6884:6:0;281:10;6884:22;6876:67;;;;-1:-1:-1;;;6876:67:0;;;;;;;:::i;:::-;15195:6:::1;15174:13;2394:12:::0;;;2306:108;15174:13:::1;:17;::::0;15190:1:::1;15174:17;:::i;:::-;15173:28;;;;:::i;:::-;15160:9;:41;;15138:144;;;::::0;-1:-1:-1;;;15138:144:0;;12750:2:1;15138:144:0::1;::::0;::::1;12732:21:1::0;12789:2;12769:18;;;12762:30;12828:34;12808:18;;;12801:62;-1:-1:-1;;;12879:18:1;;;12872:51;12940:19;;15138:144:0::1;12548:417:1::0;15138:144:0::1;15350:4;15329:13;2394:12:::0;;;2306:108;15329:13:::1;:17;::::0;15345:1:::1;15329:17;:::i;:::-;15328:26;;;;:::i;:::-;15315:9;:39;;15293:141;;;::::0;-1:-1:-1;;;15293:141:0;;13172:2:1;15293:141:0::1;::::0;::::1;13154:21:1::0;13211:2;13191:18;;;13184:30;13250:34;13230:18;;;13223:62;-1:-1:-1;;;13301:18:1;;;13294:50;13361:19;;15293:141:0::1;12970:416:1::0;15293:141:0::1;15445:18;:30:::0;15055:428::o;14333:317::-;6884:6;;-1:-1:-1;;;;;6884:6:0;281:10;6884:22;6876:67;;;;-1:-1:-1;;;6876:67:0;;;;;;;:::i;:::-;14471:4:::1;14463;14442:13;2394:12:::0;;;2306:108;14442:13:::1;:17;::::0;14458:1:::1;14442:17;:::i;:::-;14441:26;;;;:::i;:::-;14440:35;;;;:::i;:::-;14430:6;:45;;14408:137;;;::::0;-1:-1:-1;;;14408:137:0;;13593:2:1;14408:137:0::1;::::0;::::1;13575:21:1::0;13632:2;13612:18;;;13605:30;13671:34;13651:18;;;13644:62;-1:-1:-1;;;13722:18:1;;;13715:40;13772:19;;14408:137:0::1;13391:406:1::0;14408:137:0::1;14572:19;:6:::0;14582:8:::1;14572:19;:::i;:::-;14556:13;:35:::0;;;14607::::1;::::0;2974:25:1;;;14607:35:0::1;::::0;2962:2:1;2947:18;14607:35:0::1;2828:177:1::0;17765:696:0;6884:6;;-1:-1:-1;;;;;6884:6:0;281:10;6884:22;6876:67;;;;-1:-1:-1;;;6876:67:0;;;;;;;:::i;:::-;17843:1:::1;17824:16;:20:::0;;;17874:1:::1;17855:16;:20:::0;;;17899:1:::1;17886:10;:14:::0;;;17911:11:::1;:15:::0;;;17874:1;;17966:48:::1;::::0;17874:1;;17966:48:::1;:::i;:::-;:74;;;;:::i;:::-;:101;;;;:::i;:::-;17937:13;:130:::0;;;18103:1:::1;-1:-1:-1::0;18086:18:0::1;18078:59;;;;-1:-1:-1::0;;;18078:59:0::1;;;;;;;:::i;:::-;18168:1;18150:15;:19:::0;;;18198:1:::1;18180:15;:19:::0;;;18222:1:::1;18210:9;:13:::0;;;18234:10:::1;:14:::0;;;18198:1;;18287:46:::1;::::0;18198:1;;18287:46:::1;:::i;:::-;:71;;;;:::i;:::-;:97;;;;:::i;:::-;18259:12;:125:::0;;;18419:1:::1;-1:-1:-1::0;18403:17:0::1;18395:58;;;;-1:-1:-1::0;;;18395:58:0::1;;;;;;;:::i;:::-;17765:696::o:0;17221:536::-;6884:6;;-1:-1:-1;;;;;6884:6:0;281:10;6884:22;6876:67;;;;-1:-1:-1;;;6876:67:0;;;;;;;:::i;:::-;17399:16:::1;:32:::0;;;17442:16:::1;:32:::0;;;17485:10:::1;:20:::0;;;17516:11:::1;:22:::0;;;17530:8;17498:7;17578:48:::1;17461:13:::0;17418;17578:48:::1;:::i;:::-;:74;;;;:::i;:::-;:101;;;;:::i;:::-;17549:13;:130:::0;;;17715:1:::1;-1:-1:-1::0;17698:18:0::1;17690:59;;;;-1:-1:-1::0;;;17690:59:0::1;;;;;;;:::i;13645:118::-:0;6884:6;;-1:-1:-1;;;;;6884:6:0;281:10;6884:22;6876:67;;;;-1:-1:-1;;;6876:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13729:19:0;;;::::1;;::::0;;;:11:::1;:19;::::0;;;;:26;;-1:-1:-1;;13729:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;13645:118::o;7129:281::-;6884:6;;-1:-1:-1;;;;;6884:6:0;281:10;6884:22;6876:67;;;;-1:-1:-1;;;6876:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7232:22:0;::::1;7210:110;;;::::0;-1:-1:-1;;;7210:110:0;;14004:2:1;7210:110:0::1;::::0;::::1;13986:21:1::0;14043:2;14023:18;;;14016:30;14082:34;14062:18;;;14055:62;-1:-1:-1;;;14133:18:1;;;14126:36;14179:19;;7210:110:0::1;13802:402:1::0;7210:110:0::1;7357:6;::::0;7336:38:::1;::::0;-1:-1:-1;;;;;7336:38:0;;::::1;::::0;7357:6:::1;::::0;7336:38:::1;::::0;7357:6:::1;::::0;7336:38:::1;7385:6;:17:::0;;-1:-1:-1;;;;;;7385:17:0::1;-1:-1:-1::0;;;;;7385:17:0;;;::::1;::::0;;;::::1;::::0;;7129:281::o;29273:185::-;6884:6;;-1:-1:-1;;;;;6884:6:0;281:10;6884:22;6876:67;;;;-1:-1:-1;;;6876:67:0;;;;;;;:::i;:::-;29368:82:::1;::::0;29331:12:::1;::::0;29376:10:::1;::::0;29400:21:::1;::::0;29331:12;29368:82;29331:12;29368:82;29400:21;29376:10;29368:82:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30579:676:::0;6884:6;;-1:-1:-1;;;;;6884:6:0;281:10;6884:22;6876:67;;;;-1:-1:-1;;;6876:67:0;;;;;;;:::i;:::-;30690:7:::1;30675:11;:22;;30653:143;;;::::0;-1:-1:-1;;;30653:143:0;;14621:2:1;30653:143:0::1;::::0;::::1;14603:21:1::0;14660:2;14640:18;;;14633:30;14699:34;14679:18;;;14672:62;14770:34;14750:18;;;14743:62;-1:-1:-1;;;14821:19:1;;;14814:38;14869:19;;30653:143:0::1;14419:475:1::0;30653:143:0::1;30833:16;::::0;;30847:1:::1;30833:16:::0;;;;;::::1;::::0;;30809:21:::1;::::0;30833:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;30870:9:0::1;::::0;:16:::1;::::0;;-1:-1:-1;;;30870:16:0;;;;30809:40;;-1:-1:-1;;;;;;30870:9:0;;::::1;::::0;:14:::1;::::0;-1:-1:-1;30870:16:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:9;:16:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30860:4;30865:1;30860:7;;;;;;;;:::i;:::-;;;;;;:26;-1:-1:-1::0;;;;;30860:26:0::1;;;-1:-1:-1::0;;;;;30860:26:0::1;;;::::0;::::1;30915:4;30897;30902:1;30897:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30897:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;30959:9:::1;::::0;:243:::1;::::0;-1:-1:-1;;;30959:243:0;;:9;::::1;::::0;:60:::1;::::0;31041:11;;30959:243:::1;::::0;:9:::1;::::0;31127:4;;31154:6:::1;::::0;31176:15:::1;::::0;30959:243:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;31218:29;31235:11;31218:29;;;;2974:25:1::0;;2962:2;2947:18;;2828:177;6026:380:0;-1:-1:-1;;;;;6162:19:0;;6154:68;;;;-1:-1:-1;;;6154:68:0;;16470:2:1;6154:68:0;;;16452:21:1;16509:2;16489:18;;;16482:30;16548:34;16528:18;;;16521:62;-1:-1:-1;;;16599:18:1;;;16592:34;16643:19;;6154:68:0;16268:400:1;6154:68:0;-1:-1:-1;;;;;6241:21:0;;6233:68;;;;-1:-1:-1;;;6233:68:0;;16875:2:1;6233:68:0;;;16857:21:1;16914:2;16894:18;;;16887:30;16953:34;16933:18;;;16926:62;-1:-1:-1;;;17004:18:1;;;16997:32;17046:19;;6233:68:0;16673:398:1;6233:68:0;-1:-1:-1;;;;;6314:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;6366:32;;2974:25:1;;;6366:32:0;;2947:18:1;6366:32:0;;;;;;;;6026:380;;;:::o;18659:5305::-;-1:-1:-1;;;;;18791:18:0;;18783:68;;;;-1:-1:-1;;;18783:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18870:16:0;;18862:64;;;;-1:-1:-1;;;18862:64:0;;;;;;;:::i;:::-;18954:1;18945:6;:10;18937:52;;;;-1:-1:-1;;;18937:52:0;;18088:2:1;18937:52:0;;;18070:21:1;18127:2;18107:18;;;18100:30;18166:31;18146:18;;;18139:59;18215:18;;18937:52:0;17886:353:1;18937:52:0;19007:13;;;;;;;19002:183;;-1:-1:-1;;;;;19063:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;19092:23:0;;;;;;:19;:23;;;;;;;;19063:52;19037:136;;;;-1:-1:-1;;;19037:136:0;;18446:2:1;19037:136:0;;;18428:21:1;18485:2;18465:18;;;18458:30;-1:-1:-1;;;18504:18:1;;;18497:52;18566:18;;19037:136:0;18244:346:1;19037:136:0;19209:6;;-1:-1:-1;;;;;19209:6:0;;;19201:14;;;;19197:219;;-1:-1:-1;;;;;19236:20:0;;;;;;:16;:20;;;;;;:25;;19232:104;;-1:-1:-1;;;;;19282:20:0;;;;;;:16;:20;;;;;19305:15;19282:38;;19232:104;19197:219;;;19358:8;;-1:-1:-1;;;19358:8:0;;;;19353:63;;19383:14;:21;;-1:-1:-1;;;;;;19383:21:0;-1:-1:-1;;;;;19383:21:0;;;;;19353:63;19432:18;;:22;19428:247;;-1:-1:-1;;;;;19498:17:0;;;;;;:11;:17;;;;;;;;19497:18;;:35;;-1:-1:-1;6822:6:0;;-1:-1:-1;;;;;19519:13:0;;;6822:6;;19519:13;19497:35;:60;;;-1:-1:-1;;;;;;19536:21:0;;19550:6;19536:21;19497:60;19471:192;;;;-1:-1:-1;;;19471:192:0;;18797:2:1;19471:192:0;;;18779:21:1;18836:2;18816:18;;;18809:30;18875:34;18855:18;;;18848:62;18946:34;18926:18;;;18919:62;-1:-1:-1;;;18997:19:1;;;18990:37;19044:19;;19471:192:0;18595:474:1;19471:192:0;19691:14;;;;19687:1495;;;6822:6;;-1:-1:-1;;;;;19744:15:0;;;6822:6;;19744:15;;;;:49;;-1:-1:-1;6822:6:0;;-1:-1:-1;;;;;19780:13:0;;;6822:6;;19780:13;;19744:49;:86;;;;-1:-1:-1;;;;;;19814:16:0;;;;19744:86;:128;;;;-1:-1:-1;;;;;;19851:21:0;;19865:6;19851:21;;19744:128;:175;;;;-1:-1:-1;;;;;;19894:25:0;;;;;;:19;:25;;;;;;;;19893:26;19744:175;:220;;;;-1:-1:-1;;;;;;19941:23:0;;;;;;:19;:23;;;;;;;;19940:24;19744:220;19722:1449;;;-1:-1:-1;;;;;20053:31:0;;;;;;:25;:31;;;;;;;;:92;;;;-1:-1:-1;;;;;;20110:35:0;;;;;;:31;:35;;;;;;;;20109:36;20053:92;20027:1129;;;20232:12;;20222:6;:22;;20188:148;;;;-1:-1:-1;;;20188:148:0;;19276:2:1;20188:148:0;;;19258:21:1;19315:2;19295:18;;;19288:30;19354:34;19334:18;;;19327:62;-1:-1:-1;;;19405:18:1;;;19398:38;19453:19;;20188:148:0;19074:404:1;20188:148:0;20419:15;;20402:13;20412:2;20402:9;:13::i;:::-;20393:22;;:6;:22;:::i;:::-;:41;;20359:151;;;;-1:-1:-1;;;20359:151:0;;19685:2:1;20359:151:0;;;19667:21:1;19724:2;19704:18;;;19697:30;-1:-1:-1;;;19743:18:1;;;19736:54;19807:18;;20359:151:0;19483:348:1;20359:151:0;20027:1129;;;-1:-1:-1;;;;;20608:29:0;;;;;;:25;:29;;;;;;;;:92;;;;-1:-1:-1;;;;;;20663:37:0;;;;;;:31;:37;;;;;;;;20662:38;20608:92;20582:574;;;20787:13;;20777:6;:23;;20743:151;;;;-1:-1:-1;;;20743:151:0;;20038:2:1;20743:151:0;;;20020:21:1;20077:2;20057:18;;;20050:30;20116:34;20096:18;;;20089:62;-1:-1:-1;;;20167:18:1;;;20160:40;20217:19;;20743:151:0;19836:406:1;20582:574:0;-1:-1:-1;;;;;20925:35:0;;;;;;:31;:35;;;;;;;;20920:236;;21045:15;;21028:13;21038:2;21028:9;:13::i;:::-;21019:22;;:6;:22;:::i;:::-;:41;;20985:151;;;;-1:-1:-1;;;20985:151:0;;19685:2:1;20985:151:0;;;19667:21:1;19724:2;19704:18;;;19697:30;-1:-1:-1;;;19743:18:1;;;19736:54;19807:18;;20985:151:0;19483:348:1;20985:151:0;21194:28;21225:24;21243:4;21225:9;:24::i;:::-;21301:18;;21194:55;;-1:-1:-1;21277:42:0;;;;;;;21350:35;;-1:-1:-1;21374:11:0;;;;;;;21350:35;:61;;;;-1:-1:-1;21403:8:0;;-1:-1:-1;;;21403:8:0;;;;21402:9;21350:61;:110;;;;-1:-1:-1;;;;;;21429:31:0;;;;;;:25;:31;;;;;;;;21428:32;21350:110;:153;;;;-1:-1:-1;;;;;;21478:25:0;;;;;;:19;:25;;;;;;;;21477:26;21350:153;:194;;;;-1:-1:-1;;;;;;21521:23:0;;;;;;:19;:23;;;;;;;;21520:24;21350:194;21332:326;;;21571:8;:15;;-1:-1:-1;;;;21571:15:0;-1:-1:-1;;;21571:15:0;;;21603:10;:8;:10::i;:::-;21630:8;:16;;-1:-1:-1;;;;21630:16:0;;;21332:326;-1:-1:-1;;;;;21789:25:0;;21670:12;21789:25;;;:19;:25;;;;;;21685:4;;21789:25;;;:52;;-1:-1:-1;;;;;;21818:23:0;;;;;;:19;:23;;;;;;;;21789:52;21785:100;;;-1:-1:-1;21868:5:0;21785:100;21897:12;22002:7;21998:1913;;;24067:18;;24052:12;:33;22084:77;;;;-1:-1:-1;;;;;;22130:31:0;;;;;;:25;:31;;;;;;;;22084:77;:128;;;;-1:-1:-1;;;;;;22183:29:0;;;;;;:25;:29;;;;;;;;22182:30;22084:128;:165;;;;;22248:1;22233:12;;:16;22084:165;22062:1700;;;-1:-1:-1;;;;;22289:15:0;;;;;;:11;:15;;;;;;;;22284:173;;-1:-1:-1;;;;;22329:15:0;;;;;;:11;:15;;;;;:22;;-1:-1:-1;;22329:22:0;22347:4;22329:22;;;;;;22374:10;:15;;22347:4;;22374:10;;:15;;22347:4;;22374:15;:::i;:::-;;;;-1:-1:-1;;22417:20:0;;-1:-1:-1;;;;;798:32:1;;780:51;;22417:20:0;;768:2:1;753:18;22417:20:0;;;;;;;22284:173;22500:3;22485:11;:6;22494:2;22485:11;:::i;:::-;22484:19;;;;:::i;:::-;22477:26;;22571:12;;22552:15;;22545:4;:22;;;;:::i;:::-;22544:39;;;;:::i;:::-;22522:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;22651:12:0;;22632:15;;22625:22;;:4;:22;:::i;:::-;22624:39;;;;:::i;:::-;22602:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;22719:12:0;;22706:9;;22699:16;;:4;:16;:::i;:::-;22698:33;;;;:::i;:::-;22682:12;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;22789:12:0;;22775:10;;22768:17;;:4;:17;:::i;:::-;22767:34;;;;:::i;:::-;22750:13;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;22062:1700:0;;-1:-1:-1;22062:1700:0;;-1:-1:-1;;;;;22864:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;22913:1;22897:13;;:17;22864:50;22860:902;;;22969:3;22952:13;;22943:6;:22;;;;:::i;:::-;22942:30;;;;:::i;:::-;22935:37;;23041:13;;23021:16;;23014:4;:23;;;;:::i;:::-;23013:41;;;;:::i;:::-;22991:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;23123:13:0;;23103:16;;23096:23;;:4;:23;:::i;:::-;23095:41;;;;:::i;:::-;23073:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;23193:13:0;;23179:10;;23172:17;;:4;:17;:::i;:::-;23171:35;;;;:::i;:::-;23155:12;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;;23265:13:0;;23250:11;;23243:18;;:4;:18;:::i;22860:902::-;-1:-1:-1;;;;;23340:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;23390:1;23375:12;;:16;23340:51;23336:426;;;23445:3;23429:12;;23420:6;:21;;;;:::i;:::-;23419:29;;;;:::i;:::-;23412:36;;23516:12;;23497:15;;23490:4;:22;;;;:::i;:::-;23489:39;;;;:::i;:::-;23467:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;23596:12:0;;23577:15;;23570:22;;:4;:22;:::i;:::-;23569:39;;;;:::i;:::-;23547:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;23664:12:0;;23651:9;;23644:16;;:4;:16;:::i;:::-;23643:33;;;;:::i;:::-;23627:12;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;23734:12:0;;23720:10;;23713:17;;:4;:17;:::i;:::-;23712:34;;;;:::i;:::-;23695:13;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;;23336:426:0;23782:8;;23778:91;;23811:42;23827:4;23841;23848;23811:15;:42::i;:::-;23885:14;23895:4;23885:14;;:::i;:::-;;;21998:1913;23923:33;23939:4;23945:2;23949:6;23923:15;:33::i;:::-;18772:5192;;;;18659:5305;;;:::o;16440:240::-;-1:-1:-1;;;;;16523:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;16523:39:0;;;;;;;16575;16523:31;:39;16575:26;:39::i;25197:1518::-;25328:10;25263:4;25308:31;;;:19;:31;;;;;;25263:4;;25308:31;;25303:1405;;25394:1;25378:13;;:17;:62;;;;;25427:13;;25399:24;25417:4;25399:9;:24::i;:::-;:41;;25378:62;25356:167;;;25475:32;25481:10;25493:13;;25475:5;:32::i;:::-;-1:-1:-1;25553:1:0;25537:13;:17;;;25579:4;;25624:24;25642:4;25624:9;:24::i;:::-;25598:50;;25663:25;25767:12;;25729:18;;25691;;:56;;;;:::i;:::-;:88;;;;:::i;:::-;25663:116;-1:-1:-1;25800:20:0;;;:46;;-1:-1:-1;25824:22:0;;25800:46;25796:99;;;25874:5;25867:12;;;;;;;25796:99;25933:18;;:22;;25954:1;25933:22;:::i;:::-;25915:15;:40;25911:121;;;25994:18;;:22;;26015:1;25994:22;:::i;:::-;25976:40;;25911:121;26055:7;26048:14;;;;;;;25303:1405;26127:3;26099:24;26117:4;26099:9;:24::i;:::-;:31;26095:125;;26151:19;26157:7;26166:3;26151:5;:19::i;:::-;-1:-1:-1;26199:5:0;26095:125;26234:23;26260:24;26278:4;26260:9;:24::i;26723:1991::-;26782:1;26766:13;;:17;:62;;;;;26815:13;;26787:24;26805:4;26787:9;:24::i;:::-;:41;;26766:62;26762:130;;;26845:35;26859:4;26866:13;;26845:5;:35::i;:::-;26918:1;26902:13;:17;;;26958:24;26976:4;26958:9;:24::i;:::-;26932:50;;26993:25;27089:12;;27055:18;;27021;;:52;;;;:::i;:::-;:80;;;;:::i;:::-;26993:108;-1:-1:-1;27118:20:0;;;:46;;-1:-1:-1;27142:22:0;;27118:46;27114:85;;;27181:7;;26723:1991::o;27114:85::-;27233:18;;:22;;27254:1;27233:22;:::i;:::-;27215:15;:40;27211:113;;;27290:18;;:22;;27311:1;27290:22;:::i;:::-;27272:40;;27211:113;27336:12;27410:23;27523:1;27490:17;27455:18;;27437:15;:36;;;;:::i;:::-;27436:71;;;;:::i;:::-;:88;;;;:::i;:::-;27410:114;-1:-1:-1;27537:51:0;27554:33;27410:114;27554:15;:33;:::i;:::-;27537:16;:51::i;:::-;27800:18;;27622:21;;;;27601:18;;27800:22;;27821:1;;27800:22;:::i;:::-;27779:44;;:17;:44;:::i;:::-;27743:18;;27730:31;;:10;:31;:::i;:::-;27729:95;;;;:::i;:::-;27703:121;;27835:17;27941:1;27920:18;;:22;;;;:::i;:::-;27899:44;;:17;:44;:::i;:::-;27869:12;;27856:25;;:10;:25;:::i;:::-;27855:89;;;;:::i;:::-;27835:109;-1:-1:-1;27976:27:0;27835:109;27976:15;:27;:::i;:::-;27957:46;;;;:::i;:::-;28037:1;28016:18;:22;;;28049:18;:22;;;28082:12;:16;;;28109:13;:17;27957:46;-1:-1:-1;28143:19:0;;;;;:42;;;28184:1;28166:15;:19;28143:42;28139:121;;;28202:46;28215:15;28232;28202:12;:46::i;:::-;28294:15;;28286:51;;-1:-1:-1;;;;;28294:15:0;;;;28323:9;;28286:51;;;;28323:9;28294:15;28286:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28272:65;;;;;28370:7;28348:115;;;;-1:-1:-1;;;28348:115:0;;;;;;;:::i;:::-;28498:16;;28490:88;;-1:-1:-1;;;;;28498:16:0;;;;28542:21;;28490:88;;;;28542:21;28498:16;28490:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28476:102;;;;;28613:7;28591:115;;;;-1:-1:-1;;;28591:115:0;;;;;;;:::i;:::-;26751:1963;;;;;;;;26723:1991::o;4485:651::-;-1:-1:-1;;;;;4625:20:0;;4617:70;;;;-1:-1:-1;;;4617:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4706:23:0;;4698:71;;;;-1:-1:-1;;;4698:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4806:17:0;;4782:21;4806:17;;;;;;;;;;;4856:23;;;;4834:111;;;;-1:-1:-1;;;4834:111:0;;21006:2:1;4834:111:0;;;20988:21:1;21045:2;21025:18;;;21018:30;21084:34;21064:18;;;21057:62;-1:-1:-1;;;21135:18:1;;;21128:36;21181:19;;4834:111:0;20804:402:1;4834:111:0;-1:-1:-1;;;;;4981:17:0;;;:9;:17;;;;;;;;;;;5001:22;;;4981:42;;5045:20;;;;;;;;:30;;5017:6;;4981:9;5045:30;;5017:6;;5045:30;:::i;:::-;;;;;;;;5110:9;-1:-1:-1;;;;;5093:35:0;5102:6;-1:-1:-1;;;;;5093:35:0;;5121:6;5093:35;;;;2974:25:1;;2962:2;2947:18;;2828:177;5093:35:0;;;;;;;;4606:530;4485:651;;;:::o;15491:232::-;-1:-1:-1;;;;;15604:39:0;;;;;;:31;:39;;;;;;;;;:52;;-1:-1:-1;;15604:52:0;;;;;;;;;;15672:43;;21379:51:1;;;21446:18;;;21439:50;15672:43:0;;21352:18:1;15672:43:0;21211:284:1;5468:550:0;-1:-1:-1;;;;;5552:21:0;;5544:67;;;;-1:-1:-1;;;5544:67:0;;21702:2:1;5544:67:0;;;21684:21:1;21741:2;21721:18;;;21714:30;21780:34;21760:18;;;21753:62;-1:-1:-1;;;21831:18:1;;;21824:31;21872:19;;5544:67:0;21500:397:1;5544:67:0;-1:-1:-1;;;;;5647:18:0;;5622:22;5647:18;;;;;;;;;;;5684:24;;;;5676:71;;;;-1:-1:-1;;;5676:71:0;;22104:2:1;5676:71:0;;;22086:21:1;22143:2;22123:18;;;22116:30;22182:34;22162:18;;;22155:62;-1:-1:-1;;;22233:18:1;;;22226:32;22275:19;;5676:71:0;21902:398:1;5676:71:0;-1:-1:-1;;;;;5783:18:0;;:9;:18;;;;;;;;;;;5804:23;;;5783:44;;5922:12;:22;;;;;;;5973:37;2974:25:1;;;5783:9:0;;:18;5973:37;;2947:18:1;5973:37:0;2828:177:1;24101:571:0;24251:16;;;24265:1;24251:16;;;;;;;;24227:21;;24251:16;;;;;;;;;;-1:-1:-1;24251:16:0;24227:40;;24296:4;24278;24283:1;24278:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24278:23:0;;;:7;;;;;;;;;;:23;;;;24322:9;;:16;;;-1:-1:-1;;;24322:16:0;;;;:9;;;;;:14;;:16;;;;;24278:7;;24322:16;;;;;:9;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24312:4;24317:1;24312:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24312:26:0;;;:7;;;;;;;;;:26;24383:9;;24351:56;;24368:4;;24383:9;24395:11;24351:8;:56::i;:::-;24446:9;;:218;;-1:-1:-1;;;24446:218:0;;-1:-1:-1;;;;;24446:9:0;;;;:60;;:218;;24521:11;;24446:9;;24591:4;;24618;;24638:15;;24446:218;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24156:516;24101:571;:::o;24680:509::-;24860:9;;24828:56;;24845:4;;-1:-1:-1;;;;;24860:9:0;24872:11;24828:8;:56::i;:::-;24927:9;;:254;;-1:-1:-1;;;24927:254:0;;24993:4;24927:254;;;23233:34:1;23283:18;;;23276:34;;;24927:9:0;23326:18:1;;;23319:34;;;23369:18;;;23362:34;25133:6:0;23412:19:1;;;23405:44;25155:15:0;23465:19:1;;;23458:35;-1:-1:-1;;;;;24927:9:0;;;;:25;;24960:9;;23167:19:1;;24927:254:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;24680:509;;:::o;14:597: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;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;842:131::-;-1:-1:-1;;;;;917:31:1;;907:42;;897:70;;963:1;960;953:12;897:70;842:131;:::o;978:315::-;1046:6;1054;1107:2;1095:9;1086:7;1082:23;1078:32;1075:52;;;1123:1;1120;1113:12;1075:52;1162:9;1149:23;1181:31;1206:5;1181:31;:::i;:::-;1231:5;1283:2;1268:18;;;;1255:32;;-1:-1:-1;;;978:315:1:o;1698:247::-;1757:6;1810:2;1798:9;1789:7;1785:23;1781:32;1778:52;;;1826:1;1823;1816:12;1778:52;1865:9;1852:23;1884:31;1909:5;1884:31;:::i;:::-;1934:5;1698:247;-1:-1:-1;;;1698:247:1:o;1950:118::-;2036:5;2029:13;2022:21;2015:5;2012:32;2002:60;;2058:1;2055;2048:12;2073:750;2165:6;2173;2181;2234:2;2222:9;2213:7;2209:23;2205:32;2202:52;;;2250:1;2247;2240:12;2202:52;2290:9;2277:23;2319:18;2360:2;2352:6;2349:14;2346:34;;;2376:1;2373;2366:12;2346:34;2414:6;2403:9;2399:22;2389:32;;2459:7;2452:4;2448:2;2444:13;2440:27;2430:55;;2481:1;2478;2471:12;2430:55;2521:2;2508:16;2547:2;2539:6;2536:14;2533:34;;;2563:1;2560;2553:12;2533:34;2618:7;2611:4;2601:6;2598:1;2594:14;2590:2;2586:23;2582:34;2579:47;2576:67;;;2639:1;2636;2629:12;2576:67;2670:4;2662:13;;;;-1:-1:-1;2694:6:1;-1:-1:-1;;2735:20:1;;2722:34;2765:28;2722:34;2765:28;:::i;:::-;2812:5;2802:15;;;2073:750;;;;;:::o;3010:456::-;3087:6;3095;3103;3156:2;3144:9;3135:7;3131:23;3127:32;3124:52;;;3172:1;3169;3162:12;3124:52;3211:9;3198:23;3230:31;3255:5;3230:31;:::i;:::-;3280:5;-1:-1:-1;3337:2:1;3322:18;;3309:32;3350:33;3309:32;3350:33;:::i;:::-;3010:456;;3402:7;;-1:-1:-1;;;3456:2:1;3441:18;;;;3428:32;;3010:456::o;3471:180::-;3530:6;3583:2;3571:9;3562:7;3558:23;3554:32;3551:52;;;3599:1;3596;3589:12;3551:52;-1:-1:-1;3622:23:1;;3471:180;-1:-1:-1;3471:180:1:o;3656:385::-;3742:6;3750;3758;3766;3819:3;3807:9;3798:7;3794:23;3790:33;3787:53;;;3836:1;3833;3826:12;3787:53;-1:-1:-1;;3859:23:1;;;3929:2;3914:18;;3901:32;;-1:-1:-1;3980:2:1;3965:18;;3952:32;;4031:2;4016:18;4003:32;;-1:-1:-1;3656:385:1;-1:-1:-1;3656:385:1:o;4235:388::-;4303:6;4311;4364:2;4352:9;4343:7;4339:23;4335:32;4332:52;;;4380:1;4377;4370:12;4332:52;4419:9;4406:23;4438:31;4463:5;4438:31;:::i;:::-;4488:5;-1:-1:-1;4545:2:1;4530:18;;4517:32;4558:33;4517:32;4558:33;:::i;:::-;4610:7;4600:17;;;4235:388;;;;;:::o;4628:382::-;4693:6;4701;4754:2;4742:9;4733:7;4729:23;4725:32;4722:52;;;4770:1;4767;4760:12;4722:52;4809:9;4796:23;4828:31;4853:5;4828:31;:::i;:::-;4878:5;-1:-1:-1;4935:2:1;4920:18;;4907:32;4948:30;4907:32;4948:30;:::i;5015:380::-;5094:1;5090:12;;;;5137;;;5158:61;;5212:4;5204:6;5200:17;5190:27;;5158:61;5265:2;5257:6;5254:14;5234:18;5231:38;5228:161;;5311:10;5306:3;5302:20;5299:1;5292:31;5346:4;5343:1;5336:15;5374:4;5371:1;5364:15;5228:161;;5015:380;;;:::o;5400:356::-;5602:2;5584:21;;;5621:18;;;5614:30;5680:34;5675:2;5660:18;;5653:62;5747:2;5732:18;;5400:356::o;5761:127::-;5822:10;5817:3;5813:20;5810:1;5803:31;5853:4;5850:1;5843:15;5877:4;5874:1;5867:15;5893:127;5954:10;5949:3;5945:20;5942:1;5935:31;5985:4;5982:1;5975:15;6009:4;6006:1;5999:15;6025:135;6064:3;6085:17;;;6082:43;;6105:18;;:::i;:::-;-1:-1:-1;6152:1:1;6141:13;;6025:135::o;6574:168::-;6614:7;6680:1;6676;6672:6;6668:14;6665:1;6662:21;6657:1;6650:9;6643:17;6639:45;6636:71;;;6687:18;;:::i;:::-;-1:-1:-1;6727:9:1;;6574:168::o;6747:217::-;6787:1;6813;6803:132;;6857:10;6852:3;6848:20;6845:1;6838:31;6892:4;6889:1;6882:15;6920:4;6917:1;6910:15;6803:132;-1:-1:-1;6949:9:1;;6747:217::o;7379:128::-;7419:3;7450:1;7446:6;7443:1;7440:13;7437:39;;;7456:18;;:::i;:::-;-1:-1:-1;7492:9:1;;7379:128::o;7512:352::-;7714:2;7696:21;;;7753:2;7733:18;;;7726:30;7792;7787:2;7772:18;;7765:58;7855:2;7840:18;;7512:352::o;10152:184::-;10222:6;10275:2;10263:9;10254:7;10250:23;10246:32;10243:52;;;10291:1;10288;10281:12;10243:52;-1:-1:-1;10314:16:1;;10152:184;-1:-1:-1;10152:184:1:o;10620:245::-;10687:6;10740:2;10728:9;10719:7;10715:23;10711:32;10708:52;;;10756:1;10753;10746:12;10708:52;10788:9;10782:16;10807:28;10829:5;10807:28;:::i;15031:251::-;15101:6;15154:2;15142:9;15133:7;15129:23;15125:32;15122:52;;;15170:1;15167;15160:12;15122:52;15202:9;15196:16;15221:31;15246:5;15221:31;:::i;15287:461::-;15340:3;15378:5;15372:12;15405:6;15400:3;15393:19;15431:4;15460:2;15455:3;15451:12;15444:19;;15497:2;15490:5;15486:14;15518:1;15528:195;15542:6;15539:1;15536:13;15528:195;;;15607:13;;-1:-1:-1;;;;;15603:39:1;15591:52;;15663:12;;;;15698:15;;;;15639:1;15557:9;15528:195;;;-1:-1:-1;15739:3:1;;15287:461;-1:-1:-1;;;;;15287:461:1:o;15753:510::-;16024:6;16013:9;16006:25;16067:3;16062:2;16051:9;16047:18;16040:31;15987:4;16088:57;16140:3;16129:9;16125:19;16117:6;16088:57;:::i;:::-;-1:-1:-1;;;;;16181:32:1;;;;16176:2;16161:18;;16154:60;-1:-1:-1;16245:2:1;16230:18;16223:34;16080:65;15753:510;-1:-1:-1;;15753:510:1:o;17076:401::-;17278:2;17260:21;;;17317:2;17297:18;;;17290:30;17356:34;17351:2;17336:18;;17329:62;-1:-1:-1;;;17422:2:1;17407:18;;17400:35;17467:3;17452:19;;17076:401::o;17482:399::-;17684:2;17666:21;;;17723:2;17703:18;;;17696:30;17762:34;17757:2;17742:18;;17735:62;-1:-1:-1;;;17828:2:1;17813:18;;17806:33;17871:3;17856:19;;17482:399::o;20247:125::-;20287:4;20315:1;20312;20309:8;20306:34;;;20320:18;;:::i;:::-;-1:-1:-1;20357:9:1;;20247:125::o;20377:422::-;20579:2;20561:21;;;20618:2;20598:18;;;20591:30;20657:34;20652:2;20637:18;;20630:62;20728:28;20723:2;20708:18;;20701:56;20789:3;20774:19;;20377:422::o;22305:582::-;22604:6;22593:9;22586:25;22647:6;22642:2;22631:9;22627:18;22620:34;22690:3;22685:2;22674:9;22670:18;22663:31;22567:4;22711:57;22763:3;22752:9;22748:19;22740:6;22711:57;:::i;:::-;-1:-1:-1;;;;;22804:32:1;;;;22799:2;22784:18;;22777:60;-1:-1:-1;22868:3:1;22853:19;22846:35;22703:65;22305:582;-1:-1:-1;;;22305:582:1:o;23504:306::-;23592:6;23600;23608;23661:2;23649:9;23640:7;23636:23;23632:32;23629:52;;;23677:1;23674;23667:12;23629:52;23706:9;23700:16;23690:26;;23756:2;23745:9;23741:18;23735:25;23725:35;;23800:2;23789:9;23785:18;23779:25;23769:35;;23504:306;;;;;:::o

Swarm Source

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