BNB Price: $617.78 (+3.45%)
 

Overview

Max Total Supply

95,959,595,700,000,000NPL

Holders

77,573

Market

Price

$0.00 @ 0.000000 BNB

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 NPL

Value
$0.00
0x4bad7ac1bd4ba3640bfe51343befb6a4f7d9acd7
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
NPLTokenV2

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
File 1 of 1 : NLP.sol
pragma solidity ^0.8.4;

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

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

    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 WETH() external pure returns (address);

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

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

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

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

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

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

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, "!owner");
        _;
    }

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

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

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

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

    function token0() external view returns (address);

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

    function kLast() external view returns (uint);

    function totalSupply() external view returns (uint256);
}

interface IWBNB {
    function withdraw(uint wad) external; //unwarp WBNB -> BNB
}

contract NPLTokenV2 is IERC20, Ownable {
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;


    string private _name;
    string private _symbol;
    uint256 private _decimals;


    mapping(address => bool) public _feeWhiteList;


    uint256 private _tTotal;

    ISwapRouter public _swapRouter;
    address public currency;
    mapping(address => bool) public _swapPairList;

    bool private inSwap;

    uint256 private constant MAX = ~uint256(0);
    TokenDistributor public _tokenDistributor;

    uint256 public _buyRewardFee;
    uint256 public buy_burnFee;
    uint256 public _sellRewardFee;
    uint256 public sell_burnFee;

    address public feeReceiverA;
    address public feeReceiverB;

    uint256 public feePercentA;
    uint256 public feePercentB;

    function setFeeReceiverA(address addr) external onlyOwner {
        require(addr != address(0), "zero address");
        feeReceiverA = addr;
    }

    function setFeeReceiverB(address addr) external onlyOwner {
        require(addr != address(0), "zero address");
        feeReceiverB = addr;
    }

    function completeCustoms(uint256[] calldata customs) external onlyOwner {
        require(enableChangeTax, "tax change disabled");
    

        _buyRewardFee = customs[1];
        buy_burnFee = customs[2];
        _sellRewardFee = customs[3];
        sell_burnFee = customs[4];
        feePercentA = customs[5];
        feePercentB = customs[6];
        

        require(
            _buyRewardFee  + buy_burnFee + feePercentA + feePercentB < 4900,
            "fee too high"
        );
        require(
            _sellRewardFee  + sell_burnFee + feePercentA + feePercentB < 4900,
            "fee too high"
        );
    }


    mapping(address => uint256) public user2blocks;
    uint256 public batchBots;

    bool public currencyIsEth;

    address public ETH;
    uint256 public startTradeBlock;
    uint256 public lpTokenMinAmount;

    address public _mainPair;

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

    bool public enableOffTrade;
    bool public enableChangeTax;

    address[] public rewardPath;

    mapping(address => bool) public preSaleWhiteList;
    mapping(address => uint256) public preSaleQuota;
    bool public preSaleActive = true;

    function setPreSaleWhiteList(address[] calldata addrs, bool status) external onlyOwner {
        for (uint256 i = 0; i < addrs.length; i++) {
            preSaleWhiteList[addrs[i]] = status;
        }
    }

    function setPreSaleQuota(address addr, uint256 quota) external onlyOwner {
        preSaleQuota[addr] = quota;
    }

    function setPreSaleQuotaBatch(address[] calldata addrs, uint256[] calldata quotas) external onlyOwner {
        require(addrs.length == quotas.length, "length mismatch");
        for (uint256 i = 0; i < addrs.length; i++) {
            preSaleQuota[addrs[i]] = quotas[i];
        }
    }

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

    // Advanced functions, please do not try it lightly
    function setRewardPath(address[] calldata newPath) public onlyOwner {
        uint256 length = newPath.length;
        rewardPath = new address[](length);
        for (uint256 i; i < length; i++) {
            rewardPath[i] = newPath[i];
        }
        require(rewardPath[0] == currency, "dont supprot this path 1");
        require(rewardPath[length - 1] == ETH, "dont supprot this path 2");
    }

    constructor(
        string[] memory stringParams,
        address[] memory addressParams,
        uint256[] memory numberParams,
        bool[] memory boolParams
    ) {
        _name = stringParams[0];
        _symbol = stringParams[1];
        _decimals = numberParams[0];
        uint256 total = numberParams[1] * 10 ** _decimals;
        _tTotal = total;

        currency = addressParams[0];
        ISwapRouter swapRouter = ISwapRouter(addressParams[1]);
        address ReceiveAddress = addressParams[2];
        ETH = addressParams[3];
        feeReceiverA = addressParams[4];
        feeReceiverB = addressParams[5];
        require(IERC20(ETH).totalSupply() > 0, "not token supply");

        enableOffTrade = boolParams[0];
        enableChangeTax = boolParams[1];
        currencyIsEth = boolParams[2];

        if (currencyIsEth) {
            currency = swapRouter.WETH();
        }

        rewardPath = [currency];
        if (ETH != currency) {
            rewardPath.push(ETH);
        }

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

        _swapRouters[address(swapRouter)] = true;

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

        _buyRewardFee = numberParams[2];
        buy_burnFee = numberParams[3];

        _sellRewardFee = numberParams[4];
        sell_burnFee = numberParams[5];

        feePercentA = numberParams[6];
        feePercentB = numberParams[7];


        require(
           _buyRewardFee + buy_burnFee  + feePercentA + feePercentB < 4900,
            "fee too high"
        );
        require(
             _sellRewardFee + sell_burnFee  + feePercentA + feePercentB < 4900,
            "fee too high"
        );


        // Distribute tokens: 95% locked in contract as reserve, 5% to deployer for LP
        uint256 lpAmount = (total * 5) / 100;  // 5% for liquidity pool
        uint256 reserveAmount = total - lpAmount;  // 95% locked as reserve
        
        _balances[address(this)] = reserveAmount;  // 95% locked in contract
        emit Transfer(address(0), address(this), reserveAmount);
        
        _balances[msg.sender] = lpAmount;  // 5% to deployer for LP
        emit Transfer(address(0), msg.sender, lpAmount);
        
        _allowances[msg.sender][address(swapRouter)] = MAX;
        //require(currency < address(this),"??");
    
        _feeWhiteList[address(this)] = true;
        // _feeWhiteList[address(swapRouter)] = true;
        _feeWhiteList[msg.sender] = true;

        // Initialize daily release: 1/1000 of contract reserve per day
        dailyReleaseReceiver = ReceiveAddress; // Default to receive address
        lastReleaseTime = block.timestamp; // Initialize to deployment time


        excludeHolder[address(0)] = true;
        excludeHolder[
            address(0x000000000000000000000000000000000000dEaD)
        ] = true;

        holderRewardCondition = 100 * (10 ** IERC20(ETH).decimals());
        lpTokenMinAmount = 10 * (10 ** IERC20(ETH).decimals());

        _tokenDistributor = new TokenDistributor(currency);
    }

    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 (uint256) {
        return _decimals;
    }

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


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

    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 setLpTokenMinAmount(uint256 lpTokenMin) public onlyOwner {
        lpTokenMinAmount = lpTokenMin;
    }



    function _basicTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (bool) {
        _balances[sender] -= amount;
        _balances[recipient] += amount;
        emit Transfer(sender, recipient, amount);
        return true;
    }

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

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

        balanceOther = IERC20(tokenOther).balanceOf(_mainPair);
    }

    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;
        }
        //isAddLP
        if (balanceOther >= rOther + amountOther) {
            (liquidity, ) = calLiquidity(balanceOther, amount, rOther, rThis);
        }
    }

    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 = pairTotalSupply *
                        (rootK - rootKLast) *
                        8;
                    uint256 denominator = rootK * 17 + (rootKLast * 8);
                    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
            );
        }
    }



    uint256 public swapAtAmount = 0;

    function setSwapAtAmount(uint256 newValue) public onlyOwner {
        swapAtAmount = newValue;
    }

    bool public _strictCheck = true;
    function setStrictCheck(bool enable) external onlyOwner {
        _strictCheck = enable;
    }

    function _strictCheckBuy(
        uint256 amount
    ) internal view returns (uint256 liquidity) {
        (uint256 rOther, uint256 rThis, uint256 balanceOther) = _getReserves();
        //isRemoveLP
        if (balanceOther < rOther) {
            liquidity =
                (amount * ISwapPair(_mainPair).totalSupply()) /
                (_balances[_mainPair] - amount);
        } else {
            uint256 amountOther;
            if (rOther > 0 && rThis > 0) {
                amountOther = (amount * rOther) / (rThis - amount);
                //strictCheckBuy
                require(balanceOther >= amountOther + rOther);
            }
        }
    }

    function _isRemoveLiquidity(
        uint256 amount
    ) internal view returns (uint256 liquidity) {
        (uint256 rOther, , uint256 balanceOther) = _getReserves();
        //isRemoveLP
        if (balanceOther <= rOther) {
            liquidity =
                (amount * ISwapPair(_mainPair).totalSupply()) /
                (balanceOf(_mainPair) - amount);
        }
    }

    function _transfer(address from, address to, uint256 amount) private {
        uint256 balance = _balances[from];
        require(balance >= amount, "balanceNotEnough");

        if (startTradeBlock == 0 && preSaleActive) {
            if (!_feeWhiteList[from] && !_feeWhiteList[to]) {
                if (_swapPairList[from]) {
                    require(preSaleWhiteList[to], "not in presale whitelist");
                    require(preSaleQuota[to] >= amount, "exceed presale quota");
                    preSaleQuota[to] -= amount;
                }
            }
        }

        bool takeFee;
        bool isSell;
        bool isRemove;
        bool isAdd;

        uint256 addLPLiquidity;
        if (to == _mainPair && _swapRouters[msg.sender] && tx.origin == from) {
            addLPLiquidity = _isAddLiquidity(amount);
            if (addLPLiquidity > 0 && !isContract(from)) {
                isAdd = true;
            }
        }

        uint256 removeLPLiquidity;
        if (from == _mainPair) {
            removeLPLiquidity = _isRemoveLiquidity(amount);

            if (removeLPLiquidity > 0) {
                isRemove = true;
            }
        }


        if (startTradeBlock == 0 && enableOffTrade) {
            if (
                !_feeWhiteList[from] &&
                !_feeWhiteList[to] &&
                !_swapPairList[from] &&
                !_swapPairList[to]
            ) {
                require(!isContract(to), "cant add other lp");
            }
        }

        if (_swapPairList[from] || _swapPairList[to]) {
            if (!_feeWhiteList[from] && !_feeWhiteList[to]) {
                if (enableOffTrade  && !preSaleWhiteList[to] && !preSaleWhiteList[from]) {
                    bool star = startTradeBlock > 0;
                    require(
                        star || (0 < startLPBlock && isAdd), // _swapPairList[to]
                        "pausing"
                    );
                }

                if (_swapPairList[to]) {
                    if (!inSwap && !isAdd) {
                        uint256 contractTokenBalance = _balances[address(this)];
                        if (contractTokenBalance > swapAtAmount) {
                            swapTokenForFund(contractTokenBalance);
                        }
                    }
                }
                if (!isAdd && !isRemove) takeFee = true; // just swap fee
            }
            if (_swapPairList[to]) {
                isSell = true;
            }
        }


        _tokenTransfer(
            from,
            to,
            amount,
            takeFee,
            isSell
        );

        if (from != address(this)) {
            if (isSell) {
                addHolder(from);
            }
            processReward(lpRewardGas);
        }
    }

    function swapTokenForFund(
        uint256 tokenAmount
    ) private lockTheSwap {
        if (tokenAmount == 0) {
            return;
        }

        IERC20 _c = IERC20(currency);

        address[] memory toCurrencyPath = new address[](2);
        toCurrencyPath[0] = address(this);
        toCurrencyPath[1] = currency;
        try
            _swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
                tokenAmount,
                0,
                toCurrencyPath,
                address(_tokenDistributor),
                block.timestamp
            )
        {} catch {
            emit Failed_swapExactTokensForTokensSupportingFeeOnTransferTokens(
                0
            );
        }

        uint256 newBal = _c.balanceOf(address(_tokenDistributor));
        if (newBal != 0) {
            _c.transferFrom(address(_tokenDistributor), address(this), newBal);
        }
    }

    uint256 public lpRewardGas = 350000;

    function setLpRewardGas(uint256 newValue) public onlyOwner {
        require(
            newValue >= 200000 && newValue <= 2000000,
            "too high or too low"
        );
        lpRewardGas = newValue;
    }


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

        if (takeFee) {
            uint256 swapFee;
            if (isSell) {
                swapFee = _sellRewardFee;
            } else {
                swapFee = _buyRewardFee;
            }

            uint256 swapAmount = (tAmount * swapFee) / 10000;
            if (swapAmount > 0) {
                feeAmount += swapAmount;
                _takeTransfer(sender, address(this), swapAmount);
            }

            uint256 burnAmount;

            if (!isSell) {
                burnAmount = (tAmount * buy_burnFee) / 10000;
            } else {
                burnAmount = (tAmount * sell_burnFee) / 10000;
            }

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

            if (feePercentA > 0) {
                require(feeReceiverA != address(0), "feeReceiverA not set");
                uint256 feeA = (tAmount * feePercentA) / 10000;
                feeAmount += feeA;
                _takeTransfer(sender, feeReceiverA, feeA);
            }

            if (feePercentB > 0) {
                require(feeReceiverB != address(0), "feeReceiverB not set");
                uint256 feeB = (tAmount * feePercentB) / 10000;
                feeAmount += feeB;
                _takeTransfer(sender, feeReceiverB, feeB);
            }

        }


        _takeTransfer(sender, recipient, tAmount - feeAmount);
    }

    event Failed_swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 value
    );

    address public generateLpReceiverAddr;

    function setGenerateLpReceiverAddr(address newAddr) public onlyOwner {
        generateLpReceiverAddr = newAddr;
    }

    // Daily release feature (from contract reserve)
    uint256 public lastReleaseTime; // Last time release was executed
    uint256 public constant RELEASE_INTERVAL = 24 hours; // 24 hours interval
    address public dailyReleaseReceiver; // Address to receive daily released tokens

    // Set the daily release receiver address (only owner can modify before renouncing ownership)
    function setDailyReleaseReceiver(address newReceiver) external onlyOwner {
        require(newReceiver != address(0), "zero address");
        dailyReleaseReceiver = newReceiver;
    }

    // Anyone can call this function to release daily tokens, but only once every 24 hours
    // Releases 1/1000 of contract's current reserve balance
    function releaseDaily() external {
        require(dailyReleaseReceiver != address(0), "receiver not set");
        require(block.timestamp >= lastReleaseTime + RELEASE_INTERVAL, "too soon");

        uint256 contractBalance = _balances[address(this)];
        require(contractBalance > 0, "no reserve balance");
        
        // Calculate 1/1000 of contract's current balance
        uint256 releaseAmount = contractBalance / 1000;
        require(releaseAmount > 0, "release amount too small");

        lastReleaseTime = block.timestamp;
        
        // Transfer from contract to receiver (not minting, total supply stays same)
        _balances[address(this)] -= releaseAmount;
        _balances[dailyReleaseReceiver] += releaseAmount;
        
        emit Transfer(address(this), dailyReleaseReceiver, releaseAmount);
        emit DailyRelease(dailyReleaseReceiver, releaseAmount, contractBalance, block.timestamp);
    }

    // Event for daily release
    event DailyRelease(address indexed receiver, uint256 releaseAmount, uint256 reserveBalance, uint256 timestamp);

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


    function isContract(address _addr) private view returns (bool) {
        uint32 size;
        assembly {
            size := extcodesize(_addr)
        }
        return (size > 0);
    }

    uint256 public startLPBlock;

    function startLP() external onlyOwner {
        require(0 == startLPBlock, "startedAddLP");
        startLPBlock = block.number;
    }

    function stopLP() external onlyOwner {
        startLPBlock = 0;
    }

    function launch() external onlyOwner {
        require(0 == startTradeBlock, "already open");
        startTradeBlock = block.number;
        preSaleActive = false;
    }

    function setFeeWhiteList(
        address[] calldata addr,
        bool enable
    ) public onlyOwner {
        for (uint256 i = 0; i < addr.length; i++) {
            _feeWhiteList[addr[i]] = enable;
        }
    }

    function disableChangeTax() public onlyOwner {
        enableChangeTax = false;
    }

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



    receive() external payable {}

    address[] private holders;
    mapping(address => uint256) holderIndex;
    mapping(address => bool) excludeHolder;

    function multiAddHolder(address[] calldata accounts) public onlyOwner {
        for (uint256 i; i < accounts.length; i++) {
            if (ISwapPair(_mainPair).balanceOf(accounts[i]) > 0) {
                addHolder(accounts[i]);
            }
        }
    }

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

    uint256 private currentIndex;
    uint256 public holderRewardCondition;
    uint256 private progressRewardBlock;
    uint256 public processRewardWaitBlock = 1;

    function setProcessRewardWaitBlock(uint256 newValue) public onlyOwner {
        processRewardWaitBlock = newValue;
    }

    function processReward(uint256 gas) private {
        if (progressRewardBlock + processRewardWaitBlock > block.number) {
            return;
        }

        IERC20 FIST = IERC20(ETH);

        uint256 balance = FIST.balanceOf(address(this));
        if (balance < holderRewardCondition) {
            return;
        }
        IERC20 holdToken = IERC20(_mainPair);
        uint256 holdTokenTotal = holdToken.totalSupply();

        address shareHolder;
        uint256 tokenBalance;
        uint256 amount;

        uint256 shareholderCount = holders.length;

        uint256 gasUsed = 0;
        uint256 iterations = 0;
        uint256 gasLeft = gasleft();
        balance = FIST.balanceOf(address(this));
        while (gasUsed < gas && iterations < shareholderCount) {
            if (currentIndex >= shareholderCount) {
                currentIndex = 0;
            }
            shareHolder = holders[currentIndex];
            tokenBalance = holdToken.balanceOf(shareHolder);
            if (tokenBalance > 0 && !excludeHolder[shareHolder] && tokenBalance >= lpTokenMinAmount) {
                amount = (balance * tokenBalance) / holdTokenTotal;
                if (amount > 0 && FIST.balanceOf(address(this)) > amount) {
                    FIST.transfer(shareHolder, amount);
                }
            }

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

        progressRewardBlock = block.number;
    }

    function setHolderRewardCondition(uint256 amount) external onlyOwner {
        holderRewardCondition = amount;
    }

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

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "viaIR": true,
  "evmVersion": "paris",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"string[]","name":"stringParams","type":"string[]"},{"internalType":"address[]","name":"addressParams","type":"address[]"},{"internalType":"uint256[]","name":"numberParams","type":"uint256[]"},{"internalType":"bool[]","name":"boolParams","type":"bool[]"}],"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":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"releaseAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reserveBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"DailyRelease","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Failed_swapExactTokensForTokensSupportingFeeOnTransferTokens","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":"ETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RELEASE_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyRewardFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_mainPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellRewardFee","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":[],"name":"_swapRouter","outputs":[{"internalType":"contract ISwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_swapRouters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenDistributor","outputs":[{"internalType":"contract TokenDistributor","name":"","type":"address"}],"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":[],"name":"batchBots","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buy_burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"customs","type":"uint256[]"}],"name":"completeCustoms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currency","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currencyIsEth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dailyReleaseReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableChangeTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableChangeTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableOffTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feePercentA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feePercentB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeReceiverA","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeReceiverB","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"generateLpReceiverAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holderRewardCondition","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastReleaseTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lpRewardGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpTokenMinAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"multiAddHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"preSaleQuota","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"preSaleWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"processRewardWaitBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"releaseDaily","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardPath","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sell_burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newReceiver","type":"address"}],"name":"setDailyReleaseReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setExcludeHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setFeeReceiverA","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setFeeReceiverB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addr","type":"address[]"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setFeeWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddr","type":"address"}],"name":"setGenerateLpReceiverAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setHolderRewardCondition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setLpRewardGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lpTokenMin","type":"uint256"}],"name":"setLpTokenMinAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"quota","type":"uint256"}],"name":"setPreSaleQuota","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"},{"internalType":"uint256[]","name":"quotas","type":"uint256[]"}],"name":"setPreSaleQuotaBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setPreSaleWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setProcessRewardWaitBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"newPath","type":"address[]"}],"name":"setRewardPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"setStrictCheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setSwapAtAmount","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":[],"name":"startLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startLPBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTradeBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stopLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAtAmount","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":"","type":"address"}],"name":"user2blocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080806040523461097c5761452f803803809161001c8285610ea0565b8339810160808282031261097c5781516001600160401b03811161097c57820181601f8201121561097c57805161005281610ec3565b916100606040519384610ea0565b81835260208084019260051b8201019084821161097c5760208101925b828410610e0e575050505060208301516001600160401b03811161097c5783019082601f8301121561097c578151916100b583610ec3565b926100c36040519485610ea0565b80845260208085019160051b8301019185831161097c57602001905b828210610df65750505060408401516001600160401b03811161097c5784019383601f8601121561097c5784519461011686610ec3565b956101246040519788610ea0565b80875260208088019160051b8301019186831161097c57602001905b828210610de6575050506060810151906001600160401b03821161097c57019280601f8501121561097c57835161017681610ec3565b946101846040519687610ea0565b81865260208087019260051b82010192831161097c57602001905b828210610dce575050600080546001600160a01b03191633908117825591507f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600160ff19601d541617601d556000601f55600160ff196020541617602055620557306021556001602c5561021681610efb565b518051906001600160401b03821161092457600354600181811c91168015610dc4575b6020821014610cdd57601f8111610d75575b50602090601f8311600114610d085761028393929160009183610cfd575b50508160011b916000199060031b1c191617600355610f08565b5180519093906001600160401b03811161092457600454600181811c91168015610cf3575b6020821014610cdd57601f8111610c83575b50602094601f8211600114610c1c57948192939495600092610c11575b50508160011b916000199060031b1c1916176004555b6102f681610efb565b51908160055561030f61030882610f08565b5192610f6f565b9182810292818404149015171561093a5760078290556001600160a01b0361033684610efb565b51600980546001600160a01b03191692909116821790556001600160a01b0361035e85610f08565b5116936001600160a01b0361037282610f18565b51169561037e82610f28565b5160168054610100600160a81b0319811660089390931b610100600160a81b03169283179182905591939192916004916020916001600160a01b036103c282610f38565b51601080546001600160a01b031916929091169190911790556001600160a01b03906103ed90610f48565b51601180546001600160a01b031916929091169190911790556040516318160ddd60e01b8152928391829060081c6001600160a01b03165afa90811561091857600091610bdf575b5015610ba7576104818161044a60ff93610efb565b5115156019548460a81b61045d84610f08565b51151560a81b16918560a01b9060a01b169061ffff60a01b19161717601955610f18565b5115151691829160018060a81b0319161717601655610b34575b50604051602081016001600160401b038111828210176109245760405260018060a01b03600954168152601a546001601a5580600110610aef575b50601a60005260206000209060005b60018110610ad25750506016546009546001600160a01b0360089290921c82169250168103610a83575b50600880546001600160a01b031916841790553060009081526002602090815260408083206001600160a01b03808816855290835281842060001990819055600954925163095ea7b360e01b8152600481018990526024810191909152938492604492849291165af1801561091857610a4c575b5082600052601e6020526040600020600160ff1982541617905560405163c45a015560e01b8152602081600481875afa90811561091857600091610a0d575b506009546040516364e329cb60e11b81523060048201526001600160a01b0391821660248201529160209183916044918391600091165af1908115610918576000916109d3575b50601980546001600160a01b0319166001600160a01b039290921691821790556000908152600a60205260409020805460ff1916600117905561064b81610f18565b519081600c5561065a81610f28565b5180600d5561066882610f38565b519081600e5561067783610f48565b519283600f558051600610156109bd5760e0810151806012558151600710156109bd576106cc611324956106d1956106cc886106d16106d79b6106cc886106cc6101006106cc9c01519c8d9485601355610f7d565b610f7d565b10610f8a565b600581028181046005148215171561093a57606490049081810390811161093a5730600052600160205280604060002055604051908152600060008051602061450f83398151915260203093a333600052600160205280604060002055604051908152600060008051602061450f83398151915260203393a33360008181526002602090815260408083206001600160a01b03958616845282528083206000199055308352600682528083208054600160ff1991821681179092559484528184208054861682179055602480546001600160a01b0319169790971790965542602355602882527f363f266dc0e266c1e93609619fd0d0d198ad468f99870b4dab43223b5a640e1a805485168717905561dead9092527fbbe88529b5ffa7b624cff06f0ef07c7e870a9b23b5b38a8a3fc35e04dc498bd18054909316909417909155601654905163313ce56760e01b815260089190911c9091169181600481855afa801561091857600090610989575b6108509150610f6f565b8060640290606482040361093a57602a5560405163313ce56760e01b815290602090829060049082905afa801561091857600090610950575b6108939150610f6f565b80600a0290600a82040361093a57601855600954604051906001600160a01b031661012a8083016001600160401b038111848210176109245760209284926143c5843981520301906000f0801561091857600b8054610100600160a81b03191660089290921b610100600160a81b03169190911790556040516133ff9081610fc68239f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b506020813d602011610981575b8161096a60209383610ea0565b8101031261097c576108939051610889565b600080fd5b3d915061095d565b506020813d6020116109b5575b816109a360209383610ea0565b8101031261097c576108509051610846565b3d9150610996565b634e487b7160e01b600052603260045260246000fd5b90506020813d602011610a05575b816109ee60209383610ea0565b8101031261097c576109ff90610eda565b38610609565b3d91506109e1565b90506020813d602011610a44575b81610a2860209383610ea0565b8101031261097c576020610a3d600092610eda565b91506105c2565b3d9150610a1b565b6020813d602011610a7b575b81610a6560209383610ea0565b8101031261097c57610a7690610eee565b610583565b3d9150610a58565b601a5468010000000000000000811015610924576001810180601a558110156109bd57601a6000526000805160206144ef8339815191520180546001600160a01b03191690911790553861050f565b81516001600160a01b0316818401556020909101906001016104e5565b601a600052610b2e906000805160206144ef833981519152017f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63f610f58565b386104d6565b6040516315ab88c960e31b8152602081600481885afa90811561091857600091610b6d575b506001600160a01b0316176009553861049b565b90506020813d602011610b9f575b81610b8860209383610ea0565b8101031261097c57610b9990610eda565b38610b59565b3d9150610b7b565b60405162461bcd60e51b815260206004820152601060248201526f6e6f7420746f6b656e20737570706c7960801b6044820152606490fd5b90506020813d602011610c09575b81610bfa60209383610ea0565b8101031261097c575138610435565b3d9150610bed565b0151905038806102d7565b601f198216956004600052806000209160005b888110610c6b57508360019596979810610c52575b505050811b016004556102ed565b015160001960f88460031b161c19169055388080610c44565b91926020600181928685015181550194019201610c2f565b6004600052610ccd907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f840160051c81019160208510610cd3575b601f0160051c0190610f58565b386102ba565b9091508190610cc0565b634e487b7160e01b600052602260045260246000fd5b90607f16906102a8565b015190503880610269565b90601f198316916003600052816000209260005b818110610d5d575091600193918561028397969410610d44575b505050811b01600355610f08565b015160001960f88460031b161c19169055388080610d36565b92936020600181928786015181550195019301610d1c565b6003600052610dbe907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f850160051c81019160208610610cd357601f0160051c0190610f58565b3861024b565b90607f1690610239565b60208091610ddb84610eee565b81520191019061019f565b8151815260209182019101610140565b60208091610e0384610eda565b8152019101906100df565b83516001600160401b03811161097c57820186603f8201121561097c5760208101516001600160401b0381116109245760405191610e56601f8301601f191660200184610ea0565b818352604081830101891061097c5760005b828110610e895750509181600060208095819501015281520193019261007d565b806020808093850101015182828701015201610e68565b601f909101601f19168101906001600160401b0382119082101761092457604052565b6001600160401b0381116109245760051b60200190565b51906001600160a01b038216820361097c57565b5190811515820361097c57565b8051156109bd5760200190565b8051600110156109bd5760400190565b8051600210156109bd5760600190565b8051600310156109bd5760800190565b8051600410156109bd5760a00190565b8051600510156109bd5760c00190565b818110610f63575050565b60008155600101610f58565b604d811161093a57600a0a90565b9190820180921161093a57565b15610f9157565b60405162461bcd60e51b815260206004820152600c60248201526b0cccaca40e8dede40d0d2ced60a31b6044820152606490fdfe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806301339c2114611c5557806301873d8f14611c1657806301986fad14611bd757806304c23ffe14611bb557806305833c2b14611b5557806306fdde0314611a9657806307c3adf014611a78578063095ea7b3146119fe5780630f890b86146119c9578063150e4c471461195757806315d07d821461193457806318160ddd1461191657806318d12855146118e95780631930381c146118cb5780631dbbaebd146117ba578063206c17bb146117915780632171dcc91461173157806323b872dd14611683578063255412d914611665578063313ce567146116475780633b9f1912146115fb5780633bb82eb6146115cd5780633c11100d1461158e5780633ccfdbcd146115545780634188bf5a1461152b57806341c50d1a1461150d5780634482004e146114ef57806346c123b6146114a95780634e11769f1461146a578063553193ca1461144c578063605324f2146113c4578063621823e6146113a65780636402511e146113785780636b6113681461135a578063704c7ec0146112e857806370a08231146112a7578063715018a614611249578063771f74481461121b57806381d09def14610f8e5780638322fff214610f615780638449470814610f3e5780638691752414610f205780638718b24f14610ef35780638da5cb5b14610eca5780638e1e083814610ea157806395d89b4114610d9d57806395e3667914610d7f57806397d6e6eb14610b71578063992db38f14610b0a5780639cc0e3c714610ac8578063a26df02514610a6e578063a842486114610a0e578063a9059cbb146109dd578063aa582b4214610896578063ab47a2911461085c578063b494690314610833578063bc0457391461080a578063be4fe9a5146107ec578063c14505d5146107ce578063c213d62d146107a0578063c5870ee7146106af578063c92d567e14610689578063cde5f58f1461066b578063ce4d9f151461062e578063d285e6ab14610610578063d5986433146105ea578063d710569b1461059a578063dd62ed3e14610549578063ddca92d414610520578063dfaf734a14610502578063e5a6b10f146104d9578063eb10b741146104bb578063ebababe314610461578063ed8d9bda146104075763f2fde38b0361000e573461040257602036600319011261040257610372611cc6565b6000546001600160a01b0381169161038b338414611ded565b6001600160a01b03169182156103d25782907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a36001600160a01b03191617600055005b60405162461bcd60e51b815260206004820152600860248201526706e657720697320360c41b6044820152606490fd5b600080fd5b3461040257602036600319011261040257610420611cc6565b61043560018060a01b03600054163314611ded565b6001600160a01b0316610449811515611ecd565b6001600160601b0360a01b6011541617601155600080f35b346104025760203660031901126104025761047a611cc6565b61048f60018060a01b03600054163314611ded565b6001600160a01b03166104a3811515611ecd565b6001600160601b0360a01b6010541617601055600080f35b34610402576000366003190112610402576020602a54604051908152f35b34610402576000366003190112610402576009546040516001600160a01b039091168152602090f35b34610402576000366003190112610402576020602354604051908152f35b34610402576000366003190112610402576024546040516001600160a01b039091168152602090f35b3461040257604036600319011261040257610562611cc6565b61056a611cdc565b6001600160a01b039182166000908152600260209081526040808320949093168252928352819020549051908152f35b34610402576020366003190112610402576105b3611cc6565b6105c860018060a01b03600054163314611ded565b602280546001600160a01b0319166001600160a01b0392909216919091179055005b3461040257600036600319011261040257602060ff60195460a81c166040519015158152f35b34610402576000366003190112610402576020602154604051908152f35b346104025760003660031901126104025761066761064a611f57565b604080519384526020840192909252908201529081906060820190565b0390f35b34610402576000366003190112610402576020604051620151808152f35b3461040257600036600319011261040257602060ff60195460a01c166040519015158152f35b346104025760403660031901126104025760043567ffffffffffffffff8111610402576106e0903690600401611d4a565b9060243567ffffffffffffffff811161040257610701903690600401611d4a565b92909161071960018060a01b03600054163314611ded565b8382036107695760005b82811061072c57005b8061073a6001928787611e44565b35828060a01b0361075461074f848888611e44565b611e54565b16600052601c60205260406000205501610723565b60405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606490fd5b34610402576020366003190112610402576107c660018060a01b03600054163314611ded565b600435602a55005b34610402576000366003190112610402576020601354604051908152f35b34610402576000366003190112610402576020600e54604051908152f35b34610402576000366003190112610402576010546040516001600160a01b039091168152602090f35b34610402576000366003190112610402576011546040516001600160a01b039091168152602090f35b34610402576020366003190112610402576001600160a01b0361087d611cc6565b16600052601c6020526020604060002054604051908152f35b346104025760203660031901126104025760043567ffffffffffffffff8111610402576108c7903690600401611d4a565b6108dc60018060a01b03600054163314611ded565b60ff60195460a81c16156109a257806001101561098c5760208201359182600c55816002101561098c57604081013580600d55826003101561098c5760608201359182600e55836004101561098c5760808101359384600f55806005101561098c5760a082013590816012556006101561098c576109816113249561098695610981886109866100199b6109818861098160c06109819c01359c8d9485601355611ea0565b611ea0565b10611f08565b634e487b7160e01b600052603260045260246000fd5b60405162461bcd60e51b81526020600482015260136024820152721d185e0818da185b99d948191a5cd8589b1959606a1b6044820152606490fd5b3461040257604036600319011261040257610a036109f9611cc6565b6024359033612133565b602060405160018152f35b3461040257604036600319011261040257610019610a2a611cc6565b610a32611cf2565b90610a4860018060a01b03600054163314611ded565b60018060a01b0316600052600a60205260406000209060ff801983541691151516179055565b3461040257602036600319011261040257610a87611cc6565b610a9c60018060a01b03600054163314611ded565b6001600160a01b0316610ab0811515611ecd565b6001600160601b0360a01b6024541617602455600080f35b3461040257602036600319011261040257600435601a5481101561040257610af1602091611db7565b905460405160039290921b1c6001600160a01b03168152f35b3461040257600036600319011261040257610b3060018060a01b03600054163314611ded565b602554610b3d5743602555005b60405162461bcd60e51b815260206004820152600c60248201526b0737461727465644164644c560a41b6044820152606490fd5b34610402576000366003190112610402576024546001600160a01b031615610d4757602354620151808101809111610d31574210610d01573060005260016020526040600020548015610cc7576103e881048015610c82577ff7980a2481c9873c50cbedccb43b1d25feb36e3752edbcfc2403292e19afee9d90426023553060005260016020526040600020610c08828254611e68565b905560018060a01b036024541660005260016020526040600020610c2d828254611ea0565b905560018060a01b036024541692836040518381527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203092a36040805192835260208301919091524290820152606090a2005b60405162461bcd60e51b815260206004820152601860248201527f72656c6561736520616d6f756e7420746f6f20736d616c6c00000000000000006044820152606490fd5b60405162461bcd60e51b81526020600482015260126024820152716e6f20726573657276652062616c616e636560701b6044820152606490fd5b60405162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b6044820152606490fd5b634e487b7160e01b600052601160045260246000fd5b60405162461bcd60e51b815260206004820152601060248201526f1c9958d95a5d995c881b9bdd081cd95d60821b6044820152606490fd5b34610402576000366003190112610402576020601554604051908152f35b346104025760003660031901126104025760405160006004548060011c90600181168015610e97575b602083108114610e8357828552908115610e5f5750600114610dff575b61066783610df381850382611e22565b60405191829182611d01565b91905060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b916000905b808210610e4557509091508101602001610df3610de3565b919260018160209254838588010152019101909291610e2d565b60ff191660208086019190915291151560051b84019091019150610df39050610de3565b634e487b7160e01b84526022600452602484fd5b91607f1691610dc6565b34610402576000366003190112610402576022546040516001600160a01b039091168152602090f35b34610402576000366003190112610402576000546040516001600160a01b039091168152602090f35b3461040257600036600319011261040257600b5460405160089190911c6001600160a01b03168152602090f35b34610402576000366003190112610402576020601f54604051908152f35b3461040257600036600319011261040257602060ff601d54166040519015158152f35b346104025760003660031901126104025760165460405160089190911c6001600160a01b03168152602090f35b346104025760203660031901126104025760043567ffffffffffffffff811161040257610fbf903690600401611d4a565b90610fd560018060a01b03600054163314611ded565b610fde82611e75565b610feb6040519182611e22565b828152610ff783611e75565b602082019190601f1901368337519067ffffffffffffffff821161120557600160401b821161120557601a5482601a558083106111ca575b50601a60005260005b82811061119f5750505060005b82811061115857826000601a541561114457601a90526000805160206133aa833981519152546009546001600160a01b039182169116036110ff576000198101908111610d315761109590611db7565b905460165460039290921b1c6001600160a01b0390811660089290921c16036110ba57005b60405162461bcd60e51b815260206004820152601860248201527f646f6e742073757070726f7420746869732070617468203200000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601860248201527f646f6e742073757070726f7420746869732070617468203100000000000000006044820152606490fd5b634e487b7160e01b81526032600452602490fd5b8061119961116c61074f6001948787611e44565b61117583611db7565b81546001600160a01b0393841660039290921b91821b9390911b1916919091179055565b01611045565b81516001600160a01b03166000805160206133aa833981519152820155602090910190600101611038565b6000805160206133aa83398151915201826000805160206133aa833981519152015b8181106111f9575061102f565b600081556001016111ec565b634e487b7160e01b600052604160045260246000fd5b346104025760203660031901126104025761124160018060a01b03600054163314611ded565b600435601855005b346104025760003660031901126104025760008054906001600160a01b038216611274338214611ded565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a36001600160a01b031916600055005b346104025760203660031901126104025760206112e06112c5611cc6565b6001600160a01b031660009081526001602052604090205490565b604051908152f35b34610402576112f636611d7b565b9061130c60018060a01b03600054163314611ded565b60005b81811061131857005b6001906001600160a01b0361133161074f838689611e44565b16600052601b6020526113548460406000209060ff801983541691151516179055565b0161130f565b34610402576000366003190112610402576020600f54604051908152f35b346104025760203660031901126104025761139e60018060a01b03600054163314611ded565b600435601f55005b34610402576000366003190112610402576020602c54604051908152f35b34610402576020366003190112610402576004356113ed60018060a01b03600054163314611ded565b62030d408110158061143f575b1561140457602155005b60405162461bcd60e51b8152602060048201526013602482015272746f6f2068696768206f7220746f6f206c6f7760681b6044820152606490fd5b50621e84808111156113fa565b34610402576000366003190112610402576020601754604051908152f35b34610402576020366003190112610402576001600160a01b0361148b611cc6565b16600052601b602052602060ff604060002054166040519015158152f35b3461040257602036600319011261040257600435801515809103610402576114dc60018060a01b03600054163314611ded565b60ff801960205416911617602055600080f35b34610402576000366003190112610402576020602554604051908152f35b34610402576000366003190112610402576020601854604051908152f35b34610402576000366003190112610402576019546040516001600160a01b039091168152602090f35b34610402576020366003190112610402576001600160a01b03611575611cc6565b1660005260146020526020604060002054604051908152f35b34610402576020366003190112610402576001600160a01b036115af611cc6565b16600052600a602052602060ff604060002054166040519015158152f35b34610402576020366003190112610402576115f360018060a01b03600054163314611ded565b600435602c55005b3461040257604036600319011261040257611614611cc6565b61162960018060a01b03600054163314611ded565b6001600160a01b03166000908152601c602052604090206024359055005b34610402576000366003190112610402576020600554604051908152f35b34610402576000366003190112610402576020600d54604051908152f35b346104025760603660031901126104025761169c611cc6565b6116a4611cdc565b906116b3604435809383612133565b6001600160a01b031660008181526002602090815260408083203384529091529020549091906001016116eb57602060405160018152f35b600082815260026020908152604080832033845290915290205461170f9190611e68565b6000918252600260209081526040808420338552909152909120558080610a03565b346104025760403660031901126104025761001961174d611cc6565b611755611cf2565b9061176b60018060a01b03600054163314611ded565b60018060a01b0316600052601e60205260406000209060ff801983541691151516179055565b34610402576000366003190112610402576008546040516001600160a01b039091168152602090f35b346104025760203660031901126104025760043567ffffffffffffffff8111610402576117eb903690600401611d4a565b9061180160018060a01b03600054163314611ded565b60005b82811061180d57005b6019546001600160a01b0316602061182961074f848787611e44565b6040516370a0823160e01b81526001600160a01b03909116600482015291829060249082905afa9081156118bf5760009161188a575b509060019161186f575b01611804565b61188561188061074f838787611e44565b61207d565b611869565b906020823d82116118b7575b816118a360209383611e22565b810103126118b4575051600161185f565b80fd5b3d9150611896565b6040513d6000823e3d90fd5b34610402576000366003190112610402576020601254604051908152f35b346104025760003660031901126104025761190f60018060a01b03600054163314611ded565b6000602555005b34610402576000366003190112610402576020600754604051908152f35b3461040257600036600319011261040257602060ff601654166040519015158152f35b346104025761196536611d7b565b9061197b60018060a01b03600054163314611ded565b60005b81811061198757005b6001906001600160a01b036119a061074f838689611e44565b1660005260066020526119c38460406000209060ff801983541691151516179055565b0161197e565b34610402576000366003190112610402576119ef60018060a01b03600054163314611ded565b6019805460ff60a81b19169055005b3461040257604036600319011261040257611a17611cc6565b3360008181526002602090815260408083206001600160a01b03909516808452948252918290206024359081905591519182527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a3602060405160018152f35b34610402576000366003190112610402576020600c54604051908152f35b346104025760003660031901126104025760405160006003548060011c90600181168015611b4b575b602083108114610e8357828552908115610e5f5750600114611aeb5761066783610df381850382611e22565b91905060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b916000905b808210611b3157509091508101602001610df3610de3565b919260018160209254838588010152019101909291611b19565b91607f1691611abf565b3461040257604036600319011261040257610019611b71611cc6565b611b79611cf2565b90611b8f60018060a01b03600054163314611ded565b60018060a01b0316600052602860205260406000209060ff801983541691151516179055565b3461040257600036600319011261040257602060ff8154166040519015158152f35b34610402576020366003190112610402576001600160a01b03611bf8611cc6565b166000526006602052602060ff604060002054166040519015158152f35b34610402576020366003190112610402576001600160a01b03611c37611cc6565b16600052601e602052602060ff604060002054166040519015158152f35b3461040257600036600319011261040257611c7b60018060a01b03600054163314611ded565b601754611c925743601755601d805460ff19169055005b60405162461bcd60e51b815260206004820152600c60248201526b30b63932b0b23c9037b832b760a11b6044820152606490fd5b600435906001600160a01b038216820361040257565b602435906001600160a01b038216820361040257565b60243590811515820361040257565b91909160208152825180602083015260005b818110611d34575060409293506000838284010152601f8019910116010190565b8060208092870101516040828601015201611d13565b9181601f840112156104025782359167ffffffffffffffff8311610402576020808501948460051b01011161040257565b6040600319820112610402576004359067ffffffffffffffff821161040257611da691600401611d4a565b909160243580151581036104025790565b601a5481101561098c57601a60005260206000200190600090565b60265481101561098c57602660005260206000200190600090565b15611df457565b60405162461bcd60e51b815260206004820152600660248201526510b7bbb732b960d11b6044820152606490fd5b90601f8019910116810190811067ffffffffffffffff82111761120557604052565b919081101561098c5760051b0190565b356001600160a01b03811681036104025790565b91908203918211610d3157565b67ffffffffffffffff81116112055760051b60200190565b81810292918115918404141715610d3157565b91908201809211610d3157565b8115611eb7570490565b634e487b7160e01b600052601260045260246000fd5b15611ed457565b60405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b6044820152606490fd5b15611f0f57565b60405162461bcd60e51b815260206004820152600c60248201526b0cccaca40e8dede40d0d2ced60a31b6044820152606490fd5b51906001600160701b038216820361040257565b601954604051630240bc6b60e21b8152916001600160a01b0390911690606083600481855afa9283156118bf57600090819461201d575b506009546001600160701b03948516946001600160a01b039091169116308210156120145760209094935b6024604051809481936370a0823160e01b835260048301525afa9081156118bf57600091611fe5575090565b90506020813d60201161200c575b8161200060209383611e22565b81010312610402575190565b3d9150611ff3565b92602090611fb9565b93506060843d606011612075575b8161203860609383611e22565b810103126118b45761204984611f43565b90604061205860208701611f43565b95015163ffffffff8116036118b457506001600160701b03611f8e565b3d915061202b565b803b612130576001600160a01b038116600081815260276020526040902054909190156120a8575050565b60265491821580156120ee575b6120be57505050565b600052602760205281604060002055600160401b821015611205576111758260016120ec9401602655611dd2565b565b5060006026541561114457602690527f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a3594546001600160a01b03168114156120b5565b50565b9160018060a01b038316908160005260016020528060406000205410612ca3576017541580612c97575b612b69575b601954600093908490819081906001600160a01b038086169082161480612b51575b80612b48575b6127ad575b6001600160a01b03811687146126ec575b601754159081806126df575b612610575b87600052600a60205260ff6040600020541680156125ee575b612420575b505050508360005260016020526121eb83604060002054611e68565b846000526001602052604060002055600090612240575b61220f9061221693611e68565b90856132f2565b3003612220575050565b612231575b506120ec602154612f47565b61223a9061207d565b38612225565b841561241257612710612256600e545b85611e8d565b04806123ff575b50846123ea57612710612272600d5485611e8d565b045b8481612385575b505060125480612316575b5060135480612296575b50612202565b9260018060a01b03601154169081156122da576122d261220f936122cb6127106122c36122169986611e8d565b048092611ea0565b938a6132f2565b935090612290565b60405162461bcd60e51b8152602060048201526014602482015273199959549958d95a5d995c90881b9bdd081cd95d60621b6044820152606490fd5b6010546001600160a01b03169182156123495761233c6127106122c36123439488611e8d565b92886132f2565b38612286565b60405162461bcd60e51b8152602060048201526014602482015273199959549958d95a5d995c90481b9bdd081cd95d60621b6044820152606490fd5b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206123b68461dead9596611ea0565b9484600052600182526123ce81604060002054611ea0565b8560005260018352604060002055604051908152a3388461227b565b6127106123f9600f5485611e8d565b04612274565b905061240c8130886132f2565b3861225d565b612710612256600c54612250565b87600052600660205260ff6040600020541615806125cb575b612475575b505050506001600160a01b0382166000908152600a602052604090205460ff1661246c575b388080806121cf565b60019450612463565b60a01c60ff16806125a8575b8061258f575b61253a575b506001600160a01b0384166000908152600a602052604090205460ff166124d6575b1590816124cd575b506124c5575b3880808061243e565b5060016124bc565b905015386124b6565b600b5460ff81161580612532575b6124ef575b506124ae565b306000526001602052604060002054601f54811161250e575b506124e9565b60016125219260ff191617600b55612cf3565b60ff19600b5416600b553880612508565b5081156124e4565b80159061257c575b1561254d573861248c565b60405162461bcd60e51b815260206004820152600760248201526670617573696e6760c81b6044820152606490fd5b5060255415158015612542575080612542565b5086600052601b60205260ff6040600020541615612487565b506001600160a01b0385166000908152601b602052604090205460ff1615612481565b506001600160a01b03861660009081526006602052604090205460ff1615612439565b506001600160a01b0386166000908152600a602052604090205460ff166121ca565b87600052600660205260ff6040600020541615806126bc575b806126a3575b80612680575b156121b15763ffffffff863b16156121b15760405162461bcd60e51b8152602060048201526011602482015270063616e7420616464206f74686572206c7607c1b6044820152606490fd5b506001600160a01b0386166000908152600a602052604090205460ff1615612635565b5087600052600a60205260ff604060002054161561262f565b506001600160a01b03861660009081526006602052604090205460ff1615612629565b5060ff8160a01c166121ac565b60006126f6611f57565b9050111561270d575b156121a057600192506121a0565b506040516318160ddd60e01b81526020816004816001600160a01b0386165afa9081156118bf57600091612779575b5061274a6127749188611e8d565b6001600160a01b03831660009081526001602052604090205461276e908990611e68565b90611ead565b6126ff565b90506020813d6020116127a5575b8161279460209383611e22565b81010312610402575161274a61273c565b3d9150612787565b60006127b7611f57565b906127d6600082858d81151580612b3f575b612b28575b509050611ea0565b821015612806575b5050501515806127f7575b1561218f576001915061218f565b5063ffffffff893b16156127e9565b6040516318160ddd60e01b81529293506000916020846004816001600160a01b038a165afa938415612b1d578394612ae5575b5060085460405163c45a015560e01b81528591602090829060049082906001600160a01b03165afa908115612abd576004916020918791612ac8575b50604051622fcfcb60e31b815292839182906001600160a01b03165afa908115612abd578591612a8e575b50604051637464fc3d60e01b8152906020826004816001600160a01b038d165afa918215612a8357908695949392918f99989792612a3d575b50879291906001600160a01b0316612965575b50506128f791611e68565b938361292957505050506129139161290e91611e8d565b613358565b6103e7198101908111610d31575b3880806127de565b8395506129479061294261294e95612942949597611e8d565b611ead565b948b611e8d565b90508082101561295e5750612921565b9050612921565b80156128ec57909161297d61290e8661298393611e8d565b91613358565b808211612993575b8792506128ec565b9091929394959697506129af6129a98284611e68565b84611e8d565b918260031b9280840460081490151715612a2957601181029080820460111490151715612a29578160031b9180830460081490151715612a29578897969594928f99949261276e90612a0093611ea0565b9081612a0f575b82935061298b565b6128f79392965090612a2091611ea0565b94909138612a07565b634e487b7160e01b87526011600452602487fd5b915091929394959697506020813d602011612a7b575b81612a6060209383611e22565b81010312612a7757518d97969594939291876128d9565b8580fd5b3d9150612a53565b6040513d88823e3d90fd5b612ab0915060203d602011612ab6575b612aa88183611e22565b8101906132d3565b386128a0565b503d612a9e565b6040513d87823e3d90fd5b612adf9150823d8411612ab657612aa88183611e22565b38612875565b9093506020813d602011612b15575b81612b0160209383611e22565b81010312612b1157519238612839565b8280fd5b3d9150612af4565b6040513d85823e3d90fd5b612b3793509061294291611e8d565b82858d6127ce565b508215156127c9565b5086321461218a565b5033600052601e60205260ff60406000205416612184565b81600052600660205260ff604060002054161580612c74575b156121625781600052600a60205260ff6040600020541615612162576001600160a01b0383166000818152601b602052604090205460ff1615612c2f5780600052601c6020528160406000205410612bf357600052601c6020526040600020612bec828254611e68565b9055612162565b60405162461bcd60e51b81526020600482015260146024820152736578636565642070726573616c652071756f746160601b6044820152606490fd5b60405162461bcd60e51b815260206004820152601860248201527f6e6f7420696e2070726573616c652077686974656c69737400000000000000006044820152606490fd5b506001600160a01b03831660009081526006602052604090205460ff1615612b82565b5060ff601d541661215d565b60405162461bcd60e51b815260206004820152601060248201526f0c4c2d8c2dcc6ca9cdee88adcdeeaced60831b6044820152606490fd5b90816020910312610402575180151581036104025790565b6000908015612f345760018060a01b03600954169160405191612d17606084611e22565b60028352602083016040368237835115612f2057308152835160011015612f20576040840185905260088054600b546001600160a01b0391821694921c1690833b15612f1c579491849391604051968794635c11d79560e01b865260a4860191600487015286602487015260a060448701525180915260c485019290865b818110612ef7575050508380928692606483015242608483015203925af19182612ee7575b5090612ee2577f6c37756e80daba6f4df0d5bfa6cddadfe23601acc1a27dc8d4aa427de91467886020604051838152a15b600b546040516370a0823160e01b815260089190911c6001600160a01b03166004820181905290602081602481875afa908115612b1d578391612eb0575b5080612e36575b50505050565b60646020928460405196879485936323b872dd60e01b8552600485015230602485015260448401525af1908115612ea45750612e75575b808080612e30565b612e969060203d602011612e9d575b612e8e8183611e22565b810190612cdb565b5038612e6d565b503d612e84565b604051903d90823e3d90fd5b90506020813d602011612eda575b81612ecb60209383611e22565b81010312610402575138612e29565b3d9150612ebe565b612deb565b81612ef191611e22565b38612dba565b82516001600160a01b0316855288975089965060209485019490920191600101612d95565b8480fd5b634e487b7160e01b83526032600452602483fd5b5050565b6000198114610d315760010190565b612f56602b54602c5490611ea0565b4310612130576016546040516370a0823160e01b815230600482015260089190911c6001600160a01b03169190602081602481865afa9081156118bf576000916132a1575b50602a5411612f34576019546040516318160ddd60e01b815292906001600160a01b0316602084600481845afa9384156118bf5760009461326d575b506026549360009384955a97604051926370a0823160e01b84523060048501526020846024818a5afa93841561326257889461322a575b50979890965b88811080613221575b1561321157826029541015613207575b613038602954611dd2565b90546040516370a0823160e01b815260039290921b1c6001600160a01b03166004820181905292906020816024818b5afa80156118bf5787916000916131d3575b50801515806131ba575b806131ae575b6130c7575b50506130a692506130a0905a90611e68565b90611ea0565b956130bf5a996130b7602954612f38565b602955612f38565b989096613014565b906129426130d59288611e8d565b80151580613146575b6130ea575b869061308e565b6040519363a9059cbb60e01b85526004850152602484015260208360448160008c5af19081156118bf576130a6936130a092613128575b50906130e3565b61313f9060203d8111612e9d57612e8e8183611e22565b5038613121565b506040516370a0823160e01b81523060048201526020816024818d5afa80156118bf57829160009161317a575b50116130de565b91506020823d82116131a6575b8161319460209383611e22565b810103126118b4575081905138613173565b3d9150613187565b50601854811015613089565b5084600052602860205260ff6040600020541615613083565b91506020823d82116131ff575b816131ed60209383611e22565b810103126118b4575086905138613079565b3d91506131e0565b600060295561302d565b5050505050505091505043602b55565b50828a1061301d565b9093506020813d60201161325a575b8161324660209383611e22565b810103126132565751923861300e565b8780fd5b3d9150613239565b6040513d8a823e3d90fd5b9093506020813d602011613299575b8161328960209383611e22565b8101031261040257519238612fd7565b3d915061327c565b90506020813d6020116132cb575b816132bc60209383611e22565b81010312610402575138612f9b565b3d91506132af565b9081602091031261040257516001600160a01b03811681036104025790565b919060207fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9160018060a01b031693846000526001825261333884604060002054611ea0565b856000526001835260406000205560405193845260018060a01b031692a3565b906000600383111561339c5750818060011c60018101809111610d3157905b838210613382575050565b909250613393836109818184611ead565b60011c90613377565b916133a357565b6001915056fe057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63ea264697066735822122073fd7b97222992f62e18860a2c40dfeb54fa6ff71a35d64fbb3ca7b8b6aba45664736f6c634300081c003360808060405234609f5760208161012a8038038091601c828560b7565b833981010312609f57516001600160a01b03811690819003609f57602060009160446040518094819363095ea7b360e01b8352336004840152811960248401525af1801560ab576075575b604051603a90816100f08239f35b6020813d60201160a4575b81608b6020938360b7565b81010312609f575180151503609f57386067565b600080fd5b3d91506080565b6040513d6000823e3d90fd5b601f909101601f19168101906001600160401b0382119082101760d957604052565b634e487b7160e01b600052604160045260246000fdfe600080fdfea264697066735822122029983e591b7e2821fd9c333549538746b90a36f539ae050f9e761db5d31bc60464736f6c634300081c0033057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63eddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000114e61706f6c656f6e20546f6b656e20563200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034e504c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000055d398326f99059ff775485246999027b319795500000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e0000000000000000000000006c9d807361740d4519ce857dc051b333930be5c100000000000000000000000055d398326f99059ff775485246999027b3197955000000000000000000000000ced4f510170e37d7fd93cfef0798060b59b266990000000000000000000000002543d7a49ef0b89456d402121fe3f89754143445000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000154eabe6e7d150000000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806301339c2114611c5557806301873d8f14611c1657806301986fad14611bd757806304c23ffe14611bb557806305833c2b14611b5557806306fdde0314611a9657806307c3adf014611a78578063095ea7b3146119fe5780630f890b86146119c9578063150e4c471461195757806315d07d821461193457806318160ddd1461191657806318d12855146118e95780631930381c146118cb5780631dbbaebd146117ba578063206c17bb146117915780632171dcc91461173157806323b872dd14611683578063255412d914611665578063313ce567146116475780633b9f1912146115fb5780633bb82eb6146115cd5780633c11100d1461158e5780633ccfdbcd146115545780634188bf5a1461152b57806341c50d1a1461150d5780634482004e146114ef57806346c123b6146114a95780634e11769f1461146a578063553193ca1461144c578063605324f2146113c4578063621823e6146113a65780636402511e146113785780636b6113681461135a578063704c7ec0146112e857806370a08231146112a7578063715018a614611249578063771f74481461121b57806381d09def14610f8e5780638322fff214610f615780638449470814610f3e5780638691752414610f205780638718b24f14610ef35780638da5cb5b14610eca5780638e1e083814610ea157806395d89b4114610d9d57806395e3667914610d7f57806397d6e6eb14610b71578063992db38f14610b0a5780639cc0e3c714610ac8578063a26df02514610a6e578063a842486114610a0e578063a9059cbb146109dd578063aa582b4214610896578063ab47a2911461085c578063b494690314610833578063bc0457391461080a578063be4fe9a5146107ec578063c14505d5146107ce578063c213d62d146107a0578063c5870ee7146106af578063c92d567e14610689578063cde5f58f1461066b578063ce4d9f151461062e578063d285e6ab14610610578063d5986433146105ea578063d710569b1461059a578063dd62ed3e14610549578063ddca92d414610520578063dfaf734a14610502578063e5a6b10f146104d9578063eb10b741146104bb578063ebababe314610461578063ed8d9bda146104075763f2fde38b0361000e573461040257602036600319011261040257610372611cc6565b6000546001600160a01b0381169161038b338414611ded565b6001600160a01b03169182156103d25782907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a36001600160a01b03191617600055005b60405162461bcd60e51b815260206004820152600860248201526706e657720697320360c41b6044820152606490fd5b600080fd5b3461040257602036600319011261040257610420611cc6565b61043560018060a01b03600054163314611ded565b6001600160a01b0316610449811515611ecd565b6001600160601b0360a01b6011541617601155600080f35b346104025760203660031901126104025761047a611cc6565b61048f60018060a01b03600054163314611ded565b6001600160a01b03166104a3811515611ecd565b6001600160601b0360a01b6010541617601055600080f35b34610402576000366003190112610402576020602a54604051908152f35b34610402576000366003190112610402576009546040516001600160a01b039091168152602090f35b34610402576000366003190112610402576020602354604051908152f35b34610402576000366003190112610402576024546040516001600160a01b039091168152602090f35b3461040257604036600319011261040257610562611cc6565b61056a611cdc565b6001600160a01b039182166000908152600260209081526040808320949093168252928352819020549051908152f35b34610402576020366003190112610402576105b3611cc6565b6105c860018060a01b03600054163314611ded565b602280546001600160a01b0319166001600160a01b0392909216919091179055005b3461040257600036600319011261040257602060ff60195460a81c166040519015158152f35b34610402576000366003190112610402576020602154604051908152f35b346104025760003660031901126104025761066761064a611f57565b604080519384526020840192909252908201529081906060820190565b0390f35b34610402576000366003190112610402576020604051620151808152f35b3461040257600036600319011261040257602060ff60195460a01c166040519015158152f35b346104025760403660031901126104025760043567ffffffffffffffff8111610402576106e0903690600401611d4a565b9060243567ffffffffffffffff811161040257610701903690600401611d4a565b92909161071960018060a01b03600054163314611ded565b8382036107695760005b82811061072c57005b8061073a6001928787611e44565b35828060a01b0361075461074f848888611e44565b611e54565b16600052601c60205260406000205501610723565b60405162461bcd60e51b815260206004820152600f60248201526e0d8cadccee8d040dad2e6dac2e8c6d608b1b6044820152606490fd5b34610402576020366003190112610402576107c660018060a01b03600054163314611ded565b600435602a55005b34610402576000366003190112610402576020601354604051908152f35b34610402576000366003190112610402576020600e54604051908152f35b34610402576000366003190112610402576010546040516001600160a01b039091168152602090f35b34610402576000366003190112610402576011546040516001600160a01b039091168152602090f35b34610402576020366003190112610402576001600160a01b0361087d611cc6565b16600052601c6020526020604060002054604051908152f35b346104025760203660031901126104025760043567ffffffffffffffff8111610402576108c7903690600401611d4a565b6108dc60018060a01b03600054163314611ded565b60ff60195460a81c16156109a257806001101561098c5760208201359182600c55816002101561098c57604081013580600d55826003101561098c5760608201359182600e55836004101561098c5760808101359384600f55806005101561098c5760a082013590816012556006101561098c576109816113249561098695610981886109866100199b6109818861098160c06109819c01359c8d9485601355611ea0565b611ea0565b10611f08565b634e487b7160e01b600052603260045260246000fd5b60405162461bcd60e51b81526020600482015260136024820152721d185e0818da185b99d948191a5cd8589b1959606a1b6044820152606490fd5b3461040257604036600319011261040257610a036109f9611cc6565b6024359033612133565b602060405160018152f35b3461040257604036600319011261040257610019610a2a611cc6565b610a32611cf2565b90610a4860018060a01b03600054163314611ded565b60018060a01b0316600052600a60205260406000209060ff801983541691151516179055565b3461040257602036600319011261040257610a87611cc6565b610a9c60018060a01b03600054163314611ded565b6001600160a01b0316610ab0811515611ecd565b6001600160601b0360a01b6024541617602455600080f35b3461040257602036600319011261040257600435601a5481101561040257610af1602091611db7565b905460405160039290921b1c6001600160a01b03168152f35b3461040257600036600319011261040257610b3060018060a01b03600054163314611ded565b602554610b3d5743602555005b60405162461bcd60e51b815260206004820152600c60248201526b0737461727465644164644c560a41b6044820152606490fd5b34610402576000366003190112610402576024546001600160a01b031615610d4757602354620151808101809111610d31574210610d01573060005260016020526040600020548015610cc7576103e881048015610c82577ff7980a2481c9873c50cbedccb43b1d25feb36e3752edbcfc2403292e19afee9d90426023553060005260016020526040600020610c08828254611e68565b905560018060a01b036024541660005260016020526040600020610c2d828254611ea0565b905560018060a01b036024541692836040518381527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203092a36040805192835260208301919091524290820152606090a2005b60405162461bcd60e51b815260206004820152601860248201527f72656c6561736520616d6f756e7420746f6f20736d616c6c00000000000000006044820152606490fd5b60405162461bcd60e51b81526020600482015260126024820152716e6f20726573657276652062616c616e636560701b6044820152606490fd5b60405162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b6044820152606490fd5b634e487b7160e01b600052601160045260246000fd5b60405162461bcd60e51b815260206004820152601060248201526f1c9958d95a5d995c881b9bdd081cd95d60821b6044820152606490fd5b34610402576000366003190112610402576020601554604051908152f35b346104025760003660031901126104025760405160006004548060011c90600181168015610e97575b602083108114610e8357828552908115610e5f5750600114610dff575b61066783610df381850382611e22565b60405191829182611d01565b91905060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b916000905b808210610e4557509091508101602001610df3610de3565b919260018160209254838588010152019101909291610e2d565b60ff191660208086019190915291151560051b84019091019150610df39050610de3565b634e487b7160e01b84526022600452602484fd5b91607f1691610dc6565b34610402576000366003190112610402576022546040516001600160a01b039091168152602090f35b34610402576000366003190112610402576000546040516001600160a01b039091168152602090f35b3461040257600036600319011261040257600b5460405160089190911c6001600160a01b03168152602090f35b34610402576000366003190112610402576020601f54604051908152f35b3461040257600036600319011261040257602060ff601d54166040519015158152f35b346104025760003660031901126104025760165460405160089190911c6001600160a01b03168152602090f35b346104025760203660031901126104025760043567ffffffffffffffff811161040257610fbf903690600401611d4a565b90610fd560018060a01b03600054163314611ded565b610fde82611e75565b610feb6040519182611e22565b828152610ff783611e75565b602082019190601f1901368337519067ffffffffffffffff821161120557600160401b821161120557601a5482601a558083106111ca575b50601a60005260005b82811061119f5750505060005b82811061115857826000601a541561114457601a90526000805160206133aa833981519152546009546001600160a01b039182169116036110ff576000198101908111610d315761109590611db7565b905460165460039290921b1c6001600160a01b0390811660089290921c16036110ba57005b60405162461bcd60e51b815260206004820152601860248201527f646f6e742073757070726f7420746869732070617468203200000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601860248201527f646f6e742073757070726f7420746869732070617468203100000000000000006044820152606490fd5b634e487b7160e01b81526032600452602490fd5b8061119961116c61074f6001948787611e44565b61117583611db7565b81546001600160a01b0393841660039290921b91821b9390911b1916919091179055565b01611045565b81516001600160a01b03166000805160206133aa833981519152820155602090910190600101611038565b6000805160206133aa83398151915201826000805160206133aa833981519152015b8181106111f9575061102f565b600081556001016111ec565b634e487b7160e01b600052604160045260246000fd5b346104025760203660031901126104025761124160018060a01b03600054163314611ded565b600435601855005b346104025760003660031901126104025760008054906001600160a01b038216611274338214611ded565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a36001600160a01b031916600055005b346104025760203660031901126104025760206112e06112c5611cc6565b6001600160a01b031660009081526001602052604090205490565b604051908152f35b34610402576112f636611d7b565b9061130c60018060a01b03600054163314611ded565b60005b81811061131857005b6001906001600160a01b0361133161074f838689611e44565b16600052601b6020526113548460406000209060ff801983541691151516179055565b0161130f565b34610402576000366003190112610402576020600f54604051908152f35b346104025760203660031901126104025761139e60018060a01b03600054163314611ded565b600435601f55005b34610402576000366003190112610402576020602c54604051908152f35b34610402576020366003190112610402576004356113ed60018060a01b03600054163314611ded565b62030d408110158061143f575b1561140457602155005b60405162461bcd60e51b8152602060048201526013602482015272746f6f2068696768206f7220746f6f206c6f7760681b6044820152606490fd5b50621e84808111156113fa565b34610402576000366003190112610402576020601754604051908152f35b34610402576020366003190112610402576001600160a01b0361148b611cc6565b16600052601b602052602060ff604060002054166040519015158152f35b3461040257602036600319011261040257600435801515809103610402576114dc60018060a01b03600054163314611ded565b60ff801960205416911617602055600080f35b34610402576000366003190112610402576020602554604051908152f35b34610402576000366003190112610402576020601854604051908152f35b34610402576000366003190112610402576019546040516001600160a01b039091168152602090f35b34610402576020366003190112610402576001600160a01b03611575611cc6565b1660005260146020526020604060002054604051908152f35b34610402576020366003190112610402576001600160a01b036115af611cc6565b16600052600a602052602060ff604060002054166040519015158152f35b34610402576020366003190112610402576115f360018060a01b03600054163314611ded565b600435602c55005b3461040257604036600319011261040257611614611cc6565b61162960018060a01b03600054163314611ded565b6001600160a01b03166000908152601c602052604090206024359055005b34610402576000366003190112610402576020600554604051908152f35b34610402576000366003190112610402576020600d54604051908152f35b346104025760603660031901126104025761169c611cc6565b6116a4611cdc565b906116b3604435809383612133565b6001600160a01b031660008181526002602090815260408083203384529091529020549091906001016116eb57602060405160018152f35b600082815260026020908152604080832033845290915290205461170f9190611e68565b6000918252600260209081526040808420338552909152909120558080610a03565b346104025760403660031901126104025761001961174d611cc6565b611755611cf2565b9061176b60018060a01b03600054163314611ded565b60018060a01b0316600052601e60205260406000209060ff801983541691151516179055565b34610402576000366003190112610402576008546040516001600160a01b039091168152602090f35b346104025760203660031901126104025760043567ffffffffffffffff8111610402576117eb903690600401611d4a565b9061180160018060a01b03600054163314611ded565b60005b82811061180d57005b6019546001600160a01b0316602061182961074f848787611e44565b6040516370a0823160e01b81526001600160a01b03909116600482015291829060249082905afa9081156118bf5760009161188a575b509060019161186f575b01611804565b61188561188061074f838787611e44565b61207d565b611869565b906020823d82116118b7575b816118a360209383611e22565b810103126118b4575051600161185f565b80fd5b3d9150611896565b6040513d6000823e3d90fd5b34610402576000366003190112610402576020601254604051908152f35b346104025760003660031901126104025761190f60018060a01b03600054163314611ded565b6000602555005b34610402576000366003190112610402576020600754604051908152f35b3461040257600036600319011261040257602060ff601654166040519015158152f35b346104025761196536611d7b565b9061197b60018060a01b03600054163314611ded565b60005b81811061198757005b6001906001600160a01b036119a061074f838689611e44565b1660005260066020526119c38460406000209060ff801983541691151516179055565b0161197e565b34610402576000366003190112610402576119ef60018060a01b03600054163314611ded565b6019805460ff60a81b19169055005b3461040257604036600319011261040257611a17611cc6565b3360008181526002602090815260408083206001600160a01b03909516808452948252918290206024359081905591519182527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a3602060405160018152f35b34610402576000366003190112610402576020600c54604051908152f35b346104025760003660031901126104025760405160006003548060011c90600181168015611b4b575b602083108114610e8357828552908115610e5f5750600114611aeb5761066783610df381850382611e22565b91905060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b916000905b808210611b3157509091508101602001610df3610de3565b919260018160209254838588010152019101909291611b19565b91607f1691611abf565b3461040257604036600319011261040257610019611b71611cc6565b611b79611cf2565b90611b8f60018060a01b03600054163314611ded565b60018060a01b0316600052602860205260406000209060ff801983541691151516179055565b3461040257600036600319011261040257602060ff8154166040519015158152f35b34610402576020366003190112610402576001600160a01b03611bf8611cc6565b166000526006602052602060ff604060002054166040519015158152f35b34610402576020366003190112610402576001600160a01b03611c37611cc6565b16600052601e602052602060ff604060002054166040519015158152f35b3461040257600036600319011261040257611c7b60018060a01b03600054163314611ded565b601754611c925743601755601d805460ff19169055005b60405162461bcd60e51b815260206004820152600c60248201526b30b63932b0b23c9037b832b760a11b6044820152606490fd5b600435906001600160a01b038216820361040257565b602435906001600160a01b038216820361040257565b60243590811515820361040257565b91909160208152825180602083015260005b818110611d34575060409293506000838284010152601f8019910116010190565b8060208092870101516040828601015201611d13565b9181601f840112156104025782359167ffffffffffffffff8311610402576020808501948460051b01011161040257565b6040600319820112610402576004359067ffffffffffffffff821161040257611da691600401611d4a565b909160243580151581036104025790565b601a5481101561098c57601a60005260206000200190600090565b60265481101561098c57602660005260206000200190600090565b15611df457565b60405162461bcd60e51b815260206004820152600660248201526510b7bbb732b960d11b6044820152606490fd5b90601f8019910116810190811067ffffffffffffffff82111761120557604052565b919081101561098c5760051b0190565b356001600160a01b03811681036104025790565b91908203918211610d3157565b67ffffffffffffffff81116112055760051b60200190565b81810292918115918404141715610d3157565b91908201809211610d3157565b8115611eb7570490565b634e487b7160e01b600052601260045260246000fd5b15611ed457565b60405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b6044820152606490fd5b15611f0f57565b60405162461bcd60e51b815260206004820152600c60248201526b0cccaca40e8dede40d0d2ced60a31b6044820152606490fd5b51906001600160701b038216820361040257565b601954604051630240bc6b60e21b8152916001600160a01b0390911690606083600481855afa9283156118bf57600090819461201d575b506009546001600160701b03948516946001600160a01b039091169116308210156120145760209094935b6024604051809481936370a0823160e01b835260048301525afa9081156118bf57600091611fe5575090565b90506020813d60201161200c575b8161200060209383611e22565b81010312610402575190565b3d9150611ff3565b92602090611fb9565b93506060843d606011612075575b8161203860609383611e22565b810103126118b45761204984611f43565b90604061205860208701611f43565b95015163ffffffff8116036118b457506001600160701b03611f8e565b3d915061202b565b803b612130576001600160a01b038116600081815260276020526040902054909190156120a8575050565b60265491821580156120ee575b6120be57505050565b600052602760205281604060002055600160401b821015611205576111758260016120ec9401602655611dd2565b565b5060006026541561114457602690527f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a3594546001600160a01b03168114156120b5565b50565b9160018060a01b038316908160005260016020528060406000205410612ca3576017541580612c97575b612b69575b601954600093908490819081906001600160a01b038086169082161480612b51575b80612b48575b6127ad575b6001600160a01b03811687146126ec575b601754159081806126df575b612610575b87600052600a60205260ff6040600020541680156125ee575b612420575b505050508360005260016020526121eb83604060002054611e68565b846000526001602052604060002055600090612240575b61220f9061221693611e68565b90856132f2565b3003612220575050565b612231575b506120ec602154612f47565b61223a9061207d565b38612225565b841561241257612710612256600e545b85611e8d565b04806123ff575b50846123ea57612710612272600d5485611e8d565b045b8481612385575b505060125480612316575b5060135480612296575b50612202565b9260018060a01b03601154169081156122da576122d261220f936122cb6127106122c36122169986611e8d565b048092611ea0565b938a6132f2565b935090612290565b60405162461bcd60e51b8152602060048201526014602482015273199959549958d95a5d995c90881b9bdd081cd95d60621b6044820152606490fd5b6010546001600160a01b03169182156123495761233c6127106122c36123439488611e8d565b92886132f2565b38612286565b60405162461bcd60e51b8152602060048201526014602482015273199959549958d95a5d995c90481b9bdd081cd95d60621b6044820152606490fd5b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206123b68461dead9596611ea0565b9484600052600182526123ce81604060002054611ea0565b8560005260018352604060002055604051908152a3388461227b565b6127106123f9600f5485611e8d565b04612274565b905061240c8130886132f2565b3861225d565b612710612256600c54612250565b87600052600660205260ff6040600020541615806125cb575b612475575b505050506001600160a01b0382166000908152600a602052604090205460ff1661246c575b388080806121cf565b60019450612463565b60a01c60ff16806125a8575b8061258f575b61253a575b506001600160a01b0384166000908152600a602052604090205460ff166124d6575b1590816124cd575b506124c5575b3880808061243e565b5060016124bc565b905015386124b6565b600b5460ff81161580612532575b6124ef575b506124ae565b306000526001602052604060002054601f54811161250e575b506124e9565b60016125219260ff191617600b55612cf3565b60ff19600b5416600b553880612508565b5081156124e4565b80159061257c575b1561254d573861248c565b60405162461bcd60e51b815260206004820152600760248201526670617573696e6760c81b6044820152606490fd5b5060255415158015612542575080612542565b5086600052601b60205260ff6040600020541615612487565b506001600160a01b0385166000908152601b602052604090205460ff1615612481565b506001600160a01b03861660009081526006602052604090205460ff1615612439565b506001600160a01b0386166000908152600a602052604090205460ff166121ca565b87600052600660205260ff6040600020541615806126bc575b806126a3575b80612680575b156121b15763ffffffff863b16156121b15760405162461bcd60e51b8152602060048201526011602482015270063616e7420616464206f74686572206c7607c1b6044820152606490fd5b506001600160a01b0386166000908152600a602052604090205460ff1615612635565b5087600052600a60205260ff604060002054161561262f565b506001600160a01b03861660009081526006602052604090205460ff1615612629565b5060ff8160a01c166121ac565b60006126f6611f57565b9050111561270d575b156121a057600192506121a0565b506040516318160ddd60e01b81526020816004816001600160a01b0386165afa9081156118bf57600091612779575b5061274a6127749188611e8d565b6001600160a01b03831660009081526001602052604090205461276e908990611e68565b90611ead565b6126ff565b90506020813d6020116127a5575b8161279460209383611e22565b81010312610402575161274a61273c565b3d9150612787565b60006127b7611f57565b906127d6600082858d81151580612b3f575b612b28575b509050611ea0565b821015612806575b5050501515806127f7575b1561218f576001915061218f565b5063ffffffff893b16156127e9565b6040516318160ddd60e01b81529293506000916020846004816001600160a01b038a165afa938415612b1d578394612ae5575b5060085460405163c45a015560e01b81528591602090829060049082906001600160a01b03165afa908115612abd576004916020918791612ac8575b50604051622fcfcb60e31b815292839182906001600160a01b03165afa908115612abd578591612a8e575b50604051637464fc3d60e01b8152906020826004816001600160a01b038d165afa918215612a8357908695949392918f99989792612a3d575b50879291906001600160a01b0316612965575b50506128f791611e68565b938361292957505050506129139161290e91611e8d565b613358565b6103e7198101908111610d31575b3880806127de565b8395506129479061294261294e95612942949597611e8d565b611ead565b948b611e8d565b90508082101561295e5750612921565b9050612921565b80156128ec57909161297d61290e8661298393611e8d565b91613358565b808211612993575b8792506128ec565b9091929394959697506129af6129a98284611e68565b84611e8d565b918260031b9280840460081490151715612a2957601181029080820460111490151715612a29578160031b9180830460081490151715612a29578897969594928f99949261276e90612a0093611ea0565b9081612a0f575b82935061298b565b6128f79392965090612a2091611ea0565b94909138612a07565b634e487b7160e01b87526011600452602487fd5b915091929394959697506020813d602011612a7b575b81612a6060209383611e22565b81010312612a7757518d97969594939291876128d9565b8580fd5b3d9150612a53565b6040513d88823e3d90fd5b612ab0915060203d602011612ab6575b612aa88183611e22565b8101906132d3565b386128a0565b503d612a9e565b6040513d87823e3d90fd5b612adf9150823d8411612ab657612aa88183611e22565b38612875565b9093506020813d602011612b15575b81612b0160209383611e22565b81010312612b1157519238612839565b8280fd5b3d9150612af4565b6040513d85823e3d90fd5b612b3793509061294291611e8d565b82858d6127ce565b508215156127c9565b5086321461218a565b5033600052601e60205260ff60406000205416612184565b81600052600660205260ff604060002054161580612c74575b156121625781600052600a60205260ff6040600020541615612162576001600160a01b0383166000818152601b602052604090205460ff1615612c2f5780600052601c6020528160406000205410612bf357600052601c6020526040600020612bec828254611e68565b9055612162565b60405162461bcd60e51b81526020600482015260146024820152736578636565642070726573616c652071756f746160601b6044820152606490fd5b60405162461bcd60e51b815260206004820152601860248201527f6e6f7420696e2070726573616c652077686974656c69737400000000000000006044820152606490fd5b506001600160a01b03831660009081526006602052604090205460ff1615612b82565b5060ff601d541661215d565b60405162461bcd60e51b815260206004820152601060248201526f0c4c2d8c2dcc6ca9cdee88adcdeeaced60831b6044820152606490fd5b90816020910312610402575180151581036104025790565b6000908015612f345760018060a01b03600954169160405191612d17606084611e22565b60028352602083016040368237835115612f2057308152835160011015612f20576040840185905260088054600b546001600160a01b0391821694921c1690833b15612f1c579491849391604051968794635c11d79560e01b865260a4860191600487015286602487015260a060448701525180915260c485019290865b818110612ef7575050508380928692606483015242608483015203925af19182612ee7575b5090612ee2577f6c37756e80daba6f4df0d5bfa6cddadfe23601acc1a27dc8d4aa427de91467886020604051838152a15b600b546040516370a0823160e01b815260089190911c6001600160a01b03166004820181905290602081602481875afa908115612b1d578391612eb0575b5080612e36575b50505050565b60646020928460405196879485936323b872dd60e01b8552600485015230602485015260448401525af1908115612ea45750612e75575b808080612e30565b612e969060203d602011612e9d575b612e8e8183611e22565b810190612cdb565b5038612e6d565b503d612e84565b604051903d90823e3d90fd5b90506020813d602011612eda575b81612ecb60209383611e22565b81010312610402575138612e29565b3d9150612ebe565b612deb565b81612ef191611e22565b38612dba565b82516001600160a01b0316855288975089965060209485019490920191600101612d95565b8480fd5b634e487b7160e01b83526032600452602483fd5b5050565b6000198114610d315760010190565b612f56602b54602c5490611ea0565b4310612130576016546040516370a0823160e01b815230600482015260089190911c6001600160a01b03169190602081602481865afa9081156118bf576000916132a1575b50602a5411612f34576019546040516318160ddd60e01b815292906001600160a01b0316602084600481845afa9384156118bf5760009461326d575b506026549360009384955a97604051926370a0823160e01b84523060048501526020846024818a5afa93841561326257889461322a575b50979890965b88811080613221575b1561321157826029541015613207575b613038602954611dd2565b90546040516370a0823160e01b815260039290921b1c6001600160a01b03166004820181905292906020816024818b5afa80156118bf5787916000916131d3575b50801515806131ba575b806131ae575b6130c7575b50506130a692506130a0905a90611e68565b90611ea0565b956130bf5a996130b7602954612f38565b602955612f38565b989096613014565b906129426130d59288611e8d565b80151580613146575b6130ea575b869061308e565b6040519363a9059cbb60e01b85526004850152602484015260208360448160008c5af19081156118bf576130a6936130a092613128575b50906130e3565b61313f9060203d8111612e9d57612e8e8183611e22565b5038613121565b506040516370a0823160e01b81523060048201526020816024818d5afa80156118bf57829160009161317a575b50116130de565b91506020823d82116131a6575b8161319460209383611e22565b810103126118b4575081905138613173565b3d9150613187565b50601854811015613089565b5084600052602860205260ff6040600020541615613083565b91506020823d82116131ff575b816131ed60209383611e22565b810103126118b4575086905138613079565b3d91506131e0565b600060295561302d565b5050505050505091505043602b55565b50828a1061301d565b9093506020813d60201161325a575b8161324660209383611e22565b810103126132565751923861300e565b8780fd5b3d9150613239565b6040513d8a823e3d90fd5b9093506020813d602011613299575b8161328960209383611e22565b8101031261040257519238612fd7565b3d915061327c565b90506020813d6020116132cb575b816132bc60209383611e22565b81010312610402575138612f9b565b3d91506132af565b9081602091031261040257516001600160a01b03811681036104025790565b919060207fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9160018060a01b031693846000526001825261333884604060002054611ea0565b856000526001835260406000205560405193845260018060a01b031692a3565b906000600383111561339c5750818060011c60018101809111610d3157905b838210613382575050565b909250613393836109818184611ead565b60011c90613377565b916133a357565b6001915056fe057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63ea264697066735822122073fd7b97222992f62e18860a2c40dfeb54fa6ff71a35d64fbb3ca7b8b6aba45664736f6c634300081c0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000114e61706f6c656f6e20546f6b656e20563200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034e504c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000055d398326f99059ff775485246999027b319795500000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e0000000000000000000000006c9d807361740d4519ce857dc051b333930be5c100000000000000000000000055d398326f99059ff775485246999027b3197955000000000000000000000000ced4f510170e37d7fd93cfef0798060b59b266990000000000000000000000002543d7a49ef0b89456d402121fe3f89754143445000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000154eabe6e7d150000000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : stringParams (string[]): Napoleon Token V2,NPL
