Token Arbi Wiz

 

Overview ERC20

Price
$0.00 @ 0.000000 ETH
Fully Diluted Market Cap
Total Supply:
100,000,000 Awiz

Holders:
209 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

Wizswap is a decentralized exchange.


Update? Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Arbiwiz

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/*
Arbi Wiz

Liquidity 2% 💹
Rewards 1% 💰
Marketing 2% 🧑‍💻

Telegram: https://t.me/wizardbridge
Website: https://wizardbridge.com

**/

// 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 Arbiwiz 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;

    AwizDividendTracker 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 = 1000000;

    // 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
    uint256 private gasPriceLimit = 7 * 1 gwei; 
    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("Arbi Wiz", "Awiz") {
        marketingWallet = payable(0x18e3D8D94B14fd43415d5C434D6c32AE567306cA);
        devWallet = payable(0x18e3D8D94B14fd43415d5C434D6c32AE567306cA);
        address router = 0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506;

        buyDeadFees = 0;
        sellDeadFees = 0;
        buyMarketingFees = 2;
        sellMarketingFees = 2;
        buyLiquidityFee = 2;
        sellLiquidityFee = 2;
        buyRewardsFee = 2;
        sellRewardsFee = 2;
        buyDevFee = 0;
        sellDevFee = 0;
        transferFee = 0;

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

        dividendTracker = new AwizDividendTracker(
            payable(this),
            router,
            0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8,
            "AWIZTRACKER",
            "AWIZTRACKER"
        );

        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(DEAD);
        dividendTracker.excludedFromDividends(address(0));
        dividendTracker.excludeFromDividends(router);

        // 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;

        uint256 totalTokenSupply = (1_00_000_000) * (10**18);
        _mint(owner(), totalTokenSupply); // only time internal mint function is ever called is to create supply
        maxWallet = 2000000; // 2%
        swapTokensAtAmount = totalTokenSupply / 1000; // 0.1%;
        canTransferBeforeTradingIsEnabled[owner()] = true;
        canTransferBeforeTradingIsEnabled[address(marketingWallet)] = 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 setDexRouter(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 max GWEI
    function setGasPriceLimit(uint256 GWEI) external onlyOwner {
        require(GWEI >= 5, "can never be set below 5");
        gasPriceLimit = GWEI * 1 gwei;
    }

    // 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(tx.gasprice <= gasPriceLimit,"Gas price exceeds limit.");
                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 = 0;
                sellAmount = 0;
                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 AwizDividendTracker 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; // USDC
    bool public allowCustomTokens;
    bool public allowAutoReinvest;
    bool public dividendsPaused = false;

    string private trackerName;
    string private trackerTicker;

    IUniswapV2Router02 public uniswapV2Router;

    Arbiwiz public ArbiwizContract;

    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;
        ArbiwizContract = Arbiwiz(mainContract);
        minimumTokenBalanceForAutoDividends = 100000000_000000000000000000; // 100M 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, "Awiz_Dividend_Tracker: No transfers allowed");
    }

    function withdrawDividend() public pure override {
        require(
            false,
            "Awiz_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main 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(ArbiwizContract);

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

            // make the swap
            try
                uniswapV2Router
                    .swapExactETHForTokensSupportingFeeOnTransferTokens{
                    value: _withdrawableDividend
                }(
                    0, // accept any amount of Tokens
                    path,
                    address(this),
                    block.timestamp
                )
            {
                uint256 received = ArbiwizContract
                    .balanceOf(address(this))
                    .sub(prevBalance);
                if (received > 0) {
                    success = true;
                    ArbiwizContract.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 AwizDividendTracker","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":"address","name":"_router","type":"address"}],"name":"setDexRouter","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":"uint256","name":"GWEI","type":"uint256"}],"name":"setGasPriceLimit","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":"_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"}]

608060405260088054600162ffff0160a01b03191661dead17905560016009819055600a819055601d805460ff199081168317909155620f4240601e556025805490911690911790556401a13b8600602655603c602a553480156200006357600080fd5b506040518060400160405280600881526020016720b93134902bb4bd60c11b8152506040518060400160405280600481526020016320bbb4bd60e11b8152508160039081620000b3919062000a16565b506004620000c2828262000a16565b5050506000620000d76200072460201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600e80547318e3d8d94b14fd43415d5c434d6c32ae567306ca6001600160a01b03199182168117909255600f805490911690911790556000601681905560138190556002601781905560148190556018819055601581905560198190556012819055601a829055601b829055601c829055731b02da8cb0d097eb8d57a175b88c7d8b4799750691620001df91620001cb9081818062000728602090811b62002d9017901c565b6200072860201b62002d901790919060201c565b600c8190555062000211601b54620001cb601454620001cb6015546012546200072860201b62002d901790919060201c565b600b81905550308173ff970a61a04b1ca14834a43f5de4533ebddb5cc86040516200023c9062000964565b6001600160a01b0393841681529183166020830152909116604082015260a060608201819052600b9082018190526a20aba4ad2a2920a1a5a2a960a91b60c0830181905260e06080840181905283019190915261010082015261012001604051809103906000f080158015620002b6573d6000803e3d6000fd5b50600d80546001600160a01b039283166001600160a01b0319918216179091556006805492841692909116821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000321573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000347919062000ae2565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003aa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003d0919062000ae2565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200041e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000444919062000ae2565b600780546001600160a01b0319166001600160a01b039290921691821790556200047090600162000798565b600d5460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b158015620004b757600080fd5b505af1158015620004cc573d6000803e3d6000fd5b5050600d5460085460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b1580156200051a57600080fd5b505af11580156200052f573d6000803e3d6000fd5b5050600d54604051634e7b827f60e01b8152600060048201526001600160a01b039091169250634e7b827f9150602401602060405180830381865afa1580156200057d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005a3919062000b0d565b50600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015620005ec57600080fd5b505af115801562000601573d6000803e3d6000fd5b5050306000908152601f60205260408082208054600160ff199182168117909255600d546001600160a01b0390811685528385208054831684179055600e54811685528385208054831684179055600f541684529190922080549091169091179055506a52b7d2dcc80cd2e4000000905062000690620006896005546001600160a01b031690565b8262000863565b621e8480601055620006a56103e88262000b31565b601155600160246000620006c16005546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055600e54909116815260248352818120805485166001908117909155338252602c9093522080549092161790555062000b769050565b3390565b60008062000737838562000b54565b9050838110156200078f5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b90505b92915050565b6001600160a01b03821660009081526020805260409020805460ff191682158015919091179091556200082757600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200080d57600080fd5b505af115801562000822573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b038216620008bb5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000786565b620008d7816002546200072860201b62002d901790919060201c565b6002556001600160a01b038216600090815260208181526040909120546200090a91839062002d9062000728821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b613084806200570383390190565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200099d57607f821691505b602082108103620009be57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200095f57600081815260208120601f850160051c81016020861015620009ed5750805b601f850160051c820191505b8181101562000a0e57828155600101620009f9565b505050505050565b81516001600160401b0381111562000a325762000a3262000972565b62000a4a8162000a43845462000988565b84620009c4565b602080601f83116001811462000a82576000841562000a695750858301515b600019600386901b1c1916600185901b17855562000a0e565b600085815260208120601f198616915b8281101562000ab35788860151825594840194600190910190840162000a92565b508582101562000ad25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000af557600080fd5b81516001600160a01b03811681146200078f57600080fd5b60006020828403121562000b2057600080fd5b815180151581146200078f57600080fd5b60008262000b4f57634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156200079257634e487b7160e01b600052601160045260246000fd5b614b7d8062000b866000396000f3fe6080604052600436106105065760003560e01c80637d32f34211610297578063aa4704f311610165578063dd62ed3e116100cc578063f2fde38b11610085578063f2fde38b14611007578063f5d3c79a14611027578063f637434214611047578063f72f863b1461105d578063f8b45b051461107d578063fc6b151c1461109357600080fd5b8063dd62ed3e14610f33578063e2f4560514610f79578063e7841ec014610f8f578063f11a24d314610fa4578063f1c0ddff14610fba578063f27fd25414610fe757600080fd5b8063ba079d491161011e578063ba079d4914610e88578063bb8d513114610ea8578063d07a091c14610ebe578063d5e3725114610ede578063d7b837dd14610efe578063d8032ed314610f1357600080fd5b8063aa4704f314610d5e578063acb2ad6f14610db6578063ad56c13c14610dcc578063b494298814610e23578063b62496f514610e39578063b74e3b1114610e6857600080fd5b80639a7a23d611610209578063a0d82dc5116101c2578063a0d82dc514610ca8578063a457c2d714610cbe578063a694fc3a14610cde578063a8b9d24014610cfe578063a9059cbb14610d1e578063a9885de514610d3e57600080fd5b80639a7a23d614610bfc5780639c1b8af514610c1c5780639c3372ea14610c325780639c3b4fdc14610c525780639cefc1da14610c685780639ec1037e14610c8857600080fd5b8063871c128d1161025b578063871c128d14610b5d5780638ca2923a14610b7d5780638da5cb5b14610b935780638ea5220f14610bb157806395451c2914610bd157806395d89b4114610be757600080fd5b80637d32f34214610ab05780637fdde05c14610add578063837ae2d014610afd5780638577a6d514610b1d578063868730c714610b3d57600080fd5b806349bd5a5e116103d457806364b0f65311610346578063715018a6116102ff578063715018a614610a0b57806372d8edf414610a2057806375829def14610a4057806375f0a87414610a6057806377a3b60914610a805780637928dd1d14610a9657600080fd5b806364b0f65314610956578063679ca6e91461096b5780636843cd841461098b5780636d48467b146109ab578063700bb191146109cb57806370a08231146109eb57600080fd5b80634fbee193116103985780634fbee193146108915780635124f874146108ca5780635a84c5eb146108e05780635c234bb6146109005780635ebf4db9146109165780635eee4bae1461093657600080fd5b806349bd5a5e146108075780634a62bb65146108275780634a74bb02146108415780634ada218b1461085b5780634e71d92d1461087c57600080fd5b806321cbb02411610478578063313ce56711610431578063313ce567146107485780633599bb171461076457806339509351146107845780633f407b84146107a457806340ffdd80146107ba578063435c89e4146107da57600080fd5b806321cbb0241461068e5780632307b441146106be57806323b872dd146106de57806325cd3598146106fe5780632c1f52161461071357806330bb4cff1461073357600080fd5b8063095ea7b3116104ca578063095ea7b3146105d35780630ef35b7e146106035780631694505e1461062357806318160ddd146106435780631d7b1fb4146106625780631fa705311461067857600080fd5b806303fd2a451461051257806305ca5f081461054f57806306fdde031461057157806308dfe8a51461059357806309231602146105b357600080fd5b3661050d57005b600080fd5b34801561051e57600080fd5b50600854610532906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561055b57600080fd5b5061056f61056a36600461443a565b6110b3565b005b34801561057d57600080fd5b50610586611184565b6040516105469190614453565b34801561059f57600080fd5b5061056f6105ae3660046144c4565b611216565b3480156105bf57600080fd5b5061056f6105ce36600461443a565b61129f565b3480156105df57600080fd5b506105f36105ee3660046144fd565b61132e565b6040519015158152602001610546565b34801561060f57600080fd5b5061056f61061e366004614529565b611345565b34801561062f57600080fd5b50600654610532906001600160a01b031681565b34801561064f57600080fd5b506002545b604051908152602001610546565b34801561066e57600080fd5b50610654602a5481565b34801561068457600080fd5b50610654600a5481565b34801561069a57600080fd5b506105f36106a936600461454b565b602c6020526000908152604090205460ff1681565b3480156106ca57600080fd5b5061056f6106d936600461463e565b61142a565b3480156106ea57600080fd5b506105f36106f9366004614700565b6115fb565b34801561070a57600080fd5b50610532611664565b34801561071f57600080fd5b50600d54610532906001600160a01b031681565b34801561073f57600080fd5b506106546116d7565b34801561075457600080fd5b5060405160128152602001610546565b34801561077057600080fd5b5061056f61077f366004614741565b611745565b34801561079057600080fd5b506105f361079f3660046144fd565b6117d2565b3480156107b057600080fd5b5061065460095481565b3480156107c657600080fd5b5061056f6107d5366004614741565b611808565b3480156107e657600080fd5b506106546107f536600461443a565b60236020526000908152604090205481565b34801561081357600080fd5b50600754610532906001600160a01b031681565b34801561083357600080fd5b506025546105f39060ff1681565b34801561084d57600080fd5b50601d546105f39060ff1681565b34801561086757600080fd5b506008546105f390600160b01b900460ff1681565b34801561088857600080fd5b5061056f611863565b34801561089d57600080fd5b506105f36108ac36600461454b565b6001600160a01b03166000908152601f602052604090205460ff1690565b3480156108d657600080fd5b5061065460175481565b3480156108ec57600080fd5b5061056f6108fb36600461443a565b6118db565b34801561090c57600080fd5b5061065460165481565b34801561092257600080fd5b5061056f61093136600461443a565b611936565b34801561094257600080fd5b5061056f61095136600461443a565b611991565b34801561096257600080fd5b506106546119d3565b34801561097757600080fd5b5061056f610986366004614741565b611a1d565b34801561099757600080fd5b506106546109a636600461454b565b611a5a565b3480156109b757600080fd5b506105f36109c636600461454b565b611aca565b3480156109d757600080fd5b5061056f6109e636600461443a565b611b3a565b3480156109f757600080fd5b50610654610a0636600461454b565b611c0c565b348015610a1757600080fd5b5061056f611c27565b348015610a2c57600080fd5b5061056f610a3b36600461454b565b611c9b565b348015610a4c57600080fd5b5061056f610a5b36600461454b565b611cf7565b348015610a6c57600080fd5b50600e54610532906001600160a01b031681565b348015610a8c57600080fd5b5061065460195481565b348015610aa257600080fd5b50602b546105f39060ff1681565b348015610abc57600080fd5b50610654610acb36600461454b565b60226020526000908152604090205481565b348015610ae957600080fd5b5061056f610af83660046144c4565b611dac565b348015610b0957600080fd5b5061056f610b1836600461475e565b611e01565b348015610b2957600080fd5b5061056f610b3836600461443a565b611fab565b348015610b4957600080fd5b5061056f610b58366004614741565b612062565b348015610b6957600080fd5b5061056f610b7836600461443a565b61209a565b348015610b8957600080fd5b5061065460135481565b348015610b9f57600080fd5b506005546001600160a01b0316610532565b348015610bbd57600080fd5b50600f54610532906001600160a01b031681565b348015610bdd57600080fd5b5061065460145481565b348015610bf357600080fd5b50610586612116565b348015610c0857600080fd5b5061056f610c173660046144c4565b612125565b348015610c2857600080fd5b50610654601e5481565b348015610c3e57600080fd5b5061056f610c4d366004614741565b61215d565b348015610c5e57600080fd5b50610654601a5481565b348015610c7457600080fd5b5061056f610c83366004614741565b6121b9565b348015610c9457600080fd5b5061056f610ca336600461454b565b61224f565b348015610cb457600080fd5b50610654601b5481565b348015610cca57600080fd5b506105f3610cd93660046144fd565b612326565b348015610cea57600080fd5b5061056f610cf936600461443a565b612375565b348015610d0a57600080fd5b50610654610d1936600461454b565b612598565b348015610d2a57600080fd5b506105f3610d393660046144fd565b6125cb565b348015610d4a57600080fd5b5061056f610d593660046144c4565b6125d8565b348015610d6a57600080fd5b50610da1610d7936600461454b565b6001600160a01b03166000908152602260209081526040808320546021909252909120549091565b60408051928352602083019190915201610546565b348015610dc257600080fd5b50610654601c5481565b348015610dd857600080fd5b50610dec610de736600461454b565b61262d565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610546565b348015610e2f57600080fd5b5061065460295481565b348015610e4557600080fd5b506105f3610e5436600461454b565b602080526000908152604090205460ff1681565b348015610e7457600080fd5b5061056f610e8336600461443a565b6126bd565b348015610e9457600080fd5b506105f3610ea336600461454b565b61274d565b348015610eb457600080fd5b5061065460125481565b348015610eca57600080fd5b5061056f610ed936600461454b565b612780565b348015610eea57600080fd5b5061056f610ef9366004614741565b612875565b348015610f0a57600080fd5b5061056f6128f7565b348015610f1f57600080fd5b5061056f610f2e36600461454b565b612940565b348015610f3f57600080fd5b50610654610f4e3660046147c6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610f8557600080fd5b5061065460115481565b348015610f9b57600080fd5b50610654612a03565b348015610fb057600080fd5b5061065460185481565b348015610fc657600080fd5b50610654610fd536600461454b565b60216020526000908152604090205481565b348015610ff357600080fd5b50610dec61100236600461443a565b612a4d565b34801561101357600080fd5b5061056f61102236600461454b565b612a8b565b34801561103357600080fd5b5061056f611042366004614741565b612b76565b34801561105357600080fd5b5061065460155481565b34801561106957600080fd5b5061056f61107836600461454b565b612bae565b34801561108957600080fd5b5061065460105481565b34801561109f57600080fd5b5061056f6110ae36600461443a565b612cdb565b6005546001600160a01b031633146110e65760405162461bcd60e51b81526004016110dd906147f4565b60405180910390fd5b6110f881670de0b6b3a764000061483f565b90506000611113600954600a54612d9090919063ffffffff16565b9050600061113682611130600a5486612df690919063ffffffff16565b90612e78565b905060006111538361113060095487612df690919063ffffffff16565b905061115e84612eba565b600a5461116b90836131ba565b600a5560095461117b90826131ba565b60095550505050565b60606003805461119390614856565b80601f01602080910402602001604051908101604052809291908181526020018280546111bf90614856565b801561120c5780601f106111e15761010080835404028352916020019161120c565b820191906000526020600020905b8154815290600101906020018083116111ef57829003601f168201915b5050505050905090565b6005546001600160a01b031633146112405760405162461bcd60e51b81526004016110dd906147f4565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146112c95760405162461bcd60e51b81526004016110dd906147f4565b600581101561131a5760405162461bcd60e51b815260206004820152601860248201527f63616e206e65766572206265207365742062656c6f772035000000000000000060448201526064016110dd565b61132881633b9aca0061483f565b60265550565b600061133b3384846131fc565b5060015b92915050565b6005546001600160a01b0316331461136f5760405162461bcd60e51b81526004016110dd906147f4565b60008281526023602052604090205481900361138a57600080fd5b60648111156113db5760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e6720626f6e75732063616e27742065786365656420313030000060448201526064016110dd565b60008281526023602090815260409182902083905581518481529081018390527f065c0eec5c5d031ee25323575d53db5536226ab058b74d8bdb03c517dd4f605d910160405180910390a15050565b6005546001600160a01b031633146114545760405162461bcd60e51b81526004016110dd906147f4565b80518251146114a55760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e677468000060448201526064016110dd565b60c8825111156115025760405162461bcd60e51b815260206004820152602260248201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d2032604482015261030360f41b60648201526084016110dd565b60005b82518110156115f657600083828151811061152257611522614890565b60200260200101519050600083838151811061154057611540614890565b6020026020010151670de0b6b3a764000061155b919061483f565b9050611568338383613321565b600d546001600160a01b031663e30443bc8361158381611c0c565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156115c957600080fd5b505af11580156115dd573d6000803e3d6000fd5b50505050505080806115ee906148a6565b915050611505565b505050565b600061160884848461342a565b61165a843361165585604051806060016040528060288152602001614afb602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190613f8f565b6131fc565b5060019392505050565b600d54604080516304b9a6b360e31b815290516000926001600160a01b0316916325cd35989160048083019260209291908290030181865afa1580156116ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d291906148bf565b905090565b600d54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611721573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d291906148dc565b6005546001600160a01b0316331461176f5760405162461bcd60e51b81526004016110dd906147f4565b600d54604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b1580156117b757600080fd5b505af11580156117cb573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161133b9185906116559086612d90565b6005546001600160a01b031633146118325760405162461bcd60e51b81526004016110dd906147f4565b600d546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd809060240161179d565b600d5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af11580156118b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d891906148f5565b50565b6005546001600160a01b031633146119055760405162461bcd60e51b81526004016110dd906147f4565b600d54604051635a84c5eb60e01b8152600481018390526001600160a01b0390911690635a84c5eb9060240161179d565b6005546001600160a01b031633146119605760405162461bcd60e51b81526004016110dd906147f4565b600d54604051635ebf4db960e01b8152600481018390526001600160a01b0390911690635ebf4db99060240161179d565b6005546001600160a01b031633146119bb5760405162461bcd60e51b81526004016110dd906147f4565b6119cd81670de0b6b3a764000061483f565b60115550565b600d54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611721573d6000803e3d6000fd5b6005546001600160a01b03163314611a475760405162461bcd60e51b81526004016110dd906147f4565b6025805460ff1916911515919091179055565b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611aa6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133f91906148dc565b600d54604051636d48467b60e01b81526001600160a01b0383811660048301526000921690636d48467b906024015b602060405180830381865afa158015611b16573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133f91906148f5565b600d546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611b8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb19190614912565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314611c515760405162461bcd60e51b81526004016110dd906147f4565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314611cc55760405162461bcd60e51b81526004016110dd906147f4565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db09060240161179d565b6005546001600160a01b03163314611d215760405162461bcd60e51b81526004016110dd906147f4565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015611d6857600080fd5b505af1158015611d7c573d6000803e3d6000fd5b5050506001600160a01b0382166000908152601f60205260409020805460ff19166001179055506118d881612a8b565b6005546001600160a01b03163314611dd65760405162461bcd60e51b81526004016110dd906147f4565b6001600160a01b03919091166000908152602460205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611e2b5760405162461bcd60e51b81526004016110dd906147f4565b60168a90556017889055601886905560198490556013899055601487905560158590556012839055601a829055601b819055611e7381611e6d8981878a612d90565b90612d90565b600b81905550611e9c601a54611e6d601754611e6d601854601954612d9090919063ffffffff16565b600c55600b54600f10801590611eb55750600f600c5411155b611f125760405162461bcd60e51b815260206004820152602860248201527f746f74616c20666565732063616e6e6f7420657863656564203135252073656c6044820152676c206f722062757960c01b60648201526084016110dd565b601354601454601554601254601654601754601854601954601a54601b54604080519a8b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c085015260e08401526101008301526101208201527f07cec4532bdb36ce729ae72905c09f7bfbf8682c2cc2f1999f745188d9975122906101400160405180910390a150505050505050505050565b6005546001600160a01b03163314611fd55760405162461bcd60e51b81526004016110dd906147f4565b60058111156120265760405162461bcd60e51b815260206004820152601d60248201527f7472616e73666572206665652063616e6e6f742065786365656420352500000060448201526064016110dd565b601c8190556040518181527f6fbeac6c79c640ca4f5f47271bd7a36c7eb83076224c65a3b3378c8844720343906020015b60405180910390a150565b600d54604051638bc1d63960e01b815233600482015282151560248201526001600160a01b0390911690638bc1d6399060440161179d565b6005546001600160a01b031633146120c45760405162461bcd60e51b81526004016110dd906147f4565b62030d4081101580156120da5750620f42408111155b6120e357600080fd5b601e5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601e55565b60606004805461119390614856565b6005546001600160a01b0316331461214f5760405162461bcd60e51b81526004016110dd906147f4565b6121598282613fc9565b5050565b6005546001600160a01b031633146121875760405162461bcd60e51b81526004016110dd906147f4565b600d54604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea9060240161179d565b6005546001600160a01b031633146121e35760405162461bcd60e51b81526004016110dd906147f4565b801515600860159054906101000a900460ff1615150361220257600080fd5b60088054821515600160a81b0260ff60a81b199091161790556040517f0d240c24014ec8c204fc1bdcc286f7d01fd2ab6a07c558a9b2d3f12904323a879061205790831515815260200190565b6005546001600160a01b031633146122795760405162461bcd60e51b81526004016110dd906147f4565b600d54604051630928847160e01b81526001600160a01b03838116600483015290911690630928847190602401600060405180830381600087803b1580156122c057600080fd5b505af11580156122d4573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc9050826122f581614091565b6040516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482015260440161179d565b600061133b338461165585604051806060016040528060258152602001614b23602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190613f8f565b600854600160a81b900460ff166123c75760405162461bcd60e51b815260206004820152601660248201527514dd185ada5b99c81a5cc81b9bdd08195b98589b195960521b60448201526064016110dd565b60008181526023602052604081205490036124245760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207374616b696e67206475726174696f6e000000000000000060448201526064016110dd565b61242e4282612d90565b33600090815260226020526040902054106124975760405162461bcd60e51b8152602060048201526024808201527f616c7265616479207374616b656420666f722061206c6f6e67657220647572616044820152633a34b7b760e11b60648201526084016110dd565b6000818152602360209081526040808320543384526021909252909120556124bf4282612d90565b33600081815260226020526040902091909155600d546001600160a01b03169063e30443bc906124ee81614091565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561253457600080fd5b505af1158015612548573d6000803e3d6000fd5b505050506125533390565b6001600160a01b03167f13dd201d7da4f9b31a9064a09abc1a6ce420dacd837a77abafaec5bd9d28d2c88260405161258d91815260200190565b60405180910390a250565b600d546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611a89565b600061133b33848461342a565b6005546001600160a01b031633146126025760405162461bcd60e51b81526004016110dd906147f4565b6001600160a01b03919091166000908152602c60205260409020805460ff1916911515919091179055565b600d5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283929091169063fbcbc0f1906024015b60c060405180830381865afa158015612685573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a99190614940565b949c939b5091995097509550909350915050565b6005546001600160a01b031633146126e75760405162461bcd60e51b81526004016110dd906147f4565b61012c8111156127485760405162461bcd60e51b815260206004820152602660248201527f636f6f6c646f776e2074696d65722063616e6e6f74206578636565642035206d604482015265696e7574657360d01b60648201526084016110dd565b602a55565b600d5460405163ba079d4960e01b81526001600160a01b038381166004830152600092169063ba079d4990602401611af9565b6005546001600160a01b031633146127aa5760405162461bcd60e51b81526004016110dd906147f4565b6001600160a01b0381811660008181526024602081815260408084208054600160ff199182168117909255601f9093529381902080549092169093179055600d54915163031e79db60e41b815260048101939093529216916331e79db09101600060405180830381600087803b15801561282357600080fd5b505af1158015612837573d6000803e3d6000fd5b50506040516001600160a01b03841681527f85d097e432d8e396fa72c83ebd34196326e1cf1694ef910cd53554b2ee7597c592506020019050612057565b6005546001600160a01b0316331461289f5760405162461bcd60e51b81526004016110dd906147f4565b601d5481151560ff9091161515036128b657600080fd5b601d805460ff19168215159081179091556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef90602001612057565b6005546001600160a01b031633146129215760405162461bcd60e51b81526004016110dd906147f4565b602b5460ff161561293157600080fd5b602b805460ff19166001179055565b6005546001600160a01b0316331461296a5760405162461bcd60e51b81526004016110dd906147f4565b600d5460405163d8032ed360e01b81526001600160a01b0383811660048301529091169063d8032ed390602401600060405180830381600087803b1580156129b157600080fd5b505af11580156129c5573d6000803e3d6000fd5b50506040516001600160a01b03841681527f7597aa09105646b4cc4486748aecd1d7c5dbcbb7bbe2863c3fc27e613b64432d92506020019050612057565b600d546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611721573d6000803e3d6000fd5b600d54604051635183d6fd60e01b815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd90602401612668565b6005546001600160a01b03163314612ab55760405162461bcd60e51b81526004016110dd906147f4565b6001600160a01b038116612b1a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016110dd565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600d54604051632c8be28160e21b815233600482015282151560248201526001600160a01b039091169063b22f8a049060440161179d565b6005546001600160a01b03163314612bd85760405162461bcd60e51b81526004016110dd906147f4565b602b8054610100600160a81b0319166101006001600160a01b0384169081029190911790915515612c98576001600160a01b038181166000818152602c602090815260408083208054600160ff199182168117909255601f9093529281902080549092169092179055600d54905163031e79db60e41b81526004810192909252909116906331e79db090602401600060405180830381600087803b158015612c7f57600080fd5b505af1158015612c93573d6000803e3d6000fd5b505050505b436029556008805460ff60b01b1916600160b01b1790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150565b6005546001600160a01b03163314612d055760405162461bcd60e51b81526004016110dd906147f4565b612d1781670de0b6b3a764000061483f565b90506103e8600254612d299190614993565b811015612d8b5760405162461bcd60e51b815260206004820152602a60248201527f6d61782077616c6c65742063616e6e6f742062652073657420746f206c657373604482015269207468616e20302e312560b01b60648201526084016110dd565b601055565b600080612d9d83856149b5565b905083811015612def5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016110dd565b9392505050565b600082600003612e085750600061133f565b6000612e14838561483f565b905082612e218583614993565b14612def5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016110dd565b6000612def83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506140ea565b80600003612ec55750565b612ece81614118565b6000612ee7600954600a54612d9090919063ffffffff16565b601954909150600190819081906000908190819015612f4857612f45601a54601754601954612f1691906149b5565b612f2091906149b5565b611130601954612f3f8b611130600a5447612df690919063ffffffff16565b90612df6565b91505b60125415612f9257612f8f601b54601454601254612f6691906149b5565b612f7091906149b5565b611130601254612f3f8b61113060095447612df690919063ffffffff16565b90505b612f9c8282612d90565b92508215612ffc57600d546040516001600160a01b03909116908490600081818185875af1925050503d8060008114612ff1576040519150601f19603f3d011682016040523d82523d6000602084013e612ff6565b606091505b50909650505b6000613015601a54601754612d9090919063ffffffff16565b601b5460145461302491612d90565b61302e91906149b5565b905060008115613045576130424783612e78565b90505b60008161305f601454601754612d9090919063ffffffff16565b613069919061483f565b9050600082613085601b54601a54612d9090919063ffffffff16565b61308f919061483f565b905081156130ef57600e546040516001600160a01b03909116908390600081818185875af1925050503d80600081146130e4576040519150601f19603f3d011682016040523d82523d6000602084013e6130e9565b606091505b50909950505b801561314d57600f546040516001600160a01b03909116908290600081818185875af1925050503d8060008114613142576040519150601f19603f3d011682016040523d82523d6000602084013e613147565b606091505b50909850505b7f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd08761317983856149b5565b8c801561318357508b5b801561318c57508a5b60408051938452602084019290925215159082015260600160405180910390a1505050505050505050505050565b6000612def83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613f8f565b6001600160a01b03831661325e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016110dd565b6001600160a01b0382166132bf5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016110dd565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166133475760405162461bcd60e51b81526004016110dd906149c8565b6001600160a01b03821661336d5760405162461bcd60e51b81526004016110dd90614a0d565b6133aa81604051806060016040528060268152602001614ad5602691396001600160a01b0386166000908152602081905260409020549190613f8f565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546133d99082612d90565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101613314565b6001600160a01b0383166134505760405162461bcd60e51b81526004016110dd906149c8565b6001600160a01b0382166134765760405162461bcd60e51b81526004016110dd90614a0d565b6001600160a01b038316600090815260246020526040812054819081908190819060ff166134f757600854600160b01b900460ff166134f75760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c656460448201526064016110dd565b602b5460ff161580156135195750602b5461010090046001600160a01b031615155b156135b0576135288888614272565b158061354c57506001600160a01b0388166000908152602c602052604090205460ff165b8061356f57506001600160a01b0387166000908152602c602052604090205460ff165b6135b05760405162461bcd60e51b815260206004820152601260248201527121617661696c61626c652074726164696e6760701b60448201526064016110dd565b856000036135ce576135c488886000613321565b5050505050505050565b600854600160a01b900460ff1615801561360157506001600160a01b0388166000908152601f602052604090205460ff16155b801561362657506001600160a01b0387166000908152601f602052604090205460ff16155b15613dc0576001600160a01b03808816600090815260208052604080822054928b16825290205460ff918216911680158015613660575081155b156137a65760006136816064611130601c548c612df690919063ffffffff16565b905061368d89826131ba565b985061369a8b3083613321565b6136a58b8b8b613321565b600d546001600160a01b031663e30443bc8c6136c081614091565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561370657600080fd5b505af115801561371a573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc90508b61373b81614091565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561378157600080fd5b505af1158015613795573d6000803e3d6000fd5b505050505050505050505050505050565b801580156137bd5750600854600160a81b900460ff165b15613874576001600160a01b038a1660009081526022602052604090205442101561382a5760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e7320617265207374616b656420616e64206c6f636b65642100000060448201526064016110dd565b6001600160a01b038a166000908152602260205260409020541561386f576001600160a01b038a16600090815260226020908152604080832083905560219091528120555b613acd565b811561391d57601254601354601454601554601b54602554949b509299509097509550935060ff161561386f57602a54326000908152602860205260409020546138be91906149b5565b4210156139065760405162461bcd60e51b8152602060048201526016602482015275636f6f6c646f776e20706572696f642061637469766560501b60448201526064016110dd565b326000908152602860205260409020429055613acd565b8015613acd57601954601654601754601854601a54602554949b509299509097509550935060ff1615613a56576029546139589060026149b5565b431161399b5760405162461bcd60e51b8152602060048201526012602482015271796f75207368616c6c206e6f74207061737360701b60448201526064016110dd565b6026543a11156139ed5760405162461bcd60e51b815260206004820152601860248201527f4761732070726963652065786365656473206c696d69742e000000000000000060448201526064016110dd565b32600090815260276020526040902054439003613a435760405162461bcd60e51b8152602060048201526014602482015273546f6f206d616e7920545820696e20626c6f636b60601b60448201526064016110dd565b3260009081526027602052604090204390555b6000613a618a611c0c565b601054909150613a718a836149b5565b1115613acb5760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b60648201526084016110dd565b505b6000613aee84613add88886149b5565b613ae791906149b5565b8990612d90565b90506000613afb30611c0c565b60115490915081108015908190613b2a57506001600160a01b038d16600090815260208052604090205460ff16155b15613c43576008805460ff60a01b1916600160a01b179055601d5460ff168015613b545750600087115b8015613b6257506000600c54115b15613c14576000613b80600954600a54612d9090919063ffffffff16565b90506000613b9d82611130600a5487612df690919063ffffffff16565b90506000613bba8361113060095488612df690919063ffffffff16565b90506000613bd7600c546111308d86612df690919063ffffffff16565b90506000613bf4600b546111308e86612df690919063ffffffff16565b90506000613c028284612d90565b9050613c0d816142e5565b5050505050505b6000613c1f30611c0c565b9050613c2a81612eba565b506000600a8190556009556008805460ff60a01b191690555b6000613c5460646111308e87612df6565b905060008a15613ca7576064613c6a8e8d612df6565b613c749190614993565b9050613c968f600860009054906101000a90046001600160a01b031683613321565b600254613ca390826131ba565b6002555b613cbb613cb482846149b5565b8e906131ba565b9c508615613cd857600954613cd09083612d90565b600955613ce9565b600a54613ce59083612d90565b600a555b613cf48f3084613321565b601e54600d546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015613d61575060408051601f3d908101601f19168201909252613d5e91810190614912565b60015b15613db75760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b50505050505050505b613dcb888888613321565b600d546001600160a01b031663e30443bc89613de681614091565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613e2c57600080fd5b505af1158015613e40573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc905088613e6181614091565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613ea757600080fd5b505af1158015613ebb573d6000803e3d6000fd5b50506006546001600160a01b038b8116911614801592509050613ef657506001600160a01b038816600090815260208052604090205460ff16155b8015613f145750602b546001600160a01b0388811661010090920416145b156135c457602b54604051633fb6b04560e11b8152600481018890526001600160a01b038a8116602483015261010090920490911690637f6d608a90604401600060405180830381600087803b158015613f6d57600080fd5b505af1158015613f81573d6000803e3d6000fd5b505050505050505050505050565b60008184841115613fb35760405162461bcd60e51b81526004016110dd9190614453565b506000613fc08486614a50565b95945050505050565b6001600160a01b03821660009081526020805260409020805460ff1916821580159190911790915561405557600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801561403c57600080fd5b505af1158015614050573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600854600090600160a81b900460ff166140b3576140ae82611c0c565b61133f565b6001600160a01b03821660009081526021602052604090205461133f90606490611130906140e19083612d90565b612f3f86611c0c565b6000818361410b5760405162461bcd60e51b81526004016110dd9190614453565b506000613fc08486614993565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061414d5761414d614890565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156141a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141ca91906148bf565b816001815181106141dd576141dd614890565b6001600160a01b03928316602091820292909201015260065461420391309116846131fc565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac9479061423c908590600090869030904290600401614a63565b600060405180830381600087803b15801561425657600080fd5b505af115801561426a573d6000803e3d6000fd5b505050505050565b6001600160a01b038216600090815260208052604081205460ff1680156142a757506006546001600160a01b03838116911614155b156142b45750600161133f565b6001600160a01b038216600090815260208052604090205460ff16156142dc5750600261133f565b50600092915050565b60006142f2826002612e78565b9050600061430083836131ba565b90504761430c83614118565b600061431847836131ba565b9050614324838261436c565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b6006546143849030906001600160a01b0316846131fc565b6006546001600160a01b031663f305d7198230856000806143ad6005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015614415573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117cb9190614912565b60006020828403121561444c57600080fd5b5035919050565b600060208083528351808285015260005b8181101561448057858101830151858201604001528201614464565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146118d857600080fd5b80151581146118d857600080fd5b600080604083850312156144d757600080fd5b82356144e2816144a1565b915060208301356144f2816144b6565b809150509250929050565b6000806040838503121561451057600080fd5b823561451b816144a1565b946020939093013593505050565b6000806040838503121561453c57600080fd5b50508035926020909101359150565b60006020828403121561455d57600080fd5b8135612def816144a1565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156145a7576145a7614568565b604052919050565b600067ffffffffffffffff8211156145c9576145c9614568565b5060051b60200190565b600082601f8301126145e457600080fd5b813560206145f96145f4836145af565b61457e565b82815260059290921b8401810191818101908684111561461857600080fd5b8286015b84811015614633578035835291830191830161461c565b509695505050505050565b6000806040838503121561465157600080fd5b823567ffffffffffffffff8082111561466957600080fd5b818501915085601f83011261467d57600080fd5b8135602061468d6145f4836145af565b82815260059290921b840181019181810190898411156146ac57600080fd5b948201945b838610156146d35785356146c4816144a1565b825294820194908201906146b1565b965050860135925050808211156146e957600080fd5b506146f6858286016145d3565b9150509250929050565b60008060006060848603121561471557600080fd5b8335614720816144a1565b92506020840135614730816144a1565b929592945050506040919091013590565b60006020828403121561475357600080fd5b8135612def816144b6565b6000806000806000806000806000806101408b8d03121561477e57600080fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b600080604083850312156147d957600080fd5b82356147e4816144a1565b915060208301356144f2816144a1565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761133f5761133f614829565b600181811c9082168061486a57607f821691505b60208210810361488a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000600182016148b8576148b8614829565b5060010190565b6000602082840312156148d157600080fd5b8151612def816144a1565b6000602082840312156148ee57600080fd5b5051919050565b60006020828403121561490757600080fd5b8151612def816144b6565b60008060006060848603121561492757600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c0878903121561495957600080fd5b8651614964816144a1565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b6000826149b057634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561133f5761133f614829565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b8181038181111561133f5761133f614829565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015614ab35784516001600160a01b031683529383019391830191600101614a8e565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220a3dc852c6fa9a010061410cbad24cd605201ae7d68faa9a39a5546a13721935064736f6c6343000811003360806040526012805460ff60b01b191690553480156200001e57600080fd5b50604051620030843803806200308483398101604081905262000041916200023b565b81818181600362000053838262000375565b50600462000062828262000375565b50505050506000620000796200015960201b60201c565b600980546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506013620000d5838262000375565b506014620000e4828262000375565b505060128054601680546001600160a01b03199081166001600160a01b03988916179091556a52b7d2dcc80cd2e400000060188190556019556015805490911695871695909517909455600160a01b929094166001600160a81b0319909316929092171760ff60a81b19169091555062000441565b3390565b6001600160a01b03811681146200017357600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200019e57600080fd5b81516001600160401b0380821115620001bb57620001bb62000176565b604051601f8301601f19908116603f01168101908282118183101715620001e657620001e662000176565b816040528381526020925086838588010111156200020357600080fd5b600091505b8382101562000227578582018301518183018401529082019062000208565b600093810190920192909252949350505050565b600080600080600060a086880312156200025457600080fd5b855162000261816200015d565b602087015190955062000274816200015d565b604087015190945062000287816200015d565b60608701519093506001600160401b0380821115620002a557600080fd5b620002b389838a016200018c565b93506080880151915080821115620002ca57600080fd5b50620002d9888289016200018c565b9150509295509295909350565b600181811c90821680620002fb57607f821691505b6020821081036200031c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200037057600081815260208120601f850160051c810160208610156200034b5750805b601f850160051c820191505b818110156200036c5782815560010162000357565b5050505b505050565b81516001600160401b0381111562000391576200039162000176565b620003a981620003a28454620002e6565b8462000322565b602080601f831160018114620003e15760008415620003c85750858301515b600019600386901b1c1916600185901b1785556200036c565b600085815260208120601f198616915b828110156200041257888601518255948401946001909101908401620003f1565b5085821015620004315787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612c3380620004516000396000f3fe60806040526004361061031e5760003560e01c80636b69163b116101ab578063a457c2d7116100f7578063d8032ed311610095578063e7841ec01161006f578063e7841ec0146109ed578063f2fde38b14610a02578063fbcbc0f114610a22578063ffb2c47914610a4257600080fd5b8063d8032ed314610967578063dd62ed3e14610987578063e30443bc146109cd57600080fd5b8063aafd847a116100d1578063aafd847a146108d1578063b22f8a0414610907578063ba079d4914610927578063bc4c4b371461094757600080fd5b8063a457c2d714610871578063a8b9d24014610891578063a9059cbb146108b157600080fd5b80638bc1d6391161016457806395d89b411161013e57806395d89b41146107fa5780639c3372ea1461080f5780639eec101e1461082f578063a42340691461085057600080fd5b80638bc1d6391461079c5780638da5cb5b146107bc57806391b89fba146107da57600080fd5b80636b69163b146106cb5780636d48467b146106fb57806370a082311461071b578063715018a61461075157806374c13fda1461076657806385a6b3ae1461078657600080fd5b80633009a6091161026a57806341808904116102235780635a84c5eb116101fd5780635a84c5eb146106565780635ebf4db91461067657806365b8dbc0146106965780636a474002146106b657600080fd5b806341808904146105ae5780634e7b827f146105cf5780635183d6fd146105ff57600080fd5b80633009a609146104fc578063313ce5671461051257806331e79db01461052e5780633599bb171461054e578063395093511461056e57806340ffdd801461058e57600080fd5b806318160ddd116102d7578063226cfa3d116102b1578063226cfa3d1461047157806323b872dd1461049e57806325cd3598146104be57806327ce0147146104dc57600080fd5b806318160ddd1461040c5780631b79ac0f146104215780631d4ff89a1461044157600080fd5b806303c833021461033257806306fdde031461033a5780630928847114610365578063095ea7b31461038557806309bbedde146103b55780631694505e146103d457600080fd5b3661032d5761032b610a7d565b005b600080fd5b61032b610a7d565b34801561034657600080fd5b5061034f610b10565b60405161035c91906127af565b60405180910390f35b34801561037157600080fd5b5061032b610380366004612815565b610ba2565b34801561039157600080fd5b506103a56103a0366004612832565b610bf6565b604051901515815260200161035c565b3480156103c157600080fd5b50600a545b60405190815260200161035c565b3480156103e057600080fd5b506015546103f4906001600160a01b031681565b6040516001600160a01b03909116815260200161035c565b34801561041857600080fd5b506002546103c6565b34801561042d57600080fd5b506016546103f4906001600160a01b031681565b34801561044d57600080fd5b506103a561045c366004612815565b60116020526000908152604090205460ff1681565b34801561047d57600080fd5b506103c661048c366004612815565b60176020526000908152604090205481565b3480156104aa57600080fd5b506103a56104b936600461285e565b610c0d565b3480156104ca57600080fd5b506012546001600160a01b03166103f4565b3480156104e857600080fd5b506103c66104f7366004612815565b610c76565b34801561050857600080fd5b506103c6600e5481565b34801561051e57600080fd5b506040516012815260200161035c565b34801561053a57600080fd5b5061032b610549366004612815565b610cd2565b34801561055a57600080fd5b5061032b6105693660046128ad565b610d6c565b34801561057a57600080fd5b506103a5610589366004612832565b610e0d565b34801561059a57600080fd5b5061032b6105a93660046128ad565b610e43565b3480156105ba57600080fd5b506012546103a590600160a81b900460ff1681565b3480156105db57600080fd5b506103a56105ea366004612815565b600f6020526000908152604090205460ff1681565b34801561060b57600080fd5b5061061f61061a3660046128ca565b610ed9565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c00161035c565b34801561066257600080fd5b5061032b6106713660046128ca565b610f39565b34801561068257600080fd5b5061032b6106913660046128ca565b610f7b565b3480156106a257600080fd5b5061032b6106b1366004612815565b610fbd565b3480156106c257600080fd5b5061032b611009565b3480156106d757600080fd5b506103a56106e6366004612815565b60106020526000908152604090205460ff1681565b34801561070757600080fd5b506103a5610716366004612815565b61109d565b34801561072757600080fd5b506103c6610736366004612815565b6001600160a01b031660009081526020819052604090205490565b34801561075d57600080fd5b5061032b6110e9565b34801561077257600080fd5b506012546103f4906001600160a01b031681565b34801561079257600080fd5b506103c660085481565b3480156107a857600080fd5b5061032b6107b73660046128e3565b61115d565b3480156107c857600080fd5b506009546001600160a01b03166103f4565b3480156107e657600080fd5b506103c66107f5366004612815565b6111b2565b34801561080657600080fd5b5061034f6111bd565b34801561081b57600080fd5b5061032b61082a3660046128ad565b6111cc565b34801561083b57600080fd5b506012546103a590600160a01b900460ff1681565b34801561085c57600080fd5b506012546103a590600160b01b900460ff1681565b34801561087d57600080fd5b506103a561088c366004612832565b611262565b34801561089d57600080fd5b506103c66108ac366004612815565b6112b1565b3480156108bd57600080fd5b506103a56108cc366004612832565b6112dd565b3480156108dd57600080fd5b506103c66108ec366004612815565b6001600160a01b031660009081526007602052604090205490565b34801561091357600080fd5b5061032b6109223660046128e3565b6112ea565b34801561093357600080fd5b506103a5610942366004612815565b61133f565b34801561095357600080fd5b506103a56109623660046128e3565b61138b565b34801561097357600080fd5b5061032b610982366004612815565b61150c565b34801561099357600080fd5b506103c66109a236600461291c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156109d957600080fd5b5061032b6109e8366004612832565b611558565b3480156109f957600080fd5b50600e546103c6565b348015610a0e57600080fd5b5061032b610a1d366004612815565b6115f0565b348015610a2e57600080fd5b5061061f610a3d366004612815565b6116db565b348015610a4e57600080fd5b50610a62610a5d3660046128ca565b61178a565b6040805193845260208401929092529082015260600161035c565b6000610a8860025490565b11610a9257600080fd5b3415610b0e57610ac5610aa460025490565b610ab234600160801b6118b0565b610abc9190612960565b60055490611939565b60055560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600854610b0a9034611939565b6008555b565b606060138054610b1f90612982565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4b90612982565b8015610b985780601f10610b6d57610100808354040283529160200191610b98565b820191906000526020600020905b815481529060010190602001808311610b7b57829003601f168201915b5050505050905090565b6009546001600160a01b03163314610bd55760405162461bcd60e51b8152600401610bcc906129bc565b60405180910390fd5b6001600160a01b03166000908152600f60205260409020805460ff19169055565b6000610c03338484611998565b5060015b92915050565b6000610c1a848484611abc565b610c6c8433610c6785604051806060016040528060288152602001612bb1602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611b1d565b611998565b5060019392505050565b6001600160a01b03811660009081526006602090815260408083205491839052822054600554600160801b92610cc892610cc392610cbd91610cb891906118b0565b611b57565b90611b67565b611ba5565b610c079190612960565b6009546001600160a01b03163314610cfc5760405162461bcd60e51b8152600401610bcc906129bc565b6001600160a01b0381166000908152600f60205260408120805460ff19166001179055610d2a908290611bb8565b610d35600a82611c17565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b6009546001600160a01b03163314610d965760405162461bcd60e51b8152600401610bcc906129bc565b801515601260169054906101000a900460ff16151503610db557600080fd5b60128054821515600160b01b0260ff60b01b199091161790556040517f3da2593f2c4724acfbd754045321e852cad26f3974834b1890045530f89c21b390610e0290831515815260200190565b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c03918590610c679086611939565b6009546001600160a01b03163314610e6d5760405162461bcd60e51b8152600401610bcc906129bc565b801515601260159054906101000a900460ff16151503610e8c57600080fd5b60128054821515600160a81b0260ff60a81b199091161790556040517fc138a28750b971696f46ea59731c471ef1e08e4015404afdb139fd2e87dca1bb90610e0290831515815260200190565b600080600080600080610eeb600a5490565b8710610f0a575060009450600019935083925084915081905080610f30565b6000610f17600a89611d52565b9050610f22816116db565b965096509650965096509650505b91939550919395565b6009546001600160a01b03163314610f635760405162461bcd60e51b8152600401610bcc906129bc565b610f7581670de0b6b3a76400006129f1565b60185550565b6009546001600160a01b03163314610fa55760405162461bcd60e51b8152600401610bcc906129bc565b610fb781670de0b6b3a76400006129f1565b60195550565b6009546001600160a01b03163314610fe75760405162461bcd60e51b8152600401610bcc906129bc565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b60405162461bcd60e51b815260206004820152606060248201527f4177697a5f4469766964656e645f547261636b65723a2077697468647261774460448201527f69766964656e642064697361626c65642e20557365207468652027636c61696d60648201527f272066756e6374696f6e206f6e20746865206d61696e20636f6e74726163742e608482015260a401610bcc565b6009546000906001600160a01b031633146110ca5760405162461bcd60e51b8152600401610bcc906129bc565b506001600160a01b031660009081526010602052604090205460ff1690565b6009546001600160a01b031633146111135760405162461bcd60e51b8152600401610bcc906129bc565b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b6009546001600160a01b031633146111875760405162461bcd60e51b8152600401610bcc906129bc565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6000610c07826112b1565b606060148054610b1f90612982565b6009546001600160a01b031633146111f65760405162461bcd60e51b8152600401610bcc906129bc565b801515601260149054906101000a900460ff1615150361121557600080fd5b60128054821515600160a01b0260ff60a01b199091161790556040517f8d34c313963017194ed726d050e868657d0e2d2c6748d13e358cd4b89d4ee7c890610e0290831515815260200190565b6000610c033384610c6785604051806060016040528060258152602001612bd9602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611b1d565b6001600160a01b038116600090815260076020526040812054610c07906112d784610c76565b90611d85565b6000610c03338484611abc565b6009546001600160a01b031633146113145760405162461bcd60e51b8152600401610bcc906129bc565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6009546000906001600160a01b0316331461136c5760405162461bcd60e51b8152600401610bcc906129bc565b506001600160a01b031660009081526011602052604090205460ff1690565b6009546000906001600160a01b031633146113b85760405162461bcd60e51b8152600401610bcc906129bc565b601254600160b01b900460ff16156113d257506000610c07565b6001600160a01b03831660009081526011602052604090205460ff168280156113f85750805b801561140e5750601254600160a81b900460ff16155b1561141d576000915050610c07565b6000816114325761142d85611dc7565b61143b565b61143b85612080565b90508015611501576001600160a01b038516600090815260176020526040902042905581156114af57831515856001600160a01b03167ffbd928dd3806a2bdf802f3a28a2cc55205f95dbcd2c3ed313abfca278366f80c836040516114a291815260200190565b60405180910390a36114f6565b831515856001600160a01b03167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092836040516114ed91815260200190565b60405180910390a35b600192505050610c07565b506000949350505050565b6009546001600160a01b031633146115365760405162461bcd60e51b8152600401610bcc906129bc565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b031633146115825760405162461bcd60e51b8152600401610bcc906129bc565b6001600160a01b0382166000908152600f602052604090205460ff166115c2576019548110156115c6576115b7600a83611c17565b6115c2826000611bb8565b5050565b6115d08282611bb8565b60185481106115e5576115c2600a83836123f3565b6115c2600a83611c17565b6009546001600160a01b0316331461161a5760405162461bcd60e51b8152600401610bcc906129bc565b6001600160a01b03811661167f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bcc565b6009546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b806000808080806116ed600a8761249c565b945060001993506000851261174f57600e5485111561171b57600e546117149086906124e7565b935061174f565b600e54600a546000911061173057600061173f565b600e54600a5461173f91611d85565b905061174b8682611b67565b9450505b611758866112b1565b925061176386610c76565b6001600160a01b038716600090815260176020526040902054969895975093959294915050565b600a54600090819081908015806117aa5750601254600160b01b900460ff165b156117c0575050600e54600092508291506118a9565b600e546000805a90506000805b89841080156117db57508582105b1561189857846117ea81612a08565b9550508585106117f957600094505b6000600a600001868154811061181157611811612a21565b60009182526020808320909101546001600160a01b0316808352601090915260409091205490915060ff1661185e5761184b81600161138b565b1561185e578161185a81612a08565b9250505b8261186881612a08565b93505060005a90508085111561188f5761188c6118858683611d85565b8790611939565b95505b93506117cd9050565b600e85905590975095509193505050505b9193909250565b6000826000036118c257506000610c07565b60006118ce83856129f1565b9050826118db8583612960565b146119325760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610bcc565b9392505050565b6000806119468385612a37565b9050838110156119325760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610bcc565b6001600160a01b0383166119fa5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610bcc565b6001600160a01b038216611a5b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610bcc565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602b60248201527f4177697a5f4469766964656e645f547261636b65723a204e6f207472616e736660448201526a195c9cc8185b1b1bddd95960aa1b6064820152608401610bcc565b505050565b60008184841115611b415760405162461bcd60e51b8152600401610bcc91906127af565b506000611b4e8486612a4a565b95945050505050565b60008181811215610c0757600080fd5b600080611b748385612a5d565b905060008312158015611b875750838112155b80611b9c5750600083128015611b9c57508381125b61193257600080fd5b600080821215611bb457600080fd5b5090565b6001600160a01b03821660009081526020819052604090205480821115611bf7576000611be58383611d85565b9050611bf18482612524565b50505050565b80821015611b18576000611c0b8284611d85565b9050611bf18482612588565b6001600160a01b038116600090815260038301602052604090205460ff16611c3d575050565b6001600160a01b03811660009081526003830160209081526040808320805460ff1916905560018086018352818420849055600286019092528220548454909291611c8791612a4a565b90506000846000018281548110611ca057611ca0612a21565b60009182526020808320909101546001600160a01b03908116808452600289019092526040808420879055908716835282209190915585549091508190869085908110611cef57611cef612a21565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790558454859080611d2957611d29612a85565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b6000826000018281548110611d6957611d69612a21565b6000918252602090912001546001600160a01b03169392505050565b600061193283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b1d565b600080611dd3836112b1565b90508015612077576001600160a01b038316600090815260076020526040902054611dfe9082611939565b6001600160a01b03808516600090815260076020526040812092909255601254169081611e83576040516001600160a01b03861690610bb89085906000818181858888f193505050503d8060008114611e73576040519150601f19603f3d011682016040523d82523d6000602084013e611e78565b606091505b505080915050611fdd565b6040805160028082526060820183526000926020830190803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611eed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f119190612a9b565b81600081518110611f2457611f24612a21565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611f5857611f58612a21565b6001600160a01b03928316602091820292909201015260155460405163b6f9de9560e01b815291169063b6f9de95908690611f9e9060009086908c904290600401612afc565b6000604051808303818588803b158015611fb757600080fd5b505af193505050508015611fc9575060015b611fd65760009150611fdb565b600191505b505b8061202b576001600160a01b0385166000908152600760205260409020546120059084611d85565b6001600160a01b0390951660009081526007602052604081209590955550929392505050565b846001600160a01b03167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d8460405161206691815260200190565b60405180910390a250909392505050565b50600092915050565b60008061208c836112b1565b90508015612077576001600160a01b0383166000908152600760205260408120546120b79083611939565b6001600160a01b03851660009081526007602052604080822092909255815160028082526060820190935290918160200160208202803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa15801561213f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121639190612a9b565b8160008151811061217657612176612a21565b6001600160a01b0392831660209182029290920101526016548251911690829060019081106121a7576121a7612a21565b6001600160a01b0392831660209182029290920101526016546040516370a0823160e01b815230600482015260009291909116906370a0823190602401602060405180830381865afa158015612201573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122259190612b31565b60155460405163b6f9de9560e01b81529192506001600160a01b03169063b6f9de9590869061225f90600090879030904290600401612afc565b6000604051808303818588803b15801561227857600080fd5b505af19350505050801561228a575060015b612297576000925061239a565b6016546040516370a0823160e01b815230600482015260009161230a9184916001600160a01b0316906370a0823190602401602060405180830381865afa1580156122e6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d79190612b31565b905080156123935760165460405163a9059cbb60e01b81526001600160a01b03898116600483015260248201849052600196509091169063a9059cbb906044016020604051808303816000875af1158015612369573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238d9190612b4a565b50612398565b600093505b505b826123e9576001600160a01b0386166000908152600760205260409020546123c29085611d85565b6001600160a01b039096166000908152600760205260408120969096555093949350505050565b5091949350505050565b6001600160a01b038216600090815260038401602052604090205460ff1615612438576001600160a01b03821660009081526001840160205260409020819055505050565b6001600160a01b03821660008181526003850160209081526040808320805460ff19166001908117909155878101835281842086905587546002890184529184208290558101875586835291200180546001600160a01b0319169091179055505050565b6001600160a01b038116600090815260038301602052604081205460ff166124c75750600019610c07565b506001600160a01b03166000908152600291909101602052604090205490565b6000806124f48385612b67565b9050600083121580156125075750838113155b80611b9c5750600083128015611b9c575083811361193257600080fd5b61252e82826125cc565b612568612549610cb8836005546118b090919063ffffffff16565b6001600160a01b038416600090815260066020526040902054906124e7565b6001600160a01b0390921660009081526006602052604090209190915550565b61259282826126ab565b6125686125ad610cb8836005546118b090919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611b67565b6001600160a01b0382166126225760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610bcc565b60025461262f9082611939565b6002556001600160a01b0382166000908152602081905260409020546126559082611939565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b03821661270b5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610bcc565b61274881604051806060016040528060228152602001612b8f602291396001600160a01b0385166000908152602081905260409020549190611b1d565b6001600160a01b03831660009081526020819052604090205560025461276e9082611d85565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161269f565b600060208083528351808285015260005b818110156127dc578581018301518582016040015282016127c0565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461281257600080fd5b50565b60006020828403121561282757600080fd5b8135611932816127fd565b6000806040838503121561284557600080fd5b8235612850816127fd565b946020939093013593505050565b60008060006060848603121561287357600080fd5b833561287e816127fd565b9250602084013561288e816127fd565b929592945050506040919091013590565b801515811461281257600080fd5b6000602082840312156128bf57600080fd5b81356119328161289f565b6000602082840312156128dc57600080fd5b5035919050565b600080604083850312156128f657600080fd5b8235612901816127fd565b915060208301356129118161289f565b809150509250929050565b6000806040838503121561292f57600080fd5b823561293a816127fd565b91506020830135612911816127fd565b634e487b7160e01b600052601160045260246000fd5b60008261297d57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061299657607f821691505b6020821081036129b657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8082028115828204841417610c0757610c0761294a565b600060018201612a1a57612a1a61294a565b5060010190565b634e487b7160e01b600052603260045260246000fd5b80820180821115610c0757610c0761294a565b81810381811115610c0757610c0761294a565b8082018281126000831280158216821582161715612a7d57612a7d61294a565b505092915050565b634e487b7160e01b600052603160045260246000fd5b600060208284031215612aad57600080fd5b8151611932816127fd565b600081518084526020808501945080840160005b83811015612af15781516001600160a01b031687529582019590820190600101612acc565b509495945050505050565b848152608060208201526000612b156080830186612ab8565b6001600160a01b03949094166040830152506060015292915050565b600060208284031215612b4357600080fd5b5051919050565b600060208284031215612b5c57600080fd5b81516119328161289f565b8181036000831280158383131683831282161715612b8757612b8761294a565b509291505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e0aa0173fece5e45a8cb8f683e62aadc32a1776298df19028c8dfe6b6df4c4ca64736f6c63430008110033

Deployed ByteCode Sourcemap

25572:29429:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25734:64;;;;;;;;;;-1:-1:-1;25734:64:0;;;;-1:-1:-1;;;;;25734:64:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;25734:64:0;;;;;;;;51907:443;;;;;;;;;;-1:-1:-1;51907:443:0;;;;;:::i;:::-;;:::i;:::-;;5749:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;34152:181::-;;;;;;;;;;-1:-1:-1;34152:181:0;;;;;:::i;:::-;;:::i;35147:164::-;;;;;;;;;;-1:-1:-1;35147:164:0;;;;;:::i;:::-;;:::i;6804:210::-;;;;;;;;;;-1:-1:-1;6804:210:0;;;;;:::i;:::-;;:::i;:::-;;;2091:14:1;;2084:22;2066:41;;2054:2;2039:18;6804:210:0;1926:187:1;32352:326:0;;;;;;;;;;-1:-1:-1;32352:326:0;;;;;:::i;:::-;;:::i;25649:41::-;;;;;;;;;;-1:-1:-1;25649:41:0;;;;-1:-1:-1;;;;;25649:41:0;;;6070:108;;;;;;;;;;-1:-1:-1;6158:12:0;;6070:108;;;2752:25:1;;;2740:2;2725:18;6070:108:0;2606:177:1;27792:33:0;;;;;;;;;;;;;;;;25954:28;;;;;;;;;;;;;;;;27921:55;;;;;;;;;;-1:-1:-1;27921:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;54361:637;;;;;;;;;;-1:-1:-1;54361:637:0;;;;;:::i;:::-;;:::i;7022:454::-;;;;;;;;;;-1:-1:-1;7022:454:0;;;;;:::i;:::-;;:::i;50890:114::-;;;;;;;;;;;;;:::i;26064:42::-;;;;;;;;;;-1:-1:-1;26064:42:0;;;;-1:-1:-1;;;;;26064:42:0;;;40160:141;;;;;;;;;;;;;:::i;32214:93::-;;;;;;;;;;-1:-1:-1;32214:93:0;;32297:2;6374:36:1;;6362:2;6347:18;32214:93:0;6232:184:1;42503:119:0;;;;;;;;;;-1:-1:-1;42503:119:0;;;;;:::i;:::-;;:::i;7484:300::-;;;;;;;;;;-1:-1:-1;7484:300:0;;;;;:::i;:::-;;:::i;25918:29::-;;;;;;;;;;;;;;;;37401:121;;;;;;;;;;-1:-1:-1;37401:121:0;;;;;:::i;:::-;;:::i;27179:49::-;;;;;;;;;;-1:-1:-1;27179:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;25699:28;;;;;;;;;;-1:-1:-1;25699:28:0;;;;-1:-1:-1;;;;;25699:28:0;;;27441:33;;;;;;;;;;-1:-1:-1;27441:33:0;;;;;;;;26713:40;;;;;;;;;;-1:-1:-1;26713:40:0;;;;;;;;25875:34;;;;;;;;;;-1:-1:-1;25875:34:0;;;;-1:-1:-1;;;25875:34:0;;;;;;41872:103;;;;;;;;;;;;;:::i;40309:126::-;;;;;;;;;;-1:-1:-1;40309:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;40399:28:0;40375:4;40399:28;;;:19;:28;;;;;;;;;40309:126;26505:31;;;;;;;;;;;;;;;;51012:183;;;;;;;;;;-1:-1:-1;51012:183:0;;;;;:::i;:::-;;:::i;26472:26::-;;;;;;;;;;;;;;;;51203:175;;;;;;;;;;-1:-1:-1;51203:175:0;;;;;:::i;:::-;;:::i;36757:120::-;;;;;;;;;;-1:-1:-1;36757:120:0;;;;;:::i;:::-;;:::i;42121:142::-;;;;;;;;;;;;;:::i;35019:99::-;;;;;;;;;;-1:-1:-1;35019:99:0;;;;;:::i;:::-;;:::i;40635:171::-;;;;;;;;;;-1:-1:-1;40635:171:0;;;;;:::i;:::-;;:::i;42630:185::-;;;;;;;;;;-1:-1:-1;42630:185:0;;;;;:::i;:::-;;:::i;41454:410::-;;;;;;;;;;-1:-1:-1;41454:410:0;;;;;:::i;:::-;;:::i;6186:177::-;;;;;;;;;;-1:-1:-1;6186:177:0;;;;;:::i;:::-;;:::i;13163:148::-;;;;;;;;;;;;;:::i;34382:127::-;;;;;;;;;;-1:-1:-1;34382:127:0;;;;;:::i;:::-;;:::i;38067:208::-;;;;;;;;;;-1:-1:-1;38067:208:0;;;;;:::i;:::-;;:::i;26115:38::-;;;;;;;;;;-1:-1:-1;26115:38:0;;;;-1:-1:-1;;;;;26115:38:0;;;26580:28;;;;;;;;;;;;;;;;27857:32;;;;;;;;;;-1:-1:-1;27857:32:0;;;;;;;;27121:51;;;;;;;;;;-1:-1:-1;27121:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;34810:170;;;;;;;;;;-1:-1:-1;34810:170:0;;;;;:::i;:::-;;:::i;38525:1429::-;;;;;;;;;;-1:-1:-1;38525:1429:0;;;;;:::i;:::-;;:::i;38283:234::-;;;;;;;;;;-1:-1:-1;38283:234:0;;;;;:::i;:::-;;:::i;42271:109::-;;;;;;;;;;-1:-1:-1;42271:109:0;;;;;:::i;:::-;;:::i;37818:241::-;;;;;;;;;;-1:-1:-1;37818:241:0;;;;;:::i;:::-;;:::i;26361:27::-;;;;;;;;;;;;;;;;12949:79;;;;;;;;;;-1:-1:-1;13014:6:0;;-1:-1:-1;;;;;13014:6:0;12949:79;;26160:32;;;;;;;;;;-1:-1:-1;26160:32:0;;;;-1:-1:-1;;;;;26160:32:0;;;26395;;;;;;;;;;;;;;;;5857:104;;;;;;;;;;;;;:::i;37101:163::-;;;;;;;;;;-1:-1:-1;37101:163:0;;;;;:::i;:::-;;:::i;26811:41::-;;;;;;;;;;;;;;;;37272:121;;;;;;;;;;-1:-1:-1;37272:121:0;;;;;:::i;:::-;;:::i;26615:24::-;;;;;;;;;;;;;;;;35877:176;;;;;;;;;;-1:-1:-1;35877:176:0;;;;;:::i;:::-;;:::i;34547:201::-;;;;;;;;;;-1:-1:-1;34547:201:0;;;;;:::i;:::-;;:::i;26646:25::-;;;;;;;;;;;;;;;;7792:400;;;;;;;;;;-1:-1:-1;7792:400:0;;;;;:::i;:::-;;:::i;36061:662::-;;;;;;;;;;-1:-1:-1;36061:662:0;;;;;:::i;:::-;;:::i;40443:184::-;;;;;;;;;;-1:-1:-1;40443:184:0;;;;;:::i;:::-;;:::i;6371:216::-;;;;;;;;;;-1:-1:-1;6371:216:0;;;;;:::i;:::-;;:::i;33029:143::-;;;;;;;;;;-1:-1:-1;33029:143:0;;;;;:::i;:::-;;:::i;39962:190::-;;;;;;;;;;-1:-1:-1;39962:190:0;;;;;:::i;:::-;-1:-1:-1;;;;;40095:25:0;40053:7;40095:25;;;:16;:25;;;;;;;;;40122:12;:21;;;;;;;40095:25;;39962:190;;;;;7869:25:1;;;7925:2;7910:18;;7903:34;;;;7842:18;39962:190:0;7695:248:1;26678:26:0;;;;;;;;;;;;;;;;40814:307;;;;;;;;;;-1:-1:-1;40814:307:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;8249:32:1;;;8231:51;;8313:2;8298:18;;8291:34;;;;8341:18;;;8334:34;;;;8399:2;8384:18;;8377:34;8442:3;8427:19;;8420:35;8269:3;8471:19;;8464:35;8218:3;8203:19;40814:307:0;7948:557:1;27759:26:0;;;;;;;;;;;;;;;;26975:57;;;;;;;;;;-1:-1:-1;26975:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;35398:174;;;;;;;;;;-1:-1:-1;35398:174:0;;;;;:::i;:::-;;:::i;42823:127::-;;;;;;;;;;-1:-1:-1;42823:127:0;;;;;:::i;:::-;;:::i;26325:29::-;;;;;;;;;;;;;;;;33836:268;;;;;;;;;;-1:-1:-1;33836:268:0;;;;;:::i;:::-;;:::i;36885:208::-;;;;;;;;;;-1:-1:-1;36885:208:0;;;;;:::i;:::-;;:::i;33188:146::-;;;;;;;;;;;;;:::i;50724:158::-;;;;;;;;;;-1:-1:-1;50724:158:0;;;;;:::i;:::-;;:::i;6595:201::-;;;;;;;;;;-1:-1:-1;6595:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;6761:18:0;;;6729:7;6761:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;6595:201;26285:33;;;;;;;;;;;;;;;;41983:130;;;;;;;;;;;;;:::i;26543:30::-;;;;;;;;;;;;;;;;27067:47;;;;;;;;;;-1:-1:-1;27067:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;41129:317;;;;;;;;;;-1:-1:-1;41129:317:0;;;;;:::i;:::-;;:::i;13319:281::-;;;;;;;;;;-1:-1:-1;13319:281:0;;;;;:::i;:::-;;:::i;42388:107::-;;;;;;;;;;-1:-1:-1;42388:107:0;;;;;:::i;:::-;;:::i;26434:31::-;;;;;;;;;;;;;;;;33350:415;;;;;;;;;;-1:-1:-1;33350:415:0;;;;;:::i;:::-;;:::i;26254:24::-;;;;;;;;;;;;;;;;35642:221;;;;;;;;;;-1:-1:-1;35642:221:0;;;;;:::i;:::-;;:::i;51907:443::-;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;;;;;;;;;51995:17:::1;:6:::0;52005::::1;51995:17;:::i;:::-;51986:26;;52023:19;52045:25;52059:10;;52045:9;;:13;;:25;;;;:::i;:::-;52023:47;;52081:15;52099:38;52125:11;52099:21;52110:9;;52099:6;:10;;:21;;;;:::i;:::-;:25:::0;::::1;:38::i;:::-;52081:56;;52148:16;52167:39;52194:11;52167:22;52178:10;;52167:6;:10;;:22;;;;:::i;:39::-;52148:58;;52219:28;52240:6;52219:20;:28::i;:::-;52272:9;::::0;:22:::1;::::0;52286:7;52272:13:::1;:22::i;:::-;52260:9;:34:::0;52318:10:::1;::::0;:24:::1;::::0;52333:8;52318:14:::1;:24::i;:::-;52305:10;:37:::0;-1:-1:-1;;;;51907:443:0:o;5749:100::-;5803:13;5836:5;5829:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5749:100;:::o;34152:181::-;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34236:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;34236:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;34291:34;;2066:41:1;;;34291:34:0::1;::::0;2039:18:1;34291:34:0::1;;;;;;;34152:181:::0;;:::o;35147:164::-;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;35233:1:::1;35225:4;:9;;35217:46;;;::::0;-1:-1:-1;;;35217:46:0;;10156:2:1;35217:46:0::1;::::0;::::1;10138:21:1::0;10195:2;10175:18;;;10168:30;10234:26;10214:18;;;10207:54;10278:18;;35217:46:0::1;9954:348:1::0;35217:46:0::1;35290:13;:4:::0;35297:6:::1;35290:13;:::i;:::-;35274;:29:::0;-1:-1:-1;35147:164:0:o;6804:210::-;6923:4;6945:39;335:10;6968:7;6977:6;6945:8;:39::i;:::-;-1:-1:-1;7002:4:0;6804:210;;;;;:::o;32352:326::-;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;32474:24:::1;::::0;;;:14:::1;:24;::::0;;;;;:33;;;32466:42:::1;;;::::0;::::1;;32536:3;32527:5;:12;;32519:55;;;::::0;-1:-1:-1;;;32519:55:0;;10509:2:1;32519:55:0::1;::::0;::::1;10491:21:1::0;10548:2;10528:18;;;10521:30;10587:32;10567:18;;;10560:60;10637:18;;32519:55:0::1;10307:354:1::0;32519:55:0::1;32585:24;::::0;;;:14:::1;:24;::::0;;;;;;;;:32;;;32633:37;;7869:25:1;;;7910:18;;;7903:34;;;32633:37:0::1;::::0;7842:18:1;32633:37:0::1;;;;;;;32352:326:::0;;:::o;54361:637::-;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;54533:6:::1;:13;54508:14;:21;:38;54500:80;;;::::0;-1:-1:-1;;;54500:80:0;;10868:2:1;54500:80:0::1;::::0;::::1;10850:21:1::0;10907:2;10887:18;;;10880:30;10946:32;10926:18;;;10919:60;10996:18;;54500:80:0::1;10666:354:1::0;54500:80:0::1;54624:3;54599:14;:21;:28;;54591:75;;;::::0;-1:-1:-1;;;54591:75:0;;11227:2:1;54591:75:0::1;::::0;::::1;11209:21:1::0;11266:2;11246:18;;;11239:30;11305:34;11285:18;;;11278:62;-1:-1:-1;;;11356:18:1;;;11349:32;11398:19;;54591:75:0::1;11025:398:1::0;54591:75:0::1;54682:9;54677:314;54701:14;:21;54697:1;:25;54677:314;;;54744:14;54761;54776:1;54761:17;;;;;;;;:::i;:::-;;;;;;;54744:34;;54793:21;54817:6;54824:1;54817:9;;;;;;;;:::i;:::-;;;;;;;54830:6;54817:20;;;;:::i;:::-;54793:44;;54852:50;54868:10;54880:6;54888:13;54852:15;:50::i;:::-;54917:15;::::0;-1:-1:-1;;;;;54917:15:0::1;:26;54952:6:::0;54961:17:::1;54952:6:::0;54961:9:::1;:17::i;:::-;54917:62;::::0;-1:-1:-1;;;;;;54917:62:0::1;::::0;;;;;;-1:-1:-1;;;;;11760:32:1;;;54917:62:0::1;::::0;::::1;11742:51:1::0;11809:18;;;11802:34;11715:18;;54917:62:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;54729:262;;54724:3;;;;;:::i;:::-;;;;54677:314;;;;54361:637:::0;;:::o;7022:454::-;7162:4;7179:36;7189:6;7197:9;7208:6;7179:9;:36::i;:::-;7226:220;7249:6;335:10;7297:138;7353:6;7297:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7297:19:0;;;;;;:11;:19;;;;;;;;335:10;7297:33;;;;;;;;;;:37;:138::i;:::-;7226:8;:220::i;:::-;-1:-1:-1;7464:4:0;7022:454;;;;;:::o;50890:114::-;50964:15;;:32;;;-1:-1:-1;;;50964:32:0;;;;50937:7;;-1:-1:-1;;;;;50964:15:0;;:30;;:32;;;;;;;;;;;;;;:15;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50957:39;;50890:114;:::o;40160:141::-;40250:15;;:43;;;-1:-1:-1;;;40250:43:0;;;;40223:7;;-1:-1:-1;;;;;40250:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;42503:119::-;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;42573:15:::1;::::0;:41:::1;::::0;-1:-1:-1;;;42573:41:0;;2091:14:1;;2084:22;42573:41:0::1;::::0;::::1;2066::1::0;-1:-1:-1;;;;;42573:15:0;;::::1;::::0;:34:::1;::::0;2039:18:1;;42573:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42503:119:::0;:::o;7484:300::-;335:10;7599:4;7693:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;7693:34:0;;;;;;;;;;7599:4;;7621:133;;7671:7;;7693:50;;7732:10;7693:38;:50::i;37401:121::-;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;37471:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;37471:43:0;;2091:14:1;;2084:22;37471:43:0::1;::::0;::::1;2066:41:1::0;-1:-1:-1;;;;;37471:15:0;;::::1;::::0;:36:::1;::::0;2039:18:1;;37471:43:0::1;1926:187:1::0;41872:103:0;41909:15;;:58;;-1:-1:-1;;;41909:58:0;;41948:10;41909:58;;;12616:51:1;41909:15:0;12683:18:1;;;12676:50;-1:-1:-1;;;;;41909:15:0;;;;:30;;12589:18:1;;41909:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41872:103::o;51012:183::-;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;51126:15:::1;::::0;:61:::1;::::0;-1:-1:-1;;;51126:61:0;;::::1;::::0;::::1;2752:25:1::0;;;-1:-1:-1;;;;;51126:15:0;;::::1;::::0;:54:::1;::::0;2725:18:1;;51126:61:0::1;2606:177:1::0;51203:175:0;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;51313:15:::1;::::0;:57:::1;::::0;-1:-1:-1;;;51313:57:0;;::::1;::::0;::::1;2752:25:1::0;;;-1:-1:-1;;;;;51313:15:0;;::::1;::::0;:50:::1;::::0;2725:18:1;;51313:57:0::1;2606:177:1::0;36757:120:0;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;36852:17:::1;:6:::0;36862::::1;36852:17;:::i;:::-;36831:18;:38:::0;-1:-1:-1;36757:120:0:o;42121:142::-;42214:15;;:41;;;-1:-1:-1;;;42214:41:0;;;;42187:7;;-1:-1:-1;;;;;42214:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;35019:99;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;35088:14:::1;:22:::0;;-1:-1:-1;;35088:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;35019:99::o;40635:171::-;40764:15;;:34;;-1:-1:-1;;;40764:34:0;;-1:-1:-1;;;;;178:32:1;;;40764:34:0;;;160:51:1;40732:7:0;;40764:15;;:25;;133:18:1;;40764:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;42630:185::-;42759:15;;:48;;-1:-1:-1;;;42759:48:0;;-1:-1:-1;;;;;178:32:1;;;42759:48:0;;;160:51:1;42730:4:0;;42759:15;;:39;;133:18:1;;42759:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;41454:410::-;41636:15;;:28;;-1:-1:-1;;;;;;41636:28:0;;;;;2752:25:1;;;41534:18:0;;;;;;-1:-1:-1;;;;;41636:15:0;;:23;;2725:18:1;;41636:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41680:176;;;13529:25:1;;;13585:2;13570:18;;13563:34;;;13613:18;;;13606:34;;;13671:2;13656:18;;13649:34;;;41519:145:0;;-1:-1:-1;41519:145:0;;-1:-1:-1;41519:145:0;-1:-1:-1;41836:9:0;;41798:5;;41680:176;;13516:3:1;13501:19;41680:176:0;;;;;;;41508:356;;;41454:410;:::o;6186:177::-;-1:-1:-1;;;;;6337:18:0;6305:7;6337:18;;;;;;;;;;;;6186:177::o;13163:148::-;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;13254:6:::1;::::0;13233:40:::1;::::0;13270:1:::1;::::0;-1:-1:-1;;;;;13254:6:0::1;::::0;13233:40:::1;::::0;13270:1;;13233:40:::1;13284:6;:19:::0;;-1:-1:-1;;;;;;13284:19:0::1;::::0;;13163:148::o;34382:127::-;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;34456:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;34456:45:0;;-1:-1:-1;;;;;178:32:1;;;34456:45:0::1;::::0;::::1;160:51:1::0;34456:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;34456:45:0::1;14:203:1::0;38067:208:0;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;38136:15:::1;::::0;:46:::1;::::0;-1:-1:-1;;;38136:46:0;;-1:-1:-1;;;;;178:32:1;;;38136:46:0::1;::::0;::::1;160:51:1::0;38136:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;38136:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;;;38193:29:0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:36;;-1:-1:-1;;38193:36:0::1;38225:4;38193:36;::::0;;-1:-1:-1;38240:27:0::1;38213:8:::0;38240:17:::1;:27::i;34810:170::-:0;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34922:41:0;;;::::1;;::::0;;;:33:::1;:41;::::0;;;;:50;;-1:-1:-1;;34922:50:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34810:170::o;38525:1429::-;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;38869:11:::1;:21:::0;;;38901:16:::1;:31:::0;;;38943:15:::1;:30:::0;;;38984:13:::1;:26:::0;;;39021:12:::1;:23:::0;;;39055:17:::1;:33:::0;;;39099:16:::1;:32:::0;;;39142:14:::1;:28:::0;;;39181:9:::1;:18:::0;;;39210:10:::1;:20:::0;;;39259:117:::1;39223:7:::0;39259:87:::1;39075:13:::0;39259:87;39159:11;39118:13;39259:32:::1;:50::i;:::-;:68:::0;::::1;:87::i;:117::-;39243:13;:133;;;;39404:113;39507:9;;39404:84;39471:16;;39404:48;39436:15;;39404:13;;:31;;:48;;;;:::i;:113::-;39389:12;:128:::0;39538:13:::1;::::0;39555:2:::1;-1:-1:-1::0;39538:19:0;::::1;::::0;:41:::1;;;39577:2;39561:12;;:18;;39538:41;39530:94;;;::::0;-1:-1:-1;;;39530:94:0;;13896:2:1;39530:94:0::1;::::0;::::1;13878:21:1::0;13935:2;13915:18;;;13908:30;13974:34;13954:18;;;13947:62;-1:-1:-1;;;14025:18:1;;;14018:38;14073:19;;39530:94:0::1;13694:404:1::0;39530:94:0::1;39667:12;::::0;39694:17:::1;::::0;39726:16:::1;::::0;39757:14:::1;::::0;39786:11:::1;::::0;39812:16:::1;::::0;39843:15:::1;::::0;39873:13:::1;::::0;39901:9:::1;::::0;39925:10:::1;::::0;39642:304:::1;::::0;;14502:25:1;;;14558:2;14543:18;;14536:34;;;;14586:18;;;14579:34;;;;14644:2;14629:18;;14622:34;;;;14687:3;14672:19;;14665:35;;;;14731:3;14716:19;;14709:35;14775:3;14760:19;;14753:35;14819:3;14804:19;;14797:35;14863:3;14848:19;;14841:35;14907:3;14892:19;;14885:35;39642:304:0::1;::::0;14489:3:1;14474:19;39642:304:0::1;;;;;;;38525:1429:::0;;;;;;;;;;:::o;38283:234::-;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;38389:1:::1;38371:14;:19;;38362:62;;;::::0;-1:-1:-1;;;38362:62:0;;15133:2:1;38362:62:0::1;::::0;::::1;15115:21:1::0;15172:2;15152:18;;;15145:30;15211:31;15191:18;;;15184:59;15260:18;;38362:62:0::1;14931:353:1::0;38362:62:0::1;38435:11;:28:::0;;;38479:30:::1;::::0;2752:25:1;;;38479:30:0::1;::::0;2740:2:1;2725:18;38479:30:0::1;;;;;;;;38283:234:::0;:::o;42271:109::-;42325:15;;:47;;-1:-1:-1;;;42325:47:0;;42354:10;42325:47;;;12616:51:1;12710:14;;12703:22;12683:18;;;12676:50;-1:-1:-1;;;;;42325:15:0;;;;:28;;12589:18:1;;42325:47:0;12432:300:1;37818:241:0;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;37916:6:::1;37904:8;:18;;:41;;;;;37938:7;37926:8;:19;;37904:41;37896:50;;;::::0;::::1;;37996:16;::::0;37962:51:::1;::::0;37986:8;;37962:51:::1;::::0;;;::::1;38024:16;:27:::0;37818:241::o;5857:104::-;5913:13;5946:7;5939:14;;;;;:::i;37101:163::-;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;37215:41:::1;37244:4;37250:5;37215:28;:41::i;:::-;37101:163:::0;;:::o;37272:121::-;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;37342:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;37342:43:0;;2091:14:1;;2084:22;37342:43:0::1;::::0;::::1;2066:41:1::0;-1:-1:-1;;;;;37342:15:0;;::::1;::::0;:36:::1;::::0;2039:18:1;;37342:43:0::1;1926:187:1::0;35877:176:0;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;35967:6:::1;35949:24;;:14;;;;;;;;;;;:24;;::::0;35941:33:::1;;;::::0;::::1;;35985:14;:23:::0;;;::::1;;-1:-1:-1::0;;;35985:23:0::1;-1:-1:-1::0;;;;35985:23:0;;::::1;;::::0;;36024:21:::1;::::0;::::1;::::0;::::1;::::0;36002:6;2091:14:1;2084:22;2066:41;;2054:2;2039:18;;1926:187;34547:201:0;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;34621:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;34621:45:0;;-1:-1:-1;;;;;178:32:1;;;34621:45:0::1;::::0;::::1;160:51:1::0;34621:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;34621:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;34677:15:0::1;::::0;-1:-1:-1;;;;;34677:15:0::1;::::0;-1:-1:-1;34677:26:0::1;::::0;-1:-1:-1;34704:7:0;34713:26:::1;34704:7:::0;34713:17:::1;:26::i;:::-;34677:63;::::0;-1:-1:-1;;;;;;34677:63:0::1;::::0;;;;;;-1:-1:-1;;;;;11760:32:1;;;34677:63:0::1;::::0;::::1;11742:51:1::0;11809:18;;;11802:34;11715:18;;34677:63:0::1;11560:282:1::0;7792:400:0;7912:4;7934:228;335:10;7984:7;8006:145;8063:15;8006:145;;;;;;;;;;;;;;;;;335:10;8006:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;8006:34:0;;;;;;;;;;;;:38;:145::i;36061:662::-;36120:14;;-1:-1:-1;;;36120:14:0;;;;36112:49;;;;-1:-1:-1;;;36112:49:0;;16059:2:1;36112:49:0;;;16041:21:1;16098:2;16078:18;;;16071:30;-1:-1:-1;;;16117:18:1;;;16110:52;16179:18;;36112:49:0;15857:346:1;36112:49:0;36180:24;;;;:14;:24;;;;;;:29;;36172:66;;;;-1:-1:-1;;;36172:66:0;;16410:2:1;36172:66:0;;;16392:21:1;16449:2;16429:18;;;16422:30;16488:26;16468:18;;;16461:54;16532:18;;36172:66:0;16208:348:1;36172:66:0;36304:29;:15;36324:8;36304:19;:29::i;:::-;335:10;36271:30;;;;:16;:30;;;;;;:62;36249:148;;;;-1:-1:-1;;;36249:148:0;;16763:2:1;36249:148:0;;;16745:21:1;16802:2;16782:18;;;16775:30;16841:34;16821:18;;;16814:62;-1:-1:-1;;;16892:18:1;;;16885:34;16936:19;;36249:148:0;16561:400:1;36249:148:0;36437:24;;;;:14;:24;;;;;;;;;335:10;36408:26;;:12;:26;;;;;;:53;36505:29;:15;36437:24;36505:19;:29::i;:::-;335:10;36472:30;;;;:16;:30;;;;;:62;;;;36545:15;;-1:-1:-1;;;;;36545:15:0;;:26;;36613:31;335:10;36613:17;:31::i;:::-;36545:110;;-1:-1:-1;;;;;;36545:110:0;;;;;;;-1:-1:-1;;;;;11760:32:1;;;36545:110:0;;;11742:51:1;11809:18;;;11802:34;11715:18;;36545:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36692:12;335:10;;255:98;36692:12;-1:-1:-1;;;;;36671:44:0;;36706:8;36671:44;;;;2752:25:1;;2740:2;2725:18;;2606:177;36671:44:0;;;;;;;;36061:662;:::o;40443:184::-;40572:15;;:47;;-1:-1:-1;;;40572:47:0;;-1:-1:-1;;;;;178:32:1;;;40572:47:0;;;160:51:1;40540:7:0;;40572:15;;:38;;133:18:1;;40572:47:0;14:203:1;6371:216:0;6493:4;6515:42;335:10;6539:9;6550:6;6515:9;:42::i;33029:143::-;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33122:30:0;;;::::1;;::::0;;;:23:::1;:30;::::0;;;;:38;;-1:-1:-1;;33122:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;33029:143::o;40814:307::-;41078:15;;:35;;-1:-1:-1;;;41078:35:0;;-1:-1:-1;;;;;178:32:1;;;41078:35:0;;;160:51:1;40928:7:0;;;;;;;;;;;;41078:15;;;;:26;;133:18:1;;41078:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41071:42;;;;-1:-1:-1;41071:42:0;;-1:-1:-1;41071:42:0;-1:-1:-1;41071:42:0;-1:-1:-1;41071:42:0;;-1:-1:-1;40814:307:0;-1:-1:-1;;40814:307:0:o;35398:174::-;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;35486:3:::1;35477:5;:12;;35469:63;;;::::0;-1:-1:-1;;;35469:63:0;;17730:2:1;35469:63:0::1;::::0;::::1;17712:21:1::0;17769:2;17749:18;;;17742:30;17808:34;17788:18;;;17781:62;-1:-1:-1;;;17859:18:1;;;17852:36;17905:19;;35469:63:0::1;17528:402:1::0;35469:63:0::1;35543:13;:21:::0;35398:174::o;42823:127::-;42907:15;;:35;;-1:-1:-1;;;42907:35:0;;-1:-1:-1;;;;;178:32:1;;;42907:35:0;;;160:51:1;42883:4:0;;42907:15;;:26;;133:18:1;;42907:35:0;14:203:1;33836:268:0;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33908:41:0;;::::1;;::::0;;;:33:::1;:41;::::0;;;;;;;:48;;33952:4:::1;-1:-1:-1::0;;33908:48:0;;::::1;::::0;::::1;::::0;;;33967:19:::1;:27:::0;;;;;;;:34;;;;::::1;::::0;;::::1;::::0;;34012:15:::1;::::0;:44;;-1:-1:-1;;;34012:44:0;;::::1;::::0;::::1;160:51:1::0;;;;34012:15:0;::::1;::::0;:36:::1;::::0;133:18:1;34012:44:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;34072:24:0::1;::::0;-1:-1:-1;;;;;178:32:1;;160:51;;34072:24:0::1;::::0;-1:-1:-1;148:2:1;133:18;;-1:-1:-1;34072:24:0::1;14:203:1::0;36885:208:0;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;36965:21:::1;::::0;:32;::::1;;:21;::::0;;::::1;:32;;::::0;36957:41:::1;;;::::0;::::1;;37009:21;:31:::0;;-1:-1:-1;;37009:31:0::1;::::0;::::1;;::::0;;::::1;::::0;;;37056:29:::1;::::0;2066:41:1;;;37056:29:0::1;::::0;2054:2:1;2039:18;37056:29:0::1;1926:187:1::0;33188:146:0;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;33255:20:::1;::::0;::::1;;33254:21;33246:30;;;::::0;::::1;;33295:20;:27:::0;;-1:-1:-1;;33295:27:0::1;33318:4;33295:27;::::0;;33188:146::o;50724:158::-;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;50794:15:::1;::::0;:40:::1;::::0;-1:-1:-1;;;50794:40:0;;-1:-1:-1;;;;;178:32:1;;;50794:40:0::1;::::0;::::1;160:51:1::0;50794:15:0;;::::1;::::0;:33:::1;::::0;133:18:1;;50794:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;50850:24:0::1;::::0;-1:-1:-1;;;;;178:32:1;;160:51;;50850:24:0::1;::::0;-1:-1:-1;148:2:1;133:18;;-1:-1:-1;50850:24:0::1;14:203:1::0;41983:130:0;42066:15;;:39;;;-1:-1:-1;;;42066:39:0;;;;42039:7;;-1:-1:-1;;;;;42066:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;41129:317;41398:15;;:40;;-1:-1:-1;;;41398:40:0;;;;;2752:25:1;;;41248:7:0;;;;;;;;;;;;-1:-1:-1;;;;;41398:15:0;;;;:33;;2725:18:1;;41398:40:0;2606:177:1;13319:281:0;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13422:22:0;::::1;13400:110;;;::::0;-1:-1:-1;;;13400:110:0;;18137:2:1;13400:110:0::1;::::0;::::1;18119:21:1::0;18176:2;18156:18;;;18149:30;18215:34;18195:18;;;18188:62;-1:-1:-1;;;18266:18:1;;;18259:36;18312:19;;13400:110:0::1;17935:402:1::0;13400:110:0::1;13547:6;::::0;13526:38:::1;::::0;-1:-1:-1;;;;;13526:38:0;;::::1;::::0;13547:6:::1;::::0;13526:38:::1;::::0;13547:6:::1;::::0;13526:38:::1;13575:6;:17:::0;;-1:-1:-1;;;;;;13575:17:0::1;-1:-1:-1::0;;;;;13575:17:0;;;::::1;::::0;;;::::1;::::0;;13319:281::o;42388:107::-;42441:15;;:46;;-1:-1:-1;;;42441:46:0;;42469:10;42441:46;;;12616:51:1;12710:14;;12703:22;12683:18;;;12676:50;-1:-1:-1;;;;;42441:15:0;;;;:27;;12589:18:1;;42441:46:0;12432:300:1;33350:415:0;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;33419:10:::1;:20:::0;;-1:-1:-1;;;;;;33419:20:0::1;;-1:-1:-1::0;;;;;33419:20:0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;33454:21;33450:203:::1;;-1:-1:-1::0;;;;;33492:32:0;;::::1;;::::0;;;:23:::1;:32;::::0;;;;;;;:39;;33527:4:::1;-1:-1:-1::0;;33492:39:0;;::::1;::::0;::::1;::::0;;;33546:19:::1;:28:::0;;;;;;;:35;;;;::::1;::::0;;::::1;::::0;;33596:15:::1;::::0;:45;;-1:-1:-1;;;33596:45:0;;::::1;::::0;::::1;160:51:1::0;;;;33596:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;33596:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33450:203;33677:12;33663:11;:26:::0;33700:14:::1;:21:::0;;-1:-1:-1;;;;33700:21:0::1;-1:-1:-1::0;;;33700:21:0::1;::::0;;33737:16:::1;::::0;::::1;::::0;33700:21;;33737:16:::1;33350:415:::0;:::o;35642:221::-;13076:6;;-1:-1:-1;;;;;13076:6:0;335:10;13076:22;13068:67;;;;-1:-1:-1;;;13068:67:0;;;;;;;:::i;:::-;35717:16:::1;:5:::0;35726:6:::1;35717:16;:::i;:::-;35709:24;;35776:4;35761:12;;:19;;;;:::i;:::-;35752:5;:28;;35744:83;;;::::0;-1:-1:-1;;;35744:83:0;;18766:2:1;35744:83:0::1;::::0;::::1;18748:21:1::0;18805:2;18785:18;;;18778:30;18844:34;18824:18;;;18817:62;-1:-1:-1;;;18895:18:1;;;18888:40;18945:19;;35744:83:0::1;18564:406:1::0;35744:83:0::1;35838:9;:17:::0;35642:221::o;10975:181::-;11033:7;;11065:5;11069:1;11065;:5;:::i;:::-;11053:17;;11094:1;11089;:6;;11081:46;;;;-1:-1:-1;;;11081:46:0;;19307:2:1;11081:46:0;;;19289:21:1;19346:2;19326:18;;;19319:30;19385:29;19365:18;;;19358:57;19432:18;;11081:46:0;19105:351:1;11081:46:0;11147:1;10975:181;-1:-1:-1;;;10975:181:0:o;11542:250::-;11600:7;11624:1;11629;11624:6;11620:47;;-1:-1:-1;11654:1:0;11647:8;;11620:47;11679:9;11691:5;11695:1;11691;:5;:::i;:::-;11679:17;-1:-1:-1;11724:1:0;11715:5;11719:1;11679:17;11715:5;:::i;:::-;:10;11707:56;;;;-1:-1:-1;;;11707:56:0;;19663:2:1;11707:56:0;;;19645:21:1;19702:2;19682:18;;;19675:30;19741:34;19721:18;;;19714:62;-1:-1:-1;;;19792:18:1;;;19785:31;19833:19;;11707:56:0;19461:397:1;11800:132:0;11858:7;11885:39;11889:1;11892;11885:39;;;;;;;;;;;;;;;;;:3;:39::i;52358:1995::-;52427:6;52437:1;52427:11;52423:50;;52358:1995;:::o;52423:50::-;52483:24;52500:6;52483:16;:24::i;:::-;52518:19;52540:25;52554:10;;52540:9;;:13;;:25;;;;:::i;:::-;52781:13;;52518:47;;-1:-1:-1;52593:4:0;;;;;;52578:12;;;;;;52781:17;52777:261;;52834:192;53016:9;;52997:16;;52981:13;;:32;;;;:::i;:::-;:44;;;;:::i;:::-;52834:128;52948:13;;52834:95;52917:11;52834:64;52888:9;;52834:35;:53;;:64;;;;:::i;:95::-;:113;;:128::i;:192::-;52815:211;;52777:261;53052:14;;:18;53048:268;;53107:197;53293:10;;53273:17;;53256:14;;:34;;;;:::i;:::-;:47;;;;:::i;:::-;53107:130;53222:14;;53107:96;53191:11;53107:65;53161:10;;53107:35;:53;;:65;;;;:::i;:197::-;53087:217;;53048:268;53338:39;:16;53359:17;53338:20;:39::i;:::-;53326:51;-1:-1:-1;53394:13:0;;53390:111;;53446:15;;53438:51;;-1:-1:-1;;;;;53446:15:0;;;;53475:9;;53438:51;;;;53475:9;53446:15;53438:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53424:65:0;;-1:-1:-1;;53390:111:0;53521:21;53594:31;53615:9;;53594:16;;:20;;:31;;;;:::i;:::-;53567:10;;53545:17;;:33;;:21;:33::i;:::-;:80;;;;:::i;:::-;53521:104;-1:-1:-1;53638:19:0;53672:17;;53668:104;;53720:40;:21;53746:13;53720:25;:40::i;:::-;53706:54;;53668:104;53782:23;53850:11;53808:39;53829:17;;53808:16;;:20;;:39;;;;:::i;:::-;:53;;;;:::i;:::-;53782:79;;53872:17;53920:11;53892:25;53906:10;;53892:9;;:13;;:25;;;;:::i;:::-;:39;;;;:::i;:::-;53872:59;-1:-1:-1;53948:19:0;;53944:126;;54009:15;;54001:57;;-1:-1:-1;;;;;54009:15:0;;;;54038;;54001:57;;;;54038:15;54009;54001:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53984:74:0;;-1:-1:-1;;53944:126:0;54084:13;;54080:108;;54139:9;;54131:45;;-1:-1:-1;;;;;54139:9:0;;;;54162;;54131:45;;;;54162:9;54139;54131:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54114:62:0;;-1:-1:-1;;54080:108:0;54205:140;54233:9;54257:27;54275:9;54257:15;:27;:::i;:::-;54299:7;:21;;;;;54310:10;54299:21;:35;;;;;54324:10;54299:35;54205:140;;;20269:25:1;;;20325:2;20310:18;;20303:34;;;;20380:14;20373:22;20353:18;;;20346:50;20257:2;20242:18;54205:140:0;;;;;;;52412:1941;;;;;;;;;;;52358:1995;:::o;11164:136::-;11222:7;11249:43;11253:1;11256;11249:43;;;;;;;;;;;;;;;;;:3;:43::i;9667:380::-;-1:-1:-1;;;;;9803:19:0;;9795:68;;;;-1:-1:-1;;;9795:68:0;;20609:2:1;9795:68:0;;;20591:21:1;20648:2;20628:18;;;20621:30;20687:34;20667:18;;;20660:62;-1:-1:-1;;;20738:18:1;;;20731:34;20782:19;;9795:68:0;20407:400:1;9795:68:0;-1:-1:-1;;;;;9882:21:0;;9874:68;;;;-1:-1:-1;;;9874:68:0;;21014:2:1;9874:68:0;;;20996:21:1;21053:2;21033:18;;;21026:30;21092:34;21072:18;;;21065:62;-1:-1:-1;;;21143:18:1;;;21136:32;21185:19;;9874:68:0;20812:398:1;9874:68:0;-1:-1:-1;;;;;9955:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10007:32;;2752:25:1;;;10007:32:0;;2725:18:1;10007:32:0;;;;;;;;9667:380;;;:::o;8200:610::-;-1:-1:-1;;;;;8340:20:0;;8332:70;;;;-1:-1:-1;;;8332:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8421:23:0;;8413:71;;;;-1:-1:-1;;;8413:71:0;;;;;;;:::i;:::-;8577:108;8613:6;8577:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8577:17:0;;:9;:17;;;;;;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;8557:17:0;;;:9;:17;;;;;;;;;;;:128;;;;8719:20;;;;;;;:32;;8744:6;8719:24;:32::i;:::-;-1:-1:-1;;;;;8696:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;8767:35;2752:25:1;;;8696:20:0;;8767:35;;;;;;2725:18:1;8767:35:0;2606:177:1;42958:6466:0;-1:-1:-1;;;;;43090:18:0;;43082:68;;;;-1:-1:-1;;;43082:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43169:16:0;;43161:64;;;;-1:-1:-1;;;43161:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43388:39:0;;43236:18;43388:39;;;:33;:39;;;;;;43236:18;;;;;;;;43388:39;;43383:132;;43452:14;;-1:-1:-1;;;43452:14:0;;;;43444:59;;;;-1:-1:-1;;;43444:59:0;;22227:2:1;43444:59:0;;;22209:21:1;;;22246:18;;;22239:30;22305:34;22285:18;;;22278:62;22357:18;;43444:59:0;22025:356:1;43444:59:0;43539:20;;;;:29;;;:57;;-1:-1:-1;43572:10:0;;;;;-1:-1:-1;;;;;43572:10:0;:24;;43539:57;43535:209;;;43621:19;43631:4;43637:2;43621:9;:19::i;:::-;:24;;:57;;-1:-1:-1;;;;;;43649:29:0;;;;;;:23;:29;;;;;;;;43621:57;:88;;;-1:-1:-1;;;;;;43682:27:0;;;;;;:23;:27;;;;;;;;43621:88;43613:119;;;;-1:-1:-1;;;43613:119:0;;22588:2:1;43613:119:0;;;22570:21:1;22627:2;22607:18;;;22600:30;-1:-1:-1;;;22646:18:1;;;22639:48;22704:18;;43613:119:0;22386:342:1;43613:119:0;43776:6;43786:1;43776:11;43772:5268;;43804:28;43820:4;43826:2;43830:1;43804:15;:28::i;:::-;43847:7;;;;;42958:6466;;;:::o;43772:5268::-;43890:8;;-1:-1:-1;;;43890:8:0;;;;43889:9;:39;;;;-1:-1:-1;;;;;;43903:25:0;;;;;;:19;:25;;;;;;;;43902:26;43889:39;:67;;;;-1:-1:-1;;;;;;43933:23:0;;;;;;:19;:23;;;;;;;;43932:24;43889:67;43871:5169;;;-1:-1:-1;;;;;44000:29:0;;;43983:14;44000:29;;;:25;:29;;;;;;;44060:31;;;;;;;;44000:29;;;;;44060:31;44112:9;;:23;;;;;44126:9;44125:10;44112:23;44108:2286;;;44156:13;44172:32;44200:3;44172:23;44183:11;;44172:6;:10;;:23;;;;:::i;:32::-;44156:48;-1:-1:-1;44232:17:0;:6;44156:48;44232:10;:17::i;:::-;44223:26;;44268:43;44284:4;44298;44305:5;44268:15;:43::i;:::-;44330:33;44346:4;44352:2;44356:6;44330:15;:33::i;:::-;44382:15;;-1:-1:-1;;;;;44382:15:0;:26;44409:4;44415:23;44409:4;44415:17;:23::i;:::-;44382:57;;-1:-1:-1;;;;;;44382:57:0;;;;;;;-1:-1:-1;;;;;11760:32:1;;;44382:57:0;;;11742:51:1;11809:18;;;11802:34;11715:18;;44382:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44458:15:0;;-1:-1:-1;;;;;44458:15:0;;-1:-1:-1;44458:26:0;;-1:-1:-1;44485:2:0;44489:21;44485:2;44489:17;:21::i;:::-;44458:53;;-1:-1:-1;;;;;;44458:53:0;;;;;;;-1:-1:-1;;;;;11760:32:1;;;44458:53:0;;;11742:51:1;11809:18;;;11802:34;11715:18;;44458:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44530:7;;;;;;;;42958:6466;;;:::o;44108:2286::-;44590:8;44589:9;:27;;;;-1:-1:-1;44602:14:0;;-1:-1:-1;;;44602:14:0;;;;44589:27;44585:1809;;;-1:-1:-1;;;;;44667:22:0;;;;;;:16;:22;;;;;;44693:15;-1:-1:-1;44667:41:0;44637:144;;;;-1:-1:-1;;;44637:144:0;;22935:2:1;44637:144:0;;;22917:21:1;22974:2;22954:18;;;22947:30;23013:31;22993:18;;;22986:59;23062:18;;44637:144:0;22733:353:1;44637:144:0;-1:-1:-1;;;;;44804:22:0;;;;;;:16;:22;;;;;;:27;44800:147;;-1:-1:-1;;;;;44856:22:0;;44881:1;44856:22;;;:16;:22;;;;;;;;:26;;;44905:12;:18;;;;;:22;44800:147;44585:1809;;;44987:9;44983:1411;;;45030:14;;45074:12;;45121:17;;45172:16;;45217:10;;45252:14;;45030;;-1:-1:-1;45074:12:0;;-1:-1:-1;45121:17:0;;-1:-1:-1;45172:16:0;-1:-1:-1;45217:10:0;-1:-1:-1;45252:14:0;;45248:271;;;45356:13;;45343:9;45314:39;;;;:28;:39;;;;;;:55;;45356:13;45314:55;:::i;:::-;45295:15;:74;;45287:134;;;;-1:-1:-1;;;45287:134:0;;23293:2:1;45287:134:0;;;23275:21:1;23332:2;23312:18;;;23305:30;-1:-1:-1;;;23351:18:1;;;23344:52;23413:18;;45287:134:0;23091:346:1;45287:134:0;45469:9;45440:39;;;;:28;:39;;;;;45482:15;45440:57;;44983:1411;;;45546:8;45542:852;;;45588:13;;45631:11;;45677:16;;45727:15;;45771:9;;45805:14;;45588:13;;-1:-1:-1;45631:11:0;;-1:-1:-1;45677:16:0;;-1:-1:-1;45727:15:0;-1:-1:-1;45771:9:0;-1:-1:-1;45805:14:0;;45801:369;;;45863:11;;:15;;45877:1;45863:15;:::i;:::-;45848:12;:30;45840:60;;;;-1:-1:-1;;;45840:60:0;;23644:2:1;45840:60:0;;;23626:21:1;23683:2;23663:18;;;23656:30;-1:-1:-1;;;23702:18:1;;;23695:48;23760:18;;45840:60:0;23442:342:1;45840:60:0;45942:13;;45927:11;:28;;45919:64;;;;-1:-1:-1;;;45919:64:0;;23991:2:1;45919:64:0;;;23973:21:1;24030:2;24010:18;;;24003:30;24069:26;24049:18;;;24042:54;24113:18;;45919:64:0;23789:348:1;45919:64:0;46035:9;46010:35;;;;:24;:35;;;;;;46049:12;46010:51;;46002:83;;;;-1:-1:-1;;;46002:83:0;;24344:2:1;46002:83:0;;;24326:21:1;24383:2;24363:18;;;24356:30;-1:-1:-1;;;24402:18:1;;;24395:50;24462:18;;46002:83:0;24142:344:1;46002:83:0;46129:9;46104:35;;;;:24;:35;;;;;46142:12;46104:50;;45801:369;46198:32;46233:13;46243:2;46233:9;:13::i;:::-;46306:9;;46198:48;;-1:-1:-1;46269:33:0;46296:6;46198:48;46269:33;:::i;:::-;:46;;46261:117;;;;-1:-1:-1;;;46261:117:0;;24693:2:1;46261:117:0;;;24675:21:1;24732:2;24712:18;;;24705:30;24771:34;24751:18;;;24744:62;-1:-1:-1;;;24822:18:1;;;24815:34;24866:19;;46261:117:0;24491:400:1;46261:117:0;45556:838;45542:852;46410:17;46430:72;46494:7;46463:28;46478:13;46463:12;:28;:::i;:::-;:38;;;;:::i;:::-;46430:10;;:32;:72::i;:::-;46410:92;;46519:28;46550:24;46568:4;46550:9;:24::i;:::-;46630:18;;46519:55;;-1:-1:-1;46606:42:0;;;;;;;46669:43;;-1:-1:-1;;;;;;46681:31:0;;;;;;:25;:31;;;;;;;;46680:32;46669:43;46665:1251;;;46733:8;:15;;-1:-1:-1;;;;46733:15:0;-1:-1:-1;;;46733:15:0;;;46773:21;;46733:15;46773:21;:41;;;;;46813:1;46798:12;:16;46773:41;:61;;;;;46833:1;46818:12;;:16;46773:61;46769:903;;;46859:20;46882:25;46896:10;;46882:9;;:13;;:25;;;;:::i;:::-;46859:48;;46930:24;46957:105;47049:12;46957:61;47008:9;;46957:20;:50;;:61;;;;:::i;:105::-;46930:132;;47085:22;47110:106;47203:12;47110:62;47161:10;;47110:20;:50;;:62;;;;:::i;:106::-;47085:131;;47241:21;47265:104;47356:12;;47265:60;47312:12;47265:16;:46;;:60;;;;:::i;:104::-;47241:128;;47394:22;47419:103;47508:13;;47419:58;47464:12;47419:14;:44;;:58;;;;:::i;:103::-;47394:128;-1:-1:-1;47547:18:0;47568:33;47394:128;47587:13;47568:18;:33::i;:::-;47547:54;;47626:26;47641:10;47626:14;:26::i;:::-;46836:836;;;;;;46769:903;47692:24;47719;47737:4;47719:9;:24::i;:::-;47692:51;;47762:38;47783:16;47762:20;:38::i;:::-;-1:-1:-1;47831:1:0;47819:9;:13;;;47851:10;:14;47884:8;:16;;-1:-1:-1;;;;47884:16:0;;;46665:1251;47932:12;47947:30;47973:3;47947:21;:6;47958:9;47947:10;:21::i;:30::-;47932:45;-1:-1:-1;47992:18:0;48031:12;;48027:202;;48096:3;48073:20;:6;48084:8;48073:10;:20::i;:::-;:26;;;;:::i;:::-;48060:39;;48114;48130:4;48136;;;;;;;;;-1:-1:-1;;;;;48136:4:0;48142:10;48114:15;:39::i;:::-;48183:12;;:28;;48200:10;48183:16;:28::i;:::-;48168:12;:43;48027:202;48254:29;48265:17;48272:10;48265:4;:17;:::i;:::-;48254:6;;:10;:29::i;:::-;48245:38;;48304:9;48300:155;;;48347:10;;:20;;48362:4;48347:14;:20::i;:::-;48334:10;:33;48300:155;;;48420:9;;:19;;48434:4;48420:13;:19::i;:::-;48408:9;:31;48300:155;48471:42;48487:4;48501;48508;48471:15;:42::i;:::-;48544:16;;48581:15;;:28;;-1:-1:-1;;;;;;48581:28:0;;;;;2752:25:1;;;-1:-1:-1;;;;;48581:15:0;;;;:23;;2725:18:1;;48581:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;48581:28:0;;;;;;;;-1:-1:-1;;48581:28:0;;;;;;;;;;;;:::i;:::-;;;48577:452;;;48773:231;;;13529:25:1;;;13585:2;13570:18;;13563:34;;;13613:18;;;13606:34;;;13671:2;13656:18;;13649:34;;;48976:9:0;;48923:4;;48773:231;;13516:3:1;13501:19;48773:231:0;;;;;;;48610:410;;;48577:452;43968:5072;;;;;;;;43871:5169;49052:33;49068:4;49074:2;49078:6;49052:15;:33::i;:::-;49096:15;;-1:-1:-1;;;;;49096:15:0;:26;49123:4;49129:23;49123:4;49129:17;:23::i;:::-;49096:57;;-1:-1:-1;;;;;;49096:57:0;;;;;;;-1:-1:-1;;;;;11760:32:1;;;49096:57:0;;;11742:51:1;11809:18;;;11802:34;11715:18;;49096:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49164:15:0;;-1:-1:-1;;;;;49164:15:0;;-1:-1:-1;49164:26:0;;-1:-1:-1;49191:2:0;49195:21;49191:2;49195:17;:21::i;:::-;49164:53;;-1:-1:-1;;;;;;49164:53:0;;;;;;;-1:-1:-1;;;;;11760:32:1;;;49164:53:0;;;11742:51:1;11809:18;;;11802:34;11715:18;;49164:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49254:15:0;;-1:-1:-1;;;;;49238:32:0;;;49254:15;;49238:32;;;;-1:-1:-1;49238:32:0;-1:-1:-1;49238:68:0;;-1:-1:-1;;;;;;49275:31:0;;;;;;:25;:31;;;;;;;;49274:32;49238:68;:88;;;;-1:-1:-1;49316:10:0;;-1:-1:-1;;;;;49310:16:0;;;49316:10;;;;;49310:16;49238:88;49234:179;;;49357:10;;49343:58;;-1:-1:-1;;;49343:58:0;;;;;25070:25:1;;;-1:-1:-1;;;;;25131:32:1;;;25111:18;;;25104:60;49357:10:0;;;;;;;;49343:44;;25043:18:1;;49343:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43071:6353;;;;;42958:6466;;;:::o;11308:226::-;11428:7;11464:12;11456:6;;;;11448:29;;;;-1:-1:-1;;;11448:29:0;;;;;;;;:::i;:::-;-1:-1:-1;11488:9:0;11500:5;11504:1;11500;:5;:::i;:::-;11488:17;11308:226;-1:-1:-1;;;;;11308:226:0:o;37530:280::-;-1:-1:-1;;;;;37613:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;37613:39:0;;;;;;;;;;;;37665:80;;37691:15;;:42;;-1:-1:-1;;;37691:42:0;;-1:-1:-1;;;;;178:32:1;;;37691:42:0;;;160:51:1;37691:15:0;;;;:36;;133:18:1;;37691:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37665:80;37762:40;;;;;;-1:-1:-1;;;;;37762:40:0;;;;;;;;37530:280;;:::o;49432:289::-;49538:14;;49498:7;;-1:-1:-1;;;49538:14:0;;;;:175;;49695:18;49705:7;49695:9;:18::i;:::-;49538:175;;;-1:-1:-1;;;;;49595:21:0;;;;;;:12;:21;;;;;;49572:103;;49653:3;;49572:54;;49595:30;;49653:3;49595:25;:30::i;:::-;49572:18;49582:7;49572:9;:18::i;11940:312::-;12060:7;12095:12;12088:5;12080:28;;;;-1:-1:-1;;;12080:28:0;;;;;;;;:::i;:::-;-1:-1:-1;12119:9:0;12131:5;12135:1;12131;:5;:::i;50217:499::-;50307:16;;;50321:1;50307:16;;;;;;;;50283:21;;50307:16;;;;;;;;;;-1:-1:-1;50307:16:0;50283:40;;50352:4;50334;50339:1;50334:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50334:23:0;;;:7;;;;;;;;;;:23;;;;50378:15;;:22;;;-1:-1:-1;;;50378:22:0;;;;:15;;;;;:20;;:22;;;;;50334:7;;50378:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50368:4;50373:1;50368:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50368:32:0;;;:7;;;;;;;;;:32;50443:15;;50411:62;;50428:4;;50443:15;50461:11;50411:8;:62::i;:::-;50484:15;;:224;;-1:-1:-1;;;50484:224:0;;-1:-1:-1;;;;;50484:15:0;;;;:66;;:224;;50565:11;;50484:15;;50635:4;;50662;;50682:15;;50484:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50272:444;50217:499;:::o;32686:327::-;-1:-1:-1;;;;;32809:34:0;;32783:4;32809:34;;;:25;:34;;;;;;;;:76;;;;-1:-1:-1;32869:15:0;;-1:-1:-1;;;;;32847:38:0;;;32869:15;;32847:38;;32809:76;32805:90;;;-1:-1:-1;32894:1:0;32887:8;;32805:90;-1:-1:-1;;;;;32924:37:0;;;;;;:25;:37;;;;;;;;32920:51;;;-1:-1:-1;32970:1:0;32963:8;;32920:51;-1:-1:-1;33004:1:0;32686:327;;;;:::o;49729:480::-;49788:12;49803:13;:6;49814:1;49803:10;:13::i;:::-;49788:28;-1:-1:-1;49827:17:0;49847:16;:6;49788:28;49847:10;:16::i;:::-;49827:36;-1:-1:-1;49899:21:0;49931:22;49948:4;49931:16;:22::i;:::-;50034:18;50055:41;:21;50081:14;50055:25;:41::i;:::-;50034:62;;50107:35;50120:9;50131:10;50107:12;:35::i;:::-;50158:43;;;26495:25:1;;;26551:2;26536:18;;26529:34;;;26579:18;;;26572:34;;;50158:43:0;;26483:2:1;26468:18;50158:43:0;;;;;;;49777:432;;;;49729:480;:::o;51386:513::-;51566:15;;51534:62;;51551:4;;-1:-1:-1;;;;;51566:15:0;51584:11;51534:8;:62::i;:::-;51639:15;;-1:-1:-1;;;;;51639:15:0;:31;51678:9;51711:4;51731:11;51639:15;;51843:7;13014:6;;-1:-1:-1;;;;;13014:6:0;;12949:79;51843:7;51639:252;;;;;;-1:-1:-1;;;;;;51639:252:0;;;-1:-1:-1;;;;;26976:15:1;;;51639:252:0;;;26958:34:1;27008:18;;;27001:34;;;;27051:18;;;27044:34;;;;27094:18;;;27087:34;27158:15;;;27137:19;;;27130:44;51865:15:0;27190:19:1;;;27183:35;26892:19;;51639: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:548::-;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;;;691:3;876:1;871:2;862:6;851:9;847:22;843:31;836:42;946:2;939;935:7;930:2;922:6;918:15;914:29;903:9;899:45;895:54;887:62;;;;407:548;;;;:::o;960:131::-;-1:-1:-1;;;;;1035:31:1;;1025:42;;1015:70;;1081:1;1078;1071:12;1096:118;1182:5;1175:13;1168:21;1161:5;1158:32;1148:60;;1204:1;1201;1194:12;1219:382;1284:6;1292;1345:2;1333:9;1324:7;1320:23;1316:32;1313:52;;;1361:1;1358;1351:12;1313:52;1400:9;1387:23;1419:31;1444:5;1419:31;:::i;:::-;1469:5;-1:-1:-1;1526:2:1;1511:18;;1498:32;1539:30;1498:32;1539:30;:::i;:::-;1588:7;1578:17;;;1219:382;;;;;:::o;1606:315::-;1674:6;1682;1735:2;1723:9;1714:7;1710:23;1706:32;1703:52;;;1751:1;1748;1741:12;1703:52;1790:9;1777:23;1809:31;1834:5;1809:31;:::i;:::-;1859:5;1911:2;1896:18;;;;1883:32;;-1:-1:-1;;;1606:315:1:o;2118:248::-;2186:6;2194;2247:2;2235:9;2226:7;2222:23;2218:32;2215:52;;;2263:1;2260;2253:12;2215:52;-1:-1:-1;;2286:23:1;;;2356:2;2341:18;;;2328:32;;-1:-1:-1;2118:248:1:o;2788:247::-;2847:6;2900:2;2888:9;2879:7;2875:23;2871:32;2868:52;;;2916:1;2913;2906:12;2868:52;2955:9;2942:23;2974:31;2999:5;2974:31;:::i;3040:127::-;3101:10;3096:3;3092:20;3089:1;3082:31;3132:4;3129:1;3122:15;3156:4;3153:1;3146:15;3172:275;3243:2;3237:9;3308:2;3289:13;;-1:-1:-1;;3285:27:1;3273:40;;3343:18;3328:34;;3364:22;;;3325:62;3322:88;;;3390:18;;:::i;:::-;3426:2;3419:22;3172:275;;-1:-1:-1;3172:275:1:o;3452:183::-;3512:4;3545:18;3537:6;3534:30;3531:56;;;3567:18;;:::i;:::-;-1:-1:-1;3612:1:1;3608:14;3624:4;3604:25;;3452:183::o;3640:662::-;3694:5;3747:3;3740:4;3732:6;3728:17;3724:27;3714:55;;3765:1;3762;3755:12;3714:55;3801:6;3788:20;3827:4;3851:60;3867:43;3907:2;3867:43;:::i;:::-;3851:60;:::i;:::-;3945:15;;;4031:1;4027:10;;;;4015:23;;4011:32;;;3976:12;;;;4055:15;;;4052:35;;;4083:1;4080;4073:12;4052:35;4119:2;4111:6;4107:15;4131:142;4147:6;4142:3;4139:15;4131:142;;;4213:17;;4201:30;;4251:12;;;;4164;;4131:142;;;-1:-1:-1;4291:5:1;3640:662;-1:-1:-1;;;;;;3640:662:1:o;4307:1215::-;4425:6;4433;4486:2;4474:9;4465:7;4461:23;4457:32;4454:52;;;4502:1;4499;4492:12;4454:52;4542:9;4529:23;4571:18;4612:2;4604:6;4601:14;4598:34;;;4628:1;4625;4618:12;4598:34;4666:6;4655:9;4651:22;4641:32;;4711:7;4704:4;4700:2;4696:13;4692:27;4682:55;;4733:1;4730;4723:12;4682:55;4769:2;4756:16;4791:4;4815:60;4831:43;4871:2;4831:43;:::i;4815:60::-;4909:15;;;4991:1;4987:10;;;;4979:19;;4975:28;;;4940:12;;;;5015:19;;;5012:39;;;5047:1;5044;5037:12;5012:39;5071:11;;;;5091:217;5107:6;5102:3;5099:15;5091:217;;;5187:3;5174:17;5204:31;5229:5;5204:31;:::i;:::-;5248:18;;5124:12;;;;5286;;;;5091:217;;;5327:5;-1:-1:-1;;5370:18:1;;5357:32;;-1:-1:-1;;5401:16:1;;;5398:36;;;5430:1;5427;5420:12;5398:36;;5453:63;5508:7;5497:8;5486:9;5482:24;5453:63;:::i;:::-;5443:73;;;4307:1215;;;;;:::o;5527:456::-;5604:6;5612;5620;5673:2;5661:9;5652:7;5648:23;5644:32;5641:52;;;5689:1;5686;5679:12;5641:52;5728:9;5715:23;5747:31;5772:5;5747:31;:::i;:::-;5797:5;-1:-1:-1;5854:2:1;5839:18;;5826:32;5867:33;5826:32;5867:33;:::i;:::-;5527:456;;5919:7;;-1:-1:-1;;;5973:2:1;5958:18;;;;5945:32;;5527:456::o;6421:241::-;6477:6;6530:2;6518:9;6509:7;6505:23;6501:32;6498:52;;;6546:1;6543;6536:12;6498:52;6585:9;6572:23;6604:28;6626:5;6604:28;:::i;6891:799::-;7031:6;7039;7047;7055;7063;7071;7079;7087;7095;7103;7156:3;7144:9;7135:7;7131:23;7127:33;7124:53;;;7173:1;7170;7163:12;7124:53;-1:-1:-1;;7196:23:1;;;7266:2;7251:18;;7238:32;;-1:-1:-1;7317:2:1;7302:18;;7289:32;;7368:2;7353:18;;7340:32;;-1:-1:-1;7419:3:1;7404:19;;7391:33;;-1:-1:-1;7471:3:1;7456:19;;7443:33;;-1:-1:-1;7523:3:1;7508:19;;7495:33;;-1:-1:-1;7575:3:1;7560:19;;7547:33;;-1:-1:-1;7627:3:1;7612:19;;7599:33;;-1:-1:-1;7679:3:1;7664:19;7651:33;;-1:-1:-1;6891:799:1;-1:-1:-1;6891:799:1:o;8510:388::-;8578:6;8586;8639:2;8627:9;8618:7;8614:23;8610:32;8607:52;;;8655:1;8652;8645:12;8607:52;8694:9;8681:23;8713:31;8738:5;8713:31;:::i;:::-;8763:5;-1:-1:-1;8820:2:1;8805:18;;8792:32;8833:33;8792:32;8833:33;:::i;8903:356::-;9105:2;9087:21;;;9124:18;;;9117:30;9183:34;9178:2;9163:18;;9156:62;9250:2;9235:18;;8903:356::o;9264:127::-;9325:10;9320:3;9316:20;9313:1;9306:31;9356:4;9353:1;9346:15;9380:4;9377:1;9370:15;9396:168;9469:9;;;9500;;9517:15;;;9511:22;;9497:37;9487:71;;9538:18;;:::i;9569:380::-;9648:1;9644:12;;;;9691;;;9712:61;;9766:4;9758:6;9754:17;9744:27;;9712:61;9819:2;9811:6;9808:14;9788:18;9785:38;9782:161;;9865:10;9860:3;9856:20;9853:1;9846:31;9900:4;9897:1;9890:15;9928:4;9925:1;9918:15;9782:161;;9569:380;;;:::o;11428:127::-;11489:10;11484:3;11480:20;11477:1;11470:31;11520:4;11517:1;11510:15;11544:4;11541:1;11534:15;11847:135;11886:3;11907:17;;;11904:43;;11927:18;;:::i;:::-;-1:-1:-1;11974:1:1;11963:13;;11847:135::o;11987:251::-;12057:6;12110:2;12098:9;12089:7;12085:23;12081:32;12078:52;;;12126:1;12123;12116:12;12078:52;12158:9;12152:16;12177:31;12202:5;12177:31;:::i;12243:184::-;12313:6;12366:2;12354:9;12345:7;12341:23;12337:32;12334:52;;;12382:1;12379;12372:12;12334:52;-1:-1:-1;12405:16:1;;12243:184;-1:-1:-1;12243:184:1:o;12737:245::-;12804:6;12857:2;12845:9;12836:7;12832:23;12828:32;12825:52;;;12873:1;12870;12863:12;12825:52;12905:9;12899:16;12924:28;12946:5;12924:28;:::i;12987:306::-;13075:6;13083;13091;13144:2;13132:9;13123:7;13119:23;13115:32;13112:52;;;13160:1;13157;13150:12;13112:52;13189:9;13183:16;13173:26;;13239:2;13228:9;13224:18;13218:25;13208:35;;13283:2;13272:9;13268:18;13262:25;13252:35;;12987:306;;;;;:::o;16966:557::-;17079:6;17087;17095;17103;17111;17119;17172:3;17160:9;17151:7;17147:23;17143:33;17140:53;;;17189:1;17186;17179:12;17140:53;17221:9;17215:16;17240:31;17265:5;17240:31;:::i;:::-;17335:2;17320:18;;17314:25;17379:2;17364:18;;17358:25;17423:2;17408:18;;17402:25;17467:3;17452:19;;17446:26;17512:3;17497:19;;;17491:26;17290:5;;17314:25;;-1:-1:-1;17358:25:1;;17402;;-1:-1:-1;17446:26:1;-1:-1:-1;17491:26:1;;-1:-1:-1;16966:557:1;-1:-1:-1;;;16966:557:1:o;18342:217::-;18382:1;18408;18398:132;;18452:10;18447:3;18443:20;18440:1;18433:31;18487:4;18484:1;18477:15;18515:4;18512:1;18505:15;18398:132;-1:-1:-1;18544:9:1;;18342:217::o;18975:125::-;19040:9;;;19061:10;;;19058:36;;;19074:18;;:::i;21215:401::-;21417:2;21399:21;;;21456:2;21436:18;;;21429:30;21495:34;21490:2;21475:18;;21468:62;-1:-1:-1;;;21561:2:1;21546:18;;21539:35;21606:3;21591:19;;21215:401::o;21621:399::-;21823:2;21805:21;;;21862:2;21842:18;;;21835:30;21901:34;21896:2;21881:18;;21874:62;-1:-1:-1;;;21967:2:1;21952:18;;21945:33;22010:3;21995:19;;21621:399::o;25175:128::-;25242:9;;;25263:11;;;25260:37;;;25277:18;;:::i;25308:980::-;25570:4;25618:3;25607:9;25603:19;25649:6;25638:9;25631:25;25675:2;25713:6;25708:2;25697:9;25693:18;25686:34;25756:3;25751:2;25740:9;25736:18;25729:31;25780:6;25815;25809:13;25846:6;25838;25831:22;25884:3;25873:9;25869:19;25862:26;;25923:2;25915:6;25911:15;25897:29;;25944:1;25954:195;25968:6;25965:1;25962:13;25954:195;;;26033:13;;-1:-1:-1;;;;;26029:39:1;26017:52;;26124:15;;;;26089:12;;;;26065:1;25983:9;25954:195;;;-1:-1:-1;;;;;;;26205:32:1;;;;26200:2;26185:18;;26178:60;-1:-1:-1;;;26269:3:1;26254:19;26247:35;26166:3;25308:980;-1:-1:-1;;;25308:980:1:o

Metadata Hash

ipfs://e0aa0173fece5e45a8cb8f683e62aadc32a1776298df19028c8dfe6b6df4c4ca
Loading