ETH Price: $3,494.26 (-0.15%)
Gas: 5 Gwei

Token

VitaBlock AI (VBlock)
 

Overview

Max Total Supply

1,000,000,000 VBlock

Holders

83

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
12,581,695 VBlock

Value
$0.00
0xC91a71B6a125Bb397Eea8d13c36A30b971FAa3b4
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
VBlock

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 8 : Contract.sol
//www.vitablock.ai
//twitter: @VitaBlock

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

error ERC20_OnlyVB();
error ERC20_OnlyOwner();
error ERC20_PleaseOnboard();
error ERC20_PreEquinox();
error ERC20_PostEquinox();
error ERC20_UniswapV2PairAddress();
error ERC20_InvalidTransfer();
error ERC20_TradingNotOpen();
error ERC20_ExceedsBuyLimit();
error ERC20_ExceedsWalletLimit();
error ERC20_ExceedsSellLimit();
error ERC20_RecipientWillExceedLimit();
error ERC20_Invalid();
error ERC20_InsufficientTokens();
error ERC20_SwapInProgress();

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint256);

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

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

    function WETH() external pure returns (address);

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

library HashGetter {
    function _getHash(bytes32 _lastHash, address _address) internal view returns (bytes32) {
        string memory _str = string.concat(
            Strings.toString(uint256(_lastHash)),
            Strings.toString(block.timestamp),
            Strings.toHexString(_address)
        );
        return keccak256(abi.encodePacked(_str));
    }
}

library AddressArrays {
    function _selectWinner(
        address[] memory _addresses,
        bytes32 _hash
    ) internal pure returns (address) {
        uint256 _length = _addresses.length;
        if (_length == 0) return address(0xdead);
        return _addresses[_getPseudorandomNumber(_hash, _length)];
    }

    function _getPseudorandomNumber(
        bytes32 _hash,
        uint256 _length
    ) internal pure returns (uint256) {
        return uint256(_hash) % _length;
    }
}

