ETH Price: $3,454.21 (+1.63%)

Token

KROK ($krok)
 

Overview

Max Total Supply

1,000,000,000 $krok

Holders

179

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
307,507.597156718739230625 $krok

Value
$0.00
0xEee899B6521DB73E94F4B9224Cdf3db0010Fa334
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:
KROK

Compiler Version
v0.8.27+commit.40a35a09

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-09-26
*/

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

/**
Das ist Krok!

Website:  https://krok.show
Telegram: https://t.me/krokshowchat
Twitter:  https://x.com/krokshow
*/

/*

██   ██ ██████   ██████  ██   ██ 
██  ██  ██   ██ ██    ██ ██  ██  
█████   ██████  ██    ██ █████   
██  ██  ██   ██ ██    ██ ██  ██  
██   ██ ██   ██  ██████  ██   ██ 

*/

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

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

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

/**
 * @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.
 *
 *
 * 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`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

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

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

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 swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );
}

contract KROK is ERC20, Ownable {
    //Wallets
    address[] internal taxWallets;

    /// MAX AMOUNT PER BUY / SELL
    uint256 internal maxAmountPerTx = MAX_SUPPLY / 50;
    /// MAX WALLET AMOUNT
    uint256 internal maxWalletAmount = MAX_SUPPLY / 50;

    /// MAX SUPPLY
    uint256 internal constant MAX_SUPPLY = 1_000_000_000 * 1e18;
    /// PERCENT_DIVISOR
    uint256 internal constant PERCENT_DIVISOR = 10_000;

    /// TAX 
    uint256 internal constant totalBuyTax = 200;
    uint256 internal constant totalSellTax = 200; 

    /// Threshold after which collected tax is sold for eth
    uint256 internal constant swapTokensAtAmount = MAX_SUPPLY / 100_000; // = 0.01%

    /// Trading flag
    bool internal trading;

    /// mapping for managing users which are excluded from taxes
    mapping(address => bool) internal isExcluded;

    /// @notice uniswapV2Router
    IUniswapV2Router internal immutable uniswapV2Router;
    /// @notice uniswapPair
    address internal immutable uniswapPair;
    /// swapping used during collected tokens are swapped for eth
    bool internal swapping;

    //// EVENTS

    event TaxWalletTransferred(
        address indexed oldTaxWallet,
        address indexed newTaxWallet
    );

    //// MODIFIER

    /**
     * @dev Throws if the sender is not the tax wallet.
     */

    modifier onlyTaxWallets() {
        require(
            addressExists(taxWallets, msg.sender),
            "Not a Tax Wallet"
        );
        _;
    }

    function addressExists(address[] memory addresses, address _address)
        internal
        pure
        returns (bool)
    {
        for (uint256 i = 0; i < addresses.length; i++) {
            if (addresses[i] == _address) {
                return true;
            }
        }
        return false;
    }

    /** @notice create an erc20, initialize all required variables
     *        like owner, uniswap v2 router, taxes values and wallets values.
     *        excludes the owner and token address from taxes and limits.
     *        mints the total supply to the owner wallet.
     */

    constructor() ERC20("KROK", "$krok") Ownable(msg.sender) {
        uniswapV2Router = IUniswapV2Router(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );

        taxWallets = [
            0x59247Ed344b4505f2Ad78Cfb4D68a97fBFf51425,
            0x1C943C236c17Fce419F60B5828BebbE986E097e2,
            0x962A99Ee3df178DDeA7f4388DC92669136803618,
            0x758F3A7E9BefAEBF425dcb87fc8bF8399cd89222
        ];

        uniswapPair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
            address(this),
            uniswapV2Router.WETH()
        );

        isExcluded[address(this)] = true;
        isExcluded[msg.sender] = true;
        isExcluded[address(0x0)] = true;

        for (uint256 i = 0; i < taxWallets.length; i++) {
            isExcluded[taxWallets[i]] = true;
        }

        trading = false;

        _mint(msg.sender, MAX_SUPPLY);
    }

    /**
     * @notice to recieve ETH from uniswapV2Router when swapping
     */

    receive() external payable {}

    /**
     * @notice Allows the marketing wallet to claim stuck ERC20 tokens
     * @dev Only the marketing wallet can call this function
     * @param token The address of the ERC20 token to claim
     * @param value The amount of tokens to claim
     * @param wallet The address to transfer the claimed tokens to
     */

    function claimStuckERC20(
        address token,
        uint256 value,
        address wallet
    ) external onlyTaxWallets {
        ERC20 ERC20Token = ERC20(token);
        bool success = ERC20Token.transfer(wallet, value);
        require(success, "ERC20 transfer failed");
    }

    /**
     * @notice Allows the marketing wallet to claim stuck ERC20 tokens
     * @dev Only the marketing wallet can call this function
     * @param wallet The address to transfer the claimed tokens to
     */

    function claimStuckEth(address wallet) external onlyTaxWallets {
        require(wallet != address(0), "Wallet must not be 0x0 address");

        uint256 balance = address(this).balance;
        require(balance > 0, "No ETH to transfer");

        payable(wallet).transfer(balance);
    }

    /**
     * @notice Enable Trading
     */

    function enableTrading() external onlyOwner {
        require(!trading, "Trading already open");

        require(address(this).balance > 0, "Needs ETH for liquidity");

        _approve(address(this), address(uniswapV2Router), MAX_SUPPLY);

        uniswapV2Router.addLiquidityETH{value: address(this).balance}(
            address(this),
            balanceOf(address(this)),
            0,
            0,
            owner(),
            block.timestamp
        );

        trading = true;
    }

    /**
     * @notice Update the Tax Wallet wallet address
     * @param newTaxWallet: The new address for the Tax wallet
     */

    function transferTaxWallet(address newTaxWallet) external onlyTaxWallets {
        require(
            newTaxWallet != address(0x0) && newTaxWallet != address(0xdead),
            "New Tax Wallet not 0x0 or 0xdead"
        );
        require(
            !addressExists(taxWallets, newTaxWallet),
            "New tax wallet already exists"
        );

        for (uint256 i = 0; i < taxWallets.length; i++) {
            if (taxWallets[i] == msg.sender) {
                taxWallets[i] = newTaxWallet;
                break;
            }
        }

        isExcluded[msg.sender] = false;
        isExcluded[newTaxWallet] = true;
        emit TaxWalletTransferred(msg.sender, newTaxWallet);
    }

    /**
     * @notice Remove buy and sell restrictions
     */
    function removeRestrictions() external onlyOwner {
        maxAmountPerTx = MAX_SUPPLY;
        maxWalletAmount = MAX_SUPPLY;
    }

    /**
     * @notice Override for _update required by Solidity
     *  Manage fees on buy/sell and maxTxAmount/MaxWalletLimit
     **/

    function _update(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(
            trading ||
                isExcluded[from] ||
                isExcluded[to] ||
                (from == address(uniswapV2Router) && to == uniswapPair) ||
                (to == address(uniswapV2Router) && from == uniswapPair),
            "Trading disabled"
        );

        if (!(isExcluded[from] || isExcluded[to]) && trading) {
            uint256 fee;
            if (to != uniswapPair) {
                require(
                    amount + balanceOf(to) <= maxWalletAmount,
                    "Max limit per wallet reached"
                );
            }
            if (from == uniswapPair) {
                require(
                    amount <= maxAmountPerTx,
                    "Max buy amount exceeded"
                );
                fee = (amount * totalBuyTax) / PERCENT_DIVISOR;
            } else if (to == uniswapPair) {
                require(
                    amount <= maxAmountPerTx,
                    "Max sell amount exceeded"
                );
                fee = (amount * totalSellTax) / PERCENT_DIVISOR;
            }

            amount = amount - fee;

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

        uint256 contractBalance = balanceOf(address(this));

        //Only swap into ETH when trading is happening
        bool canSwap = contractBalance >= swapTokensAtAmount &&
            from != uniswapPair &&
            !isExcluded[from] &&
            !swapping &&
            trading;

        if (canSwap) {
            swapping = true;
            swapAndDistribute(contractBalance);
            swapping = false;
        }

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

    /**
     * @notice The function swaps tokens for ETH, adds liquidity to the Uniswap V2 pair,
     *  and distributes fees according to the configured percentages.
     *
     * @param tokens The total amount of tokens to process for swapping and liquidity addition.
     *
     */

    function swapAndDistribute(uint256 tokens) private {
        swapForEth(tokens);
        if (address(this).balance > 0) {
            uint256 balancePayout = address(this).balance / taxWallets.length;
            for (uint256 i = 0; i < taxWallets.length; i++) {
                payable(taxWallets[i]).transfer(balancePayout);
            }
        }
    }

    /**
     * @notice Swaps the specified amount of tokens for ETH using the Uniswap V2 Router.
     *
     * @param tokens The amount of tokens to swap for ETH.
     *
     * @dev This function generates the Uniswap pair path for the token to WETH,
     * checks the allowance for the token with the Uniswap V2 Router, and then makes
     * the swap from tokens to ETH. It ensures that the swap supports fees on transfer tokens
     * and sets a deadline for the swap transaction.
     */
    function swapForEth(uint256 tokens) private {
        // generate the Uniswap pair path of token -> WETH

        address contractAddress = address(this); 

        address[] memory path = new address[](2);
        path[0] = contractAddress;
        path[1] = uniswapV2Router.WETH();

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

        // make the swap
        uniswapV2Router.swapExactTokensForETH(
            tokens,
            0,
            path,
            contractAddress,
            block.timestamp
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldTaxWallet","type":"address"},{"indexed":true,"internalType":"address","name":"newTaxWallet","type":"address"}],"name":"TaxWalletTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"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":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"address","name":"wallet","type":"address"}],"name":"claimStuckERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"claimStuckEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeRestrictions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"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":"newTaxWallet","type":"address"}],"name":"transferTaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405261001b60326b033b2e3c9fd0803ce8000000610cd4565b60075561003560326b033b2e3c9fd0803ce8000000610cd4565b600855348015610043575f5ffd5b5033604051806040016040528060048152602001634b524f4b60e01b81525060405180604001604052806005815260200164246b726f6b60d81b815250816003908161008f9190610d83565b50600461009c8282610d83565b5050506001600160a01b0381166100cd57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100d681610396565b50737a250d5630b4cf539739df2c5dacb4c659f2488d60809081526040805191820181527359247ed344b4505f2ad78cfb4d68a97fbff514258252731c943c236c17fce419f60b5828bebbe986e097e2602083015273962a99ee3df178ddea7f4388dc926691368036189082015273758f3a7e9befaebf425dcb87fc8bf8399cd89222606082015261016c906006906004610c49565b506080516001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101ab573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101cf9190610e3d565b6001600160a01b031663c9c65396306080516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561021c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102409190610e3d565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801561028a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102ae9190610e3d565b6001600160a01b031660a052305f908152600a60205260408082208054600160ff19918216811790925533845291832080548316821790558280527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e380549092161790555b600654811015610370576001600a5f6006848154811061033557610335610e6a565b5f918252602080832091909101546001600160a01b031683528201929092526040019020805460ff1916911515919091179055600101610313565b506009805460ff19169055610391336b033b2e3c9fd0803ce80000006103e7565b610ff2565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382166104105760405163ec442f0560e01b81525f60048201526024016100c4565b61041b5f838361041f565b5050565b60095460ff168061044757506001600160a01b0383165f908152600a602052604090205460ff165b8061046957506001600160a01b0382165f908152600a602052604090205460ff165b806104a557506080516001600160a01b0316836001600160a01b03161480156104a5575060a0516001600160a01b0316826001600160a01b0316145b806104e157506080516001600160a01b0316826001600160a01b03161480156104e1575060a0516001600160a01b0316836001600160a01b0316145b6105205760405162461bcd60e51b815260206004820152601060248201526f151c98591a5b99c8191a5cd8589b195960821b60448201526064016100c4565b6001600160a01b0383165f908152600a602052604090205460ff168061055d57506001600160a01b0382165f908152600a602052604090205460ff165b15801561056c575060095460ff165b15610733575f60a0516001600160a01b0316836001600160a01b031614610600576008546001600160a01b0384165f908152602081905260409020546105b29084610e7e565b11156106005760405162461bcd60e51b815260206004820152601c60248201527f4d6178206c696d6974207065722077616c6c657420726561636865640000000060448201526064016100c4565b60a0516001600160a01b0316846001600160a01b03160361068c5760075482111561066d5760405162461bcd60e51b815260206004820152601760248201527f4d61782062757920616d6f756e7420657863656564656400000000000000000060448201526064016100c4565b61271061067b60c884610e91565b6106859190610cd4565b9050610714565b60a0516001600160a01b0316836001600160a01b031603610714576007548211156106f95760405162461bcd60e51b815260206004820152601860248201527f4d61782073656c6c20616d6f756e74206578636565646564000000000000000060448201526064016100c4565b61271061070760c884610e91565b6107119190610cd4565b90505b61071e8183610ea8565b91508015610731576107318430836107fb565b505b305f908152602081905260408120549061075c620186a06b033b2e3c9fd0803ce8000000610cd4565b821015801561077f575060a0516001600160a01b0316856001600160a01b031614155b80156107a357506001600160a01b0385165f908152600a602052604090205460ff16155b80156107b25750600b5460ff16155b80156107c0575060095460ff165b905080156107e957600b805460ff191660011790556107de82610921565b600b805460ff191690555b6107f48585856107fb565b5050505050565b6001600160a01b038316610825578060025f82825461081a9190610e7e565b909155506108959050565b6001600160a01b0383165f90815260208190526040902054818110156108775760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016100c4565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166108b1576002805482900390556108cf565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161091491815260200190565b60405180910390a3505050565b61092a816109ac565b47156109a9576006545f9061093f9047610cd4565b90505f5b6006548110156109a6576006818154811061096057610960610e6a565b5f9182526020822001546040516001600160a01b039091169184156108fc02918591818181858888f1935050505015801561099d573d5f5f3e3d5ffd5b50600101610943565b50505b50565b60408051600280825260608201835230925f92919060208301908036833701905050905081815f815181106109e3576109e3610e6a565b60200260200101906001600160a01b031690816001600160a01b0316815250506080516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a41573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a659190610e3d565b81600181518110610a7857610a78610e6a565b60200260200101906001600160a01b031690816001600160a01b03168152505082610aab83608051610b4360201b60201c565b1015610ac557610ac5826080515f19610b6f60201b60201c565b6080516001600160a01b03166318cbafe5845f8486426040518663ffffffff1660e01b8152600401610afb959493929190610ebb565b5f604051808303815f875af1158015610b16573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b3d9190810190610f2b565b50505050565b6001600160a01b038083165f908152600160209081526040808320938516835292905220545b92915050565b6109a683838360016001600160a01b038416610ba05760405163e602df0560e01b81525f60048201526024016100c4565b6001600160a01b038316610bc957604051634a1406b160e11b81525f60048201526024016100c4565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015610b3d57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610c3b91815260200190565b60405180910390a350505050565b828054828255905f5260205f20908101928215610c9c579160200282015b82811115610c9c57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190610c67565b50610ca8929150610cac565b5090565b5b80821115610ca8575f8155600101610cad565b634e487b7160e01b5f52601160045260245ffd5b5f82610cee57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680610d1b57607f821691505b602082108103610d3957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156109a657805f5260205f20601f840160051c81016020851015610d645750805b601f840160051c820191505b818110156107f4575f8155600101610d70565b81516001600160401b03811115610d9c57610d9c610cf3565b610db081610daa8454610d07565b84610d3f565b6020601f821160018114610de2575f8315610dcb5750848201515b5f19600385901b1c1916600184901b1784556107f4565b5f84815260208120601f198516915b82811015610e115787850151825560209485019460019092019101610df1565b5084821015610e2e57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60208284031215610e4d575f5ffd5b81516001600160a01b0381168114610e63575f5ffd5b9392505050565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610b6957610b69610cc0565b8082028115828204841417610b6957610b69610cc0565b81810381811115610b6957610b69610cc0565b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b81811015610f0b5783516001600160a01b0316835260209384019390920191600101610ee4565b50506001600160a01b039590951660608401525050608001529392505050565b5f60208284031215610f3b575f5ffd5b81516001600160401b03811115610f50575f5ffd5b8201601f81018413610f60575f5ffd5b80516001600160401b03811115610f7957610f79610cf3565b604051600582901b90603f8201601f191681016001600160401b0381118282101715610fa757610fa7610cf3565b604052918252602081840181019290810187841115610fc4575f5ffd5b6020850194505b83851015610fe757845180825260209586019590935001610fcb565b509695505050505050565b60805160a051611a296110675f395f8181610e3501528181610ead01528181610f7401528181611020015281816110ca01526111c201525f81816105c5015281816105f801528181610df901528181610e710152818161146f015281816115270152818161155701526115940152611a295ff3fe6080604052600436106100f2575f3560e01c80638a8c523c11610087578063c345c4d511610057578063c345c4d514610285578063dd62ed3e146102a4578063e17514ab146102c3578063eab15e43146102e2575f5ffd5b80638a8c523c146102175780638da5cb5b1461022b57806395d89b4114610252578063a9059cbb14610266575f5ffd5b8063313ce567116100c2578063313ce567146101935780633d8f0453146101ae57806370a08231146101cf578063715018a614610203575f5ffd5b806306fdde03146100fd578063095ea7b31461012757806318160ddd1461015657806323b872dd14610174575f5ffd5b366100f957005b5f5ffd5b348015610108575f5ffd5b506101116102f6565b60405161011e9190611613565b60405180910390f35b348015610132575f5ffd5b5061014661014136600461165c565b610386565b604051901515815260200161011e565b348015610161575f5ffd5b506002545b60405190815260200161011e565b34801561017f575f5ffd5b5061014661018e366004611686565b61039f565b34801561019e575f5ffd5b506040516012815260200161011e565b3480156101b9575f5ffd5b506101cd6101c83660046116c4565b6103c2565b005b3480156101da575f5ffd5b506101666101e9366004611703565b6001600160a01b03165f9081526020819052604090205490565b34801561020e575f5ffd5b506101cd61050b565b348015610222575f5ffd5b506101cd61051e565b348015610236575f5ffd5b506005546040516001600160a01b03909116815260200161011e565b34801561025d575f5ffd5b506101116106f6565b348015610271575f5ffd5b5061014661028036600461165c565b610705565b348015610290575f5ffd5b506101cd61029f366004611703565b610712565b3480156102af575f5ffd5b506101666102be366004611725565b61085f565b3480156102ce575f5ffd5b506101cd6102dd366004611703565b610889565b3480156102ed575f5ffd5b506101cd610b12565b6060600380546103059061175c565b80601f01602080910402602001604051908101604052809291908181526020018280546103319061175c565b801561037c5780601f106103535761010080835404028352916020019161037c565b820191905f5260205f20905b81548152906001019060200180831161035f57829003601f168201915b5050505050905090565b5f33610393818585610b31565b60019150505b92915050565b5f336103ac858285610b3e565b6103b7858585610ba1565b506001949350505050565b610424600680548060200260200160405190810160405280929190818152602001828054801561041957602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116103fb575b505050505033610bfe565b6104495760405162461bcd60e51b815260040161044090611794565b60405180910390fd5b60405163a9059cbb60e01b81526001600160a01b0382811660048301526024820184905284915f9183169063a9059cbb906044016020604051808303815f875af1158015610499573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104bd91906117be565b9050806105045760405162461bcd60e51b8152602060048201526015602482015274115490cc8c081d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610440565b5050505050565b610513610c57565b61051c5f610c84565b565b610526610c57565b60095460ff16156105705760405162461bcd60e51b81526020600482015260146024820152732a3930b234b7339030b63932b0b23c9037b832b760611b6044820152606401610440565b5f47116105bf5760405162461bcd60e51b815260206004820152601760248201527f4e656564732045544820666f72206c69717569646974790000000000000000006044820152606401610440565b6105f6307f00000000000000000000000000000000000000000000000000000000000000006b033b2e3c9fd0803ce8000000610b31565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d7194730610645306001600160a01b03165f9081526020819052604090205490565b5f5f6106596005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156106bf573d5f5f3e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906106e491906117dd565b50506009805460ff1916600117905550565b6060600480546103059061175c565b5f33610393818585610ba1565b610772600680548060200260200160405190810160405280929190818152602001828054801561041957602002820191905f5260205f209081546001600160a01b031681526001909101906020018083116103fb57505050505033610bfe565b61078e5760405162461bcd60e51b815260040161044090611794565b6001600160a01b0381166107e45760405162461bcd60e51b815260206004820152601e60248201527f57616c6c6574206d757374206e6f7420626520307830206164647265737300006044820152606401610440565b47806108275760405162461bcd60e51b815260206004820152601260248201527127379022aa24103a37903a3930b739b332b960711b6044820152606401610440565b6040516001600160a01b0383169082156108fc029083905f818181858888f1935050505015801561085a573d5f5f3e3d5ffd5b505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6108e9600680548060200260200160405190810160405280929190818152602001828054801561041957602002820191905f5260205f209081546001600160a01b031681526001909101906020018083116103fb57505050505033610bfe565b6109055760405162461bcd60e51b815260040161044090611794565b6001600160a01b0381161580159061092857506001600160a01b03811661dead14155b6109745760405162461bcd60e51b815260206004820181905260248201527f4e6577205461782057616c6c6574206e6f7420307830206f72203078646561646044820152606401610440565b6109d660068054806020026020016040519081016040528092919081815260200182805480156109cb57602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116109ad575b505050505082610bfe565b15610a235760405162461bcd60e51b815260206004820152601d60248201527f4e6577207461782077616c6c657420616c7265616479206578697374730000006044820152606401610440565b5f5b600654811015610ab157336001600160a01b031660068281548110610a4c57610a4c611808565b5f918252602090912001546001600160a01b031603610aa9578160068281548110610a7957610a79611808565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550610ab1565b600101610a25565b50335f818152600a6020526040808220805460ff199081169091556001600160a01b038516808452828420805490921660011790915590519092917f9b546d6a68d7369eead01c094bbbb1f9bc02a55bdb2a4da9ee3e8a41cc26e52391a350565b610b1a610c57565b6b033b2e3c9fd0803ce80000006007819055600855565b61085a8383836001610cd5565b5f610b49848461085f565b90505f198114610b9b5781811015610b8d57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610440565b610b9b84848484035f610cd5565b50505050565b6001600160a01b038316610bca57604051634b637e8f60e11b81525f6004820152602401610440565b6001600160a01b038216610bf35760405163ec442f0560e01b81525f6004820152602401610440565b61085a838383610da7565b5f805b8351811015610c4e57826001600160a01b0316848281518110610c2657610c26611808565b60200260200101516001600160a01b031603610c46576001915050610399565b600101610c01565b505f9392505050565b6005546001600160a01b0316331461051c5760405163118cdaa760e01b8152336004820152602401610440565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038416610cfe5760405163e602df0560e01b81525f6004820152602401610440565b6001600160a01b038316610d2757604051634a1406b160e11b81525f6004820152602401610440565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015610b9b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610d9991815260200190565b60405180910390a350505050565b60095460ff1680610dcf57506001600160a01b0383165f908152600a602052604090205460ff165b80610df157506001600160a01b0382165f908152600a602052604090205460ff165b80610e6957507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316148015610e6957507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b80610ee157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316148015610ee157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316145b610f205760405162461bcd60e51b815260206004820152601060248201526f151c98591a5b99c8191a5cd8589b195960821b6044820152606401610440565b6001600160a01b0383165f908152600a602052604090205460ff1680610f5d57506001600160a01b0382165f908152600a602052604090205460ff165b158015610f6c575060095460ff165b1561118d575f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161461101e576008546001600160a01b0384165f90815260208190526040902054610fd09084611830565b111561101e5760405162461bcd60e51b815260206004820152601c60248201527f4d6178206c696d6974207065722077616c6c65742072656163686564000000006044820152606401610440565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316036110c8576007548211156110a95760405162461bcd60e51b815260206004820152601760248201527f4d61782062757920616d6f756e742065786365656465640000000000000000006044820152606401610440565b6127106110b760c884611843565b6110c1919061185a565b905061116e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03160361116e576007548211156111535760405162461bcd60e51b815260206004820152601860248201527f4d61782073656c6c20616d6f756e7420657863656564656400000000000000006044820152606401610440565b61271061116160c884611843565b61116b919061185a565b90505b6111788183611879565b9150801561118b5761118b843083611268565b505b305f90815260208190526040812054906111b6620186a06b033b2e3c9fd0803ce800000061185a565b82101580156111f757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b801561121b57506001600160a01b0385165f908152600a602052604090205460ff16155b801561122a5750600b5460ff16155b8015611238575060095460ff165b9050801561126157600b805460ff191660011790556112568261138e565b600b805460ff191690555b6105048585855b6001600160a01b038316611292578060025f8282546112879190611830565b909155506113029050565b6001600160a01b0383165f90815260208190526040902054818110156112e45760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610440565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661131e5760028054829003905561133c565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161138191815260200190565b60405180910390a3505050565b61139781611416565b4715611413576006545f906113ac904761185a565b90505f5b60065481101561085a57600681815481106113cd576113cd611808565b5f9182526020822001546040516001600160a01b039091169184156108fc02918591818181858888f1935050505015801561140a573d5f5f3e3d5ffd5b506001016113b0565b50565b60408051600280825260608201835230925f92919060208301908036833701905050905081815f8151811061144d5761144d611808565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114c9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ed91906118a0565b8160018151811061150057611500611808565b60200260200101906001600160a01b031690816001600160a01b0316815250508261154b837f000000000000000000000000000000000000000000000000000000000000000061085f565b101561157d5761157d827f00000000000000000000000000000000000000000000000000000000000000005f19610b31565b6040516318cbafe560e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906318cbafe5906115d19086905f908690889042906004016118bb565b5f604051808303815f875af11580156115ec573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b9b919081019061192b565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b0381168114611413575f5ffd5b5f5f6040838503121561166d575f5ffd5b823561167881611648565b946020939093013593505050565b5f5f5f60608486031215611698575f5ffd5b83356116a381611648565b925060208401356116b381611648565b929592945050506040919091013590565b5f5f5f606084860312156116d6575f5ffd5b83356116e181611648565b92506020840135915060408401356116f881611648565b809150509250925092565b5f60208284031215611713575f5ffd5b813561171e81611648565b9392505050565b5f5f60408385031215611736575f5ffd5b823561174181611648565b9150602083013561175181611648565b809150509250929050565b600181811c9082168061177057607f821691505b60208210810361178e57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526010908201526f139bdd08184815185e0815d85b1b195d60821b604082015260600190565b5f602082840312156117ce575f5ffd5b8151801515811461171e575f5ffd5b5f5f5f606084860312156117ef575f5ffd5b5050815160208301516040909301519094929350919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156103995761039961181c565b80820281158282048414176103995761039961181c565b5f8261187457634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156103995761039961181c565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156118b0575f5ffd5b815161171e81611648565b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b8181101561190b5783516001600160a01b03168352602093840193909201916001016118e4565b50506001600160a01b039590951660608401525050608001529392505050565b5f6020828403121561193b575f5ffd5b815167ffffffffffffffff811115611951575f5ffd5b8201601f81018413611961575f5ffd5b805167ffffffffffffffff81111561197b5761197b61188c565b8060051b604051601f19603f830116810181811067ffffffffffffffff821117156119a8576119a861188c565b6040529182526020818401810192908101878411156119c5575f5ffd5b6020850194505b838510156119e8578451808252602095860195909350016119cc565b50969550505050505056fea2646970667358221220ca6756b5f93156916c0fb0207049dbe7682748b53eecda97c3aba3ec88a8549364736f6c634300081b0033

