ETH Price: $2,969.37 (-1.69%)
 

Overview

Max Total Supply

100,000,000 MAGAKICKS

Holders

24 (0.00%)

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Stepping into the future with MAGAKICKS Inspired by Trump’s journey and his iconic gold high-top shoes, MAGAKICKS is a comical and satirical memecoin. It represents the future of memes, humor, and kicks in the crypto space. MAGAKICKS has no affiliation with Donald Trump.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MAGAKICKS

Compiler Version
v0.8.27+commit.40a35a09

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
// SPDX-License-Identifier: MIT
pragma solidity 0.8.27;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol";
import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";

/// @title MAGAKICKS token: A Standard ERC20 with tax
contract MAGAKICKS is ERC20, ERC20Burnable, Ownable {
    /// @notice MAX SUPPLY 100 MILLION tokens
    uint256 private constant MAX_SUPPLY = 100_000_000 * 1e18;
    /// @notice max wallet limit
    uint256 public maxWalletAmount = (MAX_SUPPLY * 25) / 1000; // 2.5% of the supply
    /// @notice fee divisor
    uint256 public constant FEE_DIVISOR = 1000;
    /// @notice swap threshold after which collected tax is swapped
    uint256 public swapThreshold = MAX_SUPPLY / 100000; // 0.001% Of the supply
    /// @notice initial tax, applicable for first 30 minutes
    uint256 public initialTaxPercent = 250; // 25%
    /// @notice final tax
    uint256 public finalTaxPercent = 10; // 1%
    /// @notice launchTime
    uint256 public launchTime;
    /// @notice high tax duration
    uint256 public highTaxDuration = 30 minutes;
    /// @notice dev wallet share
    uint256 public devShare = 40;
    /// @notice liquidity share
    uint256 public liquidityShare = 60;
    /// @notice dev wallet
    address public devWallet = address(0xC7139231F7d1c93F38B5d19Def245bBf541F4da1);
    /// @notice liquidity receiver wallet
    address public lpReceiverWallet = address(0xBA8569149083463f6A333104F4f15d80408B5b82);

    /// @notice uniswapV2Router
    IUniswapV2Router02 public immutable uniswapV2Router;
    /// @notice uniswapPair
    address public immutable uniswapPair;

    /// @notice swapping status
    /// used to prevent reentrancy during swap
    bool swapping = false;

    /// @notice manage amm pairs
    mapping(address => bool) public isMarketPair;
    /// @notice manage exclude from fees
    mapping(address => bool) public isExcludedFromFees;
    /// @notice manage exclude from limit (antiwhale)
    mapping(address => bool) public isExcludedFromLimits;

    ///  errors
    error OnlydevWalletOrOwner();
    error EthClaimFailed();
    error ZeroAddress();
    error CannotModifyMainPair();
    error CannotClaimNativeToken();
    error UpdateBoolValue();
    error MaxWalletLimitExceeds();
    error SumOfPercentageMustBe100();
    error MaxTaxLimitExceeds();

    event WalletsUpdated(address indexed dev, address indexed lp);
    event TaxUpdated(uint256 indexed finalTax);
    event TaxSharesUpdated(uint256 indexed dev, uint256 indexed lp);
    event MaxWalletPercentUpdated (uint256 indexed newPercent);
    


    constructor() ERC20("MAGAKICKS", "MAGAKICKS") Ownable(msg.sender) {
        uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D // uniswap v2 router eth
        );

        /// create pair for token / weth
        uniswapPair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
            address(this),
            uniswapV2Router.WETH()
        );
        
        /// set main pair
        isMarketPair[uniswapPair] = true;
        
        /// exlcude owner and token address from fees
        isExcludedFromFees[owner()] = true;
        isExcludedFromFees[address(this)] = true;
        /// exclude owner and token address from limits
        isExcludedFromLimits[owner()] = true;
        isExcludedFromLimits[address(this)] = true;
        /// _mint the max supply to owner
        _mint(msg.sender, MAX_SUPPLY);
    }

    receive() external payable {}
   
   /// modifier, where applied that function can be called by the owner
   /// or dev wallet only
    modifier onlyOwnerOrDev() {
        if(msg.sender != owner() || msg.sender != devWallet){
            revert OnlydevWalletOrOwner();
        }
        _;
    }

    /// @dev claim any erc20 token apart from native token, accidently sent to token contract
    /// @param token: token to rescue
    /// @param amount: amount to rescue
    /// Requirements -
    /// only dev wallet or owner can rescue stucked tokens
    function claimStuckedERC20(address token, uint256 amount) external onlyOwnerOrDev {
        
        if (token == address(this)) {
            revert CannotClaimNativeToken();
        }
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0xa9059cbb, devWallet, amount)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "MIRROR: TOKEN_CLAIM_FAILED"
        );
    }

    /// @dev claim stucked eth
    /// @param wallet: wallet in which eth will be rescued
    /// Requirements -
    /// can be called by owner or dev wallet only
    function claimStuckedEth(address wallet) external onlyOwnerOrDev {
        (bool sent, ) = wallet.call{value: address(this).balance}("");
        if (!sent) {
            revert EthClaimFailed();
        }
    }

    /// @notice manage exclude/include from fees
    /// @param user: address of user to exclude or include
    /// @param value: true or false (true to exclude and false to include)
    function excludeFromFees(address user, bool value) external onlyOwner {
        if (isExcludedFromFees[user] == value) {
            revert UpdateBoolValue();
        }
        isExcludedFromFees[user] = value;
    }

    /// @notice manage exclude/include from limits
    /// @param user: address of user to exclude or include
    /// @param value: true or false (true to exclude and false to include)
    function excludeFromLimits(address user, bool value) external onlyOwner {
        if (isExcludedFromLimits[user] == value) {
            revert UpdateBoolValue();
        }
        isExcludedFromLimits[user] = value;
    }

    /// @dev update max wallet percent globally
    /// @notice percent: new percent for max wallet
    /// Requirements -
    /// can't set below 1% of the supply
    /// DIVISOR IS 1000, 10 == 1%
    function setMaxWalletPercent(uint256 percent) external onlyOwner {
        if (percent >= 10) {
            maxWalletAmount = (MAX_SUPPLY * percent) / FEE_DIVISOR;
            emit MaxWalletPercentUpdated(percent);
        } else revert MaxWalletLimitExceeds();
    }
    
    /// @dev update high tax duration, max can be 1 day from the time liquidity has been added
    /// @param newDuration: new duration for high tax
    function updateHighTaxDuration( uint256 newDuration) external  onlyOwner {
        if(newDuration <= 25 hours){
        highTaxDuration = newDuration;
        }
    }

    /// @dev update Tax Share for dev wallet and liquidity globally
    /// @param _dev: new dev fees on buy
    /// @param _lp: new autoLp fees on buy
    /// max buy fees is limited to 10 percent
    /// fees divisor is 1000, so 10 input means 1%
    function setTaxShares(uint256 _dev, uint256 _lp) external onlyOwner {
       if(_dev + _lp != 100){ revert SumOfPercentageMustBe100();}
       devShare = _dev;
       liquidityShare = _lp;
       emit TaxSharesUpdated(_dev, _lp);
       
    }

    /// @dev update final tax globally (applicable on buy/sell only)
    /// @param _newTax: new final tax
    /// fees divisor is 1000, so 10 input means 1%
    /// max tax limit is 5 percent
    function updateTaxes(uint256 _newTax) external onlyOwner {
        if (_newTax > 50) {revert MaxTaxLimitExceeds();}
        finalTaxPercent = _newTax;
        emit TaxUpdated(_newTax);

    }

    /// @dev add or remove new pairs
    /// @param pair: new pair to be added or removed
    /// @param value: bool value
    function setMarketPairAddress(address pair, bool value) external onlyOwner {
        if (pair == uniswapPair) {
            revert CannotModifyMainPair();
        }
        isMarketPair[pair] = value;
    }

    /// @dev update dev and dev wallet
    /// @param _market new dev wallet
    /// @param _lp new lp receiver wallet
    function setFeeWallets(address _market, address _lp) external onlyOwner {
        if (_market != address(0)) {
            devWallet = _market;
            lpReceiverWallet = _lp;
            emit WalletsUpdated(_market, _lp);
        }
    }

    /// @dev update swap threshold
    /// @param newThreshold: new amount after which collected tax is swapped for ether
    /// values can be set b/w 1000 to 1 million tokens.
    function setSwapThreshold(uint256 newThreshold) external onlyOwner {
        if (newThreshold <= MAX_SUPPLY / 100 && newThreshold > 1000e18) {
            swapThreshold = newThreshold;
        }
    }
    
    /// @notice returns current tax percentage
    /// as fee divisor is 1000, so 10 means 1 percent
    function getCurrentTaxPercentage() public view returns (uint256){
        if(block.timestamp < launchTime + highTaxDuration){
            return initialTaxPercent;
        } else return finalTaxPercent;
    }

    /// @notice manage token transfer, fees and max wallet limit
    /// @dev See {ERC20-_update}
    function _update(
        address from,
        address to,
        uint256 amount
    ) internal override {
        bool takeFee = true;
        
        if (isExcludedFromFees[from] || isExcludedFromFees[to]) {
            takeFee = false;
        }

        if(to == uniswapPair && launchTime == 0){
            launchTime = block.timestamp;
        }

        if (takeFee) {
            uint256 fee; // tokens to deduct
            uint256 tax; // tax value that determine how many tokens to deduct
            /// if current time is less than launch time + highTaxDuration
            /// tax is initital tax percent
            /// else final tax percent
            if(block.timestamp < launchTime + highTaxDuration){
                tax = initialTaxPercent;
            } else {
                tax = finalTaxPercent;
            }
            /// if receiver is not excluded from limits and receiver is not
            /// liquidity pool, check for antiwhale
            if (!isMarketPair[to] && !isExcludedFromLimits[to]) {
                if (balanceOf(to) + amount > maxWalletAmount) {
                    revert MaxWalletLimitExceeds();
                }
            }
            /// if it's a buy or sell, only then tax is applied
            if (isMarketPair[from]|| isMarketPair[to]) {
                
                fee = (amount * tax) / FEE_DIVISOR;
            } 

            amount = amount - fee;

            if (fee > 0) {
                super._update(from, address(this), fee);
            }
        }

        uint256 contractBalance = balanceOf(address(this));
        /// when collected tax tokens are greator than equals
        /// to swap threshold, sender is not lp pair, and
        /// token swap is not reentering, call swap&liquify
        bool canSwap = contractBalance >= swapThreshold &&
            !isMarketPair[from] &&
            from != owner() &&
            !swapping;
        if (canSwap) {
            swapping = true;
            swapAndLiquify(contractBalance);
            swapping = false;
        }

        super._update(from, to, amount);
    }

    /// @notice swap and liquify
    /// transfer collected tax to designated addresses as per there share
    function swapAndLiquify(uint256 amount) private {
        uint256 totalShares = devShare + liquidityShare;
        if (totalShares > 0) {
            uint256 tokensForLP = (amount * liquidityShare) /
                (totalShares);
            uint256 lpHalf = tokensForLP / 2;

            uint256 tokensForSwap = amount - lpHalf;
            uint256 ethBeforeSwap = address(this).balance;
            if (tokensForSwap > 0) {
                swapTokensForETH(tokensForSwap);
            }
            uint256 newEth = address(this).balance - ethBeforeSwap;
            uint256 ethForLp = (newEth * lpHalf) / tokensForSwap;
            bool sent;

            /// add liquidity
            if (ethForLp > 0 && lpHalf > 0) {
                addLiquidity(ethForLp, lpHalf);
            }

            /// sent remaining eth to dev wallet
            if (address(this).balance > 0) {
                (sent, ) = devWallet.call{value: address(this).balance}(
                    ""
                );
            }
        } else {
            swapTokensForETH(amount);
            bool y;
            (y, ) = devWallet.call{value: address(this).balance}("");
        }
    }

    /// @notice add lp with given tokens and eth
    function addLiquidity(uint256 eth, uint256 tokens) private {
        if (allowance(address(this), address(uniswapV2Router)) < tokens) {
            _approve(
                address(this),
                address(uniswapV2Router),
                type(uint256).max
            );
        }

        uniswapV2Router.addLiquidityETH{value: eth}(
            address(this),
            tokens,
            0,
            0,
            lpReceiverWallet, // lp wallet
            block.timestamp + 360
        );
    }

    ///@notice swap the tax tokens for eth and send to dev wallet
    function swapTokensForETH(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        if (allowance(address(this), address(uniswapV2Router)) < tokenAmount) {
            _approve(
                address(this),
                address(uniswapV2Router),
                type(uint256).max
            );
        }

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp + 360
        );
    }
}

pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

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

pragma solidity >=0.5.0;

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

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

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @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 {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.20;

import {ERC20} from "../ERC20.sol";
import {Context} from "../../../utils/Context.sol";

/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys a `value` amount of tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 value) public virtual {
        _burn(_msgSender(), value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, deducting from
     * the caller's allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `value`.
     */
    function burnFrom(address account, uint256 value) public virtual {
        _spendAllowance(account, _msgSender(), value);
        _burn(account, value);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;

import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.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}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * 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.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * 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 returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual 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 default value returned by this function, unless
     * it's 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 returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual 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 `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` 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 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        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 `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` 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.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` 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.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     * ```
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

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

pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @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;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;

import {IERC20} from "../IERC20.sol";

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @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 value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` 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 value) external returns (bool);
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CannotClaimNativeToken","type":"error"},{"inputs":[],"name":"CannotModifyMainPair","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"EthClaimFailed","type":"error"},{"inputs":[],"name":"MaxTaxLimitExceeds","type":"error"},{"inputs":[],"name":"MaxWalletLimitExceeds","type":"error"},{"inputs":[],"name":"OnlydevWalletOrOwner","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"SumOfPercentageMustBe100","type":"error"},{"inputs":[],"name":"UpdateBoolValue","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newPercent","type":"uint256"}],"name":"MaxWalletPercentUpdated","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":"uint256","name":"dev","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"lp","type":"uint256"}],"name":"TaxSharesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"finalTax","type":"uint256"}],"name":"TaxUpdated","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":"dev","type":"address"},{"indexed":true,"internalType":"address","name":"lp","type":"address"}],"name":"WalletsUpdated","type":"event"},{"inputs":[],"name":"FEE_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimStuckedERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"claimStuckedEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finalTaxPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentTaxPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"highTaxDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialTaxPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isMarketPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpReceiverWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"address","name":"_lp","type":"address"}],"name":"setFeeWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setMarketPairAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"setMaxWalletPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"setSwapThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dev","type":"uint256"},{"internalType":"uint256","name":"_lp","type":"uint256"}],"name":"setTaxShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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":"value","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":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDuration","type":"uint256"}],"name":"updateHighTaxDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTax","type":"uint256"}],"name":"updateTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526103e860196a52b7d2dcc80cd2e400000061001f91906115c5565b6100299190611633565b600655620186a06a52b7d2dcc80cd2e40000006100469190611633565b60075560fa600855600a600955610708600b556028600c55603c600d5573c7139231f7d1c93f38b5d19def245bbf541f4da1600e5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ba8569149083463f6a333104f4f15d80408b5b82600f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f600f60146101000a81548160ff021916908315150217905550348015610130575f5ffd5b50336040518060400160405280600981526020017f4d4147414b49434b5300000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f4d4147414b49434b53000000000000000000000000000000000000000000000081525081600390816101ad9190611897565b5080600490816101bd9190611897565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610230575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161022791906119a5565b60405180910390fd5b61023f816105f760201b60201c565b50737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102d3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102f791906119ec565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060805173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561035e573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061038291906119ec565b6040518363ffffffff1660e01b815260040161039f929190611a17565b6020604051808303815f875af11580156103bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103df91906119ec565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050600160105f60a05173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160115f61047c6106ba60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160115f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160125f6105336106ba60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160125f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506105f2336a52b7d2dcc80cd2e40000006106e260201b60201c565b611d90565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610752575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161074991906119a5565b60405180910390fd5b6107635f838361076760201b60201c565b5050565b5f6001905060115f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680610807575060115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15610810575f90505b60a05173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614801561084e57505f600a54145b1561085b5742600a819055505b8015610a6a575f5f600b54600a546108739190611a3e565b42101561088457600854905061088a565b60095490505b60105f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015610928575060125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15610983576006548461094087610b9a60201b60201c565b61094a9190611a3e565b1115610982576040517f6f1e40f800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b60105f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680610a1e575060105f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15610a3f576103e88185610a3291906115c5565b610a3c9190611633565b91505b8184610a4b9190611a71565b93505f821115610a6757610a66863084610bdf60201b60201c565b5b50505b5f610a7a30610b9a60201b60201c565b90505f6007548210158015610ad6575060105f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015610b1b5750610aeb6106ba60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b8015610b345750600f60149054906101000a900460ff16155b90508015610b81576001600f60146101000a81548160ff021916908315150217905550610b6682610df860201b60201c565b5f600f60146101000a81548160ff0219169083151502179055505b610b92868686610bdf60201b60201c565b505050505050565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c2f578060025f828254610c239190611a3e565b92505081905550610cfd565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610cb8578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610caf93929190611ab3565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d44578060025f8282540392505081905550610d8e565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610deb9190611ae8565b60405180910390a3505050565b5f600d54600c54610e099190611a3e565b90505f811115610f57575f81600d5484610e2391906115c5565b610e2d9190611633565b90505f600282610e3d9190611633565b90505f8185610e4c9190611a71565b90505f4790505f821115610e6a57610e6982610ff760201b60201c565b5b5f8147610e779190611a71565b90505f838583610e8791906115c5565b610e919190611633565b90505f5f82118015610ea257505f86115b15610eb857610eb7828761121d60201b60201c565b5b5f471115610f4b57600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051610f0590611b2e565b5f6040518083038185875af1925050503d805f8114610f3f576040519150601f19603f3d011682016040523d82523d5f602084013e610f44565b606091505b5050809150505b50505050505050610ff3565b610f6682610ff760201b60201c565b5f600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051610fac90611b2e565b5f6040518083038185875af1925050503d805f8114610fe6576040519150601f19603f3d011682016040523d82523d5f602084013e610feb565b606091505b505080915050505b5050565b5f600267ffffffffffffffff8111156110135761101261166d565b5b6040519080825280602002602001820160405280156110415781602001602082028036833780820191505090505b50905030815f8151811061105857611057611b42565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110dd573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061110191906119ec565b8160018151811061111557611114611b42565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050816111623060805161132660201b60201c565b101561119c5761119b306080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6113a860201b60201c565b5b60805173ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430610168426111cc9190611a3e565b6040518663ffffffff1660e01b81526004016111ec959493929190611c5f565b5f604051808303815f87803b158015611203575f5ffd5b505af1158015611215573d5f5f3e3d5ffd5b505050505050565b806112303060805161132660201b60201c565b101561126a57611269306080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6113a860201b60201c565b5b60805173ffffffffffffffffffffffffffffffffffffffff1663f305d7198330845f5f600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610168426112bd9190611a3e565b6040518863ffffffff1660e01b81526004016112de96959493929190611cb7565b60606040518083038185885af11580156112fa573d5f5f3e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061131f9190611d40565b5050505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6113bb83838360016113c060201b60201c565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611430575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161142791906119a5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036114a0575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161149791906119a5565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611589578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516115809190611ae8565b60405180910390a35b50505050565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6115cf8261158f565b91506115da8361158f565b92508282026115e88161158f565b915082820484148315176115ff576115fe611598565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61163d8261158f565b91506116488361158f565b92508261165857611657611606565b5b828204905092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806116de57607f821691505b6020821081036116f1576116f061169a565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026117537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611718565b61175d8683611718565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61179861179361178e8461158f565b611775565b61158f565b9050919050565b5f819050919050565b6117b18361177e565b6117c56117bd8261179f565b848454611724565b825550505050565b5f5f905090565b6117dc6117cd565b6117e78184846117a8565b505050565b5b8181101561180a576117ff5f826117d4565b6001810190506117ed565b5050565b601f82111561184f57611820816116f7565b61182984611709565b81016020851015611838578190505b61184c61184485611709565b8301826117ec565b50505b505050565b5f82821c905092915050565b5f61186f5f1984600802611854565b1980831691505092915050565b5f6118878383611860565b9150826002028217905092915050565b6118a082611663565b67ffffffffffffffff8111156118b9576118b861166d565b5b6118c382546116c7565b6118ce82828561180e565b5f60209050601f8311600181146118ff575f84156118ed578287015190505b6118f7858261187c565b86555061195e565b601f19841661190d866116f7565b5f5b828110156119345784890151825560018201915060208501945060208101905061190f565b86831015611951578489015161194d601f891682611860565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61198f82611966565b9050919050565b61199f81611985565b82525050565b5f6020820190506119b85f830184611996565b92915050565b5f5ffd5b6119cb81611985565b81146119d5575f5ffd5b50565b5f815190506119e6816119c2565b92915050565b5f60208284031215611a0157611a006119be565b5b5f611a0e848285016119d8565b91505092915050565b5f604082019050611a2a5f830185611996565b611a376020830184611996565b9392505050565b5f611a488261158f565b9150611a538361158f565b9250828201905080821115611a6b57611a6a611598565b5b92915050565b5f611a7b8261158f565b9150611a868361158f565b9250828203905081811115611a9e57611a9d611598565b5b92915050565b611aad8161158f565b82525050565b5f606082019050611ac65f830186611996565b611ad36020830185611aa4565b611ae06040830184611aa4565b949350505050565b5f602082019050611afb5f830184611aa4565b92915050565b5f81905092915050565b50565b5f611b195f83611b01565b9150611b2482611b0b565b5f82019050919050565b5f611b3882611b0e565b9150819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b5f611b92611b8d611b8884611b6f565b611775565b61158f565b9050919050565b611ba281611b78565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611bda81611985565b82525050565b5f611beb8383611bd1565b60208301905092915050565b5f602082019050919050565b5f611c0d82611ba8565b611c178185611bb2565b9350611c2283611bc2565b805f5b83811015611c52578151611c398882611be0565b9750611c4483611bf7565b925050600181019050611c25565b5085935050505092915050565b5f60a082019050611c725f830188611aa4565b611c7f6020830187611b99565b8181036040830152611c918186611c03565b9050611ca06060830185611996565b611cad6080830184611aa4565b9695505050505050565b5f60c082019050611cca5f830189611996565b611cd76020830188611aa4565b611ce46040830187611b99565b611cf16060830186611b99565b611cfe6080830185611996565b611d0b60a0830184611aa4565b979650505050505050565b611d1f8161158f565b8114611d29575f5ffd5b50565b5f81519050611d3a81611d16565b92915050565b5f5f5f60608486031215611d5757611d566119be565b5b5f611d6486828701611d2c565b9350506020611d7586828701611d2c565b9250506040611d8686828701611d2c565b9150509250925092565b60805160a051613364611df05f395f81816114d8015281816115040152611de301525f8181610a6301528181612608015281816126e801528181612718015281816127600152818161280401528181612834015261287c01526133645ff3fe608060405260043610610254575f3560e01c80637a20d3da11610138578063a9059cbb116100b5578063c816841b11610079578063c816841b1461089b578063d8a6af07146108c5578063dd62ed3e146108ed578063edac684b14610929578063f2fde38b14610953578063fd1fb6051461097b5761025b565b8063a9059cbb146107bb578063aa4bde28146107f7578063aed04fae14610821578063c02466681461084b578063c0a904a2146108735761025b565b80638ea5220f116100fc5780638ea5220f146106ed57806395d89b41146107175780639d0014b1146107415780639e93ad8e14610769578063a2eb9c7d146107935761025b565b80637a20d3da146106215780638083b2c61461064957806382bf293c14610673578063877b6eec1461069b5780638da5cb5b146106c35761025b565b806342966c68116101d15780635cce86cd116101955780635cce86cd1461051757806370a0823114610553578063715018a61461058f57806374bfbf01146105a5578063790ca413146105cf57806379cc6790146105f95761025b565b806342966c681461043957806347ff0114146104615780634fbee1931461048b57806353b18166146104c75780635a0ad007146104ef5761025b565b806318160ddd1161021857806318160ddd1461034357806323b872dd1461036d5780632fb97b37146103a9578063313ce567146103d35780633ecad271146103fd5761025b565b80630445b6671461025f57806306fdde0314610289578063095ea7b3146102b357806315291cd4146102ef5780631694505e146103195761025b565b3661025b57005b5f5ffd5b34801561026a575f5ffd5b506102736109a3565b604051610280919061296c565b60405180910390f35b348015610294575f5ffd5b5061029d6109a9565b6040516102aa91906129f5565b60405180910390f35b3480156102be575f5ffd5b506102d960048036038101906102d49190612a9d565b610a39565b6040516102e69190612af5565b60405180910390f35b3480156102fa575f5ffd5b50610303610a5b565b604051610310919061296c565b60405180910390f35b348015610324575f5ffd5b5061032d610a61565b60405161033a9190612b69565b60405180910390f35b34801561034e575f5ffd5b50610357610a85565b604051610364919061296c565b60405180910390f35b348015610378575f5ffd5b50610393600480360381019061038e9190612b82565b610a8e565b6040516103a09190612af5565b60405180910390f35b3480156103b4575f5ffd5b506103bd610abc565b6040516103ca9190612be1565b60405180910390f35b3480156103de575f5ffd5b506103e7610ae1565b6040516103f49190612c15565b60405180910390f35b348015610408575f5ffd5b50610423600480360381019061041e9190612c2e565b610ae9565b6040516104309190612af5565b60405180910390f35b348015610444575f5ffd5b5061045f600480360381019061045a9190612c59565b610b06565b005b34801561046c575f5ffd5b50610475610b1a565b604051610482919061296c565b60405180910390f35b348015610496575f5ffd5b506104b160048036038101906104ac9190612c2e565b610b20565b6040516104be9190612af5565b60405180910390f35b3480156104d2575f5ffd5b506104ed60048036038101906104e89190612c59565b610b3d565b005b3480156104fa575f5ffd5b5061051560048036038101906105109190612c59565b610b5a565b005b348015610522575f5ffd5b5061053d60048036038101906105389190612c2e565b610bd4565b60405161054a9190612af5565b60405180910390f35b34801561055e575f5ffd5b5061057960048036038101906105749190612c2e565b610bf1565b604051610586919061296c565b60405180910390f35b34801561059a575f5ffd5b506105a3610c36565b005b3480156105b0575f5ffd5b506105b9610c49565b6040516105c6919061296c565b60405180910390f35b3480156105da575f5ffd5b506105e3610c74565b6040516105f0919061296c565b60405180910390f35b348015610604575f5ffd5b5061061f600480360381019061061a9190612a9d565b610c7a565b005b34801561062c575f5ffd5b5061064760048036038101906106429190612a9d565b610c9a565b005b348015610654575f5ffd5b5061065d610f15565b60405161066a919061296c565b60405180910390f35b34801561067e575f5ffd5b5061069960048036038101906106949190612c59565b610f1b565b005b3480156106a6575f5ffd5b506106c160048036038101906106bc9190612c2e565b610fbc565b005b3480156106ce575f5ffd5b506106d7611125565b6040516106e49190612be1565b60405180910390f35b3480156106f8575f5ffd5b5061070161114d565b60405161070e9190612be1565b60405180910390f35b348015610722575f5ffd5b5061072b611172565b60405161073891906129f5565b60405180910390f35b34801561074c575f5ffd5b5061076760048036038101906107629190612c59565b611202565b005b348015610774575f5ffd5b5061077d611249565b60405161078a919061296c565b60405180910390f35b34801561079e575f5ffd5b506107b960048036038101906107b49190612c84565b61124f565b005b3480156107c6575f5ffd5b506107e160048036038101906107dc9190612a9d565b6112dc565b6040516107ee9190612af5565b60405180910390f35b348015610802575f5ffd5b5061080b6112fe565b604051610818919061296c565b60405180910390f35b34801561082c575f5ffd5b50610835611304565b604051610842919061296c565b60405180910390f35b348015610856575f5ffd5b50610871600480360381019061086c9190612cec565b61130a565b005b34801561087e575f5ffd5b5061089960048036038101906108949190612cec565b6113f0565b005b3480156108a6575f5ffd5b506108af6114d6565b6040516108bc9190612be1565b60405180910390f35b3480156108d0575f5ffd5b506108eb60048036038101906108e69190612cec565b6114fa565b005b3480156108f8575f5ffd5b50610913600480360381019061090e9190612d2a565b6115df565b604051610920919061296c565b60405180910390f35b348015610934575f5ffd5b5061093d611661565b60405161094a919061296c565b60405180910390f35b34801561095e575f5ffd5b5061097960048036038101906109749190612c2e565b611667565b005b348015610986575f5ffd5b506109a1600480360381019061099c9190612d2a565b6116eb565b005b60075481565b6060600380546109b890612d95565b80601f01602080910402602001604051908101604052809291908181526020018280546109e490612d95565b8015610a2f5780601f10610a0657610100808354040283529160200191610a2f565b820191905f5260205f20905b815481529060010190602001808311610a1257829003601f168201915b5050505050905090565b5f5f610a43611805565b9050610a5081858561180c565b600191505092915050565b600d5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f600254905090565b5f5f610a98611805565b9050610aa585828561181e565b610ab08585856118b0565b60019150509392505050565b600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6012905090565b6010602052805f5260405f205f915054906101000a900460ff1681565b610b17610b11611805565b826119a0565b50565b600b5481565b6011602052805f5260405f205f915054906101000a900460ff1681565b610b45611a1f565b62015f908111610b575780600b819055505b50565b610b62611a1f565b6032811115610b9d576040517f4d26c46900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600981905550807f35ad15e7f5e4a16b548e8916bd02c51847dde8d106f334b4edaaacf140e43c9160405160405180910390a250565b6012602052805f5260405f205f915054906101000a900460ff1681565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610c3e611a1f565b610c475f611aa6565b565b5f600b54600a54610c5a9190612df2565b421015610c6b576008549050610c71565b60095490505b90565b600a5481565b610c8c82610c86611805565b8361181e565b610c9682826119a0565b5050565b610ca2611125565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580610d295750600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610d60576040517f9ef6307600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610dc5576040517fe9cceb3600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685604051602401610e17929190612e25565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610e659190612e90565b5f604051808303815f865af19150503d805f8114610e9e576040519150601f19603f3d011682016040523d82523d5f602084013e610ea3565b606091505b5091509150818015610ed057505f81511480610ecf575080806020019051810190610ece9190612eba565b5b5b610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0690612f2f565b60405180910390fd5b50505050565b60095481565b610f23611a1f565b600a8110610f87576103e8816a52b7d2dcc80cd2e4000000610f459190612f4d565b610f4f9190612fbb565b600681905550807f898802fb55543ddaa2694cef66016735c42b3f7fb862cd9010c384a24fbecda760405160405180910390a2610fb9565b6040517f6f1e40f800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b610fc4611125565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158061104b5750600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15611082576040517f9ef6307600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8173ffffffffffffffffffffffffffffffffffffffff16476040516110a79061300e565b5f6040518083038185875af1925050503d805f81146110e1576040519150601f19603f3d011682016040523d82523d5f602084013e6110e6565b606091505b5050905080611121576040517fdce5a24800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606004805461118190612d95565b80601f01602080910402602001604051908101604052809291908181526020018280546111ad90612d95565b80156111f85780601f106111cf576101008083540402835291602001916111f8565b820191905f5260205f20905b8154815290600101906020018083116111db57829003601f168201915b5050505050905090565b61120a611a1f565b60646a52b7d2dcc80cd2e40000006112229190612fbb565b81111580156112395750683635c9adc5dea0000081115b1561124657806007819055505b50565b6103e881565b611257611a1f565b606481836112659190612df2565b1461129c576040517f4d86a81800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600c8190555080600d8190555080827f64bae4d9db5f171ae2c5ab89b09e67ca480c2e167bbd2e5b537943c03099c1ff60405160405180910390a35050565b5f5f6112e6611805565b90506112f38185856118b0565b600191505092915050565b60065481565b600c5481565b611312611a1f565b80151560115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611398576040517fc7f2b1ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b6113f8611a1f565b80151560125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615150361147e576040517fc7f2b1ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b611502611a1f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611587576040517f8d5fb9f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60085481565b61166f611a1f565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036116df575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016116d69190612be1565b60405180910390fd5b6116e881611aa6565b50565b6116f3611a1f565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146118015781600e5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f316af92955f23ddbd4c570a5f8cda8a10b192f24d8f58524deb2fcb03a8bc79460405160405180910390a35b5050565b5f33905090565b6118198383836001611b69565b505050565b5f61182984846115df565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146118aa578181101561189b578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161189293929190613022565b60405180910390fd5b6118a984848484035f611b69565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611920575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016119179190612be1565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611990575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016119879190612be1565b60405180910390fd5b61199b838383611d38565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a10575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611a079190612be1565b60405180910390fd5b611a1b825f83611d38565b5050565b611a27611805565b73ffffffffffffffffffffffffffffffffffffffff16611a45611125565b73ffffffffffffffffffffffffffffffffffffffff1614611aa457611a68611805565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611a9b9190612be1565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611bd9575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611bd09190612be1565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c49575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611c409190612be1565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611d32578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611d29919061296c565b60405180910390a35b50505050565b5f6001905060115f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680611dd8575060115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15611de1575f90505b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148015611e3d57505f600a54145b15611e4a5742600a819055505b801561204d575f5f600b54600a54611e629190612df2565b421015611e73576008549050611e79565b60095490505b60105f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015611f17575060125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15611f6c5760065484611f2987610bf1565b611f339190612df2565b1115611f6b576040517f6f1e40f800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b60105f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612007575060105f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15612028576103e8818561201b9190612f4d565b6120259190612fbb565b91505b81846120349190613057565b93505f82111561204a57612049863084612165565b5b50505b5f61205730610bf1565b90505f60075482101580156120b3575060105f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156120f257506120c2611125565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b801561210b5750600f60149054906101000a900460ff16155b90508015612152576001600f60146101000a81548160ff0219169083151502179055506121378261237e565b5f600f60146101000a81548160ff0219169083151502179055505b61215d868686612165565b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121b5578060025f8282546121a99190612df2565b92505081905550612283565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101561223e578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161223593929190613022565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036122ca578060025f8282540392505081905550612314565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612371919061296c565b60405180910390a3505050565b5f600d54600c5461238f9190612df2565b90505f8111156124d1575f81600d54846123a99190612f4d565b6123b39190612fbb565b90505f6002826123c39190612fbb565b90505f81856123d29190613057565b90505f4790505f8211156123ea576123e98261256b565b5b5f81476123f79190613057565b90505f8385836124079190612f4d565b6124119190612fbb565b90505f5f8211801561242257505f86115b156124325761243182876127fd565b5b5f4711156124c557600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161247f9061300e565b5f6040518083038185875af1925050503d805f81146124b9576040519150601f19603f3d011682016040523d82523d5f602084013e6124be565b606091505b5050809150505b50505050505050612567565b6124da8261256b565b5f600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516125209061300e565b5f6040518083038185875af1925050503d805f811461255a576040519150601f19603f3d011682016040523d82523d5f602084013e61255f565b606091505b505080915050505b5050565b5f600267ffffffffffffffff8111156125875761258661308a565b5b6040519080825280602002602001820160405280156125b55781602001602082028036833780820191505090505b50905030815f815181106125cc576125cb6130b7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561266f573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061269391906130f8565b816001815181106126a7576126a66130b7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508161270c307f00000000000000000000000000000000000000000000000000000000000000006115df565b101561275e5761275d307f00000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61180c565b5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430610168426127ac9190612df2565b6040518663ffffffff1660e01b81526004016127cc959493929190613213565b5f604051808303815f87803b1580156127e3575f5ffd5b505af11580156127f5573d5f5f3e3d5ffd5b505050505050565b80612828307f00000000000000000000000000000000000000000000000000000000000000006115df565b101561287a57612879307f00000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61180c565b5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d7198330845f5f600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610168426128eb9190612df2565b6040518863ffffffff1660e01b815260040161290c9695949392919061326b565b60606040518083038185885af1158015612928573d5f5f3e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061294d91906132de565b5050505050565b5f819050919050565b61296681612954565b82525050565b5f60208201905061297f5f83018461295d565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6129c782612985565b6129d1818561298f565b93506129e181856020860161299f565b6129ea816129ad565b840191505092915050565b5f6020820190508181035f830152612a0d81846129bd565b905092915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612a4282612a19565b9050919050565b612a5281612a38565b8114612a5c575f5ffd5b50565b5f81359050612a6d81612a49565b92915050565b612a7c81612954565b8114612a86575f5ffd5b50565b5f81359050612a9781612a73565b92915050565b5f5f60408385031215612ab357612ab2612a15565b5b5f612ac085828601612a5f565b9250506020612ad185828601612a89565b9150509250929050565b5f8115159050919050565b612aef81612adb565b82525050565b5f602082019050612b085f830184612ae6565b92915050565b5f819050919050565b5f612b31612b2c612b2784612a19565b612b0e565b612a19565b9050919050565b5f612b4282612b17565b9050919050565b5f612b5382612b38565b9050919050565b612b6381612b49565b82525050565b5f602082019050612b7c5f830184612b5a565b92915050565b5f5f5f60608486031215612b9957612b98612a15565b5b5f612ba686828701612a5f565b9350506020612bb786828701612a5f565b9250506040612bc886828701612a89565b9150509250925092565b612bdb81612a38565b82525050565b5f602082019050612bf45f830184612bd2565b92915050565b5f60ff82169050919050565b612c0f81612bfa565b82525050565b5f602082019050612c285f830184612c06565b92915050565b5f60208284031215612c4357612c42612a15565b5b5f612c5084828501612a5f565b91505092915050565b5f60208284031215612c6e57612c6d612a15565b5b5f612c7b84828501612a89565b91505092915050565b5f5f60408385031215612c9a57612c99612a15565b5b5f612ca785828601612a89565b9250506020612cb885828601612a89565b9150509250929050565b612ccb81612adb565b8114612cd5575f5ffd5b50565b5f81359050612ce681612cc2565b92915050565b5f5f60408385031215612d0257612d01612a15565b5b5f612d0f85828601612a5f565b9250506020612d2085828601612cd8565b9150509250929050565b5f5f60408385031215612d4057612d3f612a15565b5b5f612d4d85828601612a5f565b9250506020612d5e85828601612a5f565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612dac57607f821691505b602082108103612dbf57612dbe612d68565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612dfc82612954565b9150612e0783612954565b9250828201905080821115612e1f57612e1e612dc5565b5b92915050565b5f604082019050612e385f830185612bd2565b612e45602083018461295d565b9392505050565b5f81519050919050565b5f81905092915050565b5f612e6a82612e4c565b612e748185612e56565b9350612e8481856020860161299f565b80840191505092915050565b5f612e9b8284612e60565b915081905092915050565b5f81519050612eb481612cc2565b92915050565b5f60208284031215612ecf57612ece612a15565b5b5f612edc84828501612ea6565b91505092915050565b7f4d4952524f523a20544f4b454e5f434c41494d5f4641494c45440000000000005f82015250565b5f612f19601a8361298f565b9150612f2482612ee5565b602082019050919050565b5f6020820190508181035f830152612f4681612f0d565b9050919050565b5f612f5782612954565b9150612f6283612954565b9250828202612f7081612954565b91508282048414831517612f8757612f86612dc5565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612fc582612954565b9150612fd083612954565b925082612fe057612fdf612f8e565b5b828204905092915050565b50565b5f612ff95f83612e56565b915061300482612feb565b5f82019050919050565b5f61301882612fee565b9150819050919050565b5f6060820190506130355f830186612bd2565b613042602083018561295d565b61304f604083018461295d565b949350505050565b5f61306182612954565b915061306c83612954565b925082820390508181111561308457613083612dc5565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f815190506130f281612a49565b92915050565b5f6020828403121561310d5761310c612a15565b5b5f61311a848285016130e4565b91505092915050565b5f819050919050565b5f61314661314161313c84613123565b612b0e565b612954565b9050919050565b6131568161312c565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61318e81612a38565b82525050565b5f61319f8383613185565b60208301905092915050565b5f602082019050919050565b5f6131c18261315c565b6131cb8185613166565b93506131d683613176565b805f5b838110156132065781516131ed8882613194565b97506131f8836131ab565b9250506001810190506131d9565b5085935050505092915050565b5f60a0820190506132265f83018861295d565b613233602083018761314d565b818103604083015261324581866131b7565b90506132546060830185612bd2565b613261608083018461295d565b9695505050505050565b5f60c08201905061327e5f830189612bd2565b61328b602083018861295d565b613298604083018761314d565b6132a5606083018661314d565b6132b26080830185612bd2565b6132bf60a083018461295d565b979650505050505050565b5f815190506132d881612a73565b92915050565b5f5f5f606084860312156132f5576132f4612a15565b5b5f613302868287016132ca565b9350506020613313868287016132ca565b9250506040613324868287016132ca565b915050925092509256fea2646970667358221220c1a080f963d300caf081b1b4af01c663dbf3bdc4a55e954ca7742b7f61c98de964736f6c634300081b0033

Deployed Bytecode

0x608060405260043610610254575f3560e01c80637a20d3da11610138578063a9059cbb116100b5578063c816841b11610079578063c816841b1461089b578063d8a6af07146108c5578063dd62ed3e146108ed578063edac684b14610929578063f2fde38b14610953578063fd1fb6051461097b5761025b565b8063a9059cbb146107bb578063aa4bde28146107f7578063aed04fae14610821578063c02466681461084b578063c0a904a2146108735761025b565b80638ea5220f116100fc5780638ea5220f146106ed57806395d89b41146107175780639d0014b1146107415780639e93ad8e14610769578063a2eb9c7d146107935761025b565b80637a20d3da146106215780638083b2c61461064957806382bf293c14610673578063877b6eec1461069b5780638da5cb5b146106c35761025b565b806342966c68116101d15780635cce86cd116101955780635cce86cd1461051757806370a0823114610553578063715018a61461058f57806374bfbf01146105a5578063790ca413146105cf57806379cc6790146105f95761025b565b806342966c681461043957806347ff0114146104615780634fbee1931461048b57806353b18166146104c75780635a0ad007146104ef5761025b565b806318160ddd1161021857806318160ddd1461034357806323b872dd1461036d5780632fb97b37146103a9578063313ce567146103d35780633ecad271146103fd5761025b565b80630445b6671461025f57806306fdde0314610289578063095ea7b3146102b357806315291cd4146102ef5780631694505e146103195761025b565b3661025b57005b5f5ffd5b34801561026a575f5ffd5b506102736109a3565b604051610280919061296c565b60405180910390f35b348015610294575f5ffd5b5061029d6109a9565b6040516102aa91906129f5565b60405180910390f35b3480156102be575f5ffd5b506102d960048036038101906102d49190612a9d565b610a39565b6040516102e69190612af5565b60405180910390f35b3480156102fa575f5ffd5b50610303610a5b565b604051610310919061296c565b60405180910390f35b348015610324575f5ffd5b5061032d610a61565b60405161033a9190612b69565b60405180910390f35b34801561034e575f5ffd5b50610357610a85565b604051610364919061296c565b60405180910390f35b348015610378575f5ffd5b50610393600480360381019061038e9190612b82565b610a8e565b6040516103a09190612af5565b60405180910390f35b3480156103b4575f5ffd5b506103bd610abc565b6040516103ca9190612be1565b60405180910390f35b3480156103de575f5ffd5b506103e7610ae1565b6040516103f49190612c15565b60405180910390f35b348015610408575f5ffd5b50610423600480360381019061041e9190612c2e565b610ae9565b6040516104309190612af5565b60405180910390f35b348015610444575f5ffd5b5061045f600480360381019061045a9190612c59565b610b06565b005b34801561046c575f5ffd5b50610475610b1a565b604051610482919061296c565b60405180910390f35b348015610496575f5ffd5b506104b160048036038101906104ac9190612c2e565b610b20565b6040516104be9190612af5565b60405180910390f35b3480156104d2575f5ffd5b506104ed60048036038101906104e89190612c59565b610b3d565b005b3480156104fa575f5ffd5b5061051560048036038101906105109190612c59565b610b5a565b005b348015610522575f5ffd5b5061053d60048036038101906105389190612c2e565b610bd4565b60405161054a9190612af5565b60405180910390f35b34801561055e575f5ffd5b5061057960048036038101906105749190612c2e565b610bf1565b604051610586919061296c565b60405180910390f35b34801561059a575f5ffd5b506105a3610c36565b005b3480156105b0575f5ffd5b506105b9610c49565b6040516105c6919061296c565b60405180910390f35b3480156105da575f5ffd5b506105e3610c74565b6040516105f0919061296c565b60405180910390f35b348015610604575f5ffd5b5061061f600480360381019061061a9190612a9d565b610c7a565b005b34801561062c575f5ffd5b5061064760048036038101906106429190612a9d565b610c9a565b005b348015610654575f5ffd5b5061065d610f15565b60405161066a919061296c565b60405180910390f35b34801561067e575f5ffd5b5061069960048036038101906106949190612c59565b610f1b565b005b3480156106a6575f5ffd5b506106c160048036038101906106bc9190612c2e565b610fbc565b005b3480156106ce575f5ffd5b506106d7611125565b6040516106e49190612be1565b60405180910390f35b3480156106f8575f5ffd5b5061070161114d565b60405161070e9190612be1565b60405180910390f35b348015610722575f5ffd5b5061072b611172565b60405161073891906129f5565b60405180910390f35b34801561074c575f5ffd5b5061076760048036038101906107629190612c59565b611202565b005b348015610774575f5ffd5b5061077d611249565b60405161078a919061296c565b60405180910390f35b34801561079e575f5ffd5b506107b960048036038101906107b49190612c84565b61124f565b005b3480156107c6575f5ffd5b506107e160048036038101906107dc9190612a9d565b6112dc565b6040516107ee9190612af5565b60405180910390f35b348015610802575f5ffd5b5061080b6112fe565b604051610818919061296c565b60405180910390f35b34801561082c575f5ffd5b50610835611304565b604051610842919061296c565b60405180910390f35b348015610856575f5ffd5b50610871600480360381019061086c9190612cec565b61130a565b005b34801561087e575f5ffd5b5061089960048036038101906108949190612cec565b6113f0565b005b3480156108a6575f5ffd5b506108af6114d6565b6040516108bc9190612be1565b60405180910390f35b3480156108d0575f5ffd5b506108eb60048036038101906108e69190612cec565b6114fa565b005b3480156108f8575f5ffd5b50610913600480360381019061090e9190612d2a565b6115df565b604051610920919061296c565b60405180910390f35b348015610934575f5ffd5b5061093d611661565b60405161094a919061296c565b60405180910390f35b34801561095e575f5ffd5b5061097960048036038101906109749190612c2e565b611667565b005b348015610986575f5ffd5b506109a1600480360381019061099c9190612d2a565b6116eb565b005b60075481565b6060600380546109b890612d95565b80601f01602080910402602001604051908101604052809291908181526020018280546109e490612d95565b8015610a2f5780601f10610a0657610100808354040283529160200191610a2f565b820191905f5260205f20905b815481529060010190602001808311610a1257829003601f168201915b5050505050905090565b5f5f610a43611805565b9050610a5081858561180c565b600191505092915050565b600d5481565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b5f600254905090565b5f5f610a98611805565b9050610aa585828561181e565b610ab08585856118b0565b60019150509392505050565b600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6012905090565b6010602052805f5260405f205f915054906101000a900460ff1681565b610b17610b11611805565b826119a0565b50565b600b5481565b6011602052805f5260405f205f915054906101000a900460ff1681565b610b45611a1f565b62015f908111610b575780600b819055505b50565b610b62611a1f565b6032811115610b9d576040517f4d26c46900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600981905550807f35ad15e7f5e4a16b548e8916bd02c51847dde8d106f334b4edaaacf140e43c9160405160405180910390a250565b6012602052805f5260405f205f915054906101000a900460ff1681565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610c3e611a1f565b610c475f611aa6565b565b5f600b54600a54610c5a9190612df2565b421015610c6b576008549050610c71565b60095490505b90565b600a5481565b610c8c82610c86611805565b8361181e565b610c9682826119a0565b5050565b610ca2611125565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580610d295750600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610d60576040517f9ef6307600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610dc5576040517fe9cceb3600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685604051602401610e17929190612e25565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610e659190612e90565b5f604051808303815f865af19150503d805f8114610e9e576040519150601f19603f3d011682016040523d82523d5f602084013e610ea3565b606091505b5091509150818015610ed057505f81511480610ecf575080806020019051810190610ece9190612eba565b5b5b610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0690612f2f565b60405180910390fd5b50505050565b60095481565b610f23611a1f565b600a8110610f87576103e8816a52b7d2dcc80cd2e4000000610f459190612f4d565b610f4f9190612fbb565b600681905550807f898802fb55543ddaa2694cef66016735c42b3f7fb862cd9010c384a24fbecda760405160405180910390a2610fb9565b6040517f6f1e40f800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b610fc4611125565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158061104b5750600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15611082576040517f9ef6307600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8173ffffffffffffffffffffffffffffffffffffffff16476040516110a79061300e565b5f6040518083038185875af1925050503d805f81146110e1576040519150601f19603f3d011682016040523d82523d5f602084013e6110e6565b606091505b5050905080611121576040517fdce5a24800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606004805461118190612d95565b80601f01602080910402602001604051908101604052809291908181526020018280546111ad90612d95565b80156111f85780601f106111cf576101008083540402835291602001916111f8565b820191905f5260205f20905b8154815290600101906020018083116111db57829003601f168201915b5050505050905090565b61120a611a1f565b60646a52b7d2dcc80cd2e40000006112229190612fbb565b81111580156112395750683635c9adc5dea0000081115b1561124657806007819055505b50565b6103e881565b611257611a1f565b606481836112659190612df2565b1461129c576040517f4d86a81800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600c8190555080600d8190555080827f64bae4d9db5f171ae2c5ab89b09e67ca480c2e167bbd2e5b537943c03099c1ff60405160405180910390a35050565b5f5f6112e6611805565b90506112f38185856118b0565b600191505092915050565b60065481565b600c5481565b611312611a1f565b80151560115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611398576040517fc7f2b1ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b6113f8611a1f565b80151560125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615150361147e576040517fc7f2b1ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b7f000000000000000000000000578ac40caf98313307bf4d0a4b4fd36856227a1e81565b611502611a1f565b7f000000000000000000000000578ac40caf98313307bf4d0a4b4fd36856227a1e73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611587576040517f8d5fb9f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60085481565b61166f611a1f565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036116df575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016116d69190612be1565b60405180910390fd5b6116e881611aa6565b50565b6116f3611a1f565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146118015781600e5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f316af92955f23ddbd4c570a5f8cda8a10b192f24d8f58524deb2fcb03a8bc79460405160405180910390a35b5050565b5f33905090565b6118198383836001611b69565b505050565b5f61182984846115df565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146118aa578181101561189b578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161189293929190613022565b60405180910390fd5b6118a984848484035f611b69565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611920575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016119179190612be1565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611990575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016119879190612be1565b60405180910390fd5b61199b838383611d38565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a10575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611a079190612be1565b60405180910390fd5b611a1b825f83611d38565b5050565b611a27611805565b73ffffffffffffffffffffffffffffffffffffffff16611a45611125565b73ffffffffffffffffffffffffffffffffffffffff1614611aa457611a68611805565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611a9b9190612be1565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611bd9575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611bd09190612be1565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c49575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611c409190612be1565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611d32578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611d29919061296c565b60405180910390a35b50505050565b5f6001905060115f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680611dd8575060115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15611de1575f90505b7f000000000000000000000000578ac40caf98313307bf4d0a4b4fd36856227a1e73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148015611e3d57505f600a54145b15611e4a5742600a819055505b801561204d575f5f600b54600a54611e629190612df2565b421015611e73576008549050611e79565b60095490505b60105f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015611f17575060125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15611f6c5760065484611f2987610bf1565b611f339190612df2565b1115611f6b576040517f6f1e40f800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b60105f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612007575060105f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15612028576103e8818561201b9190612f4d565b6120259190612fbb565b91505b81846120349190613057565b93505f82111561204a57612049863084612165565b5b50505b5f61205730610bf1565b90505f60075482101580156120b3575060105f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156120f257506120c2611125565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b801561210b5750600f60149054906101000a900460ff16155b90508015612152576001600f60146101000a81548160ff0219169083151502179055506121378261237e565b5f600f60146101000a81548160ff0219169083151502179055505b61215d868686612165565b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121b5578060025f8282546121a99190612df2565b92505081905550612283565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101561223e578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161223593929190613022565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036122ca578060025f8282540392505081905550612314565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612371919061296c565b60405180910390a3505050565b5f600d54600c5461238f9190612df2565b90505f8111156124d1575f81600d54846123a99190612f4d565b6123b39190612fbb565b90505f6002826123c39190612fbb565b90505f81856123d29190613057565b90505f4790505f8211156123ea576123e98261256b565b5b5f81476123f79190613057565b90505f8385836124079190612f4d565b6124119190612fbb565b90505f5f8211801561242257505f86115b156124325761243182876127fd565b5b5f4711156124c557600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161247f9061300e565b5f6040518083038185875af1925050503d805f81146124b9576040519150601f19603f3d011682016040523d82523d5f602084013e6124be565b606091505b5050809150505b50505050505050612567565b6124da8261256b565b5f600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516125209061300e565b5f6040518083038185875af1925050503d805f811461255a576040519150601f19603f3d011682016040523d82523d5f602084013e61255f565b606091505b505080915050505b5050565b5f600267ffffffffffffffff8111156125875761258661308a565b5b6040519080825280602002602001820160405280156125b55781602001602082028036833780820191505090505b50905030815f815181106125cc576125cb6130b7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561266f573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061269391906130f8565b816001815181106126a7576126a66130b7565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508161270c307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6115df565b101561275e5761275d307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61180c565b5b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430610168426127ac9190612df2565b6040518663ffffffff1660e01b81526004016127cc959493929190613213565b5f604051808303815f87803b1580156127e3575f5ffd5b505af11580156127f5573d5f5f3e3d5ffd5b505050505050565b80612828307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6115df565b101561287a57612879307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61180c565b5b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d7198330845f5f600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610168426128eb9190612df2565b6040518863ffffffff1660e01b815260040161290c9695949392919061326b565b60606040518083038185885af1158015612928573d5f5f3e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061294d91906132de565b5050505050565b5f819050919050565b61296681612954565b82525050565b5f60208201905061297f5f83018461295d565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6129c782612985565b6129d1818561298f565b93506129e181856020860161299f565b6129ea816129ad565b840191505092915050565b5f6020820190508181035f830152612a0d81846129bd565b905092915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612a4282612a19565b9050919050565b612a5281612a38565b8114612a5c575f5ffd5b50565b5f81359050612a6d81612a49565b92915050565b612a7c81612954565b8114612a86575f5ffd5b50565b5f81359050612a9781612a73565b92915050565b5f5f60408385031215612ab357612ab2612a15565b5b5f612ac085828601612a5f565b9250506020612ad185828601612a89565b9150509250929050565b5f8115159050919050565b612aef81612adb565b82525050565b5f602082019050612b085f830184612ae6565b92915050565b5f819050919050565b5f612b31612b2c612b2784612a19565b612b0e565b612a19565b9050919050565b5f612b4282612b17565b9050919050565b5f612b5382612b38565b9050919050565b612b6381612b49565b82525050565b5f602082019050612b7c5f830184612b5a565b92915050565b5f5f5f60608486031215612b9957612b98612a15565b5b5f612ba686828701612a5f565b9350506020612bb786828701612a5f565b9250506040612bc886828701612a89565b9150509250925092565b612bdb81612a38565b82525050565b5f602082019050612bf45f830184612bd2565b92915050565b5f60ff82169050919050565b612c0f81612bfa565b82525050565b5f602082019050612c285f830184612c06565b92915050565b5f60208284031215612c4357612c42612a15565b5b5f612c5084828501612a5f565b91505092915050565b5f60208284031215612c6e57612c6d612a15565b5b5f612c7b84828501612a89565b91505092915050565b5f5f60408385031215612c9a57612c99612a15565b5b5f612ca785828601612a89565b9250506020612cb885828601612a89565b9150509250929050565b612ccb81612adb565b8114612cd5575f5ffd5b50565b5f81359050612ce681612cc2565b92915050565b5f5f60408385031215612d0257612d01612a15565b5b5f612d0f85828601612a5f565b9250506020612d2085828601612cd8565b9150509250929050565b5f5f60408385031215612d4057612d3f612a15565b5b5f612d4d85828601612a5f565b9250506020612d5e85828601612a5f565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612dac57607f821691505b602082108103612dbf57612dbe612d68565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612dfc82612954565b9150612e0783612954565b9250828201905080821115612e1f57612e1e612dc5565b5b92915050565b5f604082019050612e385f830185612bd2565b612e45602083018461295d565b9392505050565b5f81519050919050565b5f81905092915050565b5f612e6a82612e4c565b612e748185612e56565b9350612e8481856020860161299f565b80840191505092915050565b5f612e9b8284612e60565b915081905092915050565b5f81519050612eb481612cc2565b92915050565b5f60208284031215612ecf57612ece612a15565b5b5f612edc84828501612ea6565b91505092915050565b7f4d4952524f523a20544f4b454e5f434c41494d5f4641494c45440000000000005f82015250565b5f612f19601a8361298f565b9150612f2482612ee5565b602082019050919050565b5f6020820190508181035f830152612f4681612f0d565b9050919050565b5f612f5782612954565b9150612f6283612954565b9250828202612f7081612954565b91508282048414831517612f8757612f86612dc5565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612fc582612954565b9150612fd083612954565b925082612fe057612fdf612f8e565b5b828204905092915050565b50565b5f612ff95f83612e56565b915061300482612feb565b5f82019050919050565b5f61301882612fee565b9150819050919050565b5f6060820190506130355f830186612bd2565b613042602083018561295d565b61304f604083018461295d565b949350505050565b5f61306182612954565b915061306c83612954565b925082820390508181111561308457613083612dc5565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f815190506130f281612a49565b92915050565b5f6020828403121561310d5761310c612a15565b5b5f61311a848285016130e4565b91505092915050565b5f819050919050565b5f61314661314161313c84613123565b612b0e565b612954565b9050919050565b6131568161312c565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61318e81612a38565b82525050565b5f61319f8383613185565b60208301905092915050565b5f602082019050919050565b5f6131c18261315c565b6131cb8185613166565b93506131d683613176565b805f5b838110156132065781516131ed8882613194565b97506131f8836131ab565b9250506001810190506131d9565b5085935050505092915050565b5f60a0820190506132265f83018861295d565b613233602083018761314d565b818103604083015261324581866131b7565b90506132546060830185612bd2565b613261608083018461295d565b9695505050505050565b5f60c08201905061327e5f830189612bd2565b61328b602083018861295d565b613298604083018761314d565b6132a5606083018661314d565b6132b26080830185612bd2565b6132bf60a083018461295d565b979650505050505050565b5f815190506132d881612a73565b92915050565b5f5f5f606084860312156132f5576132f4612a15565b5b5f613302868287016132ca565b9350506020613313868287016132ca565b9250506040613324868287016132ca565b915050925092509256fea2646970667358221220c1a080f963d300caf081b1b4af01c663dbf3bdc4a55e954ca7742b7f61c98de964736f6c634300081b0033

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.