BNB Price: $639.26 (+1.47%)
 

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Transfer949024512026-04-27 2:54:337 secs ago1777258473IN
0x5b2fEcDB...DBc6BF315
0 BNB0.000022250.065
Transfer949023522026-04-27 2:53:4951 secs ago1777258429IN
0x5b2fEcDB...DBc6BF315
0 BNB0.000022290.06565
Transfer949023402026-04-27 2:53:4357 secs ago1777258423IN
0x5b2fEcDB...DBc6BF315
0 BNB0.000001650.06565
Transfer949021182026-04-27 2:52:032 mins ago1777258323IN
0x5b2fEcDB...DBc6BF315
0 BNB0.000022470.06565
Transfer949021142026-04-27 2:52:012 mins ago1777258321IN
0x5b2fEcDB...DBc6BF315
0 BNB0.000001650.06565
Transfer949019012026-04-27 2:50:264 mins ago1777258226IN
0x5b2fEcDB...DBc6BF315
0 BNB0.000030510.06565
Transfer949018292026-04-27 2:49:534 mins ago1777258193IN
0x5b2fEcDB...DBc6BF315
0 BNB0.000024790.06565
Transfer949017692026-04-27 2:49:265 mins ago1777258166IN
0x5b2fEcDB...DBc6BF315
0 BNB0.00002210.06565
Transfer949017542026-04-27 2:49:195 mins ago1777258159IN
0x5b2fEcDB...DBc6BF315
0 BNB0.000020980.06565
Transfer949015562026-04-27 2:47:506 mins ago1777258070IN
0x5b2fEcDB...DBc6BF315
0 BNB0.00002080.06565
Transfer949013252026-04-27 2:46:068 mins ago1777257966IN
0x5b2fEcDB...DBc6BF315
1 BNB0.000044350.06565
Transfer949012132026-04-27 2:45:169 mins ago1777257916IN
0x5b2fEcDB...DBc6BF315
0 BNB0.000020980.06565
Transfer949011902026-04-27 2:45:059 mins ago1777257905IN
0x5b2fEcDB...DBc6BF315
0 BNB0.000017810.06565
Transfer949007412026-04-27 2:41:4312 mins ago1777257703IN
0x5b2fEcDB...DBc6BF315
0 BNB0.000003080.06565
Transfer949007072026-04-27 2:41:2813 mins ago1777257688IN
0x5b2fEcDB...DBc6BF315
0.15 BNB0.00004850.06565
Transfer949005832026-04-27 2:40:3214 mins ago1777257632IN
0x5b2fEcDB...DBc6BF315
0 BNB0.000030510.06565
Transfer949004372026-04-27 2:39:2615 mins ago1777257566IN
0x5b2fEcDB...DBc6BF315
0 BNB0.000009130.06565
Transfer949000602026-04-27 2:36:3618 mins ago1777257396IN
0x5b2fEcDB...DBc6BF315
0 BNB0.000003080.06565
Transfer949000372026-04-27 2:36:2618 mins ago1777257386IN
0x5b2fEcDB...DBc6BF315
0 BNB0.00002310.06565
Transfer948998932026-04-27 2:35:2119 mins ago1777257321IN
0x5b2fEcDB...DBc6BF315
0 BNB0.000003080.06565
Transfer948997552026-04-27 2:34:1920 mins ago1777257259IN
0x5b2fEcDB...DBc6BF315
1 BNB0.000044020.06597825
Transfer948986532026-04-27 2:26:0328 mins ago1777256763IN
0x5b2fEcDB...DBc6BF315
0 BNB0.00001840.06565
Transfer948983432026-04-27 2:23:4330 mins ago1777256623IN
0x5b2fEcDB...DBc6BF315
0 BNB0.000030510.06565
Transfer948981012026-04-27 2:21:5432 mins ago1777256514IN
0x5b2fEcDB...DBc6BF315
0 BNB0.000023490.06565
Transfer948980852026-04-27 2:21:4732 mins ago1777256507IN
0x5b2fEcDB...DBc6BF315
0 BNB0.000018950.06565
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
949019012026-04-27 2:50:264 mins ago1777258226
0x5b2fEcDB...DBc6BF315
0.00080812 BNB
949019012026-04-27 2:50:264 mins ago1777258226
0x5b2fEcDB...DBc6BF315
0.00080812 BNB
949013252026-04-27 2:46:068 mins ago1777257966
0x5b2fEcDB...DBc6BF315
0.025 BNB
949013252026-04-27 2:46:068 mins ago1777257966
0x5b2fEcDB...DBc6BF315
0.025 BNB
949013252026-04-27 2:46:068 mins ago1777257966
0x5b2fEcDB...DBc6BF315
0.05 BNB
949013252026-04-27 2:46:068 mins ago1777257966
0x5b2fEcDB...DBc6BF315
0.05 BNB
949013252026-04-27 2:46:068 mins ago1777257966
0x5b2fEcDB...DBc6BF315
0.05 BNB
949013252026-04-27 2:46:068 mins ago1777257966
0x5b2fEcDB...DBc6BF315
0.05 BNB
949013252026-04-27 2:46:068 mins ago1777257966
0x5b2fEcDB...DBc6BF315
0.05 BNB
949013252026-04-27 2:46:068 mins ago1777257966
0x5b2fEcDB...DBc6BF315
0.05 BNB
949013252026-04-27 2:46:068 mins ago1777257966
0x5b2fEcDB...DBc6BF315
0.05 BNB
949013252026-04-27 2:46:068 mins ago1777257966
0x5b2fEcDB...DBc6BF315
0.00056017 BNB
949013252026-04-27 2:46:068 mins ago1777257966
0x5b2fEcDB...DBc6BF315
0.3 BNB
949013252026-04-27 2:46:068 mins ago1777257966
0x5b2fEcDB...DBc6BF315
0.3 BNB
949007072026-04-27 2:41:2813 mins ago1777257688
0x5b2fEcDB...DBc6BF315
0.00375 BNB
949007072026-04-27 2:41:2813 mins ago1777257688
0x5b2fEcDB...DBc6BF315
0.00375 BNB
949007072026-04-27 2:41:2813 mins ago1777257688
0x5b2fEcDB...DBc6BF315
0.0075 BNB
949007072026-04-27 2:41:2813 mins ago1777257688
0x5b2fEcDB...DBc6BF315
0.0075 BNB
949007072026-04-27 2:41:2813 mins ago1777257688
0x5b2fEcDB...DBc6BF315
0.0075 BNB
949007072026-04-27 2:41:2813 mins ago1777257688
0x5b2fEcDB...DBc6BF315
0.0075 BNB
949007072026-04-27 2:41:2813 mins ago1777257688
0x5b2fEcDB...DBc6BF315
0.0075 BNB
949007072026-04-27 2:41:2813 mins ago1777257688
0x5b2fEcDB...DBc6BF315
0.0075 BNB
949007072026-04-27 2:41:2813 mins ago1777257688
0x5b2fEcDB...DBc6BF315
0.0075 BNB
949007072026-04-27 2:41:2813 mins ago1777257688
0x5b2fEcDB...DBc6BF315
0.00010822 BNB
949007072026-04-27 2:41:2813 mins ago1777257688
0x5b2fEcDB...DBc6BF315
0.045 BNB
View All Internal Transactions
Cross-Chain Transactions
Loading...
Loading

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

Contract Name:
OK

Compiler Version
v0.8.31+commit.fd3a2265

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 1 : ok.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(
        address recipient,
        uint256 amount
    ) external returns (bool);
    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

interface IERC721 {
    function balanceOf(address owner) external view returns (uint256);
}

interface IPancakeRouter01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    )
        external
        payable
        returns (uint amountToken, uint amountETH, uint liquidity);
    function swapExactETHForTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function getAmountsOut(
        uint amountIn,
        address[] calldata path
    ) external view returns (uint[] memory amounts);
}

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

interface IPancakePair {
    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function sync() external;
    function token0() external view returns (address);
}

interface IOkOldState {
    function balanceOf(address account) external view returns (uint256);
    function referrer(address user) external view returns (address);
    function referralCount(address user) external view returns (uint256);
    function validDirects(address user) external view returns (uint256);
    function totalDirectPerformance(
        address user
    ) external view returns (uint256);
    function teamPerformance(address user) external view returns (uint256);
    function isDirectAdded(
        address upline,
        address user
    ) external view returns (bool);
    function userInfo(
        address user
    )
        external
        view
        returns (
            uint256 depositBNB,
            uint256 depositUSDT,
            uint256 lastDepositBNB,
            uint256 payoutUSDT,
            uint256 lastClaimTime,
            bool isActive,
            uint256 exitCount,
            uint256 lastExitTime,
            uint256 sellRateBonus
        );
}

error E();

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

