ETH Price: $2,551.90 (-4.87%)

Token

Jeethereum (JETH)
 

Overview

Max Total Supply

991,650.795614733134541673 JETH

Holders

36

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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:
JETH

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-28
*/

/**
     __        __  __                        
 __ / /__ ___ / /_/ /  ___ _______ __ ____ _ 
/ // / -_) -_) __/ _ \/ -_) __/ -_) // /  ' \
\___/\__/\__/\__/_//_/\__/_/  \__/\_,_/_/_/_/                                             
*/

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

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

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

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

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

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

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

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

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

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

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

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

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

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

contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;

    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 internal _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(
            amount,
            "ERC20: transfer amount exceeds balance"
        );
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

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

        _beforeTokenTransfer(address(0), account, amount);

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

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(
            amount,
            "ERC20: burn amount exceeds balance"
        );
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

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

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

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

interface DividendPayingTokenOptionalInterface {
    function withdrawableDividendOf(address _owner)
        external
        view
        returns (uint256);

    function withdrawnDividendOf(address _owner)
        external
        view
        returns (uint256);

    function accumulativeDividendOf(address _owner)
        external
        view
        returns (uint256);
}

interface DividendPayingTokenInterface {
    function dividendOf(address _owner) external view returns (uint256);

    function distributeDividends() external payable;

    function withdrawDividend() external;

    event DividendsDistributed(address indexed from, uint256 weiAmount);

    event DividendWithdrawn(address indexed to, uint256 weiAmount);
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }

    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
    function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0);
        return b;
    }
}

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

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

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

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

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

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 DividendPayingToken is
    ERC20,
    DividendPayingTokenInterface,
    DividendPayingTokenOptionalInterface
{
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;

    uint256 internal constant magnitude = 2**128;

    uint256 internal magnifiedDividendPerShare;

    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;

    uint256 public totalDividendsDistributed;

    constructor(string memory _name, string memory _symbol)
        ERC20(_name, _symbol)
    {}

    receive() external payable {
        distributeDividends();
    }

    function distributeDividends() public payable override {
        require(totalSupply() > 0);

        if (msg.value > 0) {
            magnifiedDividendPerShare = magnifiedDividendPerShare.add(
                (msg.value).mul(magnitude) / totalSupply()
            );
            emit DividendsDistributed(msg.sender, msg.value);

            totalDividendsDistributed = totalDividendsDistributed.add(
                msg.value
            );
        }
    }

    function withdrawDividend() public virtual override {
        _withdrawDividendOfUser(payable(msg.sender));
    }

    function _withdrawDividendOfUser(address payable user)
        internal
        virtual
        returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(
                _withdrawableDividend
            );
            emit DividendWithdrawn(user, _withdrawableDividend);
            (bool success, ) = user.call{
                value: _withdrawableDividend,
                gas: 3000
            }("");

            if (!success) {
                withdrawnDividends[user] = withdrawnDividends[user].sub(
                    _withdrawableDividend
                );
                return 0;
            }

            return _withdrawableDividend;
        }

        return 0;
    }

    function dividendOf(address _owner) public view override returns (uint256) {
        return withdrawableDividendOf(_owner);
    }

    function withdrawableDividendOf(address _owner)
        public
        view
        override
        returns (uint256)
    {
        return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
    }

    function withdrawnDividendOf(address _owner)
        public
        view
        override
        returns (uint256)
    {
        return withdrawnDividends[_owner];
    }

    function accumulativeDividendOf(address _owner)
        public
        view
        override
        returns (uint256)
    {
        return
            magnifiedDividendPerShare
                .mul(balanceOf(_owner))
                .toInt256Safe()
                .add(magnifiedDividendCorrections[_owner])
                .toUint256Safe() / magnitude;
    }

    function _transfer(
        address from,
        address to,
        uint256 value
    ) internal virtual override {
        require(false);

        int256 _magCorrection = magnifiedDividendPerShare
            .mul(value)
            .toInt256Safe();
        magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from]
            .add(_magCorrection);
        magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(
            _magCorrection
        );
    }

    function _mint(address account, uint256 value) internal override {
        super._mint(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
            account
        ].sub((magnifiedDividendPerShare.mul(value)).toInt256Safe());
    }

    function _burn(address account, uint256 value) internal override {
        super._burn(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
            account
        ].add((magnifiedDividendPerShare.mul(value)).toInt256Safe());
    }

    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = balanceOf(account);

        if (newBalance > currentBalance) {
            uint256 mintAmount = newBalance.sub(currentBalance);
            _mint(account, mintAmount);
        } else if (newBalance < currentBalance) {
            uint256 burnAmount = currentBalance.sub(newBalance);
            _burn(account, burnAmount);
        }
    }
}

interface ITrueDefiSwap {
    function triggeredTokenSent(uint256, address) external;
}

contract JETH is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public uniswapV2Router;

    address public uniswapV2Pair;
    address public DEAD = 0x000000000000000000000000000000000000dEaD;
    bool private swapping;
    bool private stakingEnabled = false;
    bool public tradingEnabled = false;

    uint256 public sellAmount = 1;
    uint256 public buyAmount = 1;

    uint256 private totalSellFees;
    uint256 private totalBuyFees;

    JETHDividendTracker public dividendTracker;

    address payable public marketingWallet;
    address payable public devWallet;

    // Max tx, dividend threshold and tax variables
    uint256 public maxWallet;
    uint256 public swapTokensAtAmount;
    uint256 public sellRewardsFee;
    uint256 public sellDeadFees;
    uint256 public sellMarketingFees;
    uint256 public sellLiquidityFee;
    uint256 public buyDeadFees;
    uint256 public buyMarketingFees;
    uint256 public buyLiquidityFee;
    uint256 public buyRewardsFee;
    uint256 public buyDevFee;
    uint256 public sellDevFee;
    uint256 public transferFee;

    bool public swapAndLiquifyEnabled = true;

    // gas for processing auto claim dividends 
    uint256 public gasForProcessing = 300000;

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

    mapping(address => bool) public automatedMarketMakerPairs;

    // staking variables
    mapping(address => uint256) public stakingBonus;
    mapping(address => uint256) public stakingUntilDate;
    mapping(uint256 => uint256) public stakingAmounts;

    //for allowing specific address to trade while trading has not been enabled yet 
    mapping(address => bool) private canTransferBeforeTradingIsEnabled;

    // Limit variables for bot protection
    bool public limitsInEffect = true; //boolean used to turn limits on and off
    mapping(address => uint256) private _holderLastTransferBlock; // for 1 tx per block
    mapping(address => uint256) private _holderLastTransferTimestamp; // for sell cooldown timer
    uint256 public launchblock;
    uint256 public cooldowntimer = 60; //default cooldown 60s

    bool public enabledPublicTrading;
    address tefiRouter;
    mapping(address => bool) public whitelistForPublicTrade;    
    
    event EnableAccountStaking(address indexed account, uint256 duration);
    event UpdateStakingAmounts(uint256 duration, uint256 amount);

    event EnableSwapAndLiquify(bool enabled);
    event EnableStaking(bool enabled);

    event SetPreSaleWallet(address wallet);

    event UpdateDividendTracker(
        address indexed newAddress,
        address indexed oldAddress
    );

    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );

    event TradingEnabled();

    event UpdateFees(
        uint256 sellDeadFees,
        uint256 sellMarketingFees,
        uint256 sellLiquidityFee,
        uint256 sellRewardsFee,
        uint256 buyDeadFees,
        uint256 buyMarketingFees,
        uint256 buyLiquidityFee,
        uint256 buyRewardsFee,
        uint256 buyDevFee,
        uint256 sellDevFee
    );

    event UpdateTransferFee(uint256 transferFee);

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event GasForProcessingUpdated(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );

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

    event SendDividends(uint256 amount, uint256 opAmount, bool success);

    event ProcessedDividendTracker(
        uint256 iterations,
        uint256 claims,
        uint256 lastProcessedIndex,
        bool indexed automatic,
        uint256 gas,
        address indexed processor
    );

    event UpdatePayoutToken(address token);

    constructor() ERC20("Jeethereum", "JETH") {
        marketingWallet = payable(0x061188E7c73259A7670AfE87CE2D93A53fe33af9);
        devWallet = payable(0xaFd164d218a00C04A3d3b6b5ce2F22Db7F1d26A8);
        address router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

        buyDeadFees = 1;
        sellDeadFees = 1;
        buyMarketingFees = 2;
        sellMarketingFees = 2;
        buyLiquidityFee = 2;
        sellLiquidityFee = 2;
        buyRewardsFee = 3;
        sellRewardsFee = 3;
        buyDevFee = 2;
        sellDevFee = 2;
        transferFee = 5;

        totalBuyFees = buyRewardsFee
            .add(buyLiquidityFee)
            .add(buyMarketingFees)
            .add(buyDevFee);
        totalSellFees = sellRewardsFee
            .add(sellLiquidityFee)
            .add(sellMarketingFees)
            .add(sellDevFee);

        dividendTracker = new JETHDividendTracker(
            payable(this),
            router,
            0xdAC17F958D2ee523a2206206994597C13D831ec7,
            "JETHTracker",
            "JETHTRACKER"
        );

        uniswapV2Router = IUniswapV2Router02(router);
        // Create a uniswap pair for this new token
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
                address(this),
                uniswapV2Router.WETH()
            );

        _setAutomatedMarketMakerPair(uniswapV2Pair, true);

        // exclude from receiving dividends
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(DEAD);
        dividendTracker.excludedFromDividends(address(0));
        dividendTracker.excludeFromDividends(router);
        dividendTracker.excludeFromDividends(marketingWallet);
        dividendTracker.excludeFromDividends(owner());

        // exclude from paying fees or having max transaction amount
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[address(dividendTracker)] = true;
        _isExcludedFromFees[address(marketingWallet)] = true;
        _isExcludedFromFees[address(devWallet)] = true;
        _isExcludedFromFees[msg.sender] = true;

        uint256 totalTokenSupply = (1_000_000) * (10**18);
        _mint(owner(), totalTokenSupply); // only time internal mint function is ever called is to create supply
        maxWallet = totalTokenSupply / 10000; // 1%
        swapTokensAtAmount = totalTokenSupply / 1000; // 0.1%;
        canTransferBeforeTradingIsEnabled[owner()] = true;
        canTransferBeforeTradingIsEnabled[address(this)] = true;
        whitelistForPublicTrade[msg.sender] = true;   
    }

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

    receive() external payable {}

    function updateStakingAmounts(uint256 duration, uint256 bonus)
        public
        onlyOwner
    {
        require(stakingAmounts[duration] != bonus);
        require(bonus <= 100, "Staking bonus can't exceed 100");
        stakingAmounts[duration] = bonus;
        emit UpdateStakingAmounts(duration, bonus);
    }

    function isTrading(address _sender, address _recipient)
        internal view
        returns (uint)
    {
        if (automatedMarketMakerPairs[_sender] && _recipient != address(uniswapV2Router)) return 1; // Buy Case

        if (automatedMarketMakerPairs[_recipient]) return 2; // Sell Case

        return 0;
    }    
    
    function setWhitelistForPublicTrade(address _addr, bool _flag) external onlyOwner {
        whitelistForPublicTrade[_addr] = _flag;    
    }    
    
    function setPublicTrading() external onlyOwner {
        require(!enabledPublicTrading);        
        enabledPublicTrading = true;    
    }    
    
    function setTrueDefiRouter(address _router) external onlyOwner {
        tefiRouter = _router;
        if (_router != address(0)) {
            whitelistForPublicTrade[_router] = true;
            _isExcludedFromFees[_router] = true;
            dividendTracker.excludeFromDividends(_router);
        }
        launchblock = block.number;
        tradingEnabled = true;
        emit TradingEnabled();    
    }
    
    // use for pre sale wallet, adds all exclusions to it
    function setPresaleWallet(address wallet) external onlyOwner {
        canTransferBeforeTradingIsEnabled[wallet] = true;
        _isExcludedFromFees[wallet] = true;
        dividendTracker.excludeFromDividends(wallet);
        emit SetPreSaleWallet(wallet);
    }
    
    // exclude a wallet from fees 
    function setExcludeFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    // exclude from dividends (rewards)
    function setExcludeDividends(address account) public onlyOwner {
        dividendTracker.excludeFromDividends(account);
    }

    // include in dividends 
    function setIncludeDividends(address account) public onlyOwner {
        dividendTracker.includeFromDividends(account);
        dividendTracker.setBalance(account, getStakingBalance(account));
    }

    //allow a wallet to trade before trading enabled
    function setCanTransferBefore(address wallet, bool enable)
        external
        onlyOwner
    {
        canTransferBeforeTradingIsEnabled[wallet] = enable;
    }

    // turn limits on and off
    function setLimitsInEffect(bool value) external onlyOwner {
        limitsInEffect = value;
    }

    // set cooldown timer, can only be between 0 and 300 seconds (5 mins max)
    function setcooldowntimer(uint256 value) external onlyOwner {
        require(value <= 300, "cooldown timer cannot exceed 5 minutes");
        cooldowntimer = value;
    }

    // set max wallet, can not be lower than 0.05% of supply
    function setmaxWallet(uint256 value) external onlyOwner {
        value = value * (10**18);
        require(value >= _totalSupply / 1000, "max wallet cannot be set to less than 0.1%");
        maxWallet = value;
    }

    
    function enableStaking(bool enable) public onlyOwner {
        require(stakingEnabled != enable);
        stakingEnabled = enable;
        emit EnableStaking(enable);
    }

    function stake(uint256 duration) public {
        require(stakingEnabled, "Staking is not enabled");
        require(stakingAmounts[duration] != 0, "Invalid staking duration");
        require(
            stakingUntilDate[_msgSender()] < block.timestamp.add(duration),
            "already staked for a longer duration"
        );
        stakingBonus[_msgSender()] = stakingAmounts[duration];
        stakingUntilDate[_msgSender()] = block.timestamp.add(duration);
        dividendTracker.setBalance(
            _msgSender(),
            getStakingBalance(_msgSender())
        );
        emit EnableAccountStaking(_msgSender(), duration);
    }

    // rewards threshold
    function setSwapTriggerAmount(uint256 amount) public onlyOwner {
        swapTokensAtAmount = amount * (10**18);
    }

    function enableSwapAndLiquify(bool enabled) public onlyOwner {
        require(swapAndLiquifyEnabled != enabled);
        swapAndLiquifyEnabled = enabled;
        emit EnableSwapAndLiquify(enabled);
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        _setAutomatedMarketMakerPair(pair, value);
    }

    function setAllowCustomTokens(bool allow) public onlyOwner {
        dividendTracker.setAllowCustomTokens(allow);
    }

    function setAllowAutoReinvest(bool allow) public onlyOwner {
        dividendTracker.setAllowAutoReinvest(allow);
    }

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

        if (value) {
            dividendTracker.excludeFromDividends(pair);
        }

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateGasForProcessing(uint256 newValue) public onlyOwner {
        require(newValue >= 200000 && newValue <= 1000000);
        emit GasForProcessingUpdated(newValue, gasForProcessing);
        gasForProcessing = newValue;
    }

    function transferAdmin(address newOwner) public onlyOwner {
        dividendTracker.excludeFromDividends(newOwner);
        _isExcludedFromFees[newOwner] = true;
        transferOwnership(newOwner);
    }

    function updateTransferFee(uint256 newTransferFee) public onlyOwner {
        require (newTransferFee <= 5, "transfer fee cannot exceed 5%");
        transferFee = newTransferFee;
        emit UpdateTransferFee(transferFee);
    }

    function updateFees(
        uint256 deadBuy,
        uint256 deadSell,
        uint256 marketingBuy,
        uint256 marketingSell,
        uint256 liquidityBuy,
        uint256 liquiditySell,
        uint256 RewardsBuy,
        uint256 RewardsSell,
        uint256 devBuy,
        uint256 devSell
    ) public onlyOwner {
        buyDeadFees = deadBuy;
        buyMarketingFees = marketingBuy;
        buyLiquidityFee = liquidityBuy;
        buyRewardsFee = RewardsBuy;
        sellDeadFees = deadSell;
        sellMarketingFees = marketingSell;
        sellLiquidityFee = liquiditySell;
        sellRewardsFee = RewardsSell;
        buyDevFee = devBuy;
        sellDevFee = devSell;

        totalSellFees = sellRewardsFee
            .add(sellLiquidityFee)
            .add(sellMarketingFees)
            .add(sellDevFee);

        totalBuyFees = buyRewardsFee
            .add(buyLiquidityFee)
            .add(buyMarketingFees)
            .add(buyDevFee);

        require(totalSellFees <= 15 && totalBuyFees <= 15, "total fees cannot exceed 15% sell or buy");

        emit UpdateFees(
            sellDeadFees,
            sellMarketingFees,
            sellLiquidityFee,
            sellRewardsFee,
            buyDeadFees,
            buyMarketingFees,
            buyLiquidityFee,
            buyRewardsFee,
            buyDevFee,
            sellDevFee
        );
    }

    function getStakingInfo(address account)
        external
        view
        returns (uint256, uint256)
    {
        return (stakingUntilDate[account], stakingBonus[account]);
    }

    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    function withdrawableDividendOf(address account)
        public
        view
        returns (uint256)
    {
        return dividendTracker.withdrawableDividendOf(account);
    }

    function dividendTokenBalanceOf(address account)
        public
        view
        returns (uint256)
    {
        return dividendTracker.balanceOf(account);
    }

    function getAccountDividendsInfo(address account)
        external
        view
        returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256
        )
    {
        return dividendTracker.getAccount(account);
    }

    function getAccountDividendsInfoAtIndex(uint256 index)
        external
        view
        returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256
        )
    {
        return dividendTracker.getAccountAtIndex(index);
    }

    function processDividendTracker(uint256 gas) external {
        (
            uint256 iterations,
            uint256 claims,
            uint256 lastProcessedIndex
        ) = dividendTracker.process(gas);
        emit ProcessedDividendTracker(
            iterations,
            claims,
            lastProcessedIndex,
            false,
            gas,
            tx.origin
        );
    }

    function claim() external {
        dividendTracker.processAccount(payable(msg.sender), false);
    }

    function getLastProcessedIndex() external view returns (uint256) {
        return dividendTracker.getLastProcessedIndex();
    }

    function getNumberOfDividendTokenHolders() external view returns (uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }

    function setAutoClaim(bool value) external {
        dividendTracker.setAutoClaim(msg.sender, value);
    }

    function setReinvest(bool value) external {
        dividendTracker.setReinvest(msg.sender, value);
    }

    function setDividendsPaused(bool value) external onlyOwner {
        dividendTracker.setDividendsPaused(value);
    }

    function isExcludedFromAutoClaim(address account)
        external
        view
        returns (bool)
    {
        return dividendTracker.isExcludedFromAutoClaim(account);
    }

    function isReinvest(address account) external view returns (bool) {
        return dividendTracker.isReinvest(account);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        uint256 RewardsFee;
        uint256 deadFees;
        uint256 marketingFees;
        uint256 liquidityFee;
        uint256 devFees;

        if (!canTransferBeforeTradingIsEnabled[from]) {
            require(tradingEnabled, "Trading has not yet been enabled");
        }
        
        if (enabledPublicTrading == false && tefiRouter != address(0)) {
            require(isTrading(from, to) == 0 || whitelistForPublicTrade[from] || whitelistForPublicTrade[to], "!available trading");
        }        
        
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        } else if (
            !swapping && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]
        ) {
            bool isSelling = automatedMarketMakerPairs[to];
            bool isBuying = automatedMarketMakerPairs[from];

            if (!isBuying && !isSelling) {
                uint256 tFees = amount.mul(transferFee).div(100);
                amount = amount.sub(tFees);
                super._transfer(from, address(this), tFees);
                super._transfer(from, to, amount);
                dividendTracker.setBalance(from, getStakingBalance(from));
                dividendTracker.setBalance(to, getStakingBalance(to));
                return;
            }
            
            else if (!isBuying && stakingEnabled) {
                require(
                    stakingUntilDate[from] <= block.timestamp,
                    "Tokens are staked and locked!"
                );
                if (stakingUntilDate[from] != 0) {
                    stakingUntilDate[from] = 0;
                    stakingBonus[from] = 0;
                }
            }

            else if (isSelling) {
                RewardsFee = sellRewardsFee;
                deadFees = sellDeadFees;
                marketingFees = sellMarketingFees;
                liquidityFee = sellLiquidityFee;
                devFees = sellDevFee;

                if (limitsInEffect) {
                require(block.timestamp >= _holderLastTransferTimestamp[tx.origin] + cooldowntimer,
                        "cooldown period active");
                _holderLastTransferTimestamp[tx.origin] = block.timestamp;

                }

            } else if (isBuying) {
                RewardsFee = buyRewardsFee;
                deadFees = buyDeadFees;
                marketingFees = buyMarketingFees;
                liquidityFee = buyLiquidityFee;
                devFees = buyDevFee;

                if (limitsInEffect) {
                require(block.number > launchblock + 2,"you shall not pass");
                require(_holderLastTransferBlock[tx.origin] != block.number,"Too many TX in block");
                _holderLastTransferBlock[tx.origin] = block.number;
            }
            
            uint256 contractBalanceRecipient = balanceOf(to);
            require(contractBalanceRecipient + amount <= maxWallet,
                    "Exceeds maximum wallet token amount." );
            }

            uint256 totalFees = RewardsFee
                .add(liquidityFee + marketingFees + devFees);

            uint256 contractTokenBalance = balanceOf(address(this));

            bool canSwap = contractTokenBalance >= swapTokensAtAmount;

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

                if (swapAndLiquifyEnabled && liquidityFee > 0 && totalBuyFees > 0) {
                    uint256 totalBuySell = buyAmount.add(sellAmount);
                    uint256 swapAmountBought = contractTokenBalance
                        .mul(buyAmount)
                        .div(totalBuySell);
                    uint256 swapAmountSold = contractTokenBalance
                        .mul(sellAmount)
                        .div(totalBuySell);

                    uint256 swapBuyTokens = swapAmountBought
                        .mul(liquidityFee)
                        .div(totalBuyFees);

                    uint256 swapSellTokens = swapAmountSold
                        .mul(liquidityFee)
                        .div(totalSellFees);

                    uint256 swapTokens = swapSellTokens.add(swapBuyTokens);

                    swapAndLiquify(swapTokens);
                }

                uint256 remainingBalance = balanceOf(address(this));
                swapAndSendDividends(remainingBalance);
                buyAmount = 1;
                sellAmount = 1;
                swapping = false;
            }

            uint256 fees = amount.mul(totalFees).div(100);
            uint256 burntokens;

            if (deadFees > 0) {
            burntokens = amount.mul(deadFees) / 100;
            super._transfer(from, DEAD, burntokens);
            _totalSupply = _totalSupply.sub(burntokens);

            }

            amount = amount.sub(fees + burntokens);

            if (isSelling) {
                sellAmount = sellAmount.add(fees);
            } else {
                buyAmount = buyAmount.add(fees);
            }

            super._transfer(from, address(this), fees);

            uint256 gas = gasForProcessing;

            try dividendTracker.process(gas) returns (
                uint256 iterations,
                uint256 claims,
                uint256 lastProcessedIndex
            ) {
                emit ProcessedDividendTracker(
                    iterations,
                    claims,
                    lastProcessedIndex,
                    true,
                    gas,
                    tx.origin
                );
            } catch {}
        }

        super._transfer(from, to, amount);
        dividendTracker.setBalance(from, getStakingBalance(from));
        dividendTracker.setBalance(to, getStakingBalance(to));
    
        if (from != address(uniswapV2Router) && !automatedMarketMakerPairs[from] && to == tefiRouter) {
            ITrueDefiSwap(tefiRouter).triggeredTokenSent(amount, from);
        }    
    }

    function getStakingBalance(address account) private view returns (uint256) {
        return
            stakingEnabled
                ? balanceOf(account).mul(stakingBonus[account].add(100)).div(
                    100
                )
                : balanceOf(account);
    }

    function swapAndLiquify(uint256 tokens) private {
        uint256 half = tokens.div(2);
        uint256 otherHalf = tokens.sub(half);
        uint256 initialBalance = address(this).balance;
        swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered
        uint256 newBalance = address(this).balance.sub(initialBalance);
        addLiquidity(otherHalf, newBalance);
        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function updatePayoutToken(address token) public onlyOwner {
        dividendTracker.updatePayoutToken(token);
        emit UpdatePayoutToken(token);
    }

    function getPayoutToken() public view returns (address) {
        return dividendTracker.getPayoutToken();
    }

    function setMinimumTokenBalanceForAutoDividends(uint256 value)
        public
        onlyOwner
    {
        dividendTracker.setMinimumTokenBalanceForAutoDividends(value);
    }

    function setMinimumTokenBalanceForDividends(uint256 value)
        public
        onlyOwner
    {
        dividendTracker.setMinimumTokenBalanceForDividends(value);
    }

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

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

    function forceSwapAndSendDividends(uint256 tokens) public onlyOwner {
        tokens = tokens * (10**18);
        uint256 totalAmount = buyAmount.add(sellAmount);
        uint256 fromBuy = tokens.mul(buyAmount).div(totalAmount);
        uint256 fromSell = tokens.mul(sellAmount).div(totalAmount);

        swapAndSendDividends(tokens);

        buyAmount = buyAmount.sub(fromBuy);
        sellAmount = sellAmount.sub(fromSell);
    }

    function swapAndSendDividends(uint256 tokens) private {
        if (tokens == 0) {
            return;
        }
        swapTokensForEth(tokens);
        uint256 totalAmount = buyAmount.add(sellAmount);

        bool success = true;
        bool successOp1 = true;
        bool successOp2 = true;

        uint256 dividends;
        uint256 dividendsFromBuy;
        uint256 dividendsFromSell;

        if (buyRewardsFee > 0) {
            dividendsFromBuy = address(this)
            .balance
            .mul(buyAmount)
            .div(totalAmount)
            .mul(buyRewardsFee)
            .div(buyRewardsFee + buyMarketingFees + buyDevFee);
        }
        if (sellRewardsFee > 0) {
            dividendsFromSell = address(this)
            .balance
            .mul(sellAmount)
            .div(totalAmount)
            .mul(sellRewardsFee)
            .div(sellRewardsFee + sellMarketingFees + sellDevFee);
        }
        dividends = dividendsFromBuy.add(dividendsFromSell);

        if (dividends > 0) {
            (success, ) = address(dividendTracker).call{value: dividends}("");
        }
        
        uint256 _completeFees = sellMarketingFees.add(sellDevFee) +
            buyMarketingFees.add(buyDevFee);

        uint256 feePortions;
        if (_completeFees > 0) {
            feePortions = address(this).balance.div(_completeFees);
        }
        uint256 marketingPayout = buyMarketingFees.add(sellMarketingFees) * feePortions;
        uint256 devPayout = buyDevFee.add(sellDevFee) * feePortions;

        if (marketingPayout > 0) {
            (successOp1, ) = address(marketingWallet).call{value: marketingPayout}("");
        }
        if (devPayout > 0) {
            (successOp2, ) = address(devWallet).call{value: devPayout}("");
        }

        emit SendDividends(
            dividends,
            marketingPayout + devPayout,
            success && successOp1 && successOp2
        );
    }

    function airdropToWallets(
        address[] memory airdropWallets,
        uint256[] memory amount
    ) external onlyOwner {
        require(airdropWallets.length == amount.length,"Arrays must be the same length");
        require(airdropWallets.length <= 200, "Wallets list length must be <= 200");
        for (uint256 i = 0; i < airdropWallets.length; i++) {
            address wallet = airdropWallets[i];
            uint256 airdropAmount = amount[i] * (10**18);
            super._transfer(msg.sender, wallet, airdropAmount);
            dividendTracker.setBalance(payable(wallet), balanceOf(wallet));
        }
    }
}