Deployed Bytecode

0x6080604052600436106100f2575f3560e01c80638a8c523c11610087578063c345c4d511610057578063c345c4d514610285578063dd62ed3e146102a4578063e17514ab146102c3578063eab15e43146102e2575f5ffd5b80638a8c523c146102175780638da5cb5b1461022b57806395d89b4114610252578063a9059cbb14610266575f5ffd5b8063313ce567116100c2578063313ce567146101935780633d8f0453146101ae57806370a08231146101cf578063715018a614610203575f5ffd5b806306fdde03146100fd578063095ea7b31461012757806318160ddd1461015657806323b872dd14610174575f5ffd5b366100f957005b5f5ffd5b348015610108575f5ffd5b506101116102f6565b60405161011e9190611613565b60405180910390f35b348015610132575f5ffd5b5061014661014136600461165c565b610386565b604051901515815260200161011e565b348015610161575f5ffd5b506002545b60405190815260200161011e565b34801561017f575f5ffd5b5061014661018e366004611686565b61039f565b34801561019e575f5ffd5b506040516012815260200161011e565b3480156101b9575f5ffd5b506101cd6101c83660046116c4565b6103c2565b005b3480156101da575f5ffd5b506101666101e9366004611703565b6001600160a01b03165f9081526020819052604090205490565b34801561020e575f5ffd5b506101cd61050b565b348015610222575f5ffd5b506101cd61051e565b348015610236575f5ffd5b506005546040516001600160a01b03909116815260200161011e565b34801561025d575f5ffd5b506101116106f6565b348015610271575f5ffd5b5061014661028036600461165c565b610705565b348015610290575f5ffd5b506101cd61029f366004611703565b610712565b3480156102af575f5ffd5b506101666102be366004611725565b61085f565b3480156102ce575f5ffd5b506101cd6102dd366004611703565b610889565b3480156102ed575f5ffd5b506101cd610b12565b6060600380546103059061175c565b80601f01602080910402602001604051908101604052809291908181526020018280546103319061175c565b801561037c5780601f106103535761010080835404028352916020019161037c565b820191905f5260205f20905b81548152906001019060200180831161035f57829003601f168201915b5050505050905090565b5f33610393818585610b31565b60019150505b92915050565b5f336103ac858285610b3e565b6103b7858585610ba1565b506001949350505050565b610424600680548060200260200160405190810160405280929190818152602001828054801561041957602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116103fb575b505050505033610bfe565b6104495760405162461bcd60e51b815260040161044090611794565b60405180910390fd5b60405163a9059cbb60e01b81526001600160a01b0382811660048301526024820184905284915f9183169063a9059cbb906044016020604051808303815f875af1158015610499573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104bd91906117be565b9050806105045760405162461bcd60e51b8152602060048201526015602482015274115490cc8c081d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610440565b5050505050565b610513610c57565b61051c5f610c84565b565b610526610c57565b60095460ff16156105705760405162461bcd60e51b81526020600482015260146024820152732a3930b234b7339030b63932b0b23c9037b832b760611b6044820152606401610440565b5f47116105bf5760405162461bcd60e51b815260206004820152601760248201527f4e656564732045544820666f72206c69717569646974790000000000000000006044820152606401610440565b6105f6307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6b033b2e3c9fd0803ce8000000610b31565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663f305d7194730610645306001600160a01b03165f9081526020819052604090205490565b5f5f6106596005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156106bf573d5f5f3e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906106e491906117dd565b50506009805460ff1916600117905550565b6060600480546103059061175c565b5f33610393818585610ba1565b610772600680548060200260200160405190810160405280929190818152602001828054801561041957602002820191905f5260205f209081546001600160a01b031681526001909101906020018083116103fb57505050505033610bfe565b61078e5760405162461bcd60e51b815260040161044090611794565b6001600160a01b0381166107e45760405162461bcd60e51b815260206004820152601e60248201527f57616c6c6574206d757374206e6f7420626520307830206164647265737300006044820152606401610440565b47806108275760405162461bcd60e51b815260206004820152601260248201527127379022aa24103a37903a3930b739b332b960711b6044820152606401610440565b6040516001600160a01b0383169082156108fc029083905f818181858888f1935050505015801561085a573d5f5f3e3d5ffd5b505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6108e9600680548060200260200160405190810160405280929190818152602001828054801561041957602002820191905f5260205f209081546001600160a01b031681526001909101906020018083116103fb57505050505033610bfe565b6109055760405162461bcd60e51b815260040161044090611794565b6001600160a01b0381161580159061092857506001600160a01b03811661dead14155b6109745760405162461bcd60e51b815260206004820181905260248201527f4e6577205461782057616c6c6574206e6f7420307830206f72203078646561646044820152606401610440565b6109d660068054806020026020016040519081016040528092919081815260200182805480156109cb57602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116109ad575b505050505082610bfe565b15610a235760405162461bcd60e51b815260206004820152601d60248201527f4e6577207461782077616c6c657420616c7265616479206578697374730000006044820152606401610440565b5f5b600654811015610ab157336001600160a01b031660068281548110610a4c57610a4c611808565b5f918252602090912001546001600160a01b031603610aa9578160068281548110610a7957610a79611808565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550610ab1565b600101610a25565b50335f818152600a6020526040808220805460ff199081169091556001600160a01b038516808452828420805490921660011790915590519092917f9b546d6a68d7369eead01c094bbbb1f9bc02a55bdb2a4da9ee3e8a41cc26e52391a350565b610b1a610c57565b6b033b2e3c9fd0803ce80000006007819055600855565b61085a8383836001610cd5565b5f610b49848461085f565b90505f198114610b9b5781811015610b8d57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610440565b610b9b84848484035f610cd5565b50505050565b6001600160a01b038316610bca57604051634b637e8f60e11b81525f6004820152602401610440565b6001600160a01b038216610bf35760405163ec442f0560e01b81525f6004820152602401610440565b61085a838383610da7565b5f805b8351811015610c4e57826001600160a01b0316848281518110610c2657610c26611808565b60200260200101516001600160a01b031603610c46576001915050610399565b600101610c01565b505f9392505050565b6005546001600160a01b0316331461051c5760405163118cdaa760e01b8152336004820152602401610440565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038416610cfe5760405163e602df0560e01b81525f6004820152602401610440565b6001600160a01b038316610d2757604051634a1406b160e11b81525f6004820152602401610440565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015610b9b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610d9991815260200190565b60405180910390a350505050565b60095460ff1680610dcf57506001600160a01b0383165f908152600a602052604090205460ff165b80610df157506001600160a01b0382165f908152600a602052604090205460ff165b80610e6957507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316836001600160a01b0316148015610e6957507f000000000000000000000000df3437a32d17d8607c8f68ca66d7e851df7bbca76001600160a01b0316826001600160a01b0316145b80610ee157507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b0316148015610ee157507f000000000000000000000000df3437a32d17d8607c8f68ca66d7e851df7bbca76001600160a01b0316836001600160a01b0316145b610f205760405162461bcd60e51b815260206004820152601060248201526f151c98591a5b99c8191a5cd8589b195960821b6044820152606401610440565b6001600160a01b0383165f908152600a602052604090205460ff1680610f5d57506001600160a01b0382165f908152600a602052604090205460ff165b158015610f6c575060095460ff165b1561118d575f7f000000000000000000000000df3437a32d17d8607c8f68ca66d7e851df7bbca76001600160a01b0316836001600160a01b03161461101e576008546001600160a01b0384165f90815260208190526040902054610fd09084611830565b111561101e5760405162461bcd60e51b815260206004820152601c60248201527f4d6178206c696d6974207065722077616c6c65742072656163686564000000006044820152606401610440565b7f000000000000000000000000df3437a32d17d8607c8f68ca66d7e851df7bbca76001600160a01b0316846001600160a01b0316036110c8576007548211156110a95760405162461bcd60e51b815260206004820152601760248201527f4d61782062757920616d6f756e742065786365656465640000000000000000006044820152606401610440565b6127106110b760c884611843565b6110c1919061185a565b905061116e565b7f000000000000000000000000df3437a32d17d8607c8f68ca66d7e851df7bbca76001600160a01b0316836001600160a01b03160361116e576007548211156111535760405162461bcd60e51b815260206004820152601860248201527f4d61782073656c6c20616d6f756e7420657863656564656400000000000000006044820152606401610440565b61271061116160c884611843565b61116b919061185a565b90505b6111788183611879565b9150801561118b5761118b843083611268565b505b305f90815260208190526040812054906111b6620186a06b033b2e3c9fd0803ce800000061185a565b82101580156111f757507f000000000000000000000000df3437a32d17d8607c8f68ca66d7e851df7bbca76001600160a01b0316856001600160a01b031614155b801561121b57506001600160a01b0385165f908152600a602052604090205460ff16155b801561122a5750600b5460ff16155b8015611238575060095460ff165b9050801561126157600b805460ff191660011790556112568261138e565b600b805460ff191690555b6105048585855b6001600160a01b038316611292578060025f8282546112879190611830565b909155506113029050565b6001600160a01b0383165f90815260208190526040902054818110156112e45760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610440565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661131e5760028054829003905561133c565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161138191815260200190565b60405180910390a3505050565b61139781611416565b4715611413576006545f906113ac904761185a565b90505f5b60065481101561085a57600681815481106113cd576113cd611808565b5f9182526020822001546040516001600160a01b039091169184156108fc02918591818181858888f1935050505015801561140a573d5f5f3e3d5ffd5b506001016113b0565b50565b60408051600280825260608201835230925f92919060208301908036833701905050905081815f8151811061144d5761144d611808565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114c9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ed91906118a0565b8160018151811061150057611500611808565b60200260200101906001600160a01b031690816001600160a01b0316815250508261154b837f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d61085f565b101561157d5761157d827f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d5f19610b31565b6040516318cbafe560e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d16906318cbafe5906115d19086905f908690889042906004016118bb565b5f604051808303815f875af11580156115ec573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b9b919081019061192b565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b0381168114611413575f5ffd5b5f5f6040838503121561166d575f5ffd5b823561167881611648565b946020939093013593505050565b5f5f5f60608486031215611698575f5ffd5b83356116a381611648565b925060208401356116b381611648565b929592945050506040919091013590565b5f5f5f606084860312156116d6575f5ffd5b83356116e181611648565b92506020840135915060408401356116f881611648565b809150509250925092565b5f60208284031215611713575f5ffd5b813561171e81611648565b9392505050565b5f5f60408385031215611736575f5ffd5b823561174181611648565b9150602083013561175181611648565b809150509250929050565b600181811c9082168061177057607f821691505b60208210810361178e57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526010908201526f139bdd08184815185e0815d85b1b195d60821b604082015260600190565b5f602082840312156117ce575f5ffd5b8151801515811461171e575f5ffd5b5f5f5f606084860312156117ef575f5ffd5b5050815160208301516040909301519094929350919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156103995761039961181c565b80820281158282048414176103995761039961181c565b5f8261187457634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156103995761039961181c565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156118b0575f5ffd5b815161171e81611648565b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b8181101561190b5783516001600160a01b03168352602093840193909201916001016118e4565b50506001600160a01b039590951660608401525050608001529392505050565b5f6020828403121561193b575f5ffd5b815167ffffffffffffffff811115611951575f5ffd5b8201601f81018413611961575f5ffd5b805167ffffffffffffffff81111561197b5761197b61188c565b8060051b604051601f19603f830116810181811067ffffffffffffffff821117156119a8576119a861188c565b6040529182526020818401810192908101878411156119c5575f5ffd5b6020850194505b838510156119e8578451808252602095860195909350016119cc565b50969550505050505056fea2646970667358221220ca6756b5f93156916c0fb0207049dbe7682748b53eecda97c3aba3ec88a8549364736f6c634300081b0033

