false
true
0

Contract Address Details

0xe80dc71E93f9646376C00B9016F4a514b48b1c14

Token
Nemesis (NEMESIS)
Creator
0x0bac4f–db87bc at 0x051650–47d147
Balance
327.853681816756114393 PLS ( )
Tokens
Fetching tokens...
Transactions
47 Transactions
Transfers
682 Transfers
Gas Used
3,158,288
Last Balance Update
25910232
Contract is not verified. However, we found a verified contract with the same bytecode in Blockscout DB 0x549d5686a4d8bfa65aa644620db58db383c5a0cb.
All metadata displayed below is from that contract. In order to verify current contract, click Verify & Publish button
Verify & Publish
Contract name:
RewardToken




Optimization enabled
true
Compiler version
v0.8.21+commit.d9974bed




Optimization runs
200
Verified at
2024-06-04T04:48:41.178823Z

contracts/RewardToken.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.8.21;

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

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

interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event. C U ON THE Sunny side of the MOON
     */
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        if(currentAllowance != type(uint256).max) { 
            require(
                currentAllowance >= amount,
                "ERC20: transfer amount exceeds allowance"
            );
            unchecked {
                _approve(sender, _msgSender(), currentAllowance - amount);
            }
        }
        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        virtual
        returns (bool)
    {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

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

        uint256 senderBalance = _balances[sender];
        require(
            senderBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

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

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

    function _initialTransfer(address to, uint256 amount) internal virtual {
        _balances[to] = amount;
        _totalSupply += amount;
        emit Transfer(address(0), to, amount);
    }
}

contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

interface IDividendDistributor {
    function initialize() external;
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution, uint256 _claimAfter) external;
    function setShare(address shareholder, uint256 amount, bool exclude) external;
    function deposit() external payable;
    function claimDividend(address shareholder) external;
    function getUnpaidEarnings(address shareholder) external view returns (uint256);
    function getPaidDividends(address shareholder) external view returns (uint256);
    function getTotalPaid() external view returns (uint256);
    function getClaimTime(address shareholder) external view returns (uint256);
    function getTotalDividends() external view returns (uint256);
    function getTotalDistributed() external view returns (uint256);
    function countShareholders() external view returns (uint256);
    function migrate(address newDistributor) external;
    function process() external;
}

contract DividendDistributor is IDividendDistributor, Ownable {

    address public _token;
    IERC20 public immutable reward;
    address public immutable ETH;

    struct Share {
        uint256 amount;
        uint256 totalExcluded;
        uint256 totalRealised;
    }

    address[] public shareholders;
    mapping (address => uint256) public shareholderIndexes;
    mapping (address => uint256) public shareholderClaims;

    mapping (address => Share) public shares;

    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalDistributed;
    uint256 public unclaimed;
    uint256 public dividendsPerShare;
    uint256 public dividendsPerShareAccuracyFactor = 10 ** 36;

    uint256 public minPeriod = 30 seconds;
    uint256 public minDistribution = 1;
    uint256 public gas = 800000;
    uint256 public currentIndex;

    address constant routerAddress = 0x165C3410fC91EF562C50559f7d2289fEbed552d9;
    IDexRouter constant dexRouter = IDexRouter(routerAddress);
    uint256 public slippage = 98;

    bool public initialized;
    modifier initialization() {
        require(!initialized);
        _;
        initialized = true;
    }

    modifier onlyToken() {
        require(msg.sender == _token); _;
    }
    
    function getTotalDividends() external view override returns (uint256) {
        return totalDividends;
    }
    function getTotalDistributed() external view override returns (uint256) {
        return totalDistributed;
    }

    constructor (address rwd) {
        reward = IERC20(rwd);
        aprv();
        ETH = dexRouter.WPLS();
    }

    function aprv() public {
        reward.approve(routerAddress, type(uint256).max);
    }
    
    function initialize() external override initialization {
        _token = msg.sender;
    }
    
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution, uint256 _gas) external override onlyToken {
        minPeriod = _minPeriod;
        minDistribution = _minDistribution;
        gas = _gas;
    }

    function setShare(address shareholder, uint256 amount, bool exclude) external override onlyToken {
        uint256 currentShare = shares[shareholder].amount;
        if(amount > 0 && currentShare == 0){
            addShareholder(shareholder);
            shares[shareholder].totalExcluded = getCumulativeDividends(amount);
            shareholderClaims[shareholder] = block.timestamp;
        }else if(amount == 0 && currentShare > 0){
            removeShareholder(shareholder);
        }

        uint256 unpaid = getUnpaidEarnings(shareholder);
        if(currentShare > 0 && !exclude){
            if(unpaid > 0) {
                if(shouldDistribute(shareholder, unpaid)) {
                    distributeDividend(shareholder, unpaid);
                } else {
                    unclaimed += unpaid;
                }
            }
        }
        
        totalShares = (totalShares - currentShare) + amount;
        
        shares[shareholder].amount = amount;
        
        shares[shareholder].totalExcluded = getCumulativeDividends(amount);
    }

    function deposit() external payable override {
        uint256 amount;
        if(address(reward) != ETH) {
            address[] memory path = new address[](2);
            path[0] = dexRouter.WPLS();
            path[1] = address(reward);

            uint256 spend = address(this).balance;
            uint256[] memory amountsout = dexRouter.getAmountsOut(spend, path);

            uint256 curBal = reward.balanceOf(address(this));

            dexRouter.swapExactETHForTokens{value: spend}(
                amountsout[1] * slippage / 100,
                path,
                address(this),
                block.timestamp
            );

            amount = reward.balanceOf(address(this)) - curBal;
        } else {
            amount = msg.value;
        }
        totalDividends += amount;
        if(totalShares > 0)
            if(dividendsPerShare == 0)
                dividendsPerShare = (dividendsPerShareAccuracyFactor * totalDividends) / totalShares;
            else
                dividendsPerShare += ((dividendsPerShareAccuracyFactor * amount) / totalShares);
    }

    function extractUnclaimed() external onlyOwner {
        uint256 uncl = unclaimed;
        unclaimed = 0;
        reward.transfer(msg.sender, uncl);
    }

    function extractLostETH() external onlyOwner {
        bool success;
        (success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed");
    }

    function setSlippage(uint256 _slip) external onlyOwner {
        require(_slip <= 100, "Min slippage reached");
        require(_slip >= 50, "Probably too much slippage");
        slippage = _slip;
    }

    function migrate(address newDistributor) external onlyToken {
        DividendDistributor newD = DividendDistributor(newDistributor);
        require(!newD.initialized(), "Already initialized");
        bool success;
        (success, ) = newDistributor.call{value: address(this).balance}("");
        reward.transfer(newDistributor, reward.balanceOf(address(this)));
        require(success, "Transfer failed");
    }

    function shouldDistribute(address shareholder, uint256 unpaidEarnings) internal view returns (bool) {
       return shareholderClaims[shareholder] + minPeriod < block.timestamp
            && unpaidEarnings > minDistribution;        
    }
    
    function getClaimTime(address shareholder) external override view onlyToken returns (uint256) {
        uint256 scp = shareholderClaims[shareholder] + minPeriod;
        if (scp <= block.timestamp) {
            return 0;
        } else {
            return scp - block.timestamp;
        }
    }

    function distributeDividend(address shareholder, uint256 unpaidEarnings) internal {
        if(shares[shareholder].amount == 0){ return; }

        if(unpaidEarnings > 0){
            totalDistributed = totalDistributed + unpaidEarnings;
            shareholderClaims[shareholder] = block.timestamp;
            shares[shareholder].totalRealised += unpaidEarnings;
            shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
            if(address(reward) == ETH) {
                bool success;
                (success, ) = shareholder.call{value: unpaidEarnings}("");
            } else
                reward.transfer(shareholder, unpaidEarnings);
        }
    }

    function process() public override {
        uint256 shareholderCount = shareholders.length;

        if(shareholderCount == 0) { return; }

        uint256 gasUsed = 0;
        uint256 gasLeft = gasleft();

        uint256 iterations = 0;

        while(gasUsed < gas && iterations < shareholderCount) {
            if(currentIndex >= shareholderCount){
                currentIndex = 0;
            }
            
            uint256 unpaid = getUnpaidEarnings(shareholders[currentIndex]);
            if(shouldDistribute(shareholders[currentIndex], unpaid)){
                distributeDividend(shareholders[currentIndex], unpaid);
            }

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

    function claimDividend(address shareholder) external override onlyToken {
        uint256 unpaid = getUnpaidEarnings(shareholder);
        require(shouldDistribute(shareholder, unpaid), "Dividends not available yet");
        distributeDividend(shareholder, unpaid);
    }

    function processClaim(address shareholder) external onlyOwner {
        uint256 unpaid = getUnpaidEarnings(shareholder);
        require(shouldDistribute(shareholder, unpaid), "Dividends not available yet");
        distributeDividend(shareholder, unpaid);
    }

    function getUnpaidEarnings(address shareholder) public view override returns (uint256) {
        if(shares[shareholder].amount == 0){ return 0; }

        uint256 shareholderTotalDividends = getCumulativeDividends(shares[shareholder].amount);
        uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded;

        if(shareholderTotalDividends <= shareholderTotalExcluded){ return 0; }

        return shareholderTotalDividends - shareholderTotalExcluded;
    }
    
    function getPaidDividends(address shareholder) external view override onlyToken returns (uint256) {
        return shares[shareholder].totalRealised;
    }
    
    function getTotalPaid() external view override onlyToken returns (uint256) {
        return totalDistributed;
    }

    function getCumulativeDividends(uint256 share) internal view returns (uint256) {
        if(share == 0){ return 0; }
        return (share * dividendsPerShare) / dividendsPerShareAccuracyFactor;
    }

    function countShareholders() public view returns(uint256) {
        return shareholders.length;
    }

    function addShareholder(address shareholder) internal {
        shareholderIndexes[shareholder] = shareholders.length;
        shareholders.push(shareholder);
    }

    function removeShareholder(address shareholder) internal {
        shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length-1];
        shareholderIndexes[shareholders[shareholders.length-1]] = shareholderIndexes[shareholder];
        shareholders.pop();
    }
}

interface ILpPair {
    function sync() external;
}

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

    function WPLS() external pure returns (address);

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

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

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

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

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

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );
    
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

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

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