contract JETHDividendTracker is DividendPayingToken, Ownable {
    using SafeMath for uint256;
    using SafeMathInt for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping(address => bool) public excludedFromDividends;
    mapping(address => bool) public excludedFromAutoClaim;
    mapping(address => bool) public autoReinvest;
    address public defaultToken; // BUSD
    bool public allowCustomTokens;
    bool public allowAutoReinvest;
    bool public dividendsPaused = false;

    string private trackerName;
    string private trackerTicker;

    IUniswapV2Router02 public uniswapV2Router;

    JETH public JETHContract;

    mapping(address => uint256) public lastClaimTimes;

    uint256 private minimumTokenBalanceForAutoDividends;
    uint256 private minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event DividendReinvested(
        address indexed acount,
        uint256 value,
        bool indexed automatic
    );
    event Claim(
        address indexed account,
        uint256 amount,
        bool indexed automatic
    );
    event DividendsPaused(bool paused);
    event SetAllowCustomTokens(bool allow);
    event SetAllowAutoReinvest(bool allow);

    constructor(
        address payable mainContract,
        address router,
        address token,
        string memory _name,
        string memory _ticker
    ) DividendPayingToken(_name, _ticker) {
        trackerName = _name;
        trackerTicker = _ticker;
        defaultToken = token;
        JETHContract = JETH(mainContract);
        minimumTokenBalanceForAutoDividends = 100_000000000000000000; // 100 tokens
        minimumTokenBalanceForDividends = minimumTokenBalanceForAutoDividends;

        uniswapV2Router = IUniswapV2Router02(router);
        allowCustomTokens = true;
        allowAutoReinvest = false;
    }

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

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

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

    function _transfer(
        address,
        address,
        uint256
    ) internal pure override {
        require(false, "JETH_Dividend_Tracker: No transfers allowed");
    }

    function withdrawDividend() public pure override {
        require(
            false,
            "JETH_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main JETH contract."
        );
    }

    function isExcludedFromAutoClaim(address account)
        external
        view
        onlyOwner
        returns (bool)
    {
        return excludedFromAutoClaim[account];
    }

    function isReinvest(address account)
        external
        view
        onlyOwner
        returns (bool)
    {
        return autoReinvest[account];
    }

    function setAllowCustomTokens(bool allow) external onlyOwner {
        require(allowCustomTokens != allow);
        allowCustomTokens = allow;
        emit SetAllowCustomTokens(allow);
    }

    function setAllowAutoReinvest(bool allow) external onlyOwner {
        require(allowAutoReinvest != allow);
        allowAutoReinvest = allow;
        emit SetAllowAutoReinvest(allow);
    }

    function excludeFromDividends(address account) external onlyOwner {
        //require(!excludedFromDividends[account]);
        excludedFromDividends[account] = true;

        _setBalance(account, 0);
        tokenHoldersMap.remove(account);

        emit ExcludeFromDividends(account);
    }

    function includeFromDividends(address account) external onlyOwner {
        excludedFromDividends[account] = false;
    }

    function setAutoClaim(address account, bool value) external onlyOwner {
        excludedFromAutoClaim[account] = value;
    }

    function setReinvest(address account, bool value) external onlyOwner {
        autoReinvest[account] = value;
    }

    function setMinimumTokenBalanceForAutoDividends(uint256 value)
        external
        onlyOwner
    {
        minimumTokenBalanceForAutoDividends = value * (10**18);
    }

    function setMinimumTokenBalanceForDividends(uint256 value)
        external
        onlyOwner
    {
        minimumTokenBalanceForDividends = value * (10**18);
    }

    function setDividendsPaused(bool value) external onlyOwner {
        require(dividendsPaused != value);
        dividendsPaused = value;
        emit DividendsPaused(value);
    }

    function getLastProcessedIndex() external view returns (uint256) {
        return lastProcessedIndex;
    }

    function getNumberOfTokenHolders() external view returns (uint256) {
        return tokenHoldersMap.keys.length;
    }

    function getAccount(address _account)
        public
        view
        returns (
            address account,
            int256 index,
            int256 iterationsUntilProcessed,
            uint256 withdrawableDividends,
            uint256 totalDividends,
            uint256 lastClaimTime
        )
    {
        account = _account;

        index = tokenHoldersMap.getIndexOfKey(account);

        iterationsUntilProcessed = -1;

        if (index >= 0) {
            if (uint256(index) > lastProcessedIndex) {
                iterationsUntilProcessed = index.sub(
                    int256(lastProcessedIndex)
                );
            } else {
                uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length >
                    lastProcessedIndex
                    ? tokenHoldersMap.keys.length.sub(lastProcessedIndex)
                    : 0;

                iterationsUntilProcessed = index.add(
                    int256(processesUntilEndOfArray)
                );
            }
        }

        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);

        lastClaimTime = lastClaimTimes[account];
    }

    function getAccountAtIndex(uint256 index)
        public
        view
        returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256
        )
    {
        if (index >= tokenHoldersMap.size()) {
            return (
                0x0000000000000000000000000000000000000000,
                -1,
                -1,
                0,
                0,
                0
            );
        }

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

    function setBalance(address account, uint256 newBalance)
        external
        onlyOwner
    {
        if (excludedFromDividends[account]) {
            return;
        }

        if (newBalance < minimumTokenBalanceForDividends) {
            tokenHoldersMap.remove(account);
            _setBalance(account, 0);

            return;
        }

        _setBalance(account, newBalance);

        if (newBalance >= minimumTokenBalanceForAutoDividends) {
            tokenHoldersMap.set(account, newBalance);
        } else {
            tokenHoldersMap.remove(account);
        }
    }

    function process(uint256 gas)
        public
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;

        if (numberOfTokenHolders == 0 || dividendsPaused) {
            return (0, 0, lastProcessedIndex);
        }

        uint256 _lastProcessedIndex = lastProcessedIndex;

        uint256 gasUsed = 0;

        uint256 gasLeft = gasleft();

        uint256 iterations = 0;
        uint256 claims = 0;

        while (gasUsed < gas && iterations < numberOfTokenHolders) {
            _lastProcessedIndex++;

            if (_lastProcessedIndex >= numberOfTokenHolders) {
                _lastProcessedIndex = 0;
            }

            address account = tokenHoldersMap.keys[_lastProcessedIndex];

            if (!excludedFromAutoClaim[account]) {
                if (processAccount(payable(account), true)) {
                    claims++;
                }
            }

            iterations++;

            uint256 newGasLeft = gasleft();

            if (gasLeft > newGasLeft) {
                gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
            }

            gasLeft = newGasLeft;
        }

        lastProcessedIndex = _lastProcessedIndex;

        return (iterations, claims, lastProcessedIndex);
    }

    function processAccount(address payable account, bool automatic)
        public
        onlyOwner
        returns (bool)
    {
        if (dividendsPaused) {
            return false;
        }

        bool reinvest = autoReinvest[account];

        if (automatic && reinvest && !allowAutoReinvest) {
            return false;
        }

        uint256 amount = reinvest
            ? _reinvestDividendOfUser(account)
            : _withdrawDividendOfUser(account);

        if (amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            if (reinvest) {
                emit DividendReinvested(account, amount, automatic);
            } else {
                emit Claim(account, amount, automatic);
            }
            return true;
        }

        return false;
    }

    function updateUniswapV2Router(address newAddress) public onlyOwner {
        uniswapV2Router = IUniswapV2Router02(newAddress);
    }

    function updatePayoutToken(address token) public onlyOwner {
        defaultToken = token;
    }

    function getPayoutToken() public view returns (address) {
        return defaultToken;
    }

    function _reinvestDividendOfUser(address account)
        private
        returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(account);
        if (_withdrawableDividend > 0) {
            bool success;

            withdrawnDividends[account] = withdrawnDividends[account].add(
                _withdrawableDividend
            );

            address[] memory path = new address[](2);
            path[0] = uniswapV2Router.WETH();
            path[1] = address(JETHContract);

            uint256 prevBalance = JETHContract.balanceOf(address(this));

            // make the swap
            try
                uniswapV2Router
                    .swapExactETHForTokensSupportingFeeOnTransferTokens{
                    value: _withdrawableDividend
                }(
                    0, // accept any amount of Tokens
                    path,
                    address(this),
                    block.timestamp
                )
            {
                uint256 received = JETHContract
                    .balanceOf(address(this))
                    .sub(prevBalance);
                if (received > 0) {
                    success = true;
                    JETHContract.transfer(account, received);
                } else {
                    success = false;
                }
            } catch {
                success = false;
            }

            if (!success) {
                withdrawnDividends[account] = withdrawnDividends[account].sub(
                    _withdrawableDividend
                );
                return 0;
            }

            return _withdrawableDividend;
        }

        return 0;
    }

    function _withdrawDividendOfUser(address payable user)
        internal
        override
        returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(
                _withdrawableDividend
            );

            address tokenAddress = defaultToken;
            bool success;

            if (tokenAddress == address(0)) {
                (success, ) = user.call{
                    value: _withdrawableDividend,
                    gas: 3000
                }("");
            } else {
                address[] memory path = new address[](2);
                path[0] = uniswapV2Router.WETH();
                path[1] = tokenAddress;
                try
                    uniswapV2Router
                        .swapExactETHForTokensSupportingFeeOnTransferTokens{
                        value: _withdrawableDividend
                    }(
                        0, // accept any amount of Tokens
                        path,
                        user,
                        block.timestamp
                    )
                {
                    success = true;
                } catch {
                    success = false;
                }
            }

            if (!success) {
                withdrawnDividends[user] = withdrawnDividends[user].sub(
                    _withdrawableDividend
                );
                return 0;
            } else {
                emit DividendWithdrawn(user, _withdrawableDividend);
            }
            return _withdrawableDividend;
        }
        return 0;
    }
}

library IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint256) values;
        mapping(address => uint256) indexOf;
        mapping(address => bool) inserted;
    }

    function get(Map storage map, address key) internal view returns (uint256) {
        return map.values[key];
    }

    function getIndexOfKey(Map storage map, address key)
        internal
        view
        returns (int256)
    {
        if (!map.inserted[key]) {
            return -1;
        }
        return int256(map.indexOf[key]);
    }

    function getKeyAtIndex(Map storage map, uint256 index)
        internal
        view
        returns (address)
    {
        return map.keys[index];
    }

    function size(Map storage map) internal view returns (uint256) {
        return map.keys.length;
    }

    function set(
        Map storage map,
        address key,
        uint256 val
    ) internal {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) internal {
        if (!map.inserted[key]) {
            return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint256 index = map.indexOf[key];
        uint256 lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"EnableAccountStaking","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableStaking","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableSwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","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":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"opAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"SetPreSaleWallet","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":[],"name":"TradingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sellDeadFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellMarketingFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellLiquidityFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellRewardsFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyDeadFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyMarketingFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyLiquidityFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyRewardsFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyDevFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellDevFee","type":"uint256"}],"name":"UpdateFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"UpdatePayoutToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UpdateStakingAmounts","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"transferFee","type":"uint256"}],"name":"UpdateTransferFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"airdropWallets","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"airdropToWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDeadFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cooldowntimer","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":"devWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract JETHDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"enableStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enableSwapAndLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enabledPublicTrading","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"forceSwapAndSendDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPayoutToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getStakingInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromAutoClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isReinvest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchblock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","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":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellDeadFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"allow","type":"bool"}],"name":"setAllowAutoReinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"allow","type":"bool"}],"name":"setAllowCustomTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutoClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setCanTransferBefore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setDividendsPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setExcludeDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setIncludeDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setLimitsInEffect","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMinimumTokenBalanceForAutoDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMinimumTokenBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setPresaleWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublicTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setReinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTriggerAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"setTrueDefiRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"bool","name":"_flag","type":"bool"}],"name":"setWhitelistForPublicTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setcooldowntimer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setmaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakingAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingUntilDate","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":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"newOwner","type":"address"}],"name":"transferAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"deadBuy","type":"uint256"},{"internalType":"uint256","name":"deadSell","type":"uint256"},{"internalType":"uint256","name":"marketingBuy","type":"uint256"},{"internalType":"uint256","name":"marketingSell","type":"uint256"},{"internalType":"uint256","name":"liquidityBuy","type":"uint256"},{"internalType":"uint256","name":"liquiditySell","type":"uint256"},{"internalType":"uint256","name":"RewardsBuy","type":"uint256"},{"internalType":"uint256","name":"RewardsSell","type":"uint256"},{"internalType":"uint256","name":"devBuy","type":"uint256"},{"internalType":"uint256","name":"devSell","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"updatePayoutToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"bonus","type":"uint256"}],"name":"updateStakingAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTransferFee","type":"uint256"}],"name":"updateTransferFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistForPublicTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260088054600162ffff0160a01b03191661dead17905560016009819055600a819055601d805460ff199081168317909155620493e0601e55602580549091169091179055603c6029553480156200005a57600080fd5b506040518060400160405280600a8152602001694a65657468657265756d60b01b815250604051806040016040528060048152602001630948aa8960e31b8152508160039081620000ac919062000b80565b506004620000bb828262000b80565b5050506000620000d06200089060201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600e805473061188e7c73259a7670afe87ce2d93a53fe33af96001600160a01b031991821617909155600f805473afd164d218a00c04a3d3b6b5ce2f22db7f1d26a892169190911790556001601681905560135560026017819055601481905560188190556015819055600360198190556012819055601a829055601b8290556005601c55737a250d5630b4cf539739df2c5dacb4c659f2488d91620001ee91620001da90829082908262000894602090811b62002cd617901c565b6200089460201b62002cd61790919060201c565b600c8190555062000220601b54620001da601454620001da6015546012546200089460201b62002cd61790919060201c565b600b81905550308173dac17f958d2ee523a2206206994597c13d831ec76040516200024b9062000ace565b6001600160a01b0393841681529183166020830152909116604082015260a060608201819052600b9082018190526a2522aa242a3930b1b5b2b960a91b60c083015260e0608083018190528201526a2522aa242a2920a1a5a2a960a91b61010082015261012001604051809103906000f080158015620002cf573d6000803e3d6000fd5b50600d80546001600160a01b039283166001600160a01b0319918216179091556006805492841692909116821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156200033a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000360919062000c4c565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003c3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003e9919062000c4c565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000437573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200045d919062000c4c565b600780546001600160a01b0319166001600160a01b039290921691821790556200048990600162000902565b600d5460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b158015620004d057600080fd5b505af1158015620004e5573d6000803e3d6000fd5b5050600d5460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200052f57600080fd5b505af115801562000544573d6000803e3d6000fd5b5050600d5460085460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b1580156200059257600080fd5b505af1158015620005a7573d6000803e3d6000fd5b5050600d54604051634e7b827f60e01b8152600060048201526001600160a01b039091169250634e7b827f9150602401602060405180830381865afa158015620005f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200061b919062000c77565b50600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b1580156200066457600080fd5b505af115801562000679573d6000803e3d6000fd5b5050600d54600e5460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b158015620006c757600080fd5b505af1158015620006dc573d6000803e3d6000fd5b5050600d546001600160a01b031691506331e79db09050620007066005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156200074857600080fd5b505af11580156200075d573d6000803e3d6000fd5b5050306000908152601f60205260408082208054600160ff199182168117909255600d546001600160a01b0390811685528385208054831684179055600e54811685528385208054831684179055600f54168452828420805482168317905533845291909220805490911690911790555069d3c21bcecceda10000009050620007f9620007f26005546001600160a01b031690565b82620009cd565b620008076127108262000c9b565b601055620008186103e88262000c9b565b601155600160246000620008346005546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff1995861617905530815260248352818120805485166001908117909155338252602b9093522080549092161790555062000ce59050565b3390565b600080620008a3838562000cbe565b905083811015620008fb5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b9392505050565b6001600160a01b03821660009081526020805260409020805460ff191682158015919091179091556200099157600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200097757600080fd5b505af11580156200098c573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b03821662000a255760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620008f2565b62000a41816002546200089460201b62002cd61790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000a7491839062002cd662000894821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b6130e1806200577e83390190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000b0757607f821691505b60208210810362000b2857634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000ac957600081815260208120601f850160051c8101602086101562000b575750805b601f850160051c820191505b8181101562000b785782815560010162000b63565b505050505050565b81516001600160401b0381111562000b9c5762000b9c62000adc565b62000bb48162000bad845462000af2565b8462000b2e565b602080601f83116001811462000bec576000841562000bd35750858301515b600019600386901b1c1916600185901b17855562000b78565b600085815260208120601f198616915b8281101562000c1d5788860151825594840194600190910190840162000bfc565b508582101562000c3c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000c5f57600080fd5b81516001600160a01b0381168114620008fb57600080fd5b60006020828403121562000c8a57600080fd5b81518015158114620008fb57600080fd5b60008262000cb957634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111562000ce057634e487b7160e01b600052601160045260246000fd5b500190565b614a898062000cf56000396000f3fe6080604052600436106104fb5760003560e01c80637fdde05c1161028c578063acb2ad6f1161015a578063dd62ed3e116100cc578063f2fde38b11610085578063f2fde38b14610fdc578063f39409e914610ffc578063f5d3c79a1461101c578063f63743421461103c578063f8b45b0514611052578063fc6b151c1461106857600080fd5b8063dd62ed3e14610f08578063e2f4560514610f4e578063e7841ec014610f64578063f11a24d314610f79578063f1c0ddff14610f8f578063f27fd25414610fbc57600080fd5b8063ba079d491161011e578063ba079d4914610e5d578063bb8d513114610e7d578063d07a091c14610e93578063d5e3725114610eb3578063d7b837dd14610ed3578063d8032ed314610ee857600080fd5b8063acb2ad6f14610d8b578063ad56c13c14610da1578063b494298814610df8578063b62496f514610e0e578063b74e3b1114610e3d57600080fd5b80639c1b8af5116101fe578063a457c2d7116101b7578063a457c2d714610c93578063a694fc3a14610cb3578063a8b9d24014610cd3578063a9059cbb14610cf3578063a9885de514610d13578063aa4704f314610d3357600080fd5b80639c1b8af514610bf15780639c3372ea14610c075780639c3b4fdc14610c275780639cefc1da14610c3d5780639ec1037e14610c5d578063a0d82dc514610c7d57600080fd5b80638ca2923a116102505780638ca2923a14610b525780638da5cb5b14610b685780638ea5220f14610b8657806395451c2914610ba657806395d89b4114610bbc5780639a7a23d614610bd157600080fd5b80637fdde05c14610ab2578063837ae2d014610ad25780638577a6d514610af2578063868730c714610b12578063871c128d14610b3257600080fd5b80634a62bb65116103c9578063679ca6e91161033b57806372d8edf4116102f457806372d8edf4146109f557806375829def14610a1557806375f0a87414610a3557806377a3b60914610a555780637928dd1d14610a6b5780637d32f34214610a8557600080fd5b8063679ca6e9146109405780636843cd84146109605780636d48467b14610980578063700bb191146109a057806370a08231146109c0578063715018a6146109e057600080fd5b80635124f8741161038d5780635124f8741461089f5780635a84c5eb146108b55780635c234bb6146108d55780635ebf4db9146108eb5780635eee4bae1461090b57806364b0f6531461092b57600080fd5b80634a62bb65146107fc5780634a74bb02146108165780634ada218b146108305780634e71d92d146108515780634fbee1931461086657600080fd5b80632307b4411161046d5780633599bb17116104265780633599bb171461073957806339509351146107595780633f407b841461077957806340ffdd801461078f578063435c89e4146107af57806349bd5a5e146107dc57600080fd5b80632307b4411461069357806323b872dd146106b357806325cd3598146106d35780632c1f5216146106e857806330bb4cff14610708578063313ce5671461071d57600080fd5b80630ef35b7e116104bf5780630ef35b7e146105d85780631694505e146105f857806318160ddd146106185780631d7b1fb4146106375780631fa705311461064d57806321cbb0241461066357600080fd5b806303fd2a451461050757806305ca5f081461054457806306fdde031461056657806308dfe8a514610588578063095ea7b3146105a857600080fd5b3661050257005b600080fd5b34801561051357600080fd5b50600854610527906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561055057600080fd5b5061056461055f36600461432e565b611088565b005b34801561057257600080fd5b5061057b611159565b60405161053b9190614347565b34801561059457600080fd5b506105646105a33660046143bf565b6111eb565b3480156105b457600080fd5b506105c86105c33660046143f8565b611274565b604051901515815260200161053b565b3480156105e457600080fd5b506105646105f3366004614424565b61128b565b34801561060457600080fd5b50600654610527906001600160a01b031681565b34801561062457600080fd5b506002545b60405190815260200161053b565b34801561064357600080fd5b5061062960295481565b34801561065957600080fd5b50610629600a5481565b34801561066f57600080fd5b506105c861067e366004614446565b602b6020526000908152604090205460ff1681565b34801561069f57600080fd5b506105646106ae366004614539565b611370565b3480156106bf57600080fd5b506105c86106ce3660046145fb565b611541565b3480156106df57600080fd5b506105276115aa565b3480156106f457600080fd5b50600d54610527906001600160a01b031681565b34801561071457600080fd5b5061062961161d565b34801561072957600080fd5b506040516012815260200161053b565b34801561074557600080fd5b5061056461075436600461463c565b61168b565b34801561076557600080fd5b506105c86107743660046143f8565b611718565b34801561078557600080fd5b5061062960095481565b34801561079b57600080fd5b506105646107aa36600461463c565b61174e565b3480156107bb57600080fd5b506106296107ca36600461432e565b60236020526000908152604090205481565b3480156107e857600080fd5b50600754610527906001600160a01b031681565b34801561080857600080fd5b506025546105c89060ff1681565b34801561082257600080fd5b50601d546105c89060ff1681565b34801561083c57600080fd5b506008546105c890600160b01b900460ff1681565b34801561085d57600080fd5b506105646117a9565b34801561087257600080fd5b506105c8610881366004614446565b6001600160a01b03166000908152601f602052604090205460ff1690565b3480156108ab57600080fd5b5061062960175481565b3480156108c157600080fd5b506105646108d036600461432e565b611821565b3480156108e157600080fd5b5061062960165481565b3480156108f757600080fd5b5061056461090636600461432e565b61187c565b34801561091757600080fd5b5061056461092636600461432e565b6118d7565b34801561093757600080fd5b50610629611919565b34801561094c57600080fd5b5061056461095b36600461463c565b611963565b34801561096c57600080fd5b5061062961097b366004614446565b6119a0565b34801561098c57600080fd5b506105c861099b366004614446565b611a10565b3480156109ac57600080fd5b506105646109bb36600461432e565b611a80565b3480156109cc57600080fd5b506106296109db366004614446565b611b52565b3480156109ec57600080fd5b50610564611b6d565b348015610a0157600080fd5b50610564610a10366004614446565b611be1565b348015610a2157600080fd5b50610564610a30366004614446565b611c3d565b348015610a4157600080fd5b50600e54610527906001600160a01b031681565b348015610a6157600080fd5b5061062960195481565b348015610a7757600080fd5b50602a546105c89060ff1681565b348015610a9157600080fd5b50610629610aa0366004614446565b60226020526000908152604090205481565b348015610abe57600080fd5b50610564610acd3660046143bf565b611cf2565b348015610ade57600080fd5b50610564610aed366004614659565b611d47565b348015610afe57600080fd5b50610564610b0d36600461432e565b611ef1565b348015610b1e57600080fd5b50610564610b2d36600461463c565b611fa8565b348015610b3e57600080fd5b50610564610b4d36600461432e565b611fe0565b348015610b5e57600080fd5b5061062960135481565b348015610b7457600080fd5b506005546001600160a01b0316610527565b348015610b9257600080fd5b50600f54610527906001600160a01b031681565b348015610bb257600080fd5b5061062960145481565b348015610bc857600080fd5b5061057b61205c565b348015610bdd57600080fd5b50610564610bec3660046143bf565b61206b565b348015610bfd57600080fd5b50610629601e5481565b348015610c1357600080fd5b50610564610c2236600461463c565b6120a3565b348015610c3357600080fd5b50610629601a5481565b348015610c4957600080fd5b50610564610c5836600461463c565b6120ff565b348015610c6957600080fd5b50610564610c78366004614446565b612195565b348015610c8957600080fd5b50610629601b5481565b348015610c9f57600080fd5b506105c8610cae3660046143f8565b61226c565b348015610cbf57600080fd5b50610564610cce36600461432e565b6122bb565b348015610cdf57600080fd5b50610629610cee366004614446565b6124de565b348015610cff57600080fd5b506105c8610d0e3660046143f8565b612511565b348015610d1f57600080fd5b50610564610d2e3660046143bf565b61251e565b348015610d3f57600080fd5b50610d76610d4e366004614446565b6001600160a01b03166000908152602260209081526040808320546021909252909120549091565b6040805192835260208301919091520161053b565b348015610d9757600080fd5b50610629601c5481565b348015610dad57600080fd5b50610dc1610dbc366004614446565b612573565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c00161053b565b348015610e0457600080fd5b5061062960285481565b348015610e1a57600080fd5b506105c8610e29366004614446565b602080526000908152604090205460ff1681565b348015610e4957600080fd5b50610564610e5836600461432e565b612603565b348015610e6957600080fd5b506105c8610e78366004614446565b612693565b348015610e8957600080fd5b5061062960125481565b348015610e9f57600080fd5b50610564610eae366004614446565b6126c6565b348015610ebf57600080fd5b50610564610ece36600461463c565b6127bb565b348015610edf57600080fd5b5061056461283d565b348015610ef457600080fd5b50610564610f03366004614446565b612886565b348015610f1457600080fd5b50610629610f233660046146c1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610f5a57600080fd5b5061062960115481565b348015610f7057600080fd5b50610629612949565b348015610f8557600080fd5b5061062960185481565b348015610f9b57600080fd5b50610629610faa366004614446565b60216020526000908152604090205481565b348015610fc857600080fd5b50610dc1610fd736600461432e565b612993565b348015610fe857600080fd5b50610564610ff7366004614446565b6129d1565b34801561100857600080fd5b50610564611017366004614446565b612abc565b34801561102857600080fd5b5061056461103736600461463c565b612be9565b34801561104857600080fd5b5061062960155481565b34801561105e57600080fd5b5061062960105481565b34801561107457600080fd5b5061056461108336600461432e565b612c21565b6005546001600160a01b031633146110bb5760405162461bcd60e51b81526004016110b2906146ef565b60405180910390fd5b6110cd81670de0b6b3a764000061473a565b905060006110e8600954600a54612cd690919063ffffffff16565b9050600061110b82611105600a5486612d3c90919063ffffffff16565b90612dbe565b905060006111288361110560095487612d3c90919063ffffffff16565b905061113384612e00565b600a546111409083613100565b600a556009546111509082613100565b60095550505050565b60606003805461116890614759565b80601f016020809104026020016040519081016040528092919081815260200182805461119490614759565b80156111e15780601f106111b6576101008083540402835291602001916111e1565b820191906000526020600020905b8154815290600101906020018083116111c457829003601f168201915b5050505050905090565b6005546001600160a01b031633146112155760405162461bcd60e51b81526004016110b2906146ef565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6000611281338484613142565b5060015b92915050565b6005546001600160a01b031633146112b55760405162461bcd60e51b81526004016110b2906146ef565b6000828152602360205260409020548190036112d057600080fd5b60648111156113215760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e6720626f6e75732063616e27742065786365656420313030000060448201526064016110b2565b60008281526023602090815260409182902083905581518481529081018390527f065c0eec5c5d031ee25323575d53db5536226ab058b74d8bdb03c517dd4f605d910160405180910390a15050565b6005546001600160a01b0316331461139a5760405162461bcd60e51b81526004016110b2906146ef565b80518251146113eb5760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e677468000060448201526064016110b2565b60c8825111156114485760405162461bcd60e51b815260206004820152602260248201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d2032604482015261030360f41b60648201526084016110b2565b60005b825181101561153c57600083828151811061146857611468614793565b60200260200101519050600083838151811061148657611486614793565b6020026020010151670de0b6b3a76400006114a1919061473a565b90506114ae338383613267565b600d546001600160a01b031663e30443bc836114c981611b52565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561150f57600080fd5b505af1158015611523573d6000803e3d6000fd5b5050505050508080611534906147a9565b91505061144b565b505050565b600061154e848484613370565b6115a0843361159b85604051806060016040528060288152602001614a07602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190613e83565b613142565b5060019392505050565b600d54604080516304b9a6b360e31b815290516000926001600160a01b0316916325cd35989160048083019260209291908290030181865afa1580156115f4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161891906147c2565b905090565b600d54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611667573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161891906147df565b6005546001600160a01b031633146116b55760405162461bcd60e51b81526004016110b2906146ef565b600d54604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b1580156116fd57600080fd5b505af1158015611711573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161128191859061159b9086612cd6565b6005546001600160a01b031633146117785760405162461bcd60e51b81526004016110b2906146ef565b600d546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd80906024016116e3565b600d5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af11580156117fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181e91906147f8565b50565b6005546001600160a01b0316331461184b5760405162461bcd60e51b81526004016110b2906146ef565b600d54604051635a84c5eb60e01b8152600481018390526001600160a01b0390911690635a84c5eb906024016116e3565b6005546001600160a01b031633146118a65760405162461bcd60e51b81526004016110b2906146ef565b600d54604051635ebf4db960e01b8152600481018390526001600160a01b0390911690635ebf4db9906024016116e3565b6005546001600160a01b031633146119015760405162461bcd60e51b81526004016110b2906146ef565b61191381670de0b6b3a764000061473a565b60115550565b600d54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611667573d6000803e3d6000fd5b6005546001600160a01b0316331461198d5760405162461bcd60e51b81526004016110b2906146ef565b6025805460ff1916911515919091179055565b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa1580156119ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128591906147df565b600d54604051636d48467b60e01b81526001600160a01b0383811660048301526000921690636d48467b906024015b602060405180830381865afa158015611a5c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128591906147f8565b600d546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611ad3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af79190614815565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314611b975760405162461bcd60e51b81526004016110b2906146ef565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314611c0b5760405162461bcd60e51b81526004016110b2906146ef565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024016116e3565b6005546001600160a01b03163314611c675760405162461bcd60e51b81526004016110b2906146ef565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015611cae57600080fd5b505af1158015611cc2573d6000803e3d6000fd5b5050506001600160a01b0382166000908152601f60205260409020805460ff191660011790555061181e816129d1565b6005546001600160a01b03163314611d1c5760405162461bcd60e51b81526004016110b2906146ef565b6001600160a01b03919091166000908152602460205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611d715760405162461bcd60e51b81526004016110b2906146ef565b60168a90556017889055601886905560198490556013899055601487905560158590556012839055601a829055601b819055611db981611db38981878a612cd6565b90612cd6565b600b81905550611de2601a54611db3601754611db3601854601954612cd690919063ffffffff16565b600c55600b54600f10801590611dfb5750600f600c5411155b611e585760405162461bcd60e51b815260206004820152602860248201527f746f74616c20666565732063616e6e6f7420657863656564203135252073656c6044820152676c206f722062757960c01b60648201526084016110b2565b601354601454601554601254601654601754601854601954601a54601b54604080519a8b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c085015260e08401526101008301526101208201527f07cec4532bdb36ce729ae72905c09f7bfbf8682c2cc2f1999f745188d9975122906101400160405180910390a150505050505050505050565b6005546001600160a01b03163314611f1b5760405162461bcd60e51b81526004016110b2906146ef565b6005811115611f6c5760405162461bcd60e51b815260206004820152601d60248201527f7472616e73666572206665652063616e6e6f742065786365656420352500000060448201526064016110b2565b601c8190556040518181527f6fbeac6c79c640ca4f5f47271bd7a36c7eb83076224c65a3b3378c8844720343906020015b60405180910390a150565b600d54604051638bc1d63960e01b815233600482015282151560248201526001600160a01b0390911690638bc1d639906044016116e3565b6005546001600160a01b0316331461200a5760405162461bcd60e51b81526004016110b2906146ef565b62030d4081101580156120205750620f42408111155b61202957600080fd5b601e5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601e55565b60606004805461116890614759565b6005546001600160a01b031633146120955760405162461bcd60e51b81526004016110b2906146ef565b61209f8282613ebd565b5050565b6005546001600160a01b031633146120cd5760405162461bcd60e51b81526004016110b2906146ef565b600d54604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea906024016116e3565b6005546001600160a01b031633146121295760405162461bcd60e51b81526004016110b2906146ef565b801515600860159054906101000a900460ff1615150361214857600080fd5b60088054821515600160a81b0260ff60a81b199091161790556040517f0d240c24014ec8c204fc1bdcc286f7d01fd2ab6a07c558a9b2d3f12904323a8790611f9d90831515815260200190565b6005546001600160a01b031633146121bf5760405162461bcd60e51b81526004016110b2906146ef565b600d54604051630928847160e01b81526001600160a01b03838116600483015290911690630928847190602401600060405180830381600087803b15801561220657600080fd5b505af115801561221a573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc90508261223b81613f85565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016116e3565b6000611281338461159b85604051806060016040528060258152602001614a2f602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190613e83565b600854600160a81b900460ff1661230d5760405162461bcd60e51b815260206004820152601660248201527514dd185ada5b99c81a5cc81b9bdd08195b98589b195960521b60448201526064016110b2565b600081815260236020526040812054900361236a5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207374616b696e67206475726174696f6e000000000000000060448201526064016110b2565b6123744282612cd6565b33600090815260226020526040902054106123dd5760405162461bcd60e51b8152602060048201526024808201527f616c7265616479207374616b656420666f722061206c6f6e67657220647572616044820152633a34b7b760e11b60648201526084016110b2565b6000818152602360209081526040808320543384526021909252909120556124054282612cd6565b33600081815260226020526040902091909155600d546001600160a01b03169063e30443bc9061243481613f85565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561247a57600080fd5b505af115801561248e573d6000803e3d6000fd5b505050506124993390565b6001600160a01b03167f13dd201d7da4f9b31a9064a09abc1a6ce420dacd837a77abafaec5bd9d28d2c8826040516124d391815260200190565b60405180910390a250565b600d546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d240906024016119cf565b6000611281338484613370565b6005546001600160a01b031633146125485760405162461bcd60e51b81526004016110b2906146ef565b6001600160a01b03919091166000908152602b60205260409020805460ff1916911515919091179055565b600d5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283929091169063fbcbc0f1906024015b60c060405180830381865afa1580156125cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ef9190614843565b949c939b5091995097509550909350915050565b6005546001600160a01b0316331461262d5760405162461bcd60e51b81526004016110b2906146ef565b61012c81111561268e5760405162461bcd60e51b815260206004820152602660248201527f636f6f6c646f776e2074696d65722063616e6e6f74206578636565642035206d604482015265696e7574657360d01b60648201526084016110b2565b602955565b600d5460405163ba079d4960e01b81526001600160a01b038381166004830152600092169063ba079d4990602401611a3f565b6005546001600160a01b031633146126f05760405162461bcd60e51b81526004016110b2906146ef565b6001600160a01b0381811660008181526024602081815260408084208054600160ff199182168117909255601f9093529381902080549092169093179055600d54915163031e79db60e41b815260048101939093529216916331e79db09101600060405180830381600087803b15801561276957600080fd5b505af115801561277d573d6000803e3d6000fd5b50506040516001600160a01b03841681527f85d097e432d8e396fa72c83ebd34196326e1cf1694ef910cd53554b2ee7597c592506020019050611f9d565b6005546001600160a01b031633146127e55760405162461bcd60e51b81526004016110b2906146ef565b601d5481151560ff9091161515036127fc57600080fd5b601d805460ff19168215159081179091556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef90602001611f9d565b6005546001600160a01b031633146128675760405162461bcd60e51b81526004016110b2906146ef565b602a5460ff161561287757600080fd5b602a805460ff19166001179055565b6005546001600160a01b031633146128b05760405162461bcd60e51b81526004016110b2906146ef565b600d5460405163d8032ed360e01b81526001600160a01b0383811660048301529091169063d8032ed390602401600060405180830381600087803b1580156128f757600080fd5b505af115801561290b573d6000803e3d6000fd5b50506040516001600160a01b03841681527f7597aa09105646b4cc4486748aecd1d7c5dbcbb7bbe2863c3fc27e613b64432d92506020019050611f9d565b600d546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611667573d6000803e3d6000fd5b600d54604051635183d6fd60e01b815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd906024016125ae565b6005546001600160a01b031633146129fb5760405162461bcd60e51b81526004016110b2906146ef565b6001600160a01b038116612a605760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016110b2565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314612ae65760405162461bcd60e51b81526004016110b2906146ef565b602a8054610100600160a81b0319166101006001600160a01b0384169081029190911790915515612ba6576001600160a01b038181166000818152602b602090815260408083208054600160ff199182168117909255601f9093529281902080549092169092179055600d54905163031e79db60e41b81526004810192909252909116906331e79db090602401600060405180830381600087803b158015612b8d57600080fd5b505af1158015612ba1573d6000803e3d6000fd5b505050505b436028556008805460ff60b01b1916600160b01b1790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150565b600d54604051632c8be28160e21b815233600482015282151560248201526001600160a01b039091169063b22f8a04906044016116e3565b6005546001600160a01b03163314612c4b5760405162461bcd60e51b81526004016110b2906146ef565b612c5d81670de0b6b3a764000061473a565b90506103e8600254612c6f9190614896565b811015612cd15760405162461bcd60e51b815260206004820152602a60248201527f6d61782077616c6c65742063616e6e6f742062652073657420746f206c657373604482015269207468616e20302e312560b01b60648201526084016110b2565b601055565b600080612ce383856148b8565b905083811015612d355760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016110b2565b9392505050565b600082600003612d4e57506000611285565b6000612d5a838561473a565b905082612d678583614896565b14612d355760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016110b2565b6000612d3583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613fde565b80600003612e0b5750565b612e148161400c565b6000612e2d600954600a54612cd690919063ffffffff16565b601954909150600190819081906000908190819015612e8e57612e8b601a54601754601954612e5c91906148b8565b612e6691906148b8565b611105601954612e858b611105600a5447612d3c90919063ffffffff16565b90612d3c565b91505b60125415612ed857612ed5601b54601454601254612eac91906148b8565b612eb691906148b8565b611105601254612e858b61110560095447612d3c90919063ffffffff16565b90505b612ee28282612cd6565b92508215612f4257600d546040516001600160a01b03909116908490600081818185875af1925050503d8060008114612f37576040519150601f19603f3d011682016040523d82523d6000602084013e612f3c565b606091505b50909650505b6000612f5b601a54601754612cd690919063ffffffff16565b601b54601454612f6a91612cd6565b612f7491906148b8565b905060008115612f8b57612f884783612dbe565b90505b600081612fa5601454601754612cd690919063ffffffff16565b612faf919061473a565b9050600082612fcb601b54601a54612cd690919063ffffffff16565b612fd5919061473a565b9050811561303557600e546040516001600160a01b03909116908390600081818185875af1925050503d806000811461302a576040519150601f19603f3d011682016040523d82523d6000602084013e61302f565b606091505b50909950505b801561309357600f546040516001600160a01b03909116908290600081818185875af1925050503d8060008114613088576040519150601f19603f3d011682016040523d82523d6000602084013e61308d565b606091505b50909850505b7f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd0876130bf83856148b8565b8c80156130c957508b5b80156130d257508a5b60408051938452602084019290925215159082015260600160405180910390a1505050505050505050505050565b6000612d3583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613e83565b6001600160a01b0383166131a45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016110b2565b6001600160a01b0382166132055760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016110b2565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661328d5760405162461bcd60e51b81526004016110b2906148d0565b6001600160a01b0382166132b35760405162461bcd60e51b81526004016110b290614915565b6132f0816040518060600160405280602681526020016149e1602691396001600160a01b0386166000908152602081905260409020549190613e83565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461331f9082612cd6565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910161325a565b6001600160a01b0383166133965760405162461bcd60e51b81526004016110b2906148d0565b6001600160a01b0382166133bc5760405162461bcd60e51b81526004016110b290614915565b6001600160a01b038316600090815260246020526040812054819081908190819060ff1661343d57600854600160b01b900460ff1661343d5760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c656460448201526064016110b2565b602a5460ff1615801561345f5750602a5461010090046001600160a01b031615155b156134f65761346e8888614166565b158061349257506001600160a01b0388166000908152602b602052604090205460ff165b806134b557506001600160a01b0387166000908152602b602052604090205460ff165b6134f65760405162461bcd60e51b815260206004820152601260248201527121617661696c61626c652074726164696e6760701b60448201526064016110b2565b856000036135145761350a88886000613267565b5050505050505050565b600854600160a01b900460ff1615801561354757506001600160a01b0388166000908152601f602052604090205460ff16155b801561356c57506001600160a01b0387166000908152601f602052604090205460ff16155b15613cb4576001600160a01b03808816600090815260208052604080822054928b16825290205460ff9182169116801580156135a6575081155b156136ec5760006135c76064611105601c548c612d3c90919063ffffffff16565b90506135d38982613100565b98506135e08b3083613267565b6135eb8b8b8b613267565b600d546001600160a01b031663e30443bc8c61360681613f85565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561364c57600080fd5b505af1158015613660573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc90508b61368181613f85565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156136c757600080fd5b505af11580156136db573d6000803e3d6000fd5b505050505050505050505050505050565b801580156137035750600854600160a81b900460ff165b156137ba576001600160a01b038a166000908152602260205260409020544210156137705760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e7320617265207374616b656420616e64206c6f636b65642100000060448201526064016110b2565b6001600160a01b038a16600090815260226020526040902054156137b5576001600160a01b038a16600090815260226020908152604080832083905560219091528120555b6139c1565b811561386357601254601354601454601554601b54602554949b509299509097509550935060ff16156137b5576029543260009081526027602052604090205461380491906148b8565b42101561384c5760405162461bcd60e51b8152602060048201526016602482015275636f6f6c646f776e20706572696f642061637469766560501b60448201526064016110b2565b3260009081526027602052604090204290556139c1565b80156139c157601954601654601754601854601a54602554949b509299509097509550935060ff161561394a5760285461389e9060026148b8565b43116138e15760405162461bcd60e51b8152602060048201526012602482015271796f75207368616c6c206e6f74207061737360701b60448201526064016110b2565b326000908152602660205260409020544390036139375760405162461bcd60e51b8152602060048201526014602482015273546f6f206d616e7920545820696e20626c6f636b60601b60448201526064016110b2565b3260009081526026602052604090204390555b60006139558a611b52565b6010549091506139658a836148b8565b11156139bf5760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b60648201526084016110b2565b505b60006139e2846139d188886148b8565b6139db91906148b8565b8990612cd6565b905060006139ef30611b52565b60115490915081108015908190613a1e57506001600160a01b038d16600090815260208052604090205460ff16155b15613b37576008805460ff60a01b1916600160a01b179055601d5460ff168015613a485750600087115b8015613a5657506000600c54115b15613b08576000613a74600954600a54612cd690919063ffffffff16565b90506000613a9182611105600a5487612d3c90919063ffffffff16565b90506000613aae8361110560095488612d3c90919063ffffffff16565b90506000613acb600c546111058d86612d3c90919063ffffffff16565b90506000613ae8600b546111058e86612d3c90919063ffffffff16565b90506000613af68284612cd6565b9050613b01816141d9565b5050505050505b6000613b1330611b52565b9050613b1e81612e00565b506001600a8190556009556008805460ff60a01b191690555b6000613b4860646111058e87612d3c565b905060008a15613b9b576064613b5e8e8d612d3c565b613b689190614896565b9050613b8a8f600860009054906101000a90046001600160a01b031683613267565b600254613b979082613100565b6002555b613baf613ba882846148b8565b8e90613100565b9c508615613bcc57600954613bc49083612cd6565b600955613bdd565b600a54613bd99083612cd6565b600a555b613be88f3084613267565b601e54600d546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015613c55575060408051601f3d908101601f19168201909252613c5291810190614815565b60015b15613cab5760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b50505050505050505b613cbf888888613267565b600d546001600160a01b031663e30443bc89613cda81613f85565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613d2057600080fd5b505af1158015613d34573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc905088613d5581613f85565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613d9b57600080fd5b505af1158015613daf573d6000803e3d6000fd5b50506006546001600160a01b038b8116911614801592509050613dea57506001600160a01b038816600090815260208052604090205460ff16155b8015613e085750602a546001600160a01b0388811661010090920416145b1561350a57602a54604051633fb6b04560e11b8152600481018890526001600160a01b038a8116602483015261010090920490911690637f6d608a90604401600060405180830381600087803b158015613e6157600080fd5b505af1158015613e75573d6000803e3d6000fd5b505050505050505050505050565b60008184841115613ea75760405162461bcd60e51b81526004016110b29190614347565b506000613eb48486614958565b95945050505050565b6001600160a01b03821660009081526020805260409020805460ff19168215801591909117909155613f4957600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015613f3057600080fd5b505af1158015613f44573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600854600090600160a81b900460ff16613fa757613fa282611b52565b611285565b6001600160a01b0382166000908152602160205260409020546112859060649061110590613fd59083612cd6565b612e8586611b52565b60008183613fff5760405162461bcd60e51b81526004016110b29190614347565b506000613eb48486614896565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061404157614041614793565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561409a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140be91906147c2565b816001815181106140d1576140d1614793565b6001600160a01b0392831660209182029290920101526006546140f79130911684613142565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac9479061413090859060009086903090429060040161496f565b600060405180830381600087803b15801561414a57600080fd5b505af115801561415e573d6000803e3d6000fd5b505050505050565b6001600160a01b038216600090815260208052604081205460ff16801561419b57506006546001600160a01b03838116911614155b156141a857506001611285565b6001600160a01b038216600090815260208052604090205460ff16156141d057506002611285565b50600092915050565b60006141e6826002612dbe565b905060006141f48383613100565b9050476142008361400c565b600061420c4783613100565b90506142188382614260565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b6006546142789030906001600160a01b031684613142565b6006546001600160a01b031663f305d7198230856000806142a16005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015614309573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117119190614815565b60006020828403121561434057600080fd5b5035919050565b600060208083528351808285015260005b8181101561437457858101830151858201604001528201614358565b81811115614386576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461181e57600080fd5b801515811461181e57600080fd5b600080604083850312156143d257600080fd5b82356143dd8161439c565b915060208301356143ed816143b1565b809150509250929050565b6000806040838503121561440b57600080fd5b82356144168161439c565b946020939093013593505050565b6000806040838503121561443757600080fd5b50508035926020909101359150565b60006020828403121561445857600080fd5b8135612d358161439c565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156144a2576144a2614463565b604052919050565b600067ffffffffffffffff8211156144c4576144c4614463565b5060051b60200190565b600082601f8301126144df57600080fd5b813560206144f46144ef836144aa565b614479565b82815260059290921b8401810191818101908684111561451357600080fd5b8286015b8481101561452e5780358352918301918301614517565b509695505050505050565b6000806040838503121561454c57600080fd5b823567ffffffffffffffff8082111561456457600080fd5b818501915085601f83011261457857600080fd5b813560206145886144ef836144aa565b82815260059290921b840181019181810190898411156145a757600080fd5b948201945b838610156145ce5785356145bf8161439c565b825294820194908201906145ac565b965050860135925050808211156145e457600080fd5b506145f1858286016144ce565b9150509250929050565b60008060006060848603121561461057600080fd5b833561461b8161439c565b9250602084013561462b8161439c565b929592945050506040919091013590565b60006020828403121561464e57600080fd5b8135612d35816143b1565b6000806000806000806000806000806101408b8d03121561467957600080fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b600080604083850312156146d457600080fd5b82356146df8161439c565b915060208301356143ed8161439c565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561475457614754614724565b500290565b600181811c9082168061476d57607f821691505b60208210810361478d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000600182016147bb576147bb614724565b5060010190565b6000602082840312156147d457600080fd5b8151612d358161439c565b6000602082840312156147f157600080fd5b5051919050565b60006020828403121561480a57600080fd5b8151612d35816143b1565b60008060006060848603121561482a57600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c0878903121561485c57600080fd5b86516148678161439c565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b6000826148b357634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156148cb576148cb614724565b500190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60008282101561496a5761496a614724565b500390565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156149bf5784516001600160a01b03168352938301939183019160010161499a565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208e8f5581c7d6d73eb1065be95bad01bf6966d650416959d123f319d9019f373c64736f6c634300080f003360806040526012805460ff60b01b191690553480156200001e57600080fd5b50604051620030e1380380620030e1833981016040819052620000419162000241565b8181818160036200005383826200037b565b5060046200006282826200037b565b50505050506000620000796200015760201b60201c565b600980546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506013620000d583826200037b565b506014620000e482826200037b565b505060128054601680546001600160a01b03199081166001600160a01b039889161790915568056bc75e2d6310000060188190556019556015805490911695871695909517909455600160a01b929094166001600160a81b0319909316929092171760ff60a81b19169091555062000447565b3390565b6001600160a01b03811681146200017157600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200019c57600080fd5b81516001600160401b0380821115620001b957620001b962000174565b604051601f8301601f19908116603f01168101908282118183101715620001e457620001e462000174565b816040528381526020925086838588010111156200020157600080fd5b600091505b8382101562000225578582018301518183018401529082019062000206565b83821115620002375760008385830101525b9695505050505050565b600080600080600060a086880312156200025a57600080fd5b855162000267816200015b565b60208701519095506200027a816200015b565b60408701519094506200028d816200015b565b60608701519093506001600160401b0380821115620002ab57600080fd5b620002b989838a016200018a565b93506080880151915080821115620002d057600080fd5b50620002df888289016200018a565b9150509295509295909350565b600181811c908216806200030157607f821691505b6020821081036200032257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200037657600081815260208120601f850160051c81016020861015620003515750805b601f850160051c820191505b8181101562000372578281556001016200035d565b5050505b505050565b81516001600160401b0381111562000397576200039762000174565b620003af81620003a88454620002ec565b8462000328565b602080601f831160018114620003e75760008415620003ce5750858301515b600019600386901b1c1916600185901b17855562000372565b600085815260208120601f198616915b828110156200041857888601518255948401946001909101908401620003f7565b5085821015620004375787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612c8a80620004576000396000f3fe60806040526004361061031e5760003560e01c80636d48467b116101ab578063a457c2d7116100f7578063d8032ed311610095578063e7841ec01161006f578063e7841ec0146109ed578063f2fde38b14610a02578063fbcbc0f114610a22578063ffb2c47914610a4257600080fd5b8063d8032ed314610967578063dd62ed3e14610987578063e30443bc146109cd57600080fd5b8063aafd847a116100d1578063aafd847a146108d1578063b22f8a0414610907578063ba079d4914610927578063bc4c4b371461094757600080fd5b8063a457c2d714610871578063a8b9d24014610891578063a9059cbb146108b157600080fd5b80638bc1d6391161016457806395d89b411161013e57806395d89b41146107fa5780639c3372ea1461080f5780639eec101e1461082f578063a42340691461085057600080fd5b80638bc1d6391461079c5780638da5cb5b146107bc57806391b89fba146107da57600080fd5b80636d48467b146106db57806370a08231146106fb578063715018a61461073157806374c13fda14610746578063854509cd1461076657806385a6b3ae1461078657600080fd5b8063313ce5671161026a5780634e7b827f116102235780635ebf4db9116101fd5780635ebf4db91461065657806365b8dbc0146106765780636a474002146106965780636b69163b146106ab57600080fd5b80634e7b827f146105af5780635183d6fd146105df5780635a84c5eb1461063657600080fd5b8063313ce567146104f257806331e79db01461050e5780633599bb171461052e578063395093511461054e57806340ffdd801461056e578063418089041461058e57600080fd5b806318160ddd116102d757806323b872dd116102b157806323b872dd1461047e57806325cd35981461049e57806327ce0147146104bc5780633009a609146104dc57600080fd5b806318160ddd1461040c5780631d4ff89a14610421578063226cfa3d1461045157600080fd5b806303c833021461033257806306fdde031461033a5780630928847114610365578063095ea7b31461038557806309bbedde146103b55780631694505e146103d457600080fd5b3661032d5761032b610a7d565b005b600080fd5b61032b610a7d565b34801561034657600080fd5b5061034f610b10565b60405161035c91906127bd565b60405180910390f35b34801561037157600080fd5b5061032b61038036600461282a565b610ba2565b34801561039157600080fd5b506103a56103a0366004612847565b610bf6565b604051901515815260200161035c565b3480156103c157600080fd5b50600a545b60405190815260200161035c565b3480156103e057600080fd5b506015546103f4906001600160a01b031681565b6040516001600160a01b03909116815260200161035c565b34801561041857600080fd5b506002546103c6565b34801561042d57600080fd5b506103a561043c36600461282a565b60116020526000908152604090205460ff1681565b34801561045d57600080fd5b506103c661046c36600461282a565b60176020526000908152604090205481565b34801561048a57600080fd5b506103a5610499366004612873565b610c0d565b3480156104aa57600080fd5b506012546001600160a01b03166103f4565b3480156104c857600080fd5b506103c66104d736600461282a565b610c76565b3480156104e857600080fd5b506103c6600e5481565b3480156104fe57600080fd5b506040516012815260200161035c565b34801561051a57600080fd5b5061032b61052936600461282a565b610cd2565b34801561053a57600080fd5b5061032b6105493660046128c2565b610d6c565b34801561055a57600080fd5b506103a5610569366004612847565b610e0d565b34801561057a57600080fd5b5061032b6105893660046128c2565b610e43565b34801561059a57600080fd5b506012546103a590600160a81b900460ff1681565b3480156105bb57600080fd5b506103a56105ca36600461282a565b600f6020526000908152604090205460ff1681565b3480156105eb57600080fd5b506105ff6105fa3660046128df565b610ed9565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c00161035c565b34801561064257600080fd5b5061032b6106513660046128df565b610f39565b34801561066257600080fd5b5061032b6106713660046128df565b610f7b565b34801561068257600080fd5b5061032b61069136600461282a565b610fbd565b3480156106a257600080fd5b5061032b611009565b3480156106b757600080fd5b506103a56106c636600461282a565b60106020526000908152604090205460ff1681565b3480156106e757600080fd5b506103a56106f636600461282a565b6110ab565b34801561070757600080fd5b506103c661071636600461282a565b6001600160a01b031660009081526020819052604090205490565b34801561073d57600080fd5b5061032b6110f7565b34801561075257600080fd5b506012546103f4906001600160a01b031681565b34801561077257600080fd5b506016546103f4906001600160a01b031681565b34801561079257600080fd5b506103c660085481565b3480156107a857600080fd5b5061032b6107b73660046128f8565b61116b565b3480156107c857600080fd5b506009546001600160a01b03166103f4565b3480156107e657600080fd5b506103c66107f536600461282a565b6111c0565b34801561080657600080fd5b5061034f6111cb565b34801561081b57600080fd5b5061032b61082a3660046128c2565b6111da565b34801561083b57600080fd5b506012546103a590600160a01b900460ff1681565b34801561085c57600080fd5b506012546103a590600160b01b900460ff1681565b34801561087d57600080fd5b506103a561088c366004612847565b611270565b34801561089d57600080fd5b506103c66108ac36600461282a565b6112bf565b3480156108bd57600080fd5b506103a56108cc366004612847565b6112eb565b3480156108dd57600080fd5b506103c66108ec36600461282a565b6001600160a01b031660009081526007602052604090205490565b34801561091357600080fd5b5061032b6109223660046128f8565b6112f8565b34801561093357600080fd5b506103a561094236600461282a565b61134d565b34801561095357600080fd5b506103a56109623660046128f8565b611399565b34801561097357600080fd5b5061032b61098236600461282a565b61151a565b34801561099357600080fd5b506103c66109a2366004612931565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156109d957600080fd5b5061032b6109e8366004612847565b611566565b3480156109f957600080fd5b50600e546103c6565b348015610a0e57600080fd5b5061032b610a1d36600461282a565b6115fe565b348015610a2e57600080fd5b506105ff610a3d36600461282a565b6116e9565b348015610a4e57600080fd5b50610a62610a5d3660046128df565b611798565b6040805193845260208401929092529082015260600161035c565b6000610a8860025490565b11610a9257600080fd5b3415610b0e57610ac5610aa460025490565b610ab234600160801b6118be565b610abc9190612975565b60055490611947565b60055560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600854610b0a9034611947565b6008555b565b606060138054610b1f90612997565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4b90612997565b8015610b985780601f10610b6d57610100808354040283529160200191610b98565b820191906000526020600020905b815481529060010190602001808311610b7b57829003601f168201915b5050505050905090565b6009546001600160a01b03163314610bd55760405162461bcd60e51b8152600401610bcc906129d1565b60405180910390fd5b6001600160a01b03166000908152600f60205260409020805460ff19169055565b6000610c033384846119a6565b5060015b92915050565b6000610c1a848484611aca565b610c6c8433610c6785604051806060016040528060288152602001612c08602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611b2b565b6119a6565b5060019392505050565b6001600160a01b03811660009081526006602090815260408083205491839052822054600554600160801b92610cc892610cc392610cbd91610cb891906118be565b611b65565b90611b75565b611bb3565b610c079190612975565b6009546001600160a01b03163314610cfc5760405162461bcd60e51b8152600401610bcc906129d1565b6001600160a01b0381166000908152600f60205260408120805460ff19166001179055610d2a908290611bc6565b610d35600a82611c25565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b6009546001600160a01b03163314610d965760405162461bcd60e51b8152600401610bcc906129d1565b801515601260169054906101000a900460ff16151503610db557600080fd5b60128054821515600160b01b0260ff60b01b199091161790556040517f3da2593f2c4724acfbd754045321e852cad26f3974834b1890045530f89c21b390610e0290831515815260200190565b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c03918590610c679086611947565b6009546001600160a01b03163314610e6d5760405162461bcd60e51b8152600401610bcc906129d1565b801515601260159054906101000a900460ff16151503610e8c57600080fd5b60128054821515600160a81b0260ff60a81b199091161790556040517fc138a28750b971696f46ea59731c471ef1e08e4015404afdb139fd2e87dca1bb90610e0290831515815260200190565b600080600080600080610eeb600a5490565b8710610f0a575060009450600019935083925084915081905080610f30565b6000610f17600a89611d60565b9050610f22816116e9565b965096509650965096509650505b91939550919395565b6009546001600160a01b03163314610f635760405162461bcd60e51b8152600401610bcc906129d1565b610f7581670de0b6b3a7640000612a06565b60185550565b6009546001600160a01b03163314610fa55760405162461bcd60e51b8152600401610bcc906129d1565b610fb781670de0b6b3a7640000612a06565b60195550565b6009546001600160a01b03163314610fe75760405162461bcd60e51b8152600401610bcc906129d1565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b60405162461bcd60e51b815260206004820152606560248201527f4a4554485f4469766964656e645f547261636b65723a2077697468647261774460448201527f69766964656e642064697361626c65642e20557365207468652027636c61696d60648201527f272066756e6374696f6e206f6e20746865206d61696e204a45544820636f6e746084820152643930b1ba1760d91b60a482015260c401610bcc565b6009546000906001600160a01b031633146110d85760405162461bcd60e51b8152600401610bcc906129d1565b506001600160a01b031660009081526010602052604090205460ff1690565b6009546001600160a01b031633146111215760405162461bcd60e51b8152600401610bcc906129d1565b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b6009546001600160a01b031633146111955760405162461bcd60e51b8152600401610bcc906129d1565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6000610c07826112bf565b606060148054610b1f90612997565b6009546001600160a01b031633146112045760405162461bcd60e51b8152600401610bcc906129d1565b801515601260149054906101000a900460ff1615150361122357600080fd5b60128054821515600160a01b0260ff60a01b199091161790556040517f8d34c313963017194ed726d050e868657d0e2d2c6748d13e358cd4b89d4ee7c890610e0290831515815260200190565b6000610c033384610c6785604051806060016040528060258152602001612c30602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611b2b565b6001600160a01b038116600090815260076020526040812054610c07906112e584610c76565b90611d93565b6000610c03338484611aca565b6009546001600160a01b031633146113225760405162461bcd60e51b8152600401610bcc906129d1565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6009546000906001600160a01b0316331461137a5760405162461bcd60e51b8152600401610bcc906129d1565b506001600160a01b031660009081526011602052604090205460ff1690565b6009546000906001600160a01b031633146113c65760405162461bcd60e51b8152600401610bcc906129d1565b601254600160b01b900460ff16156113e057506000610c07565b6001600160a01b03831660009081526011602052604090205460ff168280156114065750805b801561141c5750601254600160a81b900460ff16155b1561142b576000915050610c07565b6000816114405761143b85611dd5565b611449565b6114498561208e565b9050801561150f576001600160a01b038516600090815260176020526040902042905581156114bd57831515856001600160a01b03167ffbd928dd3806a2bdf802f3a28a2cc55205f95dbcd2c3ed313abfca278366f80c836040516114b091815260200190565b60405180910390a3611504565b831515856001600160a01b03167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092836040516114fb91815260200190565b60405180910390a35b600192505050610c07565b506000949350505050565b6009546001600160a01b031633146115445760405162461bcd60e51b8152600401610bcc906129d1565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b031633146115905760405162461bcd60e51b8152600401610bcc906129d1565b6001600160a01b0382166000908152600f602052604090205460ff166115d0576019548110156115d4576115c5600a83611c25565b6115d0826000611bc6565b5050565b6115de8282611bc6565b60185481106115f3576115d0600a8383612401565b6115d0600a83611c25565b6009546001600160a01b031633146116285760405162461bcd60e51b8152600401610bcc906129d1565b6001600160a01b03811661168d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bcc565b6009546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b806000808080806116fb600a876124aa565b945060001993506000851261175d57600e5485111561172957600e546117229086906124f5565b935061175d565b600e54600a546000911061173e57600061174d565b600e54600a5461174d91611d93565b90506117598682611b75565b9450505b611766866112bf565b925061177186610c76565b6001600160a01b038716600090815260176020526040902054969895975093959294915050565b600a54600090819081908015806117b85750601254600160b01b900460ff165b156117ce575050600e54600092508291506118b7565b600e546000805a90506000805b89841080156117e957508582105b156118a657846117f881612a25565b95505085851061180757600094505b6000600a600001868154811061181f5761181f612a3e565b60009182526020808320909101546001600160a01b0316808352601090915260409091205490915060ff1661186c57611859816001611399565b1561186c578161186881612a25565b9250505b8261187681612a25565b93505060005a90508085111561189d5761189a6118938683611d93565b8790611947565b95505b93506117db9050565b600e85905590975095509193505050505b9193909250565b6000826000036118d057506000610c07565b60006118dc8385612a06565b9050826118e98583612975565b146119405760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610bcc565b9392505050565b6000806119548385612a54565b9050838110156119405760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610bcc565b6001600160a01b038316611a085760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610bcc565b6001600160a01b038216611a695760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610bcc565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602b60248201527f4a4554485f4469766964656e645f547261636b65723a204e6f207472616e736660448201526a195c9cc8185b1b1bddd95960aa1b6064820152608401610bcc565b505050565b60008184841115611b4f5760405162461bcd60e51b8152600401610bcc91906127bd565b506000611b5c8486612a6c565b95945050505050565b60008181811215610c0757600080fd5b600080611b828385612a83565b905060008312158015611b955750838112155b80611baa5750600083128015611baa57508381125b61194057600080fd5b600080821215611bc257600080fd5b5090565b6001600160a01b03821660009081526020819052604090205480821115611c05576000611bf38383611d93565b9050611bff8482612532565b50505050565b80821015611b26576000611c198284611d93565b9050611bff8482612596565b6001600160a01b038116600090815260038301602052604090205460ff16611c4b575050565b6001600160a01b03811660009081526003830160209081526040808320805460ff1916905560018086018352818420849055600286019092528220548454909291611c9591612a6c565b90506000846000018281548110611cae57611cae612a3e565b60009182526020808320909101546001600160a01b03908116808452600289019092526040808420879055908716835282209190915585549091508190869085908110611cfd57611cfd612a3e565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790558454859080611d3757611d37612ac4565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b6000826000018281548110611d7757611d77612a3e565b6000918252602090912001546001600160a01b03169392505050565b600061194083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b2b565b600080611de1836112bf565b90508015612085576001600160a01b038316600090815260076020526040902054611e0c9082611947565b6001600160a01b03808516600090815260076020526040812092909255601254169081611e91576040516001600160a01b03861690610bb89085906000818181858888f193505050503d8060008114611e81576040519150601f19603f3d011682016040523d82523d6000602084013e611e86565b606091505b505080915050611feb565b6040805160028082526060820183526000926020830190803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611efb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1f9190612ada565b81600081518110611f3257611f32612a3e565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611f6657611f66612a3e565b6001600160a01b03928316602091820292909201015260155460405163b6f9de9560e01b815291169063b6f9de95908690611fac9060009086908c904290600401612b3b565b6000604051808303818588803b158015611fc557600080fd5b505af193505050508015611fd7575060015b611fe45760009150611fe9565b600191505b505b80612039576001600160a01b0385166000908152600760205260409020546120139084611d93565b6001600160a01b0390951660009081526007602052604081209590955550929392505050565b846001600160a01b03167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d8460405161207491815260200190565b60405180910390a250909392505050565b50600092915050565b60008061209a836112bf565b90508015612085576001600160a01b0383166000908152600760205260408120546120c59083611947565b6001600160a01b03851660009081526007602052604080822092909255815160028082526060820190935290918160200160208202803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa15801561214d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121719190612ada565b8160008151811061218457612184612a3e565b6001600160a01b0392831660209182029290920101526016548251911690829060019081106121b5576121b5612a3e565b6001600160a01b0392831660209182029290920101526016546040516370a0823160e01b815230600482015260009291909116906370a0823190602401602060405180830381865afa15801561220f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122339190612b70565b60155460405163b6f9de9560e01b81529192506001600160a01b03169063b6f9de9590869061226d90600090879030904290600401612b3b565b6000604051808303818588803b15801561228657600080fd5b505af193505050508015612298575060015b6122a557600092506123a8565b6016546040516370a0823160e01b81523060048201526000916123189184916001600160a01b0316906370a0823190602401602060405180830381865afa1580156122f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e59190612b70565b905080156123a15760165460405163a9059cbb60e01b81526001600160a01b03898116600483015260248201849052600196509091169063a9059cbb906044016020604051808303816000875af1158015612377573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061239b9190612b89565b506123a6565b600093505b505b826123f7576001600160a01b0386166000908152600760205260409020546123d09085611d93565b6001600160a01b039096166000908152600760205260408120969096555093949350505050565b5091949350505050565b6001600160a01b038216600090815260038401602052604090205460ff1615612446576001600160a01b03821660009081526001840160205260409020819055505050565b6001600160a01b03821660008181526003850160209081526040808320805460ff19166001908117909155878101835281842086905587546002890184529184208290558101875586835291200180546001600160a01b0319169091179055505050565b6001600160a01b038116600090815260038301602052604081205460ff166124d55750600019610c07565b506001600160a01b03166000908152600291909101602052604090205490565b6000806125028385612ba6565b9050600083121580156125155750838113155b80611baa5750600083128015611baa575083811361194057600080fd5b61253c82826125da565b612576612557610cb8836005546118be90919063ffffffff16565b6001600160a01b038416600090815260066020526040902054906124f5565b6001600160a01b0390921660009081526006602052604090209190915550565b6125a082826126b9565b6125766125bb610cb8836005546118be90919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611b75565b6001600160a01b0382166126305760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610bcc565b60025461263d9082611947565b6002556001600160a01b0382166000908152602081905260409020546126639082611947565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b0382166127195760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610bcc565b61275681604051806060016040528060228152602001612be6602291396001600160a01b0385166000908152602081905260409020549190611b2b565b6001600160a01b03831660009081526020819052604090205560025461277c9082611d93565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016126ad565b600060208083528351808285015260005b818110156127ea578581018301518582016040015282016127ce565b818111156127fc576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461282757600080fd5b50565b60006020828403121561283c57600080fd5b813561194081612812565b6000806040838503121561285a57600080fd5b823561286581612812565b946020939093013593505050565b60008060006060848603121561288857600080fd5b833561289381612812565b925060208401356128a381612812565b929592945050506040919091013590565b801515811461282757600080fd5b6000602082840312156128d457600080fd5b8135611940816128b4565b6000602082840312156128f157600080fd5b5035919050565b6000806040838503121561290b57600080fd5b823561291681612812565b91506020830135612926816128b4565b809150509250929050565b6000806040838503121561294457600080fd5b823561294f81612812565b9150602083013561292681612812565b634e487b7160e01b600052601160045260246000fd5b60008261299257634e487b7160e01b600052601260045260246000fd5b500490565b600181811c908216806129ab57607f821691505b6020821081036129cb57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000816000190483118215151615612a2057612a2061295f565b500290565b600060018201612a3757612a3761295f565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60008219821115612a6757612a6761295f565b500190565b600082821015612a7e57612a7e61295f565b500390565b600080821280156001600160ff1b0384900385131615612aa557612aa561295f565b600160ff1b8390038412811615612abe57612abe61295f565b50500190565b634e487b7160e01b600052603160045260246000fd5b600060208284031215612aec57600080fd5b815161194081612812565b600081518084526020808501945080840160005b83811015612b305781516001600160a01b031687529582019590820190600101612b0b565b509495945050505050565b848152608060208201526000612b546080830186612af7565b6001600160a01b03949094166040830152506060015292915050565b600060208284031215612b8257600080fd5b5051919050565b600060208284031215612b9b57600080fd5b8151611940816128b4565b60008083128015600160ff1b850184121615612bc457612bc461295f565b6001600160ff1b0384018313811615612bdf57612bdf61295f565b5050039056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212204f5f1dba7ebec6ee24b08d7152d48e3d1643a7eb6f8370e7a437125c6f8ddd4c64736f6c634300080f0033