abstract contract Ownable is Context {
    address private _owner;
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    constructor() {
        _transferOwnership(_msgSender());
    }

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

    modifier onlyOwner() {
        if (owner() != _msgSender()) revert E();
        _;
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

contract TokenReceiver {
    address public owner;
    constructor() {
        owner = msg.sender;
    }
    receive() external payable {}
    function withdrawToken(address token, uint256 amount) external {
        if (msg.sender != owner) revert E();
        IERC20(token).transfer(owner, amount);
    }
    function withdrawBNB(uint256 amount) external {
        if (msg.sender != owner) revert E();
        (bool success, ) = payable(owner).call{value: amount}("");
        if (!success) revert E();
    }
}

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

    string private _name = "HLOK";
    string private _symbol = "HLOK";
    uint8 private _decimals = 18;
    uint256 private _totalSupply = 21000000 * 1e18;

    uint256 private constant BLACKHOLE_MINING = 20300000 * 1e18;
    uint256 private constant INITIAL_LP = 700000 * 1e18;

    address private constant ROUTER =
        0x10ED43C718714eb63d5aA57B78B54704E256024E;
    address private constant USDT = 0x55d398326f99059fF775485246999027B3197955;
    address private constant DEAD = 0x000000000000000000000000000000000000dEaD;

    address private constant communityFund  = 0x9Ab091113EF489d9506a517d8f04347BD3a170d6;
    address private constant bigNodeNFT     = 0x3013013C78302D01D822E2645d441F035e8845dD;
    address private constant smallNodeNFT   = 0xd26164c723aA921720EfE977a4c4aEe3f19eD52C;

    TokenReceiver private immutable _tokenReceiver;
    IPancakeRouter01 private immutable router;
    address private pair;
    mapping(address => bool) private isPair;
    address private immutable wethAddress;

    mapping(address => address) public referrer;
    mapping(address => uint256) public referralCount;
    mapping(address => uint256) public validDirects;
    mapping(address => address[]) private directReferralList;
    mapping(address => mapping(address => bool)) private isDirectAdded;

    mapping(address => uint256) public totalDirectPerformance;
    uint256 private directPerformanceStep = 1e18;
    mapping(address => uint256) public teamPerformance;

    struct UserInfo {
        uint256 depositBNB;
        uint256 depositUSDT;
        uint256 lastDepositBNB;
        uint256 payoutUSDT;
        uint256 lastClaimTime;
        bool isActive;
        uint256 exitCount;
        uint256 lastExitTime;
        uint256 sellRateBonus;
        uint256 directPerformanceCredited;
    }
    mapping(address => UserInfo) public userInfo;

    address private constant MIGRATION_SOURCE =
        0x2fAEFFD01624433464687e53B87872fBcFf666f3;
    mapping(address => bool) private migrated;

    mapping(address => bool) private isFeeExempt;
    mapping(address => bool) private isLeader;

    mapping(address => uint256) private dailySold;
    mapping(address => uint256) private lastSellDay;
    mapping(address => uint256) private dailySoldUSDT;
    mapping(address => uint256) private lastSellDayUSDT;
    mapping(address => uint256) private lastTradeBlock;
    mapping(address => uint8) private lastTradeSide;
    mapping(address => uint256) private lastTradeTime;
    mapping(address => uint256) private lastOriginTradeBlock;
    mapping(address => uint8) private lastOriginTradeSide;
    mapping(address => uint256) private lastOriginTradeTime;

    uint256 private constant DAILY_BURN_BPS = 50;
    uint256 private TIME_STEP = 1 days;
    uint256 private totalBurnedFromPool;
    uint256 private constant MAX_BURN_FROM_POOL = 70000 * 1e18;
    uint256 private lastDailyProcess;
    uint256 private stepStartPrice;
    uint256 private lastStepUpdate;
    uint256 private launchTime;

    uint256 private minDeposit = 1e17;
    uint256 private maxDeposit = 1e18;
    uint256 private constant MAX_SINGLE_SELL_USDT = 1000 * 1e18;

    uint256 private maxPayoutRate = 210;
    uint256 private swapSlippageBps = 500;

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

    event Deposit(address indexed user, uint256 bnbAmount, uint256 usdtValue);
    event ClaimStatic(address indexed user, uint256 okAmount);
    event ClaimDynamic(address indexed user, uint256 okAmount);
    event BindReferrer(address indexed user, address indexed upline);
    event Exit(address indexed user);

    constructor() {
        _tokenReceiver = new TokenReceiver();
        router = IPancakeRouter01(ROUTER);
        wethAddress = router.WETH();
        pair = IPancakeFactory(router.factory()).createPair(
            address(this),
            router.WETH()
        );
        isPair[pair] = true;

        uint256 init_amount = 1e16;
        _balances[address(0)] = BLACKHOLE_MINING - init_amount;
        _balances[communityFund] = INITIAL_LP + init_amount;

        emit Transfer(address(0), address(0), BLACKHOLE_MINING - init_amount);
        emit Transfer(address(0), communityFund, INITIAL_LP + init_amount);

        referrer[communityFund] = address(this);
        isFeeExempt[address(this)] = true;
        isFeeExempt[address(_tokenReceiver)] = true;
        isFeeExempt[pair] = true;
        isFeeExempt[communityFund] = true;
        isFeeExempt[bigNodeNFT] = true;
        isFeeExempt[smallNodeNFT] = true;

        lastDailyProcess = block.timestamp;
        launchTime = block.timestamp;
    }

    function setLeader(address leader, bool enabled) external onlyOwner {
        isLeader[leader] = enabled;
    }

    function setReferrer(address user, address newUpline) external onlyOwner {
        referrer[user] = newUpline;
    }

    function migrateUsers(address[] calldata users) external onlyOwner {
        IOkOldState oldOk = IOkOldState(MIGRATION_SOURCE);

        for (uint256 i = 0; i < users.length; ) {
            address user = users[i];
            if (user == address(0)) {
                unchecked {
                    ++i;
                }
                continue;
            }

            if (migrated[user]) {
                unchecked {
                    ++i;
                }
                continue;
            }

            uint256 desiredBal = oldOk.balanceOf(user);
            _forceSetBalance(user, desiredBal);

            address upl = oldOk.referrer(user);
            referrer[user] = upl;
            referralCount[user] = oldOk.referralCount(user);
            validDirects[user] = oldOk.validDirects(user);
            totalDirectPerformance[user] = oldOk.totalDirectPerformance(user);
            teamPerformance[user] = oldOk.teamPerformance(user);

            (
                uint256 depositBNB,
                uint256 depositUSDT,
                uint256 lastDepositBNB,
                uint256 payoutUSDT,
                ,
                bool isActive,
                uint256 exitCount,
                uint256 lastExitTime,
                uint256 sellRateBonus
            ) = oldOk.userInfo(user);

           

            userInfo[user] = UserInfo(
                depositBNB,
                depositUSDT,
                lastDepositBNB,
                desiredBal < 1e18 && isActive ? 0 : payoutUSDT,
                block.timestamp,
                isActive,
                exitCount,
                lastExitTime,
                sellRateBonus,
                0
            );

            if (
                upl != address(0) &&
                oldOk.isDirectAdded(upl, user) &&
                !isDirectAdded[upl][user]
            ) {
                isDirectAdded[upl][user] = true;
                directReferralList[upl].push(user);
            }

            migrated[user] = true;
            unchecked {
                ++i;
            }
        }
    }

    function setUserInfoSingle(
        address user,
        uint256 depositBNB,
        uint256 depositUSDT,
        uint256 lastDepositBNB,
        uint256 payoutUSDT,
        uint256 lastClaimTime,
        bool isActive,
        uint256 exitCount,
        uint256 lastExitTime,
        uint256 sellRateBonus
    ) external onlyOwner {
        userInfo[user] = UserInfo(
            depositBNB,
            depositUSDT,
            lastDepositBNB,
            payoutUSDT,
            lastClaimTime == 0 ? block.timestamp : lastClaimTime,
            isActive,
            exitCount,
            lastExitTime,
            sellRateBonus,
            0
        );
    }

    function name() public view returns (string memory) {
        return _name;
    }
    function symbol() public view returns (string memory) {
        return _symbol;
    }
    function decimals() public view returns (uint8) {
        return _decimals;
    }
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }
    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(_msgSender(), spender, amount);
        return true;
    }

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public override returns (bool) {       
        uint256 currentAllowance = _allowances[sender][_msgSender()];
        if (currentAllowance < amount) revert E();
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), currentAllowance - amount);
        return true;
    }

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

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal {
        if (pair != address(0) && (sender == pair || recipient == pair)) {
            if (sender == pair) {
                if (
                    recipient != address(this) &&
                    recipient != address(_tokenReceiver) &&
                    !(isFeeExempt[recipient] && _isRemoveLiquidity())
                ) revert E();
            } else {
                if (
                    sender != address(this) &&
                    sender != address(_tokenReceiver) &&
                    !(
                        isFeeExempt[sender] &&
                        msg.sender == address(router)
                    )
                ) revert E();
            }
        }
        if (
            block.timestamp >= lastDailyProcess + TIME_STEP &&
            !inSwap &&
            recipient != pair &&
            sender != pair
        ) {
            processDailyLogic();
        }

        bool swapping = inSwap;

        _enforceBlockAndCooldown(sender, recipient, amount, swapping);

        if (!swapping && recipient == address(this)) {
            if (amount == 0) {
                _claim(sender);
                emit Transfer(sender, address(this), 0);
                return;
            }
            if (amount != 1e14) {
                _sell(sender, amount, isFeeExempt[sender]);
                return;
            }
        }

        if (
            amount == 1e14 &&
            referrer[recipient] == address(0) &&
            sender != pair &&
            recipient != address(this)
        ) {
            if (referrer[sender] == address(0)) revert E();
            referrer[recipient] = sender;
            referralCount[sender]++;
            emit BindReferrer(recipient, sender);
            if (_balances[address(0)] >= 1e16) {
                _basicTransfer(address(0), recipient, 1e16);
            }
        }

        bool taxExempt = isFeeExempt[sender];
        bool isSellLocal = recipient == pair;

        if (
            !swapping &&
            !taxExempt &&
            sender != address(router) &&
            (isSellLocal ||
                (sender != pair &&
                    recipient != pair &&
                    sender != address(this)))
        ) {
            _checkDailyLimit(sender, amount);
        }

        if (isSellLocal && !swapping && !taxExempt) {
            if (amount > _balances[pair] / 100) revert E();
            if (
                _safeERC721Balance(bigNodeNFT, sender) > 0 ||
                _safeERC721Balance(smallNodeNFT, sender) > 0
            ) {
                if (!userInfo[sender].isActive) revert E();
            }
            if (userInfo[sender].lastDepositBNB == 0) revert E();
            if (_balances[sender] < amount) revert E();
            uint256 currentPriceUSDT = _getOkSpotPriceUSDT();
            if (currentPriceUSDT == 0) revert E();
            uint256 sellValueUSDT = (amount / 1e18) * currentPriceUSDT;
            sellValueUSDT += ((amount % 1e18) * currentPriceUSDT) / 1e18;
            _checkDailySellUsdtLimit(sender, sellValueUSDT);
            _basicTransfer(sender, address(this), amount);
            uint256 baseTax = _distributeSellTax(address(this), amount);
            if (baseTax > amount) baseTax = amount;
            uint256 panicFee = _calculatePanicFee(amount, currentPriceUSDT);
            uint256 totalFee = baseTax + panicFee;
            if (totalFee > amount) {
                totalFee = amount;
                panicFee = amount - baseTax;
            }
            if (panicFee > 0) {
                _swapAndLiquify(panicFee);
            }
            _basicTransfer(address(this), recipient, amount - totalFee);
            return;
        }

        _basicTransfer(sender, recipient, amount);
    }

    function _enforceBlockAndCooldown(
        address sender,
        address recipient,
        uint256 amount,
        bool swapping
    ) internal {
        if (swapping) return;

        uint8 side = 0;
        address trader = address(0);

        if (sender == pair) {
            side = 1;
            trader = recipient;
        } else if (recipient == pair) {
            side = 2;
            trader = sender;
        } else if (recipient == address(this) && amount != 0 && amount != 1e14) {
            side = 2;
            trader = sender;
        }

        if (
            side == 0 ||
            trader == address(0) ||
            trader == address(this) ||
            trader == address(_tokenReceiver) ||
            trader == address(router)
        ) return;

        if (!isFeeExempt[trader]) {
            uint256 t = lastTradeTime[trader];
            if (t != 0 && block.timestamp < t + 60) revert E();

            uint256 b = lastTradeBlock[trader];
            uint8 s = lastTradeSide[trader];
            if (b == block.number && s != 0 && s != side) revert E();

            lastTradeTime[trader] = block.timestamp;
            lastTradeBlock[trader] = block.number;
            lastTradeSide[trader] = side;
        }

        address origin = tx.origin;
        if (
            origin != address(0) &&
            origin != address(this) &&
            origin != address(_tokenReceiver) &&
            origin != address(router) &&
            !isFeeExempt[origin]
        ) {
            uint256 ot = lastOriginTradeTime[origin];
            if (ot != 0 && block.timestamp < ot + 60) revert E();

            uint256 ob = lastOriginTradeBlock[origin];
            uint8 os = lastOriginTradeSide[origin];
            if (ob == block.number && os != 0 && os != side) revert E();

            lastOriginTradeTime[origin] = block.timestamp;
            lastOriginTradeBlock[origin] = block.number;
            lastOriginTradeSide[origin] = side;
        }
    }

    function _isAddLiquidity(uint256 amount) internal view returns (bool) {
        (uint112 r0, uint112 r1, ) = IPancakePair(pair).getReserves();
        if (r0 == 0 || r1 == 0) return false;
        bool wethIsToken0 = IPancakePair(pair).token0() == wethAddress;
        uint256 rOther = wethIsToken0 ? uint256(r0) : uint256(r1);
        uint256 rThis = wethIsToken0 ? uint256(r1) : uint256(r0);
        if (rOther == 0 || rThis == 0) return false;
        uint256 balanceOther = IERC20(wethAddress).balanceOf(pair);
        uint256 amountOther = (amount * rOther) / rThis;
        return balanceOther >= rOther + amountOther;
    }

    function _isRemoveLiquidity() internal view returns (bool) {
        (uint112 r0, uint112 r1, ) = IPancakePair(pair).getReserves();
        if (r0 == 0 || r1 == 0) return false;
        uint256 rOther = IPancakePair(pair).token0() == wethAddress
            ? uint256(r0)
            : uint256(r1);
        uint256 balanceOther = IERC20(wethAddress).balanceOf(pair);
        return balanceOther <= rOther;
    }

    function _sell(
        address user,
        uint256 amount,
        bool taxExempt
    ) internal noReentrant {
        if (inSwap) return;
        if (amount == 0) return;

        if (amount > _balances[pair] / 100) revert E();

        if (!taxExempt) {
            if (
                _safeERC721Balance(bigNodeNFT, user) > 0 ||
                _safeERC721Balance(smallNodeNFT, user) > 0
            ) {
                if (!userInfo[user].isActive) revert E();
            }
        }

        if (userInfo[user].lastDepositBNB == 0) revert E();

        inSwap = true;

        uint256 currentPriceUSDT = 0;
        if (!taxExempt) {
            _checkDailyLimit(user, amount);
            currentPriceUSDT = _getOkSpotPriceUSDT();
            if (currentPriceUSDT == 0) revert E();
            uint256 sellValueUSDT = (amount / 1e18) * currentPriceUSDT;
            sellValueUSDT += ((amount % 1e18) * currentPriceUSDT) / 1e18;
            _checkDailySellUsdtLimit(user, sellValueUSDT);
        }

        if (_balances[user] < amount) revert E();
        _basicTransfer(user, address(this), amount);

        uint256 baseTax = 0;
        uint256 panicFee = 0;

        if (!taxExempt) {
            baseTax = _distributeSellTax(address(this), amount);
            if (baseTax > amount) baseTax = amount;
            panicFee = _calculatePanicFee(amount, currentPriceUSDT);
        }

        uint256 totalFee = baseTax + panicFee;
        if (totalFee > amount) {
            totalFee = amount;
            panicFee = amount - baseTax;
        }
        uint256 swapAmount = amount - totalFee;

        if (swapAmount > 0) {
            _executeSwapAndBurn(user, swapAmount);
        }
        if (panicFee > 0) {
            _swapAndLiquify(panicFee);
        }
        inSwap = false;
    }

    function _checkDailyLimit(address user, uint256 amount) internal {
        uint256 limitRate = getSellLimitRate(user);

        uint256 day = block.timestamp / TIME_STEP;
        if (lastSellDay[user] != day) {
            dailySold[user] = 0;
            lastSellDay[user] = day;
        }

        uint256 limit = (_balances[user] * limitRate) / 100;

        if (dailySold[user] + amount > limit) revert E();
        dailySold[user] += amount;
    }

    function _checkDailySellUsdtLimit(
        address user,
        uint256 sellValueUSDT
    ) internal {
        uint256 day = block.timestamp / TIME_STEP;
        if (lastSellDayUSDT[user] != day) {
            dailySoldUSDT[user] = 0;
            lastSellDayUSDT[user] = day;
        }

        if (dailySoldUSDT[user] + sellValueUSDT > MAX_SINGLE_SELL_USDT)
            revert E();
        dailySoldUSDT[user] += sellValueUSDT;
    }

    function _distributeSellTax(
        address sender,
        uint256 amount
    ) internal returns (uint256) {
        uint256 taxAmount = (amount * 3) / 100;
        uint256 p1 = taxAmount / 3;
        uint256 p2 = taxAmount / 3;
        uint256 p3 = taxAmount - p1 - p2;

        if (p1 > 0) {
            _balances[sender] -= p1;
            _balances[bigNodeNFT] += p1;
            emit Transfer(sender, bigNodeNFT, p1);
        }
        if (p2 > 0) {
            _balances[sender] -= p2;
            _balances[smallNodeNFT] += p2;
            emit Transfer(sender, smallNodeNFT, p2);
        }
        if (p3 > 0) {
            _balances[sender] -= p3;
            _balances[communityFund] += p3;
            emit Transfer(sender, communityFund, p3);
        }
        return taxAmount;
    }

    function _getMinOut(
        uint256 amountIn,
        address[] memory path
    ) internal view returns (uint256) {
        uint256 bps = swapSlippageBps;
        if (bps >= 10000) return 0;
        uint256 out = 0;
        try router.getAmountsOut(amountIn, path) returns (
            uint[] memory amounts
        ) {
            if (amounts.length > 0) {
                out = amounts[amounts.length - 1];
            }
        } catch {}
        if (out == 0) return 0;
        return (out * (10000 - bps)) / 10000;
    }

    function _executeSwapAndBurn(address user, uint256 swapAmount) internal {
        if (swapAmount == 0) return;
        uint256 bnbBefore = address(_tokenReceiver).balance;
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();
        uint256 minOut = 0;
        _approve(address(this), address(router), swapAmount);
        try
            IPancakeRouter01(router)
                .swapExactTokensForETHSupportingFeeOnTransferTokens(
                    swapAmount,
                    minOut,
                    path,
                    address(_tokenReceiver),
                    block.timestamp
                )
        {
            uint256 bnbReceived = address(_tokenReceiver).balance - bnbBefore;
            if (bnbReceived > 0) {
                try _tokenReceiver.withdrawBNB(bnbReceived) {
                    (bool success, ) = user.call{value: bnbReceived}("");
                    if (!success) revert E();
                } catch {
                    revert E();
                }
            }

            if (pair != address(0) && _balances[pair] >= swapAmount) {
                _basicTransfer(pair, address(0), swapAmount);
                IPancakePair(pair).sync();
            }
        } catch {
            revert E();
        }
    }

    function _basicTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal {
        if (_balances[sender] < amount) revert E();
        _balances[sender] -= amount;
        _balances[recipient] += amount;
        emit Transfer(sender, recipient, amount);
    }

    function _forceSetBalance(
        address account,
        uint256 desiredBalance
    ) internal {
        uint256 current = _balances[account];
        if (desiredBalance == current) return;

        if (desiredBalance > current) {
            uint256 diff = desiredBalance - current;
            if (_balances[address(0)] < diff) return; 
            _basicTransfer(address(0),account,diff);
        } else {
            uint256 diff = current - desiredBalance;
            if (_balances[account]>=diff){
                _basicTransfer(account,address(0),diff);
            }            
        }
    }

    bool private locked;
    modifier noReentrant() {
        if (locked) revert E();
        locked = true;
        _;
        locked = false;
    }

    receive() external payable {
        if (msg.sender == address(_tokenReceiver) || msg.sender == address(router))
            return;
        deposit();
    }

    function deposit() public payable lockTheSwap noReentrant {
        if (msg.value < minDeposit || msg.value > maxDeposit) revert E();
        if (referrer[msg.sender] == address(0)) revert E();

        address user = msg.sender;
        UserInfo storage u = userInfo[user];

        if (u.isActive) {
            revert E();
        }

        if (u.lastDepositBNB > 0) {
            if (msg.value < u.lastDepositBNB) revert E();
        }

        u.depositBNB = msg.value;
        u.lastDepositBNB = msg.value;
        {
            uint256 bnbPrice = getBNBValueInUSDT(1e18);
            if (bnbPrice == 0) revert E();
            u.depositUSDT = (msg.value * bnbPrice) / 1e18;
        }
        u.isActive = true;
        u.lastClaimTime = block.timestamp;
        u.payoutUSDT = 0;

        {
            address upline = referrer[user];
            if (upline != address(0)) {
                address cur = upline;
                for (uint256 i = 0; i < 30; ) {
                    if (cur == address(0)) break;
                    teamPerformance[cur] += msg.value;
                    cur = referrer[cur];
                    unchecked {
                        ++i;
                    }
                }

                if (!isDirectAdded[upline][user]) {
                    isDirectAdded[upline][user] = true;
                    directReferralList[upline].push(user);
                    validDirects[upline]++;
                }

                u.directPerformanceCredited = 0;
                if (getSellLimitRate(upline) < 5) {
                    totalDirectPerformance[upline] += msg.value;
                    u.directPerformanceCredited = msg.value;
                    _recalcSellRateBonus(upline);
                }
            }
        }

        uint256 bnb = msg.value;

        {
            uint256 lpPart = (bnb * 60) / 100;
            _processLiquidityAndBuy(lpPart / 2, lpPart - (lpPart / 2));
        }

        {
            uint256 refPart = (bnb * 25) / 100;
            _distributeReferral(user, refPart);
        }

        {
            uint256 fivePercent = (bnb * 5) / 100;
            address directUpline = referrer[user];
            address fallbackReceiver = user;
            if (directUpline != address(0)) {
                fallbackReceiver = directUpline;
            }
            address receiver = communityFund;
            bool foundLeader = false;
            address curUpline = directUpline;
            while (curUpline != address(0)) {
                if (isLeader[curUpline]) {
                    receiver = curUpline;
                    foundLeader = true;
                    break;
                }
                address next = referrer[curUpline];
                if (next == curUpline) break;
                curUpline = next;
            }

            (bool okPay, ) = payable(receiver).call{value: fivePercent}("");
            if (!okPay && foundLeader) {
                (okPay, ) = payable(fallbackReceiver).call{value: fivePercent}(
                    ""
                );
            }
            if (!okPay) revert E();

            address[] storage directs = directReferralList[user];
            uint256 remainingReward = fivePercent;
            if (directs.length > 0) {
                uint256 perDirect = fivePercent / directs.length;
                if (perDirect > 0) {
                    for (uint256 i = 0; i < directs.length; ) {
                        (bool s, ) = payable(directs[i]).call{
                            value: perDirect,
                            gas: 5000
                        }("");
                        if (s) {
                            remainingReward -= perDirect;
                        }
                        unchecked {
                            ++i;
                        }
                    }
                }
            }

            if (remainingReward > 0) {
                (bool success, ) = communityFund.call{value: remainingReward}(
                    ""
                );
                success;
            }
        }

        {
            uint256 nodePart = (bnb * 5) / 100;
            (bool success2, ) = bigNodeNFT.call{value: nodePart / 2}("");
            if (!success2) revert E();
            (bool success3, ) = smallNodeNFT.call{
                value: nodePart - (nodePart / 2)
            }("");
            if (!success3) revert E();
        }

        emit Deposit(user, bnb, u.depositUSDT);
    }

    function _processLiquidityAndBuy(uint256 buyBNB, uint256 liqBNB) internal {
        address[] memory path = new address[](2);
        path[0] = router.WETH();
        path[1] = address(this);

        uint256 rBalBefore = balanceOf(address(_tokenReceiver));

        uint256 minBuyOut = 0;
        if (swapSlippageBps < 10000) {
            try router.getAmountsOut(buyBNB, path) returns (
                uint[] memory amounts
            ) {
                if (amounts.length > 0) {
                    uint256 expected = amounts[amounts.length - 1];
                    minBuyOut = (expected * (10000 - swapSlippageBps)) / 10000;
                }
            } catch {}
        }

        router.swapExactETHForTokens{value: buyBNB}(
            minBuyOut,
            path,
            address(_tokenReceiver),
            block.timestamp
        );

        uint256 bought = balanceOf(address(_tokenReceiver)) - rBalBefore;

        if (bought > 0) {
            uint256 balStart = balanceOf(address(this));
            _tokenReceiver.withdrawToken(address(this), bought);
            _approve(address(this), address(router), bought);

            router.addLiquidityETH{value: liqBNB}(
                address(this),
                bought,
                0,
                0,
                DEAD,
                block.timestamp
            );

            uint256 balEnd = balanceOf(address(this));
            if (balEnd > balStart) {
                uint256 leftover = balEnd - balStart;
                _basicTransfer(address(this), pair, leftover);
                IPancakePair(pair).sync();
            }
        }
    }

    function _distributeReferral(address user, uint256 amount) internal {
        address cur = referrer[user];
        uint256 perGen = amount / 5;
        uint256 distributed = 0;

        for (uint256 i = 0; i < 5; ) {
            address next = referrer[cur];
            if (cur != address(0)) {
                bool eligible = false;
                uint256 d = validDirects[cur];
                if (i == 0 && d >= 1) eligible = true;
                else if (i == 1 && d >= 3) eligible = true;
                else if (i == 2 && d >= 5) eligible = true;
                else if (i == 3 && d >= 7) eligible = true;
                else if (i == 4 && d >= 9) eligible = true;

                if (eligible) {
                    address target = userInfo[cur].isActive
                        ? cur
                        : communityFund;
                    (bool success, ) = payable(target).call{value: perGen}("");
                    if (!success) revert E();
                    distributed += perGen;
                }
            }
            cur = next;
            unchecked {
                ++i;
            }
        }

        if (amount > distributed) {
            (bool success, ) = payable(communityFund).call{
                value: amount - distributed
            }("");
            if (!success) revert E();
        }
    }

    function getDailyRate(address user) public view returns (uint256) {
        if (
            _safeERC721Balance(bigNodeNFT, user) > 0 ||
            _safeERC721Balance(smallNodeNFT, user) > 0
        ) {
            return 300;
        }
        if (launchTime > 0) {
            uint256 daysSinceLaunch = (block.timestamp - launchTime) /
                TIME_STEP;
            uint256 increase = daysSinceLaunch * 2;
            uint256 rate = 100 + increase;
            return rate > 300 ? 300 : rate;
        }
        return 100;
    }

    function _safeERC721Balance(
        address nft,
        address user
    ) internal view returns (uint256) {
        if (nft == address(0)) return 0;
        (bool ok, bytes memory data) = nft.staticcall(
            abi.encodeWithSelector(IERC721.balanceOf.selector, user)
        );
        if (!ok || data.length < 32) return 0;
        return abi.decode(data, (uint256));
    }

    function _claim(address user) internal noReentrant {
        UserInfo storage u = userInfo[user];
        if (!u.isActive) return;
        if (u.lastClaimTime > block.timestamp) {
            u.lastClaimTime = block.timestamp;
            return;
        }

        uint256 elapsed = block.timestamp - u.lastClaimTime;
        uint256 daysPassed = elapsed / TIME_STEP;
        if (daysPassed == 0) return;

        uint256 rate = getDailyRate(user);
        uint256 dailyUSDT = (u.depositUSDT * rate) / 10000;
        uint256 claimUSDT = dailyUSDT * daysPassed;

        uint256 maxPayout = (u.depositUSDT * maxPayoutRate) / 100;
        if (u.payoutUSDT >= maxPayout) {
            _handleExit(user);
            return;
        }
        uint256 remaining = maxPayout - u.payoutUSDT;
        if (claimUSDT > remaining) claimUSDT = remaining;

        uint256 price = _getOkSpotPriceUSDT();
        if (price == 0) return;

        uint256 okAmount = (claimUSDT * 1e18) / price;

        if (okAmount > 0) {
            if (_balances[address(0)] < okAmount) revert E();
            u.payoutUSDT += claimUSDT;
            u.lastClaimTime += daysPassed * TIME_STEP;
            _basicTransfer(address(0), user, okAmount);
            emit ClaimStatic(user, okAmount);

            _distributeAcceleration(user, okAmount, claimUSDT);
        }

        if (u.payoutUSDT >= maxPayout) {
            _handleExit(user);
        }
    }

    function _handleExit(address user) internal {
        UserInfo storage u = userInfo[user];
        u.isActive = false;
        u.exitCount++;
        u.lastExitTime = block.timestamp;
        u.sellRateBonus = 0;

        address upline = referrer[user];
        if (upline != address(0)) {
            uint256 credited = u.directPerformanceCredited;
            if (credited > 0) {
                uint256 curPerf = totalDirectPerformance[upline];
                if (curPerf > credited)
                    totalDirectPerformance[upline] = curPerf - credited;
                else totalDirectPerformance[upline] = 0;
                u.directPerformanceCredited = 0;
                _recalcSellRateBonus(upline);
            }

            address cur = upline;
            uint256 amountToSubtract = u.depositBNB;
            for (uint256 i = 0; i < 15; ) {
                if (cur == address(0)) break;
                if (teamPerformance[cur] >= amountToSubtract) {
                    teamPerformance[cur] -= amountToSubtract;
                } else {
                    teamPerformance[cur] = 0;
                }
                cur = referrer[cur];
                unchecked {
                    ++i;
                }
            }

            if (isDirectAdded[upline][user]) {
                isDirectAdded[upline][user] = false;
                if (validDirects[upline] > 0) validDirects[upline]--;

                address[] storage list = directReferralList[upline];
                for (uint256 i = 0; i < list.length; ) {
                    if (list[i] == user) {
                        list[i] = list[list.length - 1];
                        list.pop();
                        break;
                    }
                    unchecked {
                        ++i;
                    }
                }
            }
        }

        emit Exit(user);
    }

    function _recalcSellRateBonus(address upline) internal {
        uint256 step = directPerformanceStep;
        if (step == 0) return;
        userInfo[upline].sellRateBonus = totalDirectPerformance[upline] / step;
    }

    function _distributeAcceleration(
        address user,
        uint256 amountOK,
        uint256 amountUSDT
    ) internal {
        address upline = referrer[user];
        if (upline == address(0)) return;

        uint256 rate = 0;
        uint256 d = validDirects[upline];
        if (d >= 10) rate = 20;
        else if (d >= 5) rate = 15;
        else if (d >= 1) rate = 10;

        uint256 accAmountOK = 0;
        uint256 accAmountUSDT = 0;
        uint256 actualDistributedOK = 0;

        if (rate > 0) {
            accAmountOK = (amountOK * rate) / 100;
            accAmountUSDT = (amountUSDT * rate) / 100;

            (actualDistributedOK, ) = _payoutWithCap(
                upline,
                accAmountOK,
                accAmountUSDT
            );
        }

        uint256 prevRewardOK = actualDistributedOK;
        uint256 prevRewardUSDT = 0;
        if (accAmountOK > 0) {
            prevRewardUSDT =
                (accAmountUSDT * actualDistributedOK) /
                accAmountOK;
        }

        address cur = referrer[upline];
        for (uint256 i = 0; i < 10; ) {
            if (cur == address(0)) break;

            if (userInfo[cur].isActive) {
                uint256 rewardOK = (prevRewardOK * 50) / 100;
                uint256 rewardUSDT = (prevRewardUSDT * 50) / 100;

                if (rewardOK > 0) {
                    (uint256 paidOK, ) = _payoutWithCap(
                        cur,
                        rewardOK,
                        rewardUSDT
                    );

                    prevRewardOK = paidOK;
                    if (rewardOK > 0) {
                        prevRewardUSDT = (rewardUSDT * paidOK) / rewardOK;
                    } else {
                        prevRewardUSDT = 0;
                    }
                } else {
                    break;
                }
            }
            cur = referrer[cur];
            unchecked {
                ++i;
            }
        }
    }

    function _payoutWithCap(
        address user,
        uint256 amountOK,
        uint256 amountUSDT
    ) internal returns (uint256 paidOK, uint256 paidUSDT) {
        UserInfo storage u = userInfo[user];
        if (!u.isActive) return (0, 0);

        uint256 maxPayout = (u.depositUSDT * maxPayoutRate) / 100;
        if (u.payoutUSDT >= maxPayout) {
            _handleExit(user);
            return (0, 0);
        }

        uint256 remaining = maxPayout - u.payoutUSDT;

        if (amountUSDT > remaining) {
            paidUSDT = remaining;
            if (amountUSDT > 0) {
                paidOK = (amountOK * remaining) / amountUSDT;
            }
        } else {
            paidUSDT = amountUSDT;
            paidOK = amountOK;
        }

        if (paidOK > 0) {
            uint256 bhBal = _balances[address(0)];
            if (bhBal == 0) {
                paidOK = 0;
                paidUSDT = 0;
            } else if (bhBal < paidOK) {
                uint256 effOK = bhBal;
                uint256 effUSDT = paidUSDT > 0
                    ? (paidUSDT * effOK) / paidOK
                    : 0;
                paidOK = effOK;
                paidUSDT = effUSDT;
            }
        }
        if (paidUSDT > 0) {
            u.payoutUSDT += paidUSDT;
        }
        if (paidOK > 0) {
            _basicTransfer(address(0), user, paidOK);
            emit ClaimDynamic(user, paidOK);
        }

        if (u.payoutUSDT >= maxPayout) {
            _handleExit(user);
        }

        return (paidOK, paidUSDT);
    }

    function processDailyLogic() internal {
        uint256 elapsed = block.timestamp - lastDailyProcess;
        uint256 daysToProcess = elapsed / TIME_STEP;
        if (daysToProcess == 0) revert E();
        lastDailyProcess += daysToProcess * TIME_STEP;

        uint256 burnAmount = 0;
        if (pair != address(0)) {
            uint256 pairBal = _balances[pair];
            if (pairBal > MAX_BURN_FROM_POOL) {
                uint256 maxBurn = pairBal - MAX_BURN_FROM_POOL;
                uint256 dailyDecay = ((10000 - DAILY_BURN_BPS) * 1e18) / 10000;
                uint256 decayPow = _powWad(dailyDecay, daysToProcess);
                burnAmount = (pairBal * (1e18 - decayPow)) / 1e18;
                if (burnAmount > maxBurn) burnAmount = maxBurn;
            }

            if (burnAmount > 0) {
                _balances[pair] -= burnAmount;

                uint256 part = burnAmount / 2;
                _balances[bigNodeNFT] += part;
                _balances[smallNodeNFT] += (burnAmount - part);

                emit Transfer(pair, bigNodeNFT, part);
                emit Transfer(pair, smallNodeNFT, burnAmount - part);

                IPancakePair(pair).sync();

                totalBurnedFromPool += burnAmount;
            }
        }

        uint256 balance = address(this).balance;
        if (balance > 0) {
            (bool success, ) = communityFund.call{value: balance}("");
            success;
        }
    }

    function _powWad(
        uint256 xWad,
        uint256 n
    ) internal pure returns (uint256 result) {
        result = 1e18;
        while (n > 0) {
            if (n & 1 == 1) {
                result = (result * xWad) / 1e18;
            }
            xWad = (xWad * xWad) / 1e18;
            n >>= 1;
        }
    }

    function getBNBValueInUSDT(
        uint256 bnbAmount
    ) internal view returns (uint256) {
        address[] memory path = new address[](2);
        path[0] = router.WETH();
        path[1] = USDT;
        try router.getAmountsOut(bnbAmount, path) returns (
            uint[] memory amounts
        ) {
            return amounts[1];
        } catch {
            return 0;
        }
    }

    function _getOkSpotPriceUSDT() internal view returns (uint256) {
        if (pair == address(0)) return 0;
        uint256 bnbPrice = getBNBValueInUSDT(1e18);
        if (bnbPrice == 0) return 0;
        (uint112 r0, uint112 r1, ) = IPancakePair(pair).getReserves();
        if (r0 == 0 || r1 == 0) return 0;
        address t0 = IPancakePair(pair).token0();
        uint256 okReserve = t0 == address(this) ? uint256(r0) : uint256(r1);
        uint256 bnbReserve = t0 == address(this) ? uint256(r1) : uint256(r0);
        if (okReserve == 0) return 0;
        uint256 okToBnb = (bnbReserve * 1e18) / okReserve;
        return (okToBnb * bnbPrice) / 1e18;
    }

    function _calculatePanicFee(
        uint256 amount,
        uint256 currentPrice
    ) internal returns (uint256) {
        if (amount == 0 || currentPrice == 0) return 0;

        uint256 step = block.timestamp / TIME_STEP;
        if (lastStepUpdate != step || stepStartPrice == 0) {
            lastStepUpdate = step;
            stepStartPrice = currentPrice;
            return 0;
        }

        if (currentPrice >= stepStartPrice) return 0;

        uint256 dropPct = ((stepStartPrice - currentPrice) * 100) /
            stepStartPrice;
        uint256 panicPct = (dropPct / 5) * 5;
        if (panicPct > 45) panicPct = 45;
        if (panicPct == 0) return 0;
        return (amount * panicPct) / 100;
    }

    function getSellLimitRate(address user) internal view returns (uint256) {
        UserInfo storage u = userInfo[user];
        uint256 limitRate = 5;

        uint256 baseRate = 5;

        if (u.exitCount > 0) {
            if (baseRate > u.exitCount) baseRate -= u.exitCount;
            else baseRate = 1;
        }
        if (!u.isActive && u.lastExitTime > 0) {
            uint256 period = TIME_STEP * 30;
            if (period > 0 && block.timestamp >= u.lastExitTime + period) {
                uint256 dec = (block.timestamp - u.lastExitTime) / period;
                if (baseRate > dec) baseRate -= dec;
                else baseRate = 1;
            }
        }

        baseRate = baseRate < 1 ? 1 : baseRate;

        limitRate = baseRate + u.sellRateBonus;

        if (limitRate > 5) limitRate = 5;
        if (limitRate < 1) limitRate = 1;

        return limitRate;
    }

    function _swapAndLiquify(uint256 amount) internal {
        bool alreadyInSwap = inSwap;
        if (!alreadyInSwap) inSwap = true;
        if (amount == 0) {
            if (!alreadyInSwap) inSwap = false;
            return;
        }

        uint256 half = amount / 2;
        uint256 otherHalf = amount - half;
        if (half == 0 || otherHalf == 0) {
            if (!alreadyInSwap) inSwap = false;
            return;
        }

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

        uint256 bnbBefore = address(this).balance;
        uint256 minOut = _getMinOut(half, path);
        _approve(address(this), address(router), amount);

        try
            router.swapExactTokensForETHSupportingFeeOnTransferTokens(
                half,
                minOut,
                path,
                address(_tokenReceiver),
                block.timestamp
            )
        {
            uint256 bnbGain = address(_tokenReceiver).balance;
            if (bnbGain > 0) {
                _tokenReceiver.withdrawBNB(bnbGain);
            }

            try
                router.addLiquidityETH{value: bnbGain}(
                    address(this),
                    otherHalf,
                    0,
                    0,
                    DEAD,
                    block.timestamp
                )
            {} catch {}
            uint256 bnbLeft = address(this).balance;
            if (bnbLeft > bnbBefore) {
                (bool success, ) = payable(communityFund).call{
                    value: bnbLeft - bnbBefore
                }("");
                if (!success) revert E();
            }

            uint256 okBal = balanceOf(address(this));
            bool changedPair = false;
            if (okBal > 0 && pair != address(0)) {
                _basicTransfer(address(this), pair, okBal);
                changedPair = true;
            }
            if (pair != address(0) && amount > 0 && _balances[pair] >= amount) {
                _basicTransfer(pair, address(0), amount);
                changedPair = true;
            }
            if (changedPair) {
                IPancakePair(pair).sync();
            }
        } catch {}
        if (!alreadyInSwap) inSwap = false;
    }
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"E","type":"error"},{"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":"user","type":"address"},{"indexed":true,"internalType":"address","name":"upline","type":"address"}],"name":"BindReferrer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"okAmount","type":"uint256"}],"name":"ClaimDynamic","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"okAmount","type":"uint256"}],"name":"ClaimStatic","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"bnbAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"usdtValue","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"Exit","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":[{"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":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getDailyRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"name":"migrateUsers","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":[{"internalType":"address","name":"","type":"address"}],"name":"referralCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referrer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"leader","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setLeader","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"newUpline","type":"address"}],"name":"setReferrer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"depositBNB","type":"uint256"},{"internalType":"uint256","name":"depositUSDT","type":"uint256"},{"internalType":"uint256","name":"lastDepositBNB","type":"uint256"},{"internalType":"uint256","name":"payoutUSDT","type":"uint256"},{"internalType":"uint256","name":"lastClaimTime","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"exitCount","type":"uint256"},{"internalType":"uint256","name":"lastExitTime","type":"uint256"},{"internalType":"uint256","name":"sellRateBonus","type":"uint256"}],"name":"setUserInfoSingle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"teamPerformance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalDirectPerformance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"depositBNB","type":"uint256"},{"internalType":"uint256","name":"depositUSDT","type":"uint256"},{"internalType":"uint256","name":"lastDepositBNB","type":"uint256"},{"internalType":"uint256","name":"payoutUSDT","type":"uint256"},{"internalType":"uint256","name":"lastClaimTime","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"exitCount","type":"uint256"},{"internalType":"uint256","name":"lastExitTime","type":"uint256"},{"internalType":"uint256","name":"sellRateBonus","type":"uint256"},{"internalType":"uint256","name":"directPerformanceCredited","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"validDirects","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

0x610120604052600460e090815263484c4f4b60e01b61010052600390610025908261061a565b5060408051808201909152600480825263484c4f4b60e01b60208301529061004d908261061a565b506005805460ff191660121790556a115eec47f6cf7e35000000600655670de0b6b3a7640000600f81905562015180601f5567016345785d8a000060255560265560d26027556101f46028553480156100a4575f5ffd5b506100ae33610526565b6040516100ba90610575565b604051809103905ff0801580156100d3573d5f5f3e3d5ffd5b506001600160a01b03166080527310ed43c718714eb63d5aa57b78b54704e256024e60a0819052604080516315ab88c960e31b8152905163ad5c4648916004808201926020929091908290030181865afa158015610133573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061015791906106d4565b6001600160a01b031660c0816001600160a01b03168152505060a0516001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101ae573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d291906106d4565b6001600160a01b031663c9c653963060a0516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561021f573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061024391906106d4565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801561028d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102b191906106d4565b600780546001600160a01b0319166001600160a01b039290921691821790555f908152600860205260409020805460ff19166001179055662386f26fc10000610305816a10cab1347fa67177800000610715565b5f805260016020527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49556103438169943b1377290cbd80000061072e565b739ab091113ef489d9506a517d8f04347bd3a170d65f90815260016020527f6aa42d743c42ba73f213abe96024410251d4bce31c6a56c3c01789a43a7c243f91909155805f5160206168135f395f51905f526103aa846a10cab1347fa67177800000610715565b60405190815260200160405180910390a3739ab091113ef489d9506a517d8f04347bd3a170d65f5f5160206168135f395f51905f526103f38469943b1377290cbd80000061072e565b60405190815260200160405180910390a3507f45f9238cfbb97e23a484da3df2a8af39284181610dab48be4540e3da16e4442780546001600160a01b031916309081179091555f90815260136020526040808220805460ff1990811660019081179092556080516001600160a01b039081168552838520805483168417905560075416845291832080548316821790557f2fc2fd6a75155404e2507458545c05ae0f83dea1ea47b6d43f5d01ddc316662c80548316821790557f2191f3b66684d538f689cdf0bb5c7accb9392656908885c0dd14542368312988805483168217905573d26164c723aa921720efe977a4c4aee3f19ed52c9092527fa7d560330481856ac9e80fa7e99b6a67928fe89cc46b42a49c640ad72ba8864a80549091169091179055426021819055602455610741565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6102d18061654283390190565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806105aa57607f821691505b6020821081036105c857634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561061557805f5260205f20601f840160051c810160208510156105f35750805b601f840160051c820191505b81811015610612575f81556001016105ff565b50505b505050565b81516001600160401b0381111561063357610633610582565b610647816106418454610596565b846105ce565b6020601f821160018114610679575f83156106625750848201515b5f19600385901b1c1916600184901b178455610612565b5f84815260208120601f198516915b828110156106a85787850151825560209485019460019092019101610688565b50848210156106c557868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f602082840312156106e4575f5ffd5b81516001600160a01b03811681146106fa575f5ffd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561072857610728610701565b92915050565b8082018082111561072857610728610701565b60805160a05160c051615ce26108605f395f8181612e4f0152612f3a01525f8181610181015281816118860152818161198301528181611bcb01528181611d1701528181611e0401528181611f8301528181611fbf01528181612534015281816128120152818161342a015281816135de015281816144d801528181614595015281816145d10152818161471901528181614f8e0152818161503e0152818161507a015261534101525f818161014f01528181611cb501528181611e3701528181611ea701528181611f1e0152818161242a015281816124cb015281816133ee015281816135a00152818161460401528181614665015281816146a201528181614f24015281816150ad0152818161512b015261516f0152615ce25ff3fe60806040526004361061013f575f3560e01c806370a08231116100b3578063d0e30db01161006d578063d0e30db0146101aa578063db74559b146104ca578063dd62ed3e146104f5578063e64fdd7714610539578063f2fde38b14610564578063f537967114610583575f5ffd5b806370a082311461040957806373bf30ac1461043d5780638da5cb5b1461045c57806395d89b4114610478578063a9059cbb1461048c578063bbddaca3146104ab575f5ffd5b806323b872dd1161010457806323b872dd146103145780632cf003c214610333578063313ce5671461037f5780634ad99662146103a05780635a46bba1146103bf5780636180b10d146103ea575f5ffd5b806306fdde03146101b8578063095ea7b3146101e257806318160ddd146102115780631959a0021461022f57806321aff380146102e9575f5ffd5b366101b457336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806101a35750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b156101aa57005b6101b26105a2565b005b5f5ffd5b3480156101c3575f5ffd5b506101cc610d7b565b6040516101d991906155d3565b60405180910390f35b3480156101ed575f5ffd5b506102016101fc36600461561c565b610e0b565b60405190151581526020016101d9565b34801561021c575f5ffd5b506006545b6040519081526020016101d9565b34801561023a575f5ffd5b5061029d610249366004615646565b60116020525f908152604090208054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901549798969795969495939460ff90931693919290918a565b604080519a8b5260208b01999099529789019690965260608801949094526080870192909252151560a086015260c085015260e0840152610100830152610120820152610140016101d9565b3480156102f4575f5ffd5b50610221610303366004615646565b600b6020525f908152604090205481565b34801561031f575f5ffd5b5061020161032e366004615668565b610e21565b34801561033e575f5ffd5b5061036761034d366004615646565b60096020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101d9565b34801561038a575f5ffd5b5060055460405160ff90911681526020016101d9565b3480156103ab575f5ffd5b506102216103ba366004615646565b610e8f565b3480156103ca575f5ffd5b506102216103d9366004615646565b60106020525f908152604090205481565b3480156103f5575f5ffd5b506101b26104043660046156b3565b610f4b565b348015610414575f5ffd5b50610221610423366004615646565b6001600160a01b03165f9081526001602052604090205490565b348015610448575f5ffd5b506101b2610457366004615736565b611062565b348015610467575f5ffd5b505f546001600160a01b0316610367565b348015610483575f5ffd5b506101cc6110b6565b348015610497575f5ffd5b506102016104a636600461561c565b6110c5565b3480156104b6575f5ffd5b506101b26104c536600461576d565b6110d1565b3480156104d5575f5ffd5b506102216104e4366004615646565b600a6020525f908152604090205481565b348015610500575f5ffd5b5061022161050f36600461576d565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b348015610544575f5ffd5b50610221610553366004615646565b600e6020525f908152604090205481565b34801561056f575f5ffd5b506101b261057e366004615646565b611128565b34801561058e575f5ffd5b506101b261059d366004615799565b61115e565b6029805460ff191660011790819055610100900460ff16156105d7576040516312577edd60e31b815260040160405180910390fd5b6029805461ff0019166101001790556025543410806105f7575060265434115b15610615576040516312577edd60e31b815260040160405180910390fd5b335f908152600960205260409020546001600160a01b031661064a576040516312577edd60e31b815260040160405180910390fd5b335f818152601160205260409020600581015460ff161561067e576040516312577edd60e31b815260040160405180910390fd5b6002810154156106ad5780600201543410156106ad576040516312577edd60e31b815260040160405180910390fd5b3480825560028201555f6106c8670de0b6b3a7640000611860565b9050805f036106ea576040516312577edd60e31b815260040160405180910390fd5b670de0b6b3a76400006106fd823461581e565b6107079190615849565b60018084019190915560058301805460ff19169091179055504260048201555f600382018190556001600160a01b03808416825260096020526040909120541680156108b557805f5b601e8110156107b9576001600160a01b038216156107b9576001600160a01b0382165f908152601060205260408120805434929061078f90849061585c565b90915550506001600160a01b039182165f9081526009602052604090205490911690600101610750565b506001600160a01b038083165f908152600d602090815260408083209388168352929052205460ff16610861576001600160a01b038083165f818152600d60209081526040808320948916808452948252808320805460ff19166001908117909155848452600c83528184208054918201815584528284200180546001600160a01b031916909517909455918152600b90915290812080549161085b8361586f565b91905055505b5f6009840155600561087283611a2e565b10156108b3576001600160a01b0382165f908152600e60205260408120805434929061089f90849061585c565b90915550503460098401556108b382611b55565b505b50345f60646108c583603c61581e565b6108cf9190615849565b90506108f96108df600283615849565b6108ea600284615849565b6108f49084615887565b611ba9565b505f606461090883601961581e565b6109129190615849565b905061091e84826120f3565b505f606461092d83600561581e565b6109379190615849565b6001600160a01b038086165f908152600960205260409020549192501684811561095e5750805b739ab091113ef489d9506a517d8f04347bd3a170d65f835b6001600160a01b038116156109e1576001600160a01b0381165f9081526014602052604090205460ff16156109b157809250600191506109e1565b6001600160a01b038082165f818152600960205260409020549091169081036109da57506109e1565b9050610976565b5f836001600160a01b0316876040515f6040518083038185875af1925050503d805f8114610a2a576040519150601f19603f3d011682016040523d82523d5f602084013e610a2f565b606091505b5050905080158015610a3e5750825b15610a94576040516001600160a01b0386169088905f81818185875af1925050503d805f8114610a89576040519150601f19603f3d011682016040523d82523d5f602084013e610a8e565b606091505b50909150505b80610ab2576040516312577edd60e31b815260040160405180910390fd5b6001600160a01b038a165f908152600c602052604090208054889015610b845781545f90610ae0908b615849565b90508015610b82575f5b8354811015610b80575f848281548110610b0657610b0661589a565b5f9182526020822001546040516001600160a01b0390911691611388918691818181858888f193505050503d805f8114610b5b576040519150601f19603f3d011682016040523d82523d5f602084013e610b60565b606091505b505090508015610b7757610b748385615887565b93505b50600101610aea565b505b505b8015610be7576040515f90739ab091113ef489d9506a517d8f04347bd3a170d69083908381818185875af1925050503d805f8114610bdd576040519150601f19603f3d011682016040523d82523d5f602084013e610be2565b606091505b505050505b5050505050505050505f6064826005610c00919061581e565b610c0a9190615849565b90505f733013013c78302d01d822e2645d441f035e8845dd610c2d600284615849565b6040515f81818185875af1925050503d805f8114610c66576040519150601f19603f3d011682016040523d82523d5f602084013e610c6b565b606091505b5050905080610c8d576040516312577edd60e31b815260040160405180910390fd5b5f73d26164c723aa921720efe977a4c4aee3f19ed52c610cae600285615849565b610cb89085615887565b6040515f81818185875af1925050503d805f8114610cf1576040519150601f19603f3d011682016040523d82523d5f602084013e610cf6565b606091505b5050905080610d18576040516312577edd60e31b815260040160405180910390fd5b505050826001600160a01b03167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15828460010154604051610d63929190918252602082015260400190565b60405180910390a250506029805461ffff1916905550565b606060038054610d8a906158ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610db6906158ae565b8015610e015780601f10610dd857610100808354040283529160200191610e01565b820191905f5260205f20905b815481529060010190602001808311610de457829003601f168201915b5050505050905090565b5f610e1733848461235a565b5060015b92915050565b6001600160a01b0383165f90815260026020908152604080832033845290915281205482811015610e65576040516312577edd60e31b815260040160405180910390fd5b610e708585856123bb565b610e848533610e7f8685615887565b61235a565b506001949350505050565b5f5f610eaf733013013c78302d01d822e2645d441f035e8845dd84612b16565b1180610ed757505f610ed573d26164c723aa921720efe977a4c4aee3f19ed52c84612b16565b115b15610ee5575061012c919050565b60245415610f43575f601f5460245442610eff9190615887565b610f099190615849565b90505f610f1782600261581e565b90505f610f2582606461585c565b905061012c8111610f365780610f3a565b61012c5b95945050505050565b506064919050565b5f546001600160a01b03163314610f75576040516312577edd60e31b815260040160405180910390fd5b6040518061014001604052808a8152602001898152602001888152602001878152602001865f14610fa65786610fa8565b425b81529415156020808701919091526040808701959095526060808701949094526080808701939093525f60a09687018190526001600160a01b039c909c168c52601181529a849020815181559a81015160018c01559283015160028b01559082015160038a015581015160048901559081015160058801805460ff191691151591909117905560c0810151600688015560e08101516007880155610100810151600888015561012001516009909601959095555050505050565b5f546001600160a01b0316331461108c576040516312577edd60e31b815260040160405180910390fd5b6001600160a01b03919091165f908152601460205260409020805460ff1916911515919091179055565b606060048054610d8a906158ae565b5f610e173384846123bb565b5f546001600160a01b031633146110fb576040516312577edd60e31b815260040160405180910390fd5b6001600160a01b039182165f90815260096020526040902080546001600160a01b03191691909216179055565b5f546001600160a01b03163314611152576040516312577edd60e31b815260040160405180910390fd5b61115b81612bf6565b50565b5f546001600160a01b03163314611188576040516312577edd60e31b815260040160405180910390fd5b732faeffd01624433464687e53b87872fbcff666f35f5b8281101561185a575f8484838181106111ba576111ba61589a565b90506020020160208101906111cf9190615646565b90506001600160a01b0381166111e8575060010161119f565b6001600160a01b0381165f9081526012602052604090205460ff1615611211575060010161119f565b6040516370a0823160e01b81526001600160a01b0382811660048301525f91908516906370a0823190602401602060405180830381865afa158015611258573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061127c91906158e0565b90506112888282612c45565b60405163167801e160e11b81526001600160a01b0383811660048301525f9190861690632cf003c290602401602060405180830381865afa1580156112cf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f391906158f7565b6001600160a01b038481165f818152600960205260409081902080546001600160a01b0319168585161790555163db74559b60e01b8152600481019190915291925086169063db74559b90602401602060405180830381865afa15801561135c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061138091906158e0565b6001600160a01b038481165f818152600a60205260409081902093909355915162435fe760e71b815260048101929092528616906321aff38090602401602060405180830381865afa1580156113d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113fc91906158e0565b6001600160a01b038481165f818152600b60205260409081902093909355915163e64fdd7760e01b8152600481019290925286169063e64fdd7790602401602060405180830381865afa158015611455573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061147991906158e0565b6001600160a01b038481165f818152600e602052604090819020939093559151635a46bba160e01b81526004810192909252861690635a46bba190602401602060405180830381865afa1580156114d2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114f691906158e0565b6001600160a01b038085165f81815260106020526040808220949094559251630cacd00160e11b8152600481019190915282918291829182918291829182918e1690631959a0029060240161012060405180830381865afa15801561155d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115819190615912565b9850985098509850509750975097509750604051806101400160405280898152602001888152602001878152602001670de0b6b3a76400008c1080156115c45750855b6115ce57866115d0565b5f5b815260200142815260200185151581526020018481526020018381526020018281526020015f81525060115f8d6001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f01556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015f6101000a81548160ff02191690831515021790555060c0820151816006015560e08201518160070155610100820151816008015561012082015181600901559050505f6001600160a01b0316896001600160a01b0316141580156117255750604051631ce0ec6d60e01b81526001600160a01b038a811660048301528c811660248301528e1690631ce0ec6d90604401602060405180830381865afa158015611701573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117259190615984565b801561175657506001600160a01b03808a165f908152600d60209081526040808320938f168352929052205460ff16155b1561181f576001600d5f8b6001600160a01b03166001600160a01b031681526020019081526020015f205f8d6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff021916908315150217905550600c5f8a6001600160a01b03166001600160a01b031681526020019081526020015f208b908060018154018082558091505060019003905f5260205f20015f9091909190916101000a8154816001600160a01b0302191690836001600160a01b031602179055505b5050506001600160a01b039097165f908152601260205260409020805460ff1916600190811790915597909701965061119f95505050505050565b50505050565b6040805160028082526060820183525f92839291906020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118e0573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061190491906158f7565b815f815181106119165761191661589a565b60200260200101906001600160a01b031690816001600160a01b0316815250507355d398326f99059ff775485246999027b31979558160018151811061195e5761195e61589a565b6001600160a01b03928316602091820292909201015260405163d06ca61f60e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063d06ca61f906119bc90869085906004016159f6565b5f60405180830381865afa9250505080156119f857506040513d5f823e601f3d908101601f191682016040526119f59190810190615a16565b60015b611a0457505f92915050565b80600181518110611a1757611a1761589a565b602002602001015192505050919050565b50919050565b6001600160a01b0381165f9081526011602052604081206006810154600590819015611a7a578260060154811115611a76576006830154611a6f9082615887565b9050611a7a565b5060015b600583015460ff16158015611a9257505f8360070154115b15611b0c575f601f54601e611aa7919061581e565b90505f81118015611ac75750808460070154611ac3919061585c565b4210155b15611b0a575f81856007015442611ade9190615887565b611ae89190615849565b905080831115611b0357611afc8184615887565b9250611b08565b600192505b505b505b60018110611b1a5780611b1d565b60015b9050826008015481611b2f919061585c565b91506005821115611b3f57600591505b6001821015611b4d57600191505b509392505050565b600f545f819003611b64575050565b6001600160a01b0382165f908152600e6020526040902054611b87908290615849565b6001600160a01b039092165f9081526011602052604090206008019190915550565b6040805160028082526060820183525f926020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c4991906158f7565b815f81518110611c5b57611c5b61589a565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611c8f57611c8f61589a565b60200260200101906001600160a01b031690816001600160a01b0316815250505f611cee7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165f9081526001602052604090205490565b90505f5f90506127106028541015611ded5760405163d06ca61f60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d06ca61f90611d4e90889087906004016159f6565b5f60405180830381865afa925050508015611d8a57506040513d5f823e601f3d908101601f19168201604052611d879190810190615a16565b60015b15611ded57805115611deb575f8160018351611da69190615887565b81518110611db657611db661589a565b60200260200101519050612710602854612710611dd39190615887565b611ddd908361581e565b611de79190615849565b9250505b505b604051637ff36ab560e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637ff36ab5908790611e6190859088907f0000000000000000000000000000000000000000000000000000000000000000904290600401615ade565b5f6040518083038185885af1158015611e7c573d5f5f3e3d5ffd5b50505050506040513d5f823e601f3d908101601f19168201604052611ea49190810190615a16565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165f90815260016020526040812054611ee8908490615887565b905080156120eb57305f908152600160205260408120546040516313c5035360e31b8152306004820152602481018490529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639e281a98906044015f604051808303815f87803b158015611f67575f5ffd5b505af1158015611f79573d5f5f3e3d5ffd5b50505050611fa8307f00000000000000000000000000000000000000000000000000000000000000008461235a565b60405163f305d71960e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063f305d71990889061200290309087905f90819061dead904290600401615b12565b60606040518083038185885af115801561201e573d5f5f3e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906120439190615b4d565b5050305f908152600160205260409020549050818111156120e8575f6120698383615887565b6007549091506120849030906001600160a01b031683612ce1565b60075f9054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156120d0575f5ffd5b505af11580156120e2573d5f5f3e3d5ffd5b50505050505b50505b505050505050565b6001600160a01b038083165f908152600960205260408120549091169061211b600584615849565b90505f805b60058110156122ca576001600160a01b038085165f8181526009602052604090205490911690156122c0576001600160a01b0385165f908152600b602052604081205483158015612172575060018110155b1561218057600191506121f8565b836001148015612191575060038110155b1561219f57600191506121f8565b8360021480156121b0575060058110155b156121be57600191506121f8565b8360031480156121cf575060078110155b156121dd57600191506121f8565b8360041480156121ee575060098110155b156121f857600191505b81156122bd576001600160a01b0387165f9081526011602052604081206005015460ff1661223a57739ab091113ef489d9506a517d8f04347bd3a170d661223c565b875b90505f816001600160a01b0316886040515f6040518083038185875af1925050503d805f8114612287576040519150601f19603f3d011682016040523d82523d5f602084013e61228c565b606091505b50509050806122ae576040516312577edd60e31b815260040160405180910390fd5b6122b8888861585c565b965050505b50505b9350600101612120565b5080841115612353575f739ab091113ef489d9506a517d8f04347bd3a170d66122f38387615887565b6040515f81818185875af1925050503d805f811461232c576040519150601f19603f3d011682016040523d82523d5f602084013e612331565b606091505b50509050806120eb576040516312577edd60e31b815260040160405180910390fd5b5050505050565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6007546001600160a01b0316158015906123f957506007546001600160a01b03848116911614806123f957506007546001600160a01b038381169116145b15612576576007546001600160a01b03908116908416036124b5576001600160a01b038216301480159061245f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b801561249257506001600160a01b0382165f9081526013602052604090205460ff1680156124905750612490612da5565b155b156124b0576040516312577edd60e31b815260040160405180910390fd5b612576565b6001600160a01b038316301480159061250057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614155b801561255857506001600160a01b0383165f9081526013602052604090205460ff1680156125565750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b155b15612576576040516312577edd60e31b815260040160405180910390fd5b601f54602154612586919061585c565b4210158015612598575060295460ff16155b80156125b257506007546001600160a01b03838116911614155b80156125cc57506007546001600160a01b03848116911614155b156125d9576125d9612fb2565b60295460ff166125eb8484848461333c565b8015801561260157506001600160a01b03831630145b1561267e57815f03612649576126168461373a565b6040515f815230906001600160a01b038616905f516020615c8d5f395f51905f529060200160405180910390a350505050565b81655af3107a40001461267e576001600160a01b0384165f9081526013602052604090205461185a908590849060ff166139bf565b81655af3107a40001480156126aa57506001600160a01b038381165f9081526009602052604090205416155b80156126c457506007546001600160a01b03858116911614155b80156126d957506001600160a01b0383163014155b156127d5576001600160a01b038481165f9081526009602052604090205416612715576040516312577edd60e31b815260040160405180910390fd5b6001600160a01b038381165f90815260096020908152604080832080546001600160a01b0319169489169485179055928252600a905290812080549161275a8361586f565b9190505550836001600160a01b0316836001600160a01b03167ffd43abdc1b330cff3a3b1571cb7ed7f3040abee39dcefeba0df4cf342fb8203060405160405180910390a35f805260016020525f516020615c6d5f395f51905f5254662386f26fc10000116127d5576127d55f84662386f26fc10000612ce1565b6001600160a01b038085165f9081526013602052604090205460075460ff9091169185811691161482158015612809575081155b801561284757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614155b80156128965750808061289657506007546001600160a01b0387811691161480159061288157506007546001600160a01b03868116911614155b801561289657506001600160a01b0386163014155b156128a5576128a58685613c98565b8080156128b0575082155b80156128ba575081155b15612b0b576007546001600160a01b03165f908152600160205260409020546128e590606490615849565b841115612905576040516312577edd60e31b815260040160405180910390fd5b5f612924733013013c78302d01d822e2645d441f035e8845dd88612b16565b118061294c57505f61294a73d26164c723aa921720efe977a4c4aee3f19ed52c88612b16565b115b1561298c576001600160a01b0386165f9081526011602052604090206005015460ff1661298c576040516312577edd60e31b815260040160405180910390fd5b6001600160a01b0386165f9081526011602052604081206002015490036129c6576040516312577edd60e31b815260040160405180910390fd5b6001600160a01b0386165f908152600160205260409020548411156129fe576040516312577edd60e31b815260040160405180910390fd5b5f612a07613da6565b9050805f03612a29576040516312577edd60e31b815260040160405180910390fd5b5f81612a3d670de0b6b3a764000088615849565b612a47919061581e565b9050670de0b6b3a764000082612a5d8289615b78565b612a67919061581e565b612a719190615849565b612a7b908261585c565b9050612a878882613fa9565b612a92883088612ce1565b5f612a9d308861407f565b905086811115612aaa5750855b5f612ab58885614331565b90505f612ac2828461585c565b905088811115612adb575087612ad88382615887565b91505b8115612aea57612aea8261440f565b612afe308b612af9848d615887565b612ce1565b5050505050505050505050565b6120eb868686612ce1565b5f6001600160a01b038316612b2c57505f610e1b565b604080516001600160a01b0384811660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166370a0823160e01b17905291515f92839290871691612b839190615b8b565b5f60405180830381855afa9150503d805f8114612bbb576040519150601f19603f3d011682016040523d82523d5f602084013e612bc0565b606091505b5091509150811580612bd3575060208151105b15612be2575f92505050610e1b565b80806020019051810190610f3a91906158e0565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382165f90815260016020526040902054808203612c6957505050565b80821115612cae575f612c7c8284615887565b5f805260016020525f516020615c6d5f395f51905f5254909150811115612ca35750505050565b61185a5f8583612ce1565b5f612cb98383615887565b6001600160a01b0385165f90815260016020526040902054909150811161185a5761185a845f835b6001600160a01b0383165f90815260016020526040902054811115612d19576040516312577edd60e31b815260040160405180910390fd5b6001600160a01b0383165f9081526001602052604081208054839290612d40908490615887565b90915550506001600160a01b0382165f9081526001602052604081208054839290612d6c90849061585c565b92505081905550816001600160a01b0316836001600160a01b03165f516020615c8d5f395f51905f52836040516123ae91815260200190565b5f5f5f60075f9054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612df8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e1c9190615bbc565b5091509150816001600160701b03165f1480612e3f57506001600160701b038116155b15612e4c575f9250505090565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660075f9054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ec7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612eeb91906158f7565b6001600160a01b031614612f0857816001600160701b0316612f13565b826001600160701b03165b6007546040516370a0823160e01b81526001600160a01b0391821660048201529192505f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015612f81573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fa591906158e0565b9190911115949350505050565b5f60215442612fc19190615887565b90505f601f5482612fd29190615849565b9050805f03612ff4576040516312577edd60e31b815260040160405180910390fd5b601f54613001908261581e565b60215f828254613011919061585c565b90915550506007545f906001600160a01b0316156132e2576007546001600160a01b03165f90815260016020526040902054690ed2b525841adfc000008111156130df575f61306a690ed2b525841adfc0000083615887565b90505f61271061307b603282615887565b61308d90670de0b6b3a764000061581e565b6130979190615849565b90505f6130a48287614959565b9050670de0b6b3a76400006130b98282615887565b6130c3908661581e565b6130cd9190615849565b9450828511156130db578294505b5050505b81156132e0576007546001600160a01b03165f908152600160205260408120805484929061310e908490615887565b909155505f9050613120600284615849565b733013013c78302d01d822e2645d441f035e8845dd5f90815260016020527fadfca48119ce2374ffeb518b05cb7096480168371019ae52551b536bdda027518054929350839290919061317490849061585c565b9091555061318490508184615887565b73d26164c723aa921720efe977a4c4aee3f19ed52c5f90815260016020527f67f57ab34d6fe0a316a04fe3086e32a76b485748a759981c39f78285acdaf29580549091906131d390849061585c565b9091555050600754604051828152733013013c78302d01d822e2645d441f035e8845dd916001600160a01b0316905f516020615c8d5f395f51905f529060200160405180910390a360075473d26164c723aa921720efe977a4c4aee3f19ed52c906001600160a01b03165f516020615c8d5f395f51905f526132558487615887565b60405190815260200160405180910390a360075f9054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156132b2575f5ffd5b505af11580156132c4573d5f5f3e3d5ffd5b505050508260205f8282546132d9919061585c565b9091555050505b505b47801561185a576040515f90739ab091113ef489d9506a517d8f04347bd3a170d69083908381818185875af1925050503d805f81146120e8576040519150601f19603f3d011682016040523d82523d5f602084013e6120e8565b8061185a576007545f9081906001600160a01b0390811690871603613366575060019050836133bc565b6007546001600160a01b0390811690861603613387575060029050846133bc565b6001600160a01b0385163014801561339e57508315155b80156133b0575083655af3107a400014155b156133bc575060029050845b60ff821615806133d357506001600160a01b038116155b806133e657506001600160a01b03811630145b8061342257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316145b8061345e57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316145b1561346a57505061185a565b6001600160a01b0381165f9081526013602052604090205460ff1661357e576001600160a01b0381165f908152601b602052604090205480158015906134b957506134b681603c61585c565b42105b156134d7576040516312577edd60e31b815260040160405180910390fd5b6001600160a01b0382165f90815260196020908152604080832054601a9092529091205460ff16438214801561350f575060ff811615155b801561352157508460ff168160ff1614155b1561353f576040516312577edd60e31b815260040160405180910390fd5b5050506001600160a01b0381165f908152601b6020908152604080832042905560198252808320439055601a9091529020805460ff191660ff84161790555b32801580159061359757506001600160a01b0381163014155b80156135d557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614155b801561361357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614155b801561363757506001600160a01b0381165f9081526013602052604090205460ff16155b15613731576001600160a01b0381165f908152601e6020526040902054801580159061366c575061366981603c61585c565b42105b1561368a576040516312577edd60e31b815260040160405180910390fd5b6001600160a01b0382165f908152601c6020908152604080832054601d9092529091205460ff1643821480156136c2575060ff811615155b80156136d457508560ff168160ff1614155b156136f2576040516312577edd60e31b815260040160405180910390fd5b5050506001600160a01b0381165f908152601e60209081526040808320429055601c8252808320439055601d9091529020805460ff191660ff85161790555b50505050505050565b602954610100900460ff1615613763576040516312577edd60e31b815260040160405180910390fd5b6029805461ff0019166101001790556001600160a01b0381165f908152601160205260409020600581015460ff1661379b57506139b1565b42816004015411156137b357426004909101556139b1565b5f8160040154426137c49190615887565b90505f601f54826137d59190615849565b9050805f036137e6575050506139b1565b5f6137f085610e8f565b90505f612710828660010154613806919061581e565b6138109190615849565b90505f61381d848361581e565b90505f60646027548860010154613834919061581e565b61383e9190615849565b90508087600301541061386057613854886149bf565b505050505050506139b1565b5f8760030154826138719190615887565b90508083111561387f578092505b5f613888613da6565b9050805f0361389f575050505050505050506139b1565b5f816138b386670de0b6b3a764000061581e565b6138bd9190615849565b90508015613992575f805260016020525f516020615c6d5f395f51905f52548111156138fc576040516312577edd60e31b815260040160405180910390fd5b848a6003015f82825461390f919061585c565b9091555050601f54613921908961581e565b8a6004015f828254613933919061585c565b9091555061394490505f8c83612ce1565b8a6001600160a01b03167f5e9e6b9df53e452d45e2f47925ae1555cff912ed53297935113f18f4700a00ff8260405161397f91815260200190565b60405180910390a26139928b8287614d2c565b838a60030154106139a6576139a68b6149bf565b505050505050505050505b506029805461ff0019169055565b602954610100900460ff16156139e8576040516312577edd60e31b815260040160405180910390fd5b6029805461ff001981166101001790915560ff16613c88578115613c88576007546001600160a01b03165f90815260016020526040902054613a2c90606490615849565b821115613a4c576040516312577edd60e31b815260040160405180910390fd5b80613ad8575f613a70733013013c78302d01d822e2645d441f035e8845dd85612b16565b1180613a9857505f613a9673d26164c723aa921720efe977a4c4aee3f19ed52c85612b16565b115b15613ad8576001600160a01b0383165f9081526011602052604090206005015460ff16613ad8576040516312577edd60e31b815260040160405180910390fd5b6001600160a01b0383165f908152601160205260408120600201549003613b12576040516312577edd60e31b815260040160405180910390fd5b6029805460ff191660011790555f81613bb957613b2f8484613c98565b613b37613da6565b9050805f03613b59576040516312577edd60e31b815260040160405180910390fd5b5f81613b6d670de0b6b3a764000086615849565b613b77919061581e565b9050670de0b6b3a764000082613b8d8287615b78565b613b97919061581e565b613ba19190615849565b613bab908261585c565b9050613bb78582613fa9565b505b6001600160a01b0384165f90815260016020526040902054831115613bf1576040516312577edd60e31b815260040160405180910390fd5b613bfc843085612ce1565b5f8083613c2857613c0d308661407f565b915084821115613c1b578491505b613c258584614331565b90505b5f613c33828461585c565b905085811115613c4c575084613c498382615887565b91505b5f613c578288615887565b90508015613c6957613c698882614f00565b8215613c7857613c788361440f565b50506029805460ff191690555050505b50506029805461ff001916905550565b5f613ca283611a2e565b90505f601f5442613cb39190615849565b6001600160a01b0385165f908152601660205260409020549091508114613cfc576001600160a01b0384165f908152601560209081526040808320839055601690915290208190555b6001600160a01b0384165f90815260016020526040812054606490613d2290859061581e565b613d2c9190615849565b6001600160a01b0386165f908152601560205260409020549091508190613d5490869061585c565b1115613d73576040516312577edd60e31b815260040160405180910390fd5b6001600160a01b0385165f9081526015602052604081208054869290613d9a90849061585c565b90915550505050505050565b6007545f906001600160a01b0316613dbd57505f90565b5f613dcf670de0b6b3a7640000611860565b9050805f03613ddf575f91505090565b5f5f60075f9054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613e31573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e559190615bbc565b5091509150816001600160701b03165f1480613e7857506001600160701b038116155b15613e86575f935050505090565b60075460408051630dfe168160e01b815290515f926001600160a01b031691630dfe16819160048083019260209291908290030181865afa158015613ecd573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ef191906158f7565b90505f6001600160a01b0382163014613f1357826001600160701b0316613f1e565b836001600160701b03165b90505f6001600160a01b0383163014613f4057846001600160701b0316613f4b565b836001600160701b03165b9050815f03613f60575f965050505050505090565b5f82613f7483670de0b6b3a764000061581e565b613f7e9190615849565b9050670de0b6b3a7640000613f93888361581e565b613f9d9190615849565b97505050505050505090565b5f601f5442613fb89190615849565b6001600160a01b0384165f908152601860205260409020549091508114614001576001600160a01b0383165f908152601760209081526040808320839055601890915290208190555b6001600160a01b0383165f90815260176020526040902054683635c9adc5dea000009061402f90849061585c565b111561404e576040516312577edd60e31b815260040160405180910390fd5b6001600160a01b0383165f908152601760205260408120805484929061407590849061585c565b9091555050505050565b5f80606461408e84600361581e565b6140989190615849565b90505f6140a6600383615849565b90505f6140b4600384615849565b90505f816140c28486615887565b6140cc9190615887565b90508215614196576001600160a01b0387165f90815260016020526040812080548592906140fb908490615887565b9091555050733013013c78302d01d822e2645d441f035e8845dd5f90815260016020527fadfca48119ce2374ffeb518b05cb7096480168371019ae52551b536bdda02751805485929061414f90849061585c565b9091555050604051838152733013013c78302d01d822e2645d441f035e8845dd906001600160a01b038916905f516020615c8d5f395f51905f529060200160405180910390a35b811561425e576001600160a01b0387165f90815260016020526040812080548492906141c3908490615887565b909155505073d26164c723aa921720efe977a4c4aee3f19ed52c5f90815260016020527f67f57ab34d6fe0a316a04fe3086e32a76b485748a759981c39f78285acdaf295805484929061421790849061585c565b909155505060405182815273d26164c723aa921720efe977a4c4aee3f19ed52c906001600160a01b038916905f516020615c8d5f395f51905f529060200160405180910390a35b8015614326576001600160a01b0387165f908152600160205260408120805483929061428b908490615887565b9091555050739ab091113ef489d9506a517d8f04347bd3a170d65f90815260016020527f6aa42d743c42ba73f213abe96024410251d4bce31c6a56c3c01789a43a7c243f80548392906142df90849061585c565b9091555050604051818152739ab091113ef489d9506a517d8f04347bd3a170d6906001600160a01b038916905f516020615c8d5f395f51905f529060200160405180910390a35b509195945050505050565b5f82158061433d575081155b1561434957505f610e1b565b5f601f54426143589190615849565b90508060235414158061436b5750602254155b1561437f576023555060228190555f610e1b565b6022548310614391575f915050610e1b565b6022545f906143a08582615887565b6143ab90606461581e565b6143b59190615849565b90505f6143c3600583615849565b6143ce90600561581e565b9050602d8111156143dd5750602d5b805f036143ef575f9350505050610e1b565b60646143fb828861581e565b6144059190615849565b9695505050505050565b60295460ff1680614428576029805460ff191660011790555b815f03614443578061443f576029805460ff191690555b5050565b5f61444f600284615849565b90505f61445c8285615887565b9050811580614469575080155b15614483578261185a576029805460ff1916905550505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f815181106144b6576144b661589a565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614532573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061455691906158f7565b816001815181106145695761456961589a565b6001600160a01b0390921660209283029190910190910152475f61458d8584615311565b90506145ba307f00000000000000000000000000000000000000000000000000000000000000008961235a565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac9479061462e908890859088907f0000000000000000000000000000000000000000000000000000000000000000904290600401615c08565b5f604051808303815f87803b158015614645575f5ffd5b505af1925050508015614656575060015b15614941576001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163180156147025760405163093fa59760e11b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063127f4b2e906024015f604051808303815f87803b1580156146eb575f5ffd5b505af11580156146fd573d5f5f3e3d5ffd5b505050505b60405163f305d71960e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063f305d71990839061475c9030908a905f90819061dead904290600401615b12565b60606040518083038185885af193505050508015614797575060408051601f3d908101601f1916820190925261479491810190615b4d565b60015b156147a0575050505b478381111561482b575f739ab091113ef489d9506a517d8f04347bd3a170d66147c98684615887565b6040515f81818185875af1925050503d805f8114614802576040519150601f19603f3d011682016040523d82523d5f602084013e614807565b606091505b5050905080614829576040516312577edd60e31b815260040160405180910390fd5b505b305f9081526001602052604081205490811580159061485457506007546001600160a01b031615155b15614875576007546148719030906001600160a01b031684612ce1565b5060015b6007546001600160a01b03161580159061488e57505f8b115b80156148b357506007546001600160a01b03165f908152600160205260409020548b11155b156148d3576007546148cf906001600160a01b03165f8d612ce1565b5060015b801561493c5760075f9054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614925575f5ffd5b505af1158015614937573d5f5f3e3d5ffd5b505050505b505050505b85613731576029805460ff1916905550505050505050565b670de0b6b3a76400005b8115610e1b578160011660010361499457670de0b6b3a7640000614987848361581e565b6149919190615849565b90505b670de0b6b3a76400006149a7848061581e565b6149b19190615849565b9250600182901c9150614963565b6001600160a01b0381165f90815260116020526040812060058101805460ff1916905560068101805491926149f38361586f565b90915550504260078201555f600882018190556001600160a01b0380841682526009602052604090912054168015614cf45760098201548015614aa1576001600160a01b0382165f908152600e602052604090205481811115614a7757614a5a8282615887565b6001600160a01b0384165f908152600e6020526040902055614a90565b6001600160a01b0383165f908152600e60205260408120555b5f6009850155614a9f83611b55565b505b825482905f5b600f811015614b4d576001600160a01b03831615614b4d576001600160a01b0383165f908152601060205260409020548211614b0f576001600160a01b0383165f9081526010602052604081208054849290614b04908490615887565b90915550614b289050565b6001600160a01b0383165f908152601060205260408120555b6001600160a01b039283165f9081526009602052604090205490921691600101614aa7565b506001600160a01b038085165f908152600d60209081526040808320938a168352929052205460ff1615614cf0576001600160a01b038085165f818152600d60209081526040808320948b168352938152838220805460ff19169055918152600b909152205415614be1576001600160a01b0384165f908152600b60205260408120805491614bdb83615c43565b91905055505b6001600160a01b0384165f908152600c60205260408120905b8154811015614ced57876001600160a01b0316828281548110614c1f57614c1f61589a565b5f918252602090912001546001600160a01b031603614ce55781548290614c4890600190615887565b81548110614c5857614c5861589a565b905f5260205f20015f9054906101000a90046001600160a01b0316828281548110614c8557614c8561589a565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555081805480614cc057614cc0615c58565b5f8281526020902081015f1990810180546001600160a01b0319169055019055614ced565b600101614bfa565b50505b5050505b6040516001600160a01b038416907f7c79e6e24ed041d1072d54523b53956f01b91b835f0490856370594d9d14470e905f90a2505050565b6001600160a01b038084165f908152600960205260409020541680614d515750505050565b6001600160a01b0381165f908152600b6020526040812054600a8110614d7a5760149150614d98565b60058110614d8b57600f9150614d98565b60018110614d9857600a91505b5f80808415614de0576064614dad868a61581e565b614db79190615849565b92506064614dc5868961581e565b614dcf9190615849565b9150614ddc86848461541e565b5090505b805f8415614e005784614df3848661581e565b614dfd9190615849565b90505b6001600160a01b038089165f90815260096020526040812054909116905b600a8110156120e2576001600160a01b038216156120e2576001600160a01b0382165f9081526011602052604090206005015460ff1615614edb575f6064614e6786603261581e565b614e719190615849565b90505f6064614e8186603261581e565b614e8b9190615849565b90508115614ed1575f614e9f85848461541e565b5096508690508215614ec75782614eb6828461581e565b614ec09190615849565b9550614ecb565b5f95505b50614ed8565b50506120e2565b50505b6001600160a01b039182165f9081526009602052604090205490911690600101614e1e565b805f03614f0b575050565b6040805160028082526060820183526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001631925f92919060208301908036833701905050905030815f81518110614f6c57614f6c61589a565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614fe8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061500c91906158f7565b8160018151811061501f5761501f61589a565b6001600160a01b03909216602092830291909101909101525f615063307f00000000000000000000000000000000000000000000000000000000000000008661235a565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906150d7908790859087907f0000000000000000000000000000000000000000000000000000000000000000904290600401615c08565b5f604051808303815f87803b1580156150ee575f5ffd5b505af19250505080156150ff575060015b61511c576040516312577edd60e31b815260040160405180910390fd5b5f615151846001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001631615887565b905080156152585760405163093fa59760e11b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063127f4b2e906024015f604051808303815f87803b1580156151b8575f5ffd5b505af19250505080156151c9575060015b6151e6576040516312577edd60e31b815260040160405180910390fd5b5f866001600160a01b0316826040515f6040518083038185875af1925050503d805f811461522f576040519150601f19603f3d011682016040523d82523d5f602084013e615234565b606091505b5050905080615256576040516312577edd60e31b815260040160405180910390fd5b505b6007546001600160a01b03161580159061528b57506007546001600160a01b03165f908152600160205260409020548511155b156120eb576007546152a7906001600160a01b03165f87612ce1565b60075f9054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156152f3575f5ffd5b505af1158015615305573d5f5f3e3d5ffd5b50505050505050505050565b6028545f906127108110615328575f915050610e1b565b60405163d06ca61f60e01b81525f906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d06ca61f9061537890889088906004016159f6565b5f60405180830381865afa9250505080156153b457506040513d5f823e601f3d908101601f191682016040526153b19190810190615a16565b60015b156153ec578051156153ea5780600182516153cf9190615887565b815181106153df576153df61589a565b602002602001015191505b505b805f036153fd575f92505050610e1b565b61271061540a8382615887565b615414908361581e565b610f3a9190615849565b6001600160a01b0383165f908152601160205260408120600581015482919060ff16615450575f5f92509250506155cb565b5f60646027548360010154615465919061581e565b61546f9190615849565b90508082600301541061549257615485876149bf565b5f5f9350935050506155cb565b5f8260030154826154a39190615887565b9050808611156154d35792508285156154ce57856154c1828961581e565b6154cb9190615849565b94505b6154da565b8593508694505b841561553f575f80805260016020525f516020615c6d5f395f51905f52549081900361550b575f95505f945061553d565b8581101561553d57805f86615520575f615535565b8761552b838961581e565b6155359190615849565b919750909550505b505b831561555e5783836003015f828254615558919061585c565b90915550505b84156155b35761556f5f8987612ce1565b876001600160a01b03167f7e7e460bf522c66a98f2b3abde08b8d3c81a9a06d2c774655260aeaa2e6c4ecc866040516155aa91815260200190565b60405180910390a25b818360030154106155c7576155c7886149bf565b5050505b935093915050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b038116811461115b575f5ffd5b5f5f6040838503121561562d575f5ffd5b823561563881615608565b946020939093013593505050565b5f60208284031215615656575f5ffd5b813561566181615608565b9392505050565b5f5f5f6060848603121561567a575f5ffd5b833561568581615608565b9250602084013561569581615608565b929592945050506040919091013590565b801515811461115b575f5ffd5b5f5f5f5f5f5f5f5f5f5f6101408b8d0312156156cd575f5ffd5b8a356156d881615608565b995060208b0135985060408b0135975060608b0135965060808b0135955060a08b0135945060c08b013561570b816156a6565b999c989b50969995989497939650939460e08101359450610100810135936101209091013592509050565b5f5f60408385031215615747575f5ffd5b823561575281615608565b91506020830135615762816156a6565b809150509250929050565b5f5f6040838503121561577e575f5ffd5b823561578981615608565b9150602083013561576281615608565b5f5f602083850312156157aa575f5ffd5b823567ffffffffffffffff8111156157c0575f5ffd5b8301601f810185136157d0575f5ffd5b803567ffffffffffffffff8111156157e6575f5ffd5b8560208260051b84010111156157fa575f5ffd5b6020919091019590945092505050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610e1b57610e1b61580a565b634e487b7160e01b5f52601260045260245ffd5b5f8261585757615857615835565b500490565b80820180821115610e1b57610e1b61580a565b5f600182016158805761588061580a565b5060010190565b81810381811115610e1b57610e1b61580a565b634e487b7160e01b5f52603260045260245ffd5b600181811c908216806158c257607f821691505b602082108103611a2857634e487b7160e01b5f52602260045260245ffd5b5f602082840312156158f0575f5ffd5b5051919050565b5f60208284031215615907575f5ffd5b815161566181615608565b5f5f5f5f5f5f5f5f5f6101208a8c03121561592b575f5ffd5b895160208b015160408c015160608d015160808e015160a08f0151949d50929b509099509750955061595c816156a6565b60c08b015160e08c0151610100909c01519a9d999c50979a9699959890979695945092505050565b5f60208284031215615994575f5ffd5b8151615661816156a6565b634e487b7160e01b5f52604160045260245ffd5b5f8151808452602084019350602083015f5b828110156159ec5781516001600160a01b03168652602095860195909101906001016159c5565b5093949350505050565b828152604060208201525f615a0e60408301846159b3565b949350505050565b5f60208284031215615a26575f5ffd5b815167ffffffffffffffff811115615a3c575f5ffd5b8201601f81018413615a4c575f5ffd5b805167ffffffffffffffff811115615a6657615a6661599f565b8060051b604051601f19603f830116810181811067ffffffffffffffff82111715615a9357615a9361599f565b604052918252602081840181019290810187841115615ab0575f5ffd5b6020850194505b83851015615ad357845180825260209586019590935001615ab7565b509695505050505050565b848152608060208201525f615af660808301866159b3565b6001600160a01b03949094166040830152506060015292915050565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b5f5f5f60608486031215615b5f575f5ffd5b5050815160208301516040909301519094929350919050565b5f82615b8657615b86615835565b500690565b5f82518060208501845e5f920191825250919050565b80516001600160701b0381168114615bb7575f5ffd5b919050565b5f5f5f60608486031215615bce575f5ffd5b615bd784615ba1565b9250615be560208501615ba1565b9150604084015163ffffffff81168114615bfd575f5ffd5b809150509250925092565b85815284602082015260a060408201525f615c2660a08301866159b3565b6001600160a01b0394909416606083015250608001529392505050565b5f81615c5157615c5161580a565b505f190190565b634e487b7160e01b5f52603160045260245ffdfea6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212209cf0512b182a13b5280561351578bdf41c8ff012fcbb7f6f014d08cd3041651464736f6c634300081f00336080604052348015600e575f5ffd5b505f80546001600160a01b031916331790556102a48061002d5f395ff3fe608060405260043610610036575f3560e01c8063127f4b2e146100415780638da5cb5b146100625780639e281a981461009c575f5ffd5b3661003d57005b5f5ffd5b34801561004c575f5ffd5b5061006061005b3660046101fc565b6100bb565b005b34801561006d575f5ffd5b505f54610080906001600160a01b031681565b6040516001600160a01b03909116815260200160405180910390f35b3480156100a7575f5ffd5b506100606100b6366004610213565b61015a565b5f546001600160a01b031633146100e5576040516312577edd60e31b815260040160405180910390fd5b5f80546040516001600160a01b039091169083908381818185875af1925050503d805f811461012f576040519150601f19603f3d011682016040523d82523d5f602084013e610134565b606091505b5050905080610156576040516312577edd60e31b815260040160405180910390fd5b5050565b5f546001600160a01b03163314610184576040516312577edd60e31b815260040160405180910390fd5b5f5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016020604051808303815f875af11580156101d3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101f79190610248565b505050565b5f6020828403121561020c575f5ffd5b5035919050565b5f5f60408385031215610224575f5ffd5b82356001600160a01b038116811461023a575f5ffd5b946020939093013593505050565b5f60208284031215610258575f5ffd5b81518015158114610267575f5ffd5b939250505056fea264697066735822122039398ee6cbce2986a1c48bb7b12fe8be88780d9fae4420950d4b445dc98ebd3c64736f6c634300081f0033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

Deployed Bytecode

0x60806040526004361061013f575f3560e01c806370a08231116100b3578063d0e30db01161006d578063d0e30db0146101aa578063db74559b146104ca578063dd62ed3e146104f5578063e64fdd7714610539578063f2fde38b14610564578063f537967114610583575f5ffd5b806370a082311461040957806373bf30ac1461043d5780638da5cb5b1461045c57806395d89b4114610478578063a9059cbb1461048c578063bbddaca3146104ab575f5ffd5b806323b872dd1161010457806323b872dd146103145780632cf003c214610333578063313ce5671461037f5780634ad99662146103a05780635a46bba1146103bf5780636180b10d146103ea575f5ffd5b806306fdde03146101b8578063095ea7b3146101e257806318160ddd146102115780631959a0021461022f57806321aff380146102e9575f5ffd5b366101b457336001600160a01b037f00000000000000000000000070cc2785ceba0e53f5510bce9b7fac3720c138de1614806101a35750336001600160a01b037f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e16145b156101aa57005b6101b26105a2565b005b5f5ffd5b3480156101c3575f5ffd5b506101cc610d7b565b6040516101d991906155d3565b60405180910390f35b3480156101ed575f5ffd5b506102016101fc36600461561c565b610e0b565b60405190151581526020016101d9565b34801561021c575f5ffd5b506006545b6040519081526020016101d9565b34801561023a575f5ffd5b5061029d610249366004615646565b60116020525f908152604090208054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901549798969795969495939460ff90931693919290918a565b604080519a8b5260208b01999099529789019690965260608801949094526080870192909252151560a086015260c085015260e0840152610100830152610120820152610140016101d9565b3480156102f4575f5ffd5b50610221610303366004615646565b600b6020525f908152604090205481565b34801561031f575f5ffd5b5061020161032e366004615668565b610e21565b34801561033e575f5ffd5b5061036761034d366004615646565b60096020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101d9565b34801561038a575f5ffd5b5060055460405160ff90911681526020016101d9565b3480156103ab575f5ffd5b506102216103ba366004615646565b610e8f565b3480156103ca575f5ffd5b506102216103d9366004615646565b60106020525f908152604090205481565b3480156103f5575f5ffd5b506101b26104043660046156b3565b610f4b565b348015610414575f5ffd5b50610221610423366004615646565b6001600160a01b03165f9081526001602052604090205490565b348015610448575f5ffd5b506101b2610457366004615736565b611062565b348015610467575f5ffd5b505f546001600160a01b0316610367565b348015610483575f5ffd5b506101cc6110b6565b348015610497575f5ffd5b506102016104a636600461561c565b6110c5565b3480156104b6575f5ffd5b506101b26104c536600461576d565b6110d1565b3480156104d5575f5ffd5b506102216104e4366004615646565b600a6020525f908152604090205481565b348015610500575f5ffd5b5061022161050f36600461576d565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b348015610544575f5ffd5b50610221610553366004615646565b600e6020525f908152604090205481565b34801561056f575f5ffd5b506101b261057e366004615646565b611128565b34801561058e575f5ffd5b506101b261059d366004615799565b61115e565b6029805460ff191660011790819055610100900460ff16156105d7576040516312577edd60e31b815260040160405180910390fd5b6029805461ff0019166101001790556025543410806105f7575060265434115b15610615576040516312577edd60e31b815260040160405180910390fd5b335f908152600960205260409020546001600160a01b031661064a576040516312577edd60e31b815260040160405180910390fd5b335f818152601160205260409020600581015460ff161561067e576040516312577edd60e31b815260040160405180910390fd5b6002810154156106ad5780600201543410156106ad576040516312577edd60e31b815260040160405180910390fd5b3480825560028201555f6106c8670de0b6b3a7640000611860565b9050805f036106ea576040516312577edd60e31b815260040160405180910390fd5b670de0b6b3a76400006106fd823461581e565b6107079190615849565b60018084019190915560058301805460ff19169091179055504260048201555f600382018190556001600160a01b03808416825260096020526040909120541680156108b557805f5b601e8110156107b9576001600160a01b038216156107b9576001600160a01b0382165f908152601060205260408120805434929061078f90849061585c565b90915550506001600160a01b039182165f9081526009602052604090205490911690600101610750565b506001600160a01b038083165f908152600d602090815260408083209388168352929052205460ff16610861576001600160a01b038083165f818152600d60209081526040808320948916808452948252808320805460ff19166001908117909155848452600c83528184208054918201815584528284200180546001600160a01b031916909517909455918152600b90915290812080549161085b8361586f565b91905055505b5f6009840155600561087283611a2e565b10156108b3576001600160a01b0382165f908152600e60205260408120805434929061089f90849061585c565b90915550503460098401556108b382611b55565b505b50345f60646108c583603c61581e565b6108cf9190615849565b90506108f96108df600283615849565b6108ea600284615849565b6108f49084615887565b611ba9565b505f606461090883601961581e565b6109129190615849565b905061091e84826120f3565b505f606461092d83600561581e565b6109379190615849565b6001600160a01b038086165f908152600960205260409020549192501684811561095e5750805b739ab091113ef489d9506a517d8f04347bd3a170d65f835b6001600160a01b038116156109e1576001600160a01b0381165f9081526014602052604090205460ff16156109b157809250600191506109e1565b6001600160a01b038082165f818152600960205260409020549091169081036109da57506109e1565b9050610976565b5f836001600160a01b0316876040515f6040518083038185875af1925050503d805f8114610a2a576040519150601f19603f3d011682016040523d82523d5f602084013e610a2f565b606091505b5050905080158015610a3e5750825b15610a94576040516001600160a01b0386169088905f81818185875af1925050503d805f8114610a89576040519150601f19603f3d011682016040523d82523d5f602084013e610a8e565b606091505b50909150505b80610ab2576040516312577edd60e31b815260040160405180910390fd5b6001600160a01b038a165f908152600c602052604090208054889015610b845781545f90610ae0908b615849565b90508015610b82575f5b8354811015610b80575f848281548110610b0657610b0661589a565b5f9182526020822001546040516001600160a01b0390911691611388918691818181858888f193505050503d805f8114610b5b576040519150601f19603f3d011682016040523d82523d5f602084013e610b60565b606091505b505090508015610b7757610b748385615887565b93505b50600101610aea565b505b505b8015610be7576040515f90739ab091113ef489d9506a517d8f04347bd3a170d69083908381818185875af1925050503d805f8114610bdd576040519150601f19603f3d011682016040523d82523d5f602084013e610be2565b606091505b505050505b5050505050505050505f6064826005610c00919061581e565b610c0a9190615849565b90505f733013013c78302d01d822e2645d441f035e8845dd610c2d600284615849565b6040515f81818185875af1925050503d805f8114610c66576040519150601f19603f3d011682016040523d82523d5f602084013e610c6b565b606091505b5050905080610c8d576040516312577edd60e31b815260040160405180910390fd5b5f73d26164c723aa921720efe977a4c4aee3f19ed52c610cae600285615849565b610cb89085615887565b6040515f81818185875af1925050503d805f8114610cf1576040519150601f19603f3d011682016040523d82523d5f602084013e610cf6565b606091505b5050905080610d18576040516312577edd60e31b815260040160405180910390fd5b505050826001600160a01b03167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15828460010154604051610d63929190918252602082015260400190565b60405180910390a250506029805461ffff1916905550565b606060038054610d8a906158ae565b80601f0160208091040260200160405190810160405280929190818152602001828054610db6906158ae565b8015610e015780601f10610dd857610100808354040283529160200191610e01565b820191905f5260205f20905b815481529060010190602001808311610de457829003601f168201915b5050505050905090565b5f610e1733848461235a565b5060015b92915050565b6001600160a01b0383165f90815260026020908152604080832033845290915281205482811015610e65576040516312577edd60e31b815260040160405180910390fd5b610e708585856123bb565b610e848533610e7f8685615887565b61235a565b506001949350505050565b5f5f610eaf733013013c78302d01d822e2645d441f035e8845dd84612b16565b1180610ed757505f610ed573d26164c723aa921720efe977a4c4aee3f19ed52c84612b16565b115b15610ee5575061012c919050565b60245415610f43575f601f5460245442610eff9190615887565b610f099190615849565b90505f610f1782600261581e565b90505f610f2582606461585c565b905061012c8111610f365780610f3a565b61012c5b95945050505050565b506064919050565b5f546001600160a01b03163314610f75576040516312577edd60e31b815260040160405180910390fd5b6040518061014001604052808a8152602001898152602001888152602001878152602001865f14610fa65786610fa8565b425b81529415156020808701919091526040808701959095526060808701949094526080808701939093525f60a09687018190526001600160a01b039c909c168c52601181529a849020815181559a81015160018c01559283015160028b01559082015160038a015581015160048901559081015160058801805460ff191691151591909117905560c0810151600688015560e08101516007880155610100810151600888015561012001516009909601959095555050505050565b5f546001600160a01b0316331461108c576040516312577edd60e31b815260040160405180910390fd5b6001600160a01b03919091165f908152601460205260409020805460ff1916911515919091179055565b606060048054610d8a906158ae565b5f610e173384846123bb565b5f546001600160a01b031633146110fb576040516312577edd60e31b815260040160405180910390fd5b6001600160a01b039182165f90815260096020526040902080546001600160a01b03191691909216179055565b5f546001600160a01b03163314611152576040516312577edd60e31b815260040160405180910390fd5b61115b81612bf6565b50565b5f546001600160a01b03163314611188576040516312577edd60e31b815260040160405180910390fd5b732faeffd01624433464687e53b87872fbcff666f35f5b8281101561185a575f8484838181106111ba576111ba61589a565b90506020020160208101906111cf9190615646565b90506001600160a01b0381166111e8575060010161119f565b6001600160a01b0381165f9081526012602052604090205460ff1615611211575060010161119f565b6040516370a0823160e01b81526001600160a01b0382811660048301525f91908516906370a0823190602401602060405180830381865afa158015611258573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061127c91906158e0565b90506112888282612c45565b60405163167801e160e11b81526001600160a01b0383811660048301525f9190861690632cf003c290602401602060405180830381865afa1580156112cf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f391906158f7565b6001600160a01b038481165f818152600960205260409081902080546001600160a01b0319168585161790555163db74559b60e01b8152600481019190915291925086169063db74559b90602401602060405180830381865afa15801561135c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061138091906158e0565b6001600160a01b038481165f818152600a60205260409081902093909355915162435fe760e71b815260048101929092528616906321aff38090602401602060405180830381865afa1580156113d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113fc91906158e0565b6001600160a01b038481165f818152600b60205260409081902093909355915163e64fdd7760e01b8152600481019290925286169063e64fdd7790602401602060405180830381865afa158015611455573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061147991906158e0565b6001600160a01b038481165f818152600e602052604090819020939093559151635a46bba160e01b81526004810192909252861690635a46bba190602401602060405180830381865afa1580156114d2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114f691906158e0565b6001600160a01b038085165f81815260106020526040808220949094559251630cacd00160e11b8152600481019190915282918291829182918291829182918e1690631959a0029060240161012060405180830381865afa15801561155d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115819190615912565b9850985098509850509750975097509750604051806101400160405280898152602001888152602001878152602001670de0b6b3a76400008c1080156115c45750855b6115ce57866115d0565b5f5b815260200142815260200185151581526020018481526020018381526020018281526020015f81525060115f8d6001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f01556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015f6101000a81548160ff02191690831515021790555060c0820151816006015560e08201518160070155610100820151816008015561012082015181600901559050505f6001600160a01b0316896001600160a01b0316141580156117255750604051631ce0ec6d60e01b81526001600160a01b038a811660048301528c811660248301528e1690631ce0ec6d90604401602060405180830381865afa158015611701573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117259190615984565b801561175657506001600160a01b03808a165f908152600d60209081526040808320938f168352929052205460ff16155b1561181f576001600d5f8b6001600160a01b03166001600160a01b031681526020019081526020015f205f8d6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff021916908315150217905550600c5f8a6001600160a01b03166001600160a01b031681526020019081526020015f208b908060018154018082558091505060019003905f5260205f20015f9091909190916101000a8154816001600160a01b0302191690836001600160a01b031602179055505b5050506001600160a01b039097165f908152601260205260409020805460ff1916600190811790915597909701965061119f95505050505050565b50505050565b6040805160028082526060820183525f92839291906020830190803683370190505090507f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118e0573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061190491906158f7565b815f815181106119165761191661589a565b60200260200101906001600160a01b031690816001600160a01b0316815250507355d398326f99059ff775485246999027b31979558160018151811061195e5761195e61589a565b6001600160a01b03928316602091820292909201015260405163d06ca61f60e01b81527f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e9091169063d06ca61f906119bc90869085906004016159f6565b5f60405180830381865afa9250505080156119f857506040513d5f823e601f3d908101601f191682016040526119f59190810190615a16565b60015b611a0457505f92915050565b80600181518110611a1757611a1761589a565b602002602001015192505050919050565b50919050565b6001600160a01b0381165f9081526011602052604081206006810154600590819015611a7a578260060154811115611a76576006830154611a6f9082615887565b9050611a7a565b5060015b600583015460ff16158015611a9257505f8360070154115b15611b0c575f601f54601e611aa7919061581e565b90505f81118015611ac75750808460070154611ac3919061585c565b4210155b15611b0a575f81856007015442611ade9190615887565b611ae89190615849565b905080831115611b0357611afc8184615887565b9250611b08565b600192505b505b505b60018110611b1a5780611b1d565b60015b9050826008015481611b2f919061585c565b91506005821115611b3f57600591505b6001821015611b4d57600191505b509392505050565b600f545f819003611b64575050565b6001600160a01b0382165f908152600e6020526040902054611b87908290615849565b6001600160a01b039092165f9081526011602052604090206008019190915550565b6040805160028082526060820183525f926020830190803683370190505090507f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c4991906158f7565b815f81518110611c5b57611c5b61589a565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611c8f57611c8f61589a565b60200260200101906001600160a01b031690816001600160a01b0316815250505f611cee7f00000000000000000000000070cc2785ceba0e53f5510bce9b7fac3720c138de6001600160a01b03165f9081526001602052604090205490565b90505f5f90506127106028541015611ded5760405163d06ca61f60e01b81526001600160a01b037f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e169063d06ca61f90611d4e90889087906004016159f6565b5f60405180830381865afa925050508015611d8a57506040513d5f823e601f3d908101601f19168201604052611d879190810190615a16565b60015b15611ded57805115611deb575f8160018351611da69190615887565b81518110611db657611db661589a565b60200260200101519050612710602854612710611dd39190615887565b611ddd908361581e565b611de79190615849565b9250505b505b604051637ff36ab560e01b81526001600160a01b037f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e1690637ff36ab5908790611e6190859088907f00000000000000000000000070cc2785ceba0e53f5510bce9b7fac3720c138de904290600401615ade565b5f6040518083038185885af1158015611e7c573d5f5f3e3d5ffd5b50505050506040513d5f823e601f3d908101601f19168201604052611ea49190810190615a16565b507f00000000000000000000000070cc2785ceba0e53f5510bce9b7fac3720c138de6001600160a01b03165f90815260016020526040812054611ee8908490615887565b905080156120eb57305f908152600160205260408120546040516313c5035360e31b8152306004820152602481018490529091507f00000000000000000000000070cc2785ceba0e53f5510bce9b7fac3720c138de6001600160a01b031690639e281a98906044015f604051808303815f87803b158015611f67575f5ffd5b505af1158015611f79573d5f5f3e3d5ffd5b50505050611fa8307f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e8461235a565b60405163f305d71960e01b81526001600160a01b037f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e169063f305d71990889061200290309087905f90819061dead904290600401615b12565b60606040518083038185885af115801561201e573d5f5f3e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906120439190615b4d565b5050305f908152600160205260409020549050818111156120e8575f6120698383615887565b6007549091506120849030906001600160a01b031683612ce1565b60075f9054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156120d0575f5ffd5b505af11580156120e2573d5f5f3e3d5ffd5b50505050505b50505b505050505050565b6001600160a01b038083165f908152600960205260408120549091169061211b600584615849565b90505f805b60058110156122ca576001600160a01b038085165f8181526009602052604090205490911690156122c0576001600160a01b0385165f908152600b602052604081205483158015612172575060018110155b1561218057600191506121f8565b836001148015612191575060038110155b1561219f57600191506121f8565b8360021480156121b0575060058110155b156121be57600191506121f8565b8360031480156121cf575060078110155b156121dd57600191506121f8565b8360041480156121ee575060098110155b156121f857600191505b81156122bd576001600160a01b0387165f9081526011602052604081206005015460ff1661223a57739ab091113ef489d9506a517d8f04347bd3a170d661223c565b875b90505f816001600160a01b0316886040515f6040518083038185875af1925050503d805f8114612287576040519150601f19603f3d011682016040523d82523d5f602084013e61228c565b606091505b50509050806122ae576040516312577edd60e31b815260040160405180910390fd5b6122b8888861585c565b965050505b50505b9350600101612120565b5080841115612353575f739ab091113ef489d9506a517d8f04347bd3a170d66122f38387615887565b6040515f81818185875af1925050503d805f811461232c576040519150601f19603f3d011682016040523d82523d5f602084013e612331565b606091505b50509050806120eb576040516312577edd60e31b815260040160405180910390fd5b5050505050565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6007546001600160a01b0316158015906123f957506007546001600160a01b03848116911614806123f957506007546001600160a01b038381169116145b15612576576007546001600160a01b03908116908416036124b5576001600160a01b038216301480159061245f57507f00000000000000000000000070cc2785ceba0e53f5510bce9b7fac3720c138de6001600160a01b0316826001600160a01b031614155b801561249257506001600160a01b0382165f9081526013602052604090205460ff1680156124905750612490612da5565b155b156124b0576040516312577edd60e31b815260040160405180910390fd5b612576565b6001600160a01b038316301480159061250057507f00000000000000000000000070cc2785ceba0e53f5510bce9b7fac3720c138de6001600160a01b0316836001600160a01b031614155b801561255857506001600160a01b0383165f9081526013602052604090205460ff1680156125565750336001600160a01b037f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e16145b155b15612576576040516312577edd60e31b815260040160405180910390fd5b601f54602154612586919061585c565b4210158015612598575060295460ff16155b80156125b257506007546001600160a01b03838116911614155b80156125cc57506007546001600160a01b03848116911614155b156125d9576125d9612fb2565b60295460ff166125eb8484848461333c565b8015801561260157506001600160a01b03831630145b1561267e57815f03612649576126168461373a565b6040515f815230906001600160a01b038616905f516020615c8d5f395f51905f529060200160405180910390a350505050565b81655af3107a40001461267e576001600160a01b0384165f9081526013602052604090205461185a908590849060ff166139bf565b81655af3107a40001480156126aa57506001600160a01b038381165f9081526009602052604090205416155b80156126c457506007546001600160a01b03858116911614155b80156126d957506001600160a01b0383163014155b156127d5576001600160a01b038481165f9081526009602052604090205416612715576040516312577edd60e31b815260040160405180910390fd5b6001600160a01b038381165f90815260096020908152604080832080546001600160a01b0319169489169485179055928252600a905290812080549161275a8361586f565b9190505550836001600160a01b0316836001600160a01b03167ffd43abdc1b330cff3a3b1571cb7ed7f3040abee39dcefeba0df4cf342fb8203060405160405180910390a35f805260016020525f516020615c6d5f395f51905f5254662386f26fc10000116127d5576127d55f84662386f26fc10000612ce1565b6001600160a01b038085165f9081526013602052604090205460075460ff9091169185811691161482158015612809575081155b801561284757507f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b0316866001600160a01b031614155b80156128965750808061289657506007546001600160a01b0387811691161480159061288157506007546001600160a01b03868116911614155b801561289657506001600160a01b0386163014155b156128a5576128a58685613c98565b8080156128b0575082155b80156128ba575081155b15612b0b576007546001600160a01b03165f908152600160205260409020546128e590606490615849565b841115612905576040516312577edd60e31b815260040160405180910390fd5b5f612924733013013c78302d01d822e2645d441f035e8845dd88612b16565b118061294c57505f61294a73d26164c723aa921720efe977a4c4aee3f19ed52c88612b16565b115b1561298c576001600160a01b0386165f9081526011602052604090206005015460ff1661298c576040516312577edd60e31b815260040160405180910390fd5b6001600160a01b0386165f9081526011602052604081206002015490036129c6576040516312577edd60e31b815260040160405180910390fd5b6001600160a01b0386165f908152600160205260409020548411156129fe576040516312577edd60e31b815260040160405180910390fd5b5f612a07613da6565b9050805f03612a29576040516312577edd60e31b815260040160405180910390fd5b5f81612a3d670de0b6b3a764000088615849565b612a47919061581e565b9050670de0b6b3a764000082612a5d8289615b78565b612a67919061581e565b612a719190615849565b612a7b908261585c565b9050612a878882613fa9565b612a92883088612ce1565b5f612a9d308861407f565b905086811115612aaa5750855b5f612ab58885614331565b90505f612ac2828461585c565b905088811115612adb575087612ad88382615887565b91505b8115612aea57612aea8261440f565b612afe308b612af9848d615887565b612ce1565b5050505050505050505050565b6120eb868686612ce1565b5f6001600160a01b038316612b2c57505f610e1b565b604080516001600160a01b0384811660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166370a0823160e01b17905291515f92839290871691612b839190615b8b565b5f60405180830381855afa9150503d805f8114612bbb576040519150601f19603f3d011682016040523d82523d5f602084013e612bc0565b606091505b5091509150811580612bd3575060208151105b15612be2575f92505050610e1b565b80806020019051810190610f3a91906158e0565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382165f90815260016020526040902054808203612c6957505050565b80821115612cae575f612c7c8284615887565b5f805260016020525f516020615c6d5f395f51905f5254909150811115612ca35750505050565b61185a5f8583612ce1565b5f612cb98383615887565b6001600160a01b0385165f90815260016020526040902054909150811161185a5761185a845f835b6001600160a01b0383165f90815260016020526040902054811115612d19576040516312577edd60e31b815260040160405180910390fd5b6001600160a01b0383165f9081526001602052604081208054839290612d40908490615887565b90915550506001600160a01b0382165f9081526001602052604081208054839290612d6c90849061585c565b92505081905550816001600160a01b0316836001600160a01b03165f516020615c8d5f395f51905f52836040516123ae91815260200190565b5f5f5f60075f9054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612df8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e1c9190615bbc565b5091509150816001600160701b03165f1480612e3f57506001600160701b038116155b15612e4c575f9250505090565b5f7f000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c6001600160a01b031660075f9054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ec7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612eeb91906158f7565b6001600160a01b031614612f0857816001600160701b0316612f13565b826001600160701b03165b6007546040516370a0823160e01b81526001600160a01b0391821660048201529192505f917f000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c909116906370a0823190602401602060405180830381865afa158015612f81573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fa591906158e0565b9190911115949350505050565b5f60215442612fc19190615887565b90505f601f5482612fd29190615849565b9050805f03612ff4576040516312577edd60e31b815260040160405180910390fd5b601f54613001908261581e565b60215f828254613011919061585c565b90915550506007545f906001600160a01b0316156132e2576007546001600160a01b03165f90815260016020526040902054690ed2b525841adfc000008111156130df575f61306a690ed2b525841adfc0000083615887565b90505f61271061307b603282615887565b61308d90670de0b6b3a764000061581e565b6130979190615849565b90505f6130a48287614959565b9050670de0b6b3a76400006130b98282615887565b6130c3908661581e565b6130cd9190615849565b9450828511156130db578294505b5050505b81156132e0576007546001600160a01b03165f908152600160205260408120805484929061310e908490615887565b909155505f9050613120600284615849565b733013013c78302d01d822e2645d441f035e8845dd5f90815260016020527fadfca48119ce2374ffeb518b05cb7096480168371019ae52551b536bdda027518054929350839290919061317490849061585c565b9091555061318490508184615887565b73d26164c723aa921720efe977a4c4aee3f19ed52c5f90815260016020527f67f57ab34d6fe0a316a04fe3086e32a76b485748a759981c39f78285acdaf29580549091906131d390849061585c565b9091555050600754604051828152733013013c78302d01d822e2645d441f035e8845dd916001600160a01b0316905f516020615c8d5f395f51905f529060200160405180910390a360075473d26164c723aa921720efe977a4c4aee3f19ed52c906001600160a01b03165f516020615c8d5f395f51905f526132558487615887565b60405190815260200160405180910390a360075f9054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156132b2575f5ffd5b505af11580156132c4573d5f5f3e3d5ffd5b505050508260205f8282546132d9919061585c565b9091555050505b505b47801561185a576040515f90739ab091113ef489d9506a517d8f04347bd3a170d69083908381818185875af1925050503d805f81146120e8576040519150601f19603f3d011682016040523d82523d5f602084013e6120e8565b8061185a576007545f9081906001600160a01b0390811690871603613366575060019050836133bc565b6007546001600160a01b0390811690861603613387575060029050846133bc565b6001600160a01b0385163014801561339e57508315155b80156133b0575083655af3107a400014155b156133bc575060029050845b60ff821615806133d357506001600160a01b038116155b806133e657506001600160a01b03811630145b8061342257507f00000000000000000000000070cc2785ceba0e53f5510bce9b7fac3720c138de6001600160a01b0316816001600160a01b0316145b8061345e57507f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b0316816001600160a01b0316145b1561346a57505061185a565b6001600160a01b0381165f9081526013602052604090205460ff1661357e576001600160a01b0381165f908152601b602052604090205480158015906134b957506134b681603c61585c565b42105b156134d7576040516312577edd60e31b815260040160405180910390fd5b6001600160a01b0382165f90815260196020908152604080832054601a9092529091205460ff16438214801561350f575060ff811615155b801561352157508460ff168160ff1614155b1561353f576040516312577edd60e31b815260040160405180910390fd5b5050506001600160a01b0381165f908152601b6020908152604080832042905560198252808320439055601a9091529020805460ff191660ff84161790555b32801580159061359757506001600160a01b0381163014155b80156135d557507f00000000000000000000000070cc2785ceba0e53f5510bce9b7fac3720c138de6001600160a01b0316816001600160a01b031614155b801561361357507f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b0316816001600160a01b031614155b801561363757506001600160a01b0381165f9081526013602052604090205460ff16155b15613731576001600160a01b0381165f908152601e6020526040902054801580159061366c575061366981603c61585c565b42105b1561368a576040516312577edd60e31b815260040160405180910390fd5b6001600160a01b0382165f908152601c6020908152604080832054601d9092529091205460ff1643821480156136c2575060ff811615155b80156136d457508560ff168160ff1614155b156136f2576040516312577edd60e31b815260040160405180910390fd5b5050506001600160a01b0381165f908152601e60209081526040808320429055601c8252808320439055601d9091529020805460ff191660ff85161790555b50505050505050565b602954610100900460ff1615613763576040516312577edd60e31b815260040160405180910390fd5b6029805461ff0019166101001790556001600160a01b0381165f908152601160205260409020600581015460ff1661379b57506139b1565b42816004015411156137b357426004909101556139b1565b5f8160040154426137c49190615887565b90505f601f54826137d59190615849565b9050805f036137e6575050506139b1565b5f6137f085610e8f565b90505f612710828660010154613806919061581e565b6138109190615849565b90505f61381d848361581e565b90505f60646027548860010154613834919061581e565b61383e9190615849565b90508087600301541061386057613854886149bf565b505050505050506139b1565b5f8760030154826138719190615887565b90508083111561387f578092505b5f613888613da6565b9050805f0361389f575050505050505050506139b1565b5f816138b386670de0b6b3a764000061581e565b6138bd9190615849565b90508015613992575f805260016020525f516020615c6d5f395f51905f52548111156138fc576040516312577edd60e31b815260040160405180910390fd5b848a6003015f82825461390f919061585c565b9091555050601f54613921908961581e565b8a6004015f828254613933919061585c565b9091555061394490505f8c83612ce1565b8a6001600160a01b03167f5e9e6b9df53e452d45e2f47925ae1555cff912ed53297935113f18f4700a00ff8260405161397f91815260200190565b60405180910390a26139928b8287614d2c565b838a60030154106139a6576139a68b6149bf565b505050505050505050505b506029805461ff0019169055565b602954610100900460ff16156139e8576040516312577edd60e31b815260040160405180910390fd5b6029805461ff001981166101001790915560ff16613c88578115613c88576007546001600160a01b03165f90815260016020526040902054613a2c90606490615849565b821115613a4c576040516312577edd60e31b815260040160405180910390fd5b80613ad8575f613a70733013013c78302d01d822e2645d441f035e8845dd85612b16565b1180613a9857505f613a9673d26164c723aa921720efe977a4c4aee3f19ed52c85612b16565b115b15613ad8576001600160a01b0383165f9081526011602052604090206005015460ff16613ad8576040516312577edd60e31b815260040160405180910390fd5b6001600160a01b0383165f908152601160205260408120600201549003613b12576040516312577edd60e31b815260040160405180910390fd5b6029805460ff191660011790555f81613bb957613b2f8484613c98565b613b37613da6565b9050805f03613b59576040516312577edd60e31b815260040160405180910390fd5b5f81613b6d670de0b6b3a764000086615849565b613b77919061581e565b9050670de0b6b3a764000082613b8d8287615b78565b613b97919061581e565b613ba19190615849565b613bab908261585c565b9050613bb78582613fa9565b505b6001600160a01b0384165f90815260016020526040902054831115613bf1576040516312577edd60e31b815260040160405180910390fd5b613bfc843085612ce1565b5f8083613c2857613c0d308661407f565b915084821115613c1b578491505b613c258584614331565b90505b5f613c33828461585c565b905085811115613c4c575084613c498382615887565b91505b5f613c578288615887565b90508015613c6957613c698882614f00565b8215613c7857613c788361440f565b50506029805460ff191690555050505b50506029805461ff001916905550565b5f613ca283611a2e565b90505f601f5442613cb39190615849565b6001600160a01b0385165f908152601660205260409020549091508114613cfc576001600160a01b0384165f908152601560209081526040808320839055601690915290208190555b6001600160a01b0384165f90815260016020526040812054606490613d2290859061581e565b613d2c9190615849565b6001600160a01b0386165f908152601560205260409020549091508190613d5490869061585c565b1115613d73576040516312577edd60e31b815260040160405180910390fd5b6001600160a01b0385165f9081526015602052604081208054869290613d9a90849061585c565b90915550505050505050565b6007545f906001600160a01b0316613dbd57505f90565b5f613dcf670de0b6b3a7640000611860565b9050805f03613ddf575f91505090565b5f5f60075f9054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613e31573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e559190615bbc565b5091509150816001600160701b03165f1480613e7857506001600160701b038116155b15613e86575f935050505090565b60075460408051630dfe168160e01b815290515f926001600160a01b031691630dfe16819160048083019260209291908290030181865afa158015613ecd573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ef191906158f7565b90505f6001600160a01b0382163014613f1357826001600160701b0316613f1e565b836001600160701b03165b90505f6001600160a01b0383163014613f4057846001600160701b0316613f4b565b836001600160701b03165b9050815f03613f60575f965050505050505090565b5f82613f7483670de0b6b3a764000061581e565b613f7e9190615849565b9050670de0b6b3a7640000613f93888361581e565b613f9d9190615849565b97505050505050505090565b5f601f5442613fb89190615849565b6001600160a01b0384165f908152601860205260409020549091508114614001576001600160a01b0383165f908152601760209081526040808320839055601890915290208190555b6001600160a01b0383165f90815260176020526040902054683635c9adc5dea000009061402f90849061585c565b111561404e576040516312577edd60e31b815260040160405180910390fd5b6001600160a01b0383165f908152601760205260408120805484929061407590849061585c565b9091555050505050565b5f80606461408e84600361581e565b6140989190615849565b90505f6140a6600383615849565b90505f6140b4600384615849565b90505f816140c28486615887565b6140cc9190615887565b90508215614196576001600160a01b0387165f90815260016020526040812080548592906140fb908490615887565b9091555050733013013c78302d01d822e2645d441f035e8845dd5f90815260016020527fadfca48119ce2374ffeb518b05cb7096480168371019ae52551b536bdda02751805485929061414f90849061585c565b9091555050604051838152733013013c78302d01d822e2645d441f035e8845dd906001600160a01b038916905f516020615c8d5f395f51905f529060200160405180910390a35b811561425e576001600160a01b0387165f90815260016020526040812080548492906141c3908490615887565b909155505073d26164c723aa921720efe977a4c4aee3f19ed52c5f90815260016020527f67f57ab34d6fe0a316a04fe3086e32a76b485748a759981c39f78285acdaf295805484929061421790849061585c565b909155505060405182815273d26164c723aa921720efe977a4c4aee3f19ed52c906001600160a01b038916905f516020615c8d5f395f51905f529060200160405180910390a35b8015614326576001600160a01b0387165f908152600160205260408120805483929061428b908490615887565b9091555050739ab091113ef489d9506a517d8f04347bd3a170d65f90815260016020527f6aa42d743c42ba73f213abe96024410251d4bce31c6a56c3c01789a43a7c243f80548392906142df90849061585c565b9091555050604051818152739ab091113ef489d9506a517d8f04347bd3a170d6906001600160a01b038916905f516020615c8d5f395f51905f529060200160405180910390a35b509195945050505050565b5f82158061433d575081155b1561434957505f610e1b565b5f601f54426143589190615849565b90508060235414158061436b5750602254155b1561437f576023555060228190555f610e1b565b6022548310614391575f915050610e1b565b6022545f906143a08582615887565b6143ab90606461581e565b6143b59190615849565b90505f6143c3600583615849565b6143ce90600561581e565b9050602d8111156143dd5750602d5b805f036143ef575f9350505050610e1b565b60646143fb828861581e565b6144059190615849565b9695505050505050565b60295460ff1680614428576029805460ff191660011790555b815f03614443578061443f576029805460ff191690555b5050565b5f61444f600284615849565b90505f61445c8285615887565b9050811580614469575080155b15614483578261185a576029805460ff1916905550505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f815181106144b6576144b661589a565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614532573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061455691906158f7565b816001815181106145695761456961589a565b6001600160a01b0390921660209283029190910190910152475f61458d8584615311565b90506145ba307f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e8961235a565b60405163791ac94760e01b81526001600160a01b037f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e169063791ac9479061462e908890859088907f00000000000000000000000070cc2785ceba0e53f5510bce9b7fac3720c138de904290600401615c08565b5f604051808303815f87803b158015614645575f5ffd5b505af1925050508015614656575060015b15614941576001600160a01b037f00000000000000000000000070cc2785ceba0e53f5510bce9b7fac3720c138de163180156147025760405163093fa59760e11b8152600481018290527f00000000000000000000000070cc2785ceba0e53f5510bce9b7fac3720c138de6001600160a01b03169063127f4b2e906024015f604051808303815f87803b1580156146eb575f5ffd5b505af11580156146fd573d5f5f3e3d5ffd5b505050505b60405163f305d71960e01b81526001600160a01b037f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e169063f305d71990839061475c9030908a905f90819061dead904290600401615b12565b60606040518083038185885af193505050508015614797575060408051601f3d908101601f1916820190925261479491810190615b4d565b60015b156147a0575050505b478381111561482b575f739ab091113ef489d9506a517d8f04347bd3a170d66147c98684615887565b6040515f81818185875af1925050503d805f8114614802576040519150601f19603f3d011682016040523d82523d5f602084013e614807565b606091505b5050905080614829576040516312577edd60e31b815260040160405180910390fd5b505b305f9081526001602052604081205490811580159061485457506007546001600160a01b031615155b15614875576007546148719030906001600160a01b031684612ce1565b5060015b6007546001600160a01b03161580159061488e57505f8b115b80156148b357506007546001600160a01b03165f908152600160205260409020548b11155b156148d3576007546148cf906001600160a01b03165f8d612ce1565b5060015b801561493c5760075f9054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614925575f5ffd5b505af1158015614937573d5f5f3e3d5ffd5b505050505b505050505b85613731576029805460ff1916905550505050505050565b670de0b6b3a76400005b8115610e1b578160011660010361499457670de0b6b3a7640000614987848361581e565b6149919190615849565b90505b670de0b6b3a76400006149a7848061581e565b6149b19190615849565b9250600182901c9150614963565b6001600160a01b0381165f90815260116020526040812060058101805460ff1916905560068101805491926149f38361586f565b90915550504260078201555f600882018190556001600160a01b0380841682526009602052604090912054168015614cf45760098201548015614aa1576001600160a01b0382165f908152600e602052604090205481811115614a7757614a5a8282615887565b6001600160a01b0384165f908152600e6020526040902055614a90565b6001600160a01b0383165f908152600e60205260408120555b5f6009850155614a9f83611b55565b505b825482905f5b600f811015614b4d576001600160a01b03831615614b4d576001600160a01b0383165f908152601060205260409020548211614b0f576001600160a01b0383165f9081526010602052604081208054849290614b04908490615887565b90915550614b289050565b6001600160a01b0383165f908152601060205260408120555b6001600160a01b039283165f9081526009602052604090205490921691600101614aa7565b506001600160a01b038085165f908152600d60209081526040808320938a168352929052205460ff1615614cf0576001600160a01b038085165f818152600d60209081526040808320948b168352938152838220805460ff19169055918152600b909152205415614be1576001600160a01b0384165f908152600b60205260408120805491614bdb83615c43565b91905055505b6001600160a01b0384165f908152600c60205260408120905b8154811015614ced57876001600160a01b0316828281548110614c1f57614c1f61589a565b5f918252602090912001546001600160a01b031603614ce55781548290614c4890600190615887565b81548110614c5857614c5861589a565b905f5260205f20015f9054906101000a90046001600160a01b0316828281548110614c8557614c8561589a565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555081805480614cc057614cc0615c58565b5f8281526020902081015f1990810180546001600160a01b0319169055019055614ced565b600101614bfa565b50505b5050505b6040516001600160a01b038416907f7c79e6e24ed041d1072d54523b53956f01b91b835f0490856370594d9d14470e905f90a2505050565b6001600160a01b038084165f908152600960205260409020541680614d515750505050565b6001600160a01b0381165f908152600b6020526040812054600a8110614d7a5760149150614d98565b60058110614d8b57600f9150614d98565b60018110614d9857600a91505b5f80808415614de0576064614dad868a61581e565b614db79190615849565b92506064614dc5868961581e565b614dcf9190615849565b9150614ddc86848461541e565b5090505b805f8415614e005784614df3848661581e565b614dfd9190615849565b90505b6001600160a01b038089165f90815260096020526040812054909116905b600a8110156120e2576001600160a01b038216156120e2576001600160a01b0382165f9081526011602052604090206005015460ff1615614edb575f6064614e6786603261581e565b614e719190615849565b90505f6064614e8186603261581e565b614e8b9190615849565b90508115614ed1575f614e9f85848461541e565b5096508690508215614ec75782614eb6828461581e565b614ec09190615849565b9550614ecb565b5f95505b50614ed8565b50506120e2565b50505b6001600160a01b039182165f9081526009602052604090205490911690600101614e1e565b805f03614f0b575050565b6040805160028082526060820183526001600160a01b037f00000000000000000000000070cc2785ceba0e53f5510bce9b7fac3720c138de1631925f92919060208301908036833701905050905030815f81518110614f6c57614f6c61589a565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614fe8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061500c91906158f7565b8160018151811061501f5761501f61589a565b6001600160a01b03909216602092830291909101909101525f615063307f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e8661235a565b60405163791ac94760e01b81526001600160a01b037f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e169063791ac947906150d7908790859087907f00000000000000000000000070cc2785ceba0e53f5510bce9b7fac3720c138de904290600401615c08565b5f604051808303815f87803b1580156150ee575f5ffd5b505af19250505080156150ff575060015b61511c576040516312577edd60e31b815260040160405180910390fd5b5f615151846001600160a01b037f00000000000000000000000070cc2785ceba0e53f5510bce9b7fac3720c138de1631615887565b905080156152585760405163093fa59760e11b8152600481018290527f00000000000000000000000070cc2785ceba0e53f5510bce9b7fac3720c138de6001600160a01b03169063127f4b2e906024015f604051808303815f87803b1580156151b8575f5ffd5b505af19250505080156151c9575060015b6151e6576040516312577edd60e31b815260040160405180910390fd5b5f866001600160a01b0316826040515f6040518083038185875af1925050503d805f811461522f576040519150601f19603f3d011682016040523d82523d5f602084013e615234565b606091505b5050905080615256576040516312577edd60e31b815260040160405180910390fd5b505b6007546001600160a01b03161580159061528b57506007546001600160a01b03165f908152600160205260409020548511155b156120eb576007546152a7906001600160a01b03165f87612ce1565b60075f9054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156152f3575f5ffd5b505af1158015615305573d5f5f3e3d5ffd5b50505050505050505050565b6028545f906127108110615328575f915050610e1b565b60405163d06ca61f60e01b81525f906001600160a01b037f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e169063d06ca61f9061537890889088906004016159f6565b5f60405180830381865afa9250505080156153b457506040513d5f823e601f3d908101601f191682016040526153b19190810190615a16565b60015b156153ec578051156153ea5780600182516153cf9190615887565b815181106153df576153df61589a565b602002602001015191505b505b805f036153fd575f92505050610e1b565b61271061540a8382615887565b615414908361581e565b610f3a9190615849565b6001600160a01b0383165f908152601160205260408120600581015482919060ff16615450575f5f92509250506155cb565b5f60646027548360010154615465919061581e565b61546f9190615849565b90508082600301541061549257615485876149bf565b5f5f9350935050506155cb565b5f8260030154826154a39190615887565b9050808611156154d35792508285156154ce57856154c1828961581e565b6154cb9190615849565b94505b6154da565b8593508694505b841561553f575f80805260016020525f516020615c6d5f395f51905f52549081900361550b575f95505f945061553d565b8581101561553d57805f86615520575f615535565b8761552b838961581e565b6155359190615849565b919750909550505b505b831561555e5783836003015f828254615558919061585c565b90915550505b84156155b35761556f5f8987612ce1565b876001600160a01b03167f7e7e460bf522c66a98f2b3abde08b8d3c81a9a06d2c774655260aeaa2e6c4ecc866040516155aa91815260200190565b60405180910390a25b818360030154106155c7576155c7886149bf565b5050505b935093915050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b038116811461115b575f5ffd5b5f5f6040838503121561562d575f5ffd5b823561563881615608565b946020939093013593505050565b5f60208284031215615656575f5ffd5b813561566181615608565b9392505050565b5f5f5f6060848603121561567a575f5ffd5b833561568581615608565b9250602084013561569581615608565b929592945050506040919091013590565b801515811461115b575f5ffd5b5f5f5f5f5f5f5f5f5f5f6101408b8d0312156156cd575f5ffd5b8a356156d881615608565b995060208b0135985060408b0135975060608b0135965060808b0135955060a08b0135945060c08b013561570b816156a6565b999c989b50969995989497939650939460e08101359450610100810135936101209091013592509050565b5f5f60408385031215615747575f5ffd5b823561575281615608565b91506020830135615762816156a6565b809150509250929050565b5f5f6040838503121561577e575f5ffd5b823561578981615608565b9150602083013561576281615608565b5f5f602083850312156157aa575f5ffd5b823567ffffffffffffffff8111156157c0575f5ffd5b8301601f810185136157d0575f5ffd5b803567ffffffffffffffff8111156157e6575f5ffd5b8560208260051b84010111156157fa575f5ffd5b6020919091019590945092505050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610e1b57610e1b61580a565b634e487b7160e01b5f52601260045260245ffd5b5f8261585757615857615835565b500490565b80820180821115610e1b57610e1b61580a565b5f600182016158805761588061580a565b5060010190565b81810381811115610e1b57610e1b61580a565b634e487b7160e01b5f52603260045260245ffd5b600181811c908216806158c257607f821691505b602082108103611a2857634e487b7160e01b5f52602260045260245ffd5b5f602082840312156158f0575f5ffd5b5051919050565b5f60208284031215615907575f5ffd5b815161566181615608565b5f5f5f5f5f5f5f5f5f6101208a8c03121561592b575f5ffd5b895160208b015160408c015160608d015160808e015160a08f0151949d50929b509099509750955061595c816156a6565b60c08b015160e08c0151610100909c01519a9d999c50979a9699959890979695945092505050565b5f60208284031215615994575f5ffd5b8151615661816156a6565b634e487b7160e01b5f52604160045260245ffd5b5f8151808452602084019350602083015f5b828110156159ec5781516001600160a01b03168652602095860195909101906001016159c5565b5093949350505050565b828152604060208201525f615a0e60408301846159b3565b949350505050565b5f60208284031215615a26575f5ffd5b815167ffffffffffffffff811115615a3c575f5ffd5b8201601f81018413615a4c575f5ffd5b805167ffffffffffffffff811115615a6657615a6661599f565b8060051b604051601f19603f830116810181811067ffffffffffffffff82111715615a9357615a9361599f565b604052918252602081840181019290810187841115615ab0575f5ffd5b6020850194505b83851015615ad357845180825260209586019590935001615ab7565b509695505050505050565b848152608060208201525f615af660808301866159b3565b6001600160a01b03949094166040830152506060015292915050565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b5f5f5f60608486031215615b5f575f5ffd5b5050815160208301516040909301519094929350919050565b5f82615b8657615b86615835565b500690565b5f82518060208501845e5f920191825250919050565b80516001600160701b0381168114615bb7575f5ffd5b919050565b5f5f5f60608486031215615bce575f5ffd5b615bd784615ba1565b9250615be560208501615ba1565b9150604084015163ffffffff81168114615bfd575f5ffd5b809150509250925092565b85815284602082015260a060408201525f615c2660a08301866159b3565b6001600160a01b0394909416606083015250608001529392505050565b5f81615c5157615c5161580a565b505f190190565b634e487b7160e01b5f52603160045260245ffdfea6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212209cf0512b182a13b5280561351578bdf41c8ff012fcbb7f6f014d08cd3041651464736f6c634300081f0033

Block Transaction Gas Used Reward
view all blocks produced
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
View All Validatorset

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.