contract VBlock is ERC20, Ownable {
    using HashGetter for bytes32;
    using AddressArrays for address[];

    address private constant VB = address(0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B); //Vitalik Buterin's public address (Vb)
    uint256 private constant AUTUMN_EQUINOX_2023_TIMESTAMP = 1695427200; //	Sat Sep 23 2023 00:00:00 UTC
    uint256 private constant MIN_HODL_BLOCKS = 400000; //must hold for four hundred thousand ethereum block confirmations (~55.5 days @ ~12 seconds per block) to be a HODLER

    IUniswapV2Router02 private immutable uniswapV2Router;
    address private immutable uniswapV2Pair;

    uint256 private immutable txMax;
    uint256 private immutable sellMax;
    uint256 private immutable walletMax;

    bool private isEthRaffleDone;
    bool private isVbShareFilled;
    bool private isTradingOpen;
    bool private isVbOnboard;
    bool private isSwapping;

    uint256 private buyTotalFees;
    uint256 private buyTrustFee;
    uint256 private buyRaffleFee;

    uint256 private sellTotalFees;
    uint256 private sellTrustFee;
    uint256 private sellRaffleFee;

    uint256 private trustTokens;
    uint256 private raffleTokens;
    uint256 private trustTokensTreasury;
    uint256 private swapTrustTokensAt;
    uint256 private swapRaffleTokensAt;

    bytes32 private lastHash;
    uint256 private minEligibility;

    address[] private contestants;
    address[] private hodlers;

    mapping(address => bool) private isExcludedFromFees;
    mapping(address => bool) private isExcludedFromMaxTx;
    mapping(address => bool) private isAMM;
    mapping(address => bool) private isConfirmedHodler;
    mapping(address => bool) private isHodling;
    mapping(address => bool) private isHodlEthRaffleWinner;
    mapping(address => uint256) private contestantsIndexes;
    mapping(address => uint256) private buyBlocks;
    mapping(address => uint256) private addressToRaffleCount;

    uint256 private currentRaffleCount;

    event Attaboy(address indexed _vb);
    event TransferedVbShare(address indexed _address);
    event SetAsAMM(address indexed _pair, bool _value);
    event UpdatedBuyFees(uint256 _trust, uint256 _raffle);
    event UpdatedSellFees(uint256 _trust, uint256 _raffle);
    event UpdatedSwapRaffleAt(uint256 _swapAt);
    event UpdatedSwapTrustAt(uint256 _swapAt);
    event TransferedToDeadAddress(address indexed _from, uint256 _amount);
    event SwappedForEth(uint256 _tokens, uint256 _eth);
    event TokenContestantsWinner(address indexed _winner, uint256 _tokens, uint256 _timestamp);
    event EthContestantsWinner(address indexed _winner, uint256 _eth);
    event EthHodlersWinner(address _winner, uint256 _eth);
    event WithdrewEth(address indexed _address, uint256 _amount, uint256 _timestamp);
    event AddedToContestants(address indexed _address);
    event AddedToHodlers(address indexed _address, uint256 _buyBlock, uint256 _blocksHodled);

    constructor() ERC20("VitaBlock AI", "VBlock") {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );

        uniswapV2Router = _uniswapV2Router;

        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(
            address(this),
            _uniswapV2Router.WETH()
        );
        _setAsAMM(address(uniswapV2Pair), true);

        uint256 _totalSupply = 1_000_000_000 * 10 ** decimals(); //one billion
        uint256 _twoPercentOfTotal = _totalSupply / 50;
        txMax = _twoPercentOfTotal; // 2% of supply transaction limit
        sellMax = _totalSupply / 100; // 1% of supply sell limit
        walletMax = _twoPercentOfTotal; // 2% of supply max wallet size

        uint256 _swapAt = _totalSupply / 1000; // 0.1% of total supply
        swapTrustTokensAt = _swapAt;
        swapRaffleTokensAt = _swapAt;

        minEligibility = _totalSupply / 10000; // 0.01%

        // The 5+5=10% early fees will be used to fill VB's 2% share, after which the fees will be automatically reduced to 2+2=4%
        _updateBuyFees(5, 5);
        _updateSellFees(5, 5);

        isExcludedFromFees[owner()] = true;
        isExcludedFromFees[address(this)] = true;

        isExcludedFromMaxTx[owner()] = true;
        isExcludedFromMaxTx[address(this)] = true;

        isExcludedFromMaxTx[address(_uniswapV2Router)] = true;
        isExcludedFromMaxTx[address(uniswapV2Pair)] = true;

        _mint(msg.sender, _totalSupply);

        currentRaffleCount = 1;
        lastHash = lastHash._getHash(msg.sender);
    }

    receive() external payable {}

    /**
     *
     * @notice This function would need to be invoked by VB before AUTUMN_EQUINOX_2023_TIMESTAMP
     * for full access to contract's onlyOwner functions. Please read "ETHICAL PLEDGE" prior to invoking.
     */
    function vbOnboard() external {
        /**
         * ETHICAL PLEDGE:
         * By executing this function, I, Vitalik Buterin, hereby proclaim my approval of this project
         * and pledge to ensure that the ETH and tokens collected in the treasuries of this contract will
         * be used only for purposes meant for the development of technologies, AI or otherwise, that will
         * help create a more secure crypto ecosystem.
         *
         * Furtheremore, I promise to swap the VBlock tokens collected in trustTokensTreasury in a manner that
         * would not jeapordise the overall health of this project.
         *
         * Where applicable, I shall ensure that privileged access will be granted to holders of VBlock tokens
         * to technologies/projects that receive funding through this contract.
         *
         * I understand that this is an ethical pledge between the VitaBlock community and I and, hence, not a legally binding contract.
         *
         */

        if (msg.sender != VB) revert ERC20_OnlyVB();
        if (block.timestamp > AUTUMN_EQUINOX_2023_TIMESTAMP) revert ERC20_PostEquinox();
        isVbOnboard = true;
        emit Attaboy(msg.sender);
    }

    function openTrading() external onlyOwner {
        isTradingOpen = true;
        isSwapping = false;
    }

    function updateBuyFees(uint256 _trust, uint256 _raffle) external onlyOwner {
        _updateBuyFees(_trust, _raffle);
    }

    function updateSellFees(uint256 _trust, uint256 _raffle) external onlyOwner {
        _updateSellFees(_trust, _raffle);
    }

    function getUintVars()
        external
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        return (
            swapTrustTokensAt,
            swapRaffleTokensAt,
            minEligibility,
            raffleTokens,
            trustTokens,
            trustTokensTreasury,
            buyTrustFee,
            buyRaffleFee,
            sellTrustFee,
            sellRaffleFee
        );
    }

    function setAsAMM(address _address, bool _value) external onlyOwner {
        _setAsAMM(_address, _value);
    }

    function getBuyBlockAndBlocksCount(address _address) external view returns (uint256, uint256) {
        if (!isHodling[_address]) {
            return (0, 0);
        }
        return (buyBlocks[_address], block.number - buyBlocks[_address]);
    }

    function getRaffleEntrantsCounts() external view returns (uint256, uint256) {
        return (contestants.length, hodlers.length);
    }

    function getRaffleInfo(address _address) external view returns (uint256, bool, bool, bool) {
        return (
            currentRaffleCount,
            addressToRaffleCount[_address] == currentRaffleCount,
            isConfirmedHodler[_address],
            isHodling[_address]
        );
    }

    function checkBools() external view returns (bool, bool) {
        return (isSwapping, isVbOnboard);
    }

    function _setAsAMM(address _address, bool _value) internal {
        isAMM[_address] = _value;
        emit SetAsAMM(_address, _value);
    }

    function _updateBuyFees(uint256 _trust, uint256 _raffle) internal {
        if (_trust + _raffle > 10 || _raffle < 1) revert ERC20_Invalid();
        buyTrustFee = _trust;
        buyRaffleFee = _raffle;
        buyTotalFees = _trust + _raffle;
        emit UpdatedBuyFees(_trust, _raffle);
    }

    function _updateSellFees(uint256 _trust, uint256 _raffle) internal {
        if (_trust + _raffle > 10 || _raffle < 1) revert ERC20_Invalid();
        sellTrustFee = _trust;
        sellRaffleFee = _raffle;
        sellTotalFees = _trust + _raffle;
        emit UpdatedSellFees(_trust, _raffle);
    }

    function _transferToDeadAddress(address _from, uint256 _amount) internal {
        super._transfer(_from, address(0xdead), _amount);
        emit TransferedToDeadAddress(_from, _amount);
    }

    function _burn(address _account, uint256 _amount) internal override {
        if (msg.sender != owner()) revert ERC20_OnlyOwner();
        if (_account == address(this)) {
            if (_amount > trustTokensTreasury) revert ERC20_InsufficientTokens();
            super._burn(_account, _amount);
            trustTokensTreasury -= _amount;
        }
    }

    function _transfer(address _from, address _to, uint256 _amount) internal override {
        if (_from == address(0) || _to == address(0) || _amount == 0)
            revert ERC20_InvalidTransfer();
        if (_from == VB && !isVbOnboard) revert ERC20_PleaseOnboard();
        if (_to == address(0xdead)) {
            _transferToDeadAddress(_from, _amount);
            return;
        }
        bool _ranTrust;
        bool _ranRaffle;
        bool _isFromAMM = isAMM[_from];
        bool _isToAMM = isAMM[_to];
        if (block.timestamp > AUTUMN_EQUINOX_2023_TIMESTAMP && !_isFromAMM && !isEthRaffleDone) {
            _removeFromContestants(_from, false);
            if (!isVbOnboard) {
                //eliminate trust fees and double raffle fees
                _updateBuyFees(0, 2);
                _updateSellFees(0, 2);
            }
            isSwapping = true;
            _runEthRaffle();
            isSwapping = false;
            isEthRaffleDone = true;
            _ranTrust = true;
            _ranRaffle = true;
        }

        uint256 _initialBalanceOfTo = balanceOf(_to);
        uint256 _fees;
        uint256 _buyTotalFees;
        uint256 _walletMax = walletMax;
        bool _shouldReduceFees;
        uint256 _finalBalance;

        if (!isExcludedFromFees[_from] && !isExcludedFromFees[_to]) {
            if (!isTradingOpen || isSwapping) revert ERC20_TradingNotOpen();

            //buy
            if (_isFromAMM && !isExcludedFromMaxTx[_to]) {
                if (_amount > txMax) revert ERC20_ExceedsBuyLimit();
                _buyTotalFees = buyTotalFees;
                _fees = (_amount * _buyTotalFees) / 100;

                unchecked {
                    _finalBalance = _initialBalanceOfTo + _amount - _fees;
                }
                if (_finalBalance > _walletMax) revert ERC20_ExceedsWalletLimit();
            }
            //sell
            else if (!isExcludedFromMaxTx[_from] && _isToAMM && _amount > sellMax)
                revert ERC20_ExceedsSellLimit();
            //transfer
            else if (!_isFromAMM && !_isToAMM && _amount + _initialBalanceOfTo > _walletMax)
                revert ERC20_RecipientWillExceedLimit();
        }

        if (
            ((trustTokens >= swapTrustTokensAt) || (raffleTokens >= swapRaffleTokensAt)) &&
            !_isFromAMM &&
            !isExcludedFromFees[_from] &&
            !isExcludedFromFees[_to] &&
            isVbShareFilled
        ) {
            _removeFromContestants(_from, false);

            isSwapping = true;
            (_ranTrust, _ranRaffle) = _swapBack();
            isSwapping = false;
        }

        bool _hasFees = !isSwapping;

        if (isExcludedFromFees[_from] || isExcludedFromFees[_to]) _hasFees = false;

        //Only buys/sell fees. No fees for transfers between wallets
        if (_hasFees) {
            uint256 _trustTokens;
            // on sell
            if (_isToAMM && sellTotalFees > 0) {
                uint256 _sellTotalFees = sellTotalFees;

                unchecked {
                    _fees = (_amount * _sellTotalFees) / 100;
                    _trustTokens = (_fees * sellTrustFee) / _sellTotalFees;
                    raffleTokens += _fees - _trustTokens;
                }
            }
            // on buy
            else if (_isFromAMM && _buyTotalFees > 0) {
                unchecked {
                    _trustTokens = (_fees * buyTrustFee) / _buyTotalFees;
                    raffleTokens += _fees - _trustTokens;
                }
            }
            if (_trustTokens > 0) {
                uint256 _half;
                unchecked {
                    _half = _trustTokens / 2;
                    trustTokensTreasury += _half;
                    trustTokens += _trustTokens - _half;
                }
            }
            if (_fees > 0) {
                super._transfer(_from, address(this), _fees);
                if (!isVbShareFilled) {
                    _resetTokenCounters();
                    if (balanceOf(address(this)) >= _walletMax) {
                        uint256 _burnTokens = balanceOf(address(this)) - _walletMax;
                        if (balanceOf(VB) > 0) {
                            unchecked {
                                _walletMax = _walletMax - balanceOf(VB);
                                _burnTokens += balanceOf(VB);
                            }
                        }
                        super._transfer(address(this), VB, _walletMax);
                        emit TransferedVbShare(VB);
                        _transferToDeadAddress(address(this), _burnTokens);
                        isVbShareFilled = true;
                        _shouldReduceFees = true;
                    }
                }
                unchecked {
                    _amount -= _fees;
                }
            }
        }
        super._transfer(_from, _to, _amount);

        //buy
        if (_isFromAMM && !isExcludedFromMaxTx[_to] && _amount >= minEligibility)
            _addToContestants(_to);

            //sell or transfer
        else if ((!isExcludedFromMaxTx[_from] && _isToAMM) || (!_isFromAMM && !_isToAMM))
            _removeFromContestants(_from, true);

        //if transfering to contract
        if (_to == address(this)) {
            unchecked {
                trustTokensTreasury += _amount;
            }
        }
        if (_ranRaffle || _ranTrust) {
            uint256 _tokensInUniswap = balanceOf(address(uniswapV2Pair));
            uint _swapAt = _tokensInUniswap / 1000;
            if (_ranRaffle) {
                swapRaffleTokensAt = _swapAt;
                minEligibility = _tokensInUniswap / 10000;
                emit UpdatedSwapRaffleAt(_swapAt);
            }
            if (_ranTrust) {
                swapTrustTokensAt = _swapAt;
                emit UpdatedSwapTrustAt(_swapAt);
            }
        }
        //reduce buy/sell fees down to 4%
        if (_shouldReduceFees) {
            _updateBuyFees(2, 2);
            _updateSellFees(2, 2);
        }
    }

    function _addToContestants(address _address) internal {
        if (addressToRaffleCount[_address] == currentRaffleCount) return;

        uint256 _length = contestants.length;
        contestants.push(_address);
        contestantsIndexes[_address] = _length;
        addressToRaffleCount[_address] = currentRaffleCount;
        emit AddedToContestants(_address);

        if (!isEthRaffleDone && !isHodling[_address] && !isConfirmedHodler[_address]) {
            isHodling[_address] = true;
            if (buyBlocks[_address] == 0) {
                buyBlocks[_address] = block.number;
            }
        }
    }

    function _removeFromContestants(address _address, bool _shouldGetHash) internal {
        if (_shouldGetHash) {
            bool _isZero;
            unchecked {
                _isZero = block.timestamp % 2 == 0;
            }
            if (_isZero) {
                lastHash = lastHash._getHash(msg.sender);
            }
        }
        if (addressToRaffleCount[_address] == currentRaffleCount) {
            address[] memory _contestants = contestants;
            address _last = _contestants[_contestants.length - 1];
            uint256 _updateIndex = contestantsIndexes[_address];
            contestants[_updateIndex] = _last;
            contestantsIndexes[_last] = _updateIndex;
            contestants.pop();
            addressToRaffleCount[_address] = 0;
        }

        if (!isEthRaffleDone && isHodling[_address] && !isConfirmedHodler[_address]) {
            uint256 _blocksHodled;

            unchecked {
                _blocksHodled = block.number - buyBlocks[_address];
            }
            if (_blocksHodled >= MIN_HODL_BLOCKS) {
                hodlers.push(_address);
                isConfirmedHodler[_address] = true;
                emit AddedToHodlers(_address, block.number, _blocksHodled);
            }
            isHodling[_address] = false;
            buyBlocks[_address] = 0;
        }
    }

    function _resetContestants() internal {
        contestants = new address[](0);
        unchecked {
            currentRaffleCount++;
        }
    }

    function _resetTokenCounters() internal {
        trustTokens = 0;
        raffleTokens = 0;
        trustTokensTreasury = 0;
    }

    function _swapForEth(uint256 _tokens) internal {
        address[] memory _path = new address[](2);
        _path[0] = address(this);
        _path[1] = uniswapV2Router.WETH();
        uint256 _initialEth = address(this).balance;

        _approve(address(this), address(uniswapV2Router), _tokens);
        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            _tokens,
            0,
            _path,
            address(this),
            block.timestamp
        );
        uint256 _currentEth = address(this).balance;
        uint256 _ethGained;

        if (_currentEth > _initialEth) {
            unchecked {
                _ethGained = _currentEth - _initialEth;
            }
        }
        emit SwappedForEth(_tokens, _ethGained);
    }

    function _swapBack() internal returns (bool _ranTrust, bool _ranRaffle) {
        uint256 _burnTokens;
        uint256 _trustTokens = trustTokens;
        uint256 _raffleTokens = raffleTokens;
        uint256 _swapTrustTokensAt = swapTrustTokensAt;
        uint256 _swapRaffleTokensAt = swapRaffleTokensAt;

        if (
            balanceOf(address(this)) == 0 ||
            (_trustTokens < _swapTrustTokensAt && _raffleTokens < _swapRaffleTokensAt)
        ) return (false, false);

        if (_trustTokens >= _swapTrustTokensAt) {
            //swap for ETH treasury
            unchecked {
                _burnTokens += _trustTokens - _swapTrustTokensAt;
            }

            _swapForEth(_swapTrustTokensAt);

            trustTokens = 0;
            _ranTrust = true;
        }
        if (_raffleTokens >= _swapRaffleTokensAt) {
            //run raffle
            unchecked {
                _burnTokens += _raffleTokens - _swapRaffleTokensAt;
            }

            lastHash = lastHash._getHash(msg.sender);
            address _winner = contestants._selectWinner(lastHash);

            uint256 _transferAmount = _swapRaffleTokensAt;
            if (_winner != address(0xdead)) {
                uint256 _winnerBalance = balanceOf(_winner);
                uint256 _walletMax = walletMax;

                if (_winnerBalance + _transferAmount > _walletMax) {
                    unchecked {
                        _transferAmount = _walletMax - _winnerBalance;
                        _burnTokens += _swapRaffleTokensAt - _transferAmount;
                    }
                }
                super._transfer(address(this), _winner, _transferAmount);
            } else {
                unchecked {
                    _burnTokens += _transferAmount;
                }
            }
            _resetContestants();
            emit TokenContestantsWinner(_winner, _transferAmount, block.timestamp);
            raffleTokens = 0;
            _ranRaffle = true;
        }

        if (_burnTokens > 0) _transferToDeadAddress(address(this), _burnTokens);
        return (_ranTrust, _ranRaffle);
    }

    function _runEthRaffle() internal {
        if (address(this).balance > 0) {
            address[] memory _hodlers = hodlers;
            address[] memory _contestants = contestants;
            bool _success;
            bool _noContestants;
            uint256 _hodlersCount = _hodlers.length;
            uint256 _contestantsCount = _contestants.length;
            uint256 _rewardsCount = 5;
            uint256 _participantsCount;

            unchecked {
                _participantsCount = _hodlersCount + _contestantsCount;
            }

            uint256 _equinoxRafflePercentage = 25; // If Vitalik is onboard, 25% of contract ETH balance will be up for the raffle
            if (!isVbOnboard) _equinoxRafflePercentage = 100; //If Vitalik is not onboard, 100% of contract ETH balance will be up for the raffle

            uint256 _ethRewardTotal = (address(this).balance * _equinoxRafflePercentage) / 100;

            if (_participantsCount < _rewardsCount) {
                if (_participantsCount != 0) _rewardsCount = _participantsCount;
                else {
                    _noContestants = true;

                    if (!isVbOnboard) {
                        //In the highly unlikely event that there are zero contestants and hodlers and isVbOnboard == false, VB will reap all the rewards.
                        (_success, ) = payable(VB).call{value: _ethRewardTotal}("");
                        emit EthContestantsWinner(msg.sender, _ethRewardTotal / 2);
                        emit EthHodlersWinner(msg.sender, _ethRewardTotal / 2);
                    }
                }
            }

            if (!_noContestants) {
                address _winner;
                uint256 _ethRewardPerWinner = _ethRewardTotal / _rewardsCount;
                if (_contestantsCount != 0) {
                    lastHash = lastHash._getHash(msg.sender);
                    _winner = _contestants._selectWinner(lastHash);
                    (_success, ) = payable(_winner).call{value: _ethRewardPerWinner}("");
                    emit EthContestantsWinner(_winner, _ethRewardPerWinner);

                    unchecked {
                        _rewardsCount--;
                    }
                }

                if (_hodlersCount != 0) {
                    for (uint256 _i = 1; _i <= _rewardsCount; ) {
                        lastHash = lastHash._getHash(msg.sender);
                        _winner = _hodlers._selectWinner(lastHash);

                        if (!isHodlEthRaffleWinner[_winner]) {
                            isHodlEthRaffleWinner[_winner] = true;
                            if (_i == _rewardsCount && !isVbOnboard)
                                _ethRewardPerWinner = address(this).balance;

                            (_success, ) = payable(_winner).call{value: _ethRewardPerWinner}("");
                            emit EthHodlersWinner(_winner, _ethRewardPerWinner);

                            unchecked {
                                _i++;
                            }
                        }
                    }
                }
            }

            _transferToDeadAddress(
                address(this),
                (balanceOf(address(this)) * _equinoxRafflePercentage) / 100
            );
            _resetContestants();

            if (isVbOnboard) {
                trustTokensTreasury = balanceOf(address(this));
                trustTokens = 0;
                raffleTokens = 0;
            } else {
                _resetTokenCounters();
            }
        }
    }

    function withdrawContractEth(address _to, uint256 _eth) external onlyOwner {
        if (!isVbOnboard) revert ERC20_PleaseOnboard();
        if (!isEthRaffleDone) revert ERC20_PreEquinox();
        if (_eth == 0) _eth = address(this).balance;
        bool _success;
        (_success, ) = payable(_to).call{value: _eth}("");
        emit WithdrewEth(_to, _eth, block.timestamp);
    }

    function withdrawOrBurnTreasuryTokens(address _to, uint256 _amount) external onlyOwner {
        if (!isVbOnboard) revert ERC20_PleaseOnboard();
        if (!isEthRaffleDone) revert ERC20_PreEquinox();
        if (_amount > trustTokensTreasury) revert ERC20_InsufficientTokens();
        if (isSwapping) revert ERC20_SwapInProgress();
        if (_amount == 0) _amount = trustTokensTreasury;
        if (_to == address(0xdead) || _to == address(0)) {
            _transferToDeadAddress(address(this), _amount);
        } else {
            super._transfer(address(this), _to, _amount);
        }
        unchecked {
            trustTokensTreasury -= _amount;
        }
    }
}

