ETH Price: $2,340.22 (-5.35%)

Token

Nimo Trade (NIMO)
 

Overview

Max Total Supply

1,000,000,000 NIMO

Holders

42

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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

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

Contract Source Code Verified (Exact Match)

Contract Name:
NimoTrade

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2025-02-19
*/

/*
    
    Website : https://nimotrade.org/
    Twitter : https://x.com/NimoTrade20677
    TG      : https://t.me/nimotrade

*/
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
/**
 * @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);
}

// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.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);
}

// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)

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

// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)

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

// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.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 => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.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);
    }
}

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

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

    function WETH() external pure returns (address);

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

pragma solidity ^0.8.0;

contract NimoTrade is Ownable, ERC20 {
    IUniswapV2Router public immutable swapRouter;

    address public constant ZERO_ADDRESS = address(0);
    address public constant BURN_ADDRESS = address(0xdEaD);

    address public immutable swapPair;
    address public taxWallet;
    address public devWallet;

    bool public limitsEnabled;
    bool public cooldownEnabled;
    bool public feesEnabled;
    bool private inSwapProcess;
    bool public isActivated;

    uint256 public activationBlock;
    uint256 public activationTime;

    uint256 private lastSwapBlock;

    uint256 public constant MAX_TOTAL_FEE = 35;

    uint256 public maxBuyLimit;
    uint256 public maxSellLimit;
    uint256 public maxWalletLimit;

    uint256 public tokensForSwap;
    uint256 public buyTax;
    uint256 public sellTax;
    uint256 public transferTax;

    mapping(address => bool) public blacklistedBots;
    mapping(address => bool) public excludedFromFees;
    mapping(address => bool) public excludedFromLimits;
    mapping(address => bool) public marketPairs;
    mapping(address => uint256) private _lastTransferBlock;

    event Activation();
    event taxWalletUpdated(address newWallet, address oldWallet);
    event DevWalletUpdated(address newWallet, address oldWallet);
    event LimitsStatusChanged(bool status);
    event CooldownStatusChanged(bool status);
    event FeesStatusChanged(bool status);
    event MaxBuyLimitUpdated(uint256 amount);
    event MaxSellLimitUpdated(uint256 amount);
    event MaxWalletLimitUpdated(uint256 amount);
    event TokensForSwapUpdated(uint256 newValue, uint256 oldValue);
    event BuyTaxUpdated(uint256 newValue, uint256 oldValue);
    event SellTaxUpdated(uint256 newValue, uint256 oldValue);
    event TransferTaxUpdated(uint256 newValue, uint256 oldValue);
    event ExcludedFromFees(address account, bool isExcluded);
    event ExcludedFromLimits(address account, bool isExcluded);
    event BotStatusUpdated(address account, bool isBlacklisted);
    event MarketPairStatusUpdated(address pair, bool value);
    event StuckTokensWithdrawn(address token, uint256 amount);

    error AlreadyActivated();
    error InvalidAddress();
    error AmountTooSmall();
    error AmountTooLarge();
    error FeeTooHigh();
    error PairAlreadySet();
    error NoETHToWithdraw();
    error NoTokensToWithdraw();
    error ETHWithdrawalFailed();
    error BotActivityDetected();
    error TransferCooldown();
    error ExceedsMaxBuyLimit();
    error ExceedsMaxSellLimit();
    error ExceedsMaxWalletLimit();
    error NotActivated();

    modifier lockSwapProcess() {
        inSwapProcess = true;
        _;
        inSwapProcess = false;
    }

    constructor() Ownable(msg.sender) ERC20("Nimo Trade", "NIMO") {
        address owner = msg.sender;
        _mint(owner, 1_000_000_000 ether);
        uint256 totalSupplyTokens = totalSupply();

        taxWallet = 0xD7b4eB116316B01696a557e629460E89CE16f4F2;
        devWallet = 0xD7b4eB116316B01696a557e629460E89CE16f4F2;

        maxBuyLimit = (totalSupplyTokens * 20) / 1000;
        maxSellLimit = (totalSupplyTokens * 20) / 1000;
        maxWalletLimit = (totalSupplyTokens * 20) / 1000;
        tokensForSwap = (totalSupplyTokens * 5) / 10000;

        limitsEnabled = true;
        cooldownEnabled = false;
        feesEnabled = true;

        buyTax = 10;
        sellTax = 10;
        transferTax = 0;

        swapRouter = IUniswapV2Router(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );

        swapPair = IUniswapV2Factory(swapRouter.factory()).createPair(
            address(this),
            swapRouter.WETH()
        );

        _setMarketPair(swapPair, true);
        _approve(address(this), address(swapRouter), type(uint256).max);
        _excludeFromFees(address(this), true);
        _excludeFromFees(BURN_ADDRESS, true);
        _excludeFromFees(owner, true);
        _excludeFromFees(taxWallet, true);
        _excludeFromFees(devWallet, true);
        _excludeFromLimits(address(this), true);
        _excludeFromLimits(BURN_ADDRESS, true);
        _excludeFromLimits(owner, true);
        _excludeFromLimits(taxWallet, true);
        _excludeFromLimits(devWallet, true);
    }

    receive() external payable {}

    fallback() external payable {}

    function _transferOwnership(address newOwner) internal override {
        address oldOwner = owner();
        if (oldOwner != ZERO_ADDRESS) {
            _excludeFromFees(oldOwner, false);
            _excludeFromLimits(oldOwner, false);
        }
        _excludeFromFees(newOwner, true);
        _excludeFromLimits(newOwner, true);
        super._transferOwnership(newOwner);
    }

    function activateTrading() external onlyOwner {
        require(!isActivated, AlreadyActivated());
        isActivated = true;
        activationBlock = block.number;
        activationTime = block.timestamp;
        emit Activation();
    }

    function updatetaxWallet(address _taxWallet) external onlyOwner {
        require(_taxWallet != ZERO_ADDRESS, InvalidAddress());
        address oldWallet = taxWallet;
        taxWallet = _taxWallet;
        emit taxWalletUpdated(taxWallet, oldWallet);
    }

    function updateDevWallet(address _devWallet) external onlyOwner {
        require(_devWallet != ZERO_ADDRESS, InvalidAddress());
        address oldWallet = devWallet;
        devWallet = _devWallet;
        emit DevWalletUpdated(devWallet, oldWallet);
    }

    function changeLimitsEnabled(bool value) external onlyOwner {
        limitsEnabled = value;
        emit LimitsStatusChanged(value);
    }

    function changeCooldownEnabled(bool value) external onlyOwner {
        cooldownEnabled = value;
        emit CooldownStatusChanged(value);
    }

    function setFeesEnabled(bool value) external onlyOwner {
        feesEnabled = value;
        emit FeesStatusChanged(value);
    }

    function setMaxBuyLimit(uint256 amount) external onlyOwner {
        require(amount >= ((totalSupply() * 2) / 1000), AmountTooSmall());
        maxBuyLimit = amount;
        emit MaxBuyLimitUpdated(maxBuyLimit);
    }

    function setMaxSellLimit(uint256 amount) external onlyOwner {
        require(amount >= ((totalSupply() * 2) / 1000), AmountTooSmall());
        maxSellLimit = amount;
        emit MaxSellLimitUpdated(maxSellLimit);
    }

    function setMaxWalletLimit(uint256 amount) external onlyOwner {
        require(amount >= ((totalSupply() * 3) / 1000), AmountTooSmall());
        maxWalletLimit = amount;
        emit MaxWalletLimitUpdated(maxWalletLimit);
    }

    function setTokensForSwap(uint256 amount) external onlyOwner {
        uint256 totalSupplyTokens = totalSupply();
        require(amount >= (totalSupplyTokens * 1) / 1000000, AmountTooSmall());
        require(amount <= (totalSupplyTokens * 5) / 1000, AmountTooLarge());
        uint256 oldValue = tokensForSwap;
        tokensForSwap = amount;
        emit TokensForSwapUpdated(amount, oldValue);
    }

    function setTax(uint256 _buyTax, uint256 _sellTax) external onlyOwner {
        require(_buyTax <= MAX_TOTAL_FEE, FeeTooHigh());
        require(_sellTax <= MAX_TOTAL_FEE, FeeTooHigh());

        buyTax = _buyTax;
        sellTax = _sellTax;
    }

    function changeTransferTax(uint256 _transferTax) external onlyOwner {
        require(_transferTax <= MAX_TOTAL_FEE, FeeTooHigh());
        uint256 oldValue = transferTax;
        transferTax = _transferTax;
        emit TransferTaxUpdated(_transferTax, oldValue);
    }

    function excludeFromFees(
        address[] calldata accounts,
        bool value
    ) external onlyOwner {
        for (uint256 i = 0; i < accounts.length; i++) {
            _excludeFromFees(accounts[i], value);
        }
    }

    function excludeFromLimits(
        address[] calldata accounts,
        bool value
    ) external onlyOwner {
        for (uint256 i = 0; i < accounts.length; i++) {
            _excludeFromLimits(accounts[i], value);
        }
    }

    function setBlacklistedBots(
        address[] calldata accounts,
        bool value
    ) external onlyOwner {
        for (uint256 i = 0; i < accounts.length; i++) {
            if (
                (!marketPairs[accounts[i]]) &&
                (accounts[i] != address(swapRouter)) &&
                (accounts[i] != address(this)) &&
                (accounts[i] != ZERO_ADDRESS) &&
                (!excludedFromFees[accounts[i]] &&
                    !excludedFromLimits[accounts[i]])
            ) _updateBotStatus(accounts[i], value);
        }
    }

    function setMarketPair(address pair, bool value) external onlyOwner {
        require(!marketPairs[pair], PairAlreadySet());
        _setMarketPair(pair, value);
    }

    function clearStuckTokensNIMO(address _token) external onlyOwner {
        address owner = msg.sender;
        uint256 amount;
        if (_token == ZERO_ADDRESS) {
            bool success;
            amount = address(this).balance;
            require(amount > 0, NoETHToWithdraw());
            (success, ) = address(owner).call{value: amount}("");
            require(success, ETHWithdrawalFailed());
        } else {
            amount = IERC20(_token).balanceOf(address(this));
            require(amount > 0, NoTokensToWithdraw());
            IERC20(_token).transfer(msg.sender, amount);
        }
        emit StuckTokensWithdrawn(_token, amount);
    }

    function _update(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        address sender = msg.sender;
        address origin = tx.origin;

        require(!blacklistedBots[from], BotActivityDetected());
        require(
            sender == from || !blacklistedBots[sender],
            BotActivityDetected()
        );
        require(
            origin == from || origin == sender || !blacklistedBots[origin],
            BotActivityDetected()
        );

        require(
            isActivated || excludedFromLimits[from] || excludedFromLimits[to],
            NotActivated()
        );

        bool applyLimits = limitsEnabled &&
            !inSwapProcess &&
            !(excludedFromLimits[from] || excludedFromLimits[to]);
        if (applyLimits) {
            if (
                from != owner() &&
                to != owner() &&
                to != ZERO_ADDRESS &&
                to != BURN_ADDRESS
            ) {
                if (cooldownEnabled) {
                    if (to != address(swapRouter) && to != swapPair) {
                        require(
                            _lastTransferBlock[origin] < block.number - 3 &&
                                _lastTransferBlock[to] < block.number - 3,
                            TransferCooldown()
                        );
                        _lastTransferBlock[origin] = block.number;
                        _lastTransferBlock[to] = block.number;
                    }
                }

                if (marketPairs[from] && !excludedFromLimits[to]) {
                    require(amount <= maxBuyLimit, ExceedsMaxBuyLimit());
                    require(
                        amount + balanceOf(to) <= maxWalletLimit,
                        ExceedsMaxWalletLimit()
                    );
                } else if (marketPairs[to] && !excludedFromLimits[from]) {
                    require(amount <= maxSellLimit, ExceedsMaxSellLimit());
                } else if (!excludedFromLimits[to]) {
                    require(
                        amount + balanceOf(to) <= maxWalletLimit,
                        ExceedsMaxWalletLimit()
                    );
                }
            }
        }

        bool applyFee = feesEnabled &&
            !inSwapProcess &&
            !(excludedFromFees[from] || excludedFromFees[to]);

        if (applyFee) {
            uint256 feeAmount = 0;
            if (marketPairs[to] && sellTax > 0) {
                feeAmount = (amount * sellTax) / 100;
            } else if (marketPairs[from] && buyTax > 0) {
                feeAmount = (amount * buyTax) / 100;
            } else if (
                !marketPairs[to] && !marketPairs[from] && transferTax > 0
            ) {
                feeAmount = (amount * transferTax) / 100;
            }

            if (feeAmount > 0) {
                amount -= feeAmount;
                super._update(from, address(this), feeAmount);
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= tokensForSwap;
        if (applyFee && !marketPairs[from] && canSwap) {
            if (block.number > lastSwapBlock && block.number > activationBlock) {
                _swapTokens(contractTokenBalance);
                lastSwapBlock = block.number;
            }
        }

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

    function _swapTokens(uint256 tokenAmount) internal virtual lockSwapProcess {
        bool success;
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = swapRouter.WETH();

        uint256 maxSwapAmount = tokensForSwap * 20;

        if (tokenAmount > maxSwapAmount) {
            tokenAmount = maxSwapAmount;
        }

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

        uint256 ethBalance = address(this).balance;

        uint256 ethForRevenue = ethBalance / 2;
        uint256 ethForDevelopment = ethBalance - ethForRevenue;

        (success, ) = address(taxWallet).call{value: ethForRevenue}("");
        (success, ) = address(devWallet).call{value: ethForDevelopment}("");
    }

    function _excludeFromFees(address account, bool value) internal virtual {
        excludedFromFees[account] = value;
        emit ExcludedFromFees(account, value);
    }

    function _excludeFromLimits(address account, bool value) internal virtual {
        excludedFromLimits[account] = value;
        emit ExcludedFromLimits(account, value);
    }

    function _updateBotStatus(address account, bool value) internal virtual {
        blacklistedBots[account] = value;
        emit BotStatusUpdated(account, value);
    }

    function _setMarketPair(address pair, bool value) internal virtual {
        marketPairs[pair] = value;
        emit MarketPairStatusUpdated(pair, value);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyActivated","type":"error"},{"inputs":[],"name":"AmountTooLarge","type":"error"},{"inputs":[],"name":"AmountTooSmall","type":"error"},{"inputs":[],"name":"BotActivityDetected","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":"ETHWithdrawalFailed","type":"error"},{"inputs":[],"name":"ExceedsMaxBuyLimit","type":"error"},{"inputs":[],"name":"ExceedsMaxSellLimit","type":"error"},{"inputs":[],"name":"ExceedsMaxWalletLimit","type":"error"},{"inputs":[],"name":"FeeTooHigh","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"NoETHToWithdraw","type":"error"},{"inputs":[],"name":"NoTokensToWithdraw","type":"error"},{"inputs":[],"name":"NotActivated","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":"PairAlreadySet","type":"error"},{"inputs":[],"name":"TransferCooldown","type":"error"},{"anonymous":false,"inputs":[],"name":"Activation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isBlacklisted","type":"bool"}],"name":"BotStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"BuyTaxUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"CooldownStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newWallet","type":"address"},{"indexed":false,"internalType":"address","name":"oldWallet","type":"address"}],"name":"DevWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedFromLimits","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"FeesStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"LimitsStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"MarketPairStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MaxBuyLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MaxSellLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MaxWalletLimitUpdated","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":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"SellTaxUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StuckTokensWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"TokensForSwapUpdated","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":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"TransferTaxUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newWallet","type":"address"},{"indexed":false,"internalType":"address","name":"oldWallet","type":"address"}],"name":"taxWalletUpdated","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOTAL_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZERO_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activateTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activationBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activationTime","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":"address","name":"","type":"address"}],"name":"blacklistedBots","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"changeCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"changeLimitsEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_transferTax","type":"uint256"}],"name":"changeTransferTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"clearStuckTokensNIMO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cooldownEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feesEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActivated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"marketPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletLimit","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":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setBlacklistedBots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setFeesEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setMarketPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxBuyLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxSellLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyTax","type":"uint256"},{"internalType":"uint256","name":"_sellTax","type":"uint256"}],"name":"setTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setTokensForSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"transferTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_devWallet","type":"address"}],"name":"updateDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_taxWallet","type":"address"}],"name":"updatetaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405234801561000f575f5ffd5b50604080518082018252600a8152694e696d6f20547261646560b01b602080830191909152825180840190935260048352634e494d4f60e01b9083015290338061007357604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61007c816103b1565b5060046100898382611139565b5060056100968282611139565b503391506100b29050816b033b2e3c9fd0803ce80000006103f9565b5f6100bc60035490565b6006805473d7b4eb116316b01696a557e629460e89ce16f4f26001600160a01b0319918216811790925560078054909116909117905590506103e8610102826014611207565b61010c9190611224565b600b556103e861011d826014611207565b6101279190611224565b600c556103e8610138826014611207565b6101429190611224565b600d55612710610153826005611207565b61015d9190611224565b600e556007805462ffffff60a01b19166201000160a01b179055600a600f8190556010555f601155737a250d5630b4cf539739df2c5dacb4c659f2488d60808190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156101d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101fc9190611243565b6001600160a01b031663c9c65396306080516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610249573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061026d9190611243565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af11580156102b7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102db9190611243565b6001600160a01b031660a08190526102f490600161042d565b610308306080515f1961049060201b60201c565b6103133060016104a2565b61032061dead60016104a2565b61032b8260016104a2565b600654610342906001600160a01b031660016104a2565b600754610359906001600160a01b031660016104a2565b6103643060016104fd565b61037161dead60016104fd565b61037c8260016104fd565b600654610393906001600160a01b031660016104fd565b6007546103aa906001600160a01b031660016104fd565b505061131a565b5f546001600160a01b031680156103d6576103cc815f6104a2565b6103d6815f6104fd565b6103e18260016104a2565b6103ec8260016104fd565b6103f582610558565b5050565b6001600160a01b0382166104225760405163ec442f0560e01b81525f600482015260240161006a565b6103f55f83836105a7565b6001600160a01b0382165f81815260156020908152604091829020805460ff19168515159081179091558251938452908301527f024f6c8d60a57c94822c46d989fd6935057590269281b07fe8327d7e9bc4242191015b60405180910390a15050565b61049d8383836001610c51565b505050565b6001600160a01b0382165f81815260136020908152604091829020805460ff19168515159081179091558251938452908301527f3499bfcf9673677ba552f3fe2ea274ec7e6246da31c3c87e115b45a9b0db2efb9101610484565b6001600160a01b0382165f81815260146020908152604091829020805460ff19168515159081179091558251938452908301527f74392251b09500cc108c71712e5e7e0392be9075a74a24f1494551cfa8e068709101610484565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0383165f908152601260205260409020543390329060ff16156105e457604051631a30f03760e31b815260040160405180910390fd5b846001600160a01b0316826001600160a01b0316148061061c57506001600160a01b0382165f9081526012602052604090205460ff16155b61063957604051631a30f03760e31b815260040160405180910390fd5b846001600160a01b0316816001600160a01b0316148061066a5750816001600160a01b0316816001600160a01b0316145b8061068d57506001600160a01b0381165f9081526012602052604090205460ff16155b6106aa57604051631a30f03760e31b815260040160405180910390fd5b600754600160c01b900460ff16806106d957506001600160a01b0385165f9081526014602052604090205460ff165b806106fb57506001600160a01b0384165f9081526014602052604090205460ff165b6107185760405163037c597f60e01b815260040160405180910390fd5b6007545f90600160a01b900460ff16801561073d5750600754600160b81b900460ff16155b801561078357506001600160a01b0386165f9081526014602052604090205460ff168061078157506001600160a01b0385165f9081526014602052604090205460ff165b155b90508015610a42575f546001600160a01b038781169116148015906107b557505f546001600160a01b03868116911614155b80156107c957506001600160a01b03851615155b80156107e057506001600160a01b03851661dead14155b15610a4257600754600160a81b900460ff16156108c8576080516001600160a01b0316856001600160a01b03161415801561082f575060a0516001600160a01b0316856001600160a01b031614155b156108c85761083f600343611270565b6001600160a01b0383165f90815260166020526040902054108015610884575061086a600343611270565b6001600160a01b0386165f90815260166020526040902054105b6108a1576040516329a226cf60e11b815260040160405180910390fd5b6001600160a01b038083165f90815260166020526040808220439081905592881682529020555b6001600160a01b0386165f9081526015602052604090205460ff16801561090757506001600160a01b0385165f9081526014602052604090205460ff16155b1561097857600b5484111561092f576040516344df090f60e11b815260040160405180910390fd5b600d546001600160a01b0386165f908152600160205260409020546109549086611283565b111561097357604051633b63e02960e11b815260040160405180910390fd5b610a42565b6001600160a01b0385165f9081526015602052604090205460ff1680156109b757506001600160a01b0386165f9081526014602052604090205460ff16155b156109df57600c5484111561097357604051630a8e28e160e41b815260040160405180910390fd5b6001600160a01b0385165f9081526014602052604090205460ff16610a4257600d546001600160a01b0386165f90815260016020526040902054610a239086611283565b1115610a4257604051633b63e02960e11b815260040160405180910390fd5b6007545f90600160b01b900460ff168015610a675750600754600160b81b900460ff16155b8015610aad57506001600160a01b0387165f9081526013602052604090205460ff1680610aab57506001600160a01b0386165f9081526013602052604090205460ff165b155b90508015610bce576001600160a01b0386165f9081526015602052604081205460ff168015610add57505f601054115b15610b0357606460105487610af29190611207565b610afc9190611224565b9050610baf565b6001600160a01b0388165f9081526015602052604090205460ff168015610b2b57505f600f54115b15610b40576064600f5487610af29190611207565b6001600160a01b0387165f9081526015602052604090205460ff16158015610b8057506001600160a01b0388165f9081526015602052604090205460ff16155b8015610b8d57505f601154115b15610baf57606460115487610ba29190611207565b610bac9190611224565b90505b8015610bcc57610bbf8187611270565b9550610bcc883083610d24565b505b305f90815260016020526040902054600e54811015828015610c0857506001600160a01b0389165f9081526015602052604090205460ff16155b8015610c115750805b15610c3b57600a5443118015610c28575060085443115b15610c3b57610c3682610e4a565b43600a555b610c46898989610d24565b505050505050505050565b6001600160a01b038416610c7a5760405163e602df0560e01b81525f600482015260240161006a565b6001600160a01b038316610ca357604051634a1406b160e11b81525f600482015260240161006a565b6001600160a01b038085165f9081526002602090815260408083209387168352929052208290558015610d1e57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610d1591815260200190565b60405180910390a35b50505050565b6001600160a01b038316610d4e578060035f828254610d439190611283565b90915550610dbe9050565b6001600160a01b0383165f9081526001602052604090205481811015610da05760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161006a565b6001600160a01b0384165f9081526001602052604090209082900390555b6001600160a01b038216610dda57600380548290039055610df8565b6001600160a01b0382165f9081526001602052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610e3d91815260200190565b60405180910390a3505050565b6007805460ff60b81b1916600160b81b1790556040805160028082526060820183525f928392919060208301908036833701905050905030815f81518110610e9457610e94611296565b60200260200101906001600160a01b031690816001600160a01b0316815250506080516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f169190611243565b81600181518110610f2957610f29611296565b60200260200101906001600160a01b031690816001600160a01b0316815250505f600e546014610f599190611207565b905080841115610f67578093505b6080516001600160a01b031663791ac947855f8530426040518663ffffffff1660e01b8152600401610f9d9594939291906112aa565b5f604051808303815f87803b158015610fb4575f5ffd5b505af1158015610fc6573d5f5f3e3d5ffd5b504792505f9150610fda9050600283611224565b90505f610fe78284611270565b6006546040519192506001600160a01b03169083905f81818185875af1925050503d805f8114611032576040519150601f19603f3d011682016040523d82523d5f602084013e611037565b606091505b50506007546040519197506001600160a01b03169082905f81818185875af1925050503d805f8114611084576040519150601f19603f3d011682016040523d82523d5f602084013e611089565b606091505b50506007805460ff60b81b191690555050505050505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806110ca57607f821691505b6020821081036110e857634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561049d57805f5260205f20601f840160051c810160208510156111135750805b601f840160051c820191505b81811015611132575f815560010161111f565b5050505050565b81516001600160401b03811115611152576111526110a2565b6111668161116084546110b6565b846110ee565b6020601f821160018114611198575f83156111815750848201515b5f19600385901b1c1916600184901b178455611132565b5f84815260208120601f198516915b828110156111c757878501518255602094850194600190920191016111a7565b50848210156111e457868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761121e5761121e6111f3565b92915050565b5f8261123e57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215611253575f5ffd5b81516001600160a01b0381168114611269575f5ffd5b9392505050565b8181038181111561121e5761121e6111f3565b8082018082111561121e5761121e6111f3565b634e487b7160e01b5f52603260045260245ffd5b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b818110156112fa5783516001600160a01b03168352602093840193909201916001016112d3565b50506001600160a01b039590951660608401525050608001529392505050565b60805160a05161278b61135e5f395f81816104330152611b6501525f818161084401528181610c1801528181611b280152818161219d0152612283015261278b5ff3fe6080604052600436106102f5575f3560e01c8063757765f811610195578063a985ceef116100ea578063da0103bd1161008e578063dd62ed3e1161006b578063dd62ed3e146108fc578063f2fde38b14610940578063f5fc361c1461095f578063fccc28131461097e57005b8063da0103bd1461089a578063da4493f6146108b9578063dbe66ca0146108ce57005b8063c16dd4a4116100c7578063c16dd4a414610814578063c31c9c0714610833578063cc1776d314610866578063ce657cce1461087b57005b8063a985ceef146107a7578063ad29ffde146107c7578063b4b11b95146107e657005b80638ea5220f11610151578063a49a910f1161012e578063a49a910f1461072a578063a64e4f8a14610749578063a901dd9214610769578063a9059cbb1461078857005b80638ea5220f146106d857806395d89b41146106f757806397f4850b1461070b57005b8063757765f8146106315780637b812b41146106505780637f635cc01461067e57806380faa3d2146106925780638124f7ac146106a75780638da5cb5b146106bc57005b80633582ad231161024b578063667f6526116102075780636aa5b37f116101e45780636aa5b37f146105b557806370a08231146105ca578063715018a6146105fe578063728d41c91461061257005b8063667f65261461056257806366a88d961461058157806368b69b9b1461059657005b80633582ad23146104c657806336884b6e146104e65780634a8c1fb4146105055780634f7041a514610525578063538ba4f91461053a578063652e2f041461054d57005b80631ecd7d6e116102b257806326991cc81161028f57806326991cc8146104225780632dc0562d1461046d5780632f6f30ea1461048c578063313ce567146104ab57005b80631ecd7d6e146103c057806323b872dd146103d5578063259827e3146103f457005b806306fdde03146102f7578063095ea7b3146103215780630bd05b6914610350578063106a5a8f1461036457806318160ddd146103835780631816467f146103a1575b005b348015610302575f5ffd5b5061030b610993565b60405161031891906123c5565b60405180910390f35b34801561032c575f5ffd5b5061034061033b36600461240e565b610a23565b6040519015158152602001610318565b34801561035b575f5ffd5b506102f5610a3c565b34801561036f575f5ffd5b506102f561037e366004612445565b610ab4565b34801561038e575f5ffd5b506003545b604051908152602001610318565b3480156103ac575f5ffd5b506102f56103bb3660046124c7565b610b04565b3480156103cb575f5ffd5b50610393600e5481565b3480156103e0575f5ffd5b506103406103ef3660046124e9565b610b93565b3480156103ff575f5ffd5b5061034061040e3660046124c7565b60126020525f908152604090205460ff1681565b34801561042d575f5ffd5b506104557f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610318565b348015610478575f5ffd5b50600654610455906001600160a01b031681565b348015610497575f5ffd5b506102f56104a6366004612445565b610bb6565b3480156104b6575f5ffd5b5060405160128152602001610318565b3480156104d1575f5ffd5b5060075461034090600160a01b900460ff1681565b3480156104f1575f5ffd5b506102f5610500366004612527565b610dc3565b348015610510575f5ffd5b5060075461034090600160c01b900460ff1681565b348015610530575f5ffd5b50610393600f5481565b348015610545575f5ffd5b506104555f81565b348015610558575f5ffd5b50610393600c5481565b34801561056d575f5ffd5b506102f561057c36600461253e565b610e48565b34801561058c575f5ffd5b50610393600d5481565b3480156105a1575f5ffd5b506102f56105b036600461255e565b610e9f565b3480156105c0575f5ffd5b50610393600b5481565b3480156105d5575f5ffd5b506103936105e43660046124c7565b6001600160a01b03165f9081526001602052604090205490565b348015610609575f5ffd5b506102f5610ef4565b34801561061d575f5ffd5b506102f561062c366004612527565b610f07565b34801561063c575f5ffd5b506102f561064b366004612527565b610f85565b34801561065b575f5ffd5b5061034061066a3660046124c7565b60146020525f908152604090205460ff1681565b348015610689575f5ffd5b50610393602381565b34801561069d575f5ffd5b5061039360085481565b3480156106b2575f5ffd5b5061039360115481565b3480156106c7575f5ffd5b505f546001600160a01b0316610455565b3480156106e3575f5ffd5b50600754610455906001600160a01b031681565b348015610702575f5ffd5b5061030b611003565b348015610716575f5ffd5b506102f56107253660046124c7565b611012565b348015610735575f5ffd5b506102f5610744366004612527565b611200565b348015610754575f5ffd5b5060075461034090600160b01b900460ff1681565b348015610774575f5ffd5b506102f561078336600461255e565b6112c3565b348015610793575f5ffd5b506103406107a236600461240e565b611318565b3480156107b2575f5ffd5b5060075461034090600160a81b900460ff1681565b3480156107d2575f5ffd5b506102f56107e1366004612445565b611325565b3480156107f1575f5ffd5b506103406108003660046124c7565b60156020525f908152604090205460ff1681565b34801561081f575f5ffd5b506102f561082e366004612579565b61136f565b34801561083e575f5ffd5b506104557f000000000000000000000000000000000000000000000000000000000000000081565b348015610871575f5ffd5b5061039360105481565b348015610886575f5ffd5b506102f561089536600461255e565b6113be565b3480156108a5575f5ffd5b506102f56108b4366004612527565b611413565b3480156108c4575f5ffd5b5061039360095481565b3480156108d9575f5ffd5b506103406108e83660046124c7565b60136020525f908152604090205460ff1681565b348015610907575f5ffd5b506103936109163660046125b0565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b34801561094b575f5ffd5b506102f561095a3660046124c7565b61147b565b34801561096a575f5ffd5b506102f56109793660046124c7565b6114bd565b348015610989575f5ffd5b5061045561dead81565b6060600480546109a2906125dc565b80601f01602080910402602001604051908101604052809291908181526020018280546109ce906125dc565b8015610a195780601f106109f057610100808354040283529160200191610a19565b820191905f5260205f20905b8154815290600101906020018083116109fc57829003601f168201915b5050505050905090565b5f33610a30818585611544565b60019150505b92915050565b610a44611556565b600754600160c01b900460ff1615610a6f5760405163ef65161f60e01b815260040160405180910390fd5b6007805460ff60c01b1916600160c01b17905543600855426009556040517f6603428d483ce13b6662b7a6848d769996e12e801bed4b0f1b9e8d10f64d38ba905f90a1565b610abc611556565b5f5b82811015610afe57610af6848483818110610adb57610adb612614565b9050602002016020810190610af091906124c7565b83611582565b600101610abe565b50505050565b610b0c611556565b6001600160a01b038116610b335760405163e6c4247b60e01b815260040160405180910390fd5b600780546001600160a01b038381166001600160a01b03198316811790935560408051938452911660208301819052917f0db17895a9d092fb3ca24d626f2150dd80c185b0706b36f1040ee239f56cb87191015b60405180910390a15050565b5f33610ba08582856115dd565b610bab858585611652565b506001949350505050565b610bbe611556565b5f5b82811015610afe5760155f858584818110610bdd57610bdd612614565b9050602002016020810190610bf291906124c7565b6001600160a01b0316815260208101919091526040015f205460ff16158015610c7357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316848483818110610c5257610c52612614565b9050602002016020810190610c6791906124c7565b6001600160a01b031614155b8015610cae575030848483818110610c8d57610c8d612614565b9050602002016020810190610ca291906124c7565b6001600160a01b031614155b8015610ce957505f848483818110610cc857610cc8612614565b9050602002016020810190610cdd91906124c7565b6001600160a01b031614155b8015610d86575060135f858584818110610d0557610d05612614565b9050602002016020810190610d1a91906124c7565b6001600160a01b0316815260208101919091526040015f205460ff16158015610d86575060145f858584818110610d5357610d53612614565b9050602002016020810190610d6891906124c7565b6001600160a01b0316815260208101919091526040015f205460ff16155b15610dbb57610dbb848483818110610da057610da0612614565b9050602002016020810190610db591906124c7565b836116af565b600101610bc0565b610dcb611556565b6103e8610dd760035490565b610de290600261263c565b610dec9190612653565b811015610e0c5760405163617ab12d60e11b815260040160405180910390fd5b600c8190556040518181527f1f41d239159181ddefb13e99853e0e4998e0556aa1f2281281c783e309281062906020015b60405180910390a150565b610e50611556565b6023821115610e725760405163cd4e616760e01b815260040160405180910390fd5b6023811115610e945760405163cd4e616760e01b815260040160405180910390fd5b600f91909155601055565b610ea7611556565b60078054821515600160a81b0260ff60a81b199091161790556040517f6a53d6c83a7a55d7a07bd490493fceb559161cce588908714e497e54044777d990610e3d90831515815260200190565b610efc611556565b610f055f61170a565b565b610f0f611556565b6103e8610f1b60035490565b610f2690600361263c565b610f309190612653565b811015610f505760405163617ab12d60e11b815260040160405180910390fd5b600d8190556040518181527fe2e6151ed0b472c61401059745339ca42474813911b22d24023385def6377e1c90602001610e3d565b610f8d611556565b6103e8610f9960035490565b610fa490600261263c565b610fae9190612653565b811015610fce5760405163617ab12d60e11b815260040160405180910390fd5b600b8190556040518181527f85668e92bc538f5c140067d68e3375c65b9e4545d2822ec8d807c6782f747d6290602001610e3d565b6060600580546109a2906125dc565b61101a611556565b335f6001600160a01b0383166110c05750475f8161104b5760405163cff858f960e01b815260040160405180910390fd5b6040516001600160a01b0384169083905f81818185875af1925050503d805f8114611091576040519150601f19603f3d011682016040523d82523d5f602084013e611096565b606091505b505080915050806110ba57604051634088176760e11b815260040160405180910390fd5b506111b8565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015611102573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111269190612672565b90505f811161114857604051637dd28aa760e11b815260040160405180910390fd5b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0384169063a9059cbb906044016020604051808303815f875af1158015611192573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111b69190612689565b505b604080516001600160a01b0385168152602081018390527f7aba7eca7d870d5f2f93298379a43957082ef15cdcf64db1f7c731c6b3a2fa4991015b60405180910390a1505050565b611208611556565b5f61121260035490565b9050620f424061122382600161263c565b61122d9190612653565b82101561124d5760405163617ab12d60e11b815260040160405180910390fd5b6103e861125b82600561263c565b6112659190612653565b82111561128557604051630625040160e01b815260040160405180910390fd5b600e80549083905560408051848152602081018390527f65a8c7442ea496b0a28890f1ef48a9819d1f5d747e9a8df155fe862dfd493c9591016111f3565b6112cb611556565b60078054821515600160b01b0260ff60b01b199091161790556040517fa6a3dda702515d3130fef8b72d8e25f9aebd0d02e89d10d63c0c31d80b52f4a090610e3d90831515815260200190565b5f33610a30818585611652565b61132d611556565b5f5b82811015610afe5761136784848381811061134c5761134c612614565b905060200201602081019061136191906124c7565b8361174e565b60010161132f565b611377611556565b6001600160a01b0382165f9081526015602052604090205460ff16156113b057604051630138835f60e11b815260040160405180910390fd5b6113ba82826117a9565b5050565b6113c6611556565b60078054821515600160a01b0260ff60a01b199091161790556040517f1da197dc3cab4eceaefd5d0c34df2ed3a08f20a207fb1910c0eceb361e2c965c90610e3d90831515815260200190565b61141b611556565b602381111561143d5760405163cd4e616760e01b815260040160405180910390fd5b601180549082905560408051838152602081018390527f6a7b998a4adc393cb692c67fcd563e7971e2ea6f3fe7c9b8fb6dd53cf5b627d09101610b87565b611483611556565b6001600160a01b0381166114b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6114ba8161170a565b50565b6114c5611556565b6001600160a01b0381166114ec5760405163e6c4247b60e01b815260040160405180910390fd5b600680546001600160a01b038381166001600160a01b03198316811790935560408051938452911660208301819052917fb3dd4b0ccf73b51db7cb2a59fb88d1082b0fa9389d4ce0e85100fe3b26af78c49101610b87565b6115518383836001611804565b505050565b5f546001600160a01b03163314610f055760405163118cdaa760e01b81523360048201526024016114a8565b6001600160a01b0382165f81815260146020908152604091829020805460ff19168515159081179091558251938452908301527f74392251b09500cc108c71712e5e7e0392be9075a74a24f1494551cfa8e068709101610b87565b6001600160a01b038381165f908152600260209081526040808320938616835292905220545f198114610afe578181101561164457604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016114a8565b610afe84848484035f611804565b6001600160a01b03831661167b57604051634b637e8f60e11b81525f60048201526024016114a8565b6001600160a01b0382166116a45760405163ec442f0560e01b81525f60048201526024016114a8565b6115518383836118d6565b6001600160a01b0382165f81815260126020908152604091829020805460ff19168515159081179091558251938452908301527f066e0c23b9ae0bb92a88e9b0985bb7d85fce062730057312b99a9e243fde5ee19101610b87565b5f546001600160a01b0316801561172f57611725815f61174e565b61172f815f611582565b61173a82600161174e565b611745826001611582565b6113ba82611fbc565b6001600160a01b0382165f81815260136020908152604091829020805460ff19168515159081179091558251938452908301527f3499bfcf9673677ba552f3fe2ea274ec7e6246da31c3c87e115b45a9b0db2efb9101610b87565b6001600160a01b0382165f81815260156020908152604091829020805460ff19168515159081179091558251938452908301527f024f6c8d60a57c94822c46d989fd6935057590269281b07fe8327d7e9bc424219101610b87565b6001600160a01b03841661182d5760405163e602df0560e01b81525f60048201526024016114a8565b6001600160a01b03831661185657604051634a1406b160e11b81525f60048201526024016114a8565b6001600160a01b038085165f9081526002602090815260408083209387168352929052208290558015610afe57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516118c891815260200190565b60405180910390a350505050565b6001600160a01b0383165f908152601260205260409020543390329060ff161561191357604051631a30f03760e31b815260040160405180910390fd5b846001600160a01b0316826001600160a01b0316148061194b57506001600160a01b0382165f9081526012602052604090205460ff16155b61196857604051631a30f03760e31b815260040160405180910390fd5b846001600160a01b0316816001600160a01b031614806119995750816001600160a01b0316816001600160a01b0316145b806119bc57506001600160a01b0381165f9081526012602052604090205460ff16155b6119d957604051631a30f03760e31b815260040160405180910390fd5b600754600160c01b900460ff1680611a0857506001600160a01b0385165f9081526014602052604090205460ff165b80611a2a57506001600160a01b0384165f9081526014602052604090205460ff165b611a475760405163037c597f60e01b815260040160405180910390fd5b6007545f90600160a01b900460ff168015611a6c5750600754600160b81b900460ff16155b8015611ab257506001600160a01b0386165f9081526014602052604090205460ff1680611ab057506001600160a01b0385165f9081526014602052604090205460ff165b155b90508015611dad575f546001600160a01b03878116911614801590611ae457505f546001600160a01b03868116911614155b8015611af857506001600160a01b03851615155b8015611b0f57506001600160a01b03851661dead14155b15611dad57600754600160a81b900460ff1615611c33577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614158015611b9a57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b15611c3357611baa6003436126a4565b6001600160a01b0383165f90815260166020526040902054108015611bef5750611bd56003436126a4565b6001600160a01b0386165f90815260166020526040902054105b611c0c576040516329a226cf60e11b815260040160405180910390fd5b6001600160a01b038083165f90815260166020526040808220439081905592881682529020555b6001600160a01b0386165f9081526015602052604090205460ff168015611c7257506001600160a01b0385165f9081526014602052604090205460ff16155b15611ce357600b54841115611c9a576040516344df090f60e11b815260040160405180910390fd5b600d546001600160a01b0386165f90815260016020526040902054611cbf90866126b7565b1115611cde57604051633b63e02960e11b815260040160405180910390fd5b611dad565b6001600160a01b0385165f9081526015602052604090205460ff168015611d2257506001600160a01b0386165f9081526014602052604090205460ff16155b15611d4a57600c54841115611cde57604051630a8e28e160e41b815260040160405180910390fd5b6001600160a01b0385165f9081526014602052604090205460ff16611dad57600d546001600160a01b0386165f90815260016020526040902054611d8e90866126b7565b1115611dad57604051633b63e02960e11b815260040160405180910390fd5b6007545f90600160b01b900460ff168015611dd25750600754600160b81b900460ff16155b8015611e1857506001600160a01b0387165f9081526013602052604090205460ff1680611e1657506001600160a01b0386165f9081526013602052604090205460ff165b155b90508015611f39576001600160a01b0386165f9081526015602052604081205460ff168015611e4857505f601054115b15611e6e57606460105487611e5d919061263c565b611e679190612653565b9050611f1a565b6001600160a01b0388165f9081526015602052604090205460ff168015611e9657505f600f54115b15611eab576064600f5487611e5d919061263c565b6001600160a01b0387165f9081526015602052604090205460ff16158015611eeb57506001600160a01b0388165f9081526015602052604090205460ff16155b8015611ef857505f601154115b15611f1a57606460115487611f0d919061263c565b611f179190612653565b90505b8015611f3757611f2a81876126a4565b9550611f3788308361200b565b505b305f90815260016020526040902054600e54811015828015611f7357506001600160a01b0389165f9081526015602052604090205460ff16155b8015611f7c5750805b15611fa657600a5443118015611f93575060085443115b15611fa657611fa182612131565b43600a555b611fb189898961200b565b505050505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038316612035578060035f82825461202a91906126b7565b909155506120a59050565b6001600160a01b0383165f90815260016020526040902054818110156120875760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016114a8565b6001600160a01b0384165f9081526001602052604090209082900390555b6001600160a01b0382166120c1576003805482900390556120df565b6001600160a01b0382165f9081526001602052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161212491815260200190565b60405180910390a3505050565b6007805460ff60b81b1916600160b81b1790556040805160028082526060820183525f928392919060208301908036833701905050905030815f8151811061217b5761217b612614565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121f7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061221b91906126ca565b8160018151811061222e5761222e612614565b60200260200101906001600160a01b031690816001600160a01b0316815250505f600e54601461225e919061263c565b90508084111561226c578093505b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906122c09087905f908790309042906004016126e5565b5f604051808303815f87803b1580156122d7575f5ffd5b505af11580156122e9573d5f5f3e3d5ffd5b504792505f91506122fd9050600283612653565b90505f61230a82846126a4565b6006546040519192506001600160a01b03169083905f81818185875af1925050503d805f8114612355576040519150601f19603f3d011682016040523d82523d5f602084013e61235a565b606091505b50506007546040519197506001600160a01b03169082905f81818185875af1925050503d805f81146123a7576040519150601f19603f3d011682016040523d82523d5f602084013e6123ac565b606091505b50506007805460ff60b81b191690555050505050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b03811681146114ba575f5ffd5b5f5f6040838503121561241f575f5ffd5b823561242a816123fa565b946020939093013593505050565b80151581146114ba575f5ffd5b5f5f5f60408486031215612457575f5ffd5b833567ffffffffffffffff81111561246d575f5ffd5b8401601f8101861361247d575f5ffd5b803567ffffffffffffffff811115612493575f5ffd5b8660208260051b84010111156124a7575f5ffd5b6020918201945092508401356124bc81612438565b809150509250925092565b5f602082840312156124d7575f5ffd5b81356124e2816123fa565b9392505050565b5f5f5f606084860312156124fb575f5ffd5b8335612506816123fa565b92506020840135612516816123fa565b929592945050506040919091013590565b5f60208284031215612537575f5ffd5b5035919050565b5f5f6040838503121561254f575f5ffd5b50508035926020909101359150565b5f6020828403121561256e575f5ffd5b81356124e281612438565b5f5f6040838503121561258a575f5ffd5b8235612595816123fa565b915060208301356125a581612438565b809150509250929050565b5f5f604083850312156125c1575f5ffd5b82356125cc816123fa565b915060208301356125a5816123fa565b600181811c908216806125f057607f821691505b60208210810361260e57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610a3657610a36612628565b5f8261266d57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215612682575f5ffd5b5051919050565b5f60208284031215612699575f5ffd5b81516124e281612438565b81810381811115610a3657610a36612628565b80820180821115610a3657610a36612628565b5f602082840312156126da575f5ffd5b81516124e2816123fa565b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b818110156127355783516001600160a01b031683526020938401939092019160010161270e565b50506001600160a01b03959095166060840152505060800152939250505056fea2646970667358221220289bbce85ff06164c5af10dae31aee5e5fe81d7ff7f7faeafab228a8c5f5d3be64736f6c634300081c0033

Deployed Bytecode

0x6080604052600436106102f5575f3560e01c8063757765f811610195578063a985ceef116100ea578063da0103bd1161008e578063dd62ed3e1161006b578063dd62ed3e146108fc578063f2fde38b14610940578063f5fc361c1461095f578063fccc28131461097e57005b8063da0103bd1461089a578063da4493f6146108b9578063dbe66ca0146108ce57005b8063c16dd4a4116100c7578063c16dd4a414610814578063c31c9c0714610833578063cc1776d314610866578063ce657cce1461087b57005b8063a985ceef146107a7578063ad29ffde146107c7578063b4b11b95146107e657005b80638ea5220f11610151578063a49a910f1161012e578063a49a910f1461072a578063a64e4f8a14610749578063a901dd9214610769578063a9059cbb1461078857005b80638ea5220f146106d857806395d89b41146106f757806397f4850b1461070b57005b8063757765f8146106315780637b812b41146106505780637f635cc01461067e57806380faa3d2146106925780638124f7ac146106a75780638da5cb5b146106bc57005b80633582ad231161024b578063667f6526116102075780636aa5b37f116101e45780636aa5b37f146105b557806370a08231146105ca578063715018a6146105fe578063728d41c91461061257005b8063667f65261461056257806366a88d961461058157806368b69b9b1461059657005b80633582ad23146104c657806336884b6e146104e65780634a8c1fb4146105055780634f7041a514610525578063538ba4f91461053a578063652e2f041461054d57005b80631ecd7d6e116102b257806326991cc81161028f57806326991cc8146104225780632dc0562d1461046d5780632f6f30ea1461048c578063313ce567146104ab57005b80631ecd7d6e146103c057806323b872dd146103d5578063259827e3146103f457005b806306fdde03146102f7578063095ea7b3146103215780630bd05b6914610350578063106a5a8f1461036457806318160ddd146103835780631816467f146103a1575b005b348015610302575f5ffd5b5061030b610993565b60405161031891906123c5565b60405180910390f35b34801561032c575f5ffd5b5061034061033b36600461240e565b610a23565b6040519015158152602001610318565b34801561035b575f5ffd5b506102f5610a3c565b34801561036f575f5ffd5b506102f561037e366004612445565b610ab4565b34801561038e575f5ffd5b506003545b604051908152602001610318565b3480156103ac575f5ffd5b506102f56103bb3660046124c7565b610b04565b3480156103cb575f5ffd5b50610393600e5481565b3480156103e0575f5ffd5b506103406103ef3660046124e9565b610b93565b3480156103ff575f5ffd5b5061034061040e3660046124c7565b60126020525f908152604090205460ff1681565b34801561042d575f5ffd5b506104557f000000000000000000000000a815fb248ed46efdba0cf5c6e31731a34e5f193381565b6040516001600160a01b039091168152602001610318565b348015610478575f5ffd5b50600654610455906001600160a01b031681565b348015610497575f5ffd5b506102f56104a6366004612445565b610bb6565b3480156104b6575f5ffd5b5060405160128152602001610318565b3480156104d1575f5ffd5b5060075461034090600160a01b900460ff1681565b3480156104f1575f5ffd5b506102f5610500366004612527565b610dc3565b348015610510575f5ffd5b5060075461034090600160c01b900460ff1681565b348015610530575f5ffd5b50610393600f5481565b348015610545575f5ffd5b506104555f81565b348015610558575f5ffd5b50610393600c5481565b34801561056d575f5ffd5b506102f561057c36600461253e565b610e48565b34801561058c575f5ffd5b50610393600d5481565b3480156105a1575f5ffd5b506102f56105b036600461255e565b610e9f565b3480156105c0575f5ffd5b50610393600b5481565b3480156105d5575f5ffd5b506103936105e43660046124c7565b6001600160a01b03165f9081526001602052604090205490565b348015610609575f5ffd5b506102f5610ef4565b34801561061d575f5ffd5b506102f561062c366004612527565b610f07565b34801561063c575f5ffd5b506102f561064b366004612527565b610f85565b34801561065b575f5ffd5b5061034061066a3660046124c7565b60146020525f908152604090205460ff1681565b348015610689575f5ffd5b50610393602381565b34801561069d575f5ffd5b5061039360085481565b3480156106b2575f5ffd5b5061039360115481565b3480156106c7575f5ffd5b505f546001600160a01b0316610455565b3480156106e3575f5ffd5b50600754610455906001600160a01b031681565b348015610702575f5ffd5b5061030b611003565b348015610716575f5ffd5b506102f56107253660046124c7565b611012565b348015610735575f5ffd5b506102f5610744366004612527565b611200565b348015610754575f5ffd5b5060075461034090600160b01b900460ff1681565b348015610774575f5ffd5b506102f561078336600461255e565b6112c3565b348015610793575f5ffd5b506103406107a236600461240e565b611318565b3480156107b2575f5ffd5b5060075461034090600160a81b900460ff1681565b3480156107d2575f5ffd5b506102f56107e1366004612445565b611325565b3480156107f1575f5ffd5b506103406108003660046124c7565b60156020525f908152604090205460ff1681565b34801561081f575f5ffd5b506102f561082e366004612579565b61136f565b34801561083e575f5ffd5b506104557f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b348015610871575f5ffd5b5061039360105481565b348015610886575f5ffd5b506102f561089536600461255e565b6113be565b3480156108a5575f5ffd5b506102f56108b4366004612527565b611413565b3480156108c4575f5ffd5b5061039360095481565b3480156108d9575f5ffd5b506103406108e83660046124c7565b60136020525f908152604090205460ff1681565b348015610907575f5ffd5b506103936109163660046125b0565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b34801561094b575f5ffd5b506102f561095a3660046124c7565b61147b565b34801561096a575f5ffd5b506102f56109793660046124c7565b6114bd565b348015610989575f5ffd5b5061045561dead81565b6060600480546109a2906125dc565b80601f01602080910402602001604051908101604052809291908181526020018280546109ce906125dc565b8015610a195780601f106109f057610100808354040283529160200191610a19565b820191905f5260205f20905b8154815290600101906020018083116109fc57829003601f168201915b5050505050905090565b5f33610a30818585611544565b60019150505b92915050565b610a44611556565b600754600160c01b900460ff1615610a6f5760405163ef65161f60e01b815260040160405180910390fd5b6007805460ff60c01b1916600160c01b17905543600855426009556040517f6603428d483ce13b6662b7a6848d769996e12e801bed4b0f1b9e8d10f64d38ba905f90a1565b610abc611556565b5f5b82811015610afe57610af6848483818110610adb57610adb612614565b9050602002016020810190610af091906124c7565b83611582565b600101610abe565b50505050565b610b0c611556565b6001600160a01b038116610b335760405163e6c4247b60e01b815260040160405180910390fd5b600780546001600160a01b038381166001600160a01b03198316811790935560408051938452911660208301819052917f0db17895a9d092fb3ca24d626f2150dd80c185b0706b36f1040ee239f56cb87191015b60405180910390a15050565b5f33610ba08582856115dd565b610bab858585611652565b506001949350505050565b610bbe611556565b5f5b82811015610afe5760155f858584818110610bdd57610bdd612614565b9050602002016020810190610bf291906124c7565b6001600160a01b0316815260208101919091526040015f205460ff16158015610c7357507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316848483818110610c5257610c52612614565b9050602002016020810190610c6791906124c7565b6001600160a01b031614155b8015610cae575030848483818110610c8d57610c8d612614565b9050602002016020810190610ca291906124c7565b6001600160a01b031614155b8015610ce957505f848483818110610cc857610cc8612614565b9050602002016020810190610cdd91906124c7565b6001600160a01b031614155b8015610d86575060135f858584818110610d0557610d05612614565b9050602002016020810190610d1a91906124c7565b6001600160a01b0316815260208101919091526040015f205460ff16158015610d86575060145f858584818110610d5357610d53612614565b9050602002016020810190610d6891906124c7565b6001600160a01b0316815260208101919091526040015f205460ff16155b15610dbb57610dbb848483818110610da057610da0612614565b9050602002016020810190610db591906124c7565b836116af565b600101610bc0565b610dcb611556565b6103e8610dd760035490565b610de290600261263c565b610dec9190612653565b811015610e0c5760405163617ab12d60e11b815260040160405180910390fd5b600c8190556040518181527f1f41d239159181ddefb13e99853e0e4998e0556aa1f2281281c783e309281062906020015b60405180910390a150565b610e50611556565b6023821115610e725760405163cd4e616760e01b815260040160405180910390fd5b6023811115610e945760405163cd4e616760e01b815260040160405180910390fd5b600f91909155601055565b610ea7611556565b60078054821515600160a81b0260ff60a81b199091161790556040517f6a53d6c83a7a55d7a07bd490493fceb559161cce588908714e497e54044777d990610e3d90831515815260200190565b610efc611556565b610f055f61170a565b565b610f0f611556565b6103e8610f1b60035490565b610f2690600361263c565b610f309190612653565b811015610f505760405163617ab12d60e11b815260040160405180910390fd5b600d8190556040518181527fe2e6151ed0b472c61401059745339ca42474813911b22d24023385def6377e1c90602001610e3d565b610f8d611556565b6103e8610f9960035490565b610fa490600261263c565b610fae9190612653565b811015610fce5760405163617ab12d60e11b815260040160405180910390fd5b600b8190556040518181527f85668e92bc538f5c140067d68e3375c65b9e4545d2822ec8d807c6782f747d6290602001610e3d565b6060600580546109a2906125dc565b61101a611556565b335f6001600160a01b0383166110c05750475f8161104b5760405163cff858f960e01b815260040160405180910390fd5b6040516001600160a01b0384169083905f81818185875af1925050503d805f8114611091576040519150601f19603f3d011682016040523d82523d5f602084013e611096565b606091505b505080915050806110ba57604051634088176760e11b815260040160405180910390fd5b506111b8565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015611102573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111269190612672565b90505f811161114857604051637dd28aa760e11b815260040160405180910390fd5b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0384169063a9059cbb906044016020604051808303815f875af1158015611192573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111b69190612689565b505b604080516001600160a01b0385168152602081018390527f7aba7eca7d870d5f2f93298379a43957082ef15cdcf64db1f7c731c6b3a2fa4991015b60405180910390a1505050565b611208611556565b5f61121260035490565b9050620f424061122382600161263c565b61122d9190612653565b82101561124d5760405163617ab12d60e11b815260040160405180910390fd5b6103e861125b82600561263c565b6112659190612653565b82111561128557604051630625040160e01b815260040160405180910390fd5b600e80549083905560408051848152602081018390527f65a8c7442ea496b0a28890f1ef48a9819d1f5d747e9a8df155fe862dfd493c9591016111f3565b6112cb611556565b60078054821515600160b01b0260ff60b01b199091161790556040517fa6a3dda702515d3130fef8b72d8e25f9aebd0d02e89d10d63c0c31d80b52f4a090610e3d90831515815260200190565b5f33610a30818585611652565b61132d611556565b5f5b82811015610afe5761136784848381811061134c5761134c612614565b905060200201602081019061136191906124c7565b8361174e565b60010161132f565b611377611556565b6001600160a01b0382165f9081526015602052604090205460ff16156113b057604051630138835f60e11b815260040160405180910390fd5b6113ba82826117a9565b5050565b6113c6611556565b60078054821515600160a01b0260ff60a01b199091161790556040517f1da197dc3cab4eceaefd5d0c34df2ed3a08f20a207fb1910c0eceb361e2c965c90610e3d90831515815260200190565b61141b611556565b602381111561143d5760405163cd4e616760e01b815260040160405180910390fd5b601180549082905560408051838152602081018390527f6a7b998a4adc393cb692c67fcd563e7971e2ea6f3fe7c9b8fb6dd53cf5b627d09101610b87565b611483611556565b6001600160a01b0381166114b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6114ba8161170a565b50565b6114c5611556565b6001600160a01b0381166114ec5760405163e6c4247b60e01b815260040160405180910390fd5b600680546001600160a01b038381166001600160a01b03198316811790935560408051938452911660208301819052917fb3dd4b0ccf73b51db7cb2a59fb88d1082b0fa9389d4ce0e85100fe3b26af78c49101610b87565b6115518383836001611804565b505050565b5f546001600160a01b03163314610f055760405163118cdaa760e01b81523360048201526024016114a8565b6001600160a01b0382165f81815260146020908152604091829020805460ff19168515159081179091558251938452908301527f74392251b09500cc108c71712e5e7e0392be9075a74a24f1494551cfa8e068709101610b87565b6001600160a01b038381165f908152600260209081526040808320938616835292905220545f198114610afe578181101561164457604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016114a8565b610afe84848484035f611804565b6001600160a01b03831661167b57604051634b637e8f60e11b81525f60048201526024016114a8565b6001600160a01b0382166116a45760405163ec442f0560e01b81525f60048201526024016114a8565b6115518383836118d6565b6001600160a01b0382165f81815260126020908152604091829020805460ff19168515159081179091558251938452908301527f066e0c23b9ae0bb92a88e9b0985bb7d85fce062730057312b99a9e243fde5ee19101610b87565b5f546001600160a01b0316801561172f57611725815f61174e565b61172f815f611582565b61173a82600161174e565b611745826001611582565b6113ba82611fbc565b6001600160a01b0382165f81815260136020908152604091829020805460ff19168515159081179091558251938452908301527f3499bfcf9673677ba552f3fe2ea274ec7e6246da31c3c87e115b45a9b0db2efb9101610b87565b6001600160a01b0382165f81815260156020908152604091829020805460ff19168515159081179091558251938452908301527f024f6c8d60a57c94822c46d989fd6935057590269281b07fe8327d7e9bc424219101610b87565b6001600160a01b03841661182d5760405163e602df0560e01b81525f60048201526024016114a8565b6001600160a01b03831661185657604051634a1406b160e11b81525f60048201526024016114a8565b6001600160a01b038085165f9081526002602090815260408083209387168352929052208290558015610afe57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516118c891815260200190565b60405180910390a350505050565b6001600160a01b0383165f908152601260205260409020543390329060ff161561191357604051631a30f03760e31b815260040160405180910390fd5b846001600160a01b0316826001600160a01b0316148061194b57506001600160a01b0382165f9081526012602052604090205460ff16155b61196857604051631a30f03760e31b815260040160405180910390fd5b846001600160a01b0316816001600160a01b031614806119995750816001600160a01b0316816001600160a01b0316145b806119bc57506001600160a01b0381165f9081526012602052604090205460ff16155b6119d957604051631a30f03760e31b815260040160405180910390fd5b600754600160c01b900460ff1680611a0857506001600160a01b0385165f9081526014602052604090205460ff165b80611a2a57506001600160a01b0384165f9081526014602052604090205460ff165b611a475760405163037c597f60e01b815260040160405180910390fd5b6007545f90600160a01b900460ff168015611a6c5750600754600160b81b900460ff16155b8015611ab257506001600160a01b0386165f9081526014602052604090205460ff1680611ab057506001600160a01b0385165f9081526014602052604090205460ff165b155b90508015611dad575f546001600160a01b03878116911614801590611ae457505f546001600160a01b03868116911614155b8015611af857506001600160a01b03851615155b8015611b0f57506001600160a01b03851661dead14155b15611dad57600754600160a81b900460ff1615611c33577f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316856001600160a01b031614158015611b9a57507f000000000000000000000000a815fb248ed46efdba0cf5c6e31731a34e5f19336001600160a01b0316856001600160a01b031614155b15611c3357611baa6003436126a4565b6001600160a01b0383165f90815260166020526040902054108015611bef5750611bd56003436126a4565b6001600160a01b0386165f90815260166020526040902054105b611c0c576040516329a226cf60e11b815260040160405180910390fd5b6001600160a01b038083165f90815260166020526040808220439081905592881682529020555b6001600160a01b0386165f9081526015602052604090205460ff168015611c7257506001600160a01b0385165f9081526014602052604090205460ff16155b15611ce357600b54841115611c9a576040516344df090f60e11b815260040160405180910390fd5b600d546001600160a01b0386165f90815260016020526040902054611cbf90866126b7565b1115611cde57604051633b63e02960e11b815260040160405180910390fd5b611dad565b6001600160a01b0385165f9081526015602052604090205460ff168015611d2257506001600160a01b0386165f9081526014602052604090205460ff16155b15611d4a57600c54841115611cde57604051630a8e28e160e41b815260040160405180910390fd5b6001600160a01b0385165f9081526014602052604090205460ff16611dad57600d546001600160a01b0386165f90815260016020526040902054611d8e90866126b7565b1115611dad57604051633b63e02960e11b815260040160405180910390fd5b6007545f90600160b01b900460ff168015611dd25750600754600160b81b900460ff16155b8015611e1857506001600160a01b0387165f9081526013602052604090205460ff1680611e1657506001600160a01b0386165f9081526013602052604090205460ff165b155b90508015611f39576001600160a01b0386165f9081526015602052604081205460ff168015611e4857505f601054115b15611e6e57606460105487611e5d919061263c565b611e679190612653565b9050611f1a565b6001600160a01b0388165f9081526015602052604090205460ff168015611e9657505f600f54115b15611eab576064600f5487611e5d919061263c565b6001600160a01b0387165f9081526015602052604090205460ff16158015611eeb57506001600160a01b0388165f9081526015602052604090205460ff16155b8015611ef857505f601154115b15611f1a57606460115487611f0d919061263c565b611f179190612653565b90505b8015611f3757611f2a81876126a4565b9550611f3788308361200b565b505b305f90815260016020526040902054600e54811015828015611f7357506001600160a01b0389165f9081526015602052604090205460ff16155b8015611f7c5750805b15611fa657600a5443118015611f93575060085443115b15611fa657611fa182612131565b43600a555b611fb189898961200b565b505050505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038316612035578060035f82825461202a91906126b7565b909155506120a59050565b6001600160a01b0383165f90815260016020526040902054818110156120875760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016114a8565b6001600160a01b0384165f9081526001602052604090209082900390555b6001600160a01b0382166120c1576003805482900390556120df565b6001600160a01b0382165f9081526001602052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161212491815260200190565b60405180910390a3505050565b6007805460ff60b81b1916600160b81b1790556040805160028082526060820183525f928392919060208301908036833701905050905030815f8151811061217b5761217b612614565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121f7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061221b91906126ca565b8160018151811061222e5761222e612614565b60200260200101906001600160a01b031690816001600160a01b0316815250505f600e54601461225e919061263c565b90508084111561226c578093505b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac947906122c09087905f908790309042906004016126e5565b5f604051808303815f87803b1580156122d7575f5ffd5b505af11580156122e9573d5f5f3e3d5ffd5b504792505f91506122fd9050600283612653565b90505f61230a82846126a4565b6006546040519192506001600160a01b03169083905f81818185875af1925050503d805f8114612355576040519150601f19603f3d011682016040523d82523d5f602084013e61235a565b606091505b50506007546040519197506001600160a01b03169082905f81818185875af1925050503d805f81146123a7576040519150601f19603f3d011682016040523d82523d5f602084013e6123ac565b606091505b50506007805460ff60b81b191690555050505050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b03811681146114ba575f5ffd5b5f5f6040838503121561241f575f5ffd5b823561242a816123fa565b946020939093013593505050565b80151581146114ba575f5ffd5b5f5f5f60408486031215612457575f5ffd5b833567ffffffffffffffff81111561246d575f5ffd5b8401601f8101861361247d575f5ffd5b803567ffffffffffffffff811115612493575f5ffd5b8660208260051b84010111156124a7575f5ffd5b6020918201945092508401356124bc81612438565b809150509250925092565b5f602082840312156124d7575f5ffd5b81356124e2816123fa565b9392505050565b5f5f5f606084860312156124fb575f5ffd5b8335612506816123fa565b92506020840135612516816123fa565b929592945050506040919091013590565b5f60208284031215612537575f5ffd5b5035919050565b5f5f6040838503121561254f575f5ffd5b50508035926020909101359150565b5f6020828403121561256e575f5ffd5b81356124e281612438565b5f5f6040838503121561258a575f5ffd5b8235612595816123fa565b915060208301356125a581612438565b809150509250929050565b5f5f604083850312156125c1575f5ffd5b82356125cc816123fa565b915060208301356125a5816123fa565b600181811c908216806125f057607f821691505b60208210810361260e57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610a3657610a36612628565b5f8261266d57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215612682575f5ffd5b5051919050565b5f60208284031215612699575f5ffd5b81516124e281612438565b81810381811115610a3657610a36612628565b80820180821115610a3657610a36612628565b5f602082840312156126da575f5ffd5b81516124e2816123fa565b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b818110156127355783516001600160a01b031683526020938401939092019160010161270e565b50506001600160a01b03959095166060840152505060800152939250505056fea2646970667358221220289bbce85ff06164c5af10dae31aee5e5fe81d7ff7f7faeafab228a8c5f5d3be64736f6c634300081c0033

Deployed Bytecode Sourcemap

26333:14827:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13091:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15409:215;;;;;;;;;;-1:-1:-1;15409:215:0;;;;;:::i;:::-;;:::i;:::-;;;1110:14:1;;1103:22;1085:41;;1073:2;1058:18;15409:215:0;945:187:1;31142:247:0;;;;;;;;;;;;;:::i;34296:241::-;;;;;;;;;;-1:-1:-1;34296:241:0;;;;;:::i;:::-;;:::i;14193:99::-;;;;;;;;;;-1:-1:-1;14272:12:0;;14193:99;;;2156:25:1;;;2144:2;2129:18;14193:99:0;2010:177:1;31668:263:0;;;;;;;;;;-1:-1:-1;31668:263:0;;;;;:::i;:::-;;:::i;27083:28::-;;;;;;;;;;;;;;;;16202:283;;;;;;;;;;-1:-1:-1;16202:283:0;;;;;:::i;:::-;;:::i;27210:47::-;;;;;;;;;;-1:-1:-1;27210:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;26549:33;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3121:32:1;;;3103:51;;3091:2;3076:18;26549:33:0;2957:203:1;26589:24:0;;;;;;;;;;-1:-1:-1;26589:24:0;;;;-1:-1:-1;;;;;26589:24:0;;;34545:573;;;;;;;;;;-1:-1:-1;34545:573:0;;;;;:::i;:::-;;:::i;14044:84::-;;;;;;;;;;-1:-1:-1;14044:84:0;;14118:2;3307:36:1;;3295:2;3280:18;14044:84:0;3165:184:1;26653:25:0;;;;;;;;;;-1:-1:-1;26653:25:0;;;;-1:-1:-1;;;26653:25:0;;;;;;32615:225;;;;;;;;;;-1:-1:-1;32615:225:0;;;;;:::i;:::-;;:::i;26782:23::-;;;;;;;;;;-1:-1:-1;26782:23:0;;;;-1:-1:-1;;;26782:23:0;;;;;;27118:21;;;;;;;;;;;;;;;;26430:49;;;;;;;;;;;;26477:1;26430:49;;27011:27;;;;;;;;;;;;;;;;33507:253;;;;;;;;;;-1:-1:-1;33507:253:0;;;;;:::i;:::-;;:::i;27045:29::-;;;;;;;;;;;;;;;;32089:148;;;;;;;;;;-1:-1:-1;32089:148:0;;;;;:::i;:::-;;:::i;26978:26::-;;;;;;;;;;;;;;;;14355:118;;;;;;;;;;-1:-1:-1;14355:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;14447:18:0;14420:7;14447:18;;;:9;:18;;;;;;;14355:118;24947:103;;;;;;;;;;;;;:::i;32848:233::-;;;;;;;;;;-1:-1:-1;32848:233:0;;;;;:::i;:::-;;:::i;32386:221::-;;;;;;;;;;-1:-1:-1;32386:221:0;;;;;:::i;:::-;;:::i;27319:50::-;;;;;;;;;;-1:-1:-1;27319:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;26927:42;;;;;;;;;;;;26967:2;26927:42;;26814:30;;;;;;;;;;;;;;;;27175:26;;;;;;;;;;;;;;;;24272:87;;;;;;;;;;-1:-1:-1;24318:7:0;24345:6;-1:-1:-1;;;;;24345:6:0;24272:87;;26620:24;;;;;;;;;;-1:-1:-1;26620:24:0;;;;-1:-1:-1;;;;;26620:24:0;;;13301:95;;;;;;;;;;;;;:::i;35304:678::-;;;;;;;;;;-1:-1:-1;35304:678:0;;;;;:::i;:::-;;:::i;33089:410::-;;;;;;;;;;-1:-1:-1;33089:410:0;;;;;:::i;:::-;;:::i;26719:23::-;;;;;;;;;;-1:-1:-1;26719:23:0;;;;-1:-1:-1;;;26719:23:0;;;;;;32245:133;;;;;;;;;;-1:-1:-1;32245:133:0;;;;;:::i;:::-;;:::i;14678:182::-;;;;;;;;;;-1:-1:-1;14678:182:0;;;;;:::i;:::-;;:::i;26685:27::-;;;;;;;;;;-1:-1:-1;26685:27:0;;;;-1:-1:-1;;;26685:27:0;;;;;;34051:237;;;;;;;;;;-1:-1:-1;34051:237:0;;;;;:::i;:::-;;:::i;27376:43::-;;;;;;;;;;-1:-1:-1;27376:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;35126:170;;;;;;;;;;-1:-1:-1;35126:170:0;;;;;:::i;:::-;;:::i;26377:44::-;;;;;;;;;;;;;;;27146:22;;;;;;;;;;;;;;;;31939:142;;;;;;;;;;-1:-1:-1;31939:142:0;;;;;:::i;:::-;;:::i;33768:275::-;;;;;;;;;;-1:-1:-1;33768:275:0;;;;;:::i;:::-;;:::i;26851:29::-;;;;;;;;;;;;;;;;27264:48;;;;;;;;;;-1:-1:-1;27264:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;14923:167;;;;;;;;;;-1:-1:-1;14923:167:0;;;;;:::i;:::-;-1:-1:-1;;;;;15055:18:0;;;15028:7;15055:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;14923:167;25205:220;;;;;;;;;;-1:-1:-1;25205:220:0;;;;;:::i;:::-;;:::i;31397:263::-;;;;;;;;;;-1:-1:-1;31397:263:0;;;;;:::i;:::-;;:::i;26486:54::-;;;;;;;;;;;;26533:6;26486:54;;13091:91;13136:13;13169:5;13162:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13091:91;:::o;15409:215::-;15507:4;4386:10;15563:31;4386:10;15579:7;15588:5;15563:8;:31::i;:::-;15612:4;15605:11;;;15409:215;;;;;:::o;31142:247::-;24158:13;:11;:13::i;:::-;31208:11:::1;::::0;-1:-1:-1;;;31208:11:0;::::1;;;31207:12;31199:41;;;;-1:-1:-1::0;;;31199:41:0::1;;;;;;;;;;;;31251:11;:18:::0;;-1:-1:-1;;;;31251:18:0::1;-1:-1:-1::0;;;31251:18:0::1;::::0;;31298:12:::1;31280:15;:30:::0;31338:15:::1;31321:14;:32:::0;31369:12:::1;::::0;::::1;::::0;31251:18;;31369:12:::1;31142:247::o:0;34296:241::-;24158:13;:11;:13::i;:::-;34424:9:::1;34419:111;34439:19:::0;;::::1;34419:111;;;34480:38;34499:8;;34508:1;34499:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;34512:5;34480:18;:38::i;:::-;34460:3;;34419:111;;;;34296:241:::0;;;:::o;31668:263::-;24158:13;:11;:13::i;:::-;-1:-1:-1;;;;;31751:26:0;::::1;31743:53;;;;-1:-1:-1::0;;;31743:53:0::1;;;;;;;;;;;;31827:9;::::0;;-1:-1:-1;;;;;31847:22:0;;::::1;-1:-1:-1::0;;;;;;31847:22:0;::::1;::::0;::::1;::::0;;;31885:38:::1;::::0;;5885:51:1;;;31827:9:0;::::1;5967:2:1::0;5952:18;;5945:60;;;31827:9:0;31885:38:::1;::::0;5858:18:1;31885:38:0::1;;;;;;;;31732:199;31668:263:::0;:::o;16202:283::-;16323:4;4386:10;16381:37;16397:4;4386:10;16412:5;16381:15;:37::i;:::-;16429:26;16439:4;16445:2;16449:5;16429:9;:26::i;:::-;-1:-1:-1;16473:4:0;;16202:283;-1:-1:-1;;;;16202:283:0:o;34545:573::-;24158:13;:11;:13::i;:::-;34674:9:::1;34669:442;34689:19:::0;;::::1;34669:442;;;34754:11;:24;34766:8;;34775:1;34766:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;34754:24:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;34754:24:0;;::::1;;34753:25;34752:84:::0;::::1;;;;34824:10;-1:-1:-1::0;;;;;34801:34:0::1;:8;;34810:1;34801:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;34801:34:0::1;;;34752:84;:135;;;;-1:-1:-1::0;34881:4:0::1;34858:8:::0;;34867:1;34858:11;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;34858:28:0::1;;;34752:135;:185;;;;-1:-1:-1::0;26477:1:0::1;34909:8:::0;;34918:1;34909:11;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;34909:27:0::1;;;34752:185;:295;;;;;34960:16;:29;34977:8;;34986:1;34977:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;34960:29:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;34960:29:0;;::::1;;34959:30;:87:::0;::::1;;;;35015:18;:31;35034:8;;35043:1;35034:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35015:31:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;35015:31:0;;::::1;;35014:32;34959:87;34730:369;;;35063:36;35080:8;;35089:1;35080:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;35093:5;35063:16;:36::i;:::-;34710:3;;34669:442;;32615:225:::0;24158:13;:11;:13::i;:::-;32727:4:::1;32706:13;14272:12:::0;;;14193:99;32706:13:::1;:17;::::0;32722:1:::1;32706:17;:::i;:::-;32705:26;;;;:::i;:::-;32694:6;:38;;32686:65;;;;-1:-1:-1::0;;;32686:65:0::1;;;;;;;;;;;;32762:12;:21:::0;;;32799:33:::1;::::0;2156:25:1;;;32799:33:0::1;::::0;2144:2:1;2129:18;32799:33:0::1;;;;;;;;32615:225:::0;:::o;33507:253::-;24158:13;:11;:13::i;:::-;26967:2:::1;33596:7;:24;;33588:47;;;;-1:-1:-1::0;;;33588:47:0::1;;;;;;;;;;;;26967:2;33654:8;:25;;33646:48;;;;-1:-1:-1::0;;;33646:48:0::1;;;;;;;;;;;;33707:6;:16:::0;;;;33734:7:::1;:18:::0;33507:253::o;32089:148::-;24158:13;:11;:13::i;:::-;32162:15:::1;:23:::0;;;::::1;;-1:-1:-1::0;;;32162:23:0::1;-1:-1:-1::0;;;;32162:23:0;;::::1;;::::0;;32201:28:::1;::::0;::::1;::::0;::::1;::::0;32180:5;1110:14:1;1103:22;1085:41;;1073:2;1058:18;;945:187;24947:103:0;24158:13;:11;:13::i;:::-;25012:30:::1;25039:1;25012:18;:30::i;:::-;24947:103::o:0;32848:233::-;24158:13;:11;:13::i;:::-;32962:4:::1;32941:13;14272:12:::0;;;14193:99;32941:13:::1;:17;::::0;32957:1:::1;32941:17;:::i;:::-;32940:26;;;;:::i;:::-;32929:6;:38;;32921:65;;;;-1:-1:-1::0;;;32921:65:0::1;;;;;;;;;;;;32997:14;:23:::0;;;33036:37:::1;::::0;2156:25:1;;;33036:37:0::1;::::0;2144:2:1;2129:18;33036:37:0::1;2010:177:1::0;32386:221:0;24158:13;:11;:13::i;:::-;32497:4:::1;32476:13;14272:12:::0;;;14193:99;32476:13:::1;:17;::::0;32492:1:::1;32476:17;:::i;:::-;32475:26;;;;:::i;:::-;32464:6;:38;;32456:65;;;;-1:-1:-1::0;;;32456:65:0::1;;;;;;;;;;;;32532:11;:20:::0;;;32568:31:::1;::::0;2156:25:1;;;32568:31:0::1;::::0;2144:2:1;2129:18;32568:31:0::1;2010:177:1::0;13301:95:0;13348:13;13381:7;13374:14;;;;;:::i;35304:678::-;24158:13;:11;:13::i;:::-;35396:10:::1;35380:13;-1:-1:-1::0;;;;;35446:22:0;::::1;35442:481;;-1:-1:-1::0;35521:21:0::1;35485:12;35565:10:::0;35557:38:::1;;;;-1:-1:-1::0;;;35557:38:0::1;;;;;;;;;;;;35624;::::0;-1:-1:-1;;;;;35624:19:0;::::1;::::0;35651:6;;35624:38:::1;::::0;;;35651:6;35624:19;:38:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35610:52;;;;;35685:7;35677:39;;;;-1:-1:-1::0;;;35677:39:0::1;;;;;;;;;;;;35470:258;35442:481;;;35758:39;::::0;-1:-1:-1;;;35758:39:0;;35791:4:::1;35758:39;::::0;::::1;3103:51:1::0;-1:-1:-1;;;;;35758:24:0;::::1;::::0;::::1;::::0;3076:18:1;;35758:39:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35749:48;;35829:1;35820:6;:10;35812:41;;;;-1:-1:-1::0;;;35812:41:0::1;;;;;;;;;;;;35868:43;::::0;-1:-1:-1;;;35868:43:0;;35892:10:::1;35868:43;::::0;::::1;7116:51:1::0;7183:18;;;7176:34;;;-1:-1:-1;;;;;35868:23:0;::::1;::::0;::::1;::::0;7089:18:1;;35868:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35442:481;35938:36;::::0;;-1:-1:-1;;;;;7134:32:1;;7116:51;;7198:2;7183:18;;7176:34;;;35938:36:0::1;::::0;7089:18:1;35938:36:0::1;;;;;;;;35369:613;;35304:678:::0;:::o;33089:410::-;24158:13;:11;:13::i;:::-;33161:25:::1;33189:13;14272:12:::0;;;14193:99;33189:13:::1;33161:41:::0;-1:-1:-1;33257:7:0::1;33232:21;33161:41:::0;33252:1:::1;33232:21;:::i;:::-;33231:33;;;;:::i;:::-;33221:6;:43;;33213:70;;;;-1:-1:-1::0;;;33213:70:0::1;;;;;;;;;;;;33338:4;33313:21;:17:::0;33333:1:::1;33313:21;:::i;:::-;33312:30;;;;:::i;:::-;33302:6;:40;;33294:67;;;;-1:-1:-1::0;;;33294:67:0::1;;;;;;;;;;;;33391:13;::::0;;33415:22;;;;33453:38:::1;::::0;;7645:25:1;;;7701:2;7686:18;;7679:34;;;33453:38:0::1;::::0;7618:18:1;33453:38:0::1;7471:248:1::0;32245:133:0;24158:13;:11;:13::i;:::-;32311:11:::1;:19:::0;;;::::1;;-1:-1:-1::0;;;32311:19:0::1;-1:-1:-1::0;;;;32311:19:0;;::::1;;::::0;;32346:24:::1;::::0;::::1;::::0;::::1;::::0;32325:5;1110:14:1;1103:22;1085:41;;1073:2;1058:18;;945:187;14678:182:0;14747:4;4386:10;14803:27;4386:10;14820:2;14824:5;14803:9;:27::i;34051:237::-;24158:13;:11;:13::i;:::-;34177:9:::1;34172:109;34192:19:::0;;::::1;34172:109;;;34233:36;34250:8;;34259:1;34250:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;34263:5;34233:16;:36::i;:::-;34213:3;;34172:109;;35126:170:::0;24158:13;:11;:13::i;:::-;-1:-1:-1;;;;;35214:17:0;::::1;;::::0;;;:11:::1;:17;::::0;;;;;::::1;;35213:18;35205:45;;;;-1:-1:-1::0;;;35205:45:0::1;;;;;;;;;;;;35261:27;35276:4;35282:5;35261:14;:27::i;:::-;35126:170:::0;;:::o;31939:142::-;24158:13;:11;:13::i;:::-;32010::::1;:21:::0;;;::::1;;-1:-1:-1::0;;;32010:21:0::1;-1:-1:-1::0;;;;32010:21:0;;::::1;;::::0;;32047:26:::1;::::0;::::1;::::0;::::1;::::0;32026:5;1110:14:1;1103:22;1085:41;;1073:2;1058:18;;945:187;33768:275:0;24158:13;:11;:13::i;:::-;26967:2:::1;33855:12;:29;;33847:52;;;;-1:-1:-1::0;;;33847:52:0::1;;;;;;;;;;;;33929:11;::::0;;33951:26;;;;33993:42:::1;::::0;;7645:25:1;;;7701:2;7686:18;;7679:34;;;33993:42:0::1;::::0;7618:18:1;33993:42:0::1;7471:248:1::0;25205:220:0;24158:13;:11;:13::i;:::-;-1:-1:-1;;;;;25290:22:0;::::1;25286:93;;25336:31;::::0;-1:-1:-1;;;25336:31:0;;25364:1:::1;25336:31;::::0;::::1;3103:51:1::0;3076:18;;25336:31:0::1;;;;;;;;25286:93;25389:28;25408:8;25389:18;:28::i;:::-;25205:220:::0;:::o;31397:263::-;24158:13;:11;:13::i;:::-;-1:-1:-1;;;;;31480:26:0;::::1;31472:53;;;;-1:-1:-1::0;;;31472:53:0::1;;;;;;;;;;;;31556:9;::::0;;-1:-1:-1;;;;;31576:22:0;;::::1;-1:-1:-1::0;;;;;;31576:22:0;::::1;::::0;::::1;::::0;;;31614:38:::1;::::0;;5885:51:1;;;31556:9:0;::::1;5967:2:1::0;5952:18;;5945:60;;;31556:9:0;31614:38:::1;::::0;5858:18:1;31614:38:0::1;5711:300:1::0;20295:130:0;20380:37;20389:5;20396:7;20405:5;20412:4;20380:8;:37::i;:::-;20295:130;;;:::o;24437:166::-;24318:7;24345:6;-1:-1:-1;;;;;24345:6:0;4386:10;24497:23;24493:103;;24544:40;;-1:-1:-1;;;24544:40:0;;4386:10;24544:40;;;3103:51:1;3076:18;;24544:40:0;2957:203:1;40629:178:0;-1:-1:-1;;;;;40714:27:0;;;;;;:18;:27;;;;;;;;;:35;;-1:-1:-1;;40714:35:0;;;;;;;;;;40765:34;;7892:51:1;;;7959:18;;;7952:50;40765:34:0;;7865:18:1;40765:34:0;7724:284:1;22054:603:0;-1:-1:-1;;;;;15055:18:0;;;22188:24;15055:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;22255:37:0;;22251:399;;22332:5;22313:16;:24;22309:214;;;22365:142;;-1:-1:-1;;;22365:142:0;;-1:-1:-1;;;;;8233:32:1;;22365:142:0;;;8215:51:1;8282:18;;;8275:34;;;8325:18;;;8318:34;;;8188:18;;22365:142:0;8013:345:1;22309:214:0;22566:57;22575:5;22582:7;22610:5;22591:16;:24;22617:5;22566:8;:57::i;16870:308::-;-1:-1:-1;;;;;16954:18:0;;16950:88;;16996:30;;-1:-1:-1;;;16996:30:0;;17023:1;16996:30;;;3103:51:1;3076:18;;16996:30:0;2957:203:1;16950:88:0;-1:-1:-1;;;;;17052:16:0;;17048:88;;17092:32;;-1:-1:-1;;;17092:32:0;;17121:1;17092:32;;;3103:51:1;3076:18;;17092:32:0;2957:203:1;17048:88:0;17146:24;17154:4;17160:2;17164:5;17146:7;:24::i;40815:171::-;-1:-1:-1;;;;;40898:24:0;;;;;;:15;:24;;;;;;;;;:32;;-1:-1:-1;;40898:32:0;;;;;;;;;;40946;;7892:51:1;;;7959:18;;;7952:50;40946:32:0;;7865:18:1;40946:32:0;7724:284:1;30742:392:0;30817:16;24345:6;-1:-1:-1;;;;;24345:6:0;30858:24;;30854:140;;30899:33;30916:8;30926:5;30899:16;:33::i;:::-;30947:35;30966:8;30976:5;30947:18;:35::i;:::-;31004:32;31021:8;31031:4;31004:16;:32::i;:::-;31047:34;31066:8;31076:4;31047:18;:34::i;:::-;31092;31117:8;31092:24;:34::i;40449:172::-;-1:-1:-1;;;;;40532:25:0;;;;;;:16;:25;;;;;;;;;:33;;-1:-1:-1;;40532:33:0;;;;;;;;;;40581:32;;7892:51:1;;;7959:18;;;7952:50;40581:32:0;;7865:18:1;40581:32:0;7724:284:1;40994:163:0;-1:-1:-1;;;;;41072:17:0;;;;;;:11;:17;;;;;;;;;:25;;-1:-1:-1;;41072:25:0;;;;;;;;;;41113:36;;7892:51:1;;;7959:18;;;7952:50;41113:36:0;;7865:18:1;41113:36:0;7724:284:1;21276:486:0;-1:-1:-1;;;;;21432:19:0;;21428:91;;21475:32;;-1:-1:-1;;;21475:32:0;;21504:1;21475:32;;;3103:51:1;3076:18;;21475:32:0;2957:203:1;21428:91:0;-1:-1:-1;;;;;21533:21:0;;21529:92;;21578:31;;-1:-1:-1;;;21578:31:0;;21606:1;21578:31;;;3103:51:1;3076:18;;21578:31:0;2957:203:1;21529:92:0;-1:-1:-1;;;;;21631:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;:35;;;21677:78;;;;21728:7;-1:-1:-1;;;;;21712:31:0;21721:5;-1:-1:-1;;;;;21712:31:0;;21737:5;21712:31;;;;2156:25:1;;2144:2;2129:18;;2010:177;21712:31:0;;;;;;;;21276:486;;;;:::o;35990:3531::-;-1:-1:-1;;;;;36206:21:0;;36120:14;36206:21;;;:15;:21;;;;;;36137:10;;36175:9;;36206:21;;36205:22;36197:54;;;;-1:-1:-1;;;36197:54:0;;;;;;;;;;;;36294:4;-1:-1:-1;;;;;36284:14:0;:6;-1:-1:-1;;;;;36284:14:0;;:42;;;-1:-1:-1;;;;;;36303:23:0;;;;;;:15;:23;;;;;;;;36302:24;36284:42;36262:111;;;;-1:-1:-1;;;36262:111:0;;;;;;;;;;;;36416:4;-1:-1:-1;;;;;36406:14:0;:6;-1:-1:-1;;;;;36406:14:0;;:34;;;;36434:6;-1:-1:-1;;;;;36424:16:0;:6;-1:-1:-1;;;;;36424:16:0;;36406:34;:62;;;-1:-1:-1;;;;;;36445:23:0;;;;;;:15;:23;;;;;;;;36444:24;36406:62;36384:131;;;;-1:-1:-1;;;36384:131:0;;;;;;;;;;;;36550:11;;-1:-1:-1;;;36550:11:0;;;;;:39;;-1:-1:-1;;;;;;36565:24:0;;;;;;:18;:24;;;;;;;;36550:39;:65;;;-1:-1:-1;;;;;;36593:22:0;;;;;;:18;:22;;;;;;;;36550:65;36528:127;;;;-1:-1:-1;;;36528:127:0;;;;;;;;;;;;36687:13;;36668:16;;-1:-1:-1;;;36687:13:0;;;;:44;;;;-1:-1:-1;36718:13:0;;-1:-1:-1;;;36718:13:0;;;;36717:14;36687:44;:114;;;;-1:-1:-1;;;;;;36750:24:0;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;36778:22:0;;;;;;:18;:22;;;;;;;;36750:50;36748:53;36687:114;36668:133;;36816:11;36812:1487;;;24318:7;24345:6;-1:-1:-1;;;;;36866:15:0;;;24345:6;;36866:15;;;;:49;;-1:-1:-1;24318:7:0;24345:6;-1:-1:-1;;;;;36902:13:0;;;24345:6;;36902:13;;36866:49;:88;;;;-1:-1:-1;;;;;;36936:18:0;;;;36866:88;:127;;;;-1:-1:-1;;;;;;36975:18:0;;26533:6;36975:18;;36866:127;36844:1444;;;37032:15;;-1:-1:-1;;;37032:15:0;;;;37028:532;;;37090:10;-1:-1:-1;;;;;37076:25:0;:2;-1:-1:-1;;;;;37076:25:0;;;:43;;;;;37111:8;-1:-1:-1;;;;;37105:14:0;:2;-1:-1:-1;;;;;37105:14:0;;;37076:43;37072:469;;;37215:16;37230:1;37215:12;:16;:::i;:::-;-1:-1:-1;;;;;37186:26:0;;;;;;:18;:26;;;;;;:45;:123;;;;-1:-1:-1;37293:16:0;37308:1;37293:12;:16;:::i;:::-;-1:-1:-1;;;;;37268:22:0;;;;;;:18;:22;;;;;;:41;37186:123;37148:237;;;;-1:-1:-1;;;37148:237:0;;;;;;;;;;;;-1:-1:-1;;;;;37412:26:0;;;;;;;:18;:26;;;;;;37441:12;37412:41;;;;37480:22;;;;;;;:37;37072:469;-1:-1:-1;;;;;37584:17:0;;;;;;:11;:17;;;;;;;;:44;;;;-1:-1:-1;;;;;;37606:22:0;;;;;;:18;:22;;;;;;;;37605:23;37584:44;37580:693;;;37671:11;;37661:6;:21;;37653:52;;;;-1:-1:-1;;;37653:52:0;;;;;;;;;;;;37788:14;;-1:-1:-1;;;;;14447:18:0;;14420:7;14447:18;;;:9;:18;;;;;;37762:22;;:6;:22;:::i;:::-;:40;;37728:147;;;;-1:-1:-1;;;37728:147:0;;;;;;;;;;;;37580:693;;;-1:-1:-1;;;;;37905:15:0;;;;;;:11;:15;;;;;;;;:44;;;;-1:-1:-1;;;;;;37925:24:0;;;;;;:18;:24;;;;;;;;37924:25;37905:44;37901:372;;;37992:12;;37982:6;:22;;37974:54;;;;-1:-1:-1;;;37974:54:0;;;;;;;;;;;37901:372;-1:-1:-1;;;;;38059:22:0;;;;;;:18;:22;;;;;;;;38054:219;;38166:14;;-1:-1:-1;;;;;14447:18:0;;14420:7;14447:18;;;:9;:18;;;;;;38140:22;;:6;:22;:::i;:::-;:40;;38106:147;;;;-1:-1:-1;;;38106:147:0;;;;;;;;;;;;38327:11;;38311:13;;-1:-1:-1;;;38327:11:0;;;;:42;;;;-1:-1:-1;38356:13:0;;-1:-1:-1;;;38356:13:0;;;;38355:14;38327:42;:108;;;;-1:-1:-1;;;;;;38388:22:0;;;;;;:16;:22;;;;;;;;;:46;;-1:-1:-1;;;;;;38414:20:0;;;;;;:16;:20;;;;;;;;38388:46;38386:49;38327:108;38311:124;;38452:8;38448:625;;;-1:-1:-1;;;;;38517:15:0;;38477:17;38517:15;;;:11;:15;;;;;;;;:30;;;;;38546:1;38536:7;;:11;38517:30;38513:396;;;38601:3;38590:7;;38581:6;:16;;;;:::i;:::-;38580:24;;;;:::i;:::-;38568:36;;38513:396;;;-1:-1:-1;;;;;38630:17:0;;;;;;:11;:17;;;;;;;;:31;;;;;38660:1;38651:6;;:10;38630:31;38626:283;;;38714:3;38704:6;;38695;:15;;;;:::i;38626:283::-;-1:-1:-1;;;;;38762:15:0;;;;;;:11;:15;;;;;;;;38761:16;:38;;;;-1:-1:-1;;;;;;38782:17:0;;;;;;:11;:17;;;;;;;;38781:18;38761:38;:57;;;;;38817:1;38803:11;;:15;38761:57;38739:170;;;38890:3;38875:11;;38866:6;:20;;;;:::i;:::-;38865:28;;;;:::i;:::-;38853:40;;38739:170;38929:13;;38925:137;;38963:19;38973:9;38963:19;;:::i;:::-;;;39001:45;39015:4;39029;39036:9;39001:13;:45::i;:::-;38462:611;38448:625;39134:4;39085:28;14447:18;;;:9;:18;;;;;;39190:13;;39166:37;;;39218:8;:30;;;;-1:-1:-1;;;;;;39231:17:0;;;;;;:11;:17;;;;;;;;39230:18;39218:30;:41;;;;;39252:7;39218:41;39214:256;;;39295:13;;39280:12;:28;:62;;;;;39327:15;;39312:12;:30;39280:62;39276:183;;;39363:33;39375:20;39363:11;:33::i;:::-;39431:12;39415:13;:28;39276:183;39482:31;39496:4;39502:2;39506:6;39482:13;:31::i;:::-;36109:3412;;;;;;35990:3531;;;:::o;25585:191::-;25659:16;25678:6;;-1:-1:-1;;;;;25695:17:0;;;-1:-1:-1;;;;;;25695:17:0;;;;;;25728:40;;25678:6;;;;;;;25728:40;;25659:16;25728:40;25648:128;25585:191;:::o;17502:1135::-;-1:-1:-1;;;;;17592:18:0;;17588:552;;17746:5;17730:12;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;17588:552:0;;-1:-1:-1;17588:552:0;;-1:-1:-1;;;;;17806:15:0;;17784:19;17806:15;;;:9;:15;;;;;;17840:19;;;17836:117;;;17887:50;;-1:-1:-1;;;17887:50:0;;-1:-1:-1;;;;;8233:32:1;;17887:50:0;;;8215:51:1;8282:18;;;8275:34;;;8325:18;;;8318:34;;;8188:18;;17887:50:0;8013:345:1;17836:117:0;-1:-1:-1;;;;;18076:15:0;;;;;;:9;:15;;;;;18094:19;;;;18076:37;;17588:552;-1:-1:-1;;;;;18156:16:0;;18152:435;;18322:12;:21;;;;;;;18152:435;;;-1:-1:-1;;;;;18538:13:0;;;;;;:9;:13;;;;;:22;;;;;;18152:435;18619:2;-1:-1:-1;;;;;18604:25:0;18613:4;-1:-1:-1;;;;;18604:25:0;;18623:5;18604:25;;;;2156::1;;2144:2;2129:18;;2010:177;18604:25:0;;;;;;;;17502:1135;;;:::o;39529:912::-;29015:13;:20;;-1:-1:-1;;;;29015:20:0;-1:-1:-1;;;29015:20:0;;;39662:16:::1;::::0;;39676:1:::1;39662:16:::0;;;;;::::1;::::0;;-1:-1:-1;;;;39662:16:0;39676:1;39662:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;39662:16:0::1;39638:40;;39707:4;39689;39694:1;39689:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;39689:23:0::1;;;-1:-1:-1::0;;;;;39689:23:0::1;;;::::0;::::1;39733:10;-1:-1:-1::0;;;;;39733:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39723:4;39728:1;39723:7;;;;;;;;:::i;:::-;;;;;;:27;-1:-1:-1::0;;;;;39723:27:0::1;;;-1:-1:-1::0;;;;;39723:27:0::1;;;::::0;::::1;39763:21;39787:13;;39803:2;39787:18;;;;:::i;:::-;39763:42;;39836:13;39822:11;:27;39818:87;;;39880:13;39866:27;;39818:87;39917:191;::::0;-1:-1:-1;;;39917:191:0;;-1:-1:-1;;;;;39917:10:0::1;:61;::::0;::::1;::::0;:191:::1;::::0;39993:11;;40019:1:::1;::::0;40035:4;;40062::::1;::::0;40082:15:::1;::::0;39917:191:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;40142:21:0::1;::::0;-1:-1:-1;40121:18:0::1;::::0;-1:-1:-1;40200:14:0::1;::::0;-1:-1:-1;40213:1:0::1;40142:21:::0;40200:14:::1;:::i;:::-;40176:38:::0;-1:-1:-1;40225:25:0::1;40253:26;40176:38:::0;40253:10;:26:::1;:::i;:::-;40314:9;::::0;40306:49:::1;::::0;40225:54;;-1:-1:-1;;;;;;40314:9:0::1;::::0;40337:13;;40306:49:::1;::::0;;;40337:13;40314:9;40306:49:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;40388:9:0::1;::::0;40380:53:::1;::::0;40292:63;;-1:-1:-1;;;;;;40388:9:0::1;::::0;40411:17;;40380:53:::1;::::0;;;40411:17;40388:9;40380:53:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;29058:13:0;:21;;-1:-1:-1;;;;29058:21:0;;;-1:-1:-1;;;;;;;;39529:912:0:o;14:418:1:-;163:2;152:9;145:21;126:4;195:6;189:13;238:6;233:2;222:9;218:18;211:34;297:6;292:2;284:6;280:15;275:2;264:9;260:18;254:50;353:1;348:2;339:6;328:9;324:22;320:31;313:42;423:2;416;412:7;407:2;399:6;395:15;391:29;380:9;376:45;372:54;364:62;;;14:418;;;;:::o;437:131::-;-1:-1:-1;;;;;512:31:1;;502:42;;492:70;;558:1;555;548:12;573:367;641:6;649;702:2;690:9;681:7;677:23;673:32;670:52;;;718:1;715;708:12;670:52;757:9;744:23;776:31;801:5;776:31;:::i;:::-;826:5;904:2;889:18;;;;876:32;;-1:-1:-1;;;573:367:1:o;1137:118::-;1223:5;1216:13;1209:21;1202:5;1199:32;1189:60;;1245:1;1242;1235:12;1260:745;1352:6;1360;1368;1421:2;1409:9;1400:7;1396:23;1392:32;1389:52;;;1437:1;1434;1427:12;1389:52;1477:9;1464:23;1510:18;1502:6;1499:30;1496:50;;;1542:1;1539;1532:12;1496:50;1565:22;;1618:4;1610:13;;1606:27;-1:-1:-1;1596:55:1;;1647:1;1644;1637:12;1596:55;1687:2;1674:16;1713:18;1705:6;1702:30;1699:50;;;1745:1;1742;1735:12;1699:50;1800:7;1793:4;1783:6;1780:1;1776:14;1772:2;1768:23;1764:34;1761:47;1758:67;;;1821:1;1818;1811:12;1758:67;1852:4;1844:13;;;;-1:-1:-1;1876:6:1;-1:-1:-1;1917:20:1;;1904:34;1947:28;1904:34;1947:28;:::i;:::-;1994:5;1984:15;;;1260:745;;;;;:::o;2192:247::-;2251:6;2304:2;2292:9;2283:7;2279:23;2275:32;2272:52;;;2320:1;2317;2310:12;2272:52;2359:9;2346:23;2378:31;2403:5;2378:31;:::i;:::-;2428:5;2192:247;-1:-1:-1;;;2192:247:1:o;2444:508::-;2521:6;2529;2537;2590:2;2578:9;2569:7;2565:23;2561:32;2558:52;;;2606:1;2603;2596:12;2558:52;2645:9;2632:23;2664:31;2689:5;2664:31;:::i;:::-;2714:5;-1:-1:-1;2771:2:1;2756:18;;2743:32;2784:33;2743:32;2784:33;:::i;:::-;2444:508;;2836:7;;-1:-1:-1;;;2916:2:1;2901:18;;;;2888:32;;2444:508::o;3354:226::-;3413:6;3466:2;3454:9;3445:7;3441:23;3437:32;3434:52;;;3482:1;3479;3472:12;3434:52;-1:-1:-1;3527:23:1;;3354:226;-1:-1:-1;3354:226:1:o;3585:346::-;3653:6;3661;3714:2;3702:9;3693:7;3689:23;3685:32;3682:52;;;3730:1;3727;3720:12;3682:52;-1:-1:-1;;3775:23:1;;;3895:2;3880:18;;;3867:32;;-1:-1:-1;3585:346:1:o;3936:241::-;3992:6;4045:2;4033:9;4024:7;4020:23;4016:32;4013:52;;;4061:1;4058;4051:12;4013:52;4100:9;4087:23;4119:28;4141:5;4119:28;:::i;4182:382::-;4247:6;4255;4308:2;4296:9;4287:7;4283:23;4279:32;4276:52;;;4324:1;4321;4314:12;4276:52;4363:9;4350:23;4382:31;4407:5;4382:31;:::i;:::-;4432:5;-1:-1:-1;4489:2:1;4474:18;;4461:32;4502:30;4461:32;4502:30;:::i;:::-;4551:7;4541:17;;;4182:382;;;;;:::o;4801:388::-;4869:6;4877;4930:2;4918:9;4909:7;4905:23;4901:32;4898:52;;;4946:1;4943;4936:12;4898:52;4985:9;4972:23;5004:31;5029:5;5004:31;:::i;:::-;5054:5;-1:-1:-1;5111:2:1;5096:18;;5083:32;5124:33;5083:32;5124:33;:::i;5194:380::-;5273:1;5269:12;;;;5316;;;5337:61;;5391:4;5383:6;5379:17;5369:27;;5337:61;5444:2;5436:6;5433:14;5413:18;5410:38;5407:161;;5490:10;5485:3;5481:20;5478:1;5471:31;5525:4;5522:1;5515:15;5553:4;5550:1;5543:15;5407:161;;5194:380;;;:::o;5579:127::-;5640:10;5635:3;5631:20;5628:1;5621:31;5671:4;5668:1;5661:15;5695:4;5692:1;5685:15;6016:127;6077:10;6072:3;6068:20;6065:1;6058:31;6108:4;6105:1;6098:15;6132:4;6129:1;6122:15;6148:168;6221:9;;;6252;;6269:15;;;6263:22;;6249:37;6239:71;;6290:18;;:::i;6321:217::-;6361:1;6387;6377:132;;6431:10;6426:3;6422:20;6419:1;6412:31;6466:4;6463:1;6456:15;6494:4;6491:1;6484:15;6377:132;-1:-1:-1;6523:9:1;;6321:217::o;6753:184::-;6823:6;6876:2;6864:9;6855:7;6851:23;6847:32;6844:52;;;6892:1;6889;6882:12;6844:52;-1:-1:-1;6915:16:1;;6753:184;-1:-1:-1;6753:184:1:o;7221:245::-;7288:6;7341:2;7329:9;7320:7;7316:23;7312:32;7309:52;;;7357:1;7354;7347:12;7309:52;7389:9;7383:16;7408:28;7430:5;7408:28;:::i;8363:128::-;8430:9;;;8451:11;;;8448:37;;;8465:18;;:::i;8496:125::-;8561:9;;;8582:10;;;8579:36;;;8595:18;;:::i;8758:251::-;8828:6;8881:2;8869:9;8860:7;8856:23;8852:32;8849:52;;;8897:1;8894;8887:12;8849:52;8929:9;8923:16;8948:31;8973:5;8948:31;:::i;9014:959::-;9276:4;9324:3;9313:9;9309:19;9355:6;9344:9;9337:25;9398:6;9393:2;9382:9;9378:18;9371:34;9441:3;9436:2;9425:9;9421:18;9414:31;9465:6;9500;9494:13;9531:6;9523;9516:22;9569:3;9558:9;9554:19;9547:26;;9608:2;9600:6;9596:15;9582:29;;9629:1;9639:195;9653:6;9650:1;9647:13;9639:195;;;9718:13;;-1:-1:-1;;;;;9714:39:1;9702:52;;9783:2;9809:15;;;;9774:12;;;;9750:1;9668:9;9639:195;;;-1:-1:-1;;;;;;;9890:32:1;;;;9885:2;9870:18;;9863:60;-1:-1:-1;;9954:3:1;9939:19;9932:35;9851:3;9014:959;-1:-1:-1;;;9014:959:1:o

Swarm Source

ipfs://289bbce85ff06164c5af10dae31aee5e5fe81d7ff7f7faeafab228a8c5f5d3be
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.