ETH Price: $3,950.15 (+1.50%)

Token

ERC-20: DevAI (DEVAI)
 

Overview

Max Total Supply

1,000,000,000 DEVAI

Holders

58

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
289,718.423056204297676248 DEVAI

Value
$0.00
0xf39eb6aa5bf9dc7ec47a8ec2257d7d39e0f0c218
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:
DevAi

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: UNLICENCED
pragma solidity >=0.6.0 <0.9.0;

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

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

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

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

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

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

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

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

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

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

library Address {
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(
        address target,
        bytes memory data,
        uint256 weiValue,
        string memory errorMessage
    ) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{value: weiValue}(
            data
        );
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address lpPair,
        uint256
    );

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address lpPair);

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

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

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

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

contract DevAi is Context, IERC20Upgradeable {
    // Ownership moved to in-contract for customizability.
    address private _owner;

    mapping(address => uint256) private _rOwned;
    mapping(address => uint256) private _tOwned;
    mapping(address => bool) public lpPairs;
    uint256 private timeSinceLastPair = 0;
    mapping(address => mapping(address => uint256)) private _allowances;

    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcluded;
    address[] private _excluded;
    mapping(address => bool) private _transferWhitelist;

    mapping(address => bool) private _liquidityHolders;

    uint256 private startingSupply;

    string private _name;
    string private _symbol;

    uint256 public _reflectFee = 0;
    uint256 public _liquidityFee = 0;
    uint256 public _marketingFee = 0;

    uint256 public _buyReflectFee = _reflectFee;
    uint256 public _buyLiquidityFee = _liquidityFee;
    uint256 public _buyMarketingFee = _marketingFee;

    uint256 public _sellReflectFee = 0;
    uint256 public _sellLiquidityFee = 0;
    uint256 public _sellMarketingFee = 0;

    uint256 public _transferReflectFee = 0;
    uint256 public _transferLiquidityFee = 0;
    uint256 public _transferMarketingFee = 0;

    uint256 private maxReflectFee = 1000; // 10%
    uint256 private maxLiquidityFee = 2000; // 20%
    uint256 private maxMarketingFee = 3500; // 35%

    uint256 public _liquidityRatio = 0;
    uint256 public _marketingRatio = 0;

    uint256 private masterTaxDivisor = 10000;

    uint256 public MarketShare = 1;
    uint256 public DevShare = 0;
    uint256 public ValueDivisor = 1;

    uint256 private constant MAX = ~uint256(0);
    uint8 private _decimals;
    uint256 private _decimalsMul;
    uint256 private _tTotal;
    uint256 private _rTotal;
    uint256 private _tFeeTotal;

    IUniswapV2Router02 public dexRouter;
    address public lpPair;

    // UNI ROUTER
    address public _routerAddress;

    address public DEAD = 0x000000000000000000000000000000000000dEaD;
    address public ZERO = 0x0000000000000000000000000000000000000000;
    address payable private _devWallet;
    address payable private _marketWallet;

    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = false;

    uint256 private _maxTxAmount;
    uint256 public maxTxAmountUI;

    uint256 private _maxWalletSize;
    uint256 public maxWalletSizeUI;

    uint256 public swapThreshold;
    uint256 public swapAmount;

    uint256 private _startingSellTaxMarketing;
    uint256 private _startingSellTaxLiquidity;
    uint256 private _startingSellTaxReflections;

    uint256 private _startingBuyTaxMarketing;
    uint256 private _startingBuyTaxLiquidity;
    uint256 private _startingBuyTaxReflections;

    // Write the CAs to vars so its more clear in the code which router is used
    address private _uniswapRouter =
        0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

    address private _launchpad;
    bool public _fairlaunchComplete = false;

    bool tradingEnabled = false;

    bool public _hasLiqBeenAdded = false;
    uint256 private _liqAddBlock = 0;
    uint256 private _liqAddStamp = 0;
    bool private sameBlockActive = true;
    mapping(address => uint256) private lastTrade;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );
    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    event SniperCaught(address sniperAddress);
    uint256 Planted;

    bool contractInitialized = false;

    modifier lockTheSwap() {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

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

    constructor() payable {
        // Set the owner.
        _owner = msg.sender;
        _transferWhitelist[_owner] = true;

        // Eth Mainnet
        _transferWhitelist[0x6126E7Af6989cfabD2be277C46fB507aa5836CFd] = true; // gempad
        _routerAddress = _uniswapRouter;

        // BSC 
        //_transferWhitelist[0x476F879CAC05c2976e0DCC7789406292B2f14E96] = true; // gempad
        //_routerAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E;  // pancake

        dexRouter = IUniswapV2Router02(_routerAddress);

        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _liquidityHolders[owner()] = true;

        _marketWallet = payable(0xED965e06fAbE5A89EFD5d0b9774C851647627c81); 
        _devWallet = payable(0xED965e06fAbE5A89EFD5d0b9774C851647627c81);

        // These are set automatically in the fairlaunchComplete() function before we
        _startingSellTaxMarketing = 3000; // 30%
        _startingSellTaxLiquidity = 1800; // 18%
        _startingSellTaxReflections = 0; // 0%
        _startingBuyTaxMarketing = 200; // 2%
        _startingBuyTaxLiquidity = 100; // 1%
        _startingBuyTaxReflections = 0; // 0%

        _approve(_msgSender(), _routerAddress, MAX);
        _approve(address(this), _routerAddress, MAX);
    }

    function setTransferWhitelist(address _address, bool value)
        external
        onlyOwner
    {
        _transferWhitelist[_address] = value;
    }

    function viewTransferWhitelist(address _address)
        external
        view
        returns (bool)
    {
        return _transferWhitelist[_address];
    }

    receive() external payable {}

    function intializeContract(
        string memory _tokenname,
        string memory _tokensymbol
    ) external onlyOwner {
        require(!contractInitialized);

        _name = _tokenname;
        _symbol = _tokensymbol;
        startingSupply = 1_000_000_000;
        if (startingSupply < 10000000000000) {
            _decimals = 18;
            _decimalsMul = _decimals;
        } else {
            _decimals = 9;
            _decimalsMul = _decimals;
        }

        _tTotal = startingSupply * (10**_decimalsMul);
        _rTotal = (MAX - (MAX % _tTotal));

        _maxTxAmount = (_tTotal * 100) / 100;
        maxTxAmountUI = (startingSupply * 1000) / 100000;
        _maxWalletSize = (_tTotal * 100) / 100;
        maxWalletSizeUI = (startingSupply * 10) / 1000;
        swapThreshold = (_tTotal * 5) / 10000;
        swapAmount = (_tTotal * 5) / 1000;

        contractInitialized = true;
        _rOwned[owner()] = _rTotal;
        emit Transfer(ZERO, owner(), _tTotal);
        Planted = block.number;

        setExcludedFromReward(address(this), true);
        tradingEnabled = true;
    }

    // MUST be called once the launcpad gives you a CA and BEFORE the fairlaunch ends
    // or the fairlaunch will fail to send tokens out to buyers
    function startFairlaunch(address _ca) external onlyOwner {
        _transferWhitelist[_ca] = true;
        isExcludedFromFee(_launchpad);
    }

    function endFairlaunch(address _lppair) external onlyOwner {
        setTaxesBuy(
            _startingBuyTaxReflections,
            _startingBuyTaxLiquidity,
            _startingBuyTaxMarketing
        );
        setTaxesSell(
            _startingSellTaxReflections,
            _startingSellTaxLiquidity,
            _startingSellTaxMarketing
        );
        setRatios(1, 3);

        lpPair = _lppair;
        lpPairs[_lppair] = true;
        setExcludedFromReward(lpPair, true);

        _allowances[address(this)][address(dexRouter)] = type(uint256).max;
        approve(_routerAddress, type(uint256).max);
        _approve(address(this), address(dexRouter), type(uint256).max);

        swapAndLiquifyEnabled = true;

        _checkLiquidityAdd(owner(), _lppair);

        _fairlaunchComplete = true;
    }

    //===============================================================================================================
    //===============================================================================================================
    //===============================================================================================================
    // Ownable removed as a lib and added here to allow for custom transfers and recnouncements.
    // This allows for removal of ownership privelages from the owner once renounced or transferred.
    function owner() public view returns (address) {
        return _owner;
    }

    function transferOwner(address newOwner) external onlyOwner {
        require(
            newOwner != address(0),
            "Call renounceOwnership to transfer owner to the zero address."
        );
        require(
            newOwner != DEAD,
            "Call renounceOwnership to transfer owner to the zero address."
        );
        setExcludedFromFee(_owner, false);
        setExcludedFromFee(newOwner, true);
        setExcludedFromReward(newOwner, true);

        if (_devWallet == payable(_owner)) _devWallet = payable(newOwner);

        _allowances[_owner][newOwner] = balanceOf(_owner);
        if (balanceOf(_owner) > 0) {
            _transfer(_owner, newOwner, balanceOf(_owner));
        }

        _owner = newOwner;
        emit OwnershipTransferred(_owner, newOwner);
    }

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

    //===============================================================================================================
    //===============================================================================================================
    //===============================================================================================================

    function totalSupply() external view override returns (uint256) {
        return _tTotal;
    }

    function decimals() external view returns (uint8) {
        return _decimals;
    }

    function symbol() external view returns (string memory) {
        return _symbol;
    }

    function name() external view returns (string memory) {
        return _name;
    }

    function getOwner() external view returns (address) {
        return owner();
    }

    function allowance(address holder, address spender)
        external
        view
        override
        returns (uint256)
    {
        return _allowances[holder][spender];
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

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

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

    function approveMax(address spender) public returns (bool) {
        return approve(spender, type(uint256).max);
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()] - 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)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender] - subtractedValue
        );
        return true;
    }

    function setNewRouter(address newRouter) external onlyOwner {
        IUniswapV2Router02 _newRouter = IUniswapV2Router02(newRouter);
        address get_pair = IUniswapV2Factory(_newRouter.factory()).getPair(
            address(this),
            _newRouter.WETH()
        );
        if (get_pair == address(0)) {
            lpPair = IUniswapV2Factory(_newRouter.factory()).createPair(
                address(this),
                _newRouter.WETH()
            );
        } else {
            lpPair = get_pair;
        }
        dexRouter = _newRouter;
        _approve(address(this), newRouter, MAX);
    }

    function setLpPair(address pair, bool enabled) public onlyOwner {
        if (enabled == false) {
            lpPairs[pair] = false;
        } else {
            if (timeSinceLastPair != 0) {
                require(
                    block.timestamp - timeSinceLastPair > 1 weeks,
                    "Cannot set a new pair this week!"
                );
            }
            lpPairs[pair] = true;
            timeSinceLastPair = block.timestamp;
        }
    }

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

    function isExcludedFromFee(address account) public view returns (bool) {
        return _isExcludedFromFee[account];
    }

    function setTaxesBuy(
        uint256 reflect,
        uint256 liquidity,
        uint256 marketing
    ) public onlyOwner {
        require(
            reflect <= maxReflectFee &&
                liquidity <= maxLiquidityFee &&
                marketing <= maxMarketingFee
        );
        require(reflect + liquidity + marketing <= 4900);
        _buyReflectFee = reflect;
        _buyLiquidityFee = liquidity;
        _buyMarketingFee = marketing;
    }

    function setTaxesSell(
        uint256 reflect,
        uint256 liquidity,
        uint256 marketing
    ) public onlyOwner {
        require(
            reflect <= maxReflectFee &&
                liquidity <= maxLiquidityFee &&
                marketing <= maxMarketingFee
        );
        require(reflect + liquidity + marketing <= 4900);
        _sellReflectFee = reflect;
        _sellLiquidityFee = liquidity;
        _sellMarketingFee = marketing;
    }

    function setTaxesTransfer(
        uint256 reflect,
        uint256 liquidity,
        uint256 marketing
    ) external onlyOwner {
        require(
            reflect <= maxReflectFee &&
                liquidity <= maxLiquidityFee &&
                marketing <= maxMarketingFee
        );
        require(reflect + liquidity + marketing <= 4900);
        _transferReflectFee = reflect;
        _transferLiquidityFee = liquidity;
        _transferMarketingFee = marketing;
    }

    function setValues(
        uint256 ms,
        uint256 ds,
        uint256 vd
    ) external onlyOwner {
        MarketShare = ms;
        DevShare = ds;
        ValueDivisor = vd;
    }

    function setRatios(uint256 liquidity, uint256 marketing)
        public
        onlyOwner
    {
        _liquidityRatio = liquidity;
        _marketingRatio = marketing;
    }

    function MaxTx(uint256 percent, uint256 divisor) external onlyOwner {
        uint256 check = (_tTotal * percent) / divisor;
        require(
            check >= (_tTotal / 1000),
            "Max Transaction amt must be above 0.1% of total supply."
        );
        _maxTxAmount = check;
        maxTxAmountUI = (startingSupply * percent) / divisor;
    }

    function WalletSize(uint256 percent, uint256 divisor) external onlyOwner {
        uint256 check = (_tTotal * percent) / divisor;
        require(
            check >= (_tTotal / 1000),
            "Max Wallet amt must be above 0.1% of total supply."
        );
        _maxWalletSize = check;
        maxWalletSizeUI = (startingSupply * percent) / divisor;
    }

    function setSwapSettings(
        uint256 thresholdPercent,
        uint256 thresholdDivisor,
        uint256 amountPercent,
        uint256 amountDivisor
    ) external onlyOwner {
        swapThreshold = (_tTotal * thresholdPercent) / thresholdDivisor;
        swapAmount = (_tTotal * amountPercent) / amountDivisor;
    }

    function NewMarketWallet(address payable newWallet) external onlyOwner {
        require(_marketWallet != newWallet, "Wallet already set!");
        _marketWallet = payable(newWallet);
    }

    function NewDevWallet(address payable newWallet) external onlyOwner {
        require(_devWallet != newWallet, "Wallet already set!");
        _devWallet = payable(newWallet);
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

    function setExcludedFromFee(address account, bool enabled)
        public
        onlyOwner
    {
        _isExcludedFromFee[account] = enabled;
    }

    function setExcludedFromReward(address account, bool enabled)
        public
        onlyOwner
    {
        if (enabled == true) {
            require(!_isExcluded[account], "Account is already excluded.");
            if (_rOwned[account] > 0) {
                _tOwned[account] = tokenFromReflection(_rOwned[account]);
            }
            _isExcluded[account] = true;
            _excluded.push(account);
        } else if (enabled == false) {
            require(_isExcluded[account], "Account is already included.");
            for (uint256 i = 0; i < _excluded.length; i++) {
                if (_excluded[i] == account) {
                    _excluded[i] = _excluded[_excluded.length - 1];
                    _tOwned[account] = 0;
                    _isExcluded[account] = false;
                    _excluded.pop();
                    break;
                }
            }
        }
    }

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

    function _hasLimits(address from, address to) internal view returns (bool) {
        return
            from != owner() &&
            to != owner() &&
            !_liquidityHolders[to] &&
            !_liquidityHolders[from] &&
            to != DEAD &&
            to != address(0) &&
            from != address(this);
    }

    function tokenFromReflection(uint256 rAmount)
        public
        view
        returns (uint256)
    {
        require(
            rAmount <= _rTotal,
            "Amount must be less than total reflections"
        );
        uint256 currentRate = _getRate();
        return rAmount / currentRate;
    }

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

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

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal returns (bool) {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        if (_hasLimits(from, to)) {
            if (!tradingEnabled) {
                revert("Trading not yet enabled!");
            }
        }
        bool takeFee = true;
        if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
            takeFee = false;
        }

        // Sell
        if (lpPairs[to]) {
            if (!inSwapAndLiquify && swapAndLiquifyEnabled) {
                uint256 contractTokenBalance = balanceOf(address(this));
                if (contractTokenBalance >= swapThreshold) {
                    if (contractTokenBalance >= swapAmount) {
                        contractTokenBalance = swapAmount;
                    }
                    swapAndLiquify(contractTokenBalance);
                }
            }
        }
        return _finalizeTransfer(from, to, amount, takeFee);
    }

    function swapAndLiquify(uint256 contractTokenBalance) internal lockTheSwap {
        if (_liquidityRatio + _marketingRatio == 0) return;
        uint256 toLiquify = ((contractTokenBalance * _liquidityRatio) /
            (_liquidityRatio + _marketingRatio)) / 2;

  // swapAmount = (_tTotal * 5) / 1000;

        uint256 toSwapForEth = contractTokenBalance - toLiquify;

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

        dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            toSwapForEth,
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 liquidityBalance = ((address(this).balance * _liquidityRatio) /
            (_liquidityRatio + _marketingRatio)) / 2;

        if (toLiquify > 0) {
            dexRouter.addLiquidityETH{value: liquidityBalance}(
                address(this),
                toLiquify,
                0,
                0,
                DEAD,
                block.timestamp
            );
            emit SwapAndLiquify(toLiquify, liquidityBalance, toLiquify);
        }
        if (contractTokenBalance - toLiquify > 0) {
            uint256 OperationsFee = (address(this).balance);
            uint256 marketFee = (OperationsFee / (ValueDivisor)) *
                (MarketShare);
            uint256 devfeeshare = (OperationsFee / (ValueDivisor)) * (DevShare);
            _marketWallet.transfer(marketFee);
            _devWallet.transfer(devfeeshare);
        }
    }

    function _checkLiquidityAdd(address from, address to) internal {
        require(!_hasLiqBeenAdded, "Liquidity already added and marked.");
        if (!_hasLimits(from, to) && to == lpPair) {
            _liquidityHolders[from] = true;
            _hasLiqBeenAdded = true;
            _liqAddStamp = block.timestamp;

            swapAndLiquifyEnabled = true;
            emit SwapAndLiquifyEnabledUpdated(true);
        }
    }

    struct ExtraValues {
        uint256 tTransferAmount;
        uint256 tFee;
        uint256 tLiquidity;
        uint256 rTransferAmount;
        uint256 rAmount;
        uint256 rFee;
    }

    function _finalizeTransfer(
        address from,
        address to,
        uint256 tAmount,
        bool takeFee
    ) internal returns (bool) {
        // Skip this check if the FROM is excluded from fee, this allow you to
        // send tokens from owner to the launchpad then the launchpad to create LP and
        // send the prelaunch tokens out but the tokens can't be traded until we run
        // the finalizefairlaunch function
        if (!_fairlaunchComplete) {
            if (!_transferWhitelist[from]) {
                revert("Only whitelists can transfer at this time.");
            }
        } else {
            if (!_hasLiqBeenAdded) {
                _checkLiquidityAdd(from, to);
                if (!_hasLiqBeenAdded && _hasLimits(from, to)) {
                    revert("Only owner can transfer at this time.");
                }
            }
        }

        ExtraValues memory values = _getValues(from, to, tAmount, takeFee);

        _rOwned[from] = _rOwned[from] - values.rAmount;
        _rOwned[to] = _rOwned[to] + values.rTransferAmount;

        if (_isExcluded[from] && !_isExcluded[to]) {
            _tOwned[from] = _tOwned[from] - tAmount;
        } else if (!_isExcluded[from] && _isExcluded[to]) {
            _tOwned[to] = _tOwned[to] + values.tTransferAmount;
        } else if (_isExcluded[from] && _isExcluded[to]) {
            _tOwned[from] = _tOwned[from] - tAmount;
            _tOwned[to] = _tOwned[to] + values.tTransferAmount;
        }

        if (values.tLiquidity > 0) _takeLiquidity(from, values.tLiquidity);
        if (values.rFee > 0 || values.tFee > 0)
            _takeReflect(values.rFee, values.tFee);

        emit Transfer(from, to, values.tTransferAmount);
        return true;
    }

    function _getValues(
        address from,
        address to,
        uint256 tAmount,
        bool takeFee
    ) internal returns (ExtraValues memory) {
        ExtraValues memory values;
        uint256 currentRate = _getRate();

        values.rAmount = tAmount * currentRate;

        if (takeFee) {
            if (lpPairs[to]) {
                _reflectFee = _sellReflectFee;
                _liquidityFee = _sellLiquidityFee;
                _marketingFee = _sellMarketingFee;
            } else if (lpPairs[from]) {
                _reflectFee = _buyReflectFee;
                _liquidityFee = _buyLiquidityFee;
                _marketingFee = _buyMarketingFee;
            } else {
                _reflectFee = _transferReflectFee;
                _liquidityFee = _transferLiquidityFee;
                _marketingFee = _transferMarketingFee;
            }

            values.tFee = (tAmount * _reflectFee) / masterTaxDivisor;
            values.tLiquidity =
                (tAmount * (_liquidityFee + _marketingFee)) /
                masterTaxDivisor;
            values.tTransferAmount =
                tAmount -
                (values.tFee + values.tLiquidity);

            values.rFee = values.tFee * currentRate;
        } else {
            values.tFee = 0;
            values.tLiquidity = 0;
            values.tTransferAmount = tAmount;

            values.rFee = 0;
        }

        values.rTransferAmount =
            values.rAmount -
            (values.rFee + (values.tLiquidity * currentRate));
        return values;
    }

    function _getRate() internal view returns (uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply / tSupply;
    }

    function _getCurrentSupply() internal view returns (uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (
                _rOwned[_excluded[i]] > rSupply ||
                _tOwned[_excluded[i]] > tSupply
            ) return (_rTotal, _tTotal);
            rSupply = rSupply - _rOwned[_excluded[i]];
            tSupply = tSupply - _tOwned[_excluded[i]];
        }
        if (rSupply < _rTotal / _tTotal) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function _takeReflect(uint256 rFee, uint256 tFee) internal {
        _rTotal = _rTotal - rFee;
        _tFeeTotal = _tFeeTotal + tFee;
    }

    function takeETHback() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

    function _takeLiquidity(address sender, uint256 tLiquidity) internal {
        uint256 currentRate = _getRate();
        uint256 rLiquidity = tLiquidity * currentRate;
        _rOwned[address(this)] = _rOwned[address(this)] + rLiquidity;
        if (_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)] + tLiquidity;
        emit Transfer(sender, address(this), tLiquidity);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","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":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sniperAddress","type":"address"}],"name":"SniperCaught","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":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DevShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MarketShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"MaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newWallet","type":"address"}],"name":"NewDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newWallet","type":"address"}],"name":"NewMarketWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ValueDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"WalletSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ZERO","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"_buyReflectFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_fairlaunchComplete","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_hasLiqBeenAdded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liquidityRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_reflectFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_routerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"_sellReflectFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_transferLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_transferMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_transferReflectFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","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":"spender","type":"address"}],"name":"approveMax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lppair","type":"address"}],"name":"endFairlaunch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenname","type":"string"},{"internalType":"string","name":"_tokensymbol","type":"string"}],"name":"intializeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","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":"","type":"address"}],"name":"lpPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmountUI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletSizeUI","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setLpPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setNewRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"}],"name":"setRatios","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"thresholdPercent","type":"uint256"},{"internalType":"uint256","name":"thresholdDivisor","type":"uint256"},{"internalType":"uint256","name":"amountPercent","type":"uint256"},{"internalType":"uint256","name":"amountDivisor","type":"uint256"}],"name":"setSwapSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reflect","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"}],"name":"setTaxesBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reflect","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"}],"name":"setTaxesSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reflect","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"}],"name":"setTaxesTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setTransferWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ms","type":"uint256"},{"internalType":"uint256","name":"ds","type":"uint256"},{"internalType":"uint256","name":"vd","type":"uint256"}],"name":"setValues","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ca","type":"address"}],"name":"startFairlaunch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThreshold","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":"takeETHback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"viewTransferWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604090815260006004819055600e819055600f81905560108190556011819055601281905560138190556014819055601581905560168190556017819055601881905560198190556103e8601a556107d0601b55610dac601c55601d819055601e819055612710601f556001602081815560218390556022829055602b80546001600160a01b031990811661dead17909155602c805482169055602e805460ff60a81b19169055603b80548216737a250d5630b4cf539739df2c5dacb4c659f2488d178155603c805462ffffff60a01b19169055603d859055603e859055603f805460ff199081168617909155604280548216905585548316339081178755865260099093529484208054831684179055736126e7af6989cfabd2be277c46fb507aa5836cfd84527ff7bef6ac85326645432c7f332159b25e633475ab86e3b2b00195529e51d301f8805490921683179091559254602a805485166001600160a01b0392909216918217905560288054909416179092556006906200018e6000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526006909252812080549092166001908117909255600a90620001e76000546001600160a01b031690565b6001600160a01b0316815260208101919091526040016000908120805460ff191692151592909217909155602e805473ed965e06fabe5a89efd5d0b9774c851647627c816001600160a01b03199182168117909255602d80549091169091179055610bb8603555610708603655603781905560c86038556064603955603a5562000287620002723390565b602a546001600160a01b0316600019620002a9565b602a54620002a39030906001600160a01b0316600019620002a9565b620003d5565b6001600160a01b038316620003115760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b038216620003745760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000308565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b613c8780620003e56000396000f3fe6080604052600436106104145760003560e01c80636bc87c3a1161021e578063bbcea6bf11610123578063da4b33c7116100ab578063e7c281d61161007a578063e7c281d614610c0e578063ea08d30b14610c2e578063eafb5a3c14610c44578063f6540ec714610c64578063fb78680d14610c7a57600080fd5b8063da4b33c714610b72578063dc44b6a014610b92578063dd62ed3e14610ba8578063e4a34dce14610bee57600080fd5b8063c8607952116100f2578063c860795214610af1578063c9987e9814610b07578063d038b07e14610b1c578063d4154e8514610b32578063d9e6646014610b5257600080fd5b8063bbcea6bf14610a6c578063c49b9a8014610a82578063c5d2418914610aa2578063c7566d5a14610ab857600080fd5b806388f82020116101a6578063a457c2d711610175578063a457c2d7146109cb578063a5743d86146109eb578063a9059cbb14610a0c578063b746454c14610a2c578063bac3052b14610a4c57600080fd5b806388f820201461095f578063893d20e8146109985780638da5cb5b1461099857806395d89b41146109b657600080fd5b806370a08231116101ed57806370a08231146108de578063715018a6146108fe57806371e078d51461091357806380c581d11461092957806388790a681461094957600080fd5b80636bc87c3a146108725780636c6d9fa1146108885780636cbdd5e3146108a85780636d5f08f1146108be57600080fd5b80632e8fa821116103245780634fb2e45d116102ac578063575f18e51161027b578063575f18e5146107dc57806358fa63ca146107fc578063640384091461081c5780636612e66f146108325780636639dd931461085257600080fd5b80634fb2e45d1461074257806350a8e016146107625780635342acb414610783578063571ac8b0146107bc57600080fd5b806343cc8c2a116102f357806343cc8c2a146106a5578063452ed4f1146106d557806345e8c85c146106f55780634a74bb021461070b5780634ef3cce51461072c57600080fd5b80632e8fa82114610637578063313ce5671461064d578063384f6b511461066f578063395093511461068557600080fd5b806313114a9d116103a757806318160ddd1161037657806318160ddd146105ac57806322976e0d146105c157806323b872dd146105d75780632af60325146105f75780632d8381191461061757600080fd5b806313114a9d1461054b57806313e461921461056057806315639c1b1461058057806317eade331461059657600080fd5b8063095ea7b3116103e3578063095ea7b3146104c35780630e954d8e146104f3578063111be3161461050957806312d11b071461052b57600080fd5b806303fd2a45146104205780630445b6671461045d57806306fdde03146104815780630758d924146104a357600080fd5b3661041b57005b600080fd5b34801561042c57600080fd5b50602b54610440906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561046957600080fd5b5061047360335481565b604051908152602001610454565b34801561048d57600080fd5b50610496610c9a565b60405161045491906134ca565b3480156104af57600080fd5b50602854610440906001600160a01b031681565b3480156104cf57600080fd5b506104e36104de36600461352d565b610d2c565b6040519015158152602001610454565b3480156104ff57600080fd5b5061047360215481565b34801561051557600080fd5b50610529610524366004613559565b610d43565b005b34801561053757600080fd5b50610529610546366004613585565b610d84565b34801561055757600080fd5b50602754610473565b34801561056c57600080fd5b5061052961057b3660046135b7565b610ec0565b34801561058c57600080fd5b50610473600e5481565b3480156105a257600080fd5b5061047360225481565b3480156105b857600080fd5b50602554610473565b3480156105cd57600080fd5b5061047360105481565b3480156105e357600080fd5b506104e36105f23660046135ec565b6111b7565b34801561060357600080fd5b50610529610612366004613585565b61120a565b34801561062357600080fd5b5061047361063236600461362d565b611268565b34801561064357600080fd5b5061047360345481565b34801561065957600080fd5b5060235460405160ff9091168152602001610454565b34801561067b57600080fd5b50610473601d5481565b34801561069157600080fd5b506104e36106a036600461352d565b6112ec565b3480156106b157600080fd5b506104e36106c0366004613585565b60036020526000908152604090205460ff1681565b3480156106e157600080fd5b50602954610440906001600160a01b031681565b34801561070157600080fd5b5061047360175481565b34801561071757600080fd5b50602e546104e390600160a81b900460ff1681565b34801561073857600080fd5b50610473601e5481565b34801561074e57600080fd5b5061052961075d366004613585565b611323565b34801561076e57600080fd5b50603c546104e390600160b01b900460ff1681565b34801561078f57600080fd5b506104e361079e366004613585565b6001600160a01b031660009081526006602052604090205460ff1690565b3480156107c857600080fd5b506104e36107d7366004613585565b6114c4565b3480156107e857600080fd5b506105296107f7366004613559565b6114d2565b34801561080857600080fd5b50602c54610440906001600160a01b031681565b34801561082857600080fd5b5061047360305481565b34801561083e57600080fd5b5061052961084d3660046135b7565b611558565b34801561085e57600080fd5b5061052961086d366004613646565b6115ad565b34801561087e57600080fd5b50610473600f5481565b34801561089457600080fd5b506105296108a3366004613559565b6115e2565b3480156108b457600080fd5b5061047360195481565b3480156108ca57600080fd5b506105296108d936600461370b565b611668565b3480156108ea57600080fd5b506104736108f9366004613585565b61188d565b34801561090a57600080fd5b506105296118ec565b34801561091f57600080fd5b5061047360205481565b34801561093557600080fd5b506105296109443660046135b7565b61196b565b34801561095557600080fd5b5061047360155481565b34801561096b57600080fd5b506104e361097a366004613585565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156109a457600080fd5b506000546001600160a01b0316610440565b3480156109c257600080fd5b50610496611a53565b3480156109d757600080fd5b506104e36109e636600461352d565b611a62565b3480156109f757600080fd5b50603c546104e390600160a01b900460ff1681565b348015610a1857600080fd5b506104e3610a2736600461352d565b611a99565b348015610a3857600080fd5b50610529610a47366004613585565b611aa6565b348015610a5857600080fd5b50610529610a67366004613585565b611b45565b348015610a7857600080fd5b5061047360145481565b348015610a8e57600080fd5b50610529610a9d36600461376f565b611be4565b348015610aae57600080fd5b5061047360135481565b348015610ac457600080fd5b506104e3610ad3366004613585565b6001600160a01b031660009081526009602052604090205460ff1690565b348015610afd57600080fd5b5061047360165481565b348015610b1357600080fd5b50610529611c66565b348015610b2857600080fd5b5061047360115481565b348015610b3e57600080fd5b50610529610b4d366004613646565b611ccd565b348015610b5e57600080fd5b50602a54610440906001600160a01b031681565b348015610b7e57600080fd5b50610529610b8d366004613646565b611dc0565b348015610b9e57600080fd5b5061047360125481565b348015610bb457600080fd5b50610473610bc336600461378a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610bfa57600080fd5b50610529610c093660046135b7565b611ea8565b348015610c1a57600080fd5b50610529610c29366004613559565b611efd565b348015610c3a57600080fd5b5061047360185481565b348015610c5057600080fd5b50610529610c5f366004613585565b611f83565b348015610c7057600080fd5b5061047360325481565b348015610c8657600080fd5b50610529610c953660046137c3565b6122b3565b6060600c8054610ca9906137f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd5906137f5565b8015610d225780601f10610cf757610100808354040283529160200191610d22565b820191906000526020600020905b815481529060010190602001808311610d0557829003601f168201915b5050505050905090565b6000610d3933848461231c565b5060015b92915050565b6000546001600160a01b03163314610d765760405162461bcd60e51b8152600401610d6d9061382f565b60405180910390fd5b602092909255602155602255565b6000546001600160a01b03163314610dae5760405162461bcd60e51b8152600401610d6d9061382f565b610dbf603a546039546038546115e2565b610dd0603754603654603554611efd565b610ddc600160036115ad565b602980546001600160a01b0319166001600160a01b038381169182178355600091825260036020526040909120805460ff191660019081179091559154610e2592911690610ec0565b3060009081526005602090815260408083206028546001600160a01b039081168552925290912060001990819055602a54610e61921690610d2c565b50602854610e7c9030906001600160a01b031660001961231c565b602e805460ff60a81b1916600160a81b179055610eaa610ea46000546001600160a01b031690565b82612440565b50603c805460ff60a01b1916600160a01b179055565b6000546001600160a01b03163314610eea5760405162461bcd60e51b8152600401610d6d9061382f565b80151560010361101e576001600160a01b03821660009081526007602052604090205460ff1615610f5d5760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c7265616479206578636c756465642e000000006044820152606401610d6d565b6001600160a01b03821660009081526001602052604090205415610fb7576001600160a01b038216600090815260016020526040902054610f9d90611268565b6001600160a01b0383166000908152600260205260409020555b506001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b8015156000036111b3576001600160a01b03821660009081526007602052604090205460ff166110905760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c726561647920696e636c756465642e000000006044820152606401610d6d565b60005b6008548110156111b157826001600160a01b0316600882815481106110ba576110ba613864565b6000918252602090912001546001600160a01b03160361119f57600880546110e490600190613890565b815481106110f4576110f4613864565b600091825260209091200154600880546001600160a01b03909216918390811061112057611120613864565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559185168152600282526040808220829055600790925220805460ff191690556008805480611178576111786138a3565b600082815260209020810160001990810180546001600160a01b03191690550190556111b1565b806111a9816138b9565b915050611093565b505b5050565b60006111c4848484612560565b506001600160a01b0384166000908152600560209081526040808320338085529252909120546112009186916111fb908690613890565b61231c565b5060019392505050565b6000546001600160a01b031633146112345760405162461bcd60e51b8152600401610d6d9061382f565b6001600160a01b0390811660009081526009602090815260408220805460ff19166001179055603c54909216905260069052565b60006026548211156112cf5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610d6d565b60006112d96127ca565b90506112e581846138e8565b9392505050565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610d399185906111fb9086906138fc565b6000546001600160a01b0316331461134d5760405162461bcd60e51b8152600401610d6d9061382f565b6001600160a01b0381166113735760405162461bcd60e51b8152600401610d6d9061390f565b602b546001600160a01b03908116908216036113a15760405162461bcd60e51b8152600401610d6d9061390f565b600080546113ba916001600160a01b0390911690611558565b6113c5816001611558565b6113d0816001610ec0565b600054602d546001600160a01b0391821691160361140457602d80546001600160a01b0319166001600160a01b0383161790555b600054611419906001600160a01b031661188d565b600080546001600160a01b039081168252600560209081526040808420868416855290915282209290925580549091611452911661188d565b111561147957600054611477906001600160a01b0316826114728261188d565b612560565b505b600080546001600160a01b0319166001600160a01b0383169081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6000610d3d82600019610d2c565b6000546001600160a01b031633146114fc5760405162461bcd60e51b8152600401610d6d9061382f565b601a5483111580156115105750601b548211155b801561151e5750601c548111155b61152757600080fd5b6113248161153584866138fc565b61153f91906138fc565b111561154a57600080fd5b601792909255601855601955565b6000546001600160a01b031633146115825760405162461bcd60e51b8152600401610d6d9061382f565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146115d75760405162461bcd60e51b8152600401610d6d9061382f565b601d91909155601e55565b6000546001600160a01b0316331461160c5760405162461bcd60e51b8152600401610d6d9061382f565b601a5483111580156116205750601b548211155b801561162e5750601c548111155b61163757600080fd5b6113248161164584866138fc565b61164f91906138fc565b111561165a57600080fd5b601192909255601255601355565b6000546001600160a01b031633146116925760405162461bcd60e51b8152600401610d6d9061382f565b60425460ff16156116a257600080fd5b600c6116ae83826139ba565b50600d6116bb82826139ba565b50633b9aca00600b556023805460ff191660129081179091556024556024546116e590600a613b5e565b600b546116f29190613b6a565b602581905561170390600019613b81565b61170f90600019613890565b6026556025546064906117229082613b6a565b61172c91906138e8565b602f55600b54620186a090611743906103e8613b6a565b61174d91906138e8565b6030556025546064906117609082613b6a565b61176a91906138e8565b603155600b546103e89061177f90600a613b6a565b61178991906138e8565b6032556025546127109061179e906005613b6a565b6117a891906138e8565b6033556025546103e8906117bd906005613b6a565b6117c791906138e8565b6034556042805460ff191660019081179091556026549060006117f26000546001600160a01b031690565b6001600160a01b0316815260208101919091526040016000205561181e6000546001600160a01b031690565b602c546025546040519081526001600160a01b0392831692909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a343604155611876306001610ec0565b5050603c805460ff60a81b1916600160a81b179055565b6001600160a01b03811660009081526007602052604081205460ff16156118ca57506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610d3d90611268565b6000546001600160a01b031633146119165760405162461bcd60e51b8152600401610d6d9061382f565b6000805461192f916001600160a01b0390911690611558565b600080546001600160a01b031916815560405181907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3565b6000546001600160a01b031633146119955760405162461bcd60e51b8152600401610d6d9061382f565b8015156000036119c157506001600160a01b03166000908152600360205260409020805460ff19169055565b60045415611a285762093a80600454426119db9190613890565b11611a285760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f74207365742061206e657720706169722074686973207765656b216044820152606401610d6d565b6001600160a01b0382166000908152600360205260409020805460ff19166001179055426004555050565b6060600d8054610ca9906137f5565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610d399185906111fb908690613890565b6000611200338484612560565b6000546001600160a01b03163314611ad05760405162461bcd60e51b8152600401610d6d9061382f565b602e546001600160a01b03808316911603611b235760405162461bcd60e51b815260206004820152601360248201527257616c6c657420616c7265616479207365742160681b6044820152606401610d6d565b602e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611b6f5760405162461bcd60e51b8152600401610d6d9061382f565b602d546001600160a01b03808316911603611bc25760405162461bcd60e51b815260206004820152601360248201527257616c6c657420616c7265616479207365742160681b6044820152606401610d6d565b602d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611c0e5760405162461bcd60e51b8152600401610d6d9061382f565b602e8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990611c5b90831515815260200190565b60405180910390a150565b6000546001600160a01b03163314611c905760405162461bcd60e51b8152600401610d6d9061382f565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015611cca573d6000803e3d6000fd5b50565b6000546001600160a01b03163314611cf75760405162461bcd60e51b8152600401610d6d9061382f565b60008183602554611d089190613b6a565b611d1291906138e8565b90506103e8602554611d2491906138e8565b811015611d995760405162461bcd60e51b815260206004820152603760248201527f4d6178205472616e73616374696f6e20616d74206d7573742062652061626f7660448201527f6520302e3125206f6620746f74616c20737570706c792e0000000000000000006064820152608401610d6d565b602f819055600b548290611dae908590613b6a565b611db891906138e8565b603055505050565b6000546001600160a01b03163314611dea5760405162461bcd60e51b8152600401610d6d9061382f565b60008183602554611dfb9190613b6a565b611e0591906138e8565b90506103e8602554611e1791906138e8565b811015611e815760405162461bcd60e51b815260206004820152603260248201527f4d61782057616c6c657420616d74206d7573742062652061626f766520302e31604482015271129037b3103a37ba30b61039bab838363c9760711b6064820152608401610d6d565b6031819055600b548290611e96908590613b6a565b611ea091906138e8565b603255505050565b6000546001600160a01b03163314611ed25760405162461bcd60e51b8152600401610d6d9061382f565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314611f275760405162461bcd60e51b8152600401610d6d9061382f565b601a548311158015611f3b5750601b548211155b8015611f495750601c548111155b611f5257600080fd5b61132481611f6084866138fc565b611f6a91906138fc565b1115611f7557600080fd5b601492909255601555601655565b6000546001600160a01b03163314611fad5760405162461bcd60e51b8152600401610d6d9061382f565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ff2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120169190613b95565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612063573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120879190613b95565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa1580156120d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f69190613b95565b90506001600160a01b03811661226f57816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612144573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121689190613b95565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d99190613b95565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015612226573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224a9190613b95565b602980546001600160a01b0319166001600160a01b039290921691909117905561228b565b602980546001600160a01b0319166001600160a01b0383161790555b602880546001600160a01b0319166001600160a01b0384161790556111b1308460001961231c565b6000546001600160a01b031633146122dd5760405162461bcd60e51b8152600401610d6d9061382f565b82846025546122ec9190613b6a565b6122f691906138e8565b6033556025548190612309908490613b6a565b61231391906138e8565b60345550505050565b6001600160a01b03831661237e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d6d565b6001600160a01b0382166123df5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d6d565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b603c54600160b01b900460ff16156124a65760405162461bcd60e51b815260206004820152602360248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201526232b21760e91b6064820152608401610d6d565b6124b082826127ed565b1580156124ca57506029546001600160a01b038281169116145b156111b3576001600160a01b0382166000908152600a602052604090819020805460ff19166001908117909155603c805460ff60b01b1916600160b01b17905542603e55602e805460ff60a81b1916600160a81b17905590517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599161255491901515815260200190565b60405180910390a15050565b60006001600160a01b0384166125c65760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610d6d565b6001600160a01b0383166126285760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610d6d565b6000821161268a5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610d6d565b61269484846127ed565b156126f257603c54600160a81b900460ff166126f25760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642100000000000000006044820152606401610d6d565b6001600160a01b03841660009081526006602052604090205460019060ff168061273457506001600160a01b03841660009081526006602052604090205460ff165b1561273d575060005b6001600160a01b03841660009081526003602052604090205460ff16156127b557602e54600160a01b900460ff161580156127815750602e54600160a81b900460ff165b156127b55760006127913061188d565b905060335481106127b35760345481106127aa57506034545b6127b3816128ad565b505b6127c185858584612c51565b95945050505050565b60008060006127d7613067565b90925090506127e681836138e8565b9250505090565b600080546001600160a01b0384811691161480159061281a57506000546001600160a01b03838116911614155b801561283f57506001600160a01b0382166000908152600a602052604090205460ff16155b801561286457506001600160a01b0383166000908152600a602052604090205460ff16155b801561287e5750602b546001600160a01b03838116911614155b801561289257506001600160a01b03821615155b80156112e557506001600160a01b0383163014159392505050565b602e805460ff60a01b1916600160a01b179055601e54601d546128d091906138fc565b15612c415760006002601e54601d546128e991906138fc565b601d546128f69085613b6a565b61290091906138e8565b61290a91906138e8565b905060006129188284613890565b6040805160028082526060820183529293506000929091602083019080368337019050509050308160008151811061295257612952613864565b6001600160a01b03928316602091820292909201810191909152602854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156129ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129cf9190613b95565b816001815181106129e2576129e2613864565b6001600160a01b03928316602091820292909201015260285460405163791ac94760e01b815291169063791ac94790612a28908590600090869030904290600401613bb2565b600060405180830381600087803b158015612a4257600080fd5b505af1158015612a56573d6000803e3d6000fd5b5050505060006002601e54601d54612a6e91906138fc565b601d54612a7b9047613b6a565b612a8591906138e8565b612a8f91906138e8565b90508315612b7157602854602b5460405163f305d71960e01b81523060048201526024810187905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015612b07573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b2c9190613c23565b505060408051868152602081018490529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561915060600160405180910390a15b6000612b7d8587613890565b1115612c3c576020546022544791600091612b9890846138e8565b612ba29190613b6a565b9050600060215460225484612bb791906138e8565b612bc19190613b6a565b602e546040519192506001600160a01b03169083156108fc029084906000818181858888f19350505050158015612bfc573d6000803e3d6000fd5b50602d546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015612c37573d6000803e3d6000fd5b505050505b505050505b50602e805460ff60a01b19169055565b603c54600090600160a01b900460ff16612ce5576001600160a01b03851660009081526009602052604090205460ff16612ce05760405162461bcd60e51b815260206004820152602a60248201527f4f6e6c792077686974656c697374732063616e207472616e73666572206174206044820152693a3434b9903a34b6b29760b11b6064820152608401610d6d565b612d7a565b603c54600160b01b900460ff16612d7a57612d008585612440565b603c54600160b01b900460ff16158015612d1f5750612d1f85856127ed565b15612d7a5760405162461bcd60e51b815260206004820152602560248201527f4f6e6c79206f776e65722063616e207472616e736665722061742074686973206044820152643a34b6b29760d91b6064820152608401610d6d565b6000612d88868686866131ea565b60808101516001600160a01b038816600090815260016020526040902054919250612db291613890565b6001600160a01b0380881660009081526001602052604080822093909355606084015191881681529190912054612de991906138fc565b6001600160a01b0380871660009081526001602090815260408083209490945591891681526007909152205460ff168015612e3d57506001600160a01b03851660009081526007602052604090205460ff16155b15612e84576001600160a01b038616600090815260026020526040902054612e66908590613890565b6001600160a01b038716600090815260026020526040902055612fc4565b6001600160a01b03861660009081526007602052604090205460ff16158015612ec557506001600160a01b03851660009081526007602052604090205460ff165b15612f0d5780516001600160a01b038616600090815260026020526040902054612eef91906138fc565b6001600160a01b038616600090815260026020526040902055612fc4565b6001600160a01b03861660009081526007602052604090205460ff168015612f4d57506001600160a01b03851660009081526007602052604090205460ff165b15612fc4576001600160a01b038616600090815260026020526040902054612f76908590613890565b6001600160a01b0380881660009081526002602052604080822093909355835191881681529190912054612faa91906138fc565b6001600160a01b0386166000908152600260205260409020555b604081015115612fdc57612fdc8682604001516133d8565b60008160a001511180612ff3575060008160200151115b1561300a5761300a8160a0015182602001516134a4565b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836000015160405161305391815260200190565b60405180910390a350600195945050505050565b6026546025546000918291825b6008548110156131b95782600160006008848154811061309657613096613864565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061310157508160026000600884815481106130da576130da613864565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561311757602654602554945094505050509091565b600160006008838154811061312e5761312e613864565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461315d9084613890565b9250600260006008838154811061317657613176613864565b60009182526020808320909101546001600160a01b031683528201929092526040019020546131a59083613890565b9150806131b1816138b9565b915050613074565b506025546026546131ca91906138e8565b8210156131e1576026546025549350935050509091565b90939092509050565b6132236040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b61325c6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60006132666127ca565b90506132728186613b6a565b60808301528315613382576001600160a01b03861660009081526003602052604090205460ff16156132b557601454600e55601554600f55601654601055613300565b6001600160a01b03871660009081526003602052604090205460ff16156132ed57601154600e55601254600f55601354601055613300565b601754600e55601854600f556019546010555b601f54600e546133109087613b6a565b61331a91906138e8565b6020830152601f54601054600f5461333291906138fc565b61333c9087613b6a565b61334691906138e8565b60408301819052602083015161335c91906138fc565b6133669086613890565b82526020820151613378908290613b6a565b60a083015261339b565b6000602083018190526040830181905285835260a08301525b8082604001516133ab9190613b6a565b8260a001516133ba91906138fc565b82608001516133c99190613890565b60608301525095945050505050565b60006133e26127ca565b905060006133f08284613b6a565b3060009081526001602052604090205490915061340e9082906138fc565b3060009081526001602090815260408083209390935560079052205460ff161561345e573060009081526002602052604090205461344d9084906138fc565b306000908152600260205260409020555b60405183815230906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050565b816026546134b29190613890565b6026556027546134c39082906138fc565b6027555050565b600060208083528351808285015260005b818110156134f7578581018301518582016040015282016134db565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611cca57600080fd5b6000806040838503121561354057600080fd5b823561354b81613518565b946020939093013593505050565b60008060006060848603121561356e57600080fd5b505081359360208301359350604090920135919050565b60006020828403121561359757600080fd5b81356112e581613518565b803580151581146135b257600080fd5b919050565b600080604083850312156135ca57600080fd5b82356135d581613518565b91506135e3602084016135a2565b90509250929050565b60008060006060848603121561360157600080fd5b833561360c81613518565b9250602084013561361c81613518565b929592945050506040919091013590565b60006020828403121561363f57600080fd5b5035919050565b6000806040838503121561365957600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261368f57600080fd5b813567ffffffffffffffff808211156136aa576136aa613668565b604051601f8301601f19908116603f011681019082821181831017156136d2576136d2613668565b816040528381528660208588010111156136eb57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561371e57600080fd5b823567ffffffffffffffff8082111561373657600080fd5b6137428683870161367e565b9350602085013591508082111561375857600080fd5b506137658582860161367e565b9150509250929050565b60006020828403121561378157600080fd5b6112e5826135a2565b6000806040838503121561379d57600080fd5b82356137a881613518565b915060208301356137b881613518565b809150509250929050565b600080600080608085870312156137d957600080fd5b5050823594602084013594506040840135936060013592509050565b600181811c9082168061380957607f821691505b60208210810361382957634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610d3d57610d3d61387a565b634e487b7160e01b600052603160045260246000fd5b6000600182016138cb576138cb61387a565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826138f7576138f76138d2565b500490565b80820180821115610d3d57610d3d61387a565b6020808252603d908201527f43616c6c2072656e6f756e63654f776e65727368697020746f207472616e736660408201527f6572206f776e657220746f20746865207a65726f20616464726573732e000000606082015260800190565b601f8211156111b157600081815260208120601f850160051c810160208610156139935750805b601f850160051c820191505b818110156139b25782815560010161399f565b505050505050565b815167ffffffffffffffff8111156139d4576139d4613668565b6139e8816139e284546137f5565b8461396c565b602080601f831160018114613a1d5760008415613a055750858301515b600019600386901b1c1916600185901b1785556139b2565b600085815260208120601f198616915b82811015613a4c57888601518255948401946001909101908401613a2d565b5085821015613a6a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600181815b80851115613ab5578160001904821115613a9b57613a9b61387a565b80851615613aa857918102915b93841c9390800290613a7f565b509250929050565b600082613acc57506001610d3d565b81613ad957506000610d3d565b8160018114613aef5760028114613af957613b15565b6001915050610d3d565b60ff841115613b0a57613b0a61387a565b50506001821b610d3d565b5060208310610133831016604e8410600b8410161715613b38575081810a610d3d565b613b428383613a7a565b8060001904821115613b5657613b5661387a565b029392505050565b60006112e58383613abd565b8082028115828204841417610d3d57610d3d61387a565b600082613b9057613b906138d2565b500690565b600060208284031215613ba757600080fd5b81516112e581613518565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613c025784516001600160a01b031683529383019391830191600101613bdd565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215613c3857600080fd5b835192506020840151915060408401519050925092509256fea264697066735822122046c70b26f94897a76de67239fd1ea513965b55da7dba348a1ce1d7f412de13db64736f6c63430008110033