contract RewardToken is ERC20, Ownable {
    IDexRouter public immutable dexRouter;
    address public lpPair;

    mapping(address => uint256) public walletProtection;
    bool public protectionDisabled = false;

    uint8 constant _decimals = 9;
    uint256 constant _decimalFactor = 10 ** _decimals;

    bool private swapping;
    uint256 public swapTokensAtAmount;
    uint256 public maxSwapTokens;

    IDividendDistributor public distributor;
    address public taxCollector;
    uint256 public taxSplit = 100;
    bool public autoProcess = true;

    bool public swapEnabled = true;

    uint256 public tradingActiveTime;

    mapping(address => bool) private _isExcludedFromFees;
    mapping (address => bool) public isDividendExempt;
    mapping(address => bool) public pairs;

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

    constructor(string memory name, string memory ticker, uint256 supply, address reward) ERC20(name, ticker) {
        address routerAddress = 0x165C3410fC91EF562C50559f7d2289fEbed552d9;
        dexRouter = IDexRouter(routerAddress);

        _approve(msg.sender, routerAddress, type(uint256).max);
        _approve(address(this), routerAddress, type(uint256).max);

        uint256 totalSupply = supply * _decimalFactor;

        swapTokensAtAmount = (totalSupply * 1) / 1000000;
        maxSwapTokens = (totalSupply * 5) / 1000;

        excludeFromFees(msg.sender, true);
        excludeFromFees(address(this), true);

        isDividendExempt[routerAddress] = true;
        isDividendExempt[address(this)] = true;
        isDividendExempt[address(0xdead)] = true;

        _initialTransfer(msg.sender, totalSupply);

        DividendDistributor dist = new DividendDistributor(reward);
        setDistributor(address(dist), false);
    }

    receive() external payable {}

    function decimals() public pure override returns (uint8) {
        return 9;
    }

    function updateSwapTokens(uint256 atAmount, uint256 maxAmount) external onlyOwner {
        require(maxAmount <= (totalSupply() * 1) / 100, "Max swap cannot be higher than 1% supply.");
        swapTokensAtAmount = atAmount;
        maxSwapTokens = maxAmount;
    }

    function setTaxCollector(address wallet) external onlyOwner {
        taxCollector = wallet;
    }

    function toggleSwap() external onlyOwner {
        swapEnabled = !swapEnabled;
    }

    function toggleProcess() external onlyOwner {
        autoProcess = !autoProcess;
    }

    function setPair(address pair, bool value) external {
        require(pair != lpPair, "The pair cannot be removed from pairs");
        require(msg.sender == owner() || msg.sender == taxCollector, "Unauthorised");

        pairs[pair] = value;
        setDividendExempt(pair, true);
        emit SetPair(pair, value);
    }

    function getFees() public pure returns (uint256) {
        return 2;
    }

    function setSplit(uint256 _split) external onlyOwner {
        require (_split <= 100);
        taxSplit = _split;
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function setDividendExempt(address holder, bool exempt) public onlyOwner {
        isDividendExempt[holder] = exempt;
        if(exempt){
            distributor.setShare(holder, 0, true);
        }else{
            distributor.setShare(holder, balanceOf(holder), false);
        }
    }

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

        if(tradingActiveTime == 0) {
            require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading not yet active");
            super._transfer(from, to, amount);
        }
        else {
            if (!_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
                uint256 fees = 0;
                uint256 _f = getFees();

                fees = (amount * _f) / 100;
                
                if (fees > 0) {
                    super._transfer(from, address(this), fees);
                }

                if (swapEnabled && !swapping && pairs[to]) {
                    swapping = true;
                    swapBack(amount);
                    swapping = false;
                }

                amount -= fees;
            }

            super._transfer(from, to, amount);

            if(autoProcess){ try distributor.process() {} catch {} }
        }

        _beforeTokenTransfer(from, to);

        if(!isDividendExempt[from]){ try distributor.setShare(from, balanceOf(from), false) {} catch {} }
        if(!isDividendExempt[to]){ try distributor.setShare(to, balanceOf(to), false) {} catch {} }
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = dexRouter.WPLS();

        dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function swapBack(uint256 amount) private {
        uint256 amountToSwap = balanceOf(address(this));
        if (amountToSwap < swapTokensAtAmount) return;
        if (amountToSwap > maxSwapTokens) amountToSwap = maxSwapTokens;
        if (amountToSwap > amount) amountToSwap = amount;
        if (amountToSwap == 0) return;

        uint256 ethBalance = address(this).balance;

        swapTokensForEth(amountToSwap);

        uint256 generated = address(this).balance - ethBalance;

        if(generated > 0) {
            uint256 _split = taxSplit * generated / 100;
            if(_split > 0)
                try distributor.deposit{value: _split}() {} catch {}
            if(generated > _split){
                bool success;
                (success, ) = taxCollector.call{value: address(this).balance}("");
            }
        }
    }

    function withdrawTax() external {
        require(msg.sender == owner() || msg.sender == taxCollector, "Unauthorised");
        bool success;
        (success, ) = address(msg.sender).call{value: address(this).balance}("");
    }

    function launch() external onlyOwner {
        require(tradingActiveTime == 0);
        tradingActiveTime = block.number;
    }

    function setDistributor(address _distributor, bool migrate) public onlyOwner {
        if(migrate) 
            distributor.migrate(_distributor);

        distributor = IDividendDistributor(_distributor);
        distributor.initialize();
    }

    function claimDistributor(address _distributor) external onlyOwner {
        Ownable(_distributor).transferOwnership(msg.sender);
    }

    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution, uint256 _claimAfter) external onlyOwner {
        distributor.setDistributionCriteria(_minPeriod, _minDistribution, _claimAfter);
    }

    function manualDeposit() payable external {
        distributor.deposit{value: msg.value}();
    }

    function getPoolStatistics() external view returns (uint256 totalRewards, uint256 totalRewardsPaid, uint256 rewardHolders) {
        totalRewards = distributor.getTotalDividends();
        totalRewardsPaid = distributor.getTotalDistributed();
        rewardHolders = distributor.countShareholders();
    }
    
    function myStatistics(address wallet) external view returns (uint256 reward, uint256 rewardClaimed) {
        reward = distributor.getUnpaidEarnings(wallet);
        rewardClaimed = distributor.getPaidDividends(wallet);
    }
    
    function checkClaimTime(address wallet) external view returns (uint256) {
        return distributor.getClaimTime(wallet);
    }
    
    function claim() external {
        distributor.claimDividend(msg.sender);
    }

    function airdropToWallets(address[] memory wallets, uint256[] memory amountsInTokens, bool dividends) external onlyOwner {
        require(wallets.length == amountsInTokens.length, "Arrays must be the same length");

        for (uint256 i = 0; i < wallets.length; i++) {
            super._transfer(msg.sender, wallets[i], amountsInTokens[i] * _decimalFactor);
            if(dividends)
                distributor.setShare(wallets[i], amountsInTokens[i] * _decimalFactor, false);
        }
    }

    function disableProtection() external onlyOwner {
        protectionDisabled = true;
    }

    function transferProtection(address[] calldata _wallets, uint256 _enabled) external onlyOwner {
        if(_enabled > 0) require(!protectionDisabled, "Disabled");
        for(uint256 i = 0; i < _wallets.length; i++) {
            walletProtection[_wallets[i]] = _enabled;
        }
    }

    function _beforeTokenTransfer(address from, address to) internal view {
        require(walletProtection[from] == 0 || to == owner(), "Wallet protection enabled, please contact support");
    }
}
        

Compiler Settings