Arg [1] : addressParams (address[]): 0x55d398326f99059fF775485246999027B3197955,0x10ED43C718714eb63d5aA57B78B54704E256024E,0x6c9d807361740d4519Ce857dC051B333930bE5C1,0x55d398326f99059fF775485246999027B3197955,0xCEd4F510170E37D7fd93Cfef0798060B59B26699,0x2543D7A49eF0b89456d402121FE3f89754143445
Arg [2] : numberParams (uint256[]): 18,95959595700000000,200,200,200,200,50,50
Arg [3] : boolParams (bool[]): True,True,False

-----Encoded View---------------
31 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000240
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000360
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [8] : 4e61706f6c656f6e20546f6b656e205632000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [10] : 4e504c0000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [12] : 00000000000000000000000055d398326f99059ff775485246999027b3197955
Arg [13] : 00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e
Arg [14] : 0000000000000000000000006c9d807361740d4519ce857dc051b333930be5c1
Arg [15] : 00000000000000000000000055d398326f99059ff775485246999027b3197955
Arg [16] : 000000000000000000000000ced4f510170e37d7fd93cfef0798060b59b26699
Arg [17] : 0000000000000000000000002543d7a49ef0b89456d402121fe3f89754143445
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [20] : 0000000000000000000000000000000000000000000000000154eabe6e7d1500
Arg [21] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [22] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [23] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [24] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [25] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [27] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [28] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [29] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [30] : 0000000000000000000000000000000000000000000000000000000000000000


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.