Deployed Bytecode

0x6080604052600436106104fb5760003560e01c80637fdde05c1161028c578063acb2ad6f1161015a578063dd62ed3e116100cc578063f2fde38b11610085578063f2fde38b14610fdc578063f39409e914610ffc578063f5d3c79a1461101c578063f63743421461103c578063f8b45b0514611052578063fc6b151c1461106857600080fd5b8063dd62ed3e14610f08578063e2f4560514610f4e578063e7841ec014610f64578063f11a24d314610f79578063f1c0ddff14610f8f578063f27fd25414610fbc57600080fd5b8063ba079d491161011e578063ba079d4914610e5d578063bb8d513114610e7d578063d07a091c14610e93578063d5e3725114610eb3578063d7b837dd14610ed3578063d8032ed314610ee857600080fd5b8063acb2ad6f14610d8b578063ad56c13c14610da1578063b494298814610df8578063b62496f514610e0e578063b74e3b1114610e3d57600080fd5b80639c1b8af5116101fe578063a457c2d7116101b7578063a457c2d714610c93578063a694fc3a14610cb3578063a8b9d24014610cd3578063a9059cbb14610cf3578063a9885de514610d13578063aa4704f314610d3357600080fd5b80639c1b8af514610bf15780639c3372ea14610c075780639c3b4fdc14610c275780639cefc1da14610c3d5780639ec1037e14610c5d578063a0d82dc514610c7d57600080fd5b80638ca2923a116102505780638ca2923a14610b525780638da5cb5b14610b685780638ea5220f14610b8657806395451c2914610ba657806395d89b4114610bbc5780639a7a23d614610bd157600080fd5b80637fdde05c14610ab2578063837ae2d014610ad25780638577a6d514610af2578063868730c714610b12578063871c128d14610b3257600080fd5b80634a62bb65116103c9578063679ca6e91161033b57806372d8edf4116102f457806372d8edf4146109f557806375829def14610a1557806375f0a87414610a3557806377a3b60914610a555780637928dd1d14610a6b5780637d32f34214610a8557600080fd5b8063679ca6e9146109405780636843cd84146109605780636d48467b14610980578063700bb191146109a057806370a08231146109c0578063715018a6146109e057600080fd5b80635124f8741161038d5780635124f8741461089f5780635a84c5eb146108b55780635c234bb6146108d55780635ebf4db9146108eb5780635eee4bae1461090b57806364b0f6531461092b57600080fd5b80634a62bb65146107fc5780634a74bb02146108165780634ada218b146108305780634e71d92d146108515780634fbee1931461086657600080fd5b80632307b4411161046d5780633599bb17116104265780633599bb171461073957806339509351146107595780633f407b841461077957806340ffdd801461078f578063435c89e4146107af57806349bd5a5e146107dc57600080fd5b80632307b4411461069357806323b872dd146106b357806325cd3598146106d35780632c1f5216146106e857806330bb4cff14610708578063313ce5671461071d57600080fd5b80630ef35b7e116104bf5780630ef35b7e146105d85780631694505e146105f857806318160ddd146106185780631d7b1fb4146106375780631fa705311461064d57806321cbb0241461066357600080fd5b806303fd2a451461050757806305ca5f081461054457806306fdde031461056657806308dfe8a514610588578063095ea7b3146105a857600080fd5b3661050257005b600080fd5b34801561051357600080fd5b50600854610527906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561055057600080fd5b5061056461055f36600461432e565b611088565b005b34801561057257600080fd5b5061057b611159565b60405161053b9190614347565b34801561059457600080fd5b506105646105a33660046143bf565b6111eb565b3480156105b457600080fd5b506105c86105c33660046143f8565b611274565b604051901515815260200161053b565b3480156105e457600080fd5b506105646105f3366004614424565b61128b565b34801561060457600080fd5b50600654610527906001600160a01b031681565b34801561062457600080fd5b506002545b60405190815260200161053b565b34801561064357600080fd5b5061062960295481565b34801561065957600080fd5b50610629600a5481565b34801561066f57600080fd5b506105c861067e366004614446565b602b6020526000908152604090205460ff1681565b34801561069f57600080fd5b506105646106ae366004614539565b611370565b3480156106bf57600080fd5b506105c86106ce3660046145fb565b611541565b3480156106df57600080fd5b506105276115aa565b3480156106f457600080fd5b50600d54610527906001600160a01b031681565b34801561071457600080fd5b5061062961161d565b34801561072957600080fd5b506040516012815260200161053b565b34801561074557600080fd5b5061056461075436600461463c565b61168b565b34801561076557600080fd5b506105c86107743660046143f8565b611718565b34801561078557600080fd5b5061062960095481565b34801561079b57600080fd5b506105646107aa36600461463c565b61174e565b3480156107bb57600080fd5b506106296107ca36600461432e565b60236020526000908152604090205481565b3480156107e857600080fd5b50600754610527906001600160a01b031681565b34801561080857600080fd5b506025546105c89060ff1681565b34801561082257600080fd5b50601d546105c89060ff1681565b34801561083c57600080fd5b506008546105c890600160b01b900460ff1681565b34801561085d57600080fd5b506105646117a9565b34801561087257600080fd5b506105c8610881366004614446565b6001600160a01b03166000908152601f602052604090205460ff1690565b3480156108ab57600080fd5b5061062960175481565b3480156108c157600080fd5b506105646108d036600461432e565b611821565b3480156108e157600080fd5b5061062960165481565b3480156108f757600080fd5b5061056461090636600461432e565b61187c565b34801561091757600080fd5b5061056461092636600461432e565b6118d7565b34801561093757600080fd5b50610629611919565b34801561094c57600080fd5b5061056461095b36600461463c565b611963565b34801561096c57600080fd5b5061062961097b366004614446565b6119a0565b34801561098c57600080fd5b506105c861099b366004614446565b611a10565b3480156109ac57600080fd5b506105646109bb36600461432e565b611a80565b3480156109cc57600080fd5b506106296109db366004614446565b611b52565b3480156109ec57600080fd5b50610564611b6d565b348015610a0157600080fd5b50610564610a10366004614446565b611be1565b348015610a2157600080fd5b50610564610a30366004614446565b611c3d565b348015610a4157600080fd5b50600e54610527906001600160a01b031681565b348015610a6157600080fd5b5061062960195481565b348015610a7757600080fd5b50602a546105c89060ff1681565b348015610a9157600080fd5b50610629610aa0366004614446565b60226020526000908152604090205481565b348015610abe57600080fd5b50610564610acd3660046143bf565b611cf2565b348015610ade57600080fd5b50610564610aed366004614659565b611d47565b348015610afe57600080fd5b50610564610b0d36600461432e565b611ef1565b348015610b1e57600080fd5b50610564610b2d36600461463c565b611fa8565b348015610b3e57600080fd5b50610564610b4d36600461432e565b611fe0565b348015610b5e57600080fd5b5061062960135481565b348015610b7457600080fd5b506005546001600160a01b0316610527565b348015610b9257600080fd5b50600f54610527906001600160a01b031681565b348015610bb257600080fd5b5061062960145481565b348015610bc857600080fd5b5061057b61205c565b348015610bdd57600080fd5b50610564610bec3660046143bf565b61206b565b348015610bfd57600080fd5b50610629601e5481565b348015610c1357600080fd5b50610564610c2236600461463c565b6120a3565b348015610c3357600080fd5b50610629601a5481565b348015610c4957600080fd5b50610564610c5836600461463c565b6120ff565b348015610c6957600080fd5b50610564610c78366004614446565b612195565b348015610c8957600080fd5b50610629601b5481565b348015610c9f57600080fd5b506105c8610cae3660046143f8565b61226c565b348015610cbf57600080fd5b50610564610cce36600461432e565b6122bb565b348015610cdf57600080fd5b50610629610cee366004614446565b6124de565b348015610cff57600080fd5b506105c8610d0e3660046143f8565b612511565b348015610d1f57600080fd5b50610564610d2e3660046143bf565b61251e565b348015610d3f57600080fd5b50610d76610d4e366004614446565b6001600160a01b03166000908152602260209081526040808320546021909252909120549091565b6040805192835260208301919091520161053b565b348015610d9757600080fd5b50610629601c5481565b348015610dad57600080fd5b50610dc1610dbc366004614446565b612573565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c00161053b565b348015610e0457600080fd5b5061062960285481565b348015610e1a57600080fd5b506105c8610e29366004614446565b602080526000908152604090205460ff1681565b348015610e4957600080fd5b50610564610e5836600461432e565b612603565b348015610e6957600080fd5b506105c8610e78366004614446565b612693565b348015610e8957600080fd5b5061062960125481565b348015610e9f57600080fd5b50610564610eae366004614446565b6126c6565b348015610ebf57600080fd5b50610564610ece36600461463c565b6127bb565b348015610edf57600080fd5b5061056461283d565b348015610ef457600080fd5b50610564610f03366004614446565b612886565b348015610f1457600080fd5b50610629610f233660046146c1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610f5a57600080fd5b5061062960115481565b348015610f7057600080fd5b50610629612949565b348015610f8557600080fd5b5061062960185481565b348015610f9b57600080fd5b50610629610faa366004614446565b60216020526000908152604090205481565b348015610fc857600080fd5b50610dc1610fd736600461432e565b612993565b348015610fe857600080fd5b50610564610ff7366004614446565b6129d1565b34801561100857600080fd5b50610564611017366004614446565b612abc565b34801561102857600080fd5b5061056461103736600461463c565b612be9565b34801561104857600080fd5b5061062960155481565b34801561105e57600080fd5b5061062960105481565b34801561107457600080fd5b5061056461108336600461432e565b612c21565b6005546001600160a01b031633146110bb5760405162461bcd60e51b81526004016110b2906146ef565b60405180910390fd5b6110cd81670de0b6b3a764000061473a565b905060006110e8600954600a54612cd690919063ffffffff16565b9050600061110b82611105600a5486612d3c90919063ffffffff16565b90612dbe565b905060006111288361110560095487612d3c90919063ffffffff16565b905061113384612e00565b600a546111409083613100565b600a556009546111509082613100565b60095550505050565b60606003805461116890614759565b80601f016020809104026020016040519081016040528092919081815260200182805461119490614759565b80156111e15780601f106111b6576101008083540402835291602001916111e1565b820191906000526020600020905b8154815290600101906020018083116111c457829003601f168201915b5050505050905090565b6005546001600160a01b031633146112155760405162461bcd60e51b81526004016110b2906146ef565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6000611281338484613142565b5060015b92915050565b6005546001600160a01b031633146112b55760405162461bcd60e51b81526004016110b2906146ef565b6000828152602360205260409020548190036112d057600080fd5b60648111156113215760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e6720626f6e75732063616e27742065786365656420313030000060448201526064016110b2565b60008281526023602090815260409182902083905581518481529081018390527f065c0eec5c5d031ee25323575d53db5536226ab058b74d8bdb03c517dd4f605d910160405180910390a15050565b6005546001600160a01b0316331461139a5760405162461bcd60e51b81526004016110b2906146ef565b80518251146113eb5760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e677468000060448201526064016110b2565b60c8825111156114485760405162461bcd60e51b815260206004820152602260248201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d2032604482015261030360f41b60648201526084016110b2565b60005b825181101561153c57600083828151811061146857611468614793565b60200260200101519050600083838151811061148657611486614793565b6020026020010151670de0b6b3a76400006114a1919061473a565b90506114ae338383613267565b600d546001600160a01b031663e30443bc836114c981611b52565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561150f57600080fd5b505af1158015611523573d6000803e3d6000fd5b5050505050508080611534906147a9565b91505061144b565b505050565b600061154e848484613370565b6115a0843361159b85604051806060016040528060288152602001614a07602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190613e83565b613142565b5060019392505050565b600d54604080516304b9a6b360e31b815290516000926001600160a01b0316916325cd35989160048083019260209291908290030181865afa1580156115f4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161891906147c2565b905090565b600d54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611667573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161891906147df565b6005546001600160a01b031633146116b55760405162461bcd60e51b81526004016110b2906146ef565b600d54604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b1580156116fd57600080fd5b505af1158015611711573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161128191859061159b9086612cd6565b6005546001600160a01b031633146117785760405162461bcd60e51b81526004016110b2906146ef565b600d546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd80906024016116e3565b600d5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af11580156117fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181e91906147f8565b50565b6005546001600160a01b0316331461184b5760405162461bcd60e51b81526004016110b2906146ef565b600d54604051635a84c5eb60e01b8152600481018390526001600160a01b0390911690635a84c5eb906024016116e3565b6005546001600160a01b031633146118a65760405162461bcd60e51b81526004016110b2906146ef565b600d54604051635ebf4db960e01b8152600481018390526001600160a01b0390911690635ebf4db9906024016116e3565b6005546001600160a01b031633146119015760405162461bcd60e51b81526004016110b2906146ef565b61191381670de0b6b3a764000061473a565b60115550565b600d54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611667573d6000803e3d6000fd5b6005546001600160a01b0316331461198d5760405162461bcd60e51b81526004016110b2906146ef565b6025805460ff1916911515919091179055565b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa1580156119ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128591906147df565b600d54604051636d48467b60e01b81526001600160a01b0383811660048301526000921690636d48467b906024015b602060405180830381865afa158015611a5c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128591906147f8565b600d546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611ad3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af79190614815565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314611b975760405162461bcd60e51b81526004016110b2906146ef565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314611c0b5760405162461bcd60e51b81526004016110b2906146ef565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024016116e3565b6005546001600160a01b03163314611c675760405162461bcd60e51b81526004016110b2906146ef565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015611cae57600080fd5b505af1158015611cc2573d6000803e3d6000fd5b5050506001600160a01b0382166000908152601f60205260409020805460ff191660011790555061181e816129d1565b6005546001600160a01b03163314611d1c5760405162461bcd60e51b81526004016110b2906146ef565b6001600160a01b03919091166000908152602460205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611d715760405162461bcd60e51b81526004016110b2906146ef565b60168a90556017889055601886905560198490556013899055601487905560158590556012839055601a829055601b819055611db981611db38981878a612cd6565b90612cd6565b600b81905550611de2601a54611db3601754611db3601854601954612cd690919063ffffffff16565b600c55600b54600f10801590611dfb5750600f600c5411155b611e585760405162461bcd60e51b815260206004820152602860248201527f746f74616c20666565732063616e6e6f7420657863656564203135252073656c6044820152676c206f722062757960c01b60648201526084016110b2565b601354601454601554601254601654601754601854601954601a54601b54604080519a8b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c085015260e08401526101008301526101208201527f07cec4532bdb36ce729ae72905c09f7bfbf8682c2cc2f1999f745188d9975122906101400160405180910390a150505050505050505050565b6005546001600160a01b03163314611f1b5760405162461bcd60e51b81526004016110b2906146ef565b6005811115611f6c5760405162461bcd60e51b815260206004820152601d60248201527f7472616e73666572206665652063616e6e6f742065786365656420352500000060448201526064016110b2565b601c8190556040518181527f6fbeac6c79c640ca4f5f47271bd7a36c7eb83076224c65a3b3378c8844720343906020015b60405180910390a150565b600d54604051638bc1d63960e01b815233600482015282151560248201526001600160a01b0390911690638bc1d639906044016116e3565b6005546001600160a01b0316331461200a5760405162461bcd60e51b81526004016110b2906146ef565b62030d4081101580156120205750620f42408111155b61202957600080fd5b601e5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601e55565b60606004805461116890614759565b6005546001600160a01b031633146120955760405162461bcd60e51b81526004016110b2906146ef565b61209f8282613ebd565b5050565b6005546001600160a01b031633146120cd5760405162461bcd60e51b81526004016110b2906146ef565b600d54604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea906024016116e3565b6005546001600160a01b031633146121295760405162461bcd60e51b81526004016110b2906146ef565b801515600860159054906101000a900460ff1615150361214857600080fd5b60088054821515600160a81b0260ff60a81b199091161790556040517f0d240c24014ec8c204fc1bdcc286f7d01fd2ab6a07c558a9b2d3f12904323a8790611f9d90831515815260200190565b6005546001600160a01b031633146121bf5760405162461bcd60e51b81526004016110b2906146ef565b600d54604051630928847160e01b81526001600160a01b03838116600483015290911690630928847190602401600060405180830381600087803b15801561220657600080fd5b505af115801561221a573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc90508261223b81613f85565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016116e3565b6000611281338461159b85604051806060016040528060258152602001614a2f602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190613e83565b600854600160a81b900460ff1661230d5760405162461bcd60e51b815260206004820152601660248201527514dd185ada5b99c81a5cc81b9bdd08195b98589b195960521b60448201526064016110b2565b600081815260236020526040812054900361236a5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207374616b696e67206475726174696f6e000000000000000060448201526064016110b2565b6123744282612cd6565b33600090815260226020526040902054106123dd5760405162461bcd60e51b8152602060048201526024808201527f616c7265616479207374616b656420666f722061206c6f6e67657220647572616044820152633a34b7b760e11b60648201526084016110b2565b6000818152602360209081526040808320543384526021909252909120556124054282612cd6565b33600081815260226020526040902091909155600d546001600160a01b03169063e30443bc9061243481613f85565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561247a57600080fd5b505af115801561248e573d6000803e3d6000fd5b505050506124993390565b6001600160a01b03167f13dd201d7da4f9b31a9064a09abc1a6ce420dacd837a77abafaec5bd9d28d2c8826040516124d391815260200190565b60405180910390a250565b600d546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d240906024016119cf565b6000611281338484613370565b6005546001600160a01b031633146125485760405162461bcd60e51b81526004016110b2906146ef565b6001600160a01b03919091166000908152602b60205260409020805460ff1916911515919091179055565b600d5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283929091169063fbcbc0f1906024015b60c060405180830381865afa1580156125cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ef9190614843565b949c939b5091995097509550909350915050565b6005546001600160a01b0316331461262d5760405162461bcd60e51b81526004016110b2906146ef565b61012c81111561268e5760405162461bcd60e51b815260206004820152602660248201527f636f6f6c646f776e2074696d65722063616e6e6f74206578636565642035206d604482015265696e7574657360d01b60648201526084016110b2565b602955565b600d5460405163ba079d4960e01b81526001600160a01b038381166004830152600092169063ba079d4990602401611a3f565b6005546001600160a01b031633146126f05760405162461bcd60e51b81526004016110b2906146ef565b6001600160a01b0381811660008181526024602081815260408084208054600160ff199182168117909255601f9093529381902080549092169093179055600d54915163031e79db60e41b815260048101939093529216916331e79db09101600060405180830381600087803b15801561276957600080fd5b505af115801561277d573d6000803e3d6000fd5b50506040516001600160a01b03841681527f85d097e432d8e396fa72c83ebd34196326e1cf1694ef910cd53554b2ee7597c592506020019050611f9d565b6005546001600160a01b031633146127e55760405162461bcd60e51b81526004016110b2906146ef565b601d5481151560ff9091161515036127fc57600080fd5b601d805460ff19168215159081179091556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef90602001611f9d565b6005546001600160a01b031633146128675760405162461bcd60e51b81526004016110b2906146ef565b602a5460ff161561287757600080fd5b602a805460ff19166001179055565b6005546001600160a01b031633146128b05760405162461bcd60e51b81526004016110b2906146ef565b600d5460405163d8032ed360e01b81526001600160a01b0383811660048301529091169063d8032ed390602401600060405180830381600087803b1580156128f757600080fd5b505af115801561290b573d6000803e3d6000fd5b50506040516001600160a01b03841681527f7597aa09105646b4cc4486748aecd1d7c5dbcbb7bbe2863c3fc27e613b64432d92506020019050611f9d565b600d546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611667573d6000803e3d6000fd5b600d54604051635183d6fd60e01b815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd906024016125ae565b6005546001600160a01b031633146129fb5760405162461bcd60e51b81526004016110b2906146ef565b6001600160a01b038116612a605760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016110b2565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314612ae65760405162461bcd60e51b81526004016110b2906146ef565b602a8054610100600160a81b0319166101006001600160a01b0384169081029190911790915515612ba6576001600160a01b038181166000818152602b602090815260408083208054600160ff199182168117909255601f9093529281902080549092169092179055600d54905163031e79db60e41b81526004810192909252909116906331e79db090602401600060405180830381600087803b158015612b8d57600080fd5b505af1158015612ba1573d6000803e3d6000fd5b505050505b436028556008805460ff60b01b1916600160b01b1790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150565b600d54604051632c8be28160e21b815233600482015282151560248201526001600160a01b039091169063b22f8a04906044016116e3565b6005546001600160a01b03163314612c4b5760405162461bcd60e51b81526004016110b2906146ef565b612c5d81670de0b6b3a764000061473a565b90506103e8600254612c6f9190614896565b811015612cd15760405162461bcd60e51b815260206004820152602a60248201527f6d61782077616c6c65742063616e6e6f742062652073657420746f206c657373604482015269207468616e20302e312560b01b60648201526084016110b2565b601055565b600080612ce383856148b8565b905083811015612d355760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016110b2565b9392505050565b600082600003612d4e57506000611285565b6000612d5a838561473a565b905082612d678583614896565b14612d355760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016110b2565b6000612d3583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613fde565b80600003612e0b5750565b612e148161400c565b6000612e2d600954600a54612cd690919063ffffffff16565b601954909150600190819081906000908190819015612e8e57612e8b601a54601754601954612e5c91906148b8565b612e6691906148b8565b611105601954612e858b611105600a5447612d3c90919063ffffffff16565b90612d3c565b91505b60125415612ed857612ed5601b54601454601254612eac91906148b8565b612eb691906148b8565b611105601254612e858b61110560095447612d3c90919063ffffffff16565b90505b612ee28282612cd6565b92508215612f4257600d546040516001600160a01b03909116908490600081818185875af1925050503d8060008114612f37576040519150601f19603f3d011682016040523d82523d6000602084013e612f3c565b606091505b50909650505b6000612f5b601a54601754612cd690919063ffffffff16565b601b54601454612f6a91612cd6565b612f7491906148b8565b905060008115612f8b57612f884783612dbe565b90505b600081612fa5601454601754612cd690919063ffffffff16565b612faf919061473a565b9050600082612fcb601b54601a54612cd690919063ffffffff16565b612fd5919061473a565b9050811561303557600e546040516001600160a01b03909116908390600081818185875af1925050503d806000811461302a576040519150601f19603f3d011682016040523d82523d6000602084013e61302f565b606091505b50909950505b801561309357600f546040516001600160a01b03909116908290600081818185875af1925050503d8060008114613088576040519150601f19603f3d011682016040523d82523d6000602084013e61308d565b606091505b50909850505b7f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd0876130bf83856148b8565b8c80156130c957508b5b80156130d257508a5b60408051938452602084019290925215159082015260600160405180910390a1505050505050505050505050565b6000612d3583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613e83565b6001600160a01b0383166131a45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016110b2565b6001600160a01b0382166132055760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016110b2565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661328d5760405162461bcd60e51b81526004016110b2906148d0565b6001600160a01b0382166132b35760405162461bcd60e51b81526004016110b290614915565b6132f0816040518060600160405280602681526020016149e1602691396001600160a01b0386166000908152602081905260409020549190613e83565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461331f9082612cd6565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910161325a565b6001600160a01b0383166133965760405162461bcd60e51b81526004016110b2906148d0565b6001600160a01b0382166133bc5760405162461bcd60e51b81526004016110b290614915565b6001600160a01b038316600090815260246020526040812054819081908190819060ff1661343d57600854600160b01b900460ff1661343d5760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c656460448201526064016110b2565b602a5460ff1615801561345f5750602a5461010090046001600160a01b031615155b156134f65761346e8888614166565b158061349257506001600160a01b0388166000908152602b602052604090205460ff165b806134b557506001600160a01b0387166000908152602b602052604090205460ff165b6134f65760405162461bcd60e51b815260206004820152601260248201527121617661696c61626c652074726164696e6760701b60448201526064016110b2565b856000036135145761350a88886000613267565b5050505050505050565b600854600160a01b900460ff1615801561354757506001600160a01b0388166000908152601f602052604090205460ff16155b801561356c57506001600160a01b0387166000908152601f602052604090205460ff16155b15613cb4576001600160a01b03808816600090815260208052604080822054928b16825290205460ff9182169116801580156135a6575081155b156136ec5760006135c76064611105601c548c612d3c90919063ffffffff16565b90506135d38982613100565b98506135e08b3083613267565b6135eb8b8b8b613267565b600d546001600160a01b031663e30443bc8c61360681613f85565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561364c57600080fd5b505af1158015613660573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc90508b61368181613f85565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156136c757600080fd5b505af11580156136db573d6000803e3d6000fd5b505050505050505050505050505050565b801580156137035750600854600160a81b900460ff165b156137ba576001600160a01b038a166000908152602260205260409020544210156137705760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e7320617265207374616b656420616e64206c6f636b65642100000060448201526064016110b2565b6001600160a01b038a16600090815260226020526040902054156137b5576001600160a01b038a16600090815260226020908152604080832083905560219091528120555b6139c1565b811561386357601254601354601454601554601b54602554949b509299509097509550935060ff16156137b5576029543260009081526027602052604090205461380491906148b8565b42101561384c5760405162461bcd60e51b8152602060048201526016602482015275636f6f6c646f776e20706572696f642061637469766560501b60448201526064016110b2565b3260009081526027602052604090204290556139c1565b80156139c157601954601654601754601854601a54602554949b509299509097509550935060ff161561394a5760285461389e9060026148b8565b43116138e15760405162461bcd60e51b8152602060048201526012602482015271796f75207368616c6c206e6f74207061737360701b60448201526064016110b2565b326000908152602660205260409020544390036139375760405162461bcd60e51b8152602060048201526014602482015273546f6f206d616e7920545820696e20626c6f636b60601b60448201526064016110b2565b3260009081526026602052604090204390555b60006139558a611b52565b6010549091506139658a836148b8565b11156139bf5760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b60648201526084016110b2565b505b60006139e2846139d188886148b8565b6139db91906148b8565b8990612cd6565b905060006139ef30611b52565b60115490915081108015908190613a1e57506001600160a01b038d16600090815260208052604090205460ff16155b15613b37576008805460ff60a01b1916600160a01b179055601d5460ff168015613a485750600087115b8015613a5657506000600c54115b15613b08576000613a74600954600a54612cd690919063ffffffff16565b90506000613a9182611105600a5487612d3c90919063ffffffff16565b90506000613aae8361110560095488612d3c90919063ffffffff16565b90506000613acb600c546111058d86612d3c90919063ffffffff16565b90506000613ae8600b546111058e86612d3c90919063ffffffff16565b90506000613af68284612cd6565b9050613b01816141d9565b5050505050505b6000613b1330611b52565b9050613b1e81612e00565b506001600a8190556009556008805460ff60a01b191690555b6000613b4860646111058e87612d3c565b905060008a15613b9b576064613b5e8e8d612d3c565b613b689190614896565b9050613b8a8f600860009054906101000a90046001600160a01b031683613267565b600254613b979082613100565b6002555b613baf613ba882846148b8565b8e90613100565b9c508615613bcc57600954613bc49083612cd6565b600955613bdd565b600a54613bd99083612cd6565b600a555b613be88f3084613267565b601e54600d546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015613c55575060408051601f3d908101601f19168201909252613c5291810190614815565b60015b15613cab5760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b50505050505050505b613cbf888888613267565b600d546001600160a01b031663e30443bc89613cda81613f85565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613d2057600080fd5b505af1158015613d34573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc905088613d5581613f85565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613d9b57600080fd5b505af1158015613daf573d6000803e3d6000fd5b50506006546001600160a01b038b8116911614801592509050613dea57506001600160a01b038816600090815260208052604090205460ff16155b8015613e085750602a546001600160a01b0388811661010090920416145b1561350a57602a54604051633fb6b04560e11b8152600481018890526001600160a01b038a8116602483015261010090920490911690637f6d608a90604401600060405180830381600087803b158015613e6157600080fd5b505af1158015613e75573d6000803e3d6000fd5b505050505050505050505050565b60008184841115613ea75760405162461bcd60e51b81526004016110b29190614347565b506000613eb48486614958565b95945050505050565b6001600160a01b03821660009081526020805260409020805460ff19168215801591909117909155613f4957600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015613f3057600080fd5b505af1158015613f44573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600854600090600160a81b900460ff16613fa757613fa282611b52565b611285565b6001600160a01b0382166000908152602160205260409020546112859060649061110590613fd59083612cd6565b612e8586611b52565b60008183613fff5760405162461bcd60e51b81526004016110b29190614347565b506000613eb48486614896565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061404157614041614793565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561409a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140be91906147c2565b816001815181106140d1576140d1614793565b6001600160a01b0392831660209182029290920101526006546140f79130911684613142565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac9479061413090859060009086903090429060040161496f565b600060405180830381600087803b15801561414a57600080fd5b505af115801561415e573d6000803e3d6000fd5b505050505050565b6001600160a01b038216600090815260208052604081205460ff16801561419b57506006546001600160a01b03838116911614155b156141a857506001611285565b6001600160a01b038216600090815260208052604090205460ff16156141d057506002611285565b50600092915050565b60006141e6826002612dbe565b905060006141f48383613100565b9050476142008361400c565b600061420c4783613100565b90506142188382614260565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b6006546142789030906001600160a01b031684613142565b6006546001600160a01b031663f305d7198230856000806142a16005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015614309573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117119190614815565b60006020828403121561434057600080fd5b5035919050565b600060208083528351808285015260005b8181101561437457858101830151858201604001528201614358565b81811115614386576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461181e57600080fd5b801515811461181e57600080fd5b600080604083850312156143d257600080fd5b82356143dd8161439c565b915060208301356143ed816143b1565b809150509250929050565b6000806040838503121561440b57600080fd5b82356144168161439c565b946020939093013593505050565b6000806040838503121561443757600080fd5b50508035926020909101359150565b60006020828403121561445857600080fd5b8135612d358161439c565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156144a2576144a2614463565b604052919050565b600067ffffffffffffffff8211156144c4576144c4614463565b5060051b60200190565b600082601f8301126144df57600080fd5b813560206144f46144ef836144aa565b614479565b82815260059290921b8401810191818101908684111561451357600080fd5b8286015b8481101561452e5780358352918301918301614517565b509695505050505050565b6000806040838503121561454c57600080fd5b823567ffffffffffffffff8082111561456457600080fd5b818501915085601f83011261457857600080fd5b813560206145886144ef836144aa565b82815260059290921b840181019181810190898411156145a757600080fd5b948201945b838610156145ce5785356145bf8161439c565b825294820194908201906145ac565b965050860135925050808211156145e457600080fd5b506145f1858286016144ce565b9150509250929050565b60008060006060848603121561461057600080fd5b833561461b8161439c565b9250602084013561462b8161439c565b929592945050506040919091013590565b60006020828403121561464e57600080fd5b8135612d35816143b1565b6000806000806000806000806000806101408b8d03121561467957600080fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b600080604083850312156146d457600080fd5b82356146df8161439c565b915060208301356143ed8161439c565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561475457614754614724565b500290565b600181811c9082168061476d57607f821691505b60208210810361478d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000600182016147bb576147bb614724565b5060010190565b6000602082840312156147d457600080fd5b8151612d358161439c565b6000602082840312156147f157600080fd5b5051919050565b60006020828403121561480a57600080fd5b8151612d35816143b1565b60008060006060848603121561482a57600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c0878903121561485c57600080fd5b86516148678161439c565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b6000826148b357634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156148cb576148cb614724565b500190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60008282101561496a5761496a614724565b500390565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156149bf5784516001600160a01b03168352938301939183019160010161499a565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208e8f5581c7d6d73eb1065be95bad01bf6966d650416959d123f319d9019f373c64736f6c634300080f0033