{"remappings":[],"optimizer":{"runs":200,"enabled":true},"metadata":{"useLiteralContent":true,"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"paris","compilationTarget":{"contracts/RewardToken.sol":"RewardToken"}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"string","name":"name","internalType":"string"},{"type":"string","name":"ticker","internalType":"string"},{"type":"uint256","name":"supply","internalType":"uint256"},{"type":"address","name":"reward","internalType":"address"}]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ExcludeFromFees","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"bool","name":"isExcluded","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"SetPair","inputs":[{"type":"address","name":"pair","internalType":"address","indexed":true},{"type":"bool","name":"value","internalType":"bool","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"airdropToWallets","inputs":[{"type":"address[]","name":"wallets","internalType":"address[]"},{"type":"uint256[]","name":"amountsInTokens","internalType":"uint256[]"},{"type":"bool","name":"dividends","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"autoProcess","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"checkClaimTime","inputs":[{"type":"address","name":"wallet","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claim","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimDistributor","inputs":[{"type":"address","name":"_distributor","internalType":"address"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IDexRouter"}],"name":"dexRouter","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"disableProtection","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IDividendDistributor"}],"name":"distributor","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromFees","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"bool","name":"excluded","internalType":"bool"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getFees","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"totalRewards","internalType":"uint256"},{"type":"uint256","name":"totalRewardsPaid","internalType":"uint256"},{"type":"uint256","name":"rewardHolders","internalType":"uint256"}],"name":"getPoolStatistics","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isDividendExempt","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"launch","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"lpPair","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"manualDeposit","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxSwapTokens","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"reward","internalType":"uint256"},{"type":"uint256","name":"rewardClaimed","internalType":"uint256"}],"name":"myStatistics","inputs":[{"type":"address","name":"wallet","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"pairs","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"protectionDisabled","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributionCriteria","inputs":[{"type":"uint256","name":"_minPeriod","internalType":"uint256"},{"type":"uint256","name":"_minDistribution","internalType":"uint256"},{"type":"uint256","name":"_claimAfter","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributor","inputs":[{"type":"address","name":"_distributor","internalType":"address"},{"type":"bool","name":"migrate","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDividendExempt","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"exempt","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPair","inputs":[{"type":"address","name":"pair","internalType":"address"},{"type":"bool","name":"value","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSplit","inputs":[{"type":"uint256","name":"_split","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTaxCollector","inputs":[{"type":"address","name":"wallet","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"swapEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapTokensAtAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"taxCollector","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"taxSplit","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"toggleProcess","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"toggleSwap","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tradingActiveTime","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferProtection","inputs":[{"type":"address[]","name":"_wallets","internalType":"address[]"},{"type":"uint256","name":"_enabled","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateSwapTokens","inputs":[{"type":"uint256","name":"atAmount","internalType":"uint256"},{"type":"uint256","name":"maxAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"walletProtection","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawTax","inputs":[]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

Verify & Publish
0x60a06040526008805460ff191690556064600d55600e805461ffff19166101011790553480156200002f57600080fd5b50604051620057093803806200570983398101604081905262000052916200069e565b83836003620000628382620007be565b506004620000718282620007be565b5050506000620000866200025160201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35073165c3410fc91ef562c50559f7d2289febed552d96080819052620000fd338260001962000255565b6200010c308260001962000255565b60006200011c6009600a6200099f565b620001289085620009b7565b9050620f42406200013b826001620009b7565b620001479190620009d1565b6009556103e86200015a826005620009b7565b620001669190620009d1565b600a556200017633600162000381565b6200018330600162000381565b6001600160a01b0382166000908152601160205260408082208054600160ff199182168117909255308452918320805483168217905561dead9092527f97847ee99463795296047093514439c3127772df3715e628aa85601cf854171680549091169091179055620001f633826200042b565b6000836040516200020790620005cb565b6001600160a01b039091168152602001604051809103906000f08015801562000234573d6000803e3d6000fd5b50905062000244816000620004a4565b5050505050505062000a0a565b3390565b6001600160a01b038316620002bd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b038216620003205760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401620002b4565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b03163314620003cc5760405162461bcd60e51b81526020600482018190526024820152600080516020620056e98339815191526044820152606401620002b4565b6001600160a01b038216600081815260106020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b0382166000908152602081905260408120829055600280548392906200045a908490620009f4565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6005546001600160a01b03163314620004ef5760405162461bcd60e51b81526020600482018190526024820152600080516020620056e98339815191526044820152606401620002b4565b80156200055857600b5460405163ce5494bb60e01b81526001600160a01b0384811660048301529091169063ce5494bb90602401600060405180830381600087803b1580156200053e57600080fd5b505af115801562000553573d6000803e3d6000fd5b505050505b600b80546001600160a01b0319166001600160a01b0384169081179091556040805163204a7f0760e21b81529051638129fc1c9160048082019260009290919082900301818387803b158015620005ae57600080fd5b505af1158015620005c3573d6000803e3d6000fd5b505050505050565b61214180620035a883390190565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200060157600080fd5b81516001600160401b03808211156200061e576200061e620005d9565b604051601f8301601f19908116603f01168101908282118183101715620006495762000649620005d9565b816040528381526020925086838588010111156200066657600080fd5b600091505b838210156200068a57858201830151818301840152908201906200066b565b600093810190920192909252949350505050565b60008060008060808587031215620006b557600080fd5b84516001600160401b0380821115620006cd57600080fd5b620006db88838901620005ef565b95506020870151915080821115620006f257600080fd5b506200070187828801620005ef565b60408701516060880151919550935090506001600160a01b03811681146200072857600080fd5b939692955090935050565b600181811c908216806200074857607f821691505b6020821081036200076957634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620007b957600081815260208120601f850160051c81016020861015620007985750805b601f850160051c820191505b81811015620005c357828155600101620007a4565b505050565b81516001600160401b03811115620007da57620007da620005d9565b620007f281620007eb845462000733565b846200076f565b602080601f8311600181146200082a5760008415620008115750858301515b600019600386901b1c1916600185901b178555620005c3565b600085815260208120601f198616915b828110156200085b578886015182559484019460019091019084016200083a565b50858210156200087a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620008e1578160001904821115620008c557620008c56200088a565b80851615620008d357918102915b93841c9390800290620008a5565b509250929050565b600082620008fa5750600162000999565b81620009095750600062000999565b81600181146200092257600281146200092d576200094d565b600191505062000999565b60ff8411156200094157620009416200088a565b50506001821b62000999565b5060208310610133831016604e8410600b841016171562000972575081810a62000999565b6200097e8383620008a0565b80600019048211156200099557620009956200088a565b0290505b92915050565b6000620009b060ff841683620008e9565b9392505050565b80820281158282048414176200099957620009996200088a565b600082620009ef57634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156200099957620009996200088a565b608051612b7462000a346000396000818161032d015281816122ea01526123a20152612b746000f3fe6080604052600436106102cd5760003560e01c80636ab86dc111610175578063ba3194ed116100dc578063d59ba0df11610095578063dfa20f0a1161006f578063dfa20f0a146108bd578063e2f45605146108d2578063f2fde38b146108e8578063fe33b3021461090857600080fd5b8063d59ba0df14610843578063db8d55f114610863578063dd62ed3e1461087757600080fd5b8063ba3194ed1461077f578063bea1dcf8146107af578063bfe10928146107cf578063c0246668146107ef578063c3615cba1461080f578063c5363caa1461082957600080fd5b806395d89b411161012e57806395d89b41146106b5578063a457c2d7146106ca578063a9059cbb146106ea578063aceac8561461070a578063ada2eb481461073f578063b572fe341461075f57600080fd5b80636ab86dc1146106055780636ddd17131461060d57806370a082311461062c578063715018a61461066257806386a22eff146106775780638da5cb5b1461069757600080fd5b8063313ce56711610234578063452ed4f1116101ed5780635031595f116101c75780635031595f14610582578063535a2437146105985780635c5d3412146105c5578063674e694f146105e557600080fd5b8063452ed4f11461052d5780634e71d92d1461054d5780634fc2d8a31461056257600080fd5b8063313ce5671461047657806336a1efe41461049257806339509351146104a8578063421dd7c7146104c857806342902a84146104dd5780634355855a146104fd57600080fd5b80630ca61cb1116102865780630ca61cb1146103d75780631317821d146103f757806318160ddd1461040c5780631983f5991461042b5780631ff8d5071461044157806323b872dd1461045657600080fd5b806301339c21146102d957806306fdde03146102f05780630758d9241461031b57806308695b4114610367578063095ea7b3146103875780630bf1deff146103b757600080fd5b366102d457005b600080fd5b3480156102e557600080fd5b506102ee610938565b005b3480156102fc57600080fd5b5061030561097e565b60405161031291906123e2565b60405180910390f35b34801561032757600080fd5b5061034f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610312565b34801561037357600080fd5b506102ee610382366004612448565b610a10565b34801561039357600080fd5b506103a76103a236600461246c565b610a5c565b6040519015158152602001610312565b3480156103c357600080fd5b506102ee6103d2366004612498565b610a73565b3480156103e357600080fd5b506102ee6103f2366004612513565b610b4a565b34801561040357600080fd5b506102ee610be5565b34801561041857600080fd5b506002545b604051908152602001610312565b34801561043757600080fd5b5061041d600d5481565b34801561044d57600080fd5b506102ee610c23565b34801561046257600080fd5b506103a761047136600461253f565b610c6a565b34801561048257600080fd5b5060405160098152602001610312565b34801561049e57600080fd5b5061041d600a5481565b3480156104b457600080fd5b506103a76104c336600461246c565b610d1d565b3480156104d457600080fd5b506102ee610d59565b3480156104e957600080fd5b5061041d6104f8366004612448565b610d92565b34801561050957600080fd5b506103a7610518366004612448565b60116020526000908152604090205460ff1681565b34801561053957600080fd5b5060065461034f906001600160a01b031681565b34801561055957600080fd5b506102ee610e01565b34801561056e57600080fd5b506102ee61057d366004612448565b610e5a565b34801561058e57600080fd5b5061041d600f5481565b3480156105a457600080fd5b5061041d6105b3366004612448565b60076020526000908152604090205481565b3480156105d157600080fd5b506102ee6105e0366004612580565b610ee0565b3480156105f157600080fd5b506102ee6106003660046125a2565b610f96565b6102ee610fd3565b34801561061957600080fd5b50600e546103a790610100900460ff1681565b34801561063857600080fd5b5061041d610647366004612448565b6001600160a01b031660009081526020819052604090205490565b34801561066e57600080fd5b506102ee611023565b34801561068357600080fd5b506102ee6106923660046125d0565b611097565b3480156106a357600080fd5b506005546001600160a01b031661034f565b3480156106c157600080fd5b506103056111cc565b3480156106d657600080fd5b506103a76106e536600461246c565b6111db565b3480156106f657600080fd5b506103a761070536600461246c565b611274565b34801561071657600080fd5b5061072a610725366004612448565b611281565b60408051928352602083019190915201610312565b34801561074b57600080fd5b506102ee61075a3660046126db565b61136a565b34801561076b57600080fd5b506102ee61077a3660046125d0565b611514565b34801561078b57600080fd5b5061079461162c565b60408051938452602084019290925290820152606001610312565b3480156107bb57600080fd5b50600c5461034f906001600160a01b031681565b3480156107db57600080fd5b50600b5461034f906001600160a01b031681565b3480156107fb57600080fd5b506102ee61080a3660046125d0565b6117a1565b34801561081b57600080fd5b50600e546103a79060ff1681565b34801561083557600080fd5b506008546103a79060ff1681565b34801561084f57600080fd5b506102ee61085e3660046125d0565b61182a565b34801561086f57600080fd5b50600261041d565b34801561088357600080fd5b5061041d6108923660046127ad565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156108c957600080fd5b506102ee61190f565b3480156108de57600080fd5b5061041d60095481565b3480156108f457600080fd5b506102ee610903366004612448565b6119af565b34801561091457600080fd5b506103a7610923366004612448565b60126020526000908152604090205460ff1681565b6005546001600160a01b0316331461096b5760405162461bcd60e51b8152600401610962906127e6565b60405180910390fd5b600f541561097857600080fd5b43600f55565b60606003805461098d9061281b565b80601f01602080910402602001604051908101604052809291908181526020018280546109b99061281b565b8015610a065780601f106109db57610100808354040283529160200191610a06565b820191906000526020600020905b8154815290600101906020018083116109e957829003601f168201915b5050505050905090565b6005546001600160a01b03163314610a3a5760405162461bcd60e51b8152600401610962906127e6565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6000610a69338484611a9a565b5060015b92915050565b6005546001600160a01b03163314610a9d5760405162461bcd60e51b8152600401610962906127e6565b8015610ae15760085460ff1615610ae15760405162461bcd60e51b8152602060048201526008602482015267111a5cd8589b195960c21b6044820152606401610962565b60005b82811015610b44578160076000868685818110610b0357610b03612855565b9050602002016020810190610b189190612448565b6001600160a01b0316815260208101919091526040016000205580610b3c81612881565b915050610ae4565b50505050565b6005546001600160a01b03163314610b745760405162461bcd60e51b8152600401610962906127e6565b600b54604051630ca61cb160e01b81526004810185905260248101849052604481018390526001600160a01b0390911690630ca61cb190606401600060405180830381600087803b158015610bc857600080fd5b505af1158015610bdc573d6000803e3d6000fd5b50505050505050565b6005546001600160a01b03163314610c0f5760405162461bcd60e51b8152600401610962906127e6565b600e805460ff19811660ff90911615179055565b6005546001600160a01b03163314610c4d5760405162461bcd60e51b8152600401610962906127e6565b600e805461ff001981166101009182900460ff1615909102179055565b6000610c77848484611bbe565b6001600160a01b03841660009081526001602090815260408083203384529091529020546000198114610d125782811015610d055760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610962565b610d128533858403611a9a565b506001949350505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610a69918590610d5490869061289a565b611a9a565b6005546001600160a01b03163314610d835760405162461bcd60e51b8152600401610962906127e6565b6008805460ff19166001179055565b600b54604051630994fc3160e11b81526001600160a01b0383811660048301526000921690631329f86290602401602060405180830381865afa158015610ddd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6d91906128ad565b600b54604051630afbf02f60e11b81523360048201526001600160a01b03909116906315f7e05e90602401600060405180830381600087803b158015610e4657600080fd5b505af1158015610b44573d6000803e3d6000fd5b6005546001600160a01b03163314610e845760405162461bcd60e51b8152600401610962906127e6565b60405163f2fde38b60e01b81523360048201526001600160a01b0382169063f2fde38b90602401600060405180830381600087803b158015610ec557600080fd5b505af1158015610ed9573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03163314610f0a5760405162461bcd60e51b8152600401610962906127e6565b6064610f1560025490565b610f209060016128c6565b610f2a91906128dd565b811115610f8b5760405162461bcd60e51b815260206004820152602960248201527f4d617820737761702063616e6e6f7420626520686967686572207468616e2031604482015268129039bab838363c9760b91b6064820152608401610962565b600991909155600a55565b6005546001600160a01b03163314610fc05760405162461bcd60e51b8152600401610962906127e6565b6064811115610fce57600080fd5b600d55565b600b60009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610ec557600080fd5b6005546001600160a01b0316331461104d5760405162461bcd60e51b8152600401610962906127e6565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6006546001600160a01b03908116908316036111035760405162461bcd60e51b815260206004820152602560248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d20604482015264706169727360d81b6064820152608401610962565b6005546001600160a01b03163314806111265750600c546001600160a01b031633145b6111615760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5cd95960a21b6044820152606401610962565b6001600160a01b0382166000908152601260205260409020805460ff1916821515179055611190826001611514565b604051811515906001600160a01b038416907ff40a563af144a84735f7f6c7c3029794b0ac17713e5f048d3fd00ed85aa4ca7a90600090a35050565b60606004805461098d9061281b565b3360009081526001602090815260408083206001600160a01b03861684529091528120548281101561125d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610962565b61126a3385858403611a9a565b5060019392505050565b6000610a69338484611bbe565b600b5460405163051fa63360e31b81526001600160a01b03838116600483015260009283929116906328fd319890602401602060405180830381865afa1580156112cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f391906128ad565b600b54604051633cbf8a6160e01b81526001600160a01b038681166004830152929450911690633cbf8a6190602401602060405180830381865afa15801561133f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136391906128ad565b9050915091565b6005546001600160a01b031633146113945760405162461bcd60e51b8152600401610962906127e6565b81518351146113e55760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610962565b60005b8351811015610b44576114463385838151811061140757611407612855565b60200260200101516009600a61141d91906129e3565b86858151811061142f5761142f612855565b602002602001015161144191906128c6565b611f57565b811561150257600b5484516001600160a01b03909116906329cc05cf9086908490811061147557611475612855565b60200260200101516009600a61148b91906129e3565b86858151811061149d5761149d612855565b60200260200101516114af91906128c6565b60006040518463ffffffff1660e01b81526004016114cf939291906129f2565b600060405180830381600087803b1580156114e957600080fd5b505af11580156114fd573d6000803e3d6000fd5b505050505b8061150c81612881565b9150506113e8565b6005546001600160a01b0316331461153e5760405162461bcd60e51b8152600401610962906127e6565b6001600160a01b0382166000908152601160205260409020805460ff191682158015919091179091556115d757600b546040516329cc05cf60e01b81526001600160a01b03909116906329cc05cf906115a19085906000906001906004016129f2565b600060405180830381600087803b1580156115bb57600080fd5b505af11580156115cf573d6000803e3d6000fd5b505050505050565b600b546001600160a01b03166329cc05cf83611608816001600160a01b031660009081526020819052604090205490565b60006040518463ffffffff1660e01b81526004016115a1939291906129f2565b5050565b6000806000600b60009054906101000a90046001600160a01b03166001600160a01b03166367ee5f096040518163ffffffff1660e01b8152600401602060405180830381865afa158015611684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a891906128ad565b9250600b60009054906101000a90046001600160a01b03166001600160a01b0316635695fa586040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172191906128ad565b9150600b60009054906101000a90046001600160a01b03166001600160a01b0316639df62df26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611776573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179a91906128ad565b9050909192565b6005546001600160a01b031633146117cb5760405162461bcd60e51b8152600401610962906127e6565b6001600160a01b038216600081815260106020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146118545760405162461bcd60e51b8152600401610962906127e6565b80156118ba57600b5460405163ce5494bb60e01b81526001600160a01b0384811660048301529091169063ce5494bb90602401600060405180830381600087803b1580156118a157600080fd5b505af11580156118b5573d6000803e3d6000fd5b505050505b600b80546001600160a01b0319166001600160a01b0384169081179091556040805163204a7f0760e21b81529051638129fc1c9160048082019260009290919082900301818387803b1580156115bb57600080fd5b6005546001600160a01b03163314806119325750600c546001600160a01b031633145b61196d5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5cd95960a21b6044820152606401610962565b604051600090339047908381818185875af1925050503d8060008114610b44576040519150601f19603f3d011682016040523d82523d6000602084013e610b44565b6005546001600160a01b031633146119d95760405162461bcd60e51b8152600401610962906127e6565b6001600160a01b038116611a3e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610962565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611afc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610962565b6001600160a01b038216611b5d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610962565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611be45760405162461bcd60e51b815260040161096290612a15565b6001600160a01b038216611c0a5760405162461bcd60e51b815260040161096290612a5a565b600f54600003611ca8576001600160a01b03831660009081526010602052604090205460ff1680611c5357506001600160a01b03821660009081526010602052604090205460ff165b611c985760405162461bcd60e51b815260206004820152601660248201527554726164696e67206e6f74207965742061637469766560501b6044820152606401610962565b611ca3838383611f57565b611e10565b6001600160a01b03831660009081526010602052604090205460ff16158015611cea57506001600160a01b03821660009081526010602052604090205460ff16155b15611d9757600060026064611cff82856128c6565b611d0991906128dd565b91508115611d1c57611d1c853084611f57565b600e54610100900460ff168015611d3b5750600854610100900460ff16155b8015611d5f57506001600160a01b03841660009081526012602052604090205460ff165b15611d88576008805461ff001916610100179055611d7c836120ac565b6008805461ff00191690555b611d928284612a9d565b925050505b611da2838383611f57565b600e5460ff1615611e1057600b60009054906101000a90046001600160a01b03166001600160a01b031663c33fb8776040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611dfd57600080fd5b505af1925050508015611e0e575060015b505b611e1a83836121fb565b6001600160a01b03831660009081526011602052604090205460ff16611eb857600b546001600160a01b03166329cc05cf84611e6b816001600160a01b031660009081526020819052604090205490565b60006040518463ffffffff1660e01b8152600401611e8b939291906129f2565b600060405180830381600087803b158015611ea557600080fd5b505af1925050508015611eb6575060015b505b6001600160a01b03821660009081526011602052604090205460ff16611f5257600b546001600160a01b03166329cc05cf83611f09816001600160a01b031660009081526020819052604090205490565b60006040518463ffffffff1660e01b8152600401611f29939291906129f2565b600060405180830381600087803b158015611f4357600080fd5b505af1925050508015610b4457505b505050565b6001600160a01b038316611f7d5760405162461bcd60e51b815260040161096290612a15565b6001600160a01b038216611fa35760405162461bcd60e51b815260040161096290612a5a565b6001600160a01b0383166000908152602081905260409020548181101561201b5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610962565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061205290849061289a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161209e91815260200190565b60405180910390a350505050565b306000908152602081905260409020546009548110156120ca575050565b600a548111156120d95750600a545b818111156120e45750805b806000036120f0575050565b476120fa82612293565b60006121068247612a9d565b90508015610b44576000606482600d5461212091906128c6565b61212a91906128dd565b9050801561219657600b60009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561218257600080fd5b505af193505050508015612194575060015b505b80821115610ed957600c546040516000916001600160a01b03169047908381818185875af1925050503d80600081146121eb576040519150601f19603f3d011682016040523d82523d6000602084013e6121f0565b606091505b505050505050505050565b6001600160a01b038216600090815260076020526040902054158061222d57506005546001600160a01b038281169116145b6116285760405162461bcd60e51b815260206004820152603160248201527f57616c6c65742070726f74656374696f6e20656e61626c65642c20706c656173604482015270194818dbdb9d1858dd081cdd5c1c1bdc9d607a1b6064820152608401610962565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106122c8576122c8612855565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ef8ef56f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612346573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236a9190612ab0565b8160018151811061237d5761237d612855565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063791ac947906115a1908590600090869030904290600401612acd565b600060208083528351808285015260005b8181101561240f578581018301518582016040015282016123f3565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461244557600080fd5b50565b60006020828403121561245a57600080fd5b813561246581612430565b9392505050565b6000806040838503121561247f57600080fd5b823561248a81612430565b946020939093013593505050565b6000806000604084860312156124ad57600080fd5b833567ffffffffffffffff808211156124c557600080fd5b818601915086601f8301126124d957600080fd5b8135818111156124e857600080fd5b8760208260051b85010111156124fd57600080fd5b6020928301989097509590910135949350505050565b60008060006060848603121561252857600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561255457600080fd5b833561255f81612430565b9250602084013561256f81612430565b929592945050506040919091013590565b6000806040838503121561259357600080fd5b50508035926020909101359150565b6000602082840312156125b457600080fd5b5035919050565b803580151581146125cb57600080fd5b919050565b600080604083850312156125e357600080fd5b82356125ee81612430565b91506125fc602084016125bb565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561264457612644612605565b604052919050565b600067ffffffffffffffff82111561266657612666612605565b5060051b60200190565b600082601f83011261268157600080fd5b813560206126966126918361264c565b61261b565b82815260059290921b840181019181810190868411156126b557600080fd5b8286015b848110156126d057803583529183019183016126b9565b509695505050505050565b6000806000606084860312156126f057600080fd5b833567ffffffffffffffff8082111561270857600080fd5b818601915086601f83011261271c57600080fd5b8135602061272c6126918361264c565b82815260059290921b8401810191818101908a84111561274b57600080fd5b948201945b8386101561277257853561276381612430565b82529482019490820190612750565b9750508701359250508082111561278857600080fd5b5061279586828701612670565b9250506127a4604085016125bb565b90509250925092565b600080604083850312156127c057600080fd5b82356127cb81612430565b915060208301356127db81612430565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061282f57607f821691505b60208210810361284f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016128935761289361286b565b5060010190565b80820180821115610a6d57610a6d61286b565b6000602082840312156128bf57600080fd5b5051919050565b8082028115828204841417610a6d57610a6d61286b565b6000826128fa57634e487b7160e01b600052601260045260246000fd5b500490565b600181815b8085111561293a5781600019048211156129205761292061286b565b8085161561292d57918102915b93841c9390800290612904565b509250929050565b60008261295157506001610a6d565b8161295e57506000610a6d565b8160018114612974576002811461297e5761299a565b6001915050610a6d565b60ff84111561298f5761298f61286b565b50506001821b610a6d565b5060208310610133831016604e8410600b84101617156129bd575081810a610a6d565b6129c783836128ff565b80600019048211156129db576129db61286b565b029392505050565b600061246560ff841683612942565b6001600160a01b0393909316835260208301919091521515604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610a6d57610a6d61286b565b600060208284031215612ac257600080fd5b815161246581612430565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612b1d5784516001600160a01b031683529383019391830191600101612af8565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220839947ae601703ddcce1de9760e74af0a6cc4b5ffedaf8416e0be1cb3a10271364736f6c6343000815003360c06040526ec097ce7bc90715b34b9f1000000000600b55601e600c556001600d55620c3500600e5560626010553480156200003a57600080fd5b5060405162002141380380620021418339810160408190526200005d91620001d1565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160a01b038116608052620000b562000141565b73165c3410fc91ef562c50559f7d2289febed552d96001600160a01b031663ef8ef56f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000108573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200012e9190620001d1565b6001600160a01b031660a0525062000227565b60805160405163095ea7b360e01b815273165c3410fc91ef562c50559f7d2289febed552d9600482015260001960248201526001600160a01b039091169063095ea7b3906044016020604051808303816000875af1158015620001a8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ce919062000203565b50565b600060208284031215620001e457600080fd5b81516001600160a01b0381168114620001fc57600080fd5b9392505050565b6000602082840312156200021657600080fd5b81518015158114620001fc57600080fd5b60805160a051611ea76200029a600039600081816104ed01528181610fef015261188801526000818161031201528181610b0201528181610eba0152818161101901528181611112015281816112020152818161134801528181611717015281816118ab01526119540152611ea76000f3fe6080604052600436106102465760003560e01c8063715018a611610139578063d0e30db0116100b6578063ecd0c0c31161007a578063ecd0c0c314610684578063efca2eed146106a4578063f0fa55a9146106ba578063f2fde38b146106da578063f7bf3f31146106fa578063ffd49c841461070f57600080fd5b8063d0e30db014610604578063d4fda1f21461060c578063dabae90b14610639578063e2d2e21914610659578063e5e1d9491461066f57600080fd5b80639df62df2116100fd5780639df62df214610543578063ab377daa14610558578063c33fb87714610578578063ce5494bb1461058d578063ce7c2ac2146105ad57600080fd5b8063715018a6146104b15780638129fc1c146104c65780638322fff2146104db5780638da5cb5b1461050f578063997664d71461052d57600080fd5b80633cbf8a61116101c757806366817df51161018b57806366817df51461042e578063669416b81461045b5780636793141f1461047157806367ee5f09146104865780636ca7c2161461049b57600080fd5b80633cbf8a61146103b85780633e032a3b146103d85780634fab0ae8146103ee5780635695fa5814610404578063636b82891461041957600080fd5b8063228cb7331161020e578063228cb7331461030057806326987b601461034c57806328fd31981461036257806329cc05cf146103825780633a98ef39146103a257600080fd5b80630ca61cb11461024b57806311ce023d1461026d5780631329f86214610296578063158ef93e146102b657806315f7e05e146102e0575b600080fd5b34801561025757600080fd5b5061026b610266366004611b02565b610725565b005b34801561027957600080fd5b50610283600b5481565b6040519081526020015b60405180910390f35b3480156102a257600080fd5b506102836102b1366004611b43565b61074a565b3480156102c257600080fd5b506011546102d09060ff1681565b604051901515815260200161028d565b3480156102ec57600080fd5b5061026b6102fb366004611b43565b6107ae565b34801561030c57600080fd5b506103347f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161028d565b34801561035857600080fd5b50610283600f5481565b34801561036e57600080fd5b5061028361037d366004611b43565b61083b565b34801561038e57600080fd5b5061026b61039d366004611b6e565b6108c6565b3480156103ae57600080fd5b5061028360065481565b3480156103c457600080fd5b506102836103d3366004611b43565b610a7a565b3480156103e457600080fd5b5061028360105481565b3480156103fa57600080fd5b50610283600d5481565b34801561041057600080fd5b50600854610283565b34801561042557600080fd5b5061026b610ab3565b34801561043a57600080fd5b50610283610449366004611b43565b60046020526000908152604090205481565b34801561046757600080fd5b5061028360095481565b34801561047d57600080fd5b50610283610b77565b34801561049257600080fd5b50600754610283565b3480156104a757600080fd5b50610283600e5481565b3480156104bd57600080fd5b5061026b610b98565b3480156104d257600080fd5b5061026b610c0c565b3480156104e757600080fd5b506103347f000000000000000000000000000000000000000000000000000000000000000081565b34801561051b57600080fd5b506000546001600160a01b0316610334565b34801561053957600080fd5b5061028360075481565b34801561054f57600080fd5b50600254610283565b34801561056457600080fd5b50610334610573366004611bb0565b610c3d565b34801561058457600080fd5b5061026b610c67565b34801561059957600080fd5b5061026b6105a8366004611b43565b610d8d565b3480156105b957600080fd5b506105e96105c8366004611b43565b60056020526000908152604090208054600182015460029092015490919083565b6040805193845260208401929092529082015260600161028d565b61026b610feb565b34801561061857600080fd5b50610283610627366004611b43565b60036020526000908152604090205481565b34801561064557600080fd5b5061026b610654366004611b43565b611454565b34801561066557600080fd5b50610283600a5481565b34801561067b57600080fd5b5061026b61147e565b34801561069057600080fd5b50600154610334906001600160a01b031681565b3480156106b057600080fd5b5061028360085481565b3480156106c657600080fd5b5061026b6106d5366004611bb0565b611534565b3480156106e657600080fd5b5061026b6106f5366004611b43565b6115fc565b34801561070657600080fd5b5061026b6116e6565b34801561071b57600080fd5b50610283600c5481565b6001546001600160a01b0316331461073c57600080fd5b600c92909255600d55600e55565b6001546000906001600160a01b0316331461076457600080fd5b600c546001600160a01b038316600090815260046020526040812054909161078b91611bdf565b905042811161079d5750600092915050565b6107a74282611bf2565b9392505050565b6001546001600160a01b031633146107c557600080fd5b60006107d08261083b565b90506107dc828261178c565b61082d5760405162461bcd60e51b815260206004820152601b60248201527f4469766964656e6473206e6f7420617661696c61626c6520796574000000000060448201526064015b60405180910390fd5b61083782826117cd565b5050565b6001600160a01b038116600090815260056020526040812054810361086257506000919050565b6001600160a01b038216600090815260056020526040812054610884906119c1565b6001600160a01b0384166000908152600560205260409020600101549091508082116108b4575060009392505050565b6108be8183611bf2565b949350505050565b6001546001600160a01b031633146108dd57600080fd5b6001600160a01b0383166000908152600560205260409020548215801590610903575080155b1561099c57600280546001600160a01b0386166000818152600360205260408120839055600183018455929092527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b031916909117905561096d836119c1565b6001600160a01b03851660009081526005602090815260408083206001019390935560049052204290556109b8565b821580156109aa5750600081115b156109b8576109b8846119ed565b60006109c38561083b565b90506000821180156109d3575082155b15610a14578015610a14576109e8858261178c565b156109fc576109f785826117cd565b610a14565b8060096000828254610a0e9190611bdf565b90915550505b8382600654610a239190611bf2565b610a2d9190611bdf565b6006556001600160a01b0385166000908152600560205260409020849055610a54846119c1565b6001600160a01b0390951660009081526005602052604090206001019490945550505050565b6001546000906001600160a01b03163314610a9457600080fd5b506001600160a01b031660009081526005602052604090206002015490565b6000546001600160a01b03163314610add5760405162461bcd60e51b815260040161082490611c05565b60098054600090915560405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610b53573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108379190611c3a565b6001546000906001600160a01b03163314610b9157600080fd5b5060085490565b6000546001600160a01b03163314610bc25760405162461bcd60e51b815260040161082490611c05565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60115460ff1615610c1c57600080fd5b600180546001600160a01b031916331781556011805460ff19169091179055565b60028181548110610c4d57600080fd5b6000918252602090912001546001600160a01b0316905081565b6002546000819003610c765750565b6000805a905060005b600e5483108015610c8f57508381105b15610d875783600f5410610ca3576000600f555b6000610cd76002600f5481548110610cbd57610cbd611c57565b6000918252602090912001546001600160a01b031661083b565b9050610d0c6002600f5481548110610cf157610cf1611c57565b6000918252602090912001546001600160a01b03168261178c565b15610d4457610d446002600f5481548110610d2957610d29611c57565b6000918252602090912001546001600160a01b0316826117cd565b5a610d4f9084611bf2565b610d599085611bdf565b93505a600f80549194506000610d6e83611c6d565b91905055508180610d7e90611c6d565b92505050610c7f565b50505050565b6001546001600160a01b03163314610da457600080fd5b6000819050806001600160a01b031663158ef93e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610de7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0b9190611c3a565b15610e4e5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610824565b6000826001600160a01b03164760405160006040518083038185875af1925050503d8060008114610e9b576040519150601f19603f3d011682016040523d82523d6000602084013e610ea0565b606091505b50506040516370a0823160e01b81523060048201529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb90859083906370a0823190602401602060405180830381865afa158015610f13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f379190611c86565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610f82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa69190611c3a565b5080610fe65760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610824565b505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146113d05760408051600280825260608201835260009260208301908036833701905050905073165c3410fc91ef562c50559f7d2289febed552d96001600160a01b031663ef8ef56f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110dd9190611cb5565b816000815181106110f0576110f0611c57565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061114457611144611c57565b6001600160a01b039092166020928302919091019091015260405163d06ca61f60e01b8152479060009073165c3410fc91ef562c50559f7d2289febed552d99063d06ca61f9061119a9085908790600401611d16565b600060405180830381865afa1580156111b7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111df9190810190611d2f565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611249573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126d9190611c86565b905073165c3410fc91ef562c50559f7d2289febed552d96001600160a01b0316637ff36ab5846064601054866001815181106112ab576112ab611c57565b60200260200101516112bd9190611ded565b6112c79190611e04565b8730426040518663ffffffff1660e01b81526004016112e99493929190611e26565b60006040518083038185885af1158015611307573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526113309190810190611d2f565b506040516370a0823160e01b815230600482015281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611397573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113bb9190611c86565b6113c59190611bf2565b9450505050506113d3565b50345b80600760008282546113e59190611bdf565b90915550506006541561145157600a5460000361141f57600654600754600b5461140f9190611ded565b6114199190611e04565b600a5550565b60065481600b546114309190611ded565b61143a9190611e04565b600a600082825461144b9190611bdf565b90915550505b50565b6000546001600160a01b031633146107c55760405162461bcd60e51b815260040161082490611c05565b6000546001600160a01b031633146114a85760405162461bcd60e51b815260040161082490611c05565b604051600090339047908381818185875af1925050503d80600081146114ea576040519150601f19603f3d011682016040523d82523d6000602084013e6114ef565b606091505b505080915050806114515760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610824565b6000546001600160a01b0316331461155e5760405162461bcd60e51b815260040161082490611c05565b60648111156115a65760405162461bcd60e51b8152602060048201526014602482015273135a5b881cdb1a5c1c1859d9481c995858da195960621b6044820152606401610824565b60328110156115f75760405162461bcd60e51b815260206004820152601a60248201527f50726f6261626c7920746f6f206d75636820736c6970706167650000000000006044820152606401610824565b601055565b6000546001600160a01b031633146116265760405162461bcd60e51b815260040161082490611c05565b6001600160a01b03811661168b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610824565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60405163095ea7b360e01b815273165c3410fc91ef562c50559f7d2289febed552d9600482015260001960248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063095ea7b3906044016020604051808303816000875af1158015611768573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114519190611c3a565b600c546001600160a01b038316600090815260046020526040812054909142916117b69190611bdf565b1080156117c45750600d5482115b90505b92915050565b6001600160a01b03821660009081526005602052604081205490036117f0575050565b801561083757806008546118049190611bdf565b6008556001600160a01b038216600090815260046020908152604080832042905560059091528120600201805483929061183f908490611bdf565b90915550506001600160a01b038216600090815260056020526040902054611866906119c1565b6001600160a01b038084166000908152600560205260409020600101919091557f000000000000000000000000000000000000000000000000000000000000000081167f00000000000000000000000000000000000000000000000000000000000000009091160361192e576000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461191f576040519150601f19603f3d011682016040523d82523d6000602084013e611924565b606091505b5061083792505050565b60405163a9059cbb60e01b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af115801561199d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe69190611c3a565b6000816000036119d357506000919050565b600b54600a546119e39084611ded565b6117c79190611e04565b600280546119fd90600190611bf2565b81548110611a0d57611a0d611c57565b60009182526020808320909101546001600160a01b0384811684526003909252604090922054600280549290931692918110611a4b57611a4b611c57565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918316815260039182905260408120546002805491939291611a9790600190611bf2565b81548110611aa757611aa7611c57565b60009182526020808320909101546001600160a01b031683528201929092526040019020556002805480611add57611add611e5b565b600082815260209020810160001990810180546001600160a01b031916905501905550565b600080600060608486031215611b1757600080fd5b505081359360208301359350604090920135919050565b6001600160a01b038116811461145157600080fd5b600060208284031215611b5557600080fd5b81356107a781611b2e565b801515811461145157600080fd5b600080600060608486031215611b8357600080fd5b8335611b8e81611b2e565b9250602084013591506040840135611ba581611b60565b809150509250925092565b600060208284031215611bc257600080fd5b5035919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156117c7576117c7611bc9565b818103818111156117c7576117c7611bc9565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215611c4c57600080fd5b81516107a781611b60565b634e487b7160e01b600052603260045260246000fd5b600060018201611c7f57611c7f611bc9565b5060010190565b600060208284031215611c9857600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215611cc757600080fd5b81516107a781611b2e565b600081518084526020808501945080840160005b83811015611d0b5781516001600160a01b031687529582019590820190600101611ce6565b509495945050505050565b8281526040602082015260006108be6040830184611cd2565b60006020808385031215611d4257600080fd5b825167ffffffffffffffff80821115611d5a57600080fd5b818501915085601f830112611d6e57600080fd5b815181811115611d8057611d80611c9f565b8060051b604051601f19603f83011681018181108582111715611da557611da5611c9f565b604052918252848201925083810185019188831115611dc357600080fd5b938501935b82851015611de157845184529385019392850192611dc8565b98975050505050505050565b80820281158282048414176117c7576117c7611bc9565b600082611e2157634e487b7160e01b600052601260045260246000fd5b500490565b848152608060208201526000611e3f6080830186611cd2565b6001600160a01b03949094166040830152506060015292915050565b634e487b7160e01b600052603160045260246000fdfea26469706673582212200d12952eabfa4498b815669e61d88097c0f35f7dc9434ca0a7b0cc86a84cc1be64736f6c634300081500334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000007a1200000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000000000000000000000000000000000000000000074e656d657369730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074e454d4553495300000000000000000000000000000000000000000000000000

Deployed ByteCode

0x6080604052600436106102cd5760003560e01c80636ab86dc111610175578063ba3194ed116100dc578063d59ba0df11610095578063dfa20f0a1161006f578063dfa20f0a146108bd578063e2f45605146108d2578063f2fde38b146108e8578063fe33b3021461090857600080fd5b8063d59ba0df14610843578063db8d55f114610863578063dd62ed3e1461087757600080fd5b8063ba3194ed1461077f578063bea1dcf8146107af578063bfe10928146107cf578063c0246668146107ef578063c3615cba1461080f578063c5363caa1461082957600080fd5b806395d89b411161012e57806395d89b41146106b5578063a457c2d7146106ca578063a9059cbb146106ea578063aceac8561461070a578063ada2eb481461073f578063b572fe341461075f57600080fd5b80636ab86dc1146106055780636ddd17131461060d57806370a082311461062c578063715018a61461066257806386a22eff146106775780638da5cb5b1461069757600080fd5b8063313ce56711610234578063452ed4f1116101ed5780635031595f116101c75780635031595f14610582578063535a2437146105985780635c5d3412146105c5578063674e694f146105e557600080fd5b8063452ed4f11461052d5780634e71d92d1461054d5780634fc2d8a31461056257600080fd5b8063313ce5671461047657806336a1efe41461049257806339509351146104a8578063421dd7c7146104c857806342902a84146104dd5780634355855a146104fd57600080fd5b80630ca61cb1116102865780630ca61cb1146103d75780631317821d146103f757806318160ddd1461040c5780631983f5991461042b5780631ff8d5071461044157806323b872dd1461045657600080fd5b806301339c21146102d957806306fdde03146102f05780630758d9241461031b57806308695b4114610367578063095ea7b3146103875780630bf1deff146103b757600080fd5b366102d457005b600080fd5b3480156102e557600080fd5b506102ee610938565b005b3480156102fc57600080fd5b5061030561097e565b60405161031291906123e2565b60405180910390f35b34801561032757600080fd5b5061034f7f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d981565b6040516001600160a01b039091168152602001610312565b34801561037357600080fd5b506102ee610382366004612448565b610a10565b34801561039357600080fd5b506103a76103a236600461246c565b610a5c565b6040519015158152602001610312565b3480156103c357600080fd5b506102ee6103d2366004612498565b610a73565b3480156103e357600080fd5b506102ee6103f2366004612513565b610b4a565b34801561040357600080fd5b506102ee610be5565b34801561041857600080fd5b506002545b604051908152602001610312565b34801561043757600080fd5b5061041d600d5481565b34801561044d57600080fd5b506102ee610c23565b34801561046257600080fd5b506103a761047136600461253f565b610c6a565b34801561048257600080fd5b5060405160098152602001610312565b34801561049e57600080fd5b5061041d600a5481565b3480156104b457600080fd5b506103a76104c336600461246c565b610d1d565b3480156104d457600080fd5b506102ee610d59565b3480156104e957600080fd5b5061041d6104f8366004612448565b610d92565b34801561050957600080fd5b506103a7610518366004612448565b60116020526000908152604090205460ff1681565b34801561053957600080fd5b5060065461034f906001600160a01b031681565b34801561055957600080fd5b506102ee610e01565b34801561056e57600080fd5b506102ee61057d366004612448565b610e5a565b34801561058e57600080fd5b5061041d600f5481565b3480156105a457600080fd5b5061041d6105b3366004612448565b60076020526000908152604090205481565b3480156105d157600080fd5b506102ee6105e0366004612580565b610ee0565b3480156105f157600080fd5b506102ee6106003660046125a2565b610f96565b6102ee610fd3565b34801561061957600080fd5b50600e546103a790610100900460ff1681565b34801561063857600080fd5b5061041d610647366004612448565b6001600160a01b031660009081526020819052604090205490565b34801561066e57600080fd5b506102ee611023565b34801561068357600080fd5b506102ee6106923660046125d0565b611097565b3480156106a357600080fd5b506005546001600160a01b031661034f565b3480156106c157600080fd5b506103056111cc565b3480156106d657600080fd5b506103a76106e536600461246c565b6111db565b3480156106f657600080fd5b506103a761070536600461246c565b611274565b34801561071657600080fd5b5061072a610725366004612448565b611281565b60408051928352602083019190915201610312565b34801561074b57600080fd5b506102ee61075a3660046126db565b61136a565b34801561076b57600080fd5b506102ee61077a3660046125d0565b611514565b34801561078b57600080fd5b5061079461162c565b60408051938452602084019290925290820152606001610312565b3480156107bb57600080fd5b50600c5461034f906001600160a01b031681565b3480156107db57600080fd5b50600b5461034f906001600160a01b031681565b3480156107fb57600080fd5b506102ee61080a3660046125d0565b6117a1565b34801561081b57600080fd5b50600e546103a79060ff1681565b34801561083557600080fd5b506008546103a79060ff1681565b34801561084f57600080fd5b506102ee61085e3660046125d0565b61182a565b34801561086f57600080fd5b50600261041d565b34801561088357600080fd5b5061041d6108923660046127ad565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156108c957600080fd5b506102ee61190f565b3480156108de57600080fd5b5061041d60095481565b3480156108f457600080fd5b506102ee610903366004612448565b6119af565b34801561091457600080fd5b506103a7610923366004612448565b60126020526000908152604090205460ff1681565b6005546001600160a01b0316331461096b5760405162461bcd60e51b8152600401610962906127e6565b60405180910390fd5b600f541561097857600080fd5b43600f55565b60606003805461098d9061281b565b80601f01602080910402602001604051908101604052809291908181526020018280546109b99061281b565b8015610a065780601f106109db57610100808354040283529160200191610a06565b820191906000526020600020905b8154815290600101906020018083116109e957829003601f168201915b5050505050905090565b6005546001600160a01b03163314610a3a5760405162461bcd60e51b8152600401610962906127e6565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6000610a69338484611a9a565b5060015b92915050565b6005546001600160a01b03163314610a9d5760405162461bcd60e51b8152600401610962906127e6565b8015610ae15760085460ff1615610ae15760405162461bcd60e51b8152602060048201526008602482015267111a5cd8589b195960c21b6044820152606401610962565b60005b82811015610b44578160076000868685818110610b0357610b03612855565b9050602002016020810190610b189190612448565b6001600160a01b0316815260208101919091526040016000205580610b3c81612881565b915050610ae4565b50505050565b6005546001600160a01b03163314610b745760405162461bcd60e51b8152600401610962906127e6565b600b54604051630ca61cb160e01b81526004810185905260248101849052604481018390526001600160a01b0390911690630ca61cb190606401600060405180830381600087803b158015610bc857600080fd5b505af1158015610bdc573d6000803e3d6000fd5b50505050505050565b6005546001600160a01b03163314610c0f5760405162461bcd60e51b8152600401610962906127e6565b600e805460ff19811660ff90911615179055565b6005546001600160a01b03163314610c4d5760405162461bcd60e51b8152600401610962906127e6565b600e805461ff001981166101009182900460ff1615909102179055565b6000610c77848484611bbe565b6001600160a01b03841660009081526001602090815260408083203384529091529020546000198114610d125782811015610d055760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610962565b610d128533858403611a9a565b506001949350505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610a69918590610d5490869061289a565b611a9a565b6005546001600160a01b03163314610d835760405162461bcd60e51b8152600401610962906127e6565b6008805460ff19166001179055565b600b54604051630994fc3160e11b81526001600160a01b0383811660048301526000921690631329f86290602401602060405180830381865afa158015610ddd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6d91906128ad565b600b54604051630afbf02f60e11b81523360048201526001600160a01b03909116906315f7e05e90602401600060405180830381600087803b158015610e4657600080fd5b505af1158015610b44573d6000803e3d6000fd5b6005546001600160a01b03163314610e845760405162461bcd60e51b8152600401610962906127e6565b60405163f2fde38b60e01b81523360048201526001600160a01b0382169063f2fde38b90602401600060405180830381600087803b158015610ec557600080fd5b505af1158015610ed9573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03163314610f0a5760405162461bcd60e51b8152600401610962906127e6565b6064610f1560025490565b610f209060016128c6565b610f2a91906128dd565b811115610f8b5760405162461bcd60e51b815260206004820152602960248201527f4d617820737761702063616e6e6f7420626520686967686572207468616e2031604482015268129039bab838363c9760b91b6064820152608401610962565b600991909155600a55565b6005546001600160a01b03163314610fc05760405162461bcd60e51b8152600401610962906127e6565b6064811115610fce57600080fd5b600d55565b600b60009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610ec557600080fd5b6005546001600160a01b0316331461104d5760405162461bcd60e51b8152600401610962906127e6565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6006546001600160a01b03908116908316036111035760405162461bcd60e51b815260206004820152602560248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d20604482015264706169727360d81b6064820152608401610962565b6005546001600160a01b03163314806111265750600c546001600160a01b031633145b6111615760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5cd95960a21b6044820152606401610962565b6001600160a01b0382166000908152601260205260409020805460ff1916821515179055611190826001611514565b604051811515906001600160a01b038416907ff40a563af144a84735f7f6c7c3029794b0ac17713e5f048d3fd00ed85aa4ca7a90600090a35050565b60606004805461098d9061281b565b3360009081526001602090815260408083206001600160a01b03861684529091528120548281101561125d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610962565b61126a3385858403611a9a565b5060019392505050565b6000610a69338484611bbe565b600b5460405163051fa63360e31b81526001600160a01b03838116600483015260009283929116906328fd319890602401602060405180830381865afa1580156112cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f391906128ad565b600b54604051633cbf8a6160e01b81526001600160a01b038681166004830152929450911690633cbf8a6190602401602060405180830381865afa15801561133f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136391906128ad565b9050915091565b6005546001600160a01b031633146113945760405162461bcd60e51b8152600401610962906127e6565b81518351146113e55760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610962565b60005b8351811015610b44576114463385838151811061140757611407612855565b60200260200101516009600a61141d91906129e3565b86858151811061142f5761142f612855565b602002602001015161144191906128c6565b611f57565b811561150257600b5484516001600160a01b03909116906329cc05cf9086908490811061147557611475612855565b60200260200101516009600a61148b91906129e3565b86858151811061149d5761149d612855565b60200260200101516114af91906128c6565b60006040518463ffffffff1660e01b81526004016114cf939291906129f2565b600060405180830381600087803b1580156114e957600080fd5b505af11580156114fd573d6000803e3d6000fd5b505050505b8061150c81612881565b9150506113e8565b6005546001600160a01b0316331461153e5760405162461bcd60e51b8152600401610962906127e6565b6001600160a01b0382166000908152601160205260409020805460ff191682158015919091179091556115d757600b546040516329cc05cf60e01b81526001600160a01b03909116906329cc05cf906115a19085906000906001906004016129f2565b600060405180830381600087803b1580156115bb57600080fd5b505af11580156115cf573d6000803e3d6000fd5b505050505050565b600b546001600160a01b03166329cc05cf83611608816001600160a01b031660009081526020819052604090205490565b60006040518463ffffffff1660e01b81526004016115a1939291906129f2565b5050565b6000806000600b60009054906101000a90046001600160a01b03166001600160a01b03166367ee5f096040518163ffffffff1660e01b8152600401602060405180830381865afa158015611684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a891906128ad565b9250600b60009054906101000a90046001600160a01b03166001600160a01b0316635695fa586040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172191906128ad565b9150600b60009054906101000a90046001600160a01b03166001600160a01b0316639df62df26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611776573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179a91906128ad565b9050909192565b6005546001600160a01b031633146117cb5760405162461bcd60e51b8152600401610962906127e6565b6001600160a01b038216600081815260106020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146118545760405162461bcd60e51b8152600401610962906127e6565b80156118ba57600b5460405163ce5494bb60e01b81526001600160a01b0384811660048301529091169063ce5494bb90602401600060405180830381600087803b1580156118a157600080fd5b505af11580156118b5573d6000803e3d6000fd5b505050505b600b80546001600160a01b0319166001600160a01b0384169081179091556040805163204a7f0760e21b81529051638129fc1c9160048082019260009290919082900301818387803b1580156115bb57600080fd5b6005546001600160a01b03163314806119325750600c546001600160a01b031633145b61196d5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5cd95960a21b6044820152606401610962565b604051600090339047908381818185875af1925050503d8060008114610b44576040519150601f19603f3d011682016040523d82523d6000602084013e610b44565b6005546001600160a01b031633146119d95760405162461bcd60e51b8152600401610962906127e6565b6001600160a01b038116611a3e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610962565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611afc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610962565b6001600160a01b038216611b5d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610962565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611be45760405162461bcd60e51b815260040161096290612a15565b6001600160a01b038216611c0a5760405162461bcd60e51b815260040161096290612a5a565b600f54600003611ca8576001600160a01b03831660009081526010602052604090205460ff1680611c5357506001600160a01b03821660009081526010602052604090205460ff165b611c985760405162461bcd60e51b815260206004820152601660248201527554726164696e67206e6f74207965742061637469766560501b6044820152606401610962565b611ca3838383611f57565b611e10565b6001600160a01b03831660009081526010602052604090205460ff16158015611cea57506001600160a01b03821660009081526010602052604090205460ff16155b15611d9757600060026064611cff82856128c6565b611d0991906128dd565b91508115611d1c57611d1c853084611f57565b600e54610100900460ff168015611d3b5750600854610100900460ff16155b8015611d5f57506001600160a01b03841660009081526012602052604090205460ff165b15611d88576008805461ff001916610100179055611d7c836120ac565b6008805461ff00191690555b611d928284612a9d565b925050505b611da2838383611f57565b600e5460ff1615611e1057600b60009054906101000a90046001600160a01b03166001600160a01b031663c33fb8776040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611dfd57600080fd5b505af1925050508015611e0e575060015b505b611e1a83836121fb565b6001600160a01b03831660009081526011602052604090205460ff16611eb857600b546001600160a01b03166329cc05cf84611e6b816001600160a01b031660009081526020819052604090205490565b60006040518463ffffffff1660e01b8152600401611e8b939291906129f2565b600060405180830381600087803b158015611ea557600080fd5b505af1925050508015611eb6575060015b505b6001600160a01b03821660009081526011602052604090205460ff16611f5257600b546001600160a01b03166329cc05cf83611f09816001600160a01b031660009081526020819052604090205490565b60006040518463ffffffff1660e01b8152600401611f29939291906129f2565b600060405180830381600087803b158015611f4357600080fd5b505af1925050508015610b4457505b505050565b6001600160a01b038316611f7d5760405162461bcd60e51b815260040161096290612a15565b6001600160a01b038216611fa35760405162461bcd60e51b815260040161096290612a5a565b6001600160a01b0383166000908152602081905260409020548181101561201b5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610962565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061205290849061289a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161209e91815260200190565b60405180910390a350505050565b306000908152602081905260409020546009548110156120ca575050565b600a548111156120d95750600a545b818111156120e45750805b806000036120f0575050565b476120fa82612293565b60006121068247612a9d565b90508015610b44576000606482600d5461212091906128c6565b61212a91906128dd565b9050801561219657600b60009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561218257600080fd5b505af193505050508015612194575060015b505b80821115610ed957600c546040516000916001600160a01b03169047908381818185875af1925050503d80600081146121eb576040519150601f19603f3d011682016040523d82523d6000602084013e6121f0565b606091505b505050505050505050565b6001600160a01b038216600090815260076020526040902054158061222d57506005546001600160a01b038281169116145b6116285760405162461bcd60e51b815260206004820152603160248201527f57616c6c65742070726f74656374696f6e20656e61626c65642c20706c656173604482015270194818dbdb9d1858dd081cdd5c1c1bdc9d607a1b6064820152608401610962565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106122c8576122c8612855565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d96001600160a01b031663ef8ef56f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612346573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236a9190612ab0565b8160018151811061237d5761237d612855565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d99091169063791ac947906115a1908590600090869030904290600401612acd565b600060208083528351808285015260005b8181101561240f578581018301518582016040015282016123f3565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461244557600080fd5b50565b60006020828403121561245a57600080fd5b813561246581612430565b9392505050565b6000806040838503121561247f57600080fd5b823561248a81612430565b946020939093013593505050565b6000806000604084860312156124ad57600080fd5b833567ffffffffffffffff808211156124c557600080fd5b818601915086601f8301126124d957600080fd5b8135818111156124e857600080fd5b8760208260051b85010111156124fd57600080fd5b6020928301989097509590910135949350505050565b60008060006060848603121561252857600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561255457600080fd5b833561255f81612430565b9250602084013561256f81612430565b929592945050506040919091013590565b6000806040838503121561259357600080fd5b50508035926020909101359150565b6000602082840312156125b457600080fd5b5035919050565b803580151581146125cb57600080fd5b919050565b600080604083850312156125e357600080fd5b82356125ee81612430565b91506125fc602084016125bb565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561264457612644612605565b604052919050565b600067ffffffffffffffff82111561266657612666612605565b5060051b60200190565b600082601f83011261268157600080fd5b813560206126966126918361264c565b61261b565b82815260059290921b840181019181810190868411156126b557600080fd5b8286015b848110156126d057803583529183019183016126b9565b509695505050505050565b6000806000606084860312156126f057600080fd5b833567ffffffffffffffff8082111561270857600080fd5b818601915086601f83011261271c57600080fd5b8135602061272c6126918361264c565b82815260059290921b8401810191818101908a84111561274b57600080fd5b948201945b8386101561277257853561276381612430565b82529482019490820190612750565b9750508701359250508082111561278857600080fd5b5061279586828701612670565b9250506127a4604085016125bb565b90509250925092565b600080604083850312156127c057600080fd5b82356127cb81612430565b915060208301356127db81612430565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061282f57607f821691505b60208210810361284f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016128935761289361286b565b5060010190565b80820180821115610a6d57610a6d61286b565b6000602082840312156128bf57600080fd5b5051919050565b8082028115828204841417610a6d57610a6d61286b565b6000826128fa57634e487b7160e01b600052601260045260246000fd5b500490565b600181815b8085111561293a5781600019048211156129205761292061286b565b8085161561292d57918102915b93841c9390800290612904565b509250929050565b60008261295157506001610a6d565b8161295e57506000610a6d565b8160018114612974576002811461297e5761299a565b6001915050610a6d565b60ff84111561298f5761298f61286b565b50506001821b610a6d565b5060208310610133831016604e8410600b84101617156129bd575081810a610a6d565b6129c783836128ff565b80600019048211156129db576129db61286b565b029392505050565b600061246560ff841683612942565b6001600160a01b0393909316835260208301919091521515604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610a6d57610a6d61286b565b600060208284031215612ac257600080fd5b815161246581612430565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612b1d5784516001600160a01b031683529383019391830191600101612af8565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220839947ae601703ddcce1de9760e74af0a6cc4b5ffedaf8416e0be1cb3a10271364736f6c63430008150033