ETH Price: $3,347.82 (-3.47%)
Gas: 4 Gwei

Token

TPUAi (TPUAi)
 

Overview

Max Total Supply

100,000,000 TPUAi

Holders

64

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
474,958.107465047675194783 TPUAi

Value
$0.00
0x4bd70099eda446e5ebb7cec596d79c3cf7ec003a
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:
TPUAi

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

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

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

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

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

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

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. 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 {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        _transferOwnership(newOwner);
    }

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

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

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

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

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

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

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

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 *
 * 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.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the 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 override returns (uint8) {
        return 18;
    }

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(
            fromBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

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

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

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

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

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

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

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

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

/// Uniswap factory interface
interface IFactory {
    function createPair(
        address tokenA,
        address tokenB
    ) external returns (address pair);
}

/// Uniswap Router interface
interface IUniswapRouter {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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

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

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

/// @title TPUAi: ERC20 token with 5/5 tax
contract TPUAi is ERC20, Ownable {
    /// @notice MAX SUPPLY 100 million tokens
    uint256 private constant MAX_SUPPLY = 100_000_000 * 1e18;
    /// @notice max buy/sell per tx
    uint256 maxAmountPerTx = (MAX_SUPPLY * 12) / 1000; // 1.2% of the supply
    /// @notice max  wallet amount
    uint256 maxWalletAmount = (MAX_SUPPLY * 3) / 100; // 3% of the supply
    /// @notice marketing wallet address
    address public marketingWallet = address(0x52Cb9E9D202D439EA1545decA2bB962A5DbC3a9b);
    /// @notice development wallet address
    address public developmentWallet = address(0x991F58014E46320659671b4A75a686Bda97f16cb);
    /// @notice lp receiver wallet
    address public lpReceiverWallet = msg.sender;
    /// @notice uniswapV2Router
    IUniswapRouter public immutable uniswapV2Router;
    /// @notice uniswapPair
    address public immutable uniswapPair;
    /// fees struct
    struct BuyFee {
        uint256 marketing;
        uint256 development;
        uint256 autoLP;
    }
    struct SellFee {
        uint256 marketing;
        uint256 development;
        uint256 autoLP;
    }

    /// @notice buyFee
    BuyFee public buyFee;
    /// @notice sellFee
    SellFee public sellFee;
    /// @notice total buy fee
    uint256 public totalBuyFee;
    /// @notice total sell fee
    uint256 public totalSellFee;
    /// @notice swapping status
    bool swapping = false;
    /// @notice high tax mode status
    bool initialHighTaxMode = true;
    /// @notice first buy time
    uint256 firstTrade;
    /// @notice manage exclude / incclude from fees
    mapping(address => bool) isExcludedFromFees;

    ///  errors
    error OnlyMarketingWallet();
    error MaxBuyPerTxExceeds();
    error MaxSellPerTxExceeds();
    error MinOnePercent();
    error EthClaimFailed();
    error ZeroAddress();

    constructor() ERC20("TPUAi", "TPUAi") {
        uniswapV2Router = IUniswapRouter(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        uniswapPair = IFactory(uniswapV2Router.factory()).createPair(
            address(this),
            uniswapV2Router.WETH()
        );

        buyFee.marketing = 3;
        buyFee.development = 1;
        buyFee.autoLP = 1;
        totalBuyFee = 5;

        sellFee.marketing = 3;
        sellFee.development = 1;
        sellFee.autoLP = 1;
        totalSellFee = 5;

        isExcludedFromFees[owner()] = true;
        isExcludedFromFees[address(this)] = true;
        isExcludedFromFees[marketingWallet] = true;
        isExcludedFromFees[developmentWallet] = true;
        _mint(msg.sender, MAX_SUPPLY);
    }

    receive() external payable {}

    /// @dev claim any erc20 token, accidently sent to token contract
    /// @param token: token to rescue
    /// @param amount: amount to rescue
    /// Requirements -
    /// only marketing wallet can rescue stucked tokens
    function claimStuckedERC20(address token, uint256 amount) external {
        if (msg.sender != marketingWallet) {
            revert OnlyMarketingWallet();
        }
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0xa9059cbb, marketingWallet, amount)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "BARC: TOKEN_CLAIM_FAILED"
        );
    }

    /// @dev claim stucked eth
    function claimStuckedEth(address wallet) external {
        if (msg.sender != marketingWallet) {
            revert OnlyMarketingWallet();
        }
        (bool sent, ) = wallet.call{value: address(this).balance}("");
        if (!sent) {
            revert EthClaimFailed();
        }
    }

    /// @dev exclude or include a address from / to fees
    /// @param user: user address to exclude or include
    /// @param excluded: true to exclude, false to include
    function exlcudeFromFees(address user, bool excluded) external onlyOwner {
        isExcludedFromFees[user] = excluded;
    }

    /// @dev update max buy/ sell  amount per tx globally
    /// @param _percent: pecent of total supply
    /// Requirements -
    /// must be 1 or more
    function updateMaxTxAmount(uint256 _percent) external onlyOwner {
        if (_percent < 1) {
            revert MinOnePercent();
        }
        maxAmountPerTx = (totalSupply() * _percent) / 100;
    }

    /// @dev update max wallet amount
    ///  /// @param _percent: pecent of total supply
    /// Requirements -
    /// must be 1 or more
    function updateMaxWalletAmount(uint256 _percent) external onlyOwner {
        if (_percent < 1) {
            revert MinOnePercent();
        }
        maxWalletAmount = (totalSupply() * _percent) / 100;
    }

    /// @dev restore normal tax globally
    function restoreDefaultTax() external {
        require(msg.sender == owner() || msg.sender == marketingWallet);
        initialHighTaxMode = false;
    }

    /// @dev update buy tax globally
    /// @param _marketing: new  marketing tax on buy
    /// @param _dev: new wei wu tax on buy
    /// @param _lp: new lp tax on buy
    function updateBuyTax(
        uint256 _marketing,
        uint256 _dev,
        uint256 _lp
    ) external onlyOwner {
        if (_marketing + _dev + _lp <= 10) {
            buyFee.marketing = _marketing;
            buyFee.development = _dev;
            buyFee.autoLP = _lp;
            totalBuyFee = _marketing + _lp + _dev;
        }
    }

    /// @dev update sell tax globally
    /// @param _marketing: new  marketing tax on sell
    /// @param _dev: new wei wu tax on sell
    /// @param _lp: new lp tax on sell
    function updateSellTax(
        uint256 _marketing,
        uint256 _dev,
        uint256 _lp
    ) external onlyOwner {
        if (_marketing + _dev + _lp <= 10) {
            sellFee.marketing = _marketing;
            sellFee.development = _dev;
            sellFee.autoLP = _lp;
            totalSellFee = _marketing + _lp + _dev;
        }
    }

    /// @dev update fee wallets globally
    /// @param _mkt: new marketing wallet
    /// @param _dev: new development wallet
    /// @param _lpReceiver: new lp receiver wallet
    function updateWallets(
        address _mkt,
        address _dev,
        address _lpReceiver
    ) external onlyOwner {
        if (_mkt == address(0) || _dev == address(0)) {
            revert ZeroAddress();
        }
        marketingWallet = _mkt;
        developmentWallet = _dev;
        lpReceiverWallet = _lpReceiver;
    }

    /// @notice manage token transfer and fees
    ///         high fees is applicable for first 30 minutes from first buy
    ///         after 30 minutes / if owner reset fees, will restore to 5/5
    /// @dev See {ERC20-_transfer}
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        bool takeFee = true;
        if (isExcludedFromFees[from] || isExcludedFromFees[to]) {
            takeFee = false;
        }

        if (takeFee) {
            uint256 fee;
            if (from == uniswapPair) {
                if (amount > maxAmountPerTx) {
                    revert MaxBuyPerTxExceeds();
                }
                if (firstTrade == 0) {
                    firstTrade = block.timestamp;
                }

                if (totalBuyFee > 0) {
                    fee = (amount * totalBuyFee) / 100;
                    if (
                        initialHighTaxMode &&
                        block.timestamp - firstTrade < 30 minutes
                    ) {
                        fee = fee * 4;
                    }
                }
            } else if (to == uniswapPair) {
                if (amount > maxAmountPerTx) {
                    revert MaxSellPerTxExceeds();
                }

                if (totalSellFee > 0) {
                    fee = (amount * totalSellFee) / 100;
                    if (
                        initialHighTaxMode &&
                        block.timestamp - firstTrade < 30 minutes
                    ) {
                        fee = fee * 4;
                    }
                }
            }

            amount = amount - fee;

            if (fee > 0) {
                super._transfer(from, address(this), fee);
            }
        }
        uint256 contractBalance = balanceOf(address(this));

        bool canSwap = contractBalance >= 100e18 &&
            from != uniswapPair &&
            (!isExcludedFromFees[from]) &&
            !swapping;
        if (canSwap) {
            swapping = true;
            swapAndLiquify(contractBalance);
            swapping = false;
        }

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

    /// @notice swap and liquify
    /// transfer collected tax to designated addresses as per there share
    function swapAndLiquify(uint256 tokens) private {
        uint256 total = totalBuyFee + totalSellFee;
        uint256 lpHalf = ((buyFee.autoLP + sellFee.autoLP) * tokens) /
            (total * 2);
        uint256 tokensForSwap = (tokens - lpHalf);
        uint256 marketingTokens = (tokens *
            (buyFee.marketing + sellFee.marketing)) / total;
        swapTokensForETH(tokensForSwap);
        uint256 ethBalance = address(this).balance;
        uint256 lpEth = (ethBalance * lpHalf) / tokensForSwap;
        uint256 marketingEth = (ethBalance * marketingTokens) / tokensForSwap;
        if (lpEth > 0 && lpHalf > 0) {
            addLiquidity(lpEth, lpHalf);
        }
        if (marketingEth > 0) {
            bool sent;
            (sent, ) = marketingWallet.call{value: address(this).balance}("");
        }
        if (address(this).balance > 0) {
            bool sent;
            (sent, ) = developmentWallet.call{value: address(this).balance}("");
        }
    }

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

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

        uint256 out = uniswapV2Router.getAmountsOut(tokenAmount, path)[1];
        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            (out * 80) / 100, //20% Slippage
            path,
            address(this),
            block.timestamp + 360
        );
    }

    /// add liquidity
    function addLiquidity(uint256 ethAmount, uint256 tokens) private {
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokens,
            0,
            0,
            lpReceiverWallet,
            block.timestamp + 360
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"EthClaimFailed","type":"error"},{"inputs":[],"name":"MaxBuyPerTxExceeds","type":"error"},{"inputs":[],"name":"MaxSellPerTxExceeds","type":"error"},{"inputs":[],"name":"MinOnePercent","type":"error"},{"inputs":[],"name":"OnlyMarketingWallet","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":"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":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFee","outputs":[{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"development","type":"uint256"},{"internalType":"uint256","name":"autoLP","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimStuckedERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"claimStuckedEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"developmentWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"exlcudeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lpReceiverWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"restoreDefaultTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"development","type":"uint256"},{"internalType":"uint256","name":"autoLP","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellFee","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":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketing","type":"uint256"},{"internalType":"uint256","name":"_dev","type":"uint256"},{"internalType":"uint256","name":"_lp","type":"uint256"}],"name":"updateBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percent","type":"uint256"}],"name":"updateMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percent","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketing","type":"uint256"},{"internalType":"uint256","name":"_dev","type":"uint256"},{"internalType":"uint256","name":"_lp","type":"uint256"}],"name":"updateSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mkt","type":"address"},{"internalType":"address","name":"_dev","type":"address"},{"internalType":"address","name":"_lpReceiver","type":"address"}],"name":"updateWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526103e86200001f6a52b7d2dcc80cd2e4000000600c62000496565b6200002b9190620004b6565b6006556064620000486a52b7d2dcc80cd2e4000000600362000496565b620000549190620004b6565b600755600880546001600160a01b03199081167352cb9e9d202d439ea1545deca2bb962a5dbc3a9b1790915560098054821673991f58014e46320659671b4a75a686bda97f16cb179055600a8054909116331790556013805461ffff1916610100179055348015620000c4575f80fd5b50604080518082018252600580825264545055416960d81b602080840182905284518086019095529184529083015290600362000102838262000575565b50600462000111828262000575565b5050506200012e620001286200036460201b60201c565b62000368565b737a250d5630b4cf539739df2c5dacb4c659f2488d60808190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000182573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001a891906200063d565b6001600160a01b031663c9c65396306080516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001f6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200021c91906200063d565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801562000267573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200028d91906200063d565b6001600160a01b031660a0526003600b8190556001600c819055600d81905560056011819055600e92909255600f819055601081905560129190915560155f620002df6005546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182015f908120805495151560ff1996871617905530815260159093528183208054851660019081179091556008548216845282842080548616821790556009549091168352912080549092161790556200035e336a52b7d2dcc80cd2e4000000620003b9565b62000682565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038216620004145760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060025f8282546200042791906200066c565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417620004b057620004b062000482565b92915050565b5f82620004d157634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620004ff57607f821691505b6020821081036200051e57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200047d575f81815260208120601f850160051c810160208610156200054c5750805b601f850160051c820191505b818110156200056d5782815560010162000558565b505050505050565b81516001600160401b03811115620005915762000591620004d6565b620005a981620005a28454620004ea565b8462000524565b602080601f831160018114620005df575f8415620005c75750858301515b5f19600386901b1c1916600185901b1785556200056d565b5f85815260208120601f198616915b828110156200060f57888601518255948401946001909101908401620005ee565b50858210156200062d57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f602082840312156200064e575f80fd5b81516001600160a01b038116811462000665575f80fd5b9392505050565b80820180821115620004b057620004b062000482565b60805160a051611c98620006e35f395f81816105b801528181610ea501528181610f71015261106d01525f8181610293015281816114eb015281816115a3015281816115d301528181611612015281816116a8015261175c0152611c985ff3fe6080604052600436106101de575f3560e01c806370a08231116100fd578063a0a485ca11610092578063c18bc19511610062578063c18bc19514610588578063c816841b146105a7578063dd62ed3e146105da578063f2fde38b146105f9575f80fd5b8063a0a485ca1461050c578063a457c2d71461052b578063a9059cbb1461054a578063c04a541414610569575f80fd5b8063877b6eec116100cd578063877b6eec146104a75780638da5cb5b146104c657806395d89b41146104e35780639d9241ec146104f7575f80fd5b806370a0823114610421578063715018a61461045557806375f0a874146104695780637a20d3da14610488575f80fd5b806327be21d611610173578063395093511161014357806339509351146103b057806347062402146103cf57806359b107b9146103ed5780636256d18114610402575f80fd5b806327be21d6146103295780632b14ca561461033d5780632fb97b3714610376578063313ce56714610395575f80fd5b80631694505e116101ae5780631694505e146102825780631706fbc5146102cd57806318160ddd146102ec57806323b872dd1461030a575f80fd5b806305f93650146101e957806306fdde031461020a578063095ea7b314610234578063147c9f6d14610263575f80fd5b366101e557005b5f80fd5b3480156101f4575f80fd5b50610208610203366004611801565b610618565b005b348015610215575f80fd5b5061021e610669565b60405161022b919061184c565b60405180910390f35b34801561023f575f80fd5b5061025361024e366004611892565b6106f9565b604051901515815260200161022b565b34801561026e575f80fd5b5061020861027d3660046118bc565b610712565b34801561028d575f80fd5b506102b57f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161022b565b3480156102d8575f80fd5b506102086102e7366004611911565b610794565b3480156102f7575f80fd5b506002545b60405190815260200161022b565b348015610315575f80fd5b50610253610324366004611948565b6107c6565b348015610334575f80fd5b506102086107e9565b348015610348575f80fd5b50600e54600f5460105461035b92919083565b6040805193845260208401929092529082015260600161022b565b348015610381575f80fd5b50600a546102b5906001600160a01b031681565b3480156103a0575f80fd5b506040516012815260200161022b565b3480156103bb575f80fd5b506102536103ca366004611892565b610821565b3480156103da575f80fd5b50600b54600c54600d5461035b92919083565b3480156103f8575f80fd5b506102fc60115481565b34801561040d575f80fd5b5061020861041c366004611986565b610842565b34801561042c575f80fd5b506102fc61043b36600461199d565b6001600160a01b03165f9081526020819052604090205490565b348015610460575f80fd5b50610208610892565b348015610474575f80fd5b506008546102b5906001600160a01b031681565b348015610493575f80fd5b506102086104a2366004611892565b6108a5565b3480156104b2575f80fd5b506102086104c136600461199d565b6109ed565b3480156104d1575f80fd5b506005546001600160a01b03166102b5565b3480156104ee575f80fd5b5061021e610a8c565b348015610502575f80fd5b506102fc60125481565b348015610517575f80fd5b50610208610526366004611801565b610a9b565b348015610536575f80fd5b50610253610545366004611892565b610aeb565b348015610555575f80fd5b50610253610564366004611892565b610b65565b348015610574575f80fd5b506009546102b5906001600160a01b031681565b348015610593575f80fd5b506102086105a2366004611986565b610b72565b3480156105b2575f80fd5b506102b57f000000000000000000000000000000000000000000000000000000000000000081565b3480156105e5575f80fd5b506102fc6105f43660046119bf565b610bc2565b348015610604575f80fd5b5061020861061336600461199d565b610bec565b610620610c65565b600a8161062d84866119ff565b61063791906119ff565b1161066457600e839055600f82905560108190558161065682856119ff565b61066091906119ff565b6012555b505050565b60606003805461067890611a12565b80601f01602080910402602001604051908101604052809291908181526020018280546106a490611a12565b80156106ef5780601f106106c6576101008083540402835291602001916106ef565b820191905f5260205f20905b8154815290600101906020018083116106d257829003601f168201915b5050505050905090565b5f33610706818585610cbf565b60019150505b92915050565b61071a610c65565b6001600160a01b038316158061073757506001600160a01b038216155b156107555760405163d92e233d60e01b815260040160405180910390fd5b600880546001600160a01b039485166001600160a01b0319918216179091556009805493851693821693909317909255600a8054919093169116179055565b61079c610c65565b6001600160a01b03919091165f908152601560205260409020805460ff1916911515919091179055565b5f336107d3858285610de2565b6107de858585610e54565b506001949350505050565b6005546001600160a01b031633148061080c57506008546001600160a01b031633145b610814575f80fd5b6013805461ff0019169055565b5f336107068185856108338383610bc2565b61083d91906119ff565b610cbf565b61084a610c65565b600181101561086c5760405163f921e6df60e01b815260040160405180910390fd5b60648161087860025490565b6108829190611a4a565b61088c9190611a61565b60065550565b61089a610c65565b6108a35f611111565b565b6008546001600160a01b031633146108d05760405163e734c0b760e01b815260040160405180910390fd5b600854604080516001600160a01b039283166024820152604480820185905282518083039091018152606490910182526020810180516001600160e01b031663a9059cbb60e01b17905290515f9283929086169161092e9190611a80565b5f604051808303815f865af19150503d805f8114610967576040519150601f19603f3d011682016040523d82523d5f602084013e61096c565b606091505b50915091508180156109965750805115806109965750808060200190518101906109969190611a9b565b6109e75760405162461bcd60e51b815260206004820152601860248201527f424152433a20544f4b454e5f434c41494d5f4641494c4544000000000000000060448201526064015b60405180910390fd5b50505050565b6008546001600160a01b03163314610a185760405163e734c0b760e01b815260040160405180910390fd5b5f816001600160a01b0316476040515f6040518083038185875af1925050503d805f8114610a61576040519150601f19603f3d011682016040523d82523d5f602084013e610a66565b606091505b5050905080610a8857604051631b9cb44960e31b815260040160405180910390fd5b5050565b60606004805461067890611a12565b610aa3610c65565b600a81610ab084866119ff565b610aba91906119ff565b1161066457600b839055600c829055600d81905581610ad982856119ff565b610ae391906119ff565b601155505050565b5f3381610af88286610bc2565b905083811015610b585760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016109de565b6107de8286868403610cbf565b5f33610706818585610e54565b610b7a610c65565b6001811015610b9c5760405163f921e6df60e01b815260040160405180910390fd5b606481610ba860025490565b610bb29190611a4a565b610bbc9190611a61565b60075550565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b610bf4610c65565b6001600160a01b038116610c595760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109de565b610c6281611111565b50565b6005546001600160a01b031633146108a35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b6001600160a01b038316610d215760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109de565b6001600160a01b038216610d825760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109de565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f610ded8484610bc2565b90505f1981146109e75781811015610e475760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016109de565b6109e78484848403610cbf565b6001600160a01b0383165f9081526015602052604090205460019060ff1680610e9457506001600160a01b0383165f9081526015602052604090205460ff165b15610e9c57505f5b8015611047575f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031603610f6f57600654831115610eff5760405163acdd04e360e01b815260040160405180910390fd5b6014545f03610f0d57426014555b60115415610f6a57606460115484610f259190611a4a565b610f2f9190611a61565b601354909150610100900460ff168015610f57575061070860145442610f559190611ab6565b105b15610f6a57610f67816004611a4a565b90505b611028565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b03160361102857600654831115610fcb57604051630992619960e31b815260040160405180910390fd5b6012541561102857606460125484610fe39190611a4a565b610fed9190611a61565b601354909150610100900460ff1680156110155750610708601454426110139190611ab6565b105b1561102857611025816004611a4a565b90505b6110328184611ab6565b9250801561104557611045853083611162565b505b305f908152602081905260408120549068056bc75e2d6310000082108015906110a257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614155b80156110c657506001600160a01b0386165f9081526015602052604090205460ff16155b80156110d5575060135460ff16155b905080156110fe576013805460ff191660011790556110f382611304565b6013805460ff191690555b611109868686611162565b505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0383166111c65760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109de565b6001600160a01b0382166112285760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016109de565b6001600160a01b0383165f908152602081905260409020548181101561129f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016109de565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36109e7565b5f60125460115461131591906119ff565b90505f611323826002611a4a565b601054600d548591611334916119ff565b61133e9190611a4a565b6113489190611a61565b90505f6113558285611ab6565b600e54600b549192505f91859161136b916119ff565b6113759087611a4a565b61137f9190611a61565b905061138a82611496565b475f836113978684611a4a565b6113a19190611a61565b90505f846113af8585611a4a565b6113b99190611a61565b90505f821180156113c957505f86115b156113d8576113d8828761174f565b8015611432576008546040515f916001600160a01b03169047908381818185875af1925050503d805f8114611428576040519150601f19603f3d011682016040523d82523d5f602084013e61142d565b606091505b505050505b471561148c576009546040515f916001600160a01b03169047908381818185875af1925050503d805f8114611482576040519150601f19603f3d011682016040523d82523d5f602084013e611487565b606091505b505050505b5050505050505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f815181106114c9576114c9611add565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611545573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115699190611af1565b8160018151811061157c5761157c611add565b60200260200101906001600160a01b031690816001600160a01b031681525050816115c7307f0000000000000000000000000000000000000000000000000000000000000000610bc2565b10156115f9576115f9307f00000000000000000000000000000000000000000000000000000000000000005f19610cbf565b60405163d06ca61f60e01b81525f906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d06ca61f906116499086908690600401611b4e565b5f60405180830381865afa158015611663573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261168a9190810190611b6e565b60018151811061169c5761169c611add565b602002602001015190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663791ac9478460648460506116e59190611a4a565b6116ef9190611a61565b85306116fd426101686119ff565b6040518663ffffffff1660e01b815260040161171d959493929190611c27565b5f604051808303815f87803b158015611734575f80fd5b505af1158015611746573d5f803e3d5ffd5b50505050505050565b600a546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163f305d719918591309186915f9182911661179b426101686119ff565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c4015f604051808303818588803b158015611734575f80fd5b5f805f60608486031215611813575f80fd5b505081359360208301359350604090920135919050565b5f5b8381101561184457818101518382015260200161182c565b50505f910152565b602081525f825180602084015261186a81604085016020870161182a565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610c62575f80fd5b5f80604083850312156118a3575f80fd5b82356118ae8161187e565b946020939093013593505050565b5f805f606084860312156118ce575f80fd5b83356118d98161187e565b925060208401356118e98161187e565b915060408401356118f98161187e565b809150509250925092565b8015158114610c62575f80fd5b5f8060408385031215611922575f80fd5b823561192d8161187e565b9150602083013561193d81611904565b809150509250929050565b5f805f6060848603121561195a575f80fd5b83356119658161187e565b925060208401356119758161187e565b929592945050506040919091013590565b5f60208284031215611996575f80fd5b5035919050565b5f602082840312156119ad575f80fd5b81356119b88161187e565b9392505050565b5f80604083850312156119d0575f80fd5b82356119db8161187e565b9150602083013561193d8161187e565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070c5761070c6119eb565b600181811c90821680611a2657607f821691505b602082108103611a4457634e487b7160e01b5f52602260045260245ffd5b50919050565b808202811582820484141761070c5761070c6119eb565b5f82611a7b57634e487b7160e01b5f52601260045260245ffd5b500490565b5f8251611a9181846020870161182a565b9190910192915050565b5f60208284031215611aab575f80fd5b81516119b881611904565b8181038181111561070c5761070c6119eb565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611b01575f80fd5b81516119b88161187e565b5f8151808452602080850194508084015f5b83811015611b435781516001600160a01b031687529582019590820190600101611b1e565b509495945050505050565b828152604060208201525f611b666040830184611b0c565b949350505050565b5f6020808385031215611b7f575f80fd5b825167ffffffffffffffff80821115611b96575f80fd5b818501915085601f830112611ba9575f80fd5b815181811115611bbb57611bbb611ac9565b8060051b604051601f19603f83011681018181108582111715611be057611be0611ac9565b604052918252848201925083810185019188831115611bfd575f80fd5b938501935b82851015611c1b57845184529385019392850192611c02565b98975050505050505050565b85815284602082015260a060408201525f611c4560a0830186611b0c565b6001600160a01b039490941660608301525060800152939250505056fea264697066735822122064a4348cdd647567af893d35e5b94b67fd8132f7441ee4fc620b276d46a2a7c864736f6c63430008150033

Deployed Bytecode

0x6080604052600436106101de575f3560e01c806370a08231116100fd578063a0a485ca11610092578063c18bc19511610062578063c18bc19514610588578063c816841b146105a7578063dd62ed3e146105da578063f2fde38b146105f9575f80fd5b8063a0a485ca1461050c578063a457c2d71461052b578063a9059cbb1461054a578063c04a541414610569575f80fd5b8063877b6eec116100cd578063877b6eec146104a75780638da5cb5b146104c657806395d89b41146104e35780639d9241ec146104f7575f80fd5b806370a0823114610421578063715018a61461045557806375f0a874146104695780637a20d3da14610488575f80fd5b806327be21d611610173578063395093511161014357806339509351146103b057806347062402146103cf57806359b107b9146103ed5780636256d18114610402575f80fd5b806327be21d6146103295780632b14ca561461033d5780632fb97b3714610376578063313ce56714610395575f80fd5b80631694505e116101ae5780631694505e146102825780631706fbc5146102cd57806318160ddd146102ec57806323b872dd1461030a575f80fd5b806305f93650146101e957806306fdde031461020a578063095ea7b314610234578063147c9f6d14610263575f80fd5b366101e557005b5f80fd5b3480156101f4575f80fd5b50610208610203366004611801565b610618565b005b348015610215575f80fd5b5061021e610669565b60405161022b919061184c565b60405180910390f35b34801561023f575f80fd5b5061025361024e366004611892565b6106f9565b604051901515815260200161022b565b34801561026e575f80fd5b5061020861027d3660046118bc565b610712565b34801561028d575f80fd5b506102b57f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b03909116815260200161022b565b3480156102d8575f80fd5b506102086102e7366004611911565b610794565b3480156102f7575f80fd5b506002545b60405190815260200161022b565b348015610315575f80fd5b50610253610324366004611948565b6107c6565b348015610334575f80fd5b506102086107e9565b348015610348575f80fd5b50600e54600f5460105461035b92919083565b6040805193845260208401929092529082015260600161022b565b348015610381575f80fd5b50600a546102b5906001600160a01b031681565b3480156103a0575f80fd5b506040516012815260200161022b565b3480156103bb575f80fd5b506102536103ca366004611892565b610821565b3480156103da575f80fd5b50600b54600c54600d5461035b92919083565b3480156103f8575f80fd5b506102fc60115481565b34801561040d575f80fd5b5061020861041c366004611986565b610842565b34801561042c575f80fd5b506102fc61043b36600461199d565b6001600160a01b03165f9081526020819052604090205490565b348015610460575f80fd5b50610208610892565b348015610474575f80fd5b506008546102b5906001600160a01b031681565b348015610493575f80fd5b506102086104a2366004611892565b6108a5565b3480156104b2575f80fd5b506102086104c136600461199d565b6109ed565b3480156104d1575f80fd5b506005546001600160a01b03166102b5565b3480156104ee575f80fd5b5061021e610a8c565b348015610502575f80fd5b506102fc60125481565b348015610517575f80fd5b50610208610526366004611801565b610a9b565b348015610536575f80fd5b50610253610545366004611892565b610aeb565b348015610555575f80fd5b50610253610564366004611892565b610b65565b348015610574575f80fd5b506009546102b5906001600160a01b031681565b348015610593575f80fd5b506102086105a2366004611986565b610b72565b3480156105b2575f80fd5b506102b57f0000000000000000000000005e1f2b7d0787e6203fafa59f7b7190d3ff53af1681565b3480156105e5575f80fd5b506102fc6105f43660046119bf565b610bc2565b348015610604575f80fd5b5061020861061336600461199d565b610bec565b610620610c65565b600a8161062d84866119ff565b61063791906119ff565b1161066457600e839055600f82905560108190558161065682856119ff565b61066091906119ff565b6012555b505050565b60606003805461067890611a12565b80601f01602080910402602001604051908101604052809291908181526020018280546106a490611a12565b80156106ef5780601f106106c6576101008083540402835291602001916106ef565b820191905f5260205f20905b8154815290600101906020018083116106d257829003601f168201915b5050505050905090565b5f33610706818585610cbf565b60019150505b92915050565b61071a610c65565b6001600160a01b038316158061073757506001600160a01b038216155b156107555760405163d92e233d60e01b815260040160405180910390fd5b600880546001600160a01b039485166001600160a01b0319918216179091556009805493851693821693909317909255600a8054919093169116179055565b61079c610c65565b6001600160a01b03919091165f908152601560205260409020805460ff1916911515919091179055565b5f336107d3858285610de2565b6107de858585610e54565b506001949350505050565b6005546001600160a01b031633148061080c57506008546001600160a01b031633145b610814575f80fd5b6013805461ff0019169055565b5f336107068185856108338383610bc2565b61083d91906119ff565b610cbf565b61084a610c65565b600181101561086c5760405163f921e6df60e01b815260040160405180910390fd5b60648161087860025490565b6108829190611a4a565b61088c9190611a61565b60065550565b61089a610c65565b6108a35f611111565b565b6008546001600160a01b031633146108d05760405163e734c0b760e01b815260040160405180910390fd5b600854604080516001600160a01b039283166024820152604480820185905282518083039091018152606490910182526020810180516001600160e01b031663a9059cbb60e01b17905290515f9283929086169161092e9190611a80565b5f604051808303815f865af19150503d805f8114610967576040519150601f19603f3d011682016040523d82523d5f602084013e61096c565b606091505b50915091508180156109965750805115806109965750808060200190518101906109969190611a9b565b6109e75760405162461bcd60e51b815260206004820152601860248201527f424152433a20544f4b454e5f434c41494d5f4641494c4544000000000000000060448201526064015b60405180910390fd5b50505050565b6008546001600160a01b03163314610a185760405163e734c0b760e01b815260040160405180910390fd5b5f816001600160a01b0316476040515f6040518083038185875af1925050503d805f8114610a61576040519150601f19603f3d011682016040523d82523d5f602084013e610a66565b606091505b5050905080610a8857604051631b9cb44960e31b815260040160405180910390fd5b5050565b60606004805461067890611a12565b610aa3610c65565b600a81610ab084866119ff565b610aba91906119ff565b1161066457600b839055600c829055600d81905581610ad982856119ff565b610ae391906119ff565b601155505050565b5f3381610af88286610bc2565b905083811015610b585760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016109de565b6107de8286868403610cbf565b5f33610706818585610e54565b610b7a610c65565b6001811015610b9c5760405163f921e6df60e01b815260040160405180910390fd5b606481610ba860025490565b610bb29190611a4a565b610bbc9190611a61565b60075550565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b610bf4610c65565b6001600160a01b038116610c595760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109de565b610c6281611111565b50565b6005546001600160a01b031633146108a35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b6001600160a01b038316610d215760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109de565b6001600160a01b038216610d825760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109de565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f610ded8484610bc2565b90505f1981146109e75781811015610e475760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016109de565b6109e78484848403610cbf565b6001600160a01b0383165f9081526015602052604090205460019060ff1680610e9457506001600160a01b0383165f9081526015602052604090205460ff165b15610e9c57505f5b8015611047575f7f0000000000000000000000005e1f2b7d0787e6203fafa59f7b7190d3ff53af166001600160a01b0316856001600160a01b031603610f6f57600654831115610eff5760405163acdd04e360e01b815260040160405180910390fd5b6014545f03610f0d57426014555b60115415610f6a57606460115484610f259190611a4a565b610f2f9190611a61565b601354909150610100900460ff168015610f57575061070860145442610f559190611ab6565b105b15610f6a57610f67816004611a4a565b90505b611028565b7f0000000000000000000000005e1f2b7d0787e6203fafa59f7b7190d3ff53af166001600160a01b0316846001600160a01b03160361102857600654831115610fcb57604051630992619960e31b815260040160405180910390fd5b6012541561102857606460125484610fe39190611a4a565b610fed9190611a61565b601354909150610100900460ff1680156110155750610708601454426110139190611ab6565b105b1561102857611025816004611a4a565b90505b6110328184611ab6565b9250801561104557611045853083611162565b505b305f908152602081905260408120549068056bc75e2d6310000082108015906110a257507f0000000000000000000000005e1f2b7d0787e6203fafa59f7b7190d3ff53af166001600160a01b0316866001600160a01b031614155b80156110c657506001600160a01b0386165f9081526015602052604090205460ff16155b80156110d5575060135460ff16155b905080156110fe576013805460ff191660011790556110f382611304565b6013805460ff191690555b611109868686611162565b505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0383166111c65760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109de565b6001600160a01b0382166112285760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016109de565b6001600160a01b0383165f908152602081905260409020548181101561129f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016109de565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36109e7565b5f60125460115461131591906119ff565b90505f611323826002611a4a565b601054600d548591611334916119ff565b61133e9190611a4a565b6113489190611a61565b90505f6113558285611ab6565b600e54600b549192505f91859161136b916119ff565b6113759087611a4a565b61137f9190611a61565b905061138a82611496565b475f836113978684611a4a565b6113a19190611a61565b90505f846113af8585611a4a565b6113b99190611a61565b90505f821180156113c957505f86115b156113d8576113d8828761174f565b8015611432576008546040515f916001600160a01b03169047908381818185875af1925050503d805f8114611428576040519150601f19603f3d011682016040523d82523d5f602084013e61142d565b606091505b505050505b471561148c576009546040515f916001600160a01b03169047908381818185875af1925050503d805f8114611482576040519150601f19603f3d011682016040523d82523d5f602084013e611487565b606091505b505050505b5050505050505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f815181106114c9576114c9611add565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611545573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115699190611af1565b8160018151811061157c5761157c611add565b60200260200101906001600160a01b031690816001600160a01b031681525050816115c7307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d610bc2565b10156115f9576115f9307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d5f19610cbf565b60405163d06ca61f60e01b81525f906001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063d06ca61f906116499086908690600401611b4e565b5f60405180830381865afa158015611663573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261168a9190810190611b6e565b60018151811061169c5761169c611add565b602002602001015190507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663791ac9478460648460506116e59190611a4a565b6116ef9190611a61565b85306116fd426101686119ff565b6040518663ffffffff1660e01b815260040161171d959493929190611c27565b5f604051808303815f87803b158015611734575f80fd5b505af1158015611746573d5f803e3d5ffd5b50505050505050565b600a546001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81169163f305d719918591309186915f9182911661179b426101686119ff565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c4015f604051808303818588803b158015611734575f80fd5b5f805f60608486031215611813575f80fd5b505081359360208301359350604090920135919050565b5f5b8381101561184457818101518382015260200161182c565b50505f910152565b602081525f825180602084015261186a81604085016020870161182a565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610c62575f80fd5b5f80604083850312156118a3575f80fd5b82356118ae8161187e565b946020939093013593505050565b5f805f606084860312156118ce575f80fd5b83356118d98161187e565b925060208401356118e98161187e565b915060408401356118f98161187e565b809150509250925092565b8015158114610c62575f80fd5b5f8060408385031215611922575f80fd5b823561192d8161187e565b9150602083013561193d81611904565b809150509250929050565b5f805f6060848603121561195a575f80fd5b83356119658161187e565b925060208401356119758161187e565b929592945050506040919091013590565b5f60208284031215611996575f80fd5b5035919050565b5f602082840312156119ad575f80fd5b81356119b88161187e565b9392505050565b5f80604083850312156119d0575f80fd5b82356119db8161187e565b9150602083013561193d8161187e565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561070c5761070c6119eb565b600181811c90821680611a2657607f821691505b602082108103611a4457634e487b7160e01b5f52602260045260245ffd5b50919050565b808202811582820484141761070c5761070c6119eb565b5f82611a7b57634e487b7160e01b5f52601260045260245ffd5b500490565b5f8251611a9181846020870161182a565b9190910192915050565b5f60208284031215611aab575f80fd5b81516119b881611904565b8181038181111561070c5761070c6119eb565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611b01575f80fd5b81516119b88161187e565b5f8151808452602080850194508084015f5b83811015611b435781516001600160a01b031687529582019590820190600101611b1e565b509495945050505050565b828152604060208201525f611b666040830184611b0c565b949350505050565b5f6020808385031215611b7f575f80fd5b825167ffffffffffffffff80821115611b96575f80fd5b818501915085601f830112611ba9575f80fd5b815181811115611bbb57611bbb611ac9565b8060051b604051601f19603f83011681018181108582111715611be057611be0611ac9565b604052918252848201925083810185019188831115611bfd575f80fd5b938501935b82851015611c1b57845184529385019392850192611c02565b98975050505050505050565b85815284602082015260a060408201525f611c4560a0830186611b0c565b6001600160a01b039490941660608301525060800152939250505056fea264697066735822122064a4348cdd647567af893d35e5b94b67fd8132f7441ee4fc620b276d46a2a7c864736f6c63430008150033

Deployed Bytecode Sourcemap

20998:11323:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26796:362;;;;;;;;;;-1:-1:-1;26796:362:0;;;;;:::i;:::-;;:::i;:::-;;8542:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10968:226;;;;;;;;;;-1:-1:-1;10968:226:0;;;;;:::i;:::-;;:::i;:::-;;;1612:14:1;;1605:22;1587:41;;1575:2;1560:18;10968:226:0;1447:187:1;27348:345:0;;;;;;;;;;-1:-1:-1;27348:345:0;;;;;:::i;:::-;;:::i;21764:47::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2359:32:1;;;2341:51;;2329:2;2314:18;21764:47:0;2173:225:1;24993:127:0;;;;;;;;;;-1:-1:-1;24993:127:0;;;;;:::i;:::-;;:::i;9671:108::-;;;;;;;;;;-1:-1:-1;9759:12:0;;9671:108;;;3059:25:1;;;3047:2;3032:18;9671:108:0;2913:177:1;11774:295:0;;;;;;;;;;-1:-1:-1;11774:295:0;;;;;:::i;:::-;;:::i;25912:157::-;;;;;;;;;;;;;:::i;22212:22::-;;;;;;;;;;-1:-1:-1;22212:22:0;;;;;;;;;;;;;;;;3758:25:1;;;3814:2;3799:18;;3792:34;;;;3842:18;;;3835:34;3746:2;3731:18;22212:22:0;3556:319:1;21680:44:0;;;;;;;;;;-1:-1:-1;21680:44:0;;;;-1:-1:-1;;;;;21680:44:0;;;9513:93;;;;;;;;;;-1:-1:-1;9513:93:0;;9596:2;4230:36:1;;4218:2;4203:18;9513:93:0;4088:184:1;12478:263:0;;;;;;;;;;-1:-1:-1;12478:263:0;;;;;:::i;:::-;;:::i;22160:20::-;;;;;;;;;;-1:-1:-1;22160:20:0;;;;;;;;;;;;22272:26;;;;;;;;;;;;;;;;25287:209;;;;;;;;;;-1:-1:-1;25287:209:0;;;;;:::i;:::-;;:::i;9842:143::-;;;;;;;;;;-1:-1:-1;9842:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;9959:18:0;9932:7;9959:18;;;;;;;;;;;;9842:143;2557:103;;;;;;;;;;;;;:::i;21416:84::-;;;;;;;;;;-1:-1:-1;21416:84:0;;;;-1:-1:-1;;;;;21416:84:0;;;23943:526;;;;;;;;;;-1:-1:-1;23943:526:0;;;;;:::i;:::-;;:::i;24509:301::-;;;;;;;;;;-1:-1:-1;24509:301:0;;;;;:::i;:::-;;:::i;1916:87::-;;;;;;;;;;-1:-1:-1;1989:6:0;;-1:-1:-1;;;;;1989:6:0;1916:87;;8761:104;;;;;;;;;;;;;:::i;22337:27::-;;;;;;;;;;;;;;;;26252:357;;;;;;;;;;-1:-1:-1;26252:357:0;;;;;:::i;:::-;;:::i;13244:498::-;;;;;;;;;;-1:-1:-1;13244:498:0;;;;;:::i;:::-;;:::i;10191:218::-;;;;;;;;;;-1:-1:-1;10191:218:0;;;;;:::i;:::-;;:::i;21551:86::-;;;;;;;;;;-1:-1:-1;21551:86:0;;;;-1:-1:-1;;;;;21551:86:0;;;25648:214;;;;;;;;;;-1:-1:-1;25648:214:0;;;;;:::i;:::-;;:::i;21847:36::-;;;;;;;;;;;;;;;10472:176;;;;;;;;;;-1:-1:-1;10472:176:0;;;;;:::i;:::-;;:::i;2815:238::-;;;;;;;;;;-1:-1:-1;2815:238:0;;;;;:::i;:::-;;:::i;26796:362::-;1802:13;:11;:13::i;:::-;26961:2:::1;26954:3:::0;26934:17:::1;26947:4:::0;26934:10;:17:::1;:::i;:::-;:23;;;;:::i;:::-;:29;26930:221;;26980:7;:30:::0;;;27025:19;:26;;;27066:14;:20;;;27047:4;27116:16:::1;27083:3:::0;27000:10;27116:16:::1;:::i;:::-;:23;;;;:::i;:::-;27101:12;:38:::0;26930:221:::1;26796:362:::0;;;:::o;8542:100::-;8596:13;8629:5;8622:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8542:100;:::o;10968:226::-;11076:4;680:10;11132:32;680:10;11148:7;11157:6;11132:8;:32::i;:::-;11182:4;11175:11;;;10968:226;;;;;:::o;27348:345::-;1802:13;:11;:13::i;:::-;-1:-1:-1;;;;;27488:18:0;::::1;::::0;;:40:::1;;-1:-1:-1::0;;;;;;27510:18:0;::::1;::::0;27488:40:::1;27484:93;;;27552:13;;-1:-1:-1::0;;;27552:13:0::1;;;;;;;;;;;27484:93;27587:15;:22:::0;;-1:-1:-1;;;;;27587:22:0;;::::1;-1:-1:-1::0;;;;;;27587:22:0;;::::1;;::::0;;;27620:17:::1;:24:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;27655:16:::1;:30:::0;;;;;::::1;::::0;::::1;;::::0;;27348:345::o;24993:127::-;1802:13;:11;:13::i;:::-;-1:-1:-1;;;;;25077:24:0;;;::::1;;::::0;;;:18:::1;:24;::::0;;;;:35;;-1:-1:-1;;25077:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;24993:127::o;11774:295::-;11905:4;680:10;11963:38;11979:4;680:10;11994:6;11963:15;:38::i;:::-;12012:27;12022:4;12028:2;12032:6;12012:9;:27::i;:::-;-1:-1:-1;12057:4:0;;11774:295;-1:-1:-1;;;;11774:295:0:o;25912:157::-;1989:6;;-1:-1:-1;;;;;1989:6:0;25969:10;:21;;:54;;-1:-1:-1;26008:15:0;;-1:-1:-1;;;;;26008:15:0;25994:10;:29;25969:54;25961:63;;;;;;26035:18;:26;;-1:-1:-1;;26035:26:0;;;25912:157::o;12478:263::-;12591:4;680:10;12647:64;680:10;12663:7;12700:10;12672:25;680:10;12663:7;12672:9;:25::i;:::-;:38;;;;:::i;:::-;12647:8;:64::i;25287:209::-;1802:13;:11;:13::i;:::-;25377:1:::1;25366:8;:12;25362:67;;;25402:15;;-1:-1:-1::0;;;25402:15:0::1;;;;;;;;;;;25362:67;25485:3;25473:8;25457:13;9759:12:::0;;;9671:108;25457:13:::1;:24;;;;:::i;:::-;25456:32;;;;:::i;:::-;25439:14;:49:::0;-1:-1:-1;25287:209:0:o;2557:103::-;1802:13;:11;:13::i;:::-;2622:30:::1;2649:1;2622:18;:30::i;:::-;2557:103::o:0;23943:526::-;24039:15;;-1:-1:-1;;;;;24039:15:0;24025:10;:29;24021:90;;24078:21;;-1:-1:-1;;;24078:21:0;;;;;;;;;;;24021:90;24284:15;;24249:59;;;-1:-1:-1;;;;;24284:15:0;;;24249:59;;;6323:51:1;6390:18;;;;6383:34;;;24249:59:0;;;;;;;;;;6296:18:1;;;;24249:59:0;;;;;;;-1:-1:-1;;;;;24249:59:0;-1:-1:-1;;;24249:59:0;;;24224:95;;-1:-1:-1;;;;24224:10:0;;;;:95;;24249:59;24224:95;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24188:131;;;;24352:7;:57;;;;-1:-1:-1;24364:11:0;;:16;;:44;;;24395:4;24384:24;;;;;;;;;;;;:::i;:::-;24330:131;;;;-1:-1:-1;;;24330:131:0;;7172:2:1;24330:131:0;;;7154:21:1;7211:2;7191:18;;;7184:30;7250:26;7230:18;;;7223:54;7294:18;;24330:131:0;;;;;;;;;24010:459;;23943:526;;:::o;24509:301::-;24588:15;;-1:-1:-1;;;;;24588:15:0;24574:10;:29;24570:90;;24627:21;;-1:-1:-1;;;24627:21:0;;;;;;;;;;;24570:90;24671:9;24686:6;-1:-1:-1;;;;;24686:11:0;24705:21;24686:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24670:61;;;24747:4;24742:61;;24775:16;;-1:-1:-1;;;24775:16:0;;;;;;;;;;;24742:61;24559:251;24509:301;:::o;8761:104::-;8817:13;8850:7;8843:14;;;;;:::i;26252:357::-;1802:13;:11;:13::i;:::-;26416:2:::1;26409:3:::0;26389:17:::1;26402:4:::0;26389:10;:17:::1;:::i;:::-;:23;;;;:::i;:::-;:29;26385:217;;26435:6;:29:::0;;;26479:18;:25;;;26519:13;:19;;;26500:4;26567:16:::1;26535:3:::0;26454:10;26567:16:::1;:::i;:::-;:23;;;;:::i;:::-;26553:11;:37:::0;26252:357;;;:::o;13244:498::-;13362:4;680:10;13362:4;13445:25;680:10;13462:7;13445:9;:25::i;:::-;13418:52;;13523:15;13503:16;:35;;13481:122;;;;-1:-1:-1;;;13481:122:0;;7735:2:1;13481:122:0;;;7717:21:1;7774:2;7754:18;;;7747:30;7813:34;7793:18;;;7786:62;-1:-1:-1;;;7864:18:1;;;7857:35;7909:19;;13481:122:0;7533:401:1;13481:122:0;13639:60;13648:5;13655:7;13683:15;13664:16;:34;13639:8;:60::i;10191:218::-;10295:4;680:10;10351:28;680:10;10368:2;10372:6;10351:9;:28::i;25648:214::-;1802:13;:11;:13::i;:::-;25742:1:::1;25731:8;:12;25727:67;;;25767:15;;-1:-1:-1::0;;;25767:15:0::1;;;;;;;;;;;25727:67;25851:3;25839:8;25823:13;9759:12:::0;;;9671:108;25823:13:::1;:24;;;;:::i;:::-;25822:32;;;;:::i;:::-;25804:15;:50:::0;-1:-1:-1;25648:214:0:o;10472:176::-;-1:-1:-1;;;;;10613:18:0;;;10586:7;10613:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;10472:176::o;2815:238::-;1802:13;:11;:13::i;:::-;-1:-1:-1;;;;;2918:22:0;::::1;2896:110;;;::::0;-1:-1:-1;;;2896:110:0;;8141:2:1;2896:110:0::1;::::0;::::1;8123:21:1::0;8180:2;8160:18;;;8153:30;8219:34;8199:18;;;8192:62;-1:-1:-1;;;8270:18:1;;;8263:36;8316:19;;2896:110:0::1;7939:402:1::0;2896:110:0::1;3017:28;3036:8;3017:18;:28::i;:::-;2815:238:::0;:::o;2081:132::-;1989:6;;-1:-1:-1;;;;;1989:6:0;680:10;2145:23;2137:68;;;;-1:-1:-1;;;2137:68:0;;8548:2:1;2137:68:0;;;8530:21:1;;;8567:18;;;8560:30;8626:34;8606:18;;;8599:62;8678:18;;2137:68:0;8346:356:1;17370:380:0;-1:-1:-1;;;;;17506:19:0;;17498:68;;;;-1:-1:-1;;;17498:68:0;;8909:2:1;17498:68:0;;;8891:21:1;8948:2;8928:18;;;8921:30;8987:34;8967:18;;;8960:62;-1:-1:-1;;;9038:18:1;;;9031:34;9082:19;;17498:68:0;8707:400:1;17498:68:0;-1:-1:-1;;;;;17585:21:0;;17577:68;;;;-1:-1:-1;;;17577:68:0;;9314:2:1;17577:68:0;;;9296:21:1;9353:2;9333:18;;;9326:30;9392:34;9372:18;;;9365:62;-1:-1:-1;;;9443:18:1;;;9436:32;9485:19;;17577:68:0;9112:398:1;17577:68:0;-1:-1:-1;;;;;17658:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17710:32;;3059:25:1;;;17710:32:0;;3032:18:1;17710:32:0;;;;;;;17370:380;;;:::o;18041:502::-;18176:24;18203:25;18213:5;18220:7;18203:9;:25::i;:::-;18176:52;;-1:-1:-1;;18243:16:0;:37;18239:297;;18343:6;18323:16;:26;;18297:117;;;;-1:-1:-1;;;18297:117:0;;9717:2:1;18297:117:0;;;9699:21:1;9756:2;9736:18;;;9729:30;9795:31;9775:18;;;9768:59;9844:18;;18297:117:0;9515:353:1;18297:117:0;18458:51;18467:5;18474:7;18502:6;18483:16;:25;18458:8;:51::i;27939:2012::-;-1:-1:-1;;;;;28097:24:0;;28063:12;28097:24;;;:18;:24;;;;;;28078:4;;28097:24;;;:50;;-1:-1:-1;;;;;;28125:22:0;;;;;;:18;:22;;;;;;;;28097:50;28093:98;;;-1:-1:-1;28174:5:0;28093:98;28207:7;28203:1333;;;28231:11;28269;-1:-1:-1;;;;;28261:19:0;:4;-1:-1:-1;;;;;28261:19:0;;28257:1125;;28314:14;;28305:6;:23;28301:99;;;28360:20;;-1:-1:-1;;;28360:20:0;;;;;;;;;;;28301:99;28422:10;;28436:1;28422:15;28418:92;;28475:15;28462:10;:28;28418:92;28534:11;;:15;28530:326;;28605:3;28590:11;;28581:6;:20;;;;:::i;:::-;28580:28;;;;:::i;:::-;28661:18;;28574:34;;-1:-1:-1;28661:18:0;;;;;:88;;;;;28739:10;28726;;28708:15;:28;;;;:::i;:::-;:41;28661:88;28631:206;;;28806:7;:3;28812:1;28806:7;:::i;:::-;28800:13;;28631:206;28257:1125;;;28887:11;-1:-1:-1;;;;;28881:17:0;:2;-1:-1:-1;;;;;28881:17:0;;28877:505;;28932:14;;28923:6;:23;28919:100;;;28978:21;;-1:-1:-1;;;28978:21:0;;;;;;;;;;;28919:100;29043:12;;:16;29039:328;;29116:3;29100:12;;29091:6;:21;;;;:::i;:::-;29090:29;;;;:::i;:::-;29172:18;;29084:35;;-1:-1:-1;29172:18:0;;;;;:88;;;;;29250:10;29237;;29219:15;:28;;;;:::i;:::-;:41;29172:88;29142:206;;;29317:7;:3;29323:1;29317:7;:::i;:::-;29311:13;;29142:206;29407:12;29416:3;29407:6;:12;:::i;:::-;29398:21;-1:-1:-1;29440:7:0;;29436:89;;29468:41;29484:4;29498;29505:3;29468:15;:41::i;:::-;28216:1320;28203:1333;29590:4;29546:23;9959:18;;;;;;;;;;;;29643:6;29624:25;;;;;:61;;;29674:11;-1:-1:-1;;;;;29666:19:0;:4;-1:-1:-1;;;;;29666:19:0;;;29624:61;:105;;;;-1:-1:-1;;;;;;29704:24:0;;;;;;:18;:24;;;;;;;;29703:25;29624:105;:131;;;;-1:-1:-1;29747:8:0;;;;29746:9;29624:131;29609:146;;29770:7;29766:132;;;29794:8;:15;;-1:-1:-1;;29794:15:0;29805:4;29794:15;;;29824:31;29839:15;29824:14;:31::i;:::-;29870:8;:16;;-1:-1:-1;;29870:16:0;;;29766:132;29910:33;29926:4;29932:2;29936:6;29910:15;:33::i;:::-;28052:1899;;;27939:2012;;;:::o;3213:191::-;3306:6;;;-1:-1:-1;;;;;3323:17:0;;;-1:-1:-1;;;;;;3323:17:0;;;;;;;3356:40;;3306:6;;;3323:17;3306:6;;3356:40;;3287:16;;3356:40;3276:128;3213:191;:::o;14212:877::-;-1:-1:-1;;;;;14343:18:0;;14335:68;;;;-1:-1:-1;;;14335:68:0;;10208:2:1;14335:68:0;;;10190:21:1;10247:2;10227:18;;;10220:30;10286:34;10266:18;;;10259:62;-1:-1:-1;;;10337:18:1;;;10330:35;10382:19;;14335:68:0;10006:401:1;14335:68:0;-1:-1:-1;;;;;14422:16:0;;14414:64;;;;-1:-1:-1;;;14414:64:0;;10614:2:1;14414:64:0;;;10596:21:1;10653:2;10633:18;;;10626:30;10692:34;10672:18;;;10665:62;-1:-1:-1;;;10743:18:1;;;10736:33;10786:19;;14414:64:0;10412:399:1;14414:64:0;-1:-1:-1;;;;;14564:15:0;;14542:19;14564:15;;;;;;;;;;;14612:21;;;;14590:109;;;;-1:-1:-1;;;14590:109:0;;11018:2:1;14590:109:0;;;11000:21:1;11057:2;11037:18;;;11030:30;11096:34;11076:18;;;11069:62;-1:-1:-1;;;11147:18:1;;;11140:36;11193:19;;14590:109:0;10816:402:1;14590:109:0;-1:-1:-1;;;;;14735:15:0;;;:9;:15;;;;;;;;;;;14753:20;;;14735:38;;14953:13;;;;;;;;;;:23;;;;;;15005:26;;3059:25:1;;;14953:13:0;;15005:26;;3032:18:1;15005:26:0;;;;;;;15044:37;26796:362;30068:1005;30127:13;30157:12;;30143:11;;:26;;;;:::i;:::-;30127:42;-1:-1:-1;30180:14:0;30257:9;30127:42;30265:1;30257:9;:::i;:::-;30215:14;;30199:13;;30233:6;;30199:30;;;:::i;:::-;30198:41;;;;:::i;:::-;30197:70;;;;:::i;:::-;30180:87;-1:-1:-1;30278:21:0;30303:15;30180:87;30303:6;:15;:::i;:::-;30399:7;:17;30380:6;:16;30278:41;;-1:-1:-1;30330:23:0;;30421:5;;30380:36;;;:::i;:::-;30357:60;;:6;:60;:::i;:::-;30356:70;;;;:::i;:::-;30330:96;;30437:31;30454:13;30437:16;:31::i;:::-;30500:21;30479:18;30572:13;30549:19;30562:6;30500:21;30549:19;:::i;:::-;30548:37;;;;:::i;:::-;30532:53;-1:-1:-1;30596:20:0;30652:13;30620:28;30633:15;30620:10;:28;:::i;:::-;30619:46;;;;:::i;:::-;30596:69;;30688:1;30680:5;:9;:23;;;;;30702:1;30693:6;:10;30680:23;30676:83;;;30720:27;30733:5;30740:6;30720:12;:27::i;:::-;30773:16;;30769:138;;30841:15;;:54;;30806:9;;-1:-1:-1;;;;;30841:15:0;;30869:21;;30806:9;30841:54;30806:9;30841:54;30869:21;30841:15;:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;30769:138:0;30921:21;:25;30917:149;;30998:17;;:56;;30963:9;;-1:-1:-1;;;;;30998:17:0;;31028:21;;30963:9;30998:56;30963:9;30998:56;31028:21;30998:17;:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;30917:149:0;30116:957;;;;;;;30068:1005;:::o;31154:841::-;31304:16;;;31318:1;31304:16;;;;;;;;31280:21;;31304:16;;;;;;;;;;-1:-1:-1;31304:16:0;31280:40;;31349:4;31331;31336:1;31331:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;31331:23:0;;;-1:-1:-1;;;;;31331:23:0;;;;;31375:15;-1:-1:-1;;;;;31375:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31365:4;31370:1;31365:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;31365:32:0;;;-1:-1:-1;;;;;31365:32:0;;;;;31467:11;31414:50;31432:4;31447:15;31414:9;:50::i;:::-;:64;31410:231;;;31495:134;31530:4;31562:15;-1:-1:-1;;31495:8:0;:134::i;:::-;31667:48;;-1:-1:-1;;;31667:48:0;;31653:11;;-1:-1:-1;;;;;31667:15:0;:29;;;;:48;;31697:11;;31710:4;;31667:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31667:48:0;;;;;;;;;;;;:::i;:::-;31716:1;31667:51;;;;;;;;:::i;:::-;;;;;;;31653:65;;31755:15;-1:-1:-1;;;;;31755:66:0;;31836:11;31875:3;31863;31869:2;31863:8;;;;:::i;:::-;31862:16;;;;:::i;:::-;31908:4;31935;31955:21;:15;31973:3;31955:21;:::i;:::-;31755:232;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31209:786;;31154:841;:::o;32026:292::-;32247:16;;-1:-1:-1;;;;;32102:15:0;:31;;;;;32141:9;;32174:4;;32194:6;;32215:1;;;;32247:16;32278:21;:15;32296:3;32278:21;:::i;:::-;32102:208;;;;;;-1:-1:-1;;;;;;32102:208:0;;;-1:-1:-1;;;;;14594:15:1;;;32102:208:0;;;14576:34:1;14626:18;;;14619:34;;;;14669:18;;;14662:34;;;;14712:18;;;14705:34;;;;14776:15;;;14755:19;;;14748:44;14808:19;;;14801:35;;;;14510:19;;32102:208:0;;;;;;;;;;;;;;;;;;;14:316:1;91:6;99;107;160:2;148:9;139:7;135:23;131:32;128:52;;;176:1;173;166:12;128:52;-1:-1:-1;;199:23:1;;;269:2;254:18;;241:32;;-1:-1:-1;320:2:1;305:18;;;292:32;;14:316;-1:-1:-1;14:316:1:o;335:250::-;420:1;430:113;444:6;441:1;438:13;430:113;;;520:11;;;514:18;501:11;;;494:39;466:2;459:10;430:113;;;-1:-1:-1;;577:1:1;559:16;;552:27;335:250::o;590:396::-;739:2;728:9;721:21;702:4;771:6;765:13;814:6;809:2;798:9;794:18;787:34;830:79;902:6;897:2;886:9;882:18;877:2;869:6;865:15;830:79;:::i;:::-;970:2;949:15;-1:-1:-1;;945:29:1;930:45;;;;977:2;926:54;;590:396;-1:-1:-1;;590:396:1:o;991:131::-;-1:-1:-1;;;;;1066:31:1;;1056:42;;1046:70;;1112:1;1109;1102:12;1127:315;1195:6;1203;1256:2;1244:9;1235:7;1231:23;1227:32;1224:52;;;1272:1;1269;1262:12;1224:52;1311:9;1298:23;1330:31;1355:5;1330:31;:::i;:::-;1380:5;1432:2;1417:18;;;;1404:32;;-1:-1:-1;;;1127:315:1:o;1639:529::-;1716:6;1724;1732;1785:2;1773:9;1764:7;1760:23;1756:32;1753:52;;;1801:1;1798;1791:12;1753:52;1840:9;1827:23;1859:31;1884:5;1859:31;:::i;:::-;1909:5;-1:-1:-1;1966:2:1;1951:18;;1938:32;1979:33;1938:32;1979:33;:::i;:::-;2031:7;-1:-1:-1;2090:2:1;2075:18;;2062:32;2103:33;2062:32;2103:33;:::i;:::-;2155:7;2145:17;;;1639:529;;;;;:::o;2403:118::-;2489:5;2482:13;2475:21;2468:5;2465:32;2455:60;;2511:1;2508;2501:12;2526:382;2591:6;2599;2652:2;2640:9;2631:7;2627:23;2623:32;2620:52;;;2668:1;2665;2658:12;2620:52;2707:9;2694:23;2726:31;2751:5;2726:31;:::i;:::-;2776:5;-1:-1:-1;2833:2:1;2818:18;;2805:32;2846:30;2805:32;2846:30;:::i;:::-;2895:7;2885:17;;;2526:382;;;;;:::o;3095:456::-;3172:6;3180;3188;3241:2;3229:9;3220:7;3216:23;3212:32;3209:52;;;3257:1;3254;3247:12;3209:52;3296:9;3283:23;3315:31;3340:5;3315:31;:::i;:::-;3365:5;-1:-1:-1;3422:2:1;3407:18;;3394:32;3435:33;3394:32;3435:33;:::i;:::-;3095:456;;3487:7;;-1:-1:-1;;;3541:2:1;3526:18;;;;3513:32;;3095:456::o;4277:180::-;4336:6;4389:2;4377:9;4368:7;4364:23;4360:32;4357:52;;;4405:1;4402;4395:12;4357:52;-1:-1:-1;4428:23:1;;4277:180;-1:-1:-1;4277:180:1:o;4462:247::-;4521:6;4574:2;4562:9;4553:7;4549:23;4545:32;4542:52;;;4590:1;4587;4580:12;4542:52;4629:9;4616:23;4648:31;4673:5;4648:31;:::i;:::-;4698:5;4462:247;-1:-1:-1;;;4462:247:1:o;4714:388::-;4782:6;4790;4843:2;4831:9;4822:7;4818:23;4814:32;4811:52;;;4859:1;4856;4849:12;4811:52;4898:9;4885:23;4917:31;4942:5;4917:31;:::i;:::-;4967:5;-1:-1:-1;5024:2:1;5009:18;;4996:32;5037:33;4996:32;5037:33;:::i;5107:127::-;5168:10;5163:3;5159:20;5156:1;5149:31;5199:4;5196:1;5189:15;5223:4;5220:1;5213:15;5239:125;5304:9;;;5325:10;;;5322:36;;;5338:18;;:::i;5369:380::-;5448:1;5444:12;;;;5491;;;5512:61;;5566:4;5558:6;5554:17;5544:27;;5512:61;5619:2;5611:6;5608:14;5588:18;5585:38;5582:161;;5665:10;5660:3;5656:20;5653:1;5646:31;5700:4;5697:1;5690:15;5728:4;5725:1;5718:15;5582:161;;5369:380;;;:::o;5754:168::-;5827:9;;;5858;;5875:15;;;5869:22;;5855:37;5845:71;;5896:18;;:::i;5927:217::-;5967:1;5993;5983:132;;6037:10;6032:3;6028:20;6025:1;6018:31;6072:4;6069:1;6062:15;6100:4;6097:1;6090:15;5983:132;-1:-1:-1;6129:9:1;;5927:217::o;6428:287::-;6557:3;6595:6;6589:13;6611:66;6670:6;6665:3;6658:4;6650:6;6646:17;6611:66;:::i;:::-;6693:16;;;;;6428:287;-1:-1:-1;;6428:287:1:o;6720:245::-;6787:6;6840:2;6828:9;6819:7;6815:23;6811:32;6808:52;;;6856:1;6853;6846:12;6808:52;6888:9;6882:16;6907:28;6929:5;6907:28;:::i;9873:128::-;9940:9;;;9961:11;;;9958:37;;;9975:18;;:::i;11223:127::-;11284:10;11279:3;11275:20;11272:1;11265:31;11315:4;11312:1;11305:15;11339:4;11336:1;11329:15;11355:127;11416:10;11411:3;11407:20;11404:1;11397:31;11447:4;11444:1;11437:15;11471:4;11468:1;11461:15;11487:251;11557:6;11610:2;11598:9;11589:7;11585:23;11581:32;11578:52;;;11626:1;11623;11616:12;11578:52;11658:9;11652:16;11677:31;11702:5;11677:31;:::i;11743:461::-;11796:3;11834:5;11828:12;11861:6;11856:3;11849:19;11887:4;11916:2;11911:3;11907:12;11900:19;;11953:2;11946:5;11942:14;11974:1;11984:195;11998:6;11995:1;11992:13;11984:195;;;12063:13;;-1:-1:-1;;;;;12059:39:1;12047:52;;12119:12;;;;12154:15;;;;12095:1;12013:9;11984:195;;;-1:-1:-1;12195:3:1;;11743:461;-1:-1:-1;;;;;11743:461:1:o;12209:332::-;12416:6;12405:9;12398:25;12459:2;12454;12443:9;12439:18;12432:30;12379:4;12479:56;12531:2;12520:9;12516:18;12508:6;12479:56;:::i;:::-;12471:64;12209:332;-1:-1:-1;;;;12209:332:1:o;12546:1105::-;12641:6;12672:2;12715;12703:9;12694:7;12690:23;12686:32;12683:52;;;12731:1;12728;12721:12;12683:52;12764:9;12758:16;12793:18;12834:2;12826:6;12823:14;12820:34;;;12850:1;12847;12840:12;12820:34;12888:6;12877:9;12873:22;12863:32;;12933:7;12926:4;12922:2;12918:13;12914:27;12904:55;;12955:1;12952;12945:12;12904:55;12984:2;12978:9;13006:2;13002;12999:10;12996:36;;;13012:18;;:::i;:::-;13058:2;13055:1;13051:10;13090:2;13084:9;13153:2;13149:7;13144:2;13140;13136:11;13132:25;13124:6;13120:38;13208:6;13196:10;13193:22;13188:2;13176:10;13173:18;13170:46;13167:72;;;13219:18;;:::i;:::-;13255:2;13248:22;13305:18;;;13339:15;;;;-1:-1:-1;13381:11:1;;;13377:20;;;13409:19;;;13406:39;;;13441:1;13438;13431:12;13406:39;13465:11;;;;13485:135;13501:6;13496:3;13493:15;13485:135;;;13567:10;;13555:23;;13518:12;;;;13598;;;;13485:135;;;13639:6;12546:1105;-1:-1:-1;;;;;;;;12546:1105:1:o;13656:574::-;13947:6;13936:9;13929:25;13990:6;13985:2;13974:9;13970:18;13963:34;14033:3;14028:2;14017:9;14013:18;14006:31;13910:4;14054:57;14106:3;14095:9;14091:19;14083:6;14054:57;:::i;:::-;-1:-1:-1;;;;;14147:32:1;;;;14142:2;14127:18;;14120:60;-1:-1:-1;14211:3:1;14196:19;14189:35;14046:65;13656:574;-1:-1:-1;;;13656:574:1:o

Swarm Source

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