Deployed Bytecode Sourcemap

25655:29340:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25814:64;;;;;;;;;;-1:-1:-1;25814:64:0;;;;-1:-1:-1;;;;;25814:64:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;25814:64:0;;;;;;;;51901:443;;;;;;;;;;-1:-1:-1;51901:443:0;;;;;:::i;:::-;;:::i;:::-;;5832:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;34422:181::-;;;;;;;;;;-1:-1:-1;34422:181:0;;;;;:::i;:::-;;:::i;6887:210::-;;;;;;;;;;-1:-1:-1;6887:210:0;;;;;:::i;:::-;;:::i;:::-;;;2140:14:1;;2133:22;2115:41;;2103:2;2088:18;6887:210:0;1975:187:1;32617:326:0;;;;;;;;;;-1:-1:-1;32617:326:0;;;;;:::i;:::-;;:::i;25729:41::-;;;;;;;;;;-1:-1:-1;25729:41:0;;;;-1:-1:-1;;;;;25729:41:0;;;6153:108;;;;;;;;;;-1:-1:-1;6241:12:0;;6153:108;;;2801:25:1;;;2789:2;2774:18;6153:108:0;2655:177:1;27821:33:0;;;;;;;;;;;;;;;;26034:28;;;;;;;;;;;;;;;;27950:55;;;;;;;;;;-1:-1:-1;27950:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;54355:637;;;;;;;;;;-1:-1:-1;54355:637:0;;;;;:::i;:::-;;:::i;7105:454::-;;;;;;;;;;-1:-1:-1;7105:454:0;;;;;:::i;:::-;;:::i;50884:114::-;;;;;;;;;;;;;:::i;26144:42::-;;;;;;;;;;-1:-1:-1;26144:42:0;;;;-1:-1:-1;;;;;26144:42:0;;;40237:141;;;;;;;;;;;;;:::i;32479:93::-;;;;;;;;;;-1:-1:-1;32479:93:0;;32562:2;6423:36:1;;6411:2;6396:18;32479:93:0;6281:184:1;42580:119:0;;;;;;;;;;-1:-1:-1;42580:119:0;;;;;:::i;:::-;;:::i;7567:300::-;;;;;;;;;;-1:-1:-1;7567:300:0;;;;;:::i;:::-;;:::i;25998:29::-;;;;;;;;;;;;;;;;37478:121;;;;;;;;;;-1:-1:-1;37478:121:0;;;;;:::i;:::-;;:::i;27258:49::-;;;;;;;;;;-1:-1:-1;27258:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;25779:28;;;;;;;;;;-1:-1:-1;25779:28:0;;;;-1:-1:-1;;;;;25779:28:0;;;27520:33;;;;;;;;;;-1:-1:-1;27520:33:0;;;;;;;;26793:40;;;;;;;;;;-1:-1:-1;26793:40:0;;;;;;;;25955:34;;;;;;;;;;-1:-1:-1;25955:34:0;;;;-1:-1:-1;;;25955:34:0;;;;;;41949:103;;;;;;;;;;;;;:::i;40386:126::-;;;;;;;;;;-1:-1:-1;40386:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;40476:28:0;40452:4;40476:28;;;:19;:28;;;;;;;;;40386:126;26585:31;;;;;;;;;;;;;;;;51006:183;;;;;;;;;;-1:-1:-1;51006:183:0;;;;;:::i;:::-;;:::i;26552:26::-;;;;;;;;;;;;;;;;51197:175;;;;;;;;;;-1:-1:-1;51197:175:0;;;;;:::i;:::-;;:::i;36834:120::-;;;;;;;;;;-1:-1:-1;36834:120:0;;;;;:::i;:::-;;:::i;42198:142::-;;;;;;;;;;;;;:::i;35289:99::-;;;;;;;;;;-1:-1:-1;35289:99:0;;;;;:::i;:::-;;:::i;40712:171::-;;;;;;;;;;-1:-1:-1;40712:171:0;;;;;:::i;:::-;;:::i;42707:185::-;;;;;;;;;;-1:-1:-1;42707:185:0;;;;;:::i;:::-;;:::i;41531:410::-;;;;;;;;;;-1:-1:-1;41531:410:0;;;;;:::i;:::-;;:::i;6269:177::-;;;;;;;;;;-1:-1:-1;6269:177:0;;;;;:::i;:::-;;:::i;13246:148::-;;;;;;;;;;;;;:::i;34652:127::-;;;;;;;;;;-1:-1:-1;34652:127:0;;;;;:::i;:::-;;:::i;38144:208::-;;;;;;;;;;-1:-1:-1;38144:208:0;;;;;:::i;:::-;;:::i;26195:38::-;;;;;;;;;;-1:-1:-1;26195:38:0;;;;-1:-1:-1;;;;;26195:38:0;;;26660:28;;;;;;;;;;;;;;;;27886:32;;;;;;;;;;-1:-1:-1;27886:32:0;;;;;;;;27200:51;;;;;;;;;;-1:-1:-1;27200:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;35080:170;;;;;;;;;;-1:-1:-1;35080:170:0;;;;;:::i;:::-;;:::i;38602:1429::-;;;;;;;;;;-1:-1:-1;38602:1429:0;;;;;:::i;:::-;;:::i;38360:234::-;;;;;;;;;;-1:-1:-1;38360:234:0;;;;;:::i;:::-;;:::i;42348:109::-;;;;;;;;;;-1:-1:-1;42348:109:0;;;;;:::i;:::-;;:::i;37895:241::-;;;;;;;;;;-1:-1:-1;37895:241:0;;;;;:::i;:::-;;:::i;26441:27::-;;;;;;;;;;;;;;;;13032:79;;;;;;;;;;-1:-1:-1;13097:6:0;;-1:-1:-1;;;;;13097:6:0;13032:79;;26240:32;;;;;;;;;;-1:-1:-1;26240:32:0;;;;-1:-1:-1;;;;;26240:32:0;;;26475;;;;;;;;;;;;;;;;5940:104;;;;;;;;;;;;;:::i;37178:163::-;;;;;;;;;;-1:-1:-1;37178:163:0;;;;;:::i;:::-;;:::i;26891:40::-;;;;;;;;;;;;;;;;37349:121;;;;;;;;;;-1:-1:-1;37349:121:0;;;;;:::i;:::-;;:::i;26695:24::-;;;;;;;;;;;;;;;;35954:176;;;;;;;;;;-1:-1:-1;35954:176:0;;;;;:::i;:::-;;:::i;34817:201::-;;;;;;;;;;-1:-1:-1;34817:201:0;;;;;:::i;:::-;;:::i;26726:25::-;;;;;;;;;;;;;;;;7875:400;;;;;;;;;;-1:-1:-1;7875:400:0;;;;;:::i;:::-;;:::i;36138:662::-;;;;;;;;;;-1:-1:-1;36138:662:0;;;;;:::i;:::-;;:::i;40520:184::-;;;;;;;;;;-1:-1:-1;40520:184:0;;;;;:::i;:::-;;:::i;6454:216::-;;;;;;;;;;-1:-1:-1;6454:216:0;;;;;:::i;:::-;;:::i;33294:143::-;;;;;;;;;;-1:-1:-1;33294:143:0;;;;;:::i;:::-;;:::i;40039:190::-;;;;;;;;;;-1:-1:-1;40039:190:0;;;;;:::i;:::-;-1:-1:-1;;;;;40172:25:0;40130:7;40172:25;;;:16;:25;;;;;;;;;40199:12;:21;;;;;;;40172:25;;40039:190;;;;;7918:25:1;;;7974:2;7959:18;;7952:34;;;;7891:18;40039:190:0;7744:248:1;26758:26:0;;;;;;;;;;;;;;;;40891:307;;;;;;;;;;-1:-1:-1;40891:307:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;8298:32:1;;;8280:51;;8362:2;8347:18;;8340:34;;;;8390:18;;;8383:34;;;;8448:2;8433:18;;8426:34;8491:3;8476:19;;8469:35;8318:3;8520:19;;8513:35;8267:3;8252:19;40891:307:0;7997:557:1;27788:26:0;;;;;;;;;;;;;;;;27054:57;;;;;;;;;;-1:-1:-1;27054:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;35475:174;;;;;;;;;;-1:-1:-1;35475:174:0;;;;;:::i;:::-;;:::i;42900:127::-;;;;;;;;;;-1:-1:-1;42900:127:0;;;;;:::i;:::-;;:::i;26405:29::-;;;;;;;;;;;;;;;;34106:268;;;;;;;;;;-1:-1:-1;34106:268:0;;;;;:::i;:::-;;:::i;36962:208::-;;;;;;;;;;-1:-1:-1;36962:208:0;;;;;:::i;:::-;;:::i;33453:146::-;;;;;;;;;;;;;:::i;50718:158::-;;;;;;;;;;-1:-1:-1;50718:158:0;;;;;:::i;:::-;;:::i;6678:201::-;;;;;;;;;;-1:-1:-1;6678:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;6844:18:0;;;6812:7;6844:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;6678:201;26365:33;;;;;;;;;;;;;;;;42060:130;;;;;;;;;;;;;:::i;26623:30::-;;;;;;;;;;;;;;;;27146:47;;;;;;;;;;-1:-1:-1;27146:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;41206:317;;;;;;;;;;-1:-1:-1;41206:317:0;;;;;:::i;:::-;;:::i;13402:281::-;;;;;;;;;;-1:-1:-1;13402:281:0;;;;;:::i;:::-;;:::i;33615:420::-;;;;;;;;;;-1:-1:-1;33615:420:0;;;;;:::i;:::-;;:::i;42465:107::-;;;;;;;;;;-1:-1:-1;42465:107:0;;;;;:::i;:::-;;:::i;26514:31::-;;;;;;;;;;;;;;;;26334:24;;;;;;;;;;;;;;;;35719:221;;;;;;;;;;-1:-1:-1;35719:221:0;;;;;:::i;:::-;;:::i;51901:443::-;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;;;;;;;;;51989:17:::1;:6:::0;51999::::1;51989:17;:::i;:::-;51980:26;;52017:19;52039:25;52053:10;;52039:9;;:13;;:25;;;;:::i;:::-;52017:47;;52075:15;52093:38;52119:11;52093:21;52104:9;;52093:6;:10;;:21;;;;:::i;:::-;:25:::0;::::1;:38::i;:::-;52075:56;;52142:16;52161:39;52188:11;52161:22;52172:10;;52161:6;:10;;:22;;;;:::i;:39::-;52142:58;;52213:28;52234:6;52213:20;:28::i;:::-;52266:9;::::0;:22:::1;::::0;52280:7;52266:13:::1;:22::i;:::-;52254:9;:34:::0;52312:10:::1;::::0;:24:::1;::::0;52327:8;52312:14:::1;:24::i;:::-;52299:10;:37:::0;-1:-1:-1;;;;51901:443:0:o;5832:100::-;5886:13;5919:5;5912:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5832:100;:::o;34422:181::-;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34506:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;34506:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;34561:34;;2115:41:1;;;34561:34:0::1;::::0;2088:18:1;34561:34:0::1;;;;;;;34422:181:::0;;:::o;6887:210::-;7006:4;7028:39;418:10;7051:7;7060:6;7028:8;:39::i;:::-;-1:-1:-1;7085:4:0;6887:210;;;;;:::o;32617:326::-;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;32739:24:::1;::::0;;;:14:::1;:24;::::0;;;;;:33;;;32731:42:::1;;;::::0;::::1;;32801:3;32792:5;:12;;32784:55;;;::::0;-1:-1:-1;;;32784:55:0;;10205:2:1;32784:55:0::1;::::0;::::1;10187:21:1::0;10244:2;10224:18;;;10217:30;10283:32;10263:18;;;10256:60;10333:18;;32784:55:0::1;10003:354:1::0;32784:55:0::1;32850:24;::::0;;;:14:::1;:24;::::0;;;;;;;;:32;;;32898:37;;7918:25:1;;;7959:18;;;7952:34;;;32898:37:0::1;::::0;7891:18:1;32898:37:0::1;;;;;;;32617:326:::0;;:::o;54355:637::-;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;54527:6:::1;:13;54502:14;:21;:38;54494:80;;;::::0;-1:-1:-1;;;54494:80:0;;10564:2:1;54494:80:0::1;::::0;::::1;10546:21:1::0;10603:2;10583:18;;;10576:30;10642:32;10622:18;;;10615:60;10692:18;;54494:80:0::1;10362:354:1::0;54494:80:0::1;54618:3;54593:14;:21;:28;;54585:75;;;::::0;-1:-1:-1;;;54585:75:0;;10923:2:1;54585:75:0::1;::::0;::::1;10905:21:1::0;10962:2;10942:18;;;10935:30;11001:34;10981:18;;;10974:62;-1:-1:-1;;;11052:18:1;;;11045:32;11094:19;;54585:75:0::1;10721:398:1::0;54585:75:0::1;54676:9;54671:314;54695:14;:21;54691:1;:25;54671:314;;;54738:14;54755;54770:1;54755:17;;;;;;;;:::i;:::-;;;;;;;54738:34;;54787:21;54811:6;54818:1;54811:9;;;;;;;;:::i;:::-;;;;;;;54824:6;54811:20;;;;:::i;:::-;54787:44;;54846:50;54862:10;54874:6;54882:13;54846:15;:50::i;:::-;54911:15;::::0;-1:-1:-1;;;;;54911:15:0::1;:26;54946:6:::0;54955:17:::1;54946:6:::0;54955:9:::1;:17::i;:::-;54911:62;::::0;-1:-1:-1;;;;;;54911:62:0::1;::::0;;;;;;-1:-1:-1;;;;;11456:32:1;;;54911:62:0::1;::::0;::::1;11438:51:1::0;11505:18;;;11498:34;11411:18;;54911:62:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;54723:262;;54718:3;;;;;:::i;:::-;;;;54671:314;;;;54355:637:::0;;:::o;7105:454::-;7245:4;7262:36;7272:6;7280:9;7291:6;7262:9;:36::i;:::-;7309:220;7332:6;418:10;7380:138;7436:6;7380:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7380:19:0;;;;;;:11;:19;;;;;;;;418:10;7380:33;;;;;;;;;;:37;:138::i;:::-;7309:8;:220::i;:::-;-1:-1:-1;7547:4:0;7105:454;;;;;:::o;50884:114::-;50958:15;;:32;;;-1:-1:-1;;;50958:32:0;;;;50931:7;;-1:-1:-1;;;;;50958:15:0;;:30;;:32;;;;;;;;;;;;;;:15;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50951:39;;50884:114;:::o;40237:141::-;40327:15;;:43;;;-1:-1:-1;;;40327:43:0;;;;40300:7;;-1:-1:-1;;;;;40327:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;42580:119::-;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;42650:15:::1;::::0;:41:::1;::::0;-1:-1:-1;;;42650:41:0;;2140:14:1;;2133:22;42650:41:0::1;::::0;::::1;2115::1::0;-1:-1:-1;;;;;42650:15:0;;::::1;::::0;:34:::1;::::0;2088:18:1;;42650:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42580:119:::0;:::o;7567:300::-;418:10;7682:4;7776:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;7776:34:0;;;;;;;;;;7682:4;;7704:133;;7754:7;;7776:50;;7815:10;7776:38;:50::i;37478:121::-;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;37548:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;37548:43:0;;2140:14:1;;2133:22;37548:43:0::1;::::0;::::1;2115:41:1::0;-1:-1:-1;;;;;37548:15:0;;::::1;::::0;:36:::1;::::0;2088:18:1;;37548:43:0::1;1975:187:1::0;41949:103:0;41986:15;;:58;;-1:-1:-1;;;41986:58:0;;42025:10;41986:58;;;12312:51:1;41986:15:0;12379:18:1;;;12372:50;-1:-1:-1;;;;;41986:15:0;;;;:30;;12285:18:1;;41986:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41949:103::o;51006:183::-;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;51120:15:::1;::::0;:61:::1;::::0;-1:-1:-1;;;51120:61:0;;::::1;::::0;::::1;2801:25:1::0;;;-1:-1:-1;;;;;51120:15:0;;::::1;::::0;:54:::1;::::0;2774:18:1;;51120:61:0::1;2655:177:1::0;51197:175:0;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;51307:15:::1;::::0;:57:::1;::::0;-1:-1:-1;;;51307:57:0;;::::1;::::0;::::1;2801:25:1::0;;;-1:-1:-1;;;;;51307:15:0;;::::1;::::0;:50:::1;::::0;2774:18:1;;51307:57:0::1;2655:177:1::0;36834:120:0;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;36929:17:::1;:6:::0;36939::::1;36929:17;:::i;:::-;36908:18;:38:::0;-1:-1:-1;36834:120:0:o;42198:142::-;42291:15;;:41;;;-1:-1:-1;;;42291:41:0;;;;42264:7;;-1:-1:-1;;;;;42291:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;35289:99;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;35358:14:::1;:22:::0;;-1:-1:-1;;35358:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;35289:99::o;40712:171::-;40841:15;;:34;;-1:-1:-1;;;40841:34:0;;-1:-1:-1;;;;;178:32:1;;;40841:34:0;;;160:51:1;40809:7:0;;40841:15;;:25;;133:18:1;;40841:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;42707:185::-;42836:15;;:48;;-1:-1:-1;;;42836:48:0;;-1:-1:-1;;;;;178:32:1;;;42836:48:0;;;160:51:1;42807:4:0;;42836:15;;:39;;133:18:1;;42836:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;41531:410::-;41713:15;;:28;;-1:-1:-1;;;;;;41713:28:0;;;;;2801:25:1;;;41611:18:0;;;;;;-1:-1:-1;;;;;41713:15:0;;:23;;2774:18:1;;41713:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41757:176;;;13225:25:1;;;13281:2;13266:18;;13259:34;;;13309:18;;;13302:34;;;13367:2;13352:18;;13345:34;;;41596:145:0;;-1:-1:-1;41596:145:0;;-1:-1:-1;41596:145:0;-1:-1:-1;41913:9:0;;41875:5;;41757:176;;13212:3:1;13197:19;41757:176:0;;;;;;;41585:356;;;41531:410;:::o;6269:177::-;-1:-1:-1;;;;;6420:18:0;6388:7;6420:18;;;;;;;;;;;;6269:177::o;13246:148::-;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;13337:6:::1;::::0;13316:40:::1;::::0;13353:1:::1;::::0;-1:-1:-1;;;;;13337:6:0::1;::::0;13316:40:::1;::::0;13353:1;;13316:40:::1;13367:6;:19:::0;;-1:-1:-1;;;;;;13367:19:0::1;::::0;;13246:148::o;34652:127::-;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;34726:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;34726:45:0;;-1:-1:-1;;;;;178:32:1;;;34726:45:0::1;::::0;::::1;160:51:1::0;34726:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;34726:45:0::1;14:203:1::0;38144:208:0;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;38213:15:::1;::::0;:46:::1;::::0;-1:-1:-1;;;38213:46:0;;-1:-1:-1;;;;;178:32:1;;;38213:46:0::1;::::0;::::1;160:51:1::0;38213:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;38213:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;;;38270:29:0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:36;;-1:-1:-1;;38270:36:0::1;38302:4;38270:36;::::0;;-1:-1:-1;38317:27:0::1;38290:8:::0;38317:17:::1;:27::i;35080:170::-:0;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35192:41:0;;;::::1;;::::0;;;:33:::1;:41;::::0;;;;:50;;-1:-1:-1;;35192:50:0::1;::::0;::::1;;::::0;;;::::1;::::0;;35080:170::o;38602:1429::-;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;38946:11:::1;:21:::0;;;38978:16:::1;:31:::0;;;39020:15:::1;:30:::0;;;39061:13:::1;:26:::0;;;39098:12:::1;:23:::0;;;39132:17:::1;:33:::0;;;39176:16:::1;:32:::0;;;39219:14:::1;:28:::0;;;39258:9:::1;:18:::0;;;39287:10:::1;:20:::0;;;39336:117:::1;39300:7:::0;39336:87:::1;39152:13:::0;39336:87;39236:11;39195:13;39336:32:::1;:50::i;:::-;:68:::0;::::1;:87::i;:117::-;39320:13;:133;;;;39481:113;39584:9;;39481:84;39548:16;;39481:48;39513:15;;39481:13;;:31;;:48;;;;:::i;:113::-;39466:12;:128:::0;39615:13:::1;::::0;39632:2:::1;-1:-1:-1::0;39615:19:0;::::1;::::0;:41:::1;;;39654:2;39638:12;;:18;;39615:41;39607:94;;;::::0;-1:-1:-1;;;39607:94:0;;13592:2:1;39607:94:0::1;::::0;::::1;13574:21:1::0;13631:2;13611:18;;;13604:30;13670:34;13650:18;;;13643:62;-1:-1:-1;;;13721:18:1;;;13714:38;13769:19;;39607:94:0::1;13390:404:1::0;39607:94:0::1;39744:12;::::0;39771:17:::1;::::0;39803:16:::1;::::0;39834:14:::1;::::0;39863:11:::1;::::0;39889:16:::1;::::0;39920:15:::1;::::0;39950:13:::1;::::0;39978:9:::1;::::0;40002:10:::1;::::0;39719:304:::1;::::0;;14198:25:1;;;14254:2;14239:18;;14232:34;;;;14282:18;;;14275:34;;;;14340:2;14325:18;;14318:34;;;;14383:3;14368:19;;14361:35;;;;14427:3;14412:19;;14405:35;14471:3;14456:19;;14449:35;14515:3;14500:19;;14493:35;14559:3;14544:19;;14537:35;14603:3;14588:19;;14581:35;39719:304:0::1;::::0;14185:3:1;14170:19;39719:304:0::1;;;;;;;38602:1429:::0;;;;;;;;;;:::o;38360:234::-;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;38466:1:::1;38448:14;:19;;38439:62;;;::::0;-1:-1:-1;;;38439:62:0;;14829:2:1;38439:62:0::1;::::0;::::1;14811:21:1::0;14868:2;14848:18;;;14841:30;14907:31;14887:18;;;14880:59;14956:18;;38439:62:0::1;14627:353:1::0;38439:62:0::1;38512:11;:28:::0;;;38556:30:::1;::::0;2801:25:1;;;38556:30:0::1;::::0;2789:2:1;2774:18;38556:30:0::1;;;;;;;;38360:234:::0;:::o;42348:109::-;42402:15;;:47;;-1:-1:-1;;;42402:47:0;;42431:10;42402:47;;;12312:51:1;12406:14;;12399:22;12379:18;;;12372:50;-1:-1:-1;;;;;42402:15:0;;;;:28;;12285:18:1;;42402:47:0;12128:300:1;37895:241:0;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;37993:6:::1;37981:8;:18;;:41;;;;;38015:7;38003:8;:19;;37981:41;37973:50;;;::::0;::::1;;38073:16;::::0;38039:51:::1;::::0;38063:8;;38039:51:::1;::::0;;;::::1;38101:16;:27:::0;37895:241::o;5940:104::-;5996:13;6029:7;6022:14;;;;;:::i;37178:163::-;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;37292:41:::1;37321:4;37327:5;37292:28;:41::i;:::-;37178:163:::0;;:::o;37349:121::-;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;37419:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;37419:43:0;;2140:14:1;;2133:22;37419:43:0::1;::::0;::::1;2115:41:1::0;-1:-1:-1;;;;;37419:15:0;;::::1;::::0;:36:::1;::::0;2088:18:1;;37419:43:0::1;1975:187:1::0;35954:176:0;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;36044:6:::1;36026:24;;:14;;;;;;;;;;;:24;;::::0;36018:33:::1;;;::::0;::::1;;36062:14;:23:::0;;;::::1;;-1:-1:-1::0;;;36062:23:0::1;-1:-1:-1::0;;;;36062:23:0;;::::1;;::::0;;36101:21:::1;::::0;::::1;::::0;::::1;::::0;36079:6;2140:14:1;2133:22;2115:41;;2103:2;2088:18;;1975:187;34817:201:0;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;34891:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;34891:45:0;;-1:-1:-1;;;;;178:32:1;;;34891:45:0::1;::::0;::::1;160:51:1::0;34891:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;34891:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;34947:15:0::1;::::0;-1:-1:-1;;;;;34947:15:0::1;::::0;-1:-1:-1;34947:26:0::1;::::0;-1:-1:-1;34974:7:0;34983:26:::1;34974:7:::0;34983:17:::1;:26::i;:::-;34947:63;::::0;-1:-1:-1;;;;;;34947:63:0::1;::::0;;;;;;-1:-1:-1;;;;;11456:32:1;;;34947:63:0::1;::::0;::::1;11438:51:1::0;11505:18;;;11498:34;11411:18;;34947:63:0::1;11256:282:1::0;7875:400:0;7995:4;8017:228;418:10;8067:7;8089:145;8146:15;8089:145;;;;;;;;;;;;;;;;;418:10;8089:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;8089:34:0;;;;;;;;;;;;:38;:145::i;36138:662::-;36197:14;;-1:-1:-1;;;36197:14:0;;;;36189:49;;;;-1:-1:-1;;;36189:49:0;;15755:2:1;36189:49:0;;;15737:21:1;15794:2;15774:18;;;15767:30;-1:-1:-1;;;15813:18:1;;;15806:52;15875:18;;36189:49:0;15553:346:1;36189:49:0;36257:24;;;;:14;:24;;;;;;:29;;36249:66;;;;-1:-1:-1;;;36249:66:0;;16106:2:1;36249:66:0;;;16088:21:1;16145:2;16125:18;;;16118:30;16184:26;16164:18;;;16157:54;16228:18;;36249:66:0;15904:348:1;36249:66:0;36381:29;:15;36401:8;36381:19;:29::i;:::-;418:10;36348:30;;;;:16;:30;;;;;;:62;36326:148;;;;-1:-1:-1;;;36326:148:0;;16459:2:1;36326:148:0;;;16441:21:1;16498:2;16478:18;;;16471:30;16537:34;16517:18;;;16510:62;-1:-1:-1;;;16588:18:1;;;16581:34;16632:19;;36326:148:0;16257:400:1;36326:148:0;36514:24;;;;:14;:24;;;;;;;;;418:10;36485:26;;:12;:26;;;;;;:53;36582:29;:15;36514:24;36582:19;:29::i;:::-;418:10;36549:30;;;;:16;:30;;;;;:62;;;;36622:15;;-1:-1:-1;;;;;36622:15:0;;:26;;36690:31;418:10;36690:17;:31::i;:::-;36622:110;;-1:-1:-1;;;;;;36622:110:0;;;;;;;-1:-1:-1;;;;;11456:32:1;;;36622:110:0;;;11438:51:1;11505:18;;;11498:34;11411:18;;36622:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36769:12;418:10;;338:98;36769:12;-1:-1:-1;;;;;36748:44:0;;36783:8;36748:44;;;;2801:25:1;;2789:2;2774:18;;2655:177;36748:44:0;;;;;;;;36138:662;:::o;40520:184::-;40649:15;;:47;;-1:-1:-1;;;40649:47:0;;-1:-1:-1;;;;;178:32:1;;;40649:47:0;;;160:51:1;40617:7:0;;40649:15;;:38;;133:18:1;;40649:47:0;14:203:1;6454:216:0;6576:4;6598:42;418:10;6622:9;6633:6;6598:9;:42::i;33294:143::-;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33387:30:0;;;::::1;;::::0;;;:23:::1;:30;::::0;;;;:38;;-1:-1:-1;;33387:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;33294:143::o;40891:307::-;41155:15;;:35;;-1:-1:-1;;;41155:35:0;;-1:-1:-1;;;;;178:32:1;;;41155:35:0;;;160:51:1;41005:7:0;;;;;;;;;;;;41155:15;;;;:26;;133:18:1;;41155:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41148:42;;;;-1:-1:-1;41148:42:0;;-1:-1:-1;41148:42:0;-1:-1:-1;41148:42:0;-1:-1:-1;41148:42:0;;-1:-1:-1;40891:307:0;-1:-1:-1;;40891:307:0:o;35475:174::-;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;35563:3:::1;35554:5;:12;;35546:63;;;::::0;-1:-1:-1;;;35546:63:0;;17426:2:1;35546:63:0::1;::::0;::::1;17408:21:1::0;17465:2;17445:18;;;17438:30;17504:34;17484:18;;;17477:62;-1:-1:-1;;;17555:18:1;;;17548:36;17601:19;;35546:63:0::1;17224:402:1::0;35546:63:0::1;35620:13;:21:::0;35475:174::o;42900:127::-;42984:15;;:35;;-1:-1:-1;;;42984:35:0;;-1:-1:-1;;;;;178:32:1;;;42984:35:0;;;160:51:1;42960:4:0;;42984:15;;:26;;133:18:1;;42984:35:0;14:203:1;34106:268:0;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34178:41:0;;::::1;;::::0;;;:33:::1;:41;::::0;;;;;;;:48;;34222:4:::1;-1:-1:-1::0;;34178:48:0;;::::1;::::0;::::1;::::0;;;34237:19:::1;:27:::0;;;;;;;:34;;;;::::1;::::0;;::::1;::::0;;34282:15:::1;::::0;:44;;-1:-1:-1;;;34282:44:0;;::::1;::::0;::::1;160:51:1::0;;;;34282:15:0;::::1;::::0;:36:::1;::::0;133:18:1;34282:44:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;34342:24:0::1;::::0;-1:-1:-1;;;;;178:32:1;;160:51;;34342:24:0::1;::::0;-1:-1:-1;148:2:1;133:18;;-1:-1:-1;34342:24:0::1;14:203:1::0;36962:208:0;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;37042:21:::1;::::0;:32;::::1;;:21;::::0;;::::1;:32;;::::0;37034:41:::1;;;::::0;::::1;;37086:21;:31:::0;;-1:-1:-1;;37086:31:0::1;::::0;::::1;;::::0;;::::1;::::0;;;37133:29:::1;::::0;2115:41:1;;;37133:29:0::1;::::0;2103:2:1;2088:18;37133:29:0::1;1975:187:1::0;33453:146:0;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;33520:20:::1;::::0;::::1;;33519:21;33511:30;;;::::0;::::1;;33560:20;:27:::0;;-1:-1:-1;;33560:27:0::1;33583:4;33560:27;::::0;;33453:146::o;50718:158::-;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;50788:15:::1;::::0;:40:::1;::::0;-1:-1:-1;;;50788:40:0;;-1:-1:-1;;;;;178:32:1;;;50788:40:0::1;::::0;::::1;160:51:1::0;50788:15:0;;::::1;::::0;:33:::1;::::0;133:18:1;;50788:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;50844:24:0::1;::::0;-1:-1:-1;;;;;178:32:1;;160:51;;50844:24:0::1;::::0;-1:-1:-1;148:2:1;133:18;;-1:-1:-1;50844:24:0::1;14:203:1::0;42060:130:0;42143:15;;:39;;;-1:-1:-1;;;42143:39:0;;;;42116:7;;-1:-1:-1;;;;;42143:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;41206:317;41475:15;;:40;;-1:-1:-1;;;41475:40:0;;;;;2801:25:1;;;41325:7:0;;;;;;;;;;;;-1:-1:-1;;;;;41475:15:0;;;;:33;;2774:18:1;;41475:40:0;2655:177:1;13402:281:0;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13505:22:0;::::1;13483:110;;;::::0;-1:-1:-1;;;13483:110:0;;17833:2:1;13483:110:0::1;::::0;::::1;17815:21:1::0;17872:2;17852:18;;;17845:30;17911:34;17891:18;;;17884:62;-1:-1:-1;;;17962:18:1;;;17955:36;18008:19;;13483:110:0::1;17631:402:1::0;13483:110:0::1;13630:6;::::0;13609:38:::1;::::0;-1:-1:-1;;;;;13609:38:0;;::::1;::::0;13630:6:::1;::::0;13609:38:::1;::::0;13630:6:::1;::::0;13609:38:::1;13658:6;:17:::0;;-1:-1:-1;;;;;;13658:17:0::1;-1:-1:-1::0;;;;;13658:17:0;;;::::1;::::0;;;::::1;::::0;;13402:281::o;33615:420::-;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;33689:10:::1;:20:::0;;-1:-1:-1;;;;;;33689:20:0::1;;-1:-1:-1::0;;;;;33689:20:0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;33724:21;33720:203:::1;;-1:-1:-1::0;;;;;33762:32:0;;::::1;;::::0;;;:23:::1;:32;::::0;;;;;;;:39;;33797:4:::1;-1:-1:-1::0;;33762:39:0;;::::1;::::0;::::1;::::0;;;33816:19:::1;:28:::0;;;;;;;:35;;;;::::1;::::0;;::::1;::::0;;33866:15:::1;::::0;:45;;-1:-1:-1;;;33866:45:0;;::::1;::::0;::::1;160:51:1::0;;;;33866:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;33866:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33720:203;33947:12;33933:11;:26:::0;33970:14:::1;:21:::0;;-1:-1:-1;;;;33970:21:0::1;-1:-1:-1::0;;;33970:21:0::1;::::0;;34007:16:::1;::::0;::::1;::::0;33970:21;;34007:16:::1;33615:420:::0;:::o;42465:107::-;42518:15;;:46;;-1:-1:-1;;;42518:46:0;;42546:10;42518:46;;;12312:51:1;12406:14;;12399:22;12379:18;;;12372:50;-1:-1:-1;;;;;42518:15:0;;;;:27;;12285:18:1;;42518:46:0;12128:300:1;35719:221:0;13159:6;;-1:-1:-1;;;;;13159:6:0;418:10;13159:22;13151:67;;;;-1:-1:-1;;;13151:67:0;;;;;;;:::i;:::-;35794:16:::1;:5:::0;35803:6:::1;35794:16;:::i;:::-;35786:24;;35853:4;35838:12;;:19;;;;:::i;:::-;35829:5;:28;;35821:83;;;::::0;-1:-1:-1;;;35821:83:0;;18462:2:1;35821:83:0::1;::::0;::::1;18444:21:1::0;18501:2;18481:18;;;18474:30;18540:34;18520:18;;;18513:62;-1:-1:-1;;;18591:18:1;;;18584:40;18641:19;;35821:83:0::1;18260:406:1::0;35821:83:0::1;35915:9;:17:::0;35719:221::o;11058:181::-;11116:7;;11148:5;11152:1;11148;:5;:::i;:::-;11136:17;;11177:1;11172;:6;;11164:46;;;;-1:-1:-1;;;11164:46:0;;19006:2:1;11164:46:0;;;18988:21:1;19045:2;19025:18;;;19018:30;19084:29;19064:18;;;19057:57;19131:18;;11164:46:0;18804:351:1;11164:46:0;11230:1;11058:181;-1:-1:-1;;;11058:181:0:o;11625:250::-;11683:7;11707:1;11712;11707:6;11703:47;;-1:-1:-1;11737:1:0;11730:8;;11703:47;11762:9;11774:5;11778:1;11774;:5;:::i;:::-;11762:17;-1:-1:-1;11807:1:0;11798:5;11802:1;11762:17;11798:5;:::i;:::-;:10;11790:56;;;;-1:-1:-1;;;11790:56:0;;19362:2:1;11790:56:0;;;19344:21:1;19401:2;19381:18;;;19374:30;19440:34;19420:18;;;19413:62;-1:-1:-1;;;19491:18:1;;;19484:31;19532:19;;11790:56:0;19160:397:1;11883:132:0;11941:7;11968:39;11972:1;11975;11968:39;;;;;;;;;;;;;;;;;:3;:39::i;52352:1995::-;52421:6;52431:1;52421:11;52417:50;;52352:1995;:::o;52417:50::-;52477:24;52494:6;52477:16;:24::i;:::-;52512:19;52534:25;52548:10;;52534:9;;:13;;:25;;;;:::i;:::-;52775:13;;52512:47;;-1:-1:-1;52587:4:0;;;;;;52572:12;;;;;;52775:17;52771:261;;52828:192;53010:9;;52991:16;;52975:13;;:32;;;;:::i;:::-;:44;;;;:::i;:::-;52828:128;52942:13;;52828:95;52911:11;52828:64;52882:9;;52828:35;:53;;:64;;;;:::i;:95::-;:113;;:128::i;:192::-;52809:211;;52771:261;53046:14;;:18;53042:268;;53101:197;53287:10;;53267:17;;53250:14;;:34;;;;:::i;:::-;:47;;;;:::i;:::-;53101:130;53216:14;;53101:96;53185:11;53101:65;53155:10;;53101:35;:53;;:65;;;;:::i;:197::-;53081:217;;53042:268;53332:39;:16;53353:17;53332:20;:39::i;:::-;53320:51;-1:-1:-1;53388:13:0;;53384:111;;53440:15;;53432:51;;-1:-1:-1;;;;;53440:15:0;;;;53469:9;;53432:51;;;;53469:9;53440:15;53432:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53418:65:0;;-1:-1:-1;;53384:111:0;53515:21;53588:31;53609:9;;53588:16;;:20;;:31;;;;:::i;:::-;53561:10;;53539:17;;:33;;:21;:33::i;:::-;:80;;;;:::i;:::-;53515:104;-1:-1:-1;53632:19:0;53666:17;;53662:104;;53714:40;:21;53740:13;53714:25;:40::i;:::-;53700:54;;53662:104;53776:23;53844:11;53802:39;53823:17;;53802:16;;:20;;:39;;;;:::i;:::-;:53;;;;:::i;:::-;53776:79;;53866:17;53914:11;53886:25;53900:10;;53886:9;;:13;;:25;;;;:::i;:::-;:39;;;;:::i;:::-;53866:59;-1:-1:-1;53942:19:0;;53938:126;;54003:15;;53995:57;;-1:-1:-1;;;;;54003:15:0;;;;54032;;53995:57;;;;54032:15;54003;53995:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53978:74:0;;-1:-1:-1;;53938:126:0;54078:13;;54074:108;;54133:9;;54125:45;;-1:-1:-1;;;;;54133:9:0;;;;54156;;54125:45;;;;54156:9;54133;54125:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54108:62:0;;-1:-1:-1;;54074:108:0;54199:140;54227:9;54251:27;54269:9;54251:15;:27;:::i;:::-;54293:7;:21;;;;;54304:10;54293:21;:35;;;;;54318:10;54293:35;54199:140;;;19968:25:1;;;20024:2;20009:18;;20002:34;;;;20079:14;20072:22;20052:18;;;20045:50;19956:2;19941:18;54199:140:0;;;;;;;52406:1941;;;;;;;;;;;52352:1995;:::o;11247:136::-;11305:7;11332:43;11336:1;11339;11332:43;;;;;;;;;;;;;;;;;:3;:43::i;9750:380::-;-1:-1:-1;;;;;9886:19:0;;9878:68;;;;-1:-1:-1;;;9878:68:0;;20308:2:1;9878:68:0;;;20290:21:1;20347:2;20327:18;;;20320:30;20386:34;20366:18;;;20359:62;-1:-1:-1;;;20437:18:1;;;20430:34;20481:19;;9878:68:0;20106:400:1;9878:68:0;-1:-1:-1;;;;;9965:21:0;;9957:68;;;;-1:-1:-1;;;9957:68:0;;20713:2:1;9957:68:0;;;20695:21:1;20752:2;20732:18;;;20725:30;20791:34;20771:18;;;20764:62;-1:-1:-1;;;20842:18:1;;;20835:32;20884:19;;9957:68:0;20511:398:1;9957:68:0;-1:-1:-1;;;;;10038:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10090:32;;2801:25:1;;;10090:32:0;;2774:18:1;10090:32:0;;;;;;;;9750:380;;;:::o;8283:610::-;-1:-1:-1;;;;;8423:20:0;;8415:70;;;;-1:-1:-1;;;8415:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8504:23:0;;8496:71;;;;-1:-1:-1;;;8496:71:0;;;;;;;:::i;:::-;8660:108;8696:6;8660:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8660:17:0;;:9;:17;;;;;;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;8640:17:0;;;:9;:17;;;;;;;;;;;:128;;;;8802:20;;;;;;;:32;;8827:6;8802:24;:32::i;:::-;-1:-1:-1;;;;;8779:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;8850:35;2801:25:1;;;8779:20:0;;8850:35;;;;;;2774:18:1;8850:35:0;2655:177:1;43035:6383:0;-1:-1:-1;;;;;43167:18:0;;43159:68;;;;-1:-1:-1;;;43159:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43246:16:0;;43238:64;;;;-1:-1:-1;;;43238:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43465:39:0;;43313:18;43465:39;;;:33;:39;;;;;;43313:18;;;;;;;;43465:39;;43460:132;;43529:14;;-1:-1:-1;;;43529:14:0;;;;43521:59;;;;-1:-1:-1;;;43521:59:0;;21926:2:1;43521:59:0;;;21908:21:1;;;21945:18;;;21938:30;22004:34;21984:18;;;21977:62;22056:18;;43521:59:0;21724:356:1;43521:59:0;43616:20;;;;:29;;;:57;;-1:-1:-1;43649:10:0;;;;;-1:-1:-1;;;;;43649:10:0;:24;;43616:57;43612:209;;;43698:19;43708:4;43714:2;43698:9;:19::i;:::-;:24;;:57;;-1:-1:-1;;;;;;43726:29:0;;;;;;:23;:29;;;;;;;;43698:57;:88;;;-1:-1:-1;;;;;;43759:27:0;;;;;;:23;:27;;;;;;;;43698:88;43690:119;;;;-1:-1:-1;;;43690:119:0;;22287:2:1;43690:119:0;;;22269:21:1;22326:2;22306:18;;;22299:30;-1:-1:-1;;;22345:18:1;;;22338:48;22403:18;;43690:119:0;22085:342:1;43690:119:0;43853:6;43863:1;43853:11;43849:5185;;43881:28;43897:4;43903:2;43907:1;43881:15;:28::i;:::-;43924:7;;;;;43035:6383;;;:::o;43849:5185::-;43967:8;;-1:-1:-1;;;43967:8:0;;;;43966:9;:39;;;;-1:-1:-1;;;;;;43980:25:0;;;;;;:19;:25;;;;;;;;43979:26;43966:39;:67;;;;-1:-1:-1;;;;;;44010:23:0;;;;;;:19;:23;;;;;;;;44009:24;43966:67;43948:5086;;;-1:-1:-1;;;;;44077:29:0;;;44060:14;44077:29;;;:25;:29;;;;;;;44137:31;;;;;;;;44077:29;;;;;44137:31;44189:9;;:23;;;;;44203:9;44202:10;44189:23;44185:2203;;;44233:13;44249:32;44277:3;44249:23;44260:11;;44249:6;:10;;:23;;;;:::i;:32::-;44233:48;-1:-1:-1;44309:17:0;:6;44233:48;44309:10;:17::i;:::-;44300:26;;44345:43;44361:4;44375;44382:5;44345:15;:43::i;:::-;44407:33;44423:4;44429:2;44433:6;44407:15;:33::i;:::-;44459:15;;-1:-1:-1;;;;;44459:15:0;:26;44486:4;44492:23;44486:4;44492:17;:23::i;:::-;44459:57;;-1:-1:-1;;;;;;44459:57:0;;;;;;;-1:-1:-1;;;;;11456:32:1;;;44459:57:0;;;11438:51:1;11505:18;;;11498:34;11411:18;;44459:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44535:15:0;;-1:-1:-1;;;;;44535:15:0;;-1:-1:-1;44535:26:0;;-1:-1:-1;44562:2:0;44566:21;44562:2;44566:17;:21::i;:::-;44535:53;;-1:-1:-1;;;;;;44535:53:0;;;;;;;-1:-1:-1;;;;;11456:32:1;;;44535:53:0;;;11438:51:1;11505:18;;;11498:34;11411:18;;44535:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44607:7;;;;;;;;43035:6383;;;:::o;44185:2203::-;44667:8;44666:9;:27;;;;-1:-1:-1;44679:14:0;;-1:-1:-1;;;44679:14:0;;;;44666:27;44662:1726;;;-1:-1:-1;;;;;44744:22:0;;;;;;:16;:22;;;;;;44770:15;-1:-1:-1;44744:41:0;44714:144;;;;-1:-1:-1;;;44714:144:0;;22634:2:1;44714:144:0;;;22616:21:1;22673:2;22653:18;;;22646:30;22712:31;22692:18;;;22685:59;22761:18;;44714:144:0;22432:353:1;44714:144:0;-1:-1:-1;;;;;44881:22:0;;;;;;:16;:22;;;;;;:27;44877:147;;-1:-1:-1;;;;;44933:22:0;;44958:1;44933:22;;;:16;:22;;;;;;;;:26;;;44982:12;:18;;;;;:22;44877:147;44662:1726;;;45064:9;45060:1328;;;45107:14;;45151:12;;45198:17;;45249:16;;45294:10;;45329:14;;45107;;-1:-1:-1;45151:12:0;;-1:-1:-1;45198:17:0;;-1:-1:-1;45249:16:0;-1:-1:-1;45294:10:0;-1:-1:-1;45329:14:0;;45325:271;;;45433:13;;45420:9;45391:39;;;;:28;:39;;;;;;:55;;45433:13;45391:55;:::i;:::-;45372:15;:74;;45364:134;;;;-1:-1:-1;;;45364:134:0;;22992:2:1;45364:134:0;;;22974:21:1;23031:2;23011:18;;;23004:30;-1:-1:-1;;;23050:18:1;;;23043:52;23112:18;;45364:134:0;22790:346:1;45364:134:0;45546:9;45517:39;;;;:28;:39;;;;;45559:15;45517:57;;45060:1328;;;45623:8;45619:769;;;45665:13;;45708:11;;45754:16;;45804:15;;45848:9;;45882:14;;45665:13;;-1:-1:-1;45708:11:0;;-1:-1:-1;45754:16:0;;-1:-1:-1;45804:15:0;-1:-1:-1;45848:9:0;-1:-1:-1;45882:14:0;;45878:286;;;45940:11;;:15;;45954:1;45940:15;:::i;:::-;45925:12;:30;45917:60;;;;-1:-1:-1;;;45917:60:0;;23343:2:1;45917:60:0;;;23325:21:1;23382:2;23362:18;;;23355:30;-1:-1:-1;;;23401:18:1;;;23394:48;23459:18;;45917:60:0;23141:342:1;45917:60:0;46029:9;46004:35;;;;:24;:35;;;;;;46043:12;46004:51;;45996:83;;;;-1:-1:-1;;;45996:83:0;;23690:2:1;45996:83:0;;;23672:21:1;23729:2;23709:18;;;23702:30;-1:-1:-1;;;23748:18:1;;;23741:50;23808:18;;45996:83:0;23488:344:1;45996:83:0;46123:9;46098:35;;;;:24;:35;;;;;46136:12;46098:50;;45878:286;46192:32;46227:13;46237:2;46227:9;:13::i;:::-;46300:9;;46192:48;;-1:-1:-1;46263:33:0;46290:6;46192:48;46263:33;:::i;:::-;:46;;46255:117;;;;-1:-1:-1;;;46255:117:0;;24039:2:1;46255:117:0;;;24021:21:1;24078:2;24058:18;;;24051:30;24117:34;24097:18;;;24090:62;-1:-1:-1;;;24168:18:1;;;24161:34;24212:19;;46255:117:0;23837:400:1;46255:117:0;45633:755;45619:769;46404:17;46424:72;46488:7;46457:28;46472:13;46457:12;:28;:::i;:::-;:38;;;;:::i;:::-;46424:10;;:32;:72::i;:::-;46404:92;;46513:28;46544:24;46562:4;46544:9;:24::i;:::-;46624:18;;46513:55;;-1:-1:-1;46600:42:0;;;;;;;46663:43;;-1:-1:-1;;;;;;46675:31:0;;;;;;:25;:31;;;;;;;;46674:32;46663:43;46659:1251;;;46727:8;:15;;-1:-1:-1;;;;46727:15:0;-1:-1:-1;;;46727:15:0;;;46767:21;;46727:15;46767:21;:41;;;;;46807:1;46792:12;:16;46767:41;:61;;;;;46827:1;46812:12;;:16;46767:61;46763:903;;;46853:20;46876:25;46890:10;;46876:9;;:13;;:25;;;;:::i;:::-;46853:48;;46924:24;46951:105;47043:12;46951:61;47002:9;;46951:20;:50;;:61;;;;:::i;:105::-;46924:132;;47079:22;47104:106;47197:12;47104:62;47155:10;;47104:20;:50;;:62;;;;:::i;:106::-;47079:131;;47235:21;47259:104;47350:12;;47259:60;47306:12;47259:16;:46;;:60;;;;:::i;:104::-;47235:128;;47388:22;47413:103;47502:13;;47413:58;47458:12;47413:14;:44;;:58;;;;:::i;:103::-;47388:128;-1:-1:-1;47541:18:0;47562:33;47388:128;47581:13;47562:18;:33::i;:::-;47541:54;;47620:26;47635:10;47620:14;:26::i;:::-;46830:836;;;;;;46763:903;47686:24;47713;47731:4;47713:9;:24::i;:::-;47686:51;;47756:38;47777:16;47756:20;:38::i;:::-;-1:-1:-1;47825:1:0;47813:9;:13;;;47845:10;:14;47878:8;:16;;-1:-1:-1;;;;47878:16:0;;;46659:1251;47926:12;47941:30;47967:3;47941:21;:6;47952:9;47941:10;:21::i;:30::-;47926:45;-1:-1:-1;47986:18:0;48025:12;;48021:202;;48090:3;48067:20;:6;48078:8;48067:10;:20::i;:::-;:26;;;;:::i;:::-;48054:39;;48108;48124:4;48130;;;;;;;;;-1:-1:-1;;;;;48130:4:0;48136:10;48108:15;:39::i;:::-;48177:12;;:28;;48194:10;48177:16;:28::i;:::-;48162:12;:43;48021:202;48248:29;48259:17;48266:10;48259:4;:17;:::i;:::-;48248:6;;:10;:29::i;:::-;48239:38;;48298:9;48294:155;;;48341:10;;:20;;48356:4;48341:14;:20::i;:::-;48328:10;:33;48294:155;;;48414:9;;:19;;48428:4;48414:13;:19::i;:::-;48402:9;:31;48294:155;48465:42;48481:4;48495;48502;48465:15;:42::i;:::-;48538:16;;48575:15;;:28;;-1:-1:-1;;;;;;48575:28:0;;;;;2801:25:1;;;-1:-1:-1;;;;;48575:15:0;;;;:23;;2774:18:1;;48575:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;48575:28:0;;;;;;;;-1:-1:-1;;48575:28:0;;;;;;;;;;;;:::i;:::-;;;48571:452;;;48767:231;;;13225:25:1;;;13281:2;13266:18;;13259:34;;;13309:18;;;13302:34;;;13367:2;13352:18;;13345:34;;;48970:9:0;;48917:4;;48767:231;;13212:3:1;13197:19;48767:231:0;;;;;;;48604:410;;;48571:452;44045:4989;;;;;;;;43948:5086;49046:33;49062:4;49068:2;49072:6;49046:15;:33::i;:::-;49090:15;;-1:-1:-1;;;;;49090:15:0;:26;49117:4;49123:23;49117:4;49123:17;:23::i;:::-;49090:57;;-1:-1:-1;;;;;;49090:57:0;;;;;;;-1:-1:-1;;;;;11456:32:1;;;49090:57:0;;;11438:51:1;11505:18;;;11498:34;11411:18;;49090:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49158:15:0;;-1:-1:-1;;;;;49158:15:0;;-1:-1:-1;49158:26:0;;-1:-1:-1;49185:2:0;49189:21;49185:2;49189:17;:21::i;:::-;49158:53;;-1:-1:-1;;;;;;49158:53:0;;;;;;;-1:-1:-1;;;;;11456:32:1;;;49158:53:0;;;11438:51:1;11505:18;;;11498:34;11411:18;;49158:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49248:15:0;;-1:-1:-1;;;;;49232:32:0;;;49248:15;;49232:32;;;;-1:-1:-1;49232:32:0;-1:-1:-1;49232:68:0;;-1:-1:-1;;;;;;49269:31:0;;;;;;:25;:31;;;;;;;;49268:32;49232:68;:88;;;;-1:-1:-1;49310:10:0;;-1:-1:-1;;;;;49304:16:0;;;49310:10;;;;;49304:16;49232:88;49228:179;;;49351:10;;49337:58;;-1:-1:-1;;;49337:58:0;;;;;24416:25:1;;;-1:-1:-1;;;;;24477:32:1;;;24457:18;;;24450:60;49351:10:0;;;;;;;;49337:44;;24389:18:1;;49337:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43148:6270;;;;;43035:6383;;;:::o;11391:226::-;11511:7;11547:12;11539:6;;;;11531:29;;;;-1:-1:-1;;;11531:29:0;;;;;;;;:::i;:::-;-1:-1:-1;11571:9:0;11583:5;11587:1;11583;:5;:::i;:::-;11571:17;11391:226;-1:-1:-1;;;;;11391:226:0:o;37607:280::-;-1:-1:-1;;;;;37690:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;37690:39:0;;;;;;;;;;;;37742:80;;37768:15;;:42;;-1:-1:-1;;;37768:42:0;;-1:-1:-1;;;;;178:32:1;;;37768:42:0;;;160:51:1;37768:15:0;;;;:36;;133:18:1;;37768:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37742:80;37839:40;;;;;;-1:-1:-1;;;;;37839:40:0;;;;;;;;37607:280;;:::o;49426:289::-;49532:14;;49492:7;;-1:-1:-1;;;49532:14:0;;;;:175;;49689:18;49699:7;49689:9;:18::i;:::-;49532:175;;;-1:-1:-1;;;;;49589:21:0;;;;;;:12;:21;;;;;;49566:103;;49647:3;;49566:54;;49589:30;;49647:3;49589:25;:30::i;:::-;49566:18;49576:7;49566:9;:18::i;12023:312::-;12143:7;12178:12;12171:5;12163:28;;;;-1:-1:-1;;;12163:28:0;;;;;;;;:::i;:::-;-1:-1:-1;12202:9:0;12214:5;12218:1;12214;:5;:::i;50211:499::-;50301:16;;;50315:1;50301:16;;;;;;;;50277:21;;50301:16;;;;;;;;;;-1:-1:-1;50301:16:0;50277:40;;50346:4;50328;50333:1;50328:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50328:23:0;;;:7;;;;;;;;;;:23;;;;50372:15;;:22;;;-1:-1:-1;;;50372:22:0;;;;:15;;;;;:20;;:22;;;;;50328:7;;50372:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50362:4;50367:1;50362:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50362:32:0;;;:7;;;;;;;;;:32;50437:15;;50405:62;;50422:4;;50437:15;50455:11;50405:8;:62::i;:::-;50478:15;;:224;;-1:-1:-1;;;50478:224:0;;-1:-1:-1;;;;;50478:15:0;;;;:66;;:224;;50559:11;;50478:15;;50629:4;;50656;;50676:15;;50478:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50266:444;50211:499;:::o;32951:327::-;-1:-1:-1;;;;;33074:34:0;;33048:4;33074:34;;;:25;:34;;;;;;;;:76;;;;-1:-1:-1;33134:15:0;;-1:-1:-1;;;;;33112:38:0;;;33134:15;;33112:38;;33074:76;33070:90;;;-1:-1:-1;33159:1:0;33152:8;;33070:90;-1:-1:-1;;;;;33189:37:0;;;;;;:25;:37;;;;;;;;33185:51;;;-1:-1:-1;33235:1:0;33228:8;;33185:51;-1:-1:-1;33269:1:0;32951:327;;;;:::o;49723:480::-;49782:12;49797:13;:6;49808:1;49797:10;:13::i;:::-;49782:28;-1:-1:-1;49821:17:0;49841:16;:6;49782:28;49841:10;:16::i;:::-;49821:36;-1:-1:-1;49893:21:0;49925:22;49942:4;49925:16;:22::i;:::-;50028:18;50049:41;:21;50075:14;50049:25;:41::i;:::-;50028:62;;50101:35;50114:9;50125:10;50101:12;:35::i;:::-;50152:43;;;25838:25:1;;;25894:2;25879:18;;25872:34;;;25922:18;;;25915:34;;;50152:43:0;;25826:2:1;25811:18;50152:43:0;;;;;;;49771:432;;;;49723:480;:::o;51380:513::-;51560:15;;51528:62;;51545:4;;-1:-1:-1;;;;;51560:15:0;51578:11;51528:8;:62::i;:::-;51633:15;;-1:-1:-1;;;;;51633:15:0;:31;51672:9;51705:4;51725:11;51633:15;;51837:7;13097:6;;-1:-1:-1;;;;;13097:6:0;;13032:79;51837:7;51633:252;;;;;;-1:-1:-1;;;;;;51633:252:0;;;-1:-1:-1;;;;;26319:15:1;;;51633:252:0;;;26301:34:1;26351:18;;;26344:34;;;;26394:18;;;26387:34;;;;26437:18;;;26430:34;26501:15;;;26480:19;;;26473:44;51859:15:0;26533:19:1;;;26526:35;26235:19;;51633:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;222:180:1:-;281:6;334:2;322:9;313:7;309:23;305:32;302:52;;;350:1;347;340:12;302:52;-1:-1:-1;373:23:1;;222:180;-1:-1:-1;222:180:1:o;407:597::-;519:4;548:2;577;566:9;559:21;609:6;603:13;652:6;647:2;636:9;632:18;625:34;677:1;687:140;701:6;698:1;695:13;687:140;;;796:14;;;792:23;;786:30;762:17;;;781:2;758:26;751:66;716:10;;687:140;;;845:6;842:1;839:13;836:91;;;915:1;910:2;901:6;890:9;886:22;882:31;875:42;836:91;-1:-1:-1;988:2:1;967:15;-1:-1:-1;;963:29:1;948:45;;;;995:2;944:54;;407:597;-1:-1:-1;;;407:597:1:o;1009:131::-;-1:-1:-1;;;;;1084:31:1;;1074:42;;1064:70;;1130:1;1127;1120:12;1145:118;1231:5;1224:13;1217:21;1210:5;1207:32;1197:60;;1253:1;1250;1243:12;1268:382;1333:6;1341;1394:2;1382:9;1373:7;1369:23;1365:32;1362:52;;;1410:1;1407;1400:12;1362:52;1449:9;1436:23;1468:31;1493:5;1468:31;:::i;:::-;1518:5;-1:-1:-1;1575:2:1;1560:18;;1547:32;1588:30;1547:32;1588:30;:::i;:::-;1637:7;1627:17;;;1268:382;;;;;:::o;1655:315::-;1723:6;1731;1784:2;1772:9;1763:7;1759:23;1755:32;1752:52;;;1800:1;1797;1790:12;1752:52;1839:9;1826:23;1858:31;1883:5;1858:31;:::i;:::-;1908:5;1960:2;1945:18;;;;1932:32;;-1:-1:-1;;;1655:315:1:o;2167:248::-;2235:6;2243;2296:2;2284:9;2275:7;2271:23;2267:32;2264:52;;;2312:1;2309;2302:12;2264:52;-1:-1:-1;;2335:23:1;;;2405:2;2390:18;;;2377:32;;-1:-1:-1;2167:248:1:o;2837:247::-;2896:6;2949:2;2937:9;2928:7;2924:23;2920:32;2917:52;;;2965:1;2962;2955:12;2917:52;3004:9;2991:23;3023:31;3048:5;3023:31;:::i;3089:127::-;3150:10;3145:3;3141:20;3138:1;3131:31;3181:4;3178:1;3171:15;3205:4;3202:1;3195:15;3221:275;3292:2;3286:9;3357:2;3338:13;;-1:-1:-1;;3334:27:1;3322:40;;3392:18;3377:34;;3413:22;;;3374:62;3371:88;;;3439:18;;:::i;:::-;3475:2;3468:22;3221:275;;-1:-1:-1;3221:275:1:o;3501:183::-;3561:4;3594:18;3586:6;3583:30;3580:56;;;3616:18;;:::i;:::-;-1:-1:-1;3661:1:1;3657:14;3673:4;3653:25;;3501:183::o;3689:662::-;3743:5;3796:3;3789:4;3781:6;3777:17;3773:27;3763:55;;3814:1;3811;3804:12;3763:55;3850:6;3837:20;3876:4;3900:60;3916:43;3956:2;3916:43;:::i;:::-;3900:60;:::i;:::-;3994:15;;;4080:1;4076:10;;;;4064:23;;4060:32;;;4025:12;;;;4104:15;;;4101:35;;;4132:1;4129;4122:12;4101:35;4168:2;4160:6;4156:15;4180:142;4196:6;4191:3;4188:15;4180:142;;;4262:17;;4250:30;;4300:12;;;;4213;;4180:142;;;-1:-1:-1;4340:5:1;3689:662;-1:-1:-1;;;;;;3689:662:1:o;4356:1215::-;4474:6;4482;4535:2;4523:9;4514:7;4510:23;4506:32;4503:52;;;4551:1;4548;4541:12;4503:52;4591:9;4578:23;4620:18;4661:2;4653:6;4650:14;4647:34;;;4677:1;4674;4667:12;4647:34;4715:6;4704:9;4700:22;4690:32;;4760:7;4753:4;4749:2;4745:13;4741:27;4731:55;;4782:1;4779;4772:12;4731:55;4818:2;4805:16;4840:4;4864:60;4880:43;4920:2;4880:43;:::i;4864:60::-;4958:15;;;5040:1;5036:10;;;;5028:19;;5024:28;;;4989:12;;;;5064:19;;;5061:39;;;5096:1;5093;5086:12;5061:39;5120:11;;;;5140:217;5156:6;5151:3;5148:15;5140:217;;;5236:3;5223:17;5253:31;5278:5;5253:31;:::i;:::-;5297:18;;5173:12;;;;5335;;;;5140:217;;;5376:5;-1:-1:-1;;5419:18:1;;5406:32;;-1:-1:-1;;5450:16:1;;;5447:36;;;5479:1;5476;5469:12;5447:36;;5502:63;5557:7;5546:8;5535:9;5531:24;5502:63;:::i;:::-;5492:73;;;4356:1215;;;;;:::o;5576:456::-;5653:6;5661;5669;5722:2;5710:9;5701:7;5697:23;5693:32;5690:52;;;5738:1;5735;5728:12;5690:52;5777:9;5764:23;5796:31;5821:5;5796:31;:::i;:::-;5846:5;-1:-1:-1;5903:2:1;5888:18;;5875:32;5916:33;5875:32;5916:33;:::i;:::-;5576:456;;5968:7;;-1:-1:-1;;;6022:2:1;6007:18;;;;5994:32;;5576:456::o;6470:241::-;6526:6;6579:2;6567:9;6558:7;6554:23;6550:32;6547:52;;;6595:1;6592;6585:12;6547:52;6634:9;6621:23;6653:28;6675:5;6653:28;:::i;6940:799::-;7080:6;7088;7096;7104;7112;7120;7128;7136;7144;7152;7205:3;7193:9;7184:7;7180:23;7176:33;7173:53;;;7222:1;7219;7212:12;7173:53;-1:-1:-1;;7245:23:1;;;7315:2;7300:18;;7287:32;;-1:-1:-1;7366:2:1;7351:18;;7338:32;;7417:2;7402:18;;7389:32;;-1:-1:-1;7468:3:1;7453:19;;7440:33;;-1:-1:-1;7520:3:1;7505:19;;7492:33;;-1:-1:-1;7572:3:1;7557:19;;7544:33;;-1:-1:-1;7624:3:1;7609:19;;7596:33;;-1:-1:-1;7676:3:1;7661:19;;7648:33;;-1:-1:-1;7728:3:1;7713:19;7700:33;;-1:-1:-1;6940:799:1;-1:-1:-1;6940:799:1:o;8559:388::-;8627:6;8635;8688:2;8676:9;8667:7;8663:23;8659:32;8656:52;;;8704:1;8701;8694:12;8656:52;8743:9;8730:23;8762:31;8787:5;8762:31;:::i;:::-;8812:5;-1:-1:-1;8869:2:1;8854:18;;8841:32;8882:33;8841:32;8882:33;:::i;8952:356::-;9154:2;9136:21;;;9173:18;;;9166:30;9232:34;9227:2;9212:18;;9205:62;9299:2;9284:18;;8952:356::o;9313:127::-;9374:10;9369:3;9365:20;9362:1;9355:31;9405:4;9402:1;9395:15;9429:4;9426:1;9419:15;9445:168;9485:7;9551:1;9547;9543:6;9539:14;9536:1;9533:21;9528:1;9521:9;9514:17;9510:45;9507:71;;;9558:18;;:::i;:::-;-1:-1:-1;9598:9:1;;9445:168::o;9618:380::-;9697:1;9693:12;;;;9740;;;9761:61;;9815:4;9807:6;9803:17;9793:27;;9761:61;9868:2;9860:6;9857:14;9837:18;9834:38;9831:161;;9914:10;9909:3;9905:20;9902:1;9895:31;9949:4;9946:1;9939:15;9977:4;9974:1;9967:15;9831:161;;9618:380;;;:::o;11124:127::-;11185:10;11180:3;11176:20;11173:1;11166:31;11216:4;11213:1;11206:15;11240:4;11237:1;11230:15;11543:135;11582:3;11603:17;;;11600:43;;11623:18;;:::i;:::-;-1:-1:-1;11670:1:1;11659:13;;11543:135::o;11683:251::-;11753:6;11806:2;11794:9;11785:7;11781:23;11777:32;11774:52;;;11822:1;11819;11812:12;11774:52;11854:9;11848:16;11873:31;11898:5;11873:31;:::i;11939:184::-;12009:6;12062:2;12050:9;12041:7;12037:23;12033:32;12030:52;;;12078:1;12075;12068:12;12030:52;-1:-1:-1;12101:16:1;;11939:184;-1:-1:-1;11939:184:1:o;12433:245::-;12500:6;12553:2;12541:9;12532:7;12528:23;12524:32;12521:52;;;12569:1;12566;12559:12;12521:52;12601:9;12595:16;12620:28;12642:5;12620:28;:::i;12683:306::-;12771:6;12779;12787;12840:2;12828:9;12819:7;12815:23;12811:32;12808:52;;;12856:1;12853;12846:12;12808:52;12885:9;12879:16;12869:26;;12935:2;12924:9;12920:18;12914:25;12904:35;;12979:2;12968:9;12964:18;12958:25;12948:35;;12683:306;;;;;:::o;16662:557::-;16775:6;16783;16791;16799;16807;16815;16868:3;16856:9;16847:7;16843:23;16839:33;16836:53;;;16885:1;16882;16875:12;16836:53;16917:9;16911:16;16936:31;16961:5;16936:31;:::i;:::-;17031:2;17016:18;;17010:25;17075:2;17060:18;;17054:25;17119:2;17104:18;;17098:25;17163:3;17148:19;;17142:26;17208:3;17193:19;;;17187:26;16986:5;;17010:25;;-1:-1:-1;17054:25:1;;17098;;-1:-1:-1;17142:26:1;-1:-1:-1;17187:26:1;;-1:-1:-1;16662:557:1;-1:-1:-1;;;16662:557:1:o;18038:217::-;18078:1;18104;18094:132;;18148:10;18143:3;18139:20;18136:1;18129:31;18183:4;18180:1;18173:15;18211:4;18208:1;18201:15;18094:132;-1:-1:-1;18240:9:1;;18038:217::o;18671:128::-;18711:3;18742:1;18738:6;18735:1;18732:13;18729:39;;;18748:18;;:::i;:::-;-1:-1:-1;18784:9:1;;18671:128::o;20914:401::-;21116:2;21098:21;;;21155:2;21135:18;;;21128:30;21194:34;21189:2;21174:18;;21167:62;-1:-1:-1;;;21260:2:1;21245:18;;21238:35;21305:3;21290:19;;20914:401::o;21320:399::-;21522:2;21504:21;;;21561:2;21541:18;;;21534:30;21600:34;21595:2;21580:18;;21573:62;-1:-1:-1;;;21666:2:1;21651:18;;21644:33;21709:3;21694:19;;21320:399::o;24521:125::-;24561:4;24589:1;24586;24583:8;24580:34;;;24594:18;;:::i;:::-;-1:-1:-1;24631:9:1;;24521:125::o;24651:980::-;24913:4;24961:3;24950:9;24946:19;24992:6;24981:9;24974:25;25018:2;25056:6;25051:2;25040:9;25036:18;25029:34;25099:3;25094:2;25083:9;25079:18;25072:31;25123:6;25158;25152:13;25189:6;25181;25174:22;25227:3;25216:9;25212:19;25205:26;;25266:2;25258:6;25254:15;25240:29;;25287:1;25297:195;25311:6;25308:1;25305:13;25297:195;;;25376:13;;-1:-1:-1;;;;;25372:39:1;25360:52;;25467:15;;;;25432:12;;;;25408:1;25326:9;25297:195;;;-1:-1:-1;;;;;;;25548:32:1;;;;25543:2;25528:18;;25521:60;-1:-1:-1;;;25612:3:1;25597:19;25590:35;25509:3;24651:980;-1:-1:-1;;;24651:980:1:o

Swarm Source

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