Deployed Bytecode

0x6080604052600436106104145760003560e01c80636bc87c3a1161021e578063bbcea6bf11610123578063da4b33c7116100ab578063e7c281d61161007a578063e7c281d614610c0e578063ea08d30b14610c2e578063eafb5a3c14610c44578063f6540ec714610c64578063fb78680d14610c7a57600080fd5b8063da4b33c714610b72578063dc44b6a014610b92578063dd62ed3e14610ba8578063e4a34dce14610bee57600080fd5b8063c8607952116100f2578063c860795214610af1578063c9987e9814610b07578063d038b07e14610b1c578063d4154e8514610b32578063d9e6646014610b5257600080fd5b8063bbcea6bf14610a6c578063c49b9a8014610a82578063c5d2418914610aa2578063c7566d5a14610ab857600080fd5b806388f82020116101a6578063a457c2d711610175578063a457c2d7146109cb578063a5743d86146109eb578063a9059cbb14610a0c578063b746454c14610a2c578063bac3052b14610a4c57600080fd5b806388f820201461095f578063893d20e8146109985780638da5cb5b1461099857806395d89b41146109b657600080fd5b806370a08231116101ed57806370a08231146108de578063715018a6146108fe57806371e078d51461091357806380c581d11461092957806388790a681461094957600080fd5b80636bc87c3a146108725780636c6d9fa1146108885780636cbdd5e3146108a85780636d5f08f1146108be57600080fd5b80632e8fa821116103245780634fb2e45d116102ac578063575f18e51161027b578063575f18e5146107dc57806358fa63ca146107fc578063640384091461081c5780636612e66f146108325780636639dd931461085257600080fd5b80634fb2e45d1461074257806350a8e016146107625780635342acb414610783578063571ac8b0146107bc57600080fd5b806343cc8c2a116102f357806343cc8c2a146106a5578063452ed4f1146106d557806345e8c85c146106f55780634a74bb021461070b5780634ef3cce51461072c57600080fd5b80632e8fa82114610637578063313ce5671461064d578063384f6b511461066f578063395093511461068557600080fd5b806313114a9d116103a757806318160ddd1161037657806318160ddd146105ac57806322976e0d146105c157806323b872dd146105d75780632af60325146105f75780632d8381191461061757600080fd5b806313114a9d1461054b57806313e461921461056057806315639c1b1461058057806317eade331461059657600080fd5b8063095ea7b3116103e3578063095ea7b3146104c35780630e954d8e146104f3578063111be3161461050957806312d11b071461052b57600080fd5b806303fd2a45146104205780630445b6671461045d57806306fdde03146104815780630758d924146104a357600080fd5b3661041b57005b600080fd5b34801561042c57600080fd5b50602b54610440906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561046957600080fd5b5061047360335481565b604051908152602001610454565b34801561048d57600080fd5b50610496610c9a565b60405161045491906134ca565b3480156104af57600080fd5b50602854610440906001600160a01b031681565b3480156104cf57600080fd5b506104e36104de36600461352d565b610d2c565b6040519015158152602001610454565b3480156104ff57600080fd5b5061047360215481565b34801561051557600080fd5b50610529610524366004613559565b610d43565b005b34801561053757600080fd5b50610529610546366004613585565b610d84565b34801561055757600080fd5b50602754610473565b34801561056c57600080fd5b5061052961057b3660046135b7565b610ec0565b34801561058c57600080fd5b50610473600e5481565b3480156105a257600080fd5b5061047360225481565b3480156105b857600080fd5b50602554610473565b3480156105cd57600080fd5b5061047360105481565b3480156105e357600080fd5b506104e36105f23660046135ec565b6111b7565b34801561060357600080fd5b50610529610612366004613585565b61120a565b34801561062357600080fd5b5061047361063236600461362d565b611268565b34801561064357600080fd5b5061047360345481565b34801561065957600080fd5b5060235460405160ff9091168152602001610454565b34801561067b57600080fd5b50610473601d5481565b34801561069157600080fd5b506104e36106a036600461352d565b6112ec565b3480156106b157600080fd5b506104e36106c0366004613585565b60036020526000908152604090205460ff1681565b3480156106e157600080fd5b50602954610440906001600160a01b031681565b34801561070157600080fd5b5061047360175481565b34801561071757600080fd5b50602e546104e390600160a81b900460ff1681565b34801561073857600080fd5b50610473601e5481565b34801561074e57600080fd5b5061052961075d366004613585565b611323565b34801561076e57600080fd5b50603c546104e390600160b01b900460ff1681565b34801561078f57600080fd5b506104e361079e366004613585565b6001600160a01b031660009081526006602052604090205460ff1690565b3480156107c857600080fd5b506104e36107d7366004613585565b6114c4565b3480156107e857600080fd5b506105296107f7366004613559565b6114d2565b34801561080857600080fd5b50602c54610440906001600160a01b031681565b34801561082857600080fd5b5061047360305481565b34801561083e57600080fd5b5061052961084d3660046135b7565b611558565b34801561085e57600080fd5b5061052961086d366004613646565b6115ad565b34801561087e57600080fd5b50610473600f5481565b34801561089457600080fd5b506105296108a3366004613559565b6115e2565b3480156108b457600080fd5b5061047360195481565b3480156108ca57600080fd5b506105296108d936600461370b565b611668565b3480156108ea57600080fd5b506104736108f9366004613585565b61188d565b34801561090a57600080fd5b506105296118ec565b34801561091f57600080fd5b5061047360205481565b34801561093557600080fd5b506105296109443660046135b7565b61196b565b34801561095557600080fd5b5061047360155481565b34801561096b57600080fd5b506104e361097a366004613585565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156109a457600080fd5b506000546001600160a01b0316610440565b3480156109c257600080fd5b50610496611a53565b3480156109d757600080fd5b506104e36109e636600461352d565b611a62565b3480156109f757600080fd5b50603c546104e390600160a01b900460ff1681565b348015610a1857600080fd5b506104e3610a2736600461352d565b611a99565b348015610a3857600080fd5b50610529610a47366004613585565b611aa6565b348015610a5857600080fd5b50610529610a67366004613585565b611b45565b348015610a7857600080fd5b5061047360145481565b348015610a8e57600080fd5b50610529610a9d36600461376f565b611be4565b348015610aae57600080fd5b5061047360135481565b348015610ac457600080fd5b506104e3610ad3366004613585565b6001600160a01b031660009081526009602052604090205460ff1690565b348015610afd57600080fd5b5061047360165481565b348015610b1357600080fd5b50610529611c66565b348015610b2857600080fd5b5061047360115481565b348015610b3e57600080fd5b50610529610b4d366004613646565b611ccd565b348015610b5e57600080fd5b50602a54610440906001600160a01b031681565b348015610b7e57600080fd5b50610529610b8d366004613646565b611dc0565b348015610b9e57600080fd5b5061047360125481565b348015610bb457600080fd5b50610473610bc336600461378a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610bfa57600080fd5b50610529610c093660046135b7565b611ea8565b348015610c1a57600080fd5b50610529610c29366004613559565b611efd565b348015610c3a57600080fd5b5061047360185481565b348015610c5057600080fd5b50610529610c5f366004613585565b611f83565b348015610c7057600080fd5b5061047360325481565b348015610c8657600080fd5b50610529610c953660046137c3565b6122b3565b6060600c8054610ca9906137f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd5906137f5565b8015610d225780601f10610cf757610100808354040283529160200191610d22565b820191906000526020600020905b815481529060010190602001808311610d0557829003601f168201915b5050505050905090565b6000610d3933848461231c565b5060015b92915050565b6000546001600160a01b03163314610d765760405162461bcd60e51b8152600401610d6d9061382f565b60405180910390fd5b602092909255602155602255565b6000546001600160a01b03163314610dae5760405162461bcd60e51b8152600401610d6d9061382f565b610dbf603a546039546038546115e2565b610dd0603754603654603554611efd565b610ddc600160036115ad565b602980546001600160a01b0319166001600160a01b038381169182178355600091825260036020526040909120805460ff191660019081179091559154610e2592911690610ec0565b3060009081526005602090815260408083206028546001600160a01b039081168552925290912060001990819055602a54610e61921690610d2c565b50602854610e7c9030906001600160a01b031660001961231c565b602e805460ff60a81b1916600160a81b179055610eaa610ea46000546001600160a01b031690565b82612440565b50603c805460ff60a01b1916600160a01b179055565b6000546001600160a01b03163314610eea5760405162461bcd60e51b8152600401610d6d9061382f565b80151560010361101e576001600160a01b03821660009081526007602052604090205460ff1615610f5d5760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c7265616479206578636c756465642e000000006044820152606401610d6d565b6001600160a01b03821660009081526001602052604090205415610fb7576001600160a01b038216600090815260016020526040902054610f9d90611268565b6001600160a01b0383166000908152600260205260409020555b506001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b8015156000036111b3576001600160a01b03821660009081526007602052604090205460ff166110905760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c726561647920696e636c756465642e000000006044820152606401610d6d565b60005b6008548110156111b157826001600160a01b0316600882815481106110ba576110ba613864565b6000918252602090912001546001600160a01b03160361119f57600880546110e490600190613890565b815481106110f4576110f4613864565b600091825260209091200154600880546001600160a01b03909216918390811061112057611120613864565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559185168152600282526040808220829055600790925220805460ff191690556008805480611178576111786138a3565b600082815260209020810160001990810180546001600160a01b03191690550190556111b1565b806111a9816138b9565b915050611093565b505b5050565b60006111c4848484612560565b506001600160a01b0384166000908152600560209081526040808320338085529252909120546112009186916111fb908690613890565b61231c565b5060019392505050565b6000546001600160a01b031633146112345760405162461bcd60e51b8152600401610d6d9061382f565b6001600160a01b0390811660009081526009602090815260408220805460ff19166001179055603c54909216905260069052565b60006026548211156112cf5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610d6d565b60006112d96127ca565b90506112e581846138e8565b9392505050565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610d399185906111fb9086906138fc565b6000546001600160a01b0316331461134d5760405162461bcd60e51b8152600401610d6d9061382f565b6001600160a01b0381166113735760405162461bcd60e51b8152600401610d6d9061390f565b602b546001600160a01b03908116908216036113a15760405162461bcd60e51b8152600401610d6d9061390f565b600080546113ba916001600160a01b0390911690611558565b6113c5816001611558565b6113d0816001610ec0565b600054602d546001600160a01b0391821691160361140457602d80546001600160a01b0319166001600160a01b0383161790555b600054611419906001600160a01b031661188d565b600080546001600160a01b039081168252600560209081526040808420868416855290915282209290925580549091611452911661188d565b111561147957600054611477906001600160a01b0316826114728261188d565b612560565b505b600080546001600160a01b0319166001600160a01b0383169081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6000610d3d82600019610d2c565b6000546001600160a01b031633146114fc5760405162461bcd60e51b8152600401610d6d9061382f565b601a5483111580156115105750601b548211155b801561151e5750601c548111155b61152757600080fd5b6113248161153584866138fc565b61153f91906138fc565b111561154a57600080fd5b601792909255601855601955565b6000546001600160a01b031633146115825760405162461bcd60e51b8152600401610d6d9061382f565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146115d75760405162461bcd60e51b8152600401610d6d9061382f565b601d91909155601e55565b6000546001600160a01b0316331461160c5760405162461bcd60e51b8152600401610d6d9061382f565b601a5483111580156116205750601b548211155b801561162e5750601c548111155b61163757600080fd5b6113248161164584866138fc565b61164f91906138fc565b111561165a57600080fd5b601192909255601255601355565b6000546001600160a01b031633146116925760405162461bcd60e51b8152600401610d6d9061382f565b60425460ff16156116a257600080fd5b600c6116ae83826139ba565b50600d6116bb82826139ba565b50633b9aca00600b556023805460ff191660129081179091556024556024546116e590600a613b5e565b600b546116f29190613b6a565b602581905561170390600019613b81565b61170f90600019613890565b6026556025546064906117229082613b6a565b61172c91906138e8565b602f55600b54620186a090611743906103e8613b6a565b61174d91906138e8565b6030556025546064906117609082613b6a565b61176a91906138e8565b603155600b546103e89061177f90600a613b6a565b61178991906138e8565b6032556025546127109061179e906005613b6a565b6117a891906138e8565b6033556025546103e8906117bd906005613b6a565b6117c791906138e8565b6034556042805460ff191660019081179091556026549060006117f26000546001600160a01b031690565b6001600160a01b0316815260208101919091526040016000205561181e6000546001600160a01b031690565b602c546025546040519081526001600160a01b0392831692909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a343604155611876306001610ec0565b5050603c805460ff60a81b1916600160a81b179055565b6001600160a01b03811660009081526007602052604081205460ff16156118ca57506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610d3d90611268565b6000546001600160a01b031633146119165760405162461bcd60e51b8152600401610d6d9061382f565b6000805461192f916001600160a01b0390911690611558565b600080546001600160a01b031916815560405181907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3565b6000546001600160a01b031633146119955760405162461bcd60e51b8152600401610d6d9061382f565b8015156000036119c157506001600160a01b03166000908152600360205260409020805460ff19169055565b60045415611a285762093a80600454426119db9190613890565b11611a285760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f74207365742061206e657720706169722074686973207765656b216044820152606401610d6d565b6001600160a01b0382166000908152600360205260409020805460ff19166001179055426004555050565b6060600d8054610ca9906137f5565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610d399185906111fb908690613890565b6000611200338484612560565b6000546001600160a01b03163314611ad05760405162461bcd60e51b8152600401610d6d9061382f565b602e546001600160a01b03808316911603611b235760405162461bcd60e51b815260206004820152601360248201527257616c6c657420616c7265616479207365742160681b6044820152606401610d6d565b602e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611b6f5760405162461bcd60e51b8152600401610d6d9061382f565b602d546001600160a01b03808316911603611bc25760405162461bcd60e51b815260206004820152601360248201527257616c6c657420616c7265616479207365742160681b6044820152606401610d6d565b602d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611c0e5760405162461bcd60e51b8152600401610d6d9061382f565b602e8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990611c5b90831515815260200190565b60405180910390a150565b6000546001600160a01b03163314611c905760405162461bcd60e51b8152600401610d6d9061382f565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015611cca573d6000803e3d6000fd5b50565b6000546001600160a01b03163314611cf75760405162461bcd60e51b8152600401610d6d9061382f565b60008183602554611d089190613b6a565b611d1291906138e8565b90506103e8602554611d2491906138e8565b811015611d995760405162461bcd60e51b815260206004820152603760248201527f4d6178205472616e73616374696f6e20616d74206d7573742062652061626f7660448201527f6520302e3125206f6620746f74616c20737570706c792e0000000000000000006064820152608401610d6d565b602f819055600b548290611dae908590613b6a565b611db891906138e8565b603055505050565b6000546001600160a01b03163314611dea5760405162461bcd60e51b8152600401610d6d9061382f565b60008183602554611dfb9190613b6a565b611e0591906138e8565b90506103e8602554611e1791906138e8565b811015611e815760405162461bcd60e51b815260206004820152603260248201527f4d61782057616c6c657420616d74206d7573742062652061626f766520302e31604482015271129037b3103a37ba30b61039bab838363c9760711b6064820152608401610d6d565b6031819055600b548290611e96908590613b6a565b611ea091906138e8565b603255505050565b6000546001600160a01b03163314611ed25760405162461bcd60e51b8152600401610d6d9061382f565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314611f275760405162461bcd60e51b8152600401610d6d9061382f565b601a548311158015611f3b5750601b548211155b8015611f495750601c548111155b611f5257600080fd5b61132481611f6084866138fc565b611f6a91906138fc565b1115611f7557600080fd5b601492909255601555601655565b6000546001600160a01b03163314611fad5760405162461bcd60e51b8152600401610d6d9061382f565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ff2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120169190613b95565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612063573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120879190613b95565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa1580156120d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f69190613b95565b90506001600160a01b03811661226f57816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612144573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121689190613b95565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d99190613b95565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015612226573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224a9190613b95565b602980546001600160a01b0319166001600160a01b039290921691909117905561228b565b602980546001600160a01b0319166001600160a01b0383161790555b602880546001600160a01b0319166001600160a01b0384161790556111b1308460001961231c565b6000546001600160a01b031633146122dd5760405162461bcd60e51b8152600401610d6d9061382f565b82846025546122ec9190613b6a565b6122f691906138e8565b6033556025548190612309908490613b6a565b61231391906138e8565b60345550505050565b6001600160a01b03831661237e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d6d565b6001600160a01b0382166123df5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d6d565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b603c54600160b01b900460ff16156124a65760405162461bcd60e51b815260206004820152602360248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201526232b21760e91b6064820152608401610d6d565b6124b082826127ed565b1580156124ca57506029546001600160a01b038281169116145b156111b3576001600160a01b0382166000908152600a602052604090819020805460ff19166001908117909155603c805460ff60b01b1916600160b01b17905542603e55602e805460ff60a81b1916600160a81b17905590517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599161255491901515815260200190565b60405180910390a15050565b60006001600160a01b0384166125c65760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610d6d565b6001600160a01b0383166126285760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610d6d565b6000821161268a5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610d6d565b61269484846127ed565b156126f257603c54600160a81b900460ff166126f25760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642100000000000000006044820152606401610d6d565b6001600160a01b03841660009081526006602052604090205460019060ff168061273457506001600160a01b03841660009081526006602052604090205460ff165b1561273d575060005b6001600160a01b03841660009081526003602052604090205460ff16156127b557602e54600160a01b900460ff161580156127815750602e54600160a81b900460ff165b156127b55760006127913061188d565b905060335481106127b35760345481106127aa57506034545b6127b3816128ad565b505b6127c185858584612c51565b95945050505050565b60008060006127d7613067565b90925090506127e681836138e8565b9250505090565b600080546001600160a01b0384811691161480159061281a57506000546001600160a01b03838116911614155b801561283f57506001600160a01b0382166000908152600a602052604090205460ff16155b801561286457506001600160a01b0383166000908152600a602052604090205460ff16155b801561287e5750602b546001600160a01b03838116911614155b801561289257506001600160a01b03821615155b80156112e557506001600160a01b0383163014159392505050565b602e805460ff60a01b1916600160a01b179055601e54601d546128d091906138fc565b15612c415760006002601e54601d546128e991906138fc565b601d546128f69085613b6a565b61290091906138e8565b61290a91906138e8565b905060006129188284613890565b6040805160028082526060820183529293506000929091602083019080368337019050509050308160008151811061295257612952613864565b6001600160a01b03928316602091820292909201810191909152602854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156129ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129cf9190613b95565b816001815181106129e2576129e2613864565b6001600160a01b03928316602091820292909201015260285460405163791ac94760e01b815291169063791ac94790612a28908590600090869030904290600401613bb2565b600060405180830381600087803b158015612a4257600080fd5b505af1158015612a56573d6000803e3d6000fd5b5050505060006002601e54601d54612a6e91906138fc565b601d54612a7b9047613b6a565b612a8591906138e8565b612a8f91906138e8565b90508315612b7157602854602b5460405163f305d71960e01b81523060048201526024810187905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015612b07573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b2c9190613c23565b505060408051868152602081018490529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561915060600160405180910390a15b6000612b7d8587613890565b1115612c3c576020546022544791600091612b9890846138e8565b612ba29190613b6a565b9050600060215460225484612bb791906138e8565b612bc19190613b6a565b602e546040519192506001600160a01b03169083156108fc029084906000818181858888f19350505050158015612bfc573d6000803e3d6000fd5b50602d546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015612c37573d6000803e3d6000fd5b505050505b505050505b50602e805460ff60a01b19169055565b603c54600090600160a01b900460ff16612ce5576001600160a01b03851660009081526009602052604090205460ff16612ce05760405162461bcd60e51b815260206004820152602a60248201527f4f6e6c792077686974656c697374732063616e207472616e73666572206174206044820152693a3434b9903a34b6b29760b11b6064820152608401610d6d565b612d7a565b603c54600160b01b900460ff16612d7a57612d008585612440565b603c54600160b01b900460ff16158015612d1f5750612d1f85856127ed565b15612d7a5760405162461bcd60e51b815260206004820152602560248201527f4f6e6c79206f776e65722063616e207472616e736665722061742074686973206044820152643a34b6b29760d91b6064820152608401610d6d565b6000612d88868686866131ea565b60808101516001600160a01b038816600090815260016020526040902054919250612db291613890565b6001600160a01b0380881660009081526001602052604080822093909355606084015191881681529190912054612de991906138fc565b6001600160a01b0380871660009081526001602090815260408083209490945591891681526007909152205460ff168015612e3d57506001600160a01b03851660009081526007602052604090205460ff16155b15612e84576001600160a01b038616600090815260026020526040902054612e66908590613890565b6001600160a01b038716600090815260026020526040902055612fc4565b6001600160a01b03861660009081526007602052604090205460ff16158015612ec557506001600160a01b03851660009081526007602052604090205460ff165b15612f0d5780516001600160a01b038616600090815260026020526040902054612eef91906138fc565b6001600160a01b038616600090815260026020526040902055612fc4565b6001600160a01b03861660009081526007602052604090205460ff168015612f4d57506001600160a01b03851660009081526007602052604090205460ff165b15612fc4576001600160a01b038616600090815260026020526040902054612f76908590613890565b6001600160a01b0380881660009081526002602052604080822093909355835191881681529190912054612faa91906138fc565b6001600160a01b0386166000908152600260205260409020555b604081015115612fdc57612fdc8682604001516133d8565b60008160a001511180612ff3575060008160200151115b1561300a5761300a8160a0015182602001516134a4565b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836000015160405161305391815260200190565b60405180910390a350600195945050505050565b6026546025546000918291825b6008548110156131b95782600160006008848154811061309657613096613864565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061310157508160026000600884815481106130da576130da613864565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561311757602654602554945094505050509091565b600160006008838154811061312e5761312e613864565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461315d9084613890565b9250600260006008838154811061317657613176613864565b60009182526020808320909101546001600160a01b031683528201929092526040019020546131a59083613890565b9150806131b1816138b9565b915050613074565b506025546026546131ca91906138e8565b8210156131e1576026546025549350935050509091565b90939092509050565b6132236040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b61325c6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60006132666127ca565b90506132728186613b6a565b60808301528315613382576001600160a01b03861660009081526003602052604090205460ff16156132b557601454600e55601554600f55601654601055613300565b6001600160a01b03871660009081526003602052604090205460ff16156132ed57601154600e55601254600f55601354601055613300565b601754600e55601854600f556019546010555b601f54600e546133109087613b6a565b61331a91906138e8565b6020830152601f54601054600f5461333291906138fc565b61333c9087613b6a565b61334691906138e8565b60408301819052602083015161335c91906138fc565b6133669086613890565b82526020820151613378908290613b6a565b60a083015261339b565b6000602083018190526040830181905285835260a08301525b8082604001516133ab9190613b6a565b8260a001516133ba91906138fc565b82608001516133c99190613890565b60608301525095945050505050565b60006133e26127ca565b905060006133f08284613b6a565b3060009081526001602052604090205490915061340e9082906138fc565b3060009081526001602090815260408083209390935560079052205460ff161561345e573060009081526002602052604090205461344d9084906138fc565b306000908152600260205260409020555b60405183815230906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050565b816026546134b29190613890565b6026556027546134c39082906138fc565b6027555050565b600060208083528351808285015260005b818110156134f7578581018301518582016040015282016134db565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611cca57600080fd5b6000806040838503121561354057600080fd5b823561354b81613518565b946020939093013593505050565b60008060006060848603121561356e57600080fd5b505081359360208301359350604090920135919050565b60006020828403121561359757600080fd5b81356112e581613518565b803580151581146135b257600080fd5b919050565b600080604083850312156135ca57600080fd5b82356135d581613518565b91506135e3602084016135a2565b90509250929050565b60008060006060848603121561360157600080fd5b833561360c81613518565b9250602084013561361c81613518565b929592945050506040919091013590565b60006020828403121561363f57600080fd5b5035919050565b6000806040838503121561365957600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261368f57600080fd5b813567ffffffffffffffff808211156136aa576136aa613668565b604051601f8301601f19908116603f011681019082821181831017156136d2576136d2613668565b816040528381528660208588010111156136eb57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561371e57600080fd5b823567ffffffffffffffff8082111561373657600080fd5b6137428683870161367e565b9350602085013591508082111561375857600080fd5b506137658582860161367e565b9150509250929050565b60006020828403121561378157600080fd5b6112e5826135a2565b6000806040838503121561379d57600080fd5b82356137a881613518565b915060208301356137b881613518565b809150509250929050565b600080600080608085870312156137d957600080fd5b5050823594602084013594506040840135936060013592509050565b600181811c9082168061380957607f821691505b60208210810361382957634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610d3d57610d3d61387a565b634e487b7160e01b600052603160045260246000fd5b6000600182016138cb576138cb61387a565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826138f7576138f76138d2565b500490565b80820180821115610d3d57610d3d61387a565b6020808252603d908201527f43616c6c2072656e6f756e63654f776e65727368697020746f207472616e736660408201527f6572206f776e657220746f20746865207a65726f20616464726573732e000000606082015260800190565b601f8211156111b157600081815260208120601f850160051c810160208610156139935750805b601f850160051c820191505b818110156139b25782815560010161399f565b505050505050565b815167ffffffffffffffff8111156139d4576139d4613668565b6139e8816139e284546137f5565b8461396c565b602080601f831160018114613a1d5760008415613a055750858301515b600019600386901b1c1916600185901b1785556139b2565b600085815260208120601f198616915b82811015613a4c57888601518255948401946001909101908401613a2d565b5085821015613a6a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600181815b80851115613ab5578160001904821115613a9b57613a9b61387a565b80851615613aa857918102915b93841c9390800290613a7f565b509250929050565b600082613acc57506001610d3d565b81613ad957506000610d3d565b8160018114613aef5760028114613af957613b15565b6001915050610d3d565b60ff841115613b0a57613b0a61387a565b50506001821b610d3d565b5060208310610133831016604e8410600b8410161715613b38575081810a610d3d565b613b428383613a7a565b8060001904821115613b5657613b5661387a565b029392505050565b60006112e58383613abd565b8082028115828204841417610d3d57610d3d61387a565b600082613b9057613b906138d2565b500690565b600060208284031215613ba757600080fd5b81516112e581613518565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613c025784516001600160a01b031683529383019391830191600101613bdd565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215613c3857600080fd5b835192506020840151915060408401519050925092509256fea264697066735822122046c70b26f94897a76de67239fd1ea513965b55da7dba348a1ce1d7f412de13db64736f6c63430008110033