Deployed Bytecode Sourcemap

21662:9976:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11066:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13400:222;;;;;;;;;;-1:-1:-1;13400:222:0;;;;;:::i;:::-;;:::i;:::-;;;1110:14:1;;1103:22;1085:41;;1073:2;1058:18;13400:222:0;945:187:1;12168:99:0;;;;;;;;;;-1:-1:-1;12247:12:0;;12168:99;;;1283:25:1;;;1271:2;1256:18;12168:99:0;1137:177:1;14200:283:0;;;;;;;;;;-1:-1:-1;14200:283:0;;;;;:::i;:::-;;:::i;12019:84::-;;;;;;;;;;-1:-1:-1;12019:84:0;;12093:2;1974:36:1;;1962:2;1947:18;12019:84:0;1832:184:1;25208:291:0;;;;;;;;;;-1:-1:-1;25208:291:0;;;;;:::i;:::-;;:::i;:::-;;12330:118;;;;;;;;;;-1:-1:-1;12330:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;12422:18:0;12395:7;12422:18;;;;;;;;;;;;12330:118;5524:103;;;;;;;;;;;;;:::i;26084:515::-;;;;;;;;;;;;;:::i;4849:87::-;;;;;;;;;;-1:-1:-1;4922:6:0;;4849:87;;-1:-1:-1;;;;;4922:6:0;;;2932:51:1;;2920:2;2905:18;4849:87:0;2786:203:1;11276:95:0;;;;;;;;;;;;;:::i;12653:182::-;;;;;;;;;;-1:-1:-1;12653:182:0;;;;;:::i;:::-;;:::i;25729:296::-;;;;;;;;;;-1:-1:-1;25729:296:0;;;;;:::i;:::-;;:::i;12898:183::-;;;;;;;;;;-1:-1:-1;12898:183:0;;;;;:::i;:::-;;:::i;26744:720::-;;;;;;;;;;-1:-1:-1;26744:720:0;;;;;:::i;:::-;;:::i;27539:134::-;;;;;;;;;;;;;:::i;11066:91::-;11111:13;11144:5;11137:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11066:91;:::o;13400:222::-;13500:4;3198:10;13561:31;3198:10;13577:7;13586:5;13561:8;:31::i;:::-;13610:4;13603:11;;;13400:222;;;;;:::o;14200:283::-;14321:4;3198:10;14379:37;14395:4;3198:10;14410:5;14379:15;:37::i;:::-;14427:26;14437:4;14443:2;14447:5;14427:9;:26::i;:::-;-1:-1:-1;14471:4:0;;14200:283;-1:-1:-1;;;;14200:283:0:o;25208:291::-;23097:37;23111:10;23097:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23097:37:0;;;;;;;;;;;;;;;;;;;;;23123:10;23097:13;:37::i;:::-;23075:103;;;;-1:-1:-1;;;23075:103:0;;;;;;;:::i;:::-;;;;;;;;;25405:34:::1;::::0;-1:-1:-1;;;25405:34:0;;-1:-1:-1;;;;;4309:32:1;;;25405:34:0::1;::::0;::::1;4291:51:1::0;4358:18;;;4351:34;;;25373:5:0;;25348:16:::1;::::0;25405:19;::::1;::::0;::::1;::::0;4264:18:1;;25405:34:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25390:49;;25458:7;25450:41;;;::::0;-1:-1:-1;;;25450:41:0;;4880:2:1;25450:41:0::1;::::0;::::1;4862:21:1::0;4919:2;4899:18;;;4892:30;-1:-1:-1;;;4938:18:1;;;4931:51;4999:18;;25450:41:0::1;4678:345:1::0;25450:41:0::1;25337:162;;25208:291:::0;;;:::o;5524:103::-;4735:13;:11;:13::i;:::-;5589:30:::1;5616:1;5589:18;:30::i;:::-;5524:103::o:0;26084:515::-;4735:13;:11;:13::i;:::-;26148:7:::1;::::0;::::1;;26147:8;26139:41;;;::::0;-1:-1:-1;;;26139:41:0;;5230:2:1;26139:41:0::1;::::0;::::1;5212:21:1::0;5269:2;5249:18;;;5242:30;-1:-1:-1;;;5288:18:1;;;5281:50;5348:18;;26139:41:0::1;5028:344:1::0;26139:41:0::1;26225:1;26201:21;:25;26193:61;;;::::0;-1:-1:-1;;;26193:61:0;;5579:2:1;26193:61:0::1;::::0;::::1;5561:21:1::0;5618:2;5598:18;;;5591:30;5657:25;5637:18;;;5630:53;5700:18;;26193:61:0::1;5377:347:1::0;26193:61:0::1;26267;26284:4;26299:15;21990:20;26267:8;:61::i;:::-;26341:15;-1:-1:-1::0;;;;;26341:31:0::1;;26380:21;26425:4;26445:24;26463:4;-1:-1:-1::0;;;;;12422:18:0;12395:7;12422:18;;;;;;;;;;;;12330:118;26445:24:::1;26484:1;26500;26516:7;4922:6:::0;;-1:-1:-1;;;;;4922:6:0;;4849:87;26516:7:::1;26341:223;::::0;::::1;::::0;;;-1:-1:-1;;;;;;26341:223:0;;;-1:-1:-1;;;;;6050:32:1;;;26341:223:0::1;::::0;::::1;6032:51:1::0;6099:18;;;6092:34;;;;6142:18;;;6135:34;;;;6185:18;;;6178:34;6249:32;;;6228:19;;;6221:61;26538:15:0::1;6298:19:1::0;;;6291:35;6004:19;;26341:223:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;26577:7:0::1;:14:::0;;-1:-1:-1;;26577:14:0::1;26587:4;26577:14;::::0;;-1:-1:-1;26084:515:0:o;11276:95::-;11323:13;11356:7;11349:14;;;;;:::i;12653:182::-;12722:4;3198:10;12778:27;3198:10;12795:2;12799:5;12778:9;:27::i;25729:296::-;23097:37;23111:10;23097:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23097:37:0;;;;;;;;;;;;;;;;;;;;23123:10;23097:13;:37::i;:::-;23075:103;;;;-1:-1:-1;;;23075:103:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25811:20:0;::::1;25803:63;;;::::0;-1:-1:-1;;;25803:63:0;;7000:2:1;25803:63:0::1;::::0;::::1;6982:21:1::0;7039:2;7019:18;;;7012:30;7078:32;7058:18;;;7051:60;7128:18;;25803:63:0::1;6798:354:1::0;25803:63:0::1;25897:21;25937:11:::0;25929:42:::1;;;::::0;-1:-1:-1;;;25929:42:0;;7359:2:1;25929:42:0::1;::::0;::::1;7341:21:1::0;7398:2;7378:18;;;7371:30;-1:-1:-1;;;7417:18:1;;;7410:48;7475:18;;25929:42:0::1;7157:342:1::0;25929:42:0::1;25984:33;::::0;-1:-1:-1;;;;;25984:24:0;::::1;::::0;:33;::::1;;;::::0;26009:7;;25984:33:::1;::::0;;;26009:7;25984:24;:33;::::1;;;;;;;;;;;;;;;;;;;;25792:233;25729:296:::0;:::o;12898:183::-;-1:-1:-1;;;;;13046:18:0;;;13014:7;13046:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;12898:183::o;26744:720::-;23097:37;23111:10;23097:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23097:37:0;;;;;;;;;;;;;;;;;;;;23123:10;23097:13;:37::i;:::-;23075:103;;;;-1:-1:-1;;;23075:103:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26850:28:0;::::1;::::0;;::::1;::::0;:63:::1;;-1:-1:-1::0;;;;;;26882:31:0;::::1;26906:6;26882:31;;26850:63;26828:145;;;::::0;-1:-1:-1;;;26828:145:0;;7706:2:1;26828:145:0::1;::::0;::::1;7688:21:1::0;;;7725:18;;;7718:30;7784:34;7764:18;;;7757:62;7836:18;;26828:145:0::1;7504:356:1::0;26828:145:0::1;27007:39;27021:10;27007:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;27007:39:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;27033:12;27007:13;:39::i;:::-;27006:40;26984:119;;;::::0;-1:-1:-1;;;26984:119:0;;8067:2:1;26984:119:0::1;::::0;::::1;8049:21:1::0;8106:2;8086:18;;;8079:30;8145:31;8125:18;;;8118:59;8194:18;;26984:119:0::1;7865:353:1::0;26984:119:0::1;27121:9;27116:194;27140:10;:17:::0;27136:21;::::1;27116:194;;;27200:10;-1:-1:-1::0;;;;;27183:27:0::1;:10;27194:1;27183:13;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;27183:13:0::1;:27:::0;27179:120:::1;;27247:12;27231:10;27242:1;27231:13;;;;;;;;:::i;:::-;;;;;;;;;:28;;;;;-1:-1:-1::0;;;;;27231:28:0::1;;;;;-1:-1:-1::0;;;;;27231:28:0::1;;;;;;27278:5;;27179:120;27159:3;;27116:194;;;-1:-1:-1::0;27333:10:0::1;27347:5;27322:22:::0;;;:10:::1;:22;::::0;;;;;:30;;-1:-1:-1;;27322:30:0;;::::1;::::0;;;-1:-1:-1;;;;;27363:24:0;::::1;::::0;;;;;;:31;;;;::::1;27322:30:::0;27363:31:::1;::::0;;;27410:46;;27363:24;;27333:10;27410:46:::1;::::0;::::1;26744:720:::0;:::o;27539:134::-;4735:13;:11;:13::i;:::-;21990:20:::1;27599:14;:27:::0;;;27637:15:::1;:28:::0;27539:134::o;18362:164::-;18481:37;18490:5;18497:7;18506:5;18513:4;18481:8;:37::i;20155:603::-;20289:24;20316:25;20326:5;20333:7;20316:9;:25::i;:::-;20289:52;;-1:-1:-1;;20356:16:0;:37;20352:399;;20433:5;20414:16;:24;20410:214;;;20466:142;;-1:-1:-1;;;20466:142:0;;-1:-1:-1;;;;;8575:32:1;;20466:142:0;;;8557:51:1;8624:18;;;8617:34;;;8667:18;;;8660:34;;;8530:18;;20466:142:0;8355:345:1;20410:214:0;20667:57;20676:5;20683:7;20711:5;20692:16;:24;20718:5;20667:8;:57::i;:::-;20278:480;20155:603;;;:::o;14869:342::-;-1:-1:-1;;;;;14987:18:0;;14983:88;;15029:30;;-1:-1:-1;;;15029:30:0;;15056:1;15029:30;;;2932:51:1;2905:18;;15029:30:0;2786:203:1;14983:88:0;-1:-1:-1;;;;;15085:16:0;;15081:88;;15125:32;;-1:-1:-1;;;15125:32:0;;15154:1;15125:32;;;2932:51:1;2905:18;;15125:32:0;2786:203:1;15081:88:0;15179:24;15187:4;15193:2;15197:5;15179:7;:24::i;23206:320::-;23325:4;;23347:149;23371:9;:16;23367:1;:20;23347:149;;;23429:8;-1:-1:-1;;;;;23413:24:0;:9;23423:1;23413:12;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;23413:24:0;;23409:76;;23465:4;23458:11;;;;;23409:76;23389:3;;23347:149;;;-1:-1:-1;23513:5:0;;23206:320;-1:-1:-1;;;23206:320:0:o;5014:166::-;4922:6;;-1:-1:-1;;;;;4922:6:0;3198:10;5074:23;5070:103;;5121:40;;-1:-1:-1;;;5121:40:0;;3198:10;5121:40;;;2932:51:1;2905:18;;5121:40:0;2786:203:1;5787:191:0;5880:6;;;-1:-1:-1;;;;;5897:17:0;;;-1:-1:-1;;;;;;5897:17:0;;;;;;;5930:40;;5880:6;;;5897:17;5880:6;;5930:40;;5861:16;;5930:40;5850:128;5787:191;:::o;19377:486::-;-1:-1:-1;;;;;19533:19:0;;19529:91;;19576:32;;-1:-1:-1;;;19576:32:0;;19605:1;19576:32;;;2932:51:1;2905:18;;19576:32:0;2786:203:1;19529:91:0;-1:-1:-1;;;;;19634:21:0;;19630:92;;19679:31;;-1:-1:-1;;;19679:31:0;;19707:1;19679:31;;;2932:51:1;2905:18;;19679:31:0;2786:203:1;19630:92:0;-1:-1:-1;;;;;19732:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;:35;;;19778:78;;;;19829:7;-1:-1:-1;;;;;19813:31:0;19822:5;-1:-1:-1;;;;;19813:31:0;;19838:5;19813:31;;;;1283:25:1;;1271:2;1256:18;;1137:177;19813:31:0;;;;;;;;19377:486;;;;:::o;27824:1894::-;27968:7;;;;;:44;;-1:-1:-1;;;;;;27996:16:0;;;;;;:10;:16;;;;;;;;27968:44;:79;;;-1:-1:-1;;;;;;28033:14:0;;;;;;:10;:14;;;;;;;;27968:79;:155;;;;28085:15;-1:-1:-1;;;;;28069:32:0;:4;-1:-1:-1;;;;;28069:32:0;;:53;;;;;28111:11;-1:-1:-1;;;;;28105:17:0;:2;-1:-1:-1;;;;;28105:17:0;;28069:53;27968:231;;;;28159:15;-1:-1:-1;;;;;28145:30:0;:2;-1:-1:-1;;;;;28145:30:0;;:53;;;;;28187:11;-1:-1:-1;;;;;28179:19:0;:4;-1:-1:-1;;;;;28179:19:0;;28145:53;27946:297;;;;-1:-1:-1;;;27946:297:0;;8907:2:1;27946:297:0;;;8889:21:1;8946:2;8926:18;;;8919:30;-1:-1:-1;;;8965:18:1;;;8958:46;9021:18;;27946:297:0;8705:340:1;27946:297:0;-1:-1:-1;;;;;28262:16:0;;;;;;:10;:16;;;;;;;;;:34;;-1:-1:-1;;;;;;28282:14:0;;;;;;:10;:14;;;;;;;;28262:34;28260:37;:48;;;;-1:-1:-1;28301:7:0;;;;28260:48;28256:960;;;28325:11;28361;-1:-1:-1;;;;;28355:17:0;:2;-1:-1:-1;;;;;28355:17:0;;28351:201;;28449:15;;-1:-1:-1;;;;;12422:18:0;;12395:7;12422:18;;;;;;;;;;;28423:22;;:6;:22;:::i;:::-;:41;;28393:143;;;;-1:-1:-1;;;28393:143:0;;9514:2:1;28393:143:0;;;9496:21:1;9553:2;9533:18;;;9526:30;9592;9572:18;;;9565:58;9640:18;;28393:143:0;9312:352:1;28393:143:0;28578:11;-1:-1:-1;;;;;28570:19:0;:4;-1:-1:-1;;;;;28570:19:0;;28566:498;;28650:14;;28640:6;:24;;28610:121;;;;-1:-1:-1;;;28610:121:0;;9871:2:1;28610:121:0;;;9853:21:1;9910:2;9890:18;;;9883:30;9949:25;9929:18;;;9922:53;9992:18;;28610:121:0;9669:347:1;28610:121:0;22086:6;28757:20;22155:3;28757:6;:20;:::i;:::-;28756:40;;;;:::i;:::-;28750:46;;28566:498;;;28828:11;-1:-1:-1;;;;;28822:17:0;:2;-1:-1:-1;;;;;28822:17:0;;28818:246;;28900:14;;28890:6;:24;;28860:122;;;;-1:-1:-1;;;28860:122:0;;10618:2:1;28860:122:0;;;10600:21:1;10657:2;10637:18;;;10630:30;10696:26;10676:18;;;10669:54;10740:18;;28860:122:0;10416:348:1;28860:122:0;22086:6;29008:21;22206:3;29008:6;:21;:::i;:::-;29007:41;;;;:::i;:::-;29001:47;;28818:246;29089:12;29098:3;29089:6;:12;:::i;:::-;29080:21;-1:-1:-1;29122:7:0;;29118:87;;29150:39;29164:4;29178;29185:3;29150:13;:39::i;:::-;28310:906;28256:960;29272:4;29228:23;12422:18;;;;;;;;;;;;22327:20;22340:7;21990:20;22327;:::i;:::-;29362:15;:37;;:73;;;;;29424:11;-1:-1:-1;;;;;29416:19:0;:4;-1:-1:-1;;;;;29416:19:0;;;29362:73;:107;;;;-1:-1:-1;;;;;;29453:16:0;;;;;;:10;:16;;;;;;;;29452:17;29362:107;:133;;;;-1:-1:-1;29487:8:0;;;;29486:9;29362:133;:157;;;;-1:-1:-1;29512:7:0;;;;29362:157;29347:172;;29536:7;29532:135;;;29560:8;:15;;-1:-1:-1;;29560:15:0;29571:4;29560:15;;;29590:34;29608:15;29590:17;:34::i;:::-;29639:8;:16;;-1:-1:-1;;29639:16:0;;;29532:135;29679:31;29693:4;29699:2;29703:6;15535:1169;-1:-1:-1;;;;;15659:18:0;;15655:552;;15813:5;15797:12;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;15655:552:0;;-1:-1:-1;15655:552:0;;-1:-1:-1;;;;;15873:15:0;;15851:19;15873:15;;;;;;;;;;;15907:19;;;15903:117;;;15954:50;;-1:-1:-1;;;15954:50:0;;-1:-1:-1;;;;;8575:32:1;;15954:50:0;;;8557:51:1;8624:18;;;8617:34;;;8667:18;;;8660:34;;;8530:18;;15954:50:0;8355:345:1;15903:117:0;-1:-1:-1;;;;;16143:15:0;;:9;:15;;;;;;;;;;16161:19;;;;16143:37;;15655:552;-1:-1:-1;;;;;16223:16:0;;16219:435;;16389:12;:21;;;;;;;16219:435;;;-1:-1:-1;;;;;16605:13:0;;:9;:13;;;;;;;;;;:22;;;;;;16219:435;16686:2;-1:-1:-1;;;;;16671:25:0;16680:4;-1:-1:-1;;;;;16671:25:0;;16690:5;16671:25;;;;1283::1;;1271:2;1256:18;;1137:177;16671:25:0;;;;;;;;15535:1169;;;:::o;30020:364::-;30082:18;30093:6;30082:10;:18::i;:::-;30115:21;:25;30111:266;;30205:10;:17;30157:21;;30181:41;;:21;:41;:::i;:::-;30157:65;-1:-1:-1;30242:9:0;30237:129;30261:10;:17;30257:21;;30237:129;;;30312:10;30323:1;30312:13;;;;;;;;:::i;:::-;;;;;;;;;;30304:46;;-1:-1:-1;;;;;30312:13:0;;;;30304:46;;;;;30336:13;;30304:46;30312:13;30304:46;30336:13;30312;30304:46;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30280:3:0;;30237:129;;30111:266;30020:364;:::o;30893:742::-;31087:16;;;31101:1;31087:16;;;;;;;;31044:4;;31010:23;;31087:16;31101:1;31087:16;;;;;;;;;;-1:-1:-1;31087:16:0;31063:40;;31124:15;31114:4;31119:1;31114:7;;;;;;;;:::i;:::-;;;;;;:25;-1:-1:-1;;;;;31114:25:0;;;-1:-1:-1;;;;;31114:25:0;;;;;31160:15;-1:-1:-1;;;;;31160:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31150:4;31155:1;31150:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;31150:32:0;;;-1:-1:-1;;;;;31150:32:0;;;;;31254:6;31199:52;31209:15;31234;31199:9;:52::i;:::-;:61;31195:230;;;31277:136;31304:15;31346;-1:-1:-1;;31277:8:0;:136::i;:::-;31463:164;;-1:-1:-1;;;31463:164:0;;-1:-1:-1;;;;;31463:15:0;:37;;;;:164;;31515:6;;31536:1;;31552:4;;31571:15;;31601;;31463:164;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31463:164:0;;;;;;;;;;;;:::i;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;1319:508::-;1396:6;1404;1412;1465:2;1453:9;1444:7;1440:23;1436:32;1433:52;;;1481:1;1478;1471:12;1433:52;1520:9;1507:23;1539:31;1564:5;1539:31;:::i;:::-;1589:5;-1:-1:-1;1646:2:1;1631:18;;1618:32;1659:33;1618:32;1659:33;:::i;:::-;1319:508;;1711:7;;-1:-1:-1;;;1791:2:1;1776:18;;;;1763:32;;1319:508::o;2021:::-;2098:6;2106;2114;2167:2;2155:9;2146:7;2142:23;2138:32;2135:52;;;2183:1;2180;2173:12;2135:52;2222:9;2209:23;2241:31;2266:5;2241:31;:::i;:::-;2291:5;-1:-1:-1;2369:2:1;2354:18;;2341:32;;-1:-1:-1;2451:2:1;2436:18;;2423:32;2464:33;2423:32;2464:33;:::i;:::-;2516:7;2506:17;;;2021:508;;;;;:::o;2534:247::-;2593:6;2646:2;2634:9;2625:7;2621:23;2617:32;2614:52;;;2662:1;2659;2652:12;2614:52;2701:9;2688:23;2720:31;2745:5;2720:31;:::i;:::-;2770:5;2534:247;-1:-1:-1;;;2534:247:1:o;2994:388::-;3062:6;3070;3123:2;3111:9;3102:7;3098:23;3094:32;3091:52;;;3139:1;3136;3129:12;3091:52;3178:9;3165:23;3197:31;3222:5;3197:31;:::i;:::-;3247:5;-1:-1:-1;3304:2:1;3289:18;;3276:32;3317:33;3276:32;3317:33;:::i;:::-;3369:7;3359:17;;;2994:388;;;;;:::o;3387:380::-;3466:1;3462:12;;;;3509;;;3530:61;;3584:4;3576:6;3572:17;3562:27;;3530:61;3637:2;3629:6;3626:14;3606:18;3603:38;3600:161;;3683:10;3678:3;3674:20;3671:1;3664:31;3718:4;3715:1;3708:15;3746:4;3743:1;3736:15;3600:161;;3387:380;;;:::o;3772:340::-;3974:2;3956:21;;;4013:2;3993:18;;;3986:30;-1:-1:-1;;;4047:2:1;4032:18;;4025:46;4103:2;4088:18;;3772:340::o;4396:277::-;4463:6;4516:2;4504:9;4495:7;4491:23;4487:32;4484:52;;;4532:1;4529;4522:12;4484:52;4564:9;4558:16;4617:5;4610:13;4603:21;4596:5;4593:32;4583:60;;4639:1;4636;4629:12;6337:456;6425:6;6433;6441;6494:2;6482:9;6473:7;6469:23;6465:32;6462:52;;;6510:1;6507;6500:12;6462:52;-1:-1:-1;;6555:16:1;;6661:2;6646:18;;6640:25;6757:2;6742:18;;;6736:25;6555:16;;6640:25;;-1:-1:-1;6736:25:1;6337:456;-1:-1:-1;6337:456:1:o;8223:127::-;8284:10;8279:3;8275:20;8272:1;8265:31;8315:4;8312:1;8305:15;8339:4;8336:1;8329:15;9050:127;9111:10;9106:3;9102:20;9099:1;9092:31;9142:4;9139:1;9132:15;9166:4;9163:1;9156:15;9182:125;9247:9;;;9268:10;;;9265:36;;;9281:18;;:::i;10021:168::-;10094:9;;;10125;;10142:15;;;10136:22;;10122:37;10112:71;;10163:18;;:::i;10194:217::-;10234:1;10260;10250:132;;10304:10;10299:3;10295:20;10292:1;10285:31;10339:4;10336:1;10329:15;10367:4;10364:1;10357:15;10250:132;-1:-1:-1;10396:9:1;;10194:217::o;10769:128::-;10836:9;;;10857:11;;;10854:37;;;10871:18;;:::i;10902:127::-;10963:10;10958:3;10954:20;10951:1;10944:31;10994:4;10991:1;10984:15;11018:4;11015:1;11008:15;11034:251;11104:6;11157:2;11145:9;11136:7;11132:23;11128:32;11125:52;;;11173:1;11170;11163:12;11125:52;11205:9;11199:16;11224:31;11249:5;11224:31;:::i;11290:959::-;11552:4;11600:3;11589:9;11585:19;11631:6;11620:9;11613:25;11674:6;11669:2;11658:9;11654:18;11647:34;11717:3;11712:2;11701:9;11697:18;11690:31;11741:6;11776;11770:13;11807:6;11799;11792:22;11845:3;11834:9;11830:19;11823:26;;11884:2;11876:6;11872:15;11858:29;;11905:1;11915:195;11929:6;11926:1;11923:13;11915:195;;;11994:13;;-1:-1:-1;;;;;11990:39:1;11978:52;;12059:2;12085:15;;;;12050:12;;;;12026:1;11944:9;11915:195;;;-1:-1:-1;;;;;;;12166:32:1;;;;12161:2;12146:18;;12139:60;-1:-1:-1;;12230:3:1;12215:19;12208:35;12127:3;11290:959;-1:-1:-1;;;11290:959:1:o;12254:1165::-;12349:6;12402:2;12390:9;12381:7;12377:23;12373:32;12370:52;;;12418:1;12415;12408:12;12370:52;12451:9;12445:16;12484:18;12476:6;12473:30;12470:50;;;12516:1;12513;12506:12;12470:50;12539:22;;12592:4;12584:13;;12580:27;-1:-1:-1;12570:55:1;;12621:1;12618;12611:12;12570:55;12654:2;12648:9;12680:18;12672:6;12669:30;12666:56;;;12702:18;;:::i;:::-;12748:6;12745:1;12741:14;12784:2;12778:9;12847:2;12843:7;12838:2;12834;12830:11;12826:25;12818:6;12814:38;12918:6;12906:10;12903:22;12882:18;12870:10;12867:34;12864:62;12861:88;;;12929:18;;:::i;:::-;12965:2;12958:22;13015;;;13065:2;13095:11;;;13091:20;;;13015:22;13053:15;;13123:19;;;13120:39;;;13155:1;13152;13145:12;13120:39;13187:2;13183;13179:11;13168:22;;13199:189;13215:6;13210:3;13207:15;13199:189;;;13305:10;;13328:18;;;13375:2;13232:12;;;;13305:10;;-1:-1:-1;13366:12:1;13199:189;;;-1:-1:-1;13407:6:1;12254:1165;-1:-1:-1;;;;;;12254:1165:1:o

Swarm Source

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