File 2 of 8 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 8 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

File 4 of 8 : ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
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;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    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);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

File 5 of 8 : SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 6 of 8 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 7 of 8 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

    /**
     * @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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}

File 8 of 8 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
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);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC20_ExceedsBuyLimit","type":"error"},{"inputs":[],"name":"ERC20_ExceedsSellLimit","type":"error"},{"inputs":[],"name":"ERC20_ExceedsWalletLimit","type":"error"},{"inputs":[],"name":"ERC20_InsufficientTokens","type":"error"},{"inputs":[],"name":"ERC20_Invalid","type":"error"},{"inputs":[],"name":"ERC20_InvalidTransfer","type":"error"},{"inputs":[],"name":"ERC20_OnlyVB","type":"error"},{"inputs":[],"name":"ERC20_PleaseOnboard","type":"error"},{"inputs":[],"name":"ERC20_PostEquinox","type":"error"},{"inputs":[],"name":"ERC20_PreEquinox","type":"error"},{"inputs":[],"name":"ERC20_RecipientWillExceedLimit","type":"error"},{"inputs":[],"name":"ERC20_SwapInProgress","type":"error"},{"inputs":[],"name":"ERC20_TradingNotOpen","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"AddedToContestants","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_buyBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_blocksHodled","type":"uint256"}],"name":"AddedToHodlers","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_vb","type":"address"}],"name":"Attaboy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_eth","type":"uint256"}],"name":"EthContestantsWinner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_eth","type":"uint256"}],"name":"EthHodlersWinner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_pair","type":"address"},{"indexed":false,"internalType":"bool","name":"_value","type":"bool"}],"name":"SetAsAMM","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_eth","type":"uint256"}],"name":"SwappedForEth","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"TokenContestantsWinner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"TransferedToDeadAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"TransferedVbShare","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_trust","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_raffle","type":"uint256"}],"name":"UpdatedBuyFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_trust","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_raffle","type":"uint256"}],"name":"UpdatedSellFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_swapAt","type":"uint256"}],"name":"UpdatedSwapRaffleAt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_swapAt","type":"uint256"}],"name":"UpdatedSwapTrustAt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"WithdrewEth","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkBools","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getBuyBlockAndBlocksCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRaffleEntrantsCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getRaffleInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUintVars","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"setAsAMM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_trust","type":"uint256"},{"internalType":"uint256","name":"_raffle","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_trust","type":"uint256"},{"internalType":"uint256","name":"_raffle","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vbOnboard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_eth","type":"uint256"}],"name":"withdrawContractEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawOrBurnTreasuryTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101206040523480156200001257600080fd5b506040518060400160405280600c81526020017f56697461426c6f636b20414900000000000000000000000000000000000000008152506040518060400160405280600681526020017f56426c6f636b00000000000000000000000000000000000000000000000000008152508160039081620000909190620011bc565b508060049081620000a29190620011bc565b505050620000c5620000b96200060060201b60201c565b6200060860201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200015e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200018491906200130d565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200021291906200130d565b6040518363ffffffff1660e01b81526004016200023192919062001350565b6020604051808303816000875af115801562000251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200027791906200130d565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050620002bf60a0516001620006ce60201b60201c565b6000620002d16200077960201b60201c565b600a620002df91906200150d565b633b9aca00620002f091906200155e565b90506000603282620003039190620015d8565b90508060c081815250506064826200031c9190620015d8565b60e0818152505080610100818152505060006103e8836200033e9190620015d8565b905080600f8190555080601081905550612710836200035e9190620015d8565b601281905550620003776005806200078260201b60201c565b6200038a6005806200083860201b60201c565b600160156000620003a0620008ee60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601660006200045f620008ee60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016016600060a05173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620005cc33846200091860201b60201c565b6001601e81905550620005f03360115462000a9060201b620011791790919060201c565b60118190555050505050620019b0565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fea602142722466e33481101052940cc8804a19f048598dfd202c25a056db2033826040516200076d91906200162d565b60405180910390a25050565b60006012905090565b600a81836200079291906200164a565b11806200079f5750600181105b15620007d7576040517f282afce900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600781905550806008819055508082620007f391906200164a565b6006819055507f527400149d6ac01fb8b30e6ec0db87f8fe9f5916304c414ac10e25ab1b064ff282826040516200082c92919062001696565b60405180910390a15050565b600a81836200084891906200164a565b1180620008555750600181105b156200088d576040517f282afce900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600a8190555080600b819055508082620008a991906200164a565b6009819055507f2d16af4e896175142e59c5e70cbae0da380f2479205d0f9c6da549b9507f64c68282604051620008e292919062001696565b60405180910390a15050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200098a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009819062001724565b60405180910390fd5b6200099e6000838362000b2f60201b60201c565b8060026000828254620009b291906200164a565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000a0991906200164a565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000a70919062001746565b60405180910390a362000a8c6000838362000b3460201b60201c565b5050565b60008062000aac8460001c62000b3960201b620011ed1760201c565b62000ac24262000b3960201b620011ed1760201c565b62000ad88562000cb260201b6200134d1760201c565b60405160200162000aec93929190620017d1565b60405160208183030381529060405290508060405160200162000b10919062001808565b6040516020818303038152906040528051906020012091505092915050565b505050565b505050565b60606000820362000b82576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905062000cad565b600082905060005b6000821462000bba57808062000ba09062001821565b915050600a8262000bb29190620015d8565b915062000b8a565b60008167ffffffffffffffff81111562000bd95762000bd862000f4d565b5b6040519080825280601f01601f19166020018201604052801562000c0c5781602001600182028036833780820191505090505b5090505b6000851462000ca65760018262000c2891906200186e565b9150600a8562000c399190620018a9565b603062000c4791906200164a565b60f81b81838151811062000c605762000c5f620018e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8562000c9e9190620015d8565b945062000c10565b8093505050505b919050565b606062000ce08273ffffffffffffffffffffffffffffffffffffffff16601460ff1662000ce760201b60201c565b9050919050565b60606000600283600262000cfc91906200155e565b62000d0891906200164a565b67ffffffffffffffff81111562000d245762000d2362000f4d565b5b6040519080825280601f01601f19166020018201604052801562000d575781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811062000d925762000d91620018e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811062000df95762000df8620018e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600262000e3b91906200155e565b62000e4791906200164a565b90505b600181111562000ef1577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811062000e8d5762000e8c620018e1565b5b1a60f81b82828151811062000ea75762000ea6620018e1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508062000ee99062001910565b905062000e4a565b506000841462000f38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000f2f906200198e565b60405180910390fd5b8091505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000fc457607f821691505b60208210810362000fda5762000fd962000f7c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620010447fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262001005565b62001050868362001005565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200109d62001097620010918462001068565b62001072565b62001068565b9050919050565b6000819050919050565b620010b9836200107c565b620010d1620010c882620010a4565b84845462001012565b825550505050565b600090565b620010e8620010d9565b620010f5818484620010ae565b505050565b5b818110156200111d5762001111600082620010de565b600181019050620010fb565b5050565b601f8211156200116c57620011368162000fe0565b620011418462000ff5565b8101602085101562001151578190505b62001169620011608562000ff5565b830182620010fa565b50505b505050565b600082821c905092915050565b6000620011916000198460080262001171565b1980831691505092915050565b6000620011ac83836200117e565b9150826002028217905092915050565b620011c78262000f42565b67ffffffffffffffff811115620011e357620011e262000f4d565b5b620011ef825462000fab565b620011fc82828562001121565b600060209050601f8311600181146200123457600084156200121f578287015190505b6200122b85826200119e565b8655506200129b565b601f198416620012448662000fe0565b60005b828110156200126e5784890151825560018201915060208501945060208101905062001247565b868310156200128e57848901516200128a601f8916826200117e565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620012d582620012a8565b9050919050565b620012e781620012c8565b8114620012f357600080fd5b50565b6000815190506200130781620012dc565b92915050565b600060208284031215620013265762001325620012a3565b5b60006200133684828501620012f6565b91505092915050565b6200134a81620012c8565b82525050565b60006040820190506200136760008301856200133f565b6200137660208301846200133f565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b60018511156200140b57808604811115620013e357620013e26200137d565b5b6001851615620013f35780820291505b80810290506200140385620013ac565b9450620013c3565b94509492505050565b600082620014265760019050620014f9565b81620014365760009050620014f9565b81600181146200144f57600281146200145a5762001490565b6001915050620014f9565b60ff8411156200146f576200146e6200137d565b5b8360020a9150848211156200148957620014886200137d565b5b50620014f9565b5060208310610133831016604e8410600b8410161715620014ca5782820a905083811115620014c457620014c36200137d565b5b620014f9565b620014d98484846001620013b9565b92509050818404811115620014f357620014f26200137d565b5b81810290505b9392505050565b600060ff82169050919050565b60006200151a8262001068565b9150620015278362001500565b9250620015567fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462001414565b905092915050565b60006200156b8262001068565b9150620015788362001068565b9250828202620015888162001068565b91508282048414831517620015a257620015a16200137d565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620015e58262001068565b9150620015f28362001068565b925082620016055762001604620015a9565b5b828204905092915050565b60008115159050919050565b620016278162001610565b82525050565b60006020820190506200164460008301846200161c565b92915050565b6000620016578262001068565b9150620016648362001068565b92508282019050808211156200167f576200167e6200137d565b5b92915050565b620016908162001068565b82525050565b6000604082019050620016ad600083018562001685565b620016bc602083018462001685565b9392505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006200170c601f83620016c3565b91506200171982620016d4565b602082019050919050565b600060208201905081810360008301526200173f81620016fd565b9050919050565b60006020820190506200175d600083018462001685565b92915050565b600081905092915050565b60005b838110156200178e57808201518184015260208101905062001771565b60008484015250505050565b6000620017a78262000f42565b620017b3818562001763565b9350620017c58185602086016200176e565b80840191505092915050565b6000620017df82866200179a565b9150620017ed82856200179a565b9150620017fb82846200179a565b9150819050949350505050565b60006200181682846200179a565b915081905092915050565b60006200182e8262001068565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036200186357620018626200137d565b5b600182019050919050565b60006200187b8262001068565b9150620018888362001068565b9250828203905081811115620018a357620018a26200137d565b5b92915050565b6000620018b68262001068565b9150620018c38362001068565b925082620018d657620018d5620015a9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006200191d8262001068565b9150600082036200193357620019326200137d565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600062001976602083620016c3565b915062001983826200193e565b602082019050919050565b60006020820190508181036000830152620019a98162001967565b9050919050565b60805160a05160c05160e0516101005161506e62001a0a60003960008181611a05015261387101526000611cac01526000611b8f01526000612305015260008181613dfd01528181613ee30152613f0a015261506e6000f3fe6080604052600436106101855760003560e01c806382c2d179116100d1578063c9567bf91161008a578063e61ff9f111610064578063e61ff9f1146105b1578063f2fde38b146105dd578063fc2ab0dc14610606578063ff287be11461062f5761018c565b8063c9567bf914610531578063cf45fbe014610548578063dd62ed3e146105745761018c565b806382c2d179146103ef5780638da5cb5b1461042357806395d89b411461044e578063a3331b0414610479578063a457c2d7146104b7578063a9059cbb146104f45761018c565b8063395093511161013e57806370a082311161011857806370a0823114610344578063715018a614610381578063715efe1e14610398578063792f1e3c146103af5761018c565b806339509351146102b55780633dbc40fe146102f257806366ca9b831461031b5761018c565b806302dbd8f81461019157806306fdde03146101ba578063095ea7b3146101e557806318160ddd1461022257806323b872dd1461024d578063313ce5671461028a5761018c565b3661018c57005b600080fd5b34801561019d57600080fd5b506101b860048036038101906101b391906140ec565b610658565b005b3480156101c657600080fd5b506101cf61066e565b6040516101dc91906141bc565b60405180910390f35b3480156101f157600080fd5b5061020c6004803603810190610207919061423c565b610700565b6040516102199190614297565b60405180910390f35b34801561022e57600080fd5b50610237610723565b60405161024491906142c1565b60405180910390f35b34801561025957600080fd5b50610274600480360381019061026f91906142dc565b61072d565b6040516102819190614297565b60405180910390f35b34801561029657600080fd5b5061029f61075c565b6040516102ac919061434b565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d7919061423c565b610765565b6040516102e99190614297565b60405180910390f35b3480156102fe57600080fd5b5061031960048036038101906103149190614392565b61079c565b005b34801561032757600080fd5b50610342600480360381019061033d91906140ec565b6107b2565b005b34801561035057600080fd5b5061036b600480360381019061036691906143d2565b6107c8565b60405161037891906142c1565b60405180910390f35b34801561038d57600080fd5b50610396610810565b005b3480156103a457600080fd5b506103ad610824565b005b3480156103bb57600080fd5b506103d660048036038101906103d191906143d2565b61093b565b6040516103e694939291906143ff565b60405180910390f35b3480156103fb57600080fd5b50610404610a31565b60405161041a9a99989796959493929190614444565b60405180910390f35b34801561042f57600080fd5b50610438610a7e565b60405161044591906144ef565b60405180910390f35b34801561045a57600080fd5b50610463610aa8565b60405161047091906141bc565b60405180910390f35b34801561048557600080fd5b506104a0600480360381019061049b91906143d2565b610b3a565b6040516104ae92919061450a565b60405180910390f35b3480156104c357600080fd5b506104de60048036038101906104d9919061423c565b610c2f565b6040516104eb9190614297565b60405180910390f35b34801561050057600080fd5b5061051b6004803603810190610516919061423c565b610ca6565b6040516105289190614297565b60405180910390f35b34801561053d57600080fd5b50610546610cc9565b005b34801561055457600080fd5b5061055d610d09565b60405161056b92919061450a565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190614533565b610d20565b6040516105a891906142c1565b60405180910390f35b3480156105bd57600080fd5b506105c6610da7565b6040516105d4929190614573565b60405180910390f35b3480156105e957600080fd5b5061060460048036038101906105ff91906143d2565b610dd2565b005b34801561061257600080fd5b5061062d6004803603810190610628919061423c565b610e55565b005b34801561063b57600080fd5b506106566004803603810190610651919061423c565b610fb8565b005b61066061137a565b61066a82826113f8565b5050565b60606003805461067d906145cb565b80601f01602080910402602001604051908101604052809291908181526020018280546106a9906145cb565b80156106f65780601f106106cb576101008083540402835291602001916106f6565b820191906000526020600020905b8154815290600101906020018083116106d957829003601f168201915b5050505050905090565b60008061070b6114a6565b90506107188185856114ae565b600191505092915050565b6000600254905090565b6000806107386114a6565b9050610745858285611677565b610750858585611703565b60019150509392505050565b60006012905090565b6000806107706114a6565b90506107918185856107828589610d20565b61078c919061462b565b6114ae565b600191505092915050565b6107a461137a565b6107ae828261240c565b5050565b6107ba61137a565b6107c482826124b5565b5050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61081861137a565b6108226000612563565b565b73ab5801a7d398351b8be11c439e05c5b3259aec9b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461089d576040517fcd2c267800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63650e2a804211156108db576040517f134cce3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600560176101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167fd64a705952230327eefca8ce14138f52c6ee581f30d6b4e3b1f3726b82e9f47060405160405180910390a2565b600080600080601e54601e54601d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414601860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16601960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1693509350935093509193509193565b600080600080600080600080600080600f54601054601254600d54600c54600e54600754600854600a54600b54995099509950995099509950995099509950995090919293949596979899565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610ab7906145cb565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae3906145cb565b8015610b305780601f10610b0557610100808354040283529160200191610b30565b820191906000526020600020905b815481529060010190602001808311610b1357829003601f168201915b5050505050905090565b600080601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610b9a5760008091509150610c2a565b601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205443610c25919061465f565b915091505b915091565b600080610c3a6114a6565b90506000610c488286610d20565b905083811015610c8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8490614705565b60405180910390fd5b610c9a82868684036114ae565b60019250505092915050565b600080610cb16114a6565b9050610cbe818585611703565b600191505092915050565b610cd161137a565b6001600560166101000a81548160ff0219169083151502179055506000600560186101000a81548160ff021916908315150217905550565b600080601380549050601480549050915091509091565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600080600560189054906101000a900460ff16600560179054906101000a900460ff16915091509091565b610dda61137a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4090614797565b60405180910390fd5b610e5281612563565b50565b610e5d61137a565b600560179054906101000a900460ff16610ea3576040517fdc5edff700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560149054906101000a900460ff16610ee9576040517fb1e048c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008103610ef5574790505b60008273ffffffffffffffffffffffffffffffffffffffff1682604051610f1b906147e8565b60006040518083038185875af1925050503d8060008114610f58576040519150601f19603f3d011682016040523d82523d6000602084013e610f5d565b606091505b5050809150508273ffffffffffffffffffffffffffffffffffffffff167f0a4cb027e693fb13f4c43cc4bf82b4cd2cc38c1cca60d0180e3de60e1113717b8342604051610fab92919061450a565b60405180910390a2505050565b610fc061137a565b600560179054906101000a900460ff16611006576040517fdc5edff700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560149054906101000a900460ff1661104c576040517fb1e048c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54811115611088576040517f190e059100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560189054906101000a900460ff16156110cf576040517fbb941a1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081036110dd57600e5490505b61dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806111455750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15611159576111543082612629565b611165565b611164308383612688565b5b80600e600082825403925050819055505050565b6000806111888460001c6111ed565b611191426111ed565b61119a8561134d565b6040516020016111ac93929190614839565b6040516020818303038152906040529050806040516020016111ce919061486a565b6040516020818303038152906040528051906020012091505092915050565b606060008203611234576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611348565b600082905060005b6000821461126657808061124f90614881565b915050600a8261125f91906148f8565b915061123c565b60008167ffffffffffffffff81111561128257611281614929565b5b6040519080825280601f01601f1916602001820160405280156112b45781602001600182028036833780820191505090505b5090505b60008514611341576001826112cd919061465f565b9150600a856112dc9190614958565b60306112e8919061462b565b60f81b8183815181106112fe576112fd614989565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561133a91906148f8565b94506112b8565b8093505050505b919050565b60606113738273ffffffffffffffffffffffffffffffffffffffff16601460ff16612907565b9050919050565b6113826114a6565b73ffffffffffffffffffffffffffffffffffffffff166113a0610a7e565b73ffffffffffffffffffffffffffffffffffffffff16146113f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ed90614a04565b60405180910390fd5b565b600a8183611406919061462b565b11806114125750600181105b15611449576040517f282afce900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600a8190555080600b819055508082611463919061462b565b6009819055507f2d16af4e896175142e59c5e70cbae0da380f2479205d0f9c6da549b9507f64c6828260405161149a92919061450a565b60405180910390a15050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361151d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151490614a96565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361158c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158390614b28565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161166a91906142c1565b60405180910390a3505050565b60006116838484610d20565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146116fd57818110156116ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e690614b94565b60405180910390fd5b6116fc84848484036114ae565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061176a5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806117755750600081145b156117ac576040517f4c7d442100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ab5801a7d398351b8be11c439e05c5b3259aec9b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480156118085750600560179054906101000a900460ff16155b1561183f576040517fdc5edff700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118835761187e8382612629565b612407565b6000806000601760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506000601760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905063650e2a8042118015611939575081155b80156119525750600560149054906101000a900460ff16155b156119f157611962876000612b43565b600560179054906101000a900460ff1661198f57611982600060026124b5565b61198e600060026113f8565b5b6001600560186101000a81548160ff0219169083151502179055506119b26130b9565b6000600560186101000a81548160ff0219169083151502179055506001600560146101000a81548160ff02191690831515021790555060019350600192505b60006119fc876107c8565b905060008060007f00000000000000000000000000000000000000000000000000000000000000009050600080601560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015611acd5750601560008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611d6057600560169054906101000a900460ff161580611afa5750600560189054906101000a900460ff165b15611b31576040517f850336b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b878015611b885750601660008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611c4c577f00000000000000000000000000000000000000000000000000000000000000008b1115611be7576040517f71caed7400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065493506064848c611bfa9190614bb4565b611c0491906148f8565b9450848b870103905082811115611c47576040517f9acd091700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d5f565b601660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015611ca35750865b8015611cce57507f00000000000000000000000000000000000000000000000000000000000000008b115b15611d05576040517f43190ac500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87158015611d11575086155b8015611d27575082868c611d25919061462b565b115b15611d5e576040517f74052fc200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b600f54600c54101580611d775750601054600d5410155b8015611d81575087155b8015611dd75750601560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611e2d5750601560008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611e455750600560159054906101000a900460ff165b15611e9c57611e558d6000612b43565b6001600560186101000a81548160ff021916908315150217905550611e786136e3565b809a50819b5050506000600560186101000a81548160ff0219169083151502179055505b6000600560189054906101000a900460ff16159050601560008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611f525750601560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611f5c57600090505b80156121ad576000888015611f7357506000600954115b15611fc457600060095490506064818f0281611f9257611f916148c9565b5b04975080600a54890281611fa957611fa86148c9565b5b049150818803600d6000828254019250508190555050612001565b898015611fd15750600086115b156120005785600754880281611fea57611fe96148c9565b5b049050808703600d600082825401925050819055505b5b60008111156120445760006002828161201d5761201c6148c9565b5b04905080600e60008282540192505081905550808203600c60008282540192505081905550505b60008711156121ab576120588f3089612688565b600560159054906101000a900460ff166121a55761207461394f565b8461207e306107c8565b106121a45760008561208f306107c8565b612099919061465f565b905060006120ba73ab5801a7d398351b8be11c439e05c5b3259aec9b6107c8565b1115612103576120dd73ab5801a7d398351b8be11c439e05c5b3259aec9b6107c8565b860395506120fe73ab5801a7d398351b8be11c439e05c5b3259aec9b6107c8565b810190505b6121223073ab5801a7d398351b8be11c439e05c5b3259aec9b88612688565b73ab5801a7d398351b8be11c439e05c5b3259aec9b73ffffffffffffffffffffffffffffffffffffffff167fbd930dfdee75cecc873288bcf7176fea15ad28535d3285813018822193a2baa060405160405180910390a26121833082612629565b6001600560156101000a81548160ff02191690831515021790555060019450505b5b868d039c505b505b6121b88e8e8e612688565b88801561220f5750601660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561221d57506012548c10155b156122305761222b8d613969565b6122ac565b601660008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156122875750875b8061229a575088158015612299575087155b5b156122ab576122aa8e6001612b43565b5b5b3073ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff16036122f0578b600e600082825401925050819055505b89806122f957508a5b156123de5760006123297f00000000000000000000000000000000000000000000000000000000000000006107c8565b905060006103e88261233b91906148f8565b90508b1561239657806010819055506127108261235891906148f8565b6012819055507f14ac008fba1637f469366af4d14cf89db3a663c422612977c3f50bc4f3b491a18160405161238d91906142c1565b60405180910390a15b8c156123db5780600f819055507f2f7c7becc8a060dce66180a39d01d0ffebf04de28aba59ecea90ad84692bf234816040516123d291906142c1565b60405180910390a15b50505b82156123fb576123ef6002806124b5565b6123fa6002806113f8565b5b50505050505050505050505b505050565b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fea602142722466e33481101052940cc8804a19f048598dfd202c25a056db2033826040516124a99190614297565b60405180910390a25050565b600a81836124c3919061462b565b11806124cf5750600181105b15612506576040517f282afce900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600781905550806008819055508082612520919061462b565b6006819055507f527400149d6ac01fb8b30e6ec0db87f8fe9f5916304c414ac10e25ab1b064ff2828260405161255792919061450a565b60405180910390a15050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126368261dead83612688565b8173ffffffffffffffffffffffffffffffffffffffff167f72ee4eacc5e161ffbdcaeba5dd5e8d6d27ae46f9dddf2997a4e91935a6518b7b8260405161267c91906142c1565b60405180910390a25050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036126f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ee90614c68565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275d90614cfa565b60405180910390fd5b612771838383613c98565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156127f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ee90614d8c565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461288a919061462b565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128ee91906142c1565b60405180910390a3612901848484613c9d565b50505050565b60606000600283600261291a9190614bb4565b612924919061462b565b67ffffffffffffffff81111561293d5761293c614929565b5b6040519080825280601f01601f19166020018201604052801561296f5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106129a7576129a6614989565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612a0b57612a0a614989565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612a4b9190614bb4565b612a55919061462b565b90505b6001811115612af5577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612a9757612a96614989565b5b1a60f81b828281518110612aae57612aad614989565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612aee90614dac565b9050612a58565b5060008414612b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3090614e21565b60405180910390fd5b8091505092915050565b8015612b855760008060024281612b5d57612b5c6148c9565b5b061490508015612b8357612b7c3360115461117990919063ffffffff16565b6011819055505b505b601e54601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403612df95760006013805480602002602001604051908101604052809291908181526020018280548015612c5157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612c07575b5050505050905060008160018351612c69919061465f565b81518110612c7a57612c79614989565b5b602002602001015190506000601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508160138281548110612cdd57612cdc614989565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506013805480612d7b57612d7a614e41565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556000601d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050505b600560149054906101000a900460ff16158015612e5f5750601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8015612eb55750601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156130b5576000601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544303905062061a808110613016576014839080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff167fa166ab0d399fb2afd24c2174e0ec2e8eb37a2687ac4e9546097ae6d2892edba8438360405161300d92919061450a565b60405180910390a25b6000601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000601c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b5050565b60004711156136e1576000601480548060200260200160405190810160405280929190818152602001828054801561314657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116130fc575b50505050509050600060138054806020026020016040519081016040528092919081815260200182805480156131d157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311613187575b5050505050905060008060008451905060008451905060006005905060008284019050600060199050600560179054906101000a900460ff1661321357606490505b6000606482476132239190614bb4565b61322d91906148f8565b905083831015613381576000831461324757829350613380565b60019650600560179054906101000a900460ff1661337f5773ab5801a7d398351b8be11c439e05c5b3259aec9b73ffffffffffffffffffffffffffffffffffffffff1681604051613297906147e8565b60006040518083038185875af1925050503d80600081146132d4576040519150601f19603f3d011682016040523d82523d6000602084013e6132d9565b606091505b5050809850503373ffffffffffffffffffffffffffffffffffffffff167fc67d35f1593b850911248d49d6fc4439eb0fffb0b194e83abf59e436fa0daa0f60028361332491906148f8565b60405161333191906142c1565b60405180910390a27fef6bce0c4e1351aa0a33508979ccdb50e7573e4110b35d78ab73d9e27867396d3360028361336891906148f8565b604051613376929190614e70565b60405180910390a15b5b5b8661366357600080858361339591906148f8565b905060008714613495576133b43360115461117990919063ffffffff16565b6011819055506133cf6011548c613ca290919063ffffffff16565b91508173ffffffffffffffffffffffffffffffffffffffff16816040516133f5906147e8565b60006040518083038185875af1925050503d8060008114613432576040519150601f19603f3d011682016040523d82523d6000602084013e613437565b606091505b5050809a50508173ffffffffffffffffffffffffffffffffffffffff167fc67d35f1593b850911248d49d6fc4439eb0fffb0b194e83abf59e436fa0daa0f8260405161348391906142c1565b60405180910390a28580600190039650505b60008814613660576000600190505b86811161365e576134c03360115461117990919063ffffffff16565b6011819055506134db6011548e613ca290919063ffffffff16565b9250601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613659576001601a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086811480156135a25750600560179054906101000a900460ff16155b156135ab574791505b8273ffffffffffffffffffffffffffffffffffffffff16826040516135cf906147e8565b60006040518083038185875af1925050503d806000811461360c576040519150601f19603f3d011682016040523d82523d6000602084013e613611565b606091505b5050809b50507fef6bce0c4e1351aa0a33508979ccdb50e7573e4110b35d78ab73d9e27867396d8383604051613648929190614e70565b60405180910390a180806001019150505b6134a4565b505b50505b61368c30606484613673306107c8565b61367d9190614bb4565b61368791906148f8565b612629565b613694613cea565b600560179054906101000a900460ff16156136cd576136b2306107c8565b600e819055506000600c819055506000600d819055506136d6565b6136d561394f565b5b505050505050505050505b565b600080600080600c5490506000600d5490506000600f54905060006010549050600061370e306107c8565b14806137245750818410801561372357508083105b5b1561373a5760008096509650505050505061394b565b81841061375e578184038501945061375182613d5e565b6000600c81905550600196505b80831061393157808303850194506137813360115461117990919063ffffffff16565b6011819055506000613824601154601380548060200260200160405190810160405280929190818152602001828054801561381157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116137c7575b5050505050613ca290919063ffffffff16565b9050600082905061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146138c457600061386b836107c8565b905060007f0000000000000000000000000000000000000000000000000000000000000000905080838361389f919061462b565b11156138b2578181039250828503890198505b6138bd308585612688565b50506138ca565b80870196505b6138d2613cea565b8173ffffffffffffffffffffffffffffffffffffffff167ff39ca55b233425232beaa10cf8eab4bb36b0cfc1681dab52a121786f06f47d12824260405161391a92919061450a565b60405180910390a26000600d819055506001975050505b6000851115613945576139443086612629565b5b50505050505b9091565b6000600c819055506000600d819055506000600e81905550565b601e54601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540315613c9557600060138054905090506013829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601e54601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f199b6f101a1a99898ef5c07ebd4bbcd9b068c09176b624ec06f0b1d0a3acf20f60405160405180910390a2600560149054906101000a900460ff16158015613b535750601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015613ba95750601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15613c93576001601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403613c925743601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b505b50565b505050565b505050565b6000808351905060008103613cbc5761dead915050613ce4565b83613cc78483613ff1565b81518110613cd857613cd7614989565b5b60200260200101519150505b92915050565b600067ffffffffffffffff811115613d0557613d04614929565b5b604051908082528060200260200182016040528015613d335781602001602082028036833780820191505090505b5060139080519060200190613d4992919061400a565b50601e60008154809291906001019190505550565b6000600267ffffffffffffffff811115613d7b57613d7a614929565b5b604051908082528060200260200182016040528015613da95781602001602082028036833780820191505090505b5090503081600081518110613dc157613dc0614989565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613e66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e8a9190614eae565b81600181518110613e9e57613e9d614989565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000479050613f08307f0000000000000000000000000000000000000000000000000000000000000000856114ae565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008530426040518663ffffffff1660e01b8152600401613f6a959493929190614fde565b600060405180830381600087803b158015613f8457600080fd5b505af1158015613f98573d6000803e3d6000fd5b505050506000479050600082821115613fb15782820390505b7fe845924c07c89c17ac04375b80b3ffdf7507a0d469f31b68a9a63b3abbb05e948582604051613fe292919061450a565b60405180910390a15050505050565b6000818360001c6140029190614958565b905092915050565b828054828255906000526020600020908101928215614083579160200282015b828111156140825782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019061402a565b5b5090506140909190614094565b5090565b5b808211156140ad576000816000905550600101614095565b5090565b600080fd5b6000819050919050565b6140c9816140b6565b81146140d457600080fd5b50565b6000813590506140e6816140c0565b92915050565b60008060408385031215614103576141026140b1565b5b6000614111858286016140d7565b9250506020614122858286016140d7565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561416657808201518184015260208101905061414b565b60008484015250505050565b6000601f19601f8301169050919050565b600061418e8261412c565b6141988185614137565b93506141a8818560208601614148565b6141b181614172565b840191505092915050565b600060208201905081810360008301526141d68184614183565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614209826141de565b9050919050565b614219816141fe565b811461422457600080fd5b50565b60008135905061423681614210565b92915050565b60008060408385031215614253576142526140b1565b5b600061426185828601614227565b9250506020614272858286016140d7565b9150509250929050565b60008115159050919050565b6142918161427c565b82525050565b60006020820190506142ac6000830184614288565b92915050565b6142bb816140b6565b82525050565b60006020820190506142d660008301846142b2565b92915050565b6000806000606084860312156142f5576142f46140b1565b5b600061430386828701614227565b935050602061431486828701614227565b9250506040614325868287016140d7565b9150509250925092565b600060ff82169050919050565b6143458161432f565b82525050565b6000602082019050614360600083018461433c565b92915050565b61436f8161427c565b811461437a57600080fd5b50565b60008135905061438c81614366565b92915050565b600080604083850312156143a9576143a86140b1565b5b60006143b785828601614227565b92505060206143c88582860161437d565b9150509250929050565b6000602082840312156143e8576143e76140b1565b5b60006143f684828501614227565b91505092915050565b600060808201905061441460008301876142b2565b6144216020830186614288565b61442e6040830185614288565b61443b6060830184614288565b95945050505050565b60006101408201905061445a600083018d6142b2565b614467602083018c6142b2565b614474604083018b6142b2565b614481606083018a6142b2565b61448e60808301896142b2565b61449b60a08301886142b2565b6144a860c08301876142b2565b6144b560e08301866142b2565b6144c36101008301856142b2565b6144d16101208301846142b2565b9b9a5050505050505050505050565b6144e9816141fe565b82525050565b600060208201905061450460008301846144e0565b92915050565b600060408201905061451f60008301856142b2565b61452c60208301846142b2565b9392505050565b6000806040838503121561454a576145496140b1565b5b600061455885828601614227565b925050602061456985828601614227565b9150509250929050565b60006040820190506145886000830185614288565b6145956020830184614288565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806145e357607f821691505b6020821081036145f6576145f561459c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614636826140b6565b9150614641836140b6565b9250828201905080821115614659576146586145fc565b5b92915050565b600061466a826140b6565b9150614675836140b6565b925082820390508181111561468d5761468c6145fc565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006146ef602583614137565b91506146fa82614693565b604082019050919050565b6000602082019050818103600083015261471e816146e2565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614781602683614137565b915061478c82614725565b604082019050919050565b600060208201905081810360008301526147b081614774565b9050919050565b600081905092915050565b50565b60006147d26000836147b7565b91506147dd826147c2565b600082019050919050565b60006147f3826147c5565b9150819050919050565b600081905092915050565b60006148138261412c565b61481d81856147fd565b935061482d818560208601614148565b80840191505092915050565b60006148458286614808565b91506148518285614808565b915061485d8284614808565b9150819050949350505050565b60006148768284614808565b915081905092915050565b600061488c826140b6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148be576148bd6145fc565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614903826140b6565b915061490e836140b6565b92508261491e5761491d6148c9565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000614963826140b6565b915061496e836140b6565b92508261497e5761497d6148c9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006149ee602083614137565b91506149f9826149b8565b602082019050919050565b60006020820190508181036000830152614a1d816149e1565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614a80602483614137565b9150614a8b82614a24565b604082019050919050565b60006020820190508181036000830152614aaf81614a73565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b12602283614137565b9150614b1d82614ab6565b604082019050919050565b60006020820190508181036000830152614b4181614b05565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000614b7e601d83614137565b9150614b8982614b48565b602082019050919050565b60006020820190508181036000830152614bad81614b71565b9050919050565b6000614bbf826140b6565b9150614bca836140b6565b9250828202614bd8816140b6565b91508282048414831517614bef57614bee6145fc565b5b5092915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614c52602583614137565b9150614c5d82614bf6565b604082019050919050565b60006020820190508181036000830152614c8181614c45565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614ce4602383614137565b9150614cef82614c88565b604082019050919050565b60006020820190508181036000830152614d1381614cd7565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614d76602683614137565b9150614d8182614d1a565b604082019050919050565b60006020820190508181036000830152614da581614d69565b9050919050565b6000614db7826140b6565b915060008203614dca57614dc96145fc565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000614e0b602083614137565b9150614e1682614dd5565b602082019050919050565b60006020820190508181036000830152614e3a81614dfe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000604082019050614e8560008301856144e0565b614e9260208301846142b2565b9392505050565b600081519050614ea881614210565b92915050565b600060208284031215614ec457614ec36140b1565b5b6000614ed284828501614e99565b91505092915050565b6000819050919050565b6000819050919050565b6000614f0a614f05614f0084614edb565b614ee5565b6140b6565b9050919050565b614f1a81614eef565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614f55816141fe565b82525050565b6000614f678383614f4c565b60208301905092915050565b6000602082019050919050565b6000614f8b82614f20565b614f958185614f2b565b9350614fa083614f3c565b8060005b83811015614fd1578151614fb88882614f5b565b9750614fc383614f73565b925050600181019050614fa4565b5085935050505092915050565b600060a082019050614ff360008301886142b2565b6150006020830187614f11565b81810360408301526150128186614f80565b905061502160608301856144e0565b61502e60808301846142b2565b969550505050505056fea2646970667358221220d2705d9525aa1c1842aee8b28d086d1d2654fb3ab3e98e6a1b5651865b22a7c364736f6c63430008120033

Deployed Bytecode

0x6080604052600436106101855760003560e01c806382c2d179116100d1578063c9567bf91161008a578063e61ff9f111610064578063e61ff9f1146105b1578063f2fde38b146105dd578063fc2ab0dc14610606578063ff287be11461062f5761018c565b8063c9567bf914610531578063cf45fbe014610548578063dd62ed3e146105745761018c565b806382c2d179146103ef5780638da5cb5b1461042357806395d89b411461044e578063a3331b0414610479578063a457c2d7146104b7578063a9059cbb146104f45761018c565b8063395093511161013e57806370a082311161011857806370a0823114610344578063715018a614610381578063715efe1e14610398578063792f1e3c146103af5761018c565b806339509351146102b55780633dbc40fe146102f257806366ca9b831461031b5761018c565b806302dbd8f81461019157806306fdde03146101ba578063095ea7b3146101e557806318160ddd1461022257806323b872dd1461024d578063313ce5671461028a5761018c565b3661018c57005b600080fd5b34801561019d57600080fd5b506101b860048036038101906101b391906140ec565b610658565b005b3480156101c657600080fd5b506101cf61066e565b6040516101dc91906141bc565b60405180910390f35b3480156101f157600080fd5b5061020c6004803603810190610207919061423c565b610700565b6040516102199190614297565b60405180910390f35b34801561022e57600080fd5b50610237610723565b60405161024491906142c1565b60405180910390f35b34801561025957600080fd5b50610274600480360381019061026f91906142dc565b61072d565b6040516102819190614297565b60405180910390f35b34801561029657600080fd5b5061029f61075c565b6040516102ac919061434b565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d7919061423c565b610765565b6040516102e99190614297565b60405180910390f35b3480156102fe57600080fd5b5061031960048036038101906103149190614392565b61079c565b005b34801561032757600080fd5b50610342600480360381019061033d91906140ec565b6107b2565b005b34801561035057600080fd5b5061036b600480360381019061036691906143d2565b6107c8565b60405161037891906142c1565b60405180910390f35b34801561038d57600080fd5b50610396610810565b005b3480156103a457600080fd5b506103ad610824565b005b3480156103bb57600080fd5b506103d660048036038101906103d191906143d2565b61093b565b6040516103e694939291906143ff565b60405180910390f35b3480156103fb57600080fd5b50610404610a31565b60405161041a9a99989796959493929190614444565b60405180910390f35b34801561042f57600080fd5b50610438610a7e565b60405161044591906144ef565b60405180910390f35b34801561045a57600080fd5b50610463610aa8565b60405161047091906141bc565b60405180910390f35b34801561048557600080fd5b506104a0600480360381019061049b91906143d2565b610b3a565b6040516104ae92919061450a565b60405180910390f35b3480156104c357600080fd5b506104de60048036038101906104d9919061423c565b610c2f565b6040516104eb9190614297565b60405180910390f35b34801561050057600080fd5b5061051b6004803603810190610516919061423c565b610ca6565b6040516105289190614297565b60405180910390f35b34801561053d57600080fd5b50610546610cc9565b005b34801561055457600080fd5b5061055d610d09565b60405161056b92919061450a565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190614533565b610d20565b6040516105a891906142c1565b60405180910390f35b3480156105bd57600080fd5b506105c6610da7565b6040516105d4929190614573565b60405180910390f35b3480156105e957600080fd5b5061060460048036038101906105ff91906143d2565b610dd2565b005b34801561061257600080fd5b5061062d6004803603810190610628919061423c565b610e55565b005b34801561063b57600080fd5b506106566004803603810190610651919061423c565b610fb8565b005b61066061137a565b61066a82826113f8565b5050565b60606003805461067d906145cb565b80601f01602080910402602001604051908101604052809291908181526020018280546106a9906145cb565b80156106f65780601f106106cb576101008083540402835291602001916106f6565b820191906000526020600020905b8154815290600101906020018083116106d957829003601f168201915b5050505050905090565b60008061070b6114a6565b90506107188185856114ae565b600191505092915050565b6000600254905090565b6000806107386114a6565b9050610745858285611677565b610750858585611703565b60019150509392505050565b60006012905090565b6000806107706114a6565b90506107918185856107828589610d20565b61078c919061462b565b6114ae565b600191505092915050565b6107a461137a565b6107ae828261240c565b5050565b6107ba61137a565b6107c482826124b5565b5050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61081861137a565b6108226000612563565b565b73ab5801a7d398351b8be11c439e05c5b3259aec9b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461089d576040517fcd2c267800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63650e2a804211156108db576040517f134cce3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600560176101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167fd64a705952230327eefca8ce14138f52c6ee581f30d6b4e3b1f3726b82e9f47060405160405180910390a2565b600080600080601e54601e54601d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414601860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16601960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1693509350935093509193509193565b600080600080600080600080600080600f54601054601254600d54600c54600e54600754600854600a54600b54995099509950995099509950995099509950995090919293949596979899565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610ab7906145cb565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae3906145cb565b8015610b305780601f10610b0557610100808354040283529160200191610b30565b820191906000526020600020905b815481529060010190602001808311610b1357829003601f168201915b5050505050905090565b600080601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610b9a5760008091509150610c2a565b601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205443610c25919061465f565b915091505b915091565b600080610c3a6114a6565b90506000610c488286610d20565b905083811015610c8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8490614705565b60405180910390fd5b610c9a82868684036114ae565b60019250505092915050565b600080610cb16114a6565b9050610cbe818585611703565b600191505092915050565b610cd161137a565b6001600560166101000a81548160ff0219169083151502179055506000600560186101000a81548160ff021916908315150217905550565b600080601380549050601480549050915091509091565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600080600560189054906101000a900460ff16600560179054906101000a900460ff16915091509091565b610dda61137a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4090614797565b60405180910390fd5b610e5281612563565b50565b610e5d61137a565b600560179054906101000a900460ff16610ea3576040517fdc5edff700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560149054906101000a900460ff16610ee9576040517fb1e048c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008103610ef5574790505b60008273ffffffffffffffffffffffffffffffffffffffff1682604051610f1b906147e8565b60006040518083038185875af1925050503d8060008114610f58576040519150601f19603f3d011682016040523d82523d6000602084013e610f5d565b606091505b5050809150508273ffffffffffffffffffffffffffffffffffffffff167f0a4cb027e693fb13f4c43cc4bf82b4cd2cc38c1cca60d0180e3de60e1113717b8342604051610fab92919061450a565b60405180910390a2505050565b610fc061137a565b600560179054906101000a900460ff16611006576040517fdc5edff700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560149054906101000a900460ff1661104c576040517fb1e048c100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54811115611088576040517f190e059100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560189054906101000a900460ff16156110cf576040517fbb941a1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081036110dd57600e5490505b61dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806111455750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15611159576111543082612629565b611165565b611164308383612688565b5b80600e600082825403925050819055505050565b6000806111888460001c6111ed565b611191426111ed565b61119a8561134d565b6040516020016111ac93929190614839565b6040516020818303038152906040529050806040516020016111ce919061486a565b6040516020818303038152906040528051906020012091505092915050565b606060008203611234576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611348565b600082905060005b6000821461126657808061124f90614881565b915050600a8261125f91906148f8565b915061123c565b60008167ffffffffffffffff81111561128257611281614929565b5b6040519080825280601f01601f1916602001820160405280156112b45781602001600182028036833780820191505090505b5090505b60008514611341576001826112cd919061465f565b9150600a856112dc9190614958565b60306112e8919061462b565b60f81b8183815181106112fe576112fd614989565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561133a91906148f8565b94506112b8565b8093505050505b919050565b60606113738273ffffffffffffffffffffffffffffffffffffffff16601460ff16612907565b9050919050565b6113826114a6565b73ffffffffffffffffffffffffffffffffffffffff166113a0610a7e565b73ffffffffffffffffffffffffffffffffffffffff16146113f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ed90614a04565b60405180910390fd5b565b600a8183611406919061462b565b11806114125750600181105b15611449576040517f282afce900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600a8190555080600b819055508082611463919061462b565b6009819055507f2d16af4e896175142e59c5e70cbae0da380f2479205d0f9c6da549b9507f64c6828260405161149a92919061450a565b60405180910390a15050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361151d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151490614a96565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361158c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158390614b28565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161166a91906142c1565b60405180910390a3505050565b60006116838484610d20565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146116fd57818110156116ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e690614b94565b60405180910390fd5b6116fc84848484036114ae565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061176a5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806117755750600081145b156117ac576040517f4c7d442100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ab5801a7d398351b8be11c439e05c5b3259aec9b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480156118085750600560179054906101000a900460ff16155b1561183f576040517fdc5edff700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118835761187e8382612629565b612407565b6000806000601760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506000601760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905063650e2a8042118015611939575081155b80156119525750600560149054906101000a900460ff16155b156119f157611962876000612b43565b600560179054906101000a900460ff1661198f57611982600060026124b5565b61198e600060026113f8565b5b6001600560186101000a81548160ff0219169083151502179055506119b26130b9565b6000600560186101000a81548160ff0219169083151502179055506001600560146101000a81548160ff02191690831515021790555060019350600192505b60006119fc876107c8565b905060008060007f000000000000000000000000000000000000000000108b2a2c280290940000009050600080601560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015611acd5750601560008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611d6057600560169054906101000a900460ff161580611afa5750600560189054906101000a900460ff165b15611b31576040517f850336b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b878015611b885750601660008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611c4c577f000000000000000000000000000000000000000000108b2a2c280290940000008b1115611be7576040517f71caed7400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065493506064848c611bfa9190614bb4565b611c0491906148f8565b9450848b870103905082811115611c47576040517f9acd091700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d5f565b601660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015611ca35750865b8015611cce57507f000000000000000000000000000000000000000000084595161401484a0000008b115b15611d05576040517f43190ac500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87158015611d11575086155b8015611d27575082868c611d25919061462b565b115b15611d5e576040517f74052fc200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b600f54600c54101580611d775750601054600d5410155b8015611d81575087155b8015611dd75750601560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611e2d5750601560008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611e455750600560159054906101000a900460ff165b15611e9c57611e558d6000612b43565b6001600560186101000a81548160ff021916908315150217905550611e786136e3565b809a50819b5050506000600560186101000a81548160ff0219169083151502179055505b6000600560189054906101000a900460ff16159050601560008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611f525750601560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611f5c57600090505b80156121ad576000888015611f7357506000600954115b15611fc457600060095490506064818f0281611f9257611f916148c9565b5b04975080600a54890281611fa957611fa86148c9565b5b049150818803600d6000828254019250508190555050612001565b898015611fd15750600086115b156120005785600754880281611fea57611fe96148c9565b5b049050808703600d600082825401925050819055505b5b60008111156120445760006002828161201d5761201c6148c9565b5b04905080600e60008282540192505081905550808203600c60008282540192505081905550505b60008711156121ab576120588f3089612688565b600560159054906101000a900460ff166121a55761207461394f565b8461207e306107c8565b106121a45760008561208f306107c8565b612099919061465f565b905060006120ba73ab5801a7d398351b8be11c439e05c5b3259aec9b6107c8565b1115612103576120dd73ab5801a7d398351b8be11c439e05c5b3259aec9b6107c8565b860395506120fe73ab5801a7d398351b8be11c439e05c5b3259aec9b6107c8565b810190505b6121223073ab5801a7d398351b8be11c439e05c5b3259aec9b88612688565b73ab5801a7d398351b8be11c439e05c5b3259aec9b73ffffffffffffffffffffffffffffffffffffffff167fbd930dfdee75cecc873288bcf7176fea15ad28535d3285813018822193a2baa060405160405180910390a26121833082612629565b6001600560156101000a81548160ff02191690831515021790555060019450505b5b868d039c505b505b6121b88e8e8e612688565b88801561220f5750601660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561221d57506012548c10155b156122305761222b8d613969565b6122ac565b601660008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156122875750875b8061229a575088158015612299575087155b5b156122ab576122aa8e6001612b43565b5b5b3073ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff16036122f0578b600e600082825401925050819055505b89806122f957508a5b156123de5760006123297f000000000000000000000000052425e0e4606ce22ad1c611853f0c4315056e326107c8565b905060006103e88261233b91906148f8565b90508b1561239657806010819055506127108261235891906148f8565b6012819055507f14ac008fba1637f469366af4d14cf89db3a663c422612977c3f50bc4f3b491a18160405161238d91906142c1565b60405180910390a15b8c156123db5780600f819055507f2f7c7becc8a060dce66180a39d01d0ffebf04de28aba59ecea90ad84692bf234816040516123d291906142c1565b60405180910390a15b50505b82156123fb576123ef6002806124b5565b6123fa6002806113f8565b5b50505050505050505050505b505050565b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fea602142722466e33481101052940cc8804a19f048598dfd202c25a056db2033826040516124a99190614297565b60405180910390a25050565b600a81836124c3919061462b565b11806124cf5750600181105b15612506576040517f282afce900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600781905550806008819055508082612520919061462b565b6006819055507f527400149d6ac01fb8b30e6ec0db87f8fe9f5916304c414ac10e25ab1b064ff2828260405161255792919061450a565b60405180910390a15050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126368261dead83612688565b8173ffffffffffffffffffffffffffffffffffffffff167f72ee4eacc5e161ffbdcaeba5dd5e8d6d27ae46f9dddf2997a4e91935a6518b7b8260405161267c91906142c1565b60405180910390a25050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036126f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ee90614c68565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275d90614cfa565b60405180910390fd5b612771838383613c98565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156127f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ee90614d8c565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461288a919061462b565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128ee91906142c1565b60405180910390a3612901848484613c9d565b50505050565b60606000600283600261291a9190614bb4565b612924919061462b565b67ffffffffffffffff81111561293d5761293c614929565b5b6040519080825280601f01601f19166020018201604052801561296f5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106129a7576129a6614989565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612a0b57612a0a614989565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612a4b9190614bb4565b612a55919061462b565b90505b6001811115612af5577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612a9757612a96614989565b5b1a60f81b828281518110612aae57612aad614989565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612aee90614dac565b9050612a58565b5060008414612b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3090614e21565b60405180910390fd5b8091505092915050565b8015612b855760008060024281612b5d57612b5c6148c9565b5b061490508015612b8357612b7c3360115461117990919063ffffffff16565b6011819055505b505b601e54601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403612df95760006013805480602002602001604051908101604052809291908181526020018280548015612c5157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612c07575b5050505050905060008160018351612c69919061465f565b81518110612c7a57612c79614989565b5b602002602001015190506000601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508160138281548110612cdd57612cdc614989565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506013805480612d7b57612d7a614e41565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556000601d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050505b600560149054906101000a900460ff16158015612e5f5750601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8015612eb55750601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156130b5576000601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544303905062061a808110613016576014839080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff167fa166ab0d399fb2afd24c2174e0ec2e8eb37a2687ac4e9546097ae6d2892edba8438360405161300d92919061450a565b60405180910390a25b6000601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000601c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b5050565b60004711156136e1576000601480548060200260200160405190810160405280929190818152602001828054801561314657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116130fc575b50505050509050600060138054806020026020016040519081016040528092919081815260200182805480156131d157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311613187575b5050505050905060008060008451905060008451905060006005905060008284019050600060199050600560179054906101000a900460ff1661321357606490505b6000606482476132239190614bb4565b61322d91906148f8565b905083831015613381576000831461324757829350613380565b60019650600560179054906101000a900460ff1661337f5773ab5801a7d398351b8be11c439e05c5b3259aec9b73ffffffffffffffffffffffffffffffffffffffff1681604051613297906147e8565b60006040518083038185875af1925050503d80600081146132d4576040519150601f19603f3d011682016040523d82523d6000602084013e6132d9565b606091505b5050809850503373ffffffffffffffffffffffffffffffffffffffff167fc67d35f1593b850911248d49d6fc4439eb0fffb0b194e83abf59e436fa0daa0f60028361332491906148f8565b60405161333191906142c1565b60405180910390a27fef6bce0c4e1351aa0a33508979ccdb50e7573e4110b35d78ab73d9e27867396d3360028361336891906148f8565b604051613376929190614e70565b60405180910390a15b5b5b8661366357600080858361339591906148f8565b905060008714613495576133b43360115461117990919063ffffffff16565b6011819055506133cf6011548c613ca290919063ffffffff16565b91508173ffffffffffffffffffffffffffffffffffffffff16816040516133f5906147e8565b60006040518083038185875af1925050503d8060008114613432576040519150601f19603f3d011682016040523d82523d6000602084013e613437565b606091505b5050809a50508173ffffffffffffffffffffffffffffffffffffffff167fc67d35f1593b850911248d49d6fc4439eb0fffb0b194e83abf59e436fa0daa0f8260405161348391906142c1565b60405180910390a28580600190039650505b60008814613660576000600190505b86811161365e576134c03360115461117990919063ffffffff16565b6011819055506134db6011548e613ca290919063ffffffff16565b9250601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613659576001601a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086811480156135a25750600560179054906101000a900460ff16155b156135ab574791505b8273ffffffffffffffffffffffffffffffffffffffff16826040516135cf906147e8565b60006040518083038185875af1925050503d806000811461360c576040519150601f19603f3d011682016040523d82523d6000602084013e613611565b606091505b5050809b50507fef6bce0c4e1351aa0a33508979ccdb50e7573e4110b35d78ab73d9e27867396d8383604051613648929190614e70565b60405180910390a180806001019150505b6134a4565b505b50505b61368c30606484613673306107c8565b61367d9190614bb4565b61368791906148f8565b612629565b613694613cea565b600560179054906101000a900460ff16156136cd576136b2306107c8565b600e819055506000600c819055506000600d819055506136d6565b6136d561394f565b5b505050505050505050505b565b600080600080600c5490506000600d5490506000600f54905060006010549050600061370e306107c8565b14806137245750818410801561372357508083105b5b1561373a5760008096509650505050505061394b565b81841061375e578184038501945061375182613d5e565b6000600c81905550600196505b80831061393157808303850194506137813360115461117990919063ffffffff16565b6011819055506000613824601154601380548060200260200160405190810160405280929190818152602001828054801561381157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116137c7575b5050505050613ca290919063ffffffff16565b9050600082905061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146138c457600061386b836107c8565b905060007f000000000000000000000000000000000000000000108b2a2c28029094000000905080838361389f919061462b565b11156138b2578181039250828503890198505b6138bd308585612688565b50506138ca565b80870196505b6138d2613cea565b8173ffffffffffffffffffffffffffffffffffffffff167ff39ca55b233425232beaa10cf8eab4bb36b0cfc1681dab52a121786f06f47d12824260405161391a92919061450a565b60405180910390a26000600d819055506001975050505b6000851115613945576139443086612629565b5b50505050505b9091565b6000600c819055506000600d819055506000600e81905550565b601e54601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540315613c9557600060138054905090506013829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601e54601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f199b6f101a1a99898ef5c07ebd4bbcd9b068c09176b624ec06f0b1d0a3acf20f60405160405180910390a2600560149054906101000a900460ff16158015613b535750601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015613ba95750601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15613c93576001601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403613c925743601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b505b50565b505050565b505050565b6000808351905060008103613cbc5761dead915050613ce4565b83613cc78483613ff1565b81518110613cd857613cd7614989565b5b60200260200101519150505b92915050565b600067ffffffffffffffff811115613d0557613d04614929565b5b604051908082528060200260200182016040528015613d335781602001602082028036833780820191505090505b5060139080519060200190613d4992919061400a565b50601e60008154809291906001019190505550565b6000600267ffffffffffffffff811115613d7b57613d7a614929565b5b604051908082528060200260200182016040528015613da95781602001602082028036833780820191505090505b5090503081600081518110613dc157613dc0614989565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613e66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e8a9190614eae565b81600181518110613e9e57613e9d614989565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000479050613f08307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d856114ae565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008530426040518663ffffffff1660e01b8152600401613f6a959493929190614fde565b600060405180830381600087803b158015613f8457600080fd5b505af1158015613f98573d6000803e3d6000fd5b505050506000479050600082821115613fb15782820390505b7fe845924c07c89c17ac04375b80b3ffdf7507a0d469f31b68a9a63b3abbb05e948582604051613fe292919061450a565b60405180910390a15050505050565b6000818360001c6140029190614958565b905092915050565b828054828255906000526020600020908101928215614083579160200282015b828111156140825782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019061402a565b5b5090506140909190614094565b5090565b5b808211156140ad576000816000905550600101614095565b5090565b600080fd5b6000819050919050565b6140c9816140b6565b81146140d457600080fd5b50565b6000813590506140e6816140c0565b92915050565b60008060408385031215614103576141026140b1565b5b6000614111858286016140d7565b9250506020614122858286016140d7565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561416657808201518184015260208101905061414b565b60008484015250505050565b6000601f19601f8301169050919050565b600061418e8261412c565b6141988185614137565b93506141a8818560208601614148565b6141b181614172565b840191505092915050565b600060208201905081810360008301526141d68184614183565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614209826141de565b9050919050565b614219816141fe565b811461422457600080fd5b50565b60008135905061423681614210565b92915050565b60008060408385031215614253576142526140b1565b5b600061426185828601614227565b9250506020614272858286016140d7565b9150509250929050565b60008115159050919050565b6142918161427c565b82525050565b60006020820190506142ac6000830184614288565b92915050565b6142bb816140b6565b82525050565b60006020820190506142d660008301846142b2565b92915050565b6000806000606084860312156142f5576142f46140b1565b5b600061430386828701614227565b935050602061431486828701614227565b9250506040614325868287016140d7565b9150509250925092565b600060ff82169050919050565b6143458161432f565b82525050565b6000602082019050614360600083018461433c565b92915050565b61436f8161427c565b811461437a57600080fd5b50565b60008135905061438c81614366565b92915050565b600080604083850312156143a9576143a86140b1565b5b60006143b785828601614227565b92505060206143c88582860161437d565b9150509250929050565b6000602082840312156143e8576143e76140b1565b5b60006143f684828501614227565b91505092915050565b600060808201905061441460008301876142b2565b6144216020830186614288565b61442e6040830185614288565b61443b6060830184614288565b95945050505050565b60006101408201905061445a600083018d6142b2565b614467602083018c6142b2565b614474604083018b6142b2565b614481606083018a6142b2565b61448e60808301896142b2565b61449b60a08301886142b2565b6144a860c08301876142b2565b6144b560e08301866142b2565b6144c36101008301856142b2565b6144d16101208301846142b2565b9b9a5050505050505050505050565b6144e9816141fe565b82525050565b600060208201905061450460008301846144e0565b92915050565b600060408201905061451f60008301856142b2565b61452c60208301846142b2565b9392505050565b6000806040838503121561454a576145496140b1565b5b600061455885828601614227565b925050602061456985828601614227565b9150509250929050565b60006040820190506145886000830185614288565b6145956020830184614288565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806145e357607f821691505b6020821081036145f6576145f561459c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614636826140b6565b9150614641836140b6565b9250828201905080821115614659576146586145fc565b5b92915050565b600061466a826140b6565b9150614675836140b6565b925082820390508181111561468d5761468c6145fc565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006146ef602583614137565b91506146fa82614693565b604082019050919050565b6000602082019050818103600083015261471e816146e2565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614781602683614137565b915061478c82614725565b604082019050919050565b600060208201905081810360008301526147b081614774565b9050919050565b600081905092915050565b50565b60006147d26000836147b7565b91506147dd826147c2565b600082019050919050565b60006147f3826147c5565b9150819050919050565b600081905092915050565b60006148138261412c565b61481d81856147fd565b935061482d818560208601614148565b80840191505092915050565b60006148458286614808565b91506148518285614808565b915061485d8284614808565b9150819050949350505050565b60006148768284614808565b915081905092915050565b600061488c826140b6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148be576148bd6145fc565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614903826140b6565b915061490e836140b6565b92508261491e5761491d6148c9565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000614963826140b6565b915061496e836140b6565b92508261497e5761497d6148c9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006149ee602083614137565b91506149f9826149b8565b602082019050919050565b60006020820190508181036000830152614a1d816149e1565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614a80602483614137565b9150614a8b82614a24565b604082019050919050565b60006020820190508181036000830152614aaf81614a73565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b12602283614137565b9150614b1d82614ab6565b604082019050919050565b60006020820190508181036000830152614b4181614b05565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000614b7e601d83614137565b9150614b8982614b48565b602082019050919050565b60006020820190508181036000830152614bad81614b71565b9050919050565b6000614bbf826140b6565b9150614bca836140b6565b9250828202614bd8816140b6565b91508282048414831517614bef57614bee6145fc565b5b5092915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614c52602583614137565b9150614c5d82614bf6565b604082019050919050565b60006020820190508181036000830152614c8181614c45565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614ce4602383614137565b9150614cef82614c88565b604082019050919050565b60006020820190508181036000830152614d1381614cd7565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614d76602683614137565b9150614d8182614d1a565b604082019050919050565b60006020820190508181036000830152614da581614d69565b9050919050565b6000614db7826140b6565b915060008203614dca57614dc96145fc565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000614e0b602083614137565b9150614e1682614dd5565b602082019050919050565b60006020820190508181036000830152614e3a81614dfe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000604082019050614e8560008301856144e0565b614e9260208301846142b2565b9392505050565b600081519050614ea881614210565b92915050565b600060208284031215614ec457614ec36140b1565b5b6000614ed284828501614e99565b91505092915050565b6000819050919050565b6000819050919050565b6000614f0a614f05614f0084614edb565b614ee5565b6140b6565b9050919050565b614f1a81614eef565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614f55816141fe565b82525050565b6000614f678383614f4c565b60208301905092915050565b6000602082019050919050565b6000614f8b82614f20565b614f958185614f2b565b9350614fa083614f3c565b8060005b83811015614fd1578151614fb88882614f5b565b9750614fc383614f73565b925050600181019050614fa4565b5085935050505092915050565b600060a082019050614ff360008301886142b2565b6150006020830187614f11565b81810360408301526150128186614f80565b905061502160608301856144e0565b61502e60808301846142b2565b969550505050505056fea2646970667358221220d2705d9525aa1c1842aee8b28d086d1d2654fb3ab3e98e6a1b5651865b22a7c364736f6c63430008120033

Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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