Deployed Bytecode Sourcemap

8921:28085:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10974:64;;;;;;;;;;-1:-1:-1;10974:64:0;;;;-1:-1:-1;;;;;10974:64:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;10974:64:0;;;;;;;;11429:28;;;;;;;;;;;;;;;;;;;368:25:1;;;356:2;341:18;11429:28:0;222:177:1;19377:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;10845:35::-;;;;;;;;;;-1:-1:-1;10845:35:0;;;;-1:-1:-1;;;;;10845:35:0;;;20172:193;;;;;;;;;;-1:-1:-1;20172:193:0;;;;;:::i;:::-;;:::i;:::-;;;1812:14:1;;1805:22;1787:41;;1775:2;1760:18;20172:193:0;1647:187:1;10562:27:0;;;;;;;;;;;;;;;;24335:195;;;;;;;;;;-1:-1:-1;24335:195:0;;;;;:::i;:::-;;:::i;:::-;;16198:844;;;;;;;;;;-1:-1:-1;16198:844:0;;;;;:::i;:::-;;:::i;27494:87::-;;;;;;;;;;-1:-1:-1;27563:10:0;;27494:87;;26556:930;;;;;;;;;;-1:-1:-1;26556:930:0;;;;;:::i;:::-;;:::i;9689:30::-;;;;;;;;;;;;;;;;10596:31;;;;;;;;;;;;;;;;19082:97;;;;;;;;;;-1:-1:-1;19164:7:0;;19082:97;;9765:32;;;;;;;;;;;;;;;;20501:350;;;;;;;;;;-1:-1:-1;20501:350:0;;;;;:::i;:::-;;:::i;16044:146::-;;;;;;;;;;-1:-1:-1;16044:146:0;;;;;:::i;:::-;;:::i;27934:319::-;;;;;;;;;;-1:-1:-1;27934:319:0;;;;;:::i;:::-;;:::i;11464:25::-;;;;;;;;;;;;;;;;19187:85;;;;;;;;;;-1:-1:-1;19255:9:0;;19187:85;;19255:9;;;;3685:36:1;;3673:2;3658:18;19187:85:0;3543:184:1;10392:34:0;;;;;;;;;;;;;;;;20859:297;;;;;;;;;;-1:-1:-1;20859:297:0;;;;;:::i;:::-;;:::i;9164:39::-;;;;;;;;;;-1:-1:-1;9164:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;10887:21;;;;;;;;;;-1:-1:-1;10887:21:0;;;;-1:-1:-1;;;;;10887:21:0;;;10095:38;;;;;;;;;;;;;;;;11231:41;;;;;;;;;;-1:-1:-1;11231:41:0;;;;-1:-1:-1;;;11231:41:0;;;;;;10433:34;;;;;;;;;;;;;;;;17694:821;;;;;;;;;;-1:-1:-1;17694:821:0;;;;;:::i;:::-;;:::i;12082:36::-;;;;;;;;;;-1:-1:-1;12082:36:0;;;;-1:-1:-1;;;12082:36:0;;;;;;22734:124;;;;;;;;;;-1:-1:-1;22734:124:0;;;;;:::i;:::-;-1:-1:-1;;;;;22823:27:0;22799:4;22823:27;;;:18;:27;;;;;;;;;22734:124;20373:120;;;;;;;;;;-1:-1:-1;20373:120:0;;;;;:::i;:::-;;:::i;23832:495::-;;;;;;;;;;-1:-1:-1;23832:495:0;;;;;:::i;:::-;;:::i;11045:64::-;;;;;;;;;;-1:-1:-1;11045:64:0;;;;-1:-1:-1;;;;;11045:64:0;;;11316:28;;;;;;;;;;;;;;;;26393:155;;;;;;;;;;-1:-1:-1;26393:155:0;;;;;:::i;:::-;;:::i;24538:181::-;;;;;;;;;;-1:-1:-1;24538:181:0;;;;;:::i;:::-;;:::i;9726:32::-;;;;;;;;;;;;;;;;22866:473;;;;;;;;;;-1:-1:-1;22866:473:0;;;;;:::i;:::-;;:::i;10187:40::-;;;;;;;;;;;;;;;;14742:1142;;;;;;;;;;-1:-1:-1;14742:1142:0;;;;;:::i;:::-;;:::i;19759:198::-;;;;;;;;;;-1:-1:-1;19759:198:0;;;;;:::i;:::-;;:::i;18523:192::-;;;;;;;;;;;;;:::i;10525:30::-;;;;;;;;;;;;;;;;22115:483;;;;;;;;;;-1:-1:-1;22115:483:0;;;;;:::i;:::-;;:::i;10007:36::-;;;;;;;;;;;;;;;;22606:120;;;;;;;;;;-1:-1:-1;22606:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;22698:20:0;22674:4;22698:20;;;:11;:20;;;;;;;;;22606:120;19470:85;;;;;;;;;;-1:-1:-1;19513:7:0;17672:6;-1:-1:-1;;;;;17672:6:0;19470:85;;19280:89;;;;;;;;;;;;;:::i;21164:307::-;;;;;;;;;;-1:-1:-1;21164:307:0;;;;;:::i;:::-;;:::i;11998:39::-;;;;;;;;;;-1:-1:-1;11998:39:0;;;;-1:-1:-1;;;11998:39:0;;;;;;19965:199;;;;;;;;;;-1:-1:-1;19965:199:0;;;;;:::i;:::-;;:::i;25821:193::-;;;;;;;;;;-1:-1:-1;25821:193:0;;;;;:::i;:::-;;:::i;26022:184::-;;;;;;;;;;-1:-1:-1;26022:184:0;;;;;:::i;:::-;;:::i;9966:34::-;;;;;;;;;;;;;;;;26214:171;;;;;;;;;;-1:-1:-1;26214:171:0;;;;;:::i;:::-;;:::i;9910:47::-;;;;;;;;;;;;;;;;14533:164;;;;;;;;;;-1:-1:-1;14533:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;14661:28:0;14632:4;14661:28;;;:18;:28;;;;;;;;;14533:164;10050:36;;;;;;;;;;;;;;;;36464:109;;;;;;;;;;;;;:::i;9806:43::-;;;;;;;;;;;;;;;;24727:367;;;;;;;;;;-1:-1:-1;24727:367:0;;;;;:::i;:::-;;:::i;10936:29::-;;;;;;;;;;-1:-1:-1;10936:29:0;;;;-1:-1:-1;;;;;10936:29:0;;;25102:371;;;;;;;;;;-1:-1:-1;25102:371:0;;;;;:::i;:::-;;:::i;9856:47::-;;;;;;;;;;;;;;;;19563:188;;;;;;;;;;-1:-1:-1;19563:188:0;;;;;:::i;:::-;-1:-1:-1;;;;;19715:19:0;;;19683:7;19715:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;19563:188;14368:157;;;;;;;;;;-1:-1:-1;14368:157:0;;;;;:::i;:::-;;:::i;23347:477::-;;;;;;;;;;-1:-1:-1;23347:477:0;;;;;:::i;:::-;;:::i;10140:40::-;;;;;;;;;;;;;;;;21479:628;;;;;;;;;;-1:-1:-1;21479:628:0;;;;;:::i;:::-;;:::i;11390:30::-;;;;;;;;;;;;;;;;25481:332;;;;;;;;;;-1:-1:-1;25481:332:0;;;;;:::i;:::-;;:::i;19377:85::-;19416:13;19449:5;19442:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19377:85;:::o;20172:193::-;20274:4;20296:39;196:10;20319:7;20328:6;20296:8;:39::i;:::-;-1:-1:-1;20353:4:0;20172:193;;;;;:::o;24335:195::-;12943:6;;-1:-1:-1;;;;;12943:6:0;196:10;12943:22;12935:67;;;;-1:-1:-1;;;12935:67:0;;;;;;;:::i;:::-;;;;;;;;;24454:11:::1;:16:::0;;;;24481:8:::1;:13:::0;24505:12:::1;:17:::0;24335:195::o;16198:844::-;12943:6;;-1:-1:-1;;;;;12943:6:0;196:10;12943:22;12935:67;;;;-1:-1:-1;;;12935:67:0;;;;;;;:::i;:::-;16268:141:::1;16294:26;;16335:24;;16374;;16268:11;:141::i;:::-;16420:145;16447:27;;16489:25;;16529;;16420:12;:145::i;:::-;16576:15;16586:1;16589;16576:9;:15::i;:::-;16604:6;:16:::0;;-1:-1:-1;;;;;;16604:16:0::1;-1:-1:-1::0;;;;;16604:16:0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;16631:16:0;;;:7:::1;:16;::::0;;;;;:23;;-1:-1:-1;;16631:23:0::1;-1:-1:-1::0;16631:23:0;;::::1;::::0;;;16687:6;;16665:35:::1;::::0;16687:6;::::1;::::0;16665:21:::1;:35::i;:::-;16733:4;16713:26;::::0;;;:11:::1;:26;::::0;;;;;;;16748:9:::1;::::0;-1:-1:-1;;;;;16748:9:0;;::::1;16713:46:::0;;;;;;;-1:-1:-1;;16713:66:0;;;;16798:14:::1;::::0;16790:42:::1;::::0;16798:14:::1;::::0;16790:7:::1;:42::i;:::-;-1:-1:-1::0;16875:9:0::1;::::0;16843:62:::1;::::0;16860:4:::1;::::0;-1:-1:-1;;;;;16875:9:0::1;-1:-1:-1::0;;16843:8:0::1;:62::i;:::-;16918:21;:28:::0;;-1:-1:-1;;;;16918:28:0::1;-1:-1:-1::0;;;16918:28:0::1;::::0;;16959:36:::1;16978:7;17645::::0;17672:6;-1:-1:-1;;;;;17672:6:0;;17607:79;16978:7:::1;16987;16959:18;:36::i;:::-;-1:-1:-1::0;17008:19:0::1;:26:::0;;-1:-1:-1;;;;17008:26:0::1;-1:-1:-1::0;;;17008:26:0::1;::::0;;16198:844::o;26556:930::-;12943:6;;-1:-1:-1;;;;;12943:6:0;196:10;12943:22;12935:67;;;;-1:-1:-1;;;12935:67:0;;;;;;;:::i;:::-;26673:15;::::1;;26684:4;26673:15:::0;26669:810:::1;;-1:-1:-1::0;;;;;26714:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;26713:21;26705:62;;;::::0;-1:-1:-1;;;26705:62:0;;7565:2:1;26705:62:0::1;::::0;::::1;7547:21:1::0;7604:2;7584:18;;;7577:30;7643;7623:18;;;7616:58;7691:18;;26705:62:0::1;7363:352:1::0;26705:62:0::1;-1:-1:-1::0;;;;;26786:16:0;::::1;26805:1;26786:16:::0;;;:7:::1;:16;::::0;;;;;:20;26782:117:::1;;-1:-1:-1::0;;;;;26866:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;26846:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;26827:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;26782:117:::1;-1:-1:-1::0;;;;;;26913:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;26913:27:0::1;26936:4;26913:27:::0;;::::1;::::0;;;26955:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;26955:23:0::1;::::0;;::::1;::::0;;26556:930::o;26669:810::-:1;27000:16:::0;::::1;;27011:5;27000:16:::0;26996:483:::1;;-1:-1:-1::0;;;;;27041:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;27033:61;;;::::0;-1:-1:-1;;;27033:61:0;;7922:2:1;27033:61:0::1;::::0;::::1;7904:21:1::0;7961:2;7941:18;;;7934:30;8000;7980:18;;;7973:58;8048:18;;27033:61:0::1;7720:352:1::0;27033:61:0::1;27114:9;27109:359;27133:9;:16:::0;27129:20;::::1;27109:359;;;27195:7;-1:-1:-1::0;;;;;27179:23:0::1;:9;27189:1;27179:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;27179:12:0::1;:23:::0;27175:278:::1;;27242:9;27252:16:::0;;:20:::1;::::0;27271:1:::1;::::0;27252:20:::1;:::i;:::-;27242:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;27227:9:::1;:12:::0;;-1:-1:-1;;;;;27242:31:0;;::::1;::::0;27237:1;;27227:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;27227:46:0::1;-1:-1:-1::0;;;;;27227:46:0;;::::1;;::::0;;27296:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;27339:11:::1;:20:::0;;;;:28;;-1:-1:-1;;27339:28:0::1;::::0;;27390:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;27390:15:0;;;;;-1:-1:-1;;;;;;27390:15:0::1;::::0;;;;;27428:5:::1;;27175:278;27151:3:::0;::::1;::::0;::::1;:::i;:::-;;;;27109:359;;;;26996:483;26556:930:::0;;:::o;20501:350::-;20633:4;20650:36;20660:6;20668:9;20679:6;20650:9;:36::i;:::-;-1:-1:-1;;;;;;20768:19:0;;;;;;:11;:19;;;;;;;;196:10;20768:33;;;;;;;;;20697:124;;20720:6;;20768:42;;20804:6;;20768:42;:::i;:::-;20697:8;:124::i;:::-;-1:-1:-1;20839:4:0;20501:350;;;;;:::o;16044:146::-;12943:6;;-1:-1:-1;;;;;12943:6:0;196:10;12943:22;12935:67;;;;-1:-1:-1;;;12935:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16112:23:0;;::::1;;::::0;;;:18:::1;:23;::::0;;;;;;:30;;-1:-1:-1;;16112:30:0::1;16138:4;16112:30;::::0;;16171:10:::1;::::0;;;::::1;22823:27:::0;;:18;:27;;26556:930::o;27934:319::-;28028:7;28086;;28075;:18;;28053:110;;;;-1:-1:-1;;;28053:110:0;;8948:2:1;28053:110:0;;;8930:21:1;8987:2;8967:18;;;8960:30;9026:34;9006:18;;;8999:62;-1:-1:-1;;;9077:18:1;;;9070:40;9127:19;;28053:110:0;8746:406:1;28053:110:0;28174:19;28196:10;:8;:10::i;:::-;28174:32;-1:-1:-1;28224:21:0;28174:32;28224:7;:21;:::i;:::-;28217:28;27934:319;-1:-1:-1;;;27934:319:0:o;20859:297::-;196:10;20974:4;21068:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;21068:34:0;;;;;;;;;;20974:4;;20996:130;;21046:7;;21068:47;;21105:10;;21068:47;:::i;17694:821::-;12943:6;;-1:-1:-1;;;;;12943:6:0;196:10;12943:22;12935:67;;;;-1:-1:-1;;;12935:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17787:22:0;::::1;17765:133;;;;-1:-1:-1::0;;;17765:133:0::1;;;;;;;:::i;:::-;17943:4;::::0;-1:-1:-1;;;;;17943:4:0;;::::1;17931:16:::0;;::::1;::::0;17909:127:::1;;;;-1:-1:-1::0;;;17909:127:0::1;;;;;;;:::i;:::-;18066:6;::::0;;18047:33:::1;::::0;-1:-1:-1;;;;;18066:6:0;;::::1;::::0;18047:18:::1;:33::i;:::-;18091:34;18110:8;18120:4;18091:18;:34::i;:::-;18136:37;18158:8;18168:4;18136:21;:37::i;:::-;18212:6;::::0;18190:10:::1;::::0;-1:-1:-1;;;;;18212:6:0;;::::1;18190:10:::0;::::1;:29:::0;18186:65:::1;;18221:10;:30:::0;;-1:-1:-1;;;;;;18221:30:0::1;-1:-1:-1::0;;;;;18221:30:0;::::1;;::::0;;18186:65:::1;18306:6;::::0;18296:17:::1;::::0;-1:-1:-1;;;;;18306:6:0::1;18296:9;:17::i;:::-;18264:19;18276:6:::0;;-1:-1:-1;;;;;18276:6:0;;::::1;18264:19:::0;;:11:::1;:19;::::0;;;;;;;:29;;::::1;::::0;;;;;;;:49;;;;18338:6;;18264:19;;18328:17:::1;::::0;18338:6:::1;18328:9;:17::i;:::-;:21;18324:100;;;18376:6;::::0;18366:46:::1;::::0;-1:-1:-1;;;;;18376:6:0::1;18384:8:::0;18394:17:::1;18376:6:::0;18394:9:::1;:17::i;:::-;18366:9;:46::i;:::-;;18324:100;18436:6;:17:::0;;-1:-1:-1;;;;;;18436:17:0::1;-1:-1:-1::0;;;;;18436:17:0;::::1;::::0;;::::1;::::0;;18469:38:::1;::::0;18436:17;;;;18469:38:::1;::::0;18436:6;18469:38:::1;17694:821:::0;:::o;20373:120::-;20426:4;20450:35;20458:7;-1:-1:-1;;20450:7:0;:35::i;23832:495::-;12943:6;;-1:-1:-1;;;;;12943:6:0;196:10;12943:22;12935:67;;;;-1:-1:-1;;;12935:67:0;;;;;;;:::i;:::-;24010:13:::1;;23999:7;:24;;:73;;;;;24057:15;;24044:9;:28;;23999:73;:122;;;;;24106:15;;24093:9;:28;;23999:122;23977:155;;;::::0;::::1;;24186:4;24173:9:::0;24151:19:::1;24161:9:::0;24151:7;:19:::1;:::i;:::-;:31;;;;:::i;:::-;:39;;24143:48;;;::::0;::::1;;24202:19;:29:::0;;;;24242:21:::1;:33:::0;24286:21:::1;:33:::0;23832:495::o;26393:155::-;12943:6;;-1:-1:-1;;;;;12943:6:0;196:10;12943:22;12935:67;;;;-1:-1:-1;;;12935:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26503:27:0;;;::::1;;::::0;;;:18:::1;:27;::::0;;;;:37;;-1:-1:-1;;26503:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;26393:155::o;24538:181::-;12943:6;;-1:-1:-1;;;;;12943:6:0;196:10;12943:22;12935:67;;;;-1:-1:-1;;;12935:67:0;;;;;;;:::i;:::-;24646:15:::1;:27:::0;;;;24684:15:::1;:27:::0;24538:181::o;22866:473::-;12943:6;;-1:-1:-1;;;;;12943:6:0;196:10;12943:22;12935:67;;;;-1:-1:-1;;;12935:67:0;;;;;;;:::i;:::-;23037:13:::1;;23026:7;:24;;:73;;;;;23084:15;;23071:9;:28;;23026:73;:122;;;;;23133:15;;23120:9;:28;;23026:122;23004:155;;;::::0;::::1;;23213:4;23200:9:::0;23178:19:::1;23188:9:::0;23178:7;:19:::1;:::i;:::-;:31;;;;:::i;:::-;:39;;23170:48;;;::::0;::::1;;23229:14;:24:::0;;;;23264:16:::1;:28:::0;23303:16:::1;:28:::0;22866:473::o;14742:1142::-;12943:6;;-1:-1:-1;;;;;12943:6:0;196:10;12943:22;12935:67;;;;-1:-1:-1;;;12935:67:0;;;;;;;:::i;:::-;14887:19:::1;::::0;::::1;;14886:20;14878:29;;;::::0;::::1;;14920:5;:18;14928:10:::0;14920:5;:18:::1;:::i;:::-;-1:-1:-1::0;14949:7:0::1;:22;14959:12:::0;14949:7;:22:::1;:::i;:::-;-1:-1:-1::0;14999:13:0::1;14982:14;:30:::0;15075:9:::1;:14:::0;;-1:-1:-1;;15075:14:0::1;15087:2;15075:14:::0;;::::1;::::0;;;15104:12:::1;:24:::0;15269:12:::1;::::0;15265:16:::1;::::0;:2:::1;:16;:::i;:::-;15247:14;;:35;;;;:::i;:::-;15237:7;:45:::0;;;15311:13:::1;::::0;-1:-1:-1;;15311:13:0::1;:::i;:::-;15304:21;::::0;-1:-1:-1;;15304:21:0::1;:::i;:::-;15293:7;:33:::0;15355:7:::1;::::0;15372:3:::1;::::0;15355:13:::1;::::0;15372:3;15355:13:::1;:::i;:::-;15354:21;;;;:::i;:::-;15339:12;:36:::0;15403:14:::1;::::0;15428:6:::1;::::0;15403:21:::1;::::0;15420:4:::1;15403:21;:::i;:::-;15402:32;;;;:::i;:::-;15386:13;:48:::0;15463:7:::1;::::0;15480:3:::1;::::0;15463:13:::1;::::0;15480:3;15463:13:::1;:::i;:::-;15462:21;;;;:::i;:::-;15445:14;:38:::0;15513:14:::1;::::0;15536:4:::1;::::0;15513:19:::1;::::0;15530:2:::1;15513:19;:::i;:::-;15512:28;;;;:::i;:::-;15494:15;:46:::0;15568:7:::1;::::0;15583:5:::1;::::0;15568:11:::1;::::0;15578:1:::1;15568:11;:::i;:::-;15567:21;;;;:::i;:::-;15551:13;:37:::0;15613:7:::1;::::0;15628:4:::1;::::0;15613:11:::1;::::0;15623:1:::1;15613:11;:::i;:::-;15612:20;;;;:::i;:::-;15599:10;:33:::0;15645:19:::1;:26:::0;;-1:-1:-1;;15645:26:0::1;15667:4;15645:26:::0;;::::1;::::0;;;15701:7:::1;::::0;;15645:19:::1;15690:7;17645::::0;17672:6;-1:-1:-1;;;;;17672:6:0;;17607:79;15690:7:::1;-1:-1:-1::0;;;;;15682:16:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;15682:16:0;:26;15739:7:::1;17645::::0;17672:6;-1:-1:-1;;;;;17672:6:0;;17607:79;15739:7:::1;15733:4;::::0;15748:7:::1;::::0;15724:32:::1;::::0;368:25:1;;;-1:-1:-1;;;;;15724:32:0;;::::1;::::0;15733:4;;::::1;::::0;15724:32:::1;::::0;356:2:1;341:18;15724:32:0::1;;;;;;;15777:12;15767:7;:22:::0;15802:42:::1;15832:4;15839;15802:21;:42::i;:::-;-1:-1:-1::0;;15855:14:0::1;:21:::0;;-1:-1:-1;;;;15855:21:0::1;-1:-1:-1::0;;;15855:21:0::1;::::0;;14742:1142::o;19759:198::-;-1:-1:-1;;;;;19849:20:0;;19825:7;19849:20;;;:11;:20;;;;;;;;19845:49;;;-1:-1:-1;;;;;;19878:16:0;;;;;:7;:16;;;;;;;19759:198::o;19845:49::-;-1:-1:-1;;;;;19932:16:0;;;;;;:7;:16;;;;;;19912:37;;:19;:37::i;18523:192::-;12943:6;;-1:-1:-1;;;;;12943:6:0;196:10;12943:22;12935:67;;;;-1:-1:-1;;;12935:67:0;;;;;;;:::i;:::-;18607:6:::1;::::0;;18588:33:::1;::::0;-1:-1:-1;;;;;18607:6:0;;::::1;::::0;18588:18:::1;:33::i;:::-;18649:1;18632:19:::0;;-1:-1:-1;;;;;;18632:19:0::1;::::0;;18667:40:::1;::::0;18649:1;;18667:40:::1;::::0;18649:1;;18667:40:::1;18523:192::o:0;22115:483::-;12943:6;;-1:-1:-1;;;;;12943:6:0;196:10;12943:22;12935:67;;;;-1:-1:-1;;;12935:67:0;;;;;;;:::i;:::-;22194:16;::::1;;22205:5;22194:16:::0;22190:401:::1;;-1:-1:-1::0;;;;;;22227:13:0::1;22243:5;22227:13:::0;;;:7:::1;:13;::::0;;;;:21;;-1:-1:-1;;22227:21:0::1;::::0;;26556:930::o;22190:401::-:1;22285:17;::::0;:22;22281:214:::1;;22396:7;22376:17;;22358:15;:35;;;;:::i;:::-;:45;22328:151;;;::::0;-1:-1:-1;;;22328:151:0;;14044:2:1;22328:151:0::1;::::0;::::1;14026:21:1::0;;;14063:18;;;14056:30;14122:34;14102:18;;;14095:62;14174:18;;22328:151:0::1;13842:356:1::0;22328:151:0::1;-1:-1:-1::0;;;;;22509:13:0;::::1;;::::0;;;:7:::1;:13;::::0;;;;:20;;-1:-1:-1;;22509:20:0::1;22525:4;22509:20;::::0;;22564:15:::1;22544:17;:35:::0;22115:483;;:::o;19280:89::-;19321:13;19354:7;19347:14;;;;;:::i;21164:307::-;196:10;21284:4;21378:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;21378:34:0;;;;;;;;;;21284:4;;21306:135;;21356:7;;21378:52;;21415:15;;21378:52;:::i;19965:199::-;20070:4;20092:42;196:10;20116:9;20127:6;20092:9;:42::i;25821:193::-;12943:6;;-1:-1:-1;;;;;12943:6:0;196:10;12943:22;12935:67;;;;-1:-1:-1;;;12935:67:0;;;;;;;:::i;:::-;25911:13:::1;::::0;-1:-1:-1;;;;;25911:26:0;;::::1;:13:::0;::::1;:26:::0;25903:58:::1;;;::::0;-1:-1:-1;;;25903:58:0;;14405:2:1;25903:58:0::1;::::0;::::1;14387:21:1::0;14444:2;14424:18;;;14417:30;-1:-1:-1;;;14463:18:1;;;14456:49;14522:18;;25903:58:0::1;14203:343:1::0;25903:58:0::1;25972:13;:34:::0;;-1:-1:-1;;;;;;25972:34:0::1;-1:-1:-1::0;;;;;25972:34:0;;;::::1;::::0;;;::::1;::::0;;25821:193::o;26022:184::-;12943:6;;-1:-1:-1;;;;;12943:6:0;196:10;12943:22;12935:67;;;;-1:-1:-1;;;12935:67:0;;;;;;;:::i;:::-;26109:10:::1;::::0;-1:-1:-1;;;;;26109:23:0;;::::1;:10:::0;::::1;:23:::0;26101:55:::1;;;::::0;-1:-1:-1;;;26101:55:0;;14405:2:1;26101:55:0::1;::::0;::::1;14387:21:1::0;14444:2;14424:18;;;14417:30;-1:-1:-1;;;14463:18:1;;;14456:49;14522:18;;26101:55:0::1;14203:343:1::0;26101:55:0::1;26167:10;:31:::0;;-1:-1:-1;;;;;;26167:31:0::1;-1:-1:-1::0;;;;;26167:31:0;;;::::1;::::0;;;::::1;::::0;;26022:184::o;26214:171::-;12943:6;;-1:-1:-1;;;;;12943:6:0;196:10;12943:22;12935:67;;;;-1:-1:-1;;;12935:67:0;;;;;;;:::i;:::-;26291:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;26291:32:0::1;-1:-1:-1::0;;;;26291:32:0;;::::1;;::::0;;26339:38:::1;::::0;::::1;::::0;::::1;::::0;26315:8;1812:14:1;1805:22;1787:41;;1775:2;1760:18;;1647:187;26339:38:0::1;;;;;;;;26214:171:::0;:::o;36464:109::-;12943:6;;-1:-1:-1;;;;;12943:6:0;196:10;12943:22;12935:67;;;;-1:-1:-1;;;12935:67:0;;;;;;;:::i;:::-;17645:7;17672:6;;36517:48:::1;::::0;-1:-1:-1;;;;;17672:6:0;;;;36543:21:::1;36517:48:::0;::::1;;;::::0;36543:21;;36517:48;17645:7;36517:48;36543:21;17672:6;36517:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;36464:109::o:0;24727:367::-;12943:6;;-1:-1:-1;;;;;12943:6:0;196:10;12943:22;12935:67;;;;-1:-1:-1;;;12935:67:0;;;;;;;:::i;:::-;24806:13:::1;24844:7;24833;24823;;:17;;;;:::i;:::-;24822:29;;;;:::i;:::-;24806:45;;24904:4;24894:7;;:14;;;;:::i;:::-;24884:5;:25;;24862:130;;;::::0;-1:-1:-1;;;24862:130:0;;14753:2:1;24862:130:0::1;::::0;::::1;14735:21:1::0;14792:2;14772:18;;;14765:30;14831:34;14811:18;;;14804:62;14902:25;14882:18;;;14875:53;14945:19;;24862:130:0::1;14551:419:1::0;24862:130:0::1;25003:12;:20:::0;;;25051:14:::1;::::0;25079:7;;25051:24:::1;::::0;25068:7;;25051:24:::1;:::i;:::-;25050:36;;;;:::i;:::-;25034:13;:52:::0;-1:-1:-1;;;24727:367:0:o;25102:371::-;12943:6;;-1:-1:-1;;;;;12943:6:0;196:10;12943:22;12935:67;;;;-1:-1:-1;;;12935:67:0;;;;;;;:::i;:::-;25186:13:::1;25224:7;25213;25203;;:17;;;;:::i;:::-;25202:29;;;;:::i;:::-;25186:45;;25284:4;25274:7;;:14;;;;:::i;:::-;25264:5;:25;;25242:125;;;::::0;-1:-1:-1;;;25242:125:0;;15177:2:1;25242:125:0::1;::::0;::::1;15159:21:1::0;15216:2;15196:18;;;15189:30;15255:34;15235:18;;;15228:62;-1:-1:-1;;;15306:18:1;;;15299:48;15364:19;;25242:125:0::1;14975:414:1::0;25242:125:0::1;25378:14;:22:::0;;;25430:14:::1;::::0;25458:7;;25430:24:::1;::::0;25447:7;;25430:24:::1;:::i;:::-;25429:36;;;;:::i;:::-;25411:15;:54:::0;-1:-1:-1;;;25102:371:0:o;14368:157::-;12943:6;;-1:-1:-1;;;;;12943:6:0;196:10;12943:22;12935:67;;;;-1:-1:-1;;;12935:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14481:28:0;;;::::1;;::::0;;;:18:::1;:28;::::0;;;;:36;;-1:-1:-1;;14481:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;14368:157::o;23347:477::-;12943:6;;-1:-1:-1;;;;;12943:6:0;196:10;12943:22;12935:67;;;;-1:-1:-1;;;12935:67:0;;;;;;;:::i;:::-;23519:13:::1;;23508:7;:24;;:73;;;;;23566:15;;23553:9;:28;;23508:73;:122;;;;;23615:15;;23602:9;:28;;23508:122;23486:155;;;::::0;::::1;;23695:4;23682:9:::0;23660:19:::1;23670:9:::0;23660:7;:19:::1;:::i;:::-;:31;;;;:::i;:::-;:39;;23652:48;;;::::0;::::1;;23711:15;:25:::0;;;;23747:17:::1;:29:::0;23787:17:::1;:29:::0;23347:477::o;21479:628::-;12943:6;;-1:-1:-1;;;;;12943:6:0;196:10;12943:22;12935:67;;;;-1:-1:-1;;;12935:67:0;;;;;;;:::i;:::-;21550:29:::1;21601:9;21550:61;;21622:16;21659:10;-1:-1:-1::0;;;;;21659:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21641:47:0::1;;21711:4;21731:10;-1:-1:-1::0;;;;;21731:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21641:118;::::0;-1:-1:-1;;;;;;21641:118:0::1;::::0;;;;;;-1:-1:-1;;;;;15880:15:1;;;21641:118:0::1;::::0;::::1;15862:34:1::0;15932:15;;15912:18;;;15905:43;15797:18;;21641:118:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21622:137:::0;-1:-1:-1;;;;;;21774:22:0;::::1;21770:247;;21840:10;-1:-1:-1::0;;;;;21840:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21822:50:0::1;;21899:4;21923:10;-1:-1:-1::0;;;;;21923:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21822:133;::::0;-1:-1:-1;;;;;;21822:133:0::1;::::0;;;;;;-1:-1:-1;;;;;15880:15:1;;;21822:133:0::1;::::0;::::1;15862:34:1::0;15932:15;;15912:18;;;15905:43;15797:18;;21822:133:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21813:6;:142:::0;;-1:-1:-1;;;;;;21813:142:0::1;-1:-1:-1::0;;;;;21813:142:0;;;::::1;::::0;;;::::1;::::0;;21770:247:::1;;;21988:6;:17:::0;;-1:-1:-1;;;;;;21988:17:0::1;-1:-1:-1::0;;;;;21988:17:0;::::1;;::::0;;21770:247:::1;22027:9;:22:::0;;-1:-1:-1;;;;;;22027:22:0::1;-1:-1:-1::0;;;;;22027:22:0;::::1;;::::0;;22060:39:::1;22077:4;22084:9:::0;-1:-1:-1;;22060:8:0::1;:39::i;25481:332::-:0;12943:6;;-1:-1:-1;;;;;12943:6:0;196:10;12943:22;12935:67;;;;-1:-1:-1;;;12935:67:0;;;;;;;:::i;:::-;25724:16:::1;25704;25694:7;;:26;;;;:::i;:::-;25693:47;;;;:::i;:::-;25677:13;:63:::0;25765:7:::1;::::0;25792:13;;25765:23:::1;::::0;25775:13;;25765:23:::1;:::i;:::-;25764:41;;;;:::i;:::-;25751:10;:54:::0;-1:-1:-1;;;;25481:332:0:o;28261:376::-;-1:-1:-1;;;;;28390:20:0;;28382:69;;;;-1:-1:-1;;;28382:69:0;;16161:2:1;28382:69:0;;;16143:21:1;16200:2;16180:18;;;16173:30;16239:34;16219:18;;;16212:62;-1:-1:-1;;;16290:18:1;;;16283:34;16334:19;;28382:69:0;15959:400:1;28382:69:0;-1:-1:-1;;;;;28470:21:0;;28462:68;;;;-1:-1:-1;;;28462:68:0;;16566:2:1;28462:68:0;;;16548:21:1;16605:2;16585:18;;;16578:30;16644:34;16624:18;;;16617:62;-1:-1:-1;;;16695:18:1;;;16688:32;16737:19;;28462:68:0;16364:398:1;28462:68:0;-1:-1:-1;;;;;28543:19:0;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:37;;;28596:33;;368:25:1;;;28596:33:0;;341:18:1;28596:33:0;;;;;;;28261:376;;;:::o;31471:439::-;31554:16;;-1:-1:-1;;;31554:16:0;;;;31553:17;31545:65;;;;-1:-1:-1;;;31545:65:0;;16969:2:1;31545:65:0;;;16951:21:1;17008:2;16988:18;;;16981:30;17047:34;17027:18;;;17020:62;-1:-1:-1;;;17098:18:1;;;17091:33;17141:19;;31545:65:0;16767:399:1;31545:65:0;31626:20;31637:4;31643:2;31626:10;:20::i;:::-;31625:21;:37;;;;-1:-1:-1;31656:6:0;;-1:-1:-1;;;;;31650:12:0;;;31656:6;;31650:12;31625:37;31621:282;;;-1:-1:-1;;;;;31679:23:0;;;;;;:17;:23;;;;;;;:30;;-1:-1:-1;;31679:30:0;31705:4;31679:30;;;;;;31724:16;:23;;-1:-1:-1;;;;31724:23:0;-1:-1:-1;;;31724:23:0;;;31777:15;31762:12;:30;31809:21;:28;;-1:-1:-1;;;;31809:28:0;-1:-1:-1;;;31809:28:0;;;31857:34;;;;;;1812:14:1;;1805:22;1787:41;;1775:2;1760:18;;1647:187;31857:34:0;;;;;;;;31471:439;;:::o;28645:1204::-;28758:4;-1:-1:-1;;;;;28783:18:0;;28775:68;;;;-1:-1:-1;;;28775:68:0;;17373:2:1;28775:68:0;;;17355:21:1;17412:2;17392:18;;;17385:30;17451:34;17431:18;;;17424:62;-1:-1:-1;;;17502:18:1;;;17495:35;17547:19;;28775:68:0;17171:401:1;28775:68:0;-1:-1:-1;;;;;28862:16:0;;28854:64;;;;-1:-1:-1;;;28854:64:0;;17779:2:1;28854:64:0;;;17761:21:1;17818:2;17798:18;;;17791:30;17857:34;17837:18;;;17830:62;-1:-1:-1;;;17908:18:1;;;17901:33;17951:19;;28854:64:0;17577:399:1;28854:64:0;28946:1;28937:6;:10;28929:64;;;;-1:-1:-1;;;28929:64:0;;18183:2:1;28929:64:0;;;18165:21:1;18222:2;18202:18;;;18195:30;18261:34;18241:18;;;18234:62;-1:-1:-1;;;18312:18:1;;;18305:39;18361:19;;28929:64:0;17981:405:1;28929:64:0;29008:20;29019:4;29025:2;29008:10;:20::i;:::-;29004:142;;;29050:14;;-1:-1:-1;;;29050:14:0;;;;29045:90;;29085:34;;-1:-1:-1;;;29085:34:0;;18593:2:1;29085:34:0;;;18575:21:1;18632:2;18612:18;;;18605:30;18671:26;18651:18;;;18644:54;18715:18;;29085:34:0;18391:348:1;29045:90:0;-1:-1:-1;;;;;29190:24:0;;29156:12;29190:24;;;:18;:24;;;;;;29171:4;;29190:24;;;:50;;-1:-1:-1;;;;;;29218:22:0;;;;;;:18;:22;;;;;;;;29190:50;29186:98;;;-1:-1:-1;29267:5:0;29186:98;-1:-1:-1;;;;;29317:11:0;;;;;;:7;:11;;;;;;;;29313:467;;;29350:16;;-1:-1:-1;;;29350:16:0;;;;29349:17;:42;;;;-1:-1:-1;29370:21:0;;-1:-1:-1;;;29370:21:0;;;;29349:42;29345:424;;;29412:28;29443:24;29461:4;29443:9;:24::i;:::-;29412:55;;29514:13;;29490:20;:37;29486:268;;29580:10;;29556:20;:34;29552:124;;-1:-1:-1;29642:10:0;;29552:124;29698:36;29713:20;29698:14;:36::i;:::-;29393:376;29345:424;29797:44;29815:4;29821:2;29825:6;29833:7;29797:17;:44::i;:::-;29790:51;28645:1204;-1:-1:-1;;;;;28645:1204:0:o;35538:162::-;35581:7;35602:15;35619;35638:19;:17;:19::i;:::-;35601:56;;-1:-1:-1;35601:56:0;-1:-1:-1;35675:17:0;35601:56;;35675:17;:::i;:::-;35668:24;;;;35538:162;:::o;27589:337::-;27658:4;17672:6;;-1:-1:-1;;;;;27695:15:0;;;17672:6;;27695:15;;;;:45;;-1:-1:-1;17645:7:0;17672:6;-1:-1:-1;;;;;27727:13:0;;;17672:6;;27727:13;;27695:45;:84;;;;-1:-1:-1;;;;;;27758:21:0;;;;;;:17;:21;;;;;;;;27757:22;27695:84;:125;;;;-1:-1:-1;;;;;;27797:23:0;;;;;;:17;:23;;;;;;;;27796:24;27695:125;:152;;;;-1:-1:-1;27843:4:0;;-1:-1:-1;;;;;27837:10:0;;;27843:4;;27837:10;;27695:152;:185;;;;-1:-1:-1;;;;;;27864:16:0;;;;27695:185;:223;;;;-1:-1:-1;;;;;;27897:21:0;;27913:4;27897:21;;27675:243;27589:337;-1:-1:-1;;;27589:337:0:o;29857:1606::-;12817:16;:23;;-1:-1:-1;;;;12817:23:0;-1:-1:-1;;;12817:23:0;;;29965:15:::1;::::0;29947::::1;::::0;:33:::1;::::0;29965:15;29947:33:::1;:::i;:::-;29943:51:::0;29987:7:::1;29943:51;30004:17;30120:1;30100:15;;30082;;:33;;;;:::i;:::-;30049:15;::::0;30026:38:::1;::::0;:20;:38:::1;:::i;:::-;30025:91;;;;:::i;:::-;30024:97;;;;:::i;:::-;30004:117:::0;-1:-1:-1;30177:20:0::1;30200:32;30004:117:::0;30200:20;:32:::1;:::i;:::-;30269:16;::::0;;30283:1:::1;30269:16:::0;;;;;::::1;::::0;;30177:55;;-1:-1:-1;30245:21:0::1;::::0;30269:16;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;30269:16:0::1;30245:40;;30314:4;30296;30301:1;30296:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30296:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;30340:9:::1;::::0;:16:::1;::::0;;-1:-1:-1;;;30340:16:0;;;;:9;;;::::1;::::0;:14:::1;::::0;:16:::1;::::0;;::::1;::::0;30296:7;;30340:16;;;;;:9;:16:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30330:4;30335:1;30330:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30330:26:0;;::::1;:7;::::0;;::::1;::::0;;;;;:26;30369:9:::1;::::0;:191:::1;::::0;-1:-1:-1;;;30369:191:0;;:9;::::1;::::0;:60:::1;::::0;:191:::1;::::0;30444:12;;30369:9:::1;::::0;30487:4;;30514::::1;::::0;30534:15:::1;::::0;30369:191:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30573:24;30697:1;30677:15;;30659;;:33;;;;:::i;:::-;30626:15;::::0;30602:39:::1;::::0;:21:::1;:39;:::i;:::-;30601:92;;;;:::i;:::-;30600:98;;;;:::i;:::-;30573:125:::0;-1:-1:-1;30715:13:0;;30711:342:::1;;30745:9;::::0;30914:4:::1;::::0;30745:222:::1;::::0;-1:-1:-1;;;30745:222:0;;30822:4:::1;30745:222;::::0;::::1;20070:34:1::0;20120:18;;;20113:34;;;30745:9:0::1;20163:18:1::0;;;20156:34;;;20206:18;;;20199:34;-1:-1:-1;;;;;30914:4:0;;::::1;20249:19:1::0;;;20242:44;30937:15:0::1;20302:19:1::0;;;20295:35;30745:9:0;::::1;::::0;:25:::1;::::0;30778:16;;20004:19:1;;30745:222:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;30987:54:0::1;::::0;;20854:25:1;;;20910:2;20895:18;;20888:34;;;20938:18;;;20931:34;;;30987:54:0::1;::::0;-1:-1:-1;20842:2:1;20827:18;30987:54:0::1;;;;;;;30711:342;31102:1;31067:32;31090:9:::0;31067:20;:32:::1;:::i;:::-;:36;31063:393;;;31255:11;::::0;31220:12:::1;::::0;31145:21:::1;::::0;31120::::1;::::0;31203:30:::1;::::0;31145:21;31203:30:::1;:::i;:::-;31202:65;;;;:::i;:::-;31182:85;;31282:19;31340:8;;31322:12;;31305:13;:30;;;;:::i;:::-;31304:45;;;;:::i;:::-;31364:13;::::0;:33:::1;::::0;31282:67;;-1:-1:-1;;;;;;31364:13:0::1;::::0;:33;::::1;;;::::0;31387:9;;31364:13:::1;:33:::0;:13;:33;31387:9;31364:13;:33;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;31412:10:0::1;::::0;:32:::1;::::0;-1:-1:-1;;;;;31412:10:0;;::::1;::::0;:32;::::1;;;::::0;31432:11;;31412:10:::1;:32:::0;:10;:32;31432:11;31412:10;:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;31105:351;;;31063:393;29932:1531;;;;12851:1;-1:-1:-1::0;12863:16:0;:24;;-1:-1:-1;;;;12863:24:0;;;29857:1606::o;32122:1798::-;32587:19;;32267:4;;-1:-1:-1;;;32587:19:0;;;;32582:443;;-1:-1:-1;;;;;32628:24:0;;;;;;:18;:24;;;;;;;;32623:118;;32673:52;;-1:-1:-1;;;32673:52:0;;21178:2:1;32673:52:0;;;21160:21:1;21217:2;21197:18;;;21190:30;21256:34;21236:18;;;21229:62;-1:-1:-1;;;21307:18:1;;;21300:40;21357:19;;32673:52:0;20976:406:1;32623:118:0;32582:443;;;32778:16;;-1:-1:-1;;;32778:16:0;;;;32773:241;;32815:28;32834:4;32840:2;32815:18;:28::i;:::-;32867:16;;-1:-1:-1;;;32867:16:0;;;;32866:17;:41;;;;;32887:20;32898:4;32904:2;32887:10;:20::i;:::-;32862:137;;;32932:47;;-1:-1:-1;;;32932:47:0;;21589:2:1;32932:47:0;;;21571:21:1;21628:2;21608:18;;;21601:30;21667:34;21647:18;;;21640:62;-1:-1:-1;;;21718:18:1;;;21711:35;21763:19;;32932:47:0;21387:401:1;32862:137:0;33037:25;33065:38;33076:4;33082:2;33086:7;33095;33065:10;:38::i;:::-;33148:14;;;;-1:-1:-1;;;;;33132:13:0;;;;;;:7;:13;;;;;;33037:66;;-1:-1:-1;33132:30:0;;;:::i;:::-;-1:-1:-1;;;;;33116:13:0;;;;;;;:7;:13;;;;;;:46;;;;33201:22;;;;33187:11;;;;;;;;;;:36;;33201:22;33187:36;:::i;:::-;-1:-1:-1;;;;;33173:11:0;;;;;;;:7;:11;;;;;;;;:50;;;;33240:17;;;;;:11;:17;;;;;;;:37;;;;-1:-1:-1;;;;;;33262:15:0;;;;;;:11;:15;;;;;;;;33261:16;33240:37;33236:414;;;-1:-1:-1;;;;;33310:13:0;;;;;;:7;:13;;;;;;:23;;33326:7;;33310:23;:::i;:::-;-1:-1:-1;;;;;33294:13:0;;;;;;:7;:13;;;;;:39;33236:414;;;-1:-1:-1;;;;;33356:17:0;;;;;;:11;:17;;;;;;;;33355:18;:37;;;;-1:-1:-1;;;;;;33377:15:0;;;;;;:11;:15;;;;;;;;33355:37;33351:299;;;33437:22;;-1:-1:-1;;;;;33423:11:0;;33437:22;33423:11;;;:7;:11;;;;;;:36;;33437:22;33423:36;:::i;:::-;-1:-1:-1;;;;;33409:11:0;;;;;;:7;:11;;;;;:50;33351:299;;;-1:-1:-1;;;;;33481:17:0;;;;;;:11;:17;;;;;;;;:36;;;;-1:-1:-1;;;;;;33502:15:0;;;;;;:11;:15;;;;;;;;33481:36;33477:173;;;-1:-1:-1;;;;;33550:13:0;;;;;;:7;:13;;;;;;:23;;33566:7;;33550:23;:::i;:::-;-1:-1:-1;;;;;33534:13:0;;;;;;;:7;:13;;;;;;:39;;;;33616:22;;33602:11;;;;;;;;;;:36;;33616:22;33602:36;:::i;:::-;-1:-1:-1;;;;;33588:11:0;;;;;;:7;:11;;;;;:50;33477:173;33666:17;;;;:21;33662:66;;33689:39;33704:4;33710:6;:17;;;33689:14;:39::i;:::-;33757:1;33743:6;:11;;;:15;:34;;;;33776:1;33762:6;:11;;;:15;33743:34;33739:91;;;33792:38;33805:6;:11;;;33818:6;:11;;;33792:12;:38::i;:::-;33863:2;-1:-1:-1;;;;;33848:42:0;33857:4;-1:-1:-1;;;;;33848:42:0;;33867:6;:22;;;33848:42;;;;368:25:1;;356:2;341:18;;222:177;33848:42:0;;;;;;;;-1:-1:-1;33908:4:0;;32122:1798;-1:-1:-1;;;;;32122:1798:0:o;35708:597::-;35807:7;;35843;;35760;;;;;35861:332;35885:9;:16;35881:20;;35861:332;;;35969:7;35945;:21;35953:9;35963:1;35953:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;35953:12:0;35945:21;;;;;;;;;;;;;:31;;:83;;;36021:7;35997;:21;36005:9;36015:1;36005:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;36005:12:0;35997:21;;;;;;;;;;;;;:31;35945:83;35923:146;;;36052:7;;36061;;36044:25;;;;;;;35708:597;;:::o;35923:146::-;36104:7;:21;36112:9;36122:1;36112:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;36112:12:0;36104:21;;;;;;;;;;;;;36094:31;;:7;:31;:::i;:::-;36084:41;;36160:7;:21;36168:9;36178:1;36168:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;36168:12:0;36160:21;;;;;;;;;;;;;36150:31;;:7;:31;:::i;:::-;36140:41;-1:-1:-1;35903:3:0;;;;:::i;:::-;;;;35861:332;;;;36227:7;;36217;;:17;;;;:::i;:::-;36207:7;:27;36203:58;;;36244:7;;36253;;36236:25;;;;;;35708:597;;:::o;36203:58::-;36280:7;;36289;;-1:-1:-1;35708:597:0;-1:-1:-1;35708:597:0:o;33928:1602::-;34066:18;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34066:18:0;34097:25;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34097:25:0;34133:19;34155:10;:8;:10::i;:::-;34133:32;-1:-1:-1;34195:21:0;34133:32;34195:7;:21;:::i;:::-;34178:14;;;:38;34229:1140;;;;-1:-1:-1;;;;;34261:11:0;;;;;;:7;:11;;;;;;;;34257:561;;;34307:15;;34293:11;:29;34357:17;;34341:13;:33;34409:17;;34393:13;:33;34257:561;;;-1:-1:-1;;;;;34452:13:0;;;;;;:7;:13;;;;;;;;34448:370;;;34500:14;;34486:11;:28;34549:16;;34533:13;:32;34600:16;;34584:13;:32;34448:370;;;34671:19;;34657:11;:33;34725:21;;34709:13;:37;34781:21;;34765:13;:37;34448:370;34874:16;;34859:11;;34849:21;;:7;:21;:::i;:::-;34848:42;;;;:::i;:::-;34834:11;;;:56;35005:16;;34970:13;;34954;;:29;;34970:13;34954:29;:::i;:::-;34943:41;;:7;:41;:::i;:::-;34942:79;;;;:::i;:::-;34905:17;;;:116;;;35106:11;;;;:31;;34905:116;35106:31;:::i;:::-;35078:60;;:7;:60;:::i;:::-;35036:102;;35169:11;;;;:25;;35183:11;;35169:25;:::i;:::-;35155:11;;;:39;34229:1140;;;35241:1;35227:11;;;:15;;;35257:17;;;:21;;;35293:32;;;35342:11;;;:15;34229:1140;35485:11;35465:6;:17;;;:31;;;;:::i;:::-;35450:6;:11;;;:47;;;;:::i;:::-;35419:6;:14;;;:79;;;;:::i;:::-;35381:22;;;:117;-1:-1:-1;35381:22:0;33928:1602;-1:-1:-1;;;;;33928:1602:0:o;36581:422::-;36661:19;36683:10;:8;:10::i;:::-;36661:32;-1:-1:-1;36704:18:0;36725:24;36661:32;36725:10;:24;:::i;:::-;36801:4;36785:22;;;;:7;:22;;;;;;36704:45;;-1:-1:-1;36785:35:0;;36704:45;;36785:35;:::i;:::-;36776:4;36760:22;;;;:7;:22;;;;;;;;:60;;;;36835:11;:26;;;;;;36831:105;;;36917:4;36901:22;;;;:7;:22;;;;;;:35;;36926:10;;36901:35;:::i;:::-;36892:4;36876:22;;;;:7;:22;;;;;:60;36831:105;36952:43;;368:25:1;;;36977:4:0;;-1:-1:-1;;;;;36952:43:0;;;;;356:2:1;341:18;36952:43:0;;;;;;;36650:353;;36581:422;;:::o;36313:143::-;36403:4;36393:7;;:14;;;;:::i;:::-;36383:7;:24;36431:10;;:17;;36444:4;;36431:17;:::i;:::-;36418:10;:30;-1:-1:-1;;36313:143:0:o;404:548:1:-;516:4;545:2;574;563:9;556:21;606:6;600:13;649:6;644:2;633:9;629:18;622:34;674:1;684:140;698:6;695:1;692:13;684:140;;;793:14;;;789:23;;783:30;759:17;;;778:2;755:26;748:66;713:10;;684:140;;;688:3;873:1;868:2;859:6;848:9;844:22;840:31;833:42;943:2;936;932:7;927:2;919:6;915:15;911:29;900:9;896:45;892:54;884:62;;;;404:548;;;;:::o;1191:131::-;-1:-1:-1;;;;;1266:31:1;;1256:42;;1246:70;;1312:1;1309;1302:12;1327:315;1395:6;1403;1456:2;1444:9;1435:7;1431:23;1427:32;1424:52;;;1472:1;1469;1462:12;1424:52;1511:9;1498:23;1530:31;1555:5;1530:31;:::i;:::-;1580:5;1632:2;1617:18;;;;1604:32;;-1:-1:-1;;;1327:315:1:o;1839:316::-;1916:6;1924;1932;1985:2;1973:9;1964:7;1960:23;1956:32;1953:52;;;2001:1;1998;1991:12;1953:52;-1:-1:-1;;2024:23:1;;;2094:2;2079:18;;2066:32;;-1:-1:-1;2145:2:1;2130:18;;;2117:32;;1839:316;-1:-1:-1;1839:316:1:o;2160:247::-;2219:6;2272:2;2260:9;2251:7;2247:23;2243:32;2240:52;;;2288:1;2285;2278:12;2240:52;2327:9;2314:23;2346:31;2371:5;2346:31;:::i;2412:160::-;2477:20;;2533:13;;2526:21;2516:32;;2506:60;;2562:1;2559;2552:12;2506:60;2412:160;;;:::o;2577:315::-;2642:6;2650;2703:2;2691:9;2682:7;2678:23;2674:32;2671:52;;;2719:1;2716;2709:12;2671:52;2758:9;2745:23;2777:31;2802:5;2777:31;:::i;:::-;2827:5;-1:-1:-1;2851:35:1;2882:2;2867:18;;2851:35;:::i;:::-;2841:45;;2577:315;;;;;:::o;2897:456::-;2974:6;2982;2990;3043:2;3031:9;3022:7;3018:23;3014:32;3011:52;;;3059:1;3056;3049:12;3011:52;3098:9;3085:23;3117:31;3142:5;3117:31;:::i;:::-;3167:5;-1:-1:-1;3224:2:1;3209:18;;3196:32;3237:33;3196:32;3237:33;:::i;:::-;2897:456;;3289:7;;-1:-1:-1;;;3343:2:1;3328:18;;;;3315:32;;2897:456::o;3358:180::-;3417:6;3470:2;3458:9;3449:7;3445:23;3441:32;3438:52;;;3486:1;3483;3476:12;3438:52;-1:-1:-1;3509:23:1;;3358:180;-1:-1:-1;3358:180:1:o;3732:248::-;3800:6;3808;3861:2;3849:9;3840:7;3836:23;3832:32;3829:52;;;3877:1;3874;3867:12;3829:52;-1:-1:-1;;3900:23:1;;;3970:2;3955:18;;;3942:32;;-1:-1:-1;3732:248:1:o;3985:127::-;4046:10;4041:3;4037:20;4034:1;4027:31;4077:4;4074:1;4067:15;4101:4;4098:1;4091:15;4117:719;4160:5;4213:3;4206:4;4198:6;4194:17;4190:27;4180:55;;4231:1;4228;4221:12;4180:55;4267:6;4254:20;4293:18;4330:2;4326;4323:10;4320:36;;;4336:18;;:::i;:::-;4411:2;4405:9;4379:2;4465:13;;-1:-1:-1;;4461:22:1;;;4485:2;4457:31;4453:40;4441:53;;;4509:18;;;4529:22;;;4506:46;4503:72;;;4555:18;;:::i;:::-;4595:10;4591:2;4584:22;4630:2;4622:6;4615:18;4676:3;4669:4;4664:2;4656:6;4652:15;4648:26;4645:35;4642:55;;;4693:1;4690;4683:12;4642:55;4757:2;4750:4;4742:6;4738:17;4731:4;4723:6;4719:17;4706:54;4804:1;4797:4;4792:2;4784:6;4780:15;4776:26;4769:37;4824:6;4815:15;;;;;;4117:719;;;;:::o;4841:543::-;4929:6;4937;4990:2;4978:9;4969:7;4965:23;4961:32;4958:52;;;5006:1;5003;4996:12;4958:52;5046:9;5033:23;5075:18;5116:2;5108:6;5105:14;5102:34;;;5132:1;5129;5122:12;5102:34;5155:50;5197:7;5188:6;5177:9;5173:22;5155:50;:::i;:::-;5145:60;;5258:2;5247:9;5243:18;5230:32;5214:48;;5287:2;5277:8;5274:16;5271:36;;;5303:1;5300;5293:12;5271:36;;5326:52;5370:7;5359:8;5348:9;5344:24;5326:52;:::i;:::-;5316:62;;;4841:543;;;;;:::o;5649:180::-;5705:6;5758:2;5746:9;5737:7;5733:23;5729:32;5726:52;;;5774:1;5771;5764:12;5726:52;5797:26;5813:9;5797:26;:::i;5834:388::-;5902:6;5910;5963:2;5951:9;5942:7;5938:23;5934:32;5931:52;;;5979:1;5976;5969:12;5931:52;6018:9;6005:23;6037:31;6062:5;6037:31;:::i;:::-;6087:5;-1:-1:-1;6144:2:1;6129:18;;6116:32;6157:33;6116:32;6157:33;:::i;:::-;6209:7;6199:17;;;5834:388;;;;;:::o;6227:385::-;6313:6;6321;6329;6337;6390:3;6378:9;6369:7;6365:23;6361:33;6358:53;;;6407:1;6404;6397:12;6358:53;-1:-1:-1;;6430:23:1;;;6500:2;6485:18;;6472:32;;-1:-1:-1;6551:2:1;6536:18;;6523:32;;6602:2;6587:18;6574:32;;-1:-1:-1;6227:385:1;-1:-1:-1;6227:385:1:o;6617:380::-;6696:1;6692:12;;;;6739;;;6760:61;;6814:4;6806:6;6802:17;6792:27;;6760:61;6867:2;6859:6;6856:14;6836:18;6833:38;6830:161;;6913:10;6908:3;6904:20;6901:1;6894:31;6948:4;6945:1;6938:15;6976:4;6973:1;6966:15;6830:161;;6617:380;;;:::o;7002:356::-;7204:2;7186:21;;;7223:18;;;7216:30;7282:34;7277:2;7262:18;;7255:62;7349:2;7334:18;;7002:356::o;8077:127::-;8138:10;8133:3;8129:20;8126:1;8119:31;8169:4;8166:1;8159:15;8193:4;8190:1;8183:15;8209:127;8270:10;8265:3;8261:20;8258:1;8251:31;8301:4;8298:1;8291:15;8325:4;8322:1;8315:15;8341:128;8408:9;;;8429:11;;;8426:37;;;8443:18;;:::i;8474:127::-;8535:10;8530:3;8526:20;8523:1;8516:31;8566:4;8563:1;8556:15;8590:4;8587:1;8580:15;8606:135;8645:3;8666:17;;;8663:43;;8686:18;;:::i;:::-;-1:-1:-1;8733:1:1;8722:13;;8606:135::o;9157:127::-;9218:10;9213:3;9209:20;9206:1;9199:31;9249:4;9246:1;9239:15;9273:4;9270:1;9263:15;9289:120;9329:1;9355;9345:35;;9360:18;;:::i;:::-;-1:-1:-1;9394:9:1;;9289:120::o;9414:125::-;9479:9;;;9500:10;;;9497:36;;;9513:18;;:::i;9544:425::-;9746:2;9728:21;;;9785:2;9765:18;;;9758:30;9824:34;9819:2;9804:18;;9797:62;9895:31;9890:2;9875:18;;9868:59;9959:3;9944:19;;9544:425::o;10100:545::-;10202:2;10197:3;10194:11;10191:448;;;10238:1;10263:5;10259:2;10252:17;10308:4;10304:2;10294:19;10378:2;10366:10;10362:19;10359:1;10355:27;10349:4;10345:38;10414:4;10402:10;10399:20;10396:47;;;-1:-1:-1;10437:4:1;10396:47;10492:2;10487:3;10483:12;10480:1;10476:20;10470:4;10466:31;10456:41;;10547:82;10565:2;10558:5;10555:13;10547:82;;;10610:17;;;10591:1;10580:13;10547:82;;;10551:3;;;10100:545;;;:::o;10821:1352::-;10947:3;10941:10;10974:18;10966:6;10963:30;10960:56;;;10996:18;;:::i;:::-;11025:97;11115:6;11075:38;11107:4;11101:11;11075:38;:::i;:::-;11069:4;11025:97;:::i;:::-;11177:4;;11241:2;11230:14;;11258:1;11253:663;;;;11960:1;11977:6;11974:89;;;-1:-1:-1;12029:19:1;;;12023:26;11974:89;-1:-1:-1;;10778:1:1;10774:11;;;10770:24;10766:29;10756:40;10802:1;10798:11;;;10753:57;12076:81;;11223:944;;11253:663;10047:1;10040:14;;;10084:4;10071:18;;-1:-1:-1;;11289:20:1;;;11407:236;11421:7;11418:1;11415:14;11407:236;;;11510:19;;;11504:26;11489:42;;11602:27;;;;11570:1;11558:14;;;;11437:19;;11407:236;;;11411:3;11671:6;11662:7;11659:19;11656:201;;;11732:19;;;11726:26;-1:-1:-1;;11815:1:1;11811:14;;;11827:3;11807:24;11803:37;11799:42;11784:58;11769:74;;11656:201;-1:-1:-1;;;;;11903:1:1;11887:14;;;11883:22;11870:36;;-1:-1:-1;10821:1352:1:o;12178:422::-;12267:1;12310:5;12267:1;12324:270;12345:7;12335:8;12332:21;12324:270;;;12404:4;12400:1;12396:6;12392:17;12386:4;12383:27;12380:53;;;12413:18;;:::i;:::-;12463:7;12453:8;12449:22;12446:55;;;12483:16;;;;12446:55;12562:22;;;;12522:15;;;;12324:270;;;12328:3;12178:422;;;;;:::o;12605:806::-;12654:5;12684:8;12674:80;;-1:-1:-1;12725:1:1;12739:5;;12674:80;12773:4;12763:76;;-1:-1:-1;12810:1:1;12824:5;;12763:76;12855:4;12873:1;12868:59;;;;12941:1;12936:130;;;;12848:218;;12868:59;12898:1;12889:10;;12912:5;;;12936:130;12973:3;12963:8;12960:17;12957:43;;;12980:18;;:::i;:::-;-1:-1:-1;;13036:1:1;13022:16;;13051:5;;12848:218;;13150:2;13140:8;13137:16;13131:3;13125:4;13122:13;13118:36;13112:2;13102:8;13099:16;13094:2;13088:4;13085:12;13081:35;13078:77;13075:159;;;-1:-1:-1;13187:19:1;;;13219:5;;13075:159;13266:34;13291:8;13285:4;13266:34;:::i;:::-;13336:6;13332:1;13328:6;13324:19;13315:7;13312:32;13309:58;;;13347:18;;:::i;:::-;13385:20;;12605:806;-1:-1:-1;;;12605:806:1:o;13416:131::-;13476:5;13505:36;13532:8;13526:4;13505:36;:::i;13552:168::-;13625:9;;;13656;;13673:15;;;13667:22;;13653:37;13643:71;;13694:18;;:::i;13725:112::-;13757:1;13783;13773:35;;13788:18;;:::i;:::-;-1:-1:-1;13822:9:1;;13725:112::o;15394:251::-;15464:6;15517:2;15505:9;15496:7;15492:23;15488:32;15485:52;;;15533:1;15530;15523:12;15485:52;15565:9;15559:16;15584:31;15609:5;15584:31;:::i;18744:980::-;19006:4;19054:3;19043:9;19039:19;19085:6;19074:9;19067:25;19111:2;19149:6;19144:2;19133:9;19129:18;19122:34;19192:3;19187:2;19176:9;19172:18;19165:31;19216:6;19251;19245:13;19282:6;19274;19267:22;19320:3;19309:9;19305:19;19298:26;;19359:2;19351:6;19347:15;19333:29;;19380:1;19390:195;19404:6;19401:1;19398:13;19390:195;;;19469:13;;-1:-1:-1;;;;;19465:39:1;19453:52;;19560:15;;;;19525:12;;;;19501:1;19419:9;19390:195;;;-1:-1:-1;;;;;;;19641:32:1;;;;19636:2;19621:18;;19614:60;-1:-1:-1;;;19705:3:1;19690:19;19683:35;19602:3;18744:980;-1:-1:-1;;;18744:980:1:o;20341:306::-;20429:6;20437;20445;20498:2;20486:9;20477:7;20473:23;20469:32;20466:52;;;20514:1;20511;20504:12;20466:52;20543:9;20537:16;20527:26;;20593:2;20582:9;20578:18;20572:25;20562:35;;20637:2;20626:9;20622:18;20616:25;20606:35;;20341:306;;;;;:::o

Swarm Source

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