ETH Price: $3,495.43 (+0.63%)
 

Overview

Max Total Supply

1,000,000,000 BOOMER

Holders

2,371,287

Total Transfers

-

Market

Price

$0.02 @ 0.000006 ETH (+11.69%)

Onchain Market Cap

$20,505,790.70

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

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

Market

Volume (24H):$372,375.73
Market Capitalization:$0.00
Circulating Supply:0.00 BOOMER
Market Data Source: Coinmarketcap

Contract Source Code Verified (Exact Match)

Contract Name:
BOOMER

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at basescan.org on 2024-03-25
*/

// SPDX-License-Identifier: UNLICENSED


/* 

Onboarding the boomers to Base, one dad joke at a time.

Your Dad's favourite memecoin. $BOOMER on Base.


https://twitter.com/BoomerOnBase
https://t.me/boomeronbase
https://boomeronbase.com/

*/ 

pragma solidity 0.8.20;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.https://dexscreener.com/base/0x179e3e685b08202bc1afcfeec6b7e3f5577653e1
     */
    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);
}

// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;

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

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

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

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity >=0.6.2;

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

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

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

// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

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

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

        emit Transfer(from, to, value);
    }

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

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

    /**
     * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

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

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

pragma solidity ^0.8.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.
 *
 * 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);
    }
}

pragma solidity >=0.5.0;

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

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

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

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

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

pragma solidity >=0.6.2;

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

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

contract BOOMER is ERC20 ("Boomer", "BOOMER"), Ownable {

    // Uniswap variables
    IUniswapV2Factory public constant UNISWAP_FACTORY =
    IUniswapV2Factory(0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6);

    IUniswapV2Router02 public constant UNISWAP_ROUTER = 
    IUniswapV2Router02(0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24);

    address public immutable UNISWAP_V2_PAIR;

    uint256 constant TOTAL_SUPPLY = 1_000_000_000 ether;
    uint256 public tradingOpenedOnBlock;

    bool private swapping;

    address public devWallet;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;
    bool public fetchFees = true;

    uint256 public maxBuy;
    uint256 public maxSell;
    uint256 public maxWallet;
    uint256 public tokenSwapThreshold;

    uint256 public buyTotalFees;
    uint256 public sellTotalFees;

    uint256 public taxedTokens;

    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public _isExcludedMaxTransactionAmount;
    mapping(address => bool) public whitelisted;

    event EnabledTrading(bool tradingActive);
    event RemovedLimits();
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event UpdatedMaxBuy(uint256 newAmount);
    event UpdatedMaxSell(uint256 newAmount);
    event UpdatedMaxWallet(uint256 newAmount);
    event UpdateddevWallet(address indexed newWallet);
    event MaxTransactionExclusion(address _address, bool excluded);

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    constructor(){

        _mint(msg.sender, TOTAL_SUPPLY);

        _approve(address(this), address(UNISWAP_ROUTER), ~uint256(0));

        _excludeFromMaxTransaction(address(UNISWAP_ROUTER), true);

    
        UNISWAP_V2_PAIR = UNISWAP_FACTORY.createPair(
            address(this),
            UNISWAP_ROUTER.WETH()
        );

        maxBuy = (totalSupply() * 20) / 1_000; 
        maxSell = (totalSupply() * 18) / 1_000; 
        maxWallet = (totalSupply() * 20) / 1_000; 
        tokenSwapThreshold = (totalSupply() * 50) / 10_000;

        devWallet = msg.sender;

        _excludeFromMaxTransaction(msg.sender, true);
        _excludeFromMaxTransaction(address(this), true);
        _excludeFromMaxTransaction(address(0xdead), true);
        excludeFromFees(msg.sender, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
    }

    receive() external payable {}


    function updateMaxBuy(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 1) / 1_000),
            "ERROR: Cannot set max buy amount lower than 0.1%"
        );
        maxBuy = newNum;
        emit UpdatedMaxBuy(maxBuy);
    }

    function updateMaxSell(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 1) / 1_000),
            "ERROR: Cannot set max sell amount lower than 0.1%"
        );
        maxSell = newNum;
        emit UpdatedMaxSell(maxSell);
    }

    function updateMaxWallet(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 3) / 1_000),
            "ERROR: cant set max wallet amount lower than 0.3%"
        );
        maxWallet = newNum;
        emit UpdatedMaxWallet(maxWallet);
    }

    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner {
        require(
            newAmount >= (totalSupply() * 1) / 100_000,
            "ERROR: Swap amount cant be lower than 0.001% total supply."
        );
    
        tokenSwapThreshold = newAmount;
    }

    function removeLimits() external onlyOwner {
        limitsInEffect = false;
        emit RemovedLimits();
    }

    function _excludeFromMaxTransaction(
        address updAds,
        bool isExcluded
    ) private {
        _isExcludedMaxTransactionAmount[updAds] = isExcluded;
        emit MaxTransactionExclusion(updAds, isExcluded);
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function setNewFees(uint256 newBuyFees, uint256 newSellFees) external onlyOwner {
    buyTotalFees = newBuyFees;
    sellTotalFees = newSellFees;
    }

    function openTrading() public onlyOwner {
        require(tradingOpenedOnBlock == 0, "ERROR: Token is already live !");
        tradingOpenedOnBlock = block.number;
        tradingActive = true;
        swapEnabled = true;
        emit EnabledTrading(tradingActive);
    }

    function setdevWallet(address _devWallet) external onlyOwner {
        require(_devWallet != address(0), "ERROR: _devWallet address cannot be 0");
        devWallet = payable(_devWallet);
        emit UpdateddevWallet(_devWallet);
    }

    function getFees() internal {
        require(
            tradingOpenedOnBlock > 0, "Trading not live"
        );
        uint256 currentBlock = block.number;
        uint256 lastTierOneBlock = tradingOpenedOnBlock + 7;
        if(currentBlock <= lastTierOneBlock) {
            buyTotalFees = 0;
            sellTotalFees = 0;
        } else {
            buyTotalFees = 0;
            sellTotalFees = 0;
            fetchFees = false;
        } 
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from 0");
        require(to != address(0), "ERC20: transfer to 0");
        require(amount > 0, "amt must be over than 0");

        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead)
            ) {
                if (!tradingActive) {
                    require(
                        _isExcludedMaxTransactionAmount[from] ||
                            _isExcludedMaxTransactionAmount[to],
                        "ERROR: Trading is not active."
                    );
                    require(from == owner(), "ERROR: Trading enabled");
                }

                //when buy
                if (
                    from == UNISWAP_V2_PAIR && !_isExcludedMaxTransactionAmount[to]
                ) {
                    require(
                        amount <= maxBuy,
                        "ERROR: Buy transfer amount goes past max buy."
                    );
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "ERROR: Cannot pass max wallet"
                    );
                }
                //when sell
                else if (
                    to == UNISWAP_V2_PAIR && !_isExcludedMaxTransactionAmount[from]
                ) {
                    require(
                        amount <= maxSell,
                        "ERROR: Sell amt goes past max sell."
                    );
                } else if (
                    !_isExcludedMaxTransactionAmount[to] &&
                    !_isExcludedMaxTransactionAmount[from]
                ) {
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "ERROR: Cannot go above max wallet"
                    );
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= tokenSwapThreshold;

        if (
            canSwap &&
            swapEnabled &&
            !swapping &&
            !(from == UNISWAP_V2_PAIR) &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;
            swapBack();
            swapping = false;
        }

        bool takeFee = true;
    
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        uint256 fees = 0;
    

        if (takeFee) {

            if(fetchFees){
               getFees(); 
            }

            // Sell
            if (to == UNISWAP_V2_PAIR && sellTotalFees > 0) {
                fees = (amount * sellTotalFees) / 100;
                taxedTokens += fees;
            }
            // Buy
            else if (from == UNISWAP_V2_PAIR && buyTotalFees > 0) {
                fees = (amount * buyTotalFees) / 100;
                taxedTokens += fees;
            }

            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }

            amount -= fees;
        }

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


    function swapTokensForEth(uint256 tokenAmount) private {
        
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = UNISWAP_ROUTER.WETH();

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

    function swapBack() private {

      
        uint256 contractBalance = balanceOf(address(this));

        uint256 totalTokensToSwap =  taxedTokens;

        if (contractBalance == 0 || totalTokensToSwap == 0) {
            return;
        }

        if (contractBalance > tokenSwapThreshold) {
            contractBalance = tokenSwapThreshold;
        }

        bool success;
    
        swapTokensForEth(contractBalance);

        (success, ) = address(devWallet).call{value: address(this).balance}("");
    }

    function rescueETH(uint256 weiAmount) external onlyOwner {
    require(weiAmount > 0, "Amount must b over 0");
    payable(owner()).transfer(weiAmount);
}

function rescueERC20(address tokenAdd, uint256 amount) external onlyOwner {
    require(tokenAdd != address(0), "wrong token address");
    require(amount > 0, "Amount must be > 0");

    IERC20(tokenAdd).transfer(owner(), amount);
}
    


}

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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"tradingActive","type":"bool"}],"name":"EnabledTrading","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"MaxTransactionExclusion","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":[],"name":"RemovedLimits","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxBuy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxSell","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdatedMaxWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"UpdateddevWallet","type":"event"},{"inputs":[],"name":"UNISWAP_FACTORY","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNISWAP_ROUTER","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNISWAP_V2_PAIR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fetchFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAdd","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBuyFees","type":"uint256"},{"internalType":"uint256","name":"newSellFees","type":"uint256"}],"name":"setNewFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devWallet","type":"address"}],"name":"setdevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenSwapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingOpenedOnBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526007805463ffffffff60a81b1916630100000160a81b17905534801562000029575f80fd5b50604051806040016040528060068152602001652137b7b6b2b960d11b815250604051806040016040528060068152602001652127a7a6a2a960d11b8152508160039081620000799190620007a8565b506004620000888282620007a8565b505050620000a56200009f6200033060201b60201c565b62000334565b620000bd336b033b2e3c9fd0803ce800000062000385565b620000df30734752ba5dbc23f44d87826276bf6fd6b1c372ad245f19620003c5565b62000100734752ba5dbc23f44d87826276bf6fd6b1c372ad246001620003d9565b738909dc15e40173ff4699343b6eb8132c65e18ec66001600160a01b031663c9c6539630734752ba5dbc23f44d87826276bf6fd6b1c372ad246001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000175573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200019b919062000870565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af1158015620001e6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200020c919062000870565b6001600160a01b03166080526103e86200022560025490565b62000232906014620008b3565b6200023e9190620008d3565b6008556103e86200024e60025490565b6200025b906012620008b3565b620002679190620008d3565b6009556103e86200027760025490565b62000284906014620008b3565b620002909190620008d3565b600a55612710620002a060025490565b620002ad906032620008b3565b620002b99190620008d3565b600b5560078054610100600160a81b03191633610100810291909117909155620002e5906001620003d9565b620002f2306001620003d9565b6200030161dead6001620003d9565b6200030e3360016200043b565b6200031b3060016200043b565b6200032a61dead60016200043b565b62000909565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038216620003b45760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b620003c15f8383620004a3565b5050565b620003d48383836001620005d2565b505050565b6001600160a01b0382165f81815260106020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b62000445620006ab565b6001600160a01b0382165f818152600f6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038316620004d1578060025f828254620004c59190620008f3565b90915550620005439050565b6001600160a01b0383165f9081526020819052604090205481811015620005255760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620003ab565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821662000561576002805482900390556200057f565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620005c591815260200190565b60405180910390a3505050565b6001600160a01b038416620005fd5760405163e602df0560e01b81525f6004820152602401620003ab565b6001600160a01b0383166200062857604051634a1406b160e11b81525f6004820152602401620003ab565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015620006a557826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516200069c91815260200190565b60405180910390a35b50505050565b6005546001600160a01b03163314620007075760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620003ab565b565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200073257607f821691505b6020821081036200075157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620003d4575f81815260208120601f850160051c810160208610156200077f5750805b601f850160051c820191505b81811015620007a0578281556001016200078b565b505050505050565b81516001600160401b03811115620007c457620007c462000709565b620007dc81620007d584546200071d565b8462000757565b602080601f83116001811462000812575f8415620007fa5750858301515b5f19600386901b1c1916600185901b178555620007a0565b5f85815260208120601f198616915b82811015620008425788860151825594840194600190910190840162000821565b50858210156200086057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121562000881575f80fd5b81516001600160a01b038116811462000898575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417620008cd57620008cd6200089f565b92915050565b5f82620008ee57634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115620008cd57620008cd6200089f565b60805161207b620009455f395f8181610743015281816112ff0152818161143d015281816115fd0152818161170a0152611789015261207b5ff3fe608060405260043610610241575f3560e01c80638da5cb5b11610134578063c0246668116100b3578063d85ba06311610078578063d85ba0631461068c578063d936547e146106a1578063dd62ed3e146106cf578063f2fde38b14610713578063f40acc3d14610732578063f8b45b0514610765575f80fd5b8063c0246668146105ec578063c74c0fac1461060b578063c9567bf914610632578063d257b34f14610646578063d826492014610665575f80fd5b80639e252f00116100f95780639e252f001461055a578063a9059cbb14610579578063b8eb354614610598578063baccf5cf146105ad578063bbc0c742146105cc575f80fd5b80638da5cb5b146104b35780638ea5220f146104e45780639164f9db1461050857806395d89b411461052757806395f4d0881461053b575f80fd5b806358881304116101c057806370db69d61161018557806370db69d614610442578063715018a614610457578063751039fc1461046b57806376d628b71461047f5780638cd4426d14610494575f80fd5b8063588813041461039a5780636057b3eb146103b95780636a486a8e146103d95780636ddd1713146103ee57806370a082311461040e575f80fd5b806318160ddd1161020657806318160ddd1461030b5780631c499ab01461031f57806323b872dd14610340578063313ce5671461035f5780634a62bb651461037a575f80fd5b806306fdde031461024c578063095ea7b3146102765780630a3b39a3146102a55780630e300099146102c857806310d5de53146102dd575f80fd5b3661024857005b5f80fd5b348015610257575f80fd5b5061026061077a565b60405161026d9190611d54565b60405180910390f35b348015610281575f80fd5b50610295610290366004611db3565b61080a565b604051901515815260200161026d565b3480156102b0575f80fd5b506102ba60065481565b60405190815260200161026d565b3480156102d3575f80fd5b506102ba600b5481565b3480156102e8575f80fd5b506102956102f7366004611ddd565b60106020525f908152604090205460ff1681565b348015610316575f80fd5b506002546102ba565b34801561032a575f80fd5b5061033e610339366004611dff565b610823565b005b34801561034b575f80fd5b5061029561035a366004611e16565b6108f6565b34801561036a575f80fd5b506040516012815260200161026d565b348015610385575f80fd5b5060075461029590600160a81b900460ff1681565b3480156103a5575f80fd5b5061033e6103b4366004611dff565b610919565b3480156103c4575f80fd5b5060075461029590600160c01b900460ff1681565b3480156103e4575f80fd5b506102ba600d5481565b3480156103f9575f80fd5b5060075461029590600160b81b900460ff1681565b348015610419575f80fd5b506102ba610428366004611ddd565b6001600160a01b03165f9081526020819052604090205490565b34801561044d575f80fd5b506102ba60085481565b348015610462575f80fd5b5061033e6109df565b348015610476575f80fd5b5061033e6109f2565b34801561048a575f80fd5b506102ba600e5481565b34801561049f575f80fd5b5061033e6104ae366004611db3565b610a31565b3480156104be575f80fd5b506005546001600160a01b03165b6040516001600160a01b03909116815260200161026d565b3480156104ef575f80fd5b506007546104cc9061010090046001600160a01b031681565b348015610513575f80fd5b5061033e610522366004611dff565b610b5d565b348015610532575f80fd5b50610260610c24565b348015610546575f80fd5b5061033e610555366004611ddd565b610c33565b348015610565575f80fd5b5061033e610574366004611dff565b610cf0565b348015610584575f80fd5b50610295610593366004611db3565b610d79565b3480156105a3575f80fd5b506102ba60095481565b3480156105b8575f80fd5b5061033e6105c7366004611e54565b610d86565b3480156105d7575f80fd5b5060075461029590600160b01b900460ff1681565b3480156105f7575f80fd5b5061033e610606366004611e81565b610d99565b348015610616575f80fd5b506104cc738909dc15e40173ff4699343b6eb8132c65e18ec681565b34801561063d575f80fd5b5061033e610dff565b348015610651575f80fd5b5061033e610660366004611dff565b610eb5565b348015610670575f80fd5b506104cc734752ba5dbc23f44d87826276bf6fd6b1c372ad2481565b348015610697575f80fd5b506102ba600c5481565b3480156106ac575f80fd5b506102956106bb366004611ddd565b60116020525f908152604090205460ff1681565b3480156106da575f80fd5b506102ba6106e9366004611eb8565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b34801561071e575f80fd5b5061033e61072d366004611ddd565b610f59565b34801561073d575f80fd5b506104cc7f000000000000000000000000000000000000000000000000000000000000000081565b348015610770575f80fd5b506102ba600a5481565b60606003805461078990611ee4565b80601f01602080910402602001604051908101604052809291908181526020018280546107b590611ee4565b80156108005780601f106107d757610100808354040283529160200191610800565b820191905f5260205f20905b8154815290600101906020018083116107e357829003601f168201915b5050505050905090565b5f33610817818585610fd2565b60019150505b92915050565b61082b610fdf565b6103e861083760025490565b610842906003611f30565b61084c9190611f47565b8110156108ba5760405162461bcd60e51b815260206004820152603160248201527f4552524f523a2063616e7420736574206d61782077616c6c657420616d6f756e60448201527074206c6f776572207468616e20302e332560781b60648201526084015b60405180910390fd5b600a8190556040518181527f3046ad62de8b70d396246aaed19ff2559ff20df8706520cbde58320766c42762906020015b60405180910390a150565b5f33610903858285611039565b61090e8585856110b4565b506001949350505050565b610921610fdf565b6103e861092d60025490565b610938906001611f30565b6109429190611f47565b8110156109aa5760405162461bcd60e51b815260206004820152603060248201527f4552524f523a2043616e6e6f7420736574206d61782062757920616d6f756e7460448201526f206c6f776572207468616e20302e312560801b60648201526084016108b1565b60088190556040518181527fc33b8db52e9d66d369a22d8f3a3add75239d75a591361da3ee15972003b2e438906020016108eb565b6109e7610fdf565b6109f05f611833565b565b6109fa610fdf565b6007805460ff60a81b191690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c905f90a1565b610a39610fdf565b6001600160a01b038216610a855760405162461bcd60e51b815260206004820152601360248201527277726f6e6720746f6b656e206164647265737360681b60448201526064016108b1565b5f8111610ac95760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b60448201526064016108b1565b816001600160a01b031663a9059cbb610aea6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af1158015610b34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b589190611f66565b505050565b610b65610fdf565b6103e8610b7160025490565b610b7c906001611f30565b610b869190611f47565b811015610bef5760405162461bcd60e51b815260206004820152603160248201527f4552524f523a2043616e6e6f7420736574206d61782073656c6c20616d6f756e60448201527074206c6f776572207468616e20302e312560781b60648201526084016108b1565b60098190556040518181527fb9e766275e735601d70cbcec66214efa3a1fc0ae7db7746c15bce599c16b82f8906020016108eb565b60606004805461078990611ee4565b610c3b610fdf565b6001600160a01b038116610c9f5760405162461bcd60e51b815260206004820152602560248201527f4552524f523a205f64657657616c6c657420616464726573732063616e6e6f74604482015264020626520360dc1b60648201526084016108b1565b60078054610100600160a81b0319166101006001600160a01b038416908102919091179091556040517fb75966e834e60264116d09cee829cfd3805c2087c666d2992dfa4bfb9214e2ae905f90a250565b610cf8610fdf565b5f8111610d3e5760405162461bcd60e51b81526020600482015260146024820152730416d6f756e74206d7573742062206f76657220360641b60448201526064016108b1565b6005546040516001600160a01b039091169082156108fc029083905f818181858888f19350505050158015610d75573d5f803e3d5ffd5b5050565b5f336108178185856110b4565b610d8e610fdf565b600c91909155600d55565b610da1610fdf565b6001600160a01b0382165f818152600f6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b610e07610fdf565b60065415610e575760405162461bcd60e51b815260206004820152601e60248201527f4552524f523a20546f6b656e20697320616c7265616479206c6976652021000060448201526064016108b1565b436006556007805461010160b01b61ffff60b01b199091161790819055604051600160b01b90910460ff16151581527fe8a59d3db38e5220ac9d0f72590b7ac876e0916dc8f4db3e7614e6f91fe520899060200160405180910390a1565b610ebd610fdf565b620186a0610eca60025490565b610ed5906001611f30565b610edf9190611f47565b811015610f545760405162461bcd60e51b815260206004820152603a60248201527f4552524f523a205377617020616d6f756e742063616e74206265206c6f77657260448201527f207468616e20302e3030312520746f74616c20737570706c792e00000000000060648201526084016108b1565b600b55565b610f61610fdf565b6001600160a01b038116610fc65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108b1565b610fcf81611833565b50565b610b588383836001611884565b6005546001600160a01b031633146109f05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108b1565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f1981146110ae57818110156110a057604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016108b1565b6110ae84848484035f611884565b50505050565b6001600160a01b0383166111035760405162461bcd60e51b8152602060048201526016602482015275045524332303a207472616e736665722066726f6d20360541b60448201526064016108b1565b6001600160a01b0382166111505760405162461bcd60e51b8152602060048201526014602482015273045524332303a207472616e7366657220746f20360641b60448201526064016108b1565b5f811161119f5760405162461bcd60e51b815260206004820152601760248201527f616d74206d757374206265206f766572207468616e203000000000000000000060448201526064016108b1565b600754600160a81b900460ff16156115b9576005546001600160a01b038481169116148015906111dd57506005546001600160a01b03838116911614155b80156111f157506001600160a01b03821615155b801561120857506001600160a01b03821661dead14155b156115b957600754600160b01b900460ff166112fd576001600160a01b0383165f9081526010602052604090205460ff168061125b57506001600160a01b0382165f9081526010602052604090205460ff165b6112a75760405162461bcd60e51b815260206004820152601d60248201527f4552524f523a2054726164696e67206973206e6f74206163746976652e00000060448201526064016108b1565b6005546001600160a01b038481169116146112fd5760405162461bcd60e51b815260206004820152601660248201527511549493d48e88151c98591a5b99c8195b98589b195960521b60448201526064016108b1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614801561135657506001600160a01b0382165f9081526010602052604090205460ff16155b1561143b576008548111156113c35760405162461bcd60e51b815260206004820152602d60248201527f4552524f523a20427579207472616e7366657220616d6f756e7420676f65732060448201526c3830b9ba1036b0bc10313abc9760991b60648201526084016108b1565b600a546001600160a01b0383165f908152602081905260409020546113e89083611f81565b11156114365760405162461bcd60e51b815260206004820152601d60248201527f4552524f523a2043616e6e6f742070617373206d61782077616c6c657400000060448201526064016108b1565b6115b9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614801561149457506001600160a01b0383165f9081526010602052604090205460ff16155b156114f7576009548111156114365760405162461bcd60e51b815260206004820152602360248201527f4552524f523a2053656c6c20616d7420676f65732070617374206d617820736560448201526236361760e91b60648201526084016108b1565b6001600160a01b0382165f9081526010602052604090205460ff1615801561153757506001600160a01b0383165f9081526010602052604090205460ff16155b156115b957600a546001600160a01b0383165f908152602081905260409020546115619083611f81565b11156115b95760405162461bcd60e51b815260206004820152602160248201527f4552524f523a2043616e6e6f7420676f2061626f7665206d61782077616c6c656044820152601d60fa1b60648201526084016108b1565b305f90815260208190526040902054600b54811080159081906115e55750600754600160b81b900460ff165b80156115f4575060075460ff16155b801561163257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b801561165657506001600160a01b0385165f908152600f602052604090205460ff16155b801561167a57506001600160a01b0384165f908152600f602052604090205460ff16155b1561169f576007805460ff19166001179055611694611956565b6007805460ff191690555b6001600160a01b0385165f908152600f602052604090205460019060ff16806116df57506001600160a01b0385165f908152600f602052604090205460ff165b156116e757505f5b5f811561181f57600754600160c01b900460ff1615611708576117086119f1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614801561174a57505f600d54115b15611787576064600d548661175f9190611f30565b6117699190611f47565b905080600e5f82825461177c9190611f81565b909155506118019050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b03161480156117c957505f600c54115b15611801576064600c54866117de9190611f30565b6117e89190611f47565b905080600e5f8282546117fb9190611f81565b90915550505b801561181257611812873083611a77565b61181c8186611f94565b94505b61182a878787611a77565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0384166118ad5760405163e602df0560e01b81525f60048201526024016108b1565b6001600160a01b0383166118d657604051634a1406b160e11b81525f60048201526024016108b1565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156110ae57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161194891815260200190565b60405180910390a350505050565b305f90815260208190526040902054600e54811580611973575080155b1561197c575050565b600b5482111561198c57600b5491505b5f61199683611ad4565b6007546040516101009091046001600160a01b03169047905f81818185875af1925050503d805f81146119e4576040519150601f19603f3d011682016040523d82523d5f602084013e6119e9565b606091505b505050505050565b5f60065411611a355760405162461bcd60e51b815260206004820152601060248201526f54726164696e67206e6f74206c69766560801b60448201526064016108b1565b60065443905f90611a47906007611f81565b9050808211611a5d575f600c819055600d555050565b5f600c819055600d556007805460ff60c01b191690555050565b6001600160a01b038316611aa057604051634b637e8f60e11b81525f60048201526024016108b1565b6001600160a01b038216611ac95760405163ec442f0560e01b81525f60048201526024016108b1565b610b58838383611c2e565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611b0757611b07611fa7565b60200260200101906001600160a01b031690816001600160a01b031681525050734752ba5dbc23f44d87826276bf6fd6b1c372ad246001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b9b9190611fbb565b81600181518110611bae57611bae611fa7565b6001600160a01b039092166020928302919091019091015260405163791ac94760e01b8152734752ba5dbc23f44d87826276bf6fd6b1c372ad249063791ac94790611c059085905f90869030904290600401611fd6565b5f604051808303815f87803b158015611c1c575f80fd5b505af11580156119e9573d5f803e3d5ffd5b6001600160a01b038316611c58578060025f828254611c4d9190611f81565b90915550611cc89050565b6001600160a01b0383165f9081526020819052604090205481811015611caa5760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016108b1565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216611ce457600280548290039055611d02565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611d4791815260200190565b60405180910390a3505050565b5f6020808352835180828501525f5b81811015611d7f57858101830151858201604001528201611d63565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610fcf575f80fd5b5f8060408385031215611dc4575f80fd5b8235611dcf81611d9f565b946020939093013593505050565b5f60208284031215611ded575f80fd5b8135611df881611d9f565b9392505050565b5f60208284031215611e0f575f80fd5b5035919050565b5f805f60608486031215611e28575f80fd5b8335611e3381611d9f565b92506020840135611e4381611d9f565b929592945050506040919091013590565b5f8060408385031215611e65575f80fd5b50508035926020909101359150565b8015158114610fcf575f80fd5b5f8060408385031215611e92575f80fd5b8235611e9d81611d9f565b91506020830135611ead81611e74565b809150509250929050565b5f8060408385031215611ec9575f80fd5b8235611ed481611d9f565b91506020830135611ead81611d9f565b600181811c90821680611ef857607f821691505b602082108103611f1657634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761081d5761081d611f1c565b5f82611f6157634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215611f76575f80fd5b8151611df881611e74565b8082018082111561081d5761081d611f1c565b8181038181111561081d5761081d611f1c565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611fcb575f80fd5b8151611df881611d9f565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b818110156120245784516001600160a01b031683529383019391830191600101611fff565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220b43eaba81d96c641b26a4fea5ec092dc2676d4eaed97b4582fa97e12cb7fb63564736f6c63430008140033

Deployed Bytecode

0x608060405260043610610241575f3560e01c80638da5cb5b11610134578063c0246668116100b3578063d85ba06311610078578063d85ba0631461068c578063d936547e146106a1578063dd62ed3e146106cf578063f2fde38b14610713578063f40acc3d14610732578063f8b45b0514610765575f80fd5b8063c0246668146105ec578063c74c0fac1461060b578063c9567bf914610632578063d257b34f14610646578063d826492014610665575f80fd5b80639e252f00116100f95780639e252f001461055a578063a9059cbb14610579578063b8eb354614610598578063baccf5cf146105ad578063bbc0c742146105cc575f80fd5b80638da5cb5b146104b35780638ea5220f146104e45780639164f9db1461050857806395d89b411461052757806395f4d0881461053b575f80fd5b806358881304116101c057806370db69d61161018557806370db69d614610442578063715018a614610457578063751039fc1461046b57806376d628b71461047f5780638cd4426d14610494575f80fd5b8063588813041461039a5780636057b3eb146103b95780636a486a8e146103d95780636ddd1713146103ee57806370a082311461040e575f80fd5b806318160ddd1161020657806318160ddd1461030b5780631c499ab01461031f57806323b872dd14610340578063313ce5671461035f5780634a62bb651461037a575f80fd5b806306fdde031461024c578063095ea7b3146102765780630a3b39a3146102a55780630e300099146102c857806310d5de53146102dd575f80fd5b3661024857005b5f80fd5b348015610257575f80fd5b5061026061077a565b60405161026d9190611d54565b60405180910390f35b348015610281575f80fd5b50610295610290366004611db3565b61080a565b604051901515815260200161026d565b3480156102b0575f80fd5b506102ba60065481565b60405190815260200161026d565b3480156102d3575f80fd5b506102ba600b5481565b3480156102e8575f80fd5b506102956102f7366004611ddd565b60106020525f908152604090205460ff1681565b348015610316575f80fd5b506002546102ba565b34801561032a575f80fd5b5061033e610339366004611dff565b610823565b005b34801561034b575f80fd5b5061029561035a366004611e16565b6108f6565b34801561036a575f80fd5b506040516012815260200161026d565b348015610385575f80fd5b5060075461029590600160a81b900460ff1681565b3480156103a5575f80fd5b5061033e6103b4366004611dff565b610919565b3480156103c4575f80fd5b5060075461029590600160c01b900460ff1681565b3480156103e4575f80fd5b506102ba600d5481565b3480156103f9575f80fd5b5060075461029590600160b81b900460ff1681565b348015610419575f80fd5b506102ba610428366004611ddd565b6001600160a01b03165f9081526020819052604090205490565b34801561044d575f80fd5b506102ba60085481565b348015610462575f80fd5b5061033e6109df565b348015610476575f80fd5b5061033e6109f2565b34801561048a575f80fd5b506102ba600e5481565b34801561049f575f80fd5b5061033e6104ae366004611db3565b610a31565b3480156104be575f80fd5b506005546001600160a01b03165b6040516001600160a01b03909116815260200161026d565b3480156104ef575f80fd5b506007546104cc9061010090046001600160a01b031681565b348015610513575f80fd5b5061033e610522366004611dff565b610b5d565b348015610532575f80fd5b50610260610c24565b348015610546575f80fd5b5061033e610555366004611ddd565b610c33565b348015610565575f80fd5b5061033e610574366004611dff565b610cf0565b348015610584575f80fd5b50610295610593366004611db3565b610d79565b3480156105a3575f80fd5b506102ba60095481565b3480156105b8575f80fd5b5061033e6105c7366004611e54565b610d86565b3480156105d7575f80fd5b5060075461029590600160b01b900460ff1681565b3480156105f7575f80fd5b5061033e610606366004611e81565b610d99565b348015610616575f80fd5b506104cc738909dc15e40173ff4699343b6eb8132c65e18ec681565b34801561063d575f80fd5b5061033e610dff565b348015610651575f80fd5b5061033e610660366004611dff565b610eb5565b348015610670575f80fd5b506104cc734752ba5dbc23f44d87826276bf6fd6b1c372ad2481565b348015610697575f80fd5b506102ba600c5481565b3480156106ac575f80fd5b506102956106bb366004611ddd565b60116020525f908152604090205460ff1681565b3480156106da575f80fd5b506102ba6106e9366004611eb8565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b34801561071e575f80fd5b5061033e61072d366004611ddd565b610f59565b34801561073d575f80fd5b506104cc7f000000000000000000000000a926342d7f9324a1dbde8f5ab77c92706f289b5d81565b348015610770575f80fd5b506102ba600a5481565b60606003805461078990611ee4565b80601f01602080910402602001604051908101604052809291908181526020018280546107b590611ee4565b80156108005780601f106107d757610100808354040283529160200191610800565b820191905f5260205f20905b8154815290600101906020018083116107e357829003601f168201915b5050505050905090565b5f33610817818585610fd2565b60019150505b92915050565b61082b610fdf565b6103e861083760025490565b610842906003611f30565b61084c9190611f47565b8110156108ba5760405162461bcd60e51b815260206004820152603160248201527f4552524f523a2063616e7420736574206d61782077616c6c657420616d6f756e60448201527074206c6f776572207468616e20302e332560781b60648201526084015b60405180910390fd5b600a8190556040518181527f3046ad62de8b70d396246aaed19ff2559ff20df8706520cbde58320766c42762906020015b60405180910390a150565b5f33610903858285611039565b61090e8585856110b4565b506001949350505050565b610921610fdf565b6103e861092d60025490565b610938906001611f30565b6109429190611f47565b8110156109aa5760405162461bcd60e51b815260206004820152603060248201527f4552524f523a2043616e6e6f7420736574206d61782062757920616d6f756e7460448201526f206c6f776572207468616e20302e312560801b60648201526084016108b1565b60088190556040518181527fc33b8db52e9d66d369a22d8f3a3add75239d75a591361da3ee15972003b2e438906020016108eb565b6109e7610fdf565b6109f05f611833565b565b6109fa610fdf565b6007805460ff60a81b191690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c905f90a1565b610a39610fdf565b6001600160a01b038216610a855760405162461bcd60e51b815260206004820152601360248201527277726f6e6720746f6b656e206164647265737360681b60448201526064016108b1565b5f8111610ac95760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b60448201526064016108b1565b816001600160a01b031663a9059cbb610aea6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af1158015610b34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b589190611f66565b505050565b610b65610fdf565b6103e8610b7160025490565b610b7c906001611f30565b610b869190611f47565b811015610bef5760405162461bcd60e51b815260206004820152603160248201527f4552524f523a2043616e6e6f7420736574206d61782073656c6c20616d6f756e60448201527074206c6f776572207468616e20302e312560781b60648201526084016108b1565b60098190556040518181527fb9e766275e735601d70cbcec66214efa3a1fc0ae7db7746c15bce599c16b82f8906020016108eb565b60606004805461078990611ee4565b610c3b610fdf565b6001600160a01b038116610c9f5760405162461bcd60e51b815260206004820152602560248201527f4552524f523a205f64657657616c6c657420616464726573732063616e6e6f74604482015264020626520360dc1b60648201526084016108b1565b60078054610100600160a81b0319166101006001600160a01b038416908102919091179091556040517fb75966e834e60264116d09cee829cfd3805c2087c666d2992dfa4bfb9214e2ae905f90a250565b610cf8610fdf565b5f8111610d3e5760405162461bcd60e51b81526020600482015260146024820152730416d6f756e74206d7573742062206f76657220360641b60448201526064016108b1565b6005546040516001600160a01b039091169082156108fc029083905f818181858888f19350505050158015610d75573d5f803e3d5ffd5b5050565b5f336108178185856110b4565b610d8e610fdf565b600c91909155600d55565b610da1610fdf565b6001600160a01b0382165f818152600f6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b610e07610fdf565b60065415610e575760405162461bcd60e51b815260206004820152601e60248201527f4552524f523a20546f6b656e20697320616c7265616479206c6976652021000060448201526064016108b1565b436006556007805461010160b01b61ffff60b01b199091161790819055604051600160b01b90910460ff16151581527fe8a59d3db38e5220ac9d0f72590b7ac876e0916dc8f4db3e7614e6f91fe520899060200160405180910390a1565b610ebd610fdf565b620186a0610eca60025490565b610ed5906001611f30565b610edf9190611f47565b811015610f545760405162461bcd60e51b815260206004820152603a60248201527f4552524f523a205377617020616d6f756e742063616e74206265206c6f77657260448201527f207468616e20302e3030312520746f74616c20737570706c792e00000000000060648201526084016108b1565b600b55565b610f61610fdf565b6001600160a01b038116610fc65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108b1565b610fcf81611833565b50565b610b588383836001611884565b6005546001600160a01b031633146109f05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108b1565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f1981146110ae57818110156110a057604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016108b1565b6110ae84848484035f611884565b50505050565b6001600160a01b0383166111035760405162461bcd60e51b8152602060048201526016602482015275045524332303a207472616e736665722066726f6d20360541b60448201526064016108b1565b6001600160a01b0382166111505760405162461bcd60e51b8152602060048201526014602482015273045524332303a207472616e7366657220746f20360641b60448201526064016108b1565b5f811161119f5760405162461bcd60e51b815260206004820152601760248201527f616d74206d757374206265206f766572207468616e203000000000000000000060448201526064016108b1565b600754600160a81b900460ff16156115b9576005546001600160a01b038481169116148015906111dd57506005546001600160a01b03838116911614155b80156111f157506001600160a01b03821615155b801561120857506001600160a01b03821661dead14155b156115b957600754600160b01b900460ff166112fd576001600160a01b0383165f9081526010602052604090205460ff168061125b57506001600160a01b0382165f9081526010602052604090205460ff165b6112a75760405162461bcd60e51b815260206004820152601d60248201527f4552524f523a2054726164696e67206973206e6f74206163746976652e00000060448201526064016108b1565b6005546001600160a01b038481169116146112fd5760405162461bcd60e51b815260206004820152601660248201527511549493d48e88151c98591a5b99c8195b98589b195960521b60448201526064016108b1565b7f000000000000000000000000a926342d7f9324a1dbde8f5ab77c92706f289b5d6001600160a01b0316836001600160a01b031614801561135657506001600160a01b0382165f9081526010602052604090205460ff16155b1561143b576008548111156113c35760405162461bcd60e51b815260206004820152602d60248201527f4552524f523a20427579207472616e7366657220616d6f756e7420676f65732060448201526c3830b9ba1036b0bc10313abc9760991b60648201526084016108b1565b600a546001600160a01b0383165f908152602081905260409020546113e89083611f81565b11156114365760405162461bcd60e51b815260206004820152601d60248201527f4552524f523a2043616e6e6f742070617373206d61782077616c6c657400000060448201526064016108b1565b6115b9565b7f000000000000000000000000a926342d7f9324a1dbde8f5ab77c92706f289b5d6001600160a01b0316826001600160a01b031614801561149457506001600160a01b0383165f9081526010602052604090205460ff16155b156114f7576009548111156114365760405162461bcd60e51b815260206004820152602360248201527f4552524f523a2053656c6c20616d7420676f65732070617374206d617820736560448201526236361760e91b60648201526084016108b1565b6001600160a01b0382165f9081526010602052604090205460ff1615801561153757506001600160a01b0383165f9081526010602052604090205460ff16155b156115b957600a546001600160a01b0383165f908152602081905260409020546115619083611f81565b11156115b95760405162461bcd60e51b815260206004820152602160248201527f4552524f523a2043616e6e6f7420676f2061626f7665206d61782077616c6c656044820152601d60fa1b60648201526084016108b1565b305f90815260208190526040902054600b54811080159081906115e55750600754600160b81b900460ff165b80156115f4575060075460ff16155b801561163257507f000000000000000000000000a926342d7f9324a1dbde8f5ab77c92706f289b5d6001600160a01b0316856001600160a01b031614155b801561165657506001600160a01b0385165f908152600f602052604090205460ff16155b801561167a57506001600160a01b0384165f908152600f602052604090205460ff16155b1561169f576007805460ff19166001179055611694611956565b6007805460ff191690555b6001600160a01b0385165f908152600f602052604090205460019060ff16806116df57506001600160a01b0385165f908152600f602052604090205460ff165b156116e757505f5b5f811561181f57600754600160c01b900460ff1615611708576117086119f1565b7f000000000000000000000000a926342d7f9324a1dbde8f5ab77c92706f289b5d6001600160a01b0316866001600160a01b031614801561174a57505f600d54115b15611787576064600d548661175f9190611f30565b6117699190611f47565b905080600e5f82825461177c9190611f81565b909155506118019050565b7f000000000000000000000000a926342d7f9324a1dbde8f5ab77c92706f289b5d6001600160a01b0316876001600160a01b03161480156117c957505f600c54115b15611801576064600c54866117de9190611f30565b6117e89190611f47565b905080600e5f8282546117fb9190611f81565b90915550505b801561181257611812873083611a77565b61181c8186611f94565b94505b61182a878787611a77565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0384166118ad5760405163e602df0560e01b81525f60048201526024016108b1565b6001600160a01b0383166118d657604051634a1406b160e11b81525f60048201526024016108b1565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156110ae57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161194891815260200190565b60405180910390a350505050565b305f90815260208190526040902054600e54811580611973575080155b1561197c575050565b600b5482111561198c57600b5491505b5f61199683611ad4565b6007546040516101009091046001600160a01b03169047905f81818185875af1925050503d805f81146119e4576040519150601f19603f3d011682016040523d82523d5f602084013e6119e9565b606091505b505050505050565b5f60065411611a355760405162461bcd60e51b815260206004820152601060248201526f54726164696e67206e6f74206c69766560801b60448201526064016108b1565b60065443905f90611a47906007611f81565b9050808211611a5d575f600c819055600d555050565b5f600c819055600d556007805460ff60c01b191690555050565b6001600160a01b038316611aa057604051634b637e8f60e11b81525f60048201526024016108b1565b6001600160a01b038216611ac95760405163ec442f0560e01b81525f60048201526024016108b1565b610b58838383611c2e565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611b0757611b07611fa7565b60200260200101906001600160a01b031690816001600160a01b031681525050734752ba5dbc23f44d87826276bf6fd6b1c372ad246001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b9b9190611fbb565b81600181518110611bae57611bae611fa7565b6001600160a01b039092166020928302919091019091015260405163791ac94760e01b8152734752ba5dbc23f44d87826276bf6fd6b1c372ad249063791ac94790611c059085905f90869030904290600401611fd6565b5f604051808303815f87803b158015611c1c575f80fd5b505af11580156119e9573d5f803e3d5ffd5b6001600160a01b038316611c58578060025f828254611c4d9190611f81565b90915550611cc89050565b6001600160a01b0383165f9081526020819052604090205481811015611caa5760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016108b1565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216611ce457600280548290039055611d02565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611d4791815260200190565b60405180910390a3505050565b5f6020808352835180828501525f5b81811015611d7f57858101830151858201604001528201611d63565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610fcf575f80fd5b5f8060408385031215611dc4575f80fd5b8235611dcf81611d9f565b946020939093013593505050565b5f60208284031215611ded575f80fd5b8135611df881611d9f565b9392505050565b5f60208284031215611e0f575f80fd5b5035919050565b5f805f60608486031215611e28575f80fd5b8335611e3381611d9f565b92506020840135611e4381611d9f565b929592945050506040919091013590565b5f8060408385031215611e65575f80fd5b50508035926020909101359150565b8015158114610fcf575f80fd5b5f8060408385031215611e92575f80fd5b8235611e9d81611d9f565b91506020830135611ead81611e74565b809150509250929050565b5f8060408385031215611ec9575f80fd5b8235611ed481611d9f565b91506020830135611ead81611d9f565b600181811c90821680611ef857607f821691505b602082108103611f1657634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761081d5761081d611f1c565b5f82611f6157634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215611f76575f80fd5b8151611df881611e74565b8082018082111561081d5761081d611f1c565b8181038181111561081d5761081d611f1c565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611fcb575f80fd5b8151611df881611d9f565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b818110156120245784516001600160a01b031683529383019391830191600101611fff565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220b43eaba81d96c641b26a4fea5ec092dc2676d4eaed97b4582fa97e12cb7fb63564736f6c63430008140033

Deployed Bytecode Sourcemap

30548:10369:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16674:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18967:190;;;;;;;;;;-1:-1:-1;18967:190:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;18967:190:0;1023:187:1;31001:35:0;;;;;;;;;;;;;;;;;;;1361:25:1;;;1349:2;1334:18;31001:35:0;1215:177:1;31351:33:0;;;;;;;;;;;;;;;;31558:63;;;;;;;;;;-1:-1:-1;31558:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;17776:99;;;;;;;;;;-1:-1:-1;17855:12:0;;17776:99;;33758:289;;;;;;;;;;-1:-1:-1;33758:289:0;;;;;:::i;:::-;;:::i;:::-;;19735:249;;;;;;;;;;-1:-1:-1;19735:249:0;;;;;:::i;:::-;;:::i;17627:84::-;;;;;;;;;;-1:-1:-1;17627:84:0;;17701:2;2437:36:1;;2425:2;2410:18;17627:84:0;2295:184:1;31108:33:0;;;;;;;;;;-1:-1:-1;31108:33:0;;;;-1:-1:-1;;;31108:33:0;;;;;;33185:276;;;;;;;;;;-1:-1:-1;33185:276:0;;;;;:::i;:::-;;:::i;31226:28::-;;;;;;;;;;-1:-1:-1;31226:28:0;;;;-1:-1:-1;;;31226:28:0;;;;;;31427;;;;;;;;;;;;;;;;31188:31;;;;;;;;;;-1:-1:-1;31188:31:0;;;;-1:-1:-1;;;31188:31:0;;;;;;17938:118;;;;;;;;;;-1:-1:-1;17938:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;18030:18:0;18003:7;18030:18;;;;;;;;;;;;17938:118;31263:21;;;;;;;;;;;;;;;;27757:103;;;;;;;;;;;;;:::i;34351:115::-;;;;;;;;;;;;;:::i;31464:26::-;;;;;;;;;;;;;;;;40666:238;;;;;;;;;;-1:-1:-1;40666:238:0;;;;;:::i;:::-;;:::i;27116:87::-;;;;;;;;;;-1:-1:-1;27189:6:0;;-1:-1:-1;;;;;27189:6:0;27116:87;;;-1:-1:-1;;;;;2648:32:1;;;2630:51;;2618:2;2603:18;27116:87:0;2484:203:1;31075:24:0;;;;;;;;;;-1:-1:-1;31075:24:0;;;;;;;-1:-1:-1;;;;;31075:24:0;;;33469:281;;;;;;;;;;-1:-1:-1;33469:281:0;;;;;:::i;:::-;;:::i;16884:95::-;;;;;;;;;;;;;:::i;35352:240::-;;;;;;;;;;-1:-1:-1;35352:240:0;;;;;:::i;:::-;;:::i;40505:157::-;;;;;;;;;;-1:-1:-1;40505:157:0;;;;;:::i;:::-;;:::i;18261:182::-;;;;;;;;;;-1:-1:-1;18261:182:0;;;;;:::i;:::-;;:::i;31291:22::-;;;;;;;;;;;;;;;;34904:154;;;;;;;;;;-1:-1:-1;34904:154:0;;;;;:::i;:::-;;:::i;31148:33::-;;;;;;;;;;-1:-1:-1;31148:33:0;;;;-1:-1:-1;;;31148:33:0;;;;;;34714:182;;;;;;;;;;-1:-1:-1;34714:182:0;;;;;:::i;:::-;;:::i;30638:118::-;;;;;;;;;;;;30713:42;30638:118;;35066:278;;;;;;;;;;;;;:::i;34055:288::-;;;;;;;;;;-1:-1:-1;34055:288:0;;;;;:::i;:::-;;:::i;30765:120::-;;;;;;;;;;;;30842:42;30765:120;;31393:27;;;;;;;;;;;;;;;;31628:43;;;;;;;;;;-1:-1:-1;31628:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;18506:142;;;;;;;;;;-1:-1:-1;18506:142:0;;;;;:::i;:::-;-1:-1:-1;;;;;18613:18:0;;;18586:7;18613:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;18506:142;28015:201;;;;;;;;;;-1:-1:-1;28015:201:0;;;;;:::i;:::-;;:::i;30894:40::-;;;;;;;;;;;;;;;31320:24;;;;;;;;;;;;;;;;16674:91;16719:13;16752:5;16745:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16674:91;:::o;18967:190::-;19040:4;4379:10;19096:31;4379:10;19112:7;19121:5;19096:8;:31::i;:::-;19145:4;19138:11;;;18967:190;;;;;:::o;33758:289::-;27002:13;:11;:13::i;:::-;33884:5:::1;33863:13;17855:12:::0;;;17776:99;33863:13:::1;:17;::::0;33879:1:::1;33863:17;:::i;:::-;33862:27;;;;:::i;:::-;33851:6;:39;;33829:138;;;::::0;-1:-1:-1;;;33829:138:0;;5431:2:1;33829:138:0::1;::::0;::::1;5413:21:1::0;5470:2;5450:18;;;5443:30;5509:34;5489:18;;;5482:62;-1:-1:-1;;;5560:18:1;;;5553:47;5617:19;;33829:138:0::1;;;;;;;;;33978:9;:18:::0;;;34012:27:::1;::::0;1361:25:1;;;34012:27:0::1;::::0;1349:2:1;1334:18;34012:27:0::1;;;;;;;;33758:289:::0;:::o;19735:249::-;19822:4;4379:10;19880:37;19896:4;4379:10;19911:5;19880:15;:37::i;:::-;19928:26;19938:4;19944:2;19948:5;19928:9;:26::i;:::-;-1:-1:-1;19972:4:0;;19735:249;-1:-1:-1;;;;19735:249:0:o;33185:276::-;27002:13;:11;:13::i;:::-;33308:5:::1;33287:13;17855:12:::0;;;17776:99;33287:13:::1;:17;::::0;33303:1:::1;33287:17;:::i;:::-;33286:27;;;;:::i;:::-;33275:6;:39;;33253:137;;;::::0;-1:-1:-1;;;33253:137:0;;5849:2:1;33253:137:0::1;::::0;::::1;5831:21:1::0;5888:2;5868:18;;;5861:30;5927:34;5907:18;;;5900:62;-1:-1:-1;;;5978:18:1;;;5971:46;6034:19;;33253:137:0::1;5647:412:1::0;33253:137:0::1;33401:6;:15:::0;;;33432:21:::1;::::0;1361:25:1;;;33432:21:0::1;::::0;1349:2:1;1334:18;33432:21:0::1;1215:177:1::0;27757:103:0;27002:13;:11;:13::i;:::-;27822:30:::1;27849:1;27822:18;:30::i;:::-;27757:103::o:0;34351:115::-;27002:13;:11;:13::i;:::-;34405:14:::1;:22:::0;;-1:-1:-1;;;;34405:22:0::1;::::0;;34443:15:::1;::::0;::::1;::::0;34422:5:::1;::::0;34443:15:::1;34351:115::o:0;40666:238::-;27002:13;:11;:13::i;:::-;-1:-1:-1;;;;;40755:22:0;::::1;40747:54;;;::::0;-1:-1:-1;;;40747:54:0;;6266:2:1;40747:54:0::1;::::0;::::1;6248:21:1::0;6305:2;6285:18;;;6278:30;-1:-1:-1;;;6324:18:1;;;6317:49;6383:18;;40747:54:0::1;6064:343:1::0;40747:54:0::1;40825:1;40816:6;:10;40808:41;;;::::0;-1:-1:-1;;;40808:41:0;;6614:2:1;40808:41:0::1;::::0;::::1;6596:21:1::0;6653:2;6633:18;;;6626:30;-1:-1:-1;;;6672:18:1;;;6665:48;6730:18;;40808:41:0::1;6412:342:1::0;40808:41:0::1;40865:8;-1:-1:-1::0;;;;;40858:25:0::1;;40884:7;27189:6:::0;;-1:-1:-1;;;;;27189:6:0;;27116:87;40884:7:::1;40858:42;::::0;-1:-1:-1;;;;;;40858:42:0::1;::::0;;;;;;-1:-1:-1;;;;;6951:32:1;;;40858:42:0::1;::::0;::::1;6933:51:1::0;7000:18;;;6993:34;;;6906:18;;40858:42:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40666:238:::0;;:::o;33469:281::-;27002:13;:11;:13::i;:::-;33593:5:::1;33572:13;17855:12:::0;;;17776:99;33572:13:::1;:17;::::0;33588:1:::1;33572:17;:::i;:::-;33571:27;;;;:::i;:::-;33560:6;:39;;33538:138;;;::::0;-1:-1:-1;;;33538:138:0;;7490:2:1;33538:138:0::1;::::0;::::1;7472:21:1::0;7529:2;7509:18;;;7502:30;7568:34;7548:18;;;7541:62;-1:-1:-1;;;7619:18:1;;;7612:47;7676:19;;33538:138:0::1;7288:413:1::0;33538:138:0::1;33687:7;:16:::0;;;33719:23:::1;::::0;1361:25:1;;;33719:23:0::1;::::0;1349:2:1;1334:18;33719:23:0::1;1215:177:1::0;16884:95:0;16931:13;16964:7;16957:14;;;;;:::i;35352:240::-;27002:13;:11;:13::i;:::-;-1:-1:-1;;;;;35432:24:0;::::1;35424:74;;;::::0;-1:-1:-1;;;35424:74:0;;7908:2:1;35424:74:0::1;::::0;::::1;7890:21:1::0;7947:2;7927:18;;;7920:30;7986:34;7966:18;;;7959:62;-1:-1:-1;;;8037:18:1;;;8030:35;8082:19;;35424:74:0::1;7706:401:1::0;35424:74:0::1;35509:9;:31:::0;;-1:-1:-1;;;;;;35509:31:0::1;;-1:-1:-1::0;;;;;35509:31:0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;35556:28:::1;::::0;::::1;::::0;-1:-1:-1;;35556:28:0::1;35352:240:::0;:::o;40505:157::-;27002:13;:11;:13::i;:::-;40589:1:::1;40577:9;:13;40569:46;;;::::0;-1:-1:-1;;;40569:46:0;;8314:2:1;40569:46:0::1;::::0;::::1;8296:21:1::0;8353:2;8333:18;;;8326:30;-1:-1:-1;;;8372:18:1;;;8365:50;8432:18;;40569:46:0::1;8112:344:1::0;40569:46:0::1;27189:6:::0;;40622:36:::1;::::0;-1:-1:-1;;;;;27189:6:0;;;;40622:36;::::1;;;::::0;40648:9;;40622:36:::1;::::0;;;40648:9;27189:6;40622:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;40505:157:::0;:::o;18261:182::-;18330:4;4379:10;18386:27;4379:10;18403:2;18407:5;18386:9;:27::i;34904:154::-;27002:13;:11;:13::i;:::-;34991:12:::1;:25:::0;;;;35023:13:::1;:27:::0;34904:154::o;34714:182::-;27002:13;:11;:13::i;:::-;-1:-1:-1;;;;;34799:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;34799:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;34854:34;;1163:41:1;;;34854:34:0::1;::::0;1136:18:1;34854:34:0::1;;;;;;;34714:182:::0;;:::o;35066:278::-;27002:13;:11;:13::i;:::-;35125:20:::1;::::0;:25;35117:68:::1;;;::::0;-1:-1:-1;;;35117:68:0;;8663:2:1;35117:68:0::1;::::0;::::1;8645:21:1::0;8702:2;8682:18;;;8675:30;8741:32;8721:18;;;8714:60;8791:18;;35117:68:0::1;8461:354:1::0;35117:68:0::1;35219:12;35196:20;:35:::0;35242:13:::1;:20:::0;;-1:-1:-1;;;;;;;35273:18:0;;;;;;;;35307:29:::1;::::0;-1:-1:-1;;;35322:13:0;;::::1;35242:20;35322:13;1188:14:1::0;1181:22;1163:41;;35307:29:0::1;::::0;1151:2:1;1136:18;35307:29:0::1;;;;;;;35066:278::o:0;34055:288::-;27002:13;:11;:13::i;:::-;34195:7:::1;34174:13;17855:12:::0;;;17776:99;34174:13:::1;:17;::::0;34190:1:::1;34174:17;:::i;:::-;34173:29;;;;:::i;:::-;34160:9;:42;;34138:150;;;::::0;-1:-1:-1;;;34138:150:0;;9022:2:1;34138:150:0::1;::::0;::::1;9004:21:1::0;9061:2;9041:18;;;9034:30;9100:34;9080:18;;;9073:62;9171:28;9151:18;;;9144:56;9217:19;;34138:150:0::1;8820:422:1::0;34138:150:0::1;34305:18;:30:::0;34055:288::o;28015:201::-;27002:13;:11;:13::i;:::-;-1:-1:-1;;;;;28104:22:0;::::1;28096:73;;;::::0;-1:-1:-1;;;28096:73:0;;9449:2:1;28096:73:0::1;::::0;::::1;9431:21:1::0;9488:2;9468:18;;;9461:30;9527:34;9507:18;;;9500:62;-1:-1:-1;;;9578:18:1;;;9571:36;9624:19;;28096:73:0::1;9247:402:1::0;28096:73:0::1;28180:28;28199:8;28180:18;:28::i;:::-;28015:201:::0;:::o;23802:130::-;23887:37;23896:5;23903:7;23912:5;23919:4;23887:8;:37::i;27281:132::-;27189:6;;-1:-1:-1;;;;;27189:6:0;4379:10;27345:23;27337:68;;;;-1:-1:-1;;;27337:68:0;;9856:2:1;27337:68:0;;;9838:21:1;;;9875:18;;;9868:30;9934:34;9914:18;;;9907:62;9986:18;;27337:68:0;9654:356:1;25518:487:0;-1:-1:-1;;;;;18613:18:0;;;25618:24;18613:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;25685:37:0;;25681:317;;25762:5;25743:16;:24;25739:132;;;25795:60;;-1:-1:-1;;;25795:60:0;;-1:-1:-1;;;;;10235:32:1;;25795:60:0;;;10217:51:1;10284:18;;;10277:34;;;10327:18;;;10320:34;;;10190:18;;25795:60:0;10015:345:1;25739:132:0;25914:57;25923:5;25930:7;25958:5;25939:16;:24;25965:5;25914:8;:57::i;:::-;25607:398;25518:487;;;:::o;36076:3461::-;-1:-1:-1;;;;;36208:18:0;;36200:53;;;;-1:-1:-1;;;36200:53:0;;10567:2:1;36200:53:0;;;10549:21:1;10606:2;10586:18;;;10579:30;-1:-1:-1;;;10625:18:1;;;10618:52;10687:18;;36200:53:0;10365:346:1;36200:53:0;-1:-1:-1;;;;;36272:16:0;;36264:49;;;;-1:-1:-1;;;36264:49:0;;10918:2:1;36264:49:0;;;10900:21:1;10957:2;10937:18;;;10930:30;-1:-1:-1;;;10976:18:1;;;10969:50;11036:18;;36264:49:0;10716:344:1;36264:49:0;36341:1;36332:6;:10;36324:46;;;;-1:-1:-1;;;36324:46:0;;11267:2:1;36324:46:0;;;11249:21:1;11306:2;11286:18;;;11279:30;11345:25;11325:18;;;11318:53;11388:18;;36324:46:0;11065:347:1;36324:46:0;36387:14;;-1:-1:-1;;;36387:14:0;;;;36383:1812;;;27189:6;;-1:-1:-1;;;;;36440:15:0;;;27189:6;;36440:15;;;;:49;;-1:-1:-1;27189:6:0;;-1:-1:-1;;;;;36476:13:0;;;27189:6;;36476:13;;36440:49;:86;;;;-1:-1:-1;;;;;;36510:16:0;;;;36440:86;:128;;;;-1:-1:-1;;;;;;36547:21:0;;36561:6;36547:21;;36440:128;36418:1766;;;36608:13;;-1:-1:-1;;;36608:13:0;;;;36603:356;;-1:-1:-1;;;;;36680:37:0;;;;;;:31;:37;;;;;;;;;:105;;-1:-1:-1;;;;;;36750:35:0;;;;;;:31;:35;;;;;;;;36680:105;36646:220;;;;-1:-1:-1;;;36646:220:0;;11619:2:1;36646:220:0;;;11601:21:1;11658:2;11638:18;;;11631:30;11697:31;11677:18;;;11670:59;11746:18;;36646:220:0;11417:353:1;36646:220:0;27189:6;;-1:-1:-1;;;;;36897:15:0;;;27189:6;;36897:15;36889:50;;;;-1:-1:-1;;;36889:50:0;;11977:2:1;36889:50:0;;;11959:21:1;12016:2;11996:18;;;11989:30;-1:-1:-1;;;12035:18:1;;;12028:52;12097:18;;36889:50:0;11775:346:1;36889:50:0;37041:15;-1:-1:-1;;;;;37033:23:0;:4;-1:-1:-1;;;;;37033:23:0;;:63;;;;-1:-1:-1;;;;;;37061:35:0;;;;;;:31;:35;;;;;;;;37060:36;37033:63;37007:1162;;;37183:6;;37173;:16;;37139:147;;;;-1:-1:-1;;;37139:147:0;;12328:2:1;37139:147:0;;;12310:21:1;12367:2;12347:18;;;12340:30;12406:34;12386:18;;;12379:62;-1:-1:-1;;;12457:18:1;;;12450:43;12510:19;;37139:147:0;12126:409:1;37139:147:0;37369:9;;-1:-1:-1;;;;;18030:18:0;;18003:7;18030:18;;;;;;;;;;;37343:22;;:6;:22;:::i;:::-;:35;;37309:150;;;;-1:-1:-1;;;37309:150:0;;12872:2:1;37309:150:0;;;12854:21:1;12911:2;12891:18;;;12884:30;12950:31;12930:18;;;12923:59;12999:18;;37309:150:0;12670:353:1;37309:150:0;37007:1162;;;37563:15;-1:-1:-1;;;;;37557:21:0;:2;-1:-1:-1;;;;;37557:21:0;;:63;;;;-1:-1:-1;;;;;;37583:37:0;;;;;;:31;:37;;;;;;;;37582:38;37557:63;37531:638;;;37707:7;;37697:6;:17;;37663:138;;;;-1:-1:-1;;;37663:138:0;;13230:2:1;37663:138:0;;;13212:21:1;13269:2;13249:18;;;13242:30;13308:34;13288:18;;;13281:62;-1:-1:-1;;;13359:18:1;;;13352:33;13402:19;;37663:138:0;13028:399:1;37531:638:0;-1:-1:-1;;;;;37854:35:0;;;;;;:31;:35;;;;;;;;37853:36;:99;;;;-1:-1:-1;;;;;;37915:37:0;;;;;;:31;:37;;;;;;;;37914:38;37853:99;37827:342;;;38055:9;;-1:-1:-1;;;;;18030:18:0;;18003:7;18030:18;;;;;;;;;;;38029:22;;:6;:22;:::i;:::-;:35;;37995:154;;;;-1:-1:-1;;;37995:154:0;;13634:2:1;37995:154:0;;;13616:21:1;13673:2;13653:18;;;13646:30;13712:34;13692:18;;;13685:62;-1:-1:-1;;;13763:18:1;;;13756:31;13804:19;;37995:154:0;13432:397:1;37995:154:0;38256:4;38207:28;18030:18;;;;;;;;;;;38314;;38290:42;;;;;;;38363:35;;-1:-1:-1;38387:11:0;;-1:-1:-1;;;38387:11:0;;;;38363:35;:61;;;;-1:-1:-1;38416:8:0;;;;38415:9;38363:61;:104;;;;;38451:15;-1:-1:-1;;;;;38443:23:0;:4;-1:-1:-1;;;;;38443:23:0;;38441:26;38363:104;:147;;;;-1:-1:-1;;;;;;38485:25:0;;;;;;:19;:25;;;;;;;;38484:26;38363:147;:188;;;;-1:-1:-1;;;;;;38528:23:0;;;;;;:19;:23;;;;;;;;38527:24;38363:188;38345:316;;;38578:8;:15;;-1:-1:-1;;38578:15:0;38589:4;38578:15;;;38608:10;:8;:10::i;:::-;38633:8;:16;;-1:-1:-1;;38633:16:0;;;38345:316;-1:-1:-1;;;;;38713:25:0;;38673:12;38713:25;;;:19;:25;;;;;;38688:4;;38713:25;;;:52;;-1:-1:-1;;;;;;38742:23:0;;;;;;:19;:23;;;;;;;;38713:52;38709:100;;;-1:-1:-1;38792:5:0;38709:100;38821:12;38860:7;38856:628;;;38889:9;;-1:-1:-1;;;38889:9:0;;;;38886:57;;;38917:9;:7;:9::i;:::-;38990:15;-1:-1:-1;;;;;38984:21:0;:2;-1:-1:-1;;;;;38984:21:0;;:42;;;;;39025:1;39009:13;;:17;38984:42;38980:355;;;39081:3;39064:13;;39055:6;:22;;;;:::i;:::-;39054:30;;;;:::i;:::-;39047:37;;39118:4;39103:11;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;38980:355:0;;-1:-1:-1;38980:355:0;;39189:15;-1:-1:-1;;;;;39181:23:0;:4;-1:-1:-1;;;;;39181:23:0;;:43;;;;;39223:1;39208:12;;:16;39181:43;39177:158;;;39278:3;39262:12;;39253:6;:21;;;;:::i;:::-;39252:29;;;;:::i;:::-;39245:36;;39315:4;39300:11;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;39177:158:0;39355:8;;39351:91;;39384:42;39400:4;39414;39421;39384:15;:42::i;:::-;39458:14;39468:4;39458:14;;:::i;:::-;;;38856:628;39496:33;39512:4;39518:2;39522:6;39496:15;:33::i;:::-;36189:3348;;;;36076:3461;;;:::o;28376:191::-;28469:6;;;-1:-1:-1;;;;;28486:17:0;;;-1:-1:-1;;;;;;28486:17:0;;;;;;;28519:40;;28469:6;;;28486:17;28469:6;;28519:40;;28450:16;;28519:40;28439:128;28376:191;:::o;24783:443::-;-1:-1:-1;;;;;24896:19:0;;24892:91;;24939:32;;-1:-1:-1;;;24939:32:0;;24968:1;24939:32;;;2630:51:1;2603:18;;24939:32:0;2484:203:1;24892:91:0;-1:-1:-1;;;;;24997:21:0;;24993:92;;25042:31;;-1:-1:-1;;;25042:31:0;;25070:1;25042:31;;;2630:51:1;2603:18;;25042:31:0;2484:203:1;24993:92:0;-1:-1:-1;;;;;25095:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;:35;;;25141:78;;;;25192:7;-1:-1:-1;;;;;25176:31:0;25185:5;-1:-1:-1;;;;;25176:31:0;;25201:5;25176:31;;;;1361:25:1;;1349:2;1334:18;;1215:177;25176:31:0;;;;;;;;24783:443;;;;:::o;39964:533::-;40057:4;40013:23;18030:18;;;;;;;;;;;40105:11;;40133:20;;;:46;;-1:-1:-1;40157:22:0;;40133:46;40129:85;;;40196:7;;39964:533::o;40129:85::-;40248:18;;40230:15;:36;40226:105;;;40301:18;;40283:36;;40226:105;40343:12;40372:33;40389:15;40372:16;:33::i;:::-;40440:9;;40432:57;;40440:9;;;;-1:-1:-1;;;;;40440:9:0;;40463:21;;40432:57;;;;40463:21;40440:9;40432:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39964:533:0:o;35600:468::-;35684:1;35661:20;;:24;35639:77;;;;-1:-1:-1;;;35639:77:0;;14379:2:1;35639:77:0;;;14361:21:1;14418:2;14398:18;;;14391:30;-1:-1:-1;;;14437:18:1;;;14430:46;14493:18;;35639:77:0;14177:340:1;35639:77:0;35800:20;;35750:12;;35727:20;;35800:24;;35823:1;35800:24;:::i;:::-;35773:51;;35854:16;35838:12;:32;35835:225;;35902:1;35887:12;:16;;;35918:13;:17;40622:36:::1;40505:157:::0;:::o;35835:225::-;35983:1;35968:12;:16;;;35999:13;:17;36031:9;:17;;-1:-1:-1;;;;36031:17:0;;;35628:440;;35600:468::o;20369:316::-;-1:-1:-1;;;;;20461:18:0;;20457:88;;20503:30;;-1:-1:-1;;;20503:30:0;;20530:1;20503:30;;;2630:51:1;2603:18;;20503:30:0;2484:203:1;20457:88:0;-1:-1:-1;;;;;20559:16:0;;20555:88;;20599:32;;-1:-1:-1;;;20599:32:0;;20628:1;20599:32;;;2630:51:1;2603:18;;20599:32:0;2484:203:1;20555:88:0;20653:24;20661:4;20667:2;20671:5;20653:7;:24::i;39547:409::-;39647:16;;;39661:1;39647:16;;;;;;;;39623:21;;39647:16;;;;;;;;;;-1:-1:-1;39647:16:0;39623:40;;39692:4;39674;39679:1;39674:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;39674:23:0;;;-1:-1:-1;;;;;39674:23:0;;;;;30842:42;-1:-1:-1;;;;;39718:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39708:4;39713:1;39708:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39708:31:0;;;:7;;;;;;;;;;;:31;39752:196;;-1:-1:-1;;;39752:196:0;;30842:42;;39752:65;;:196;;39832:11;;39858:1;;39875:4;;39902;;39922:15;;39752:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21009:1135;-1:-1:-1;;;;;21099:18:0;;21095:552;;21253:5;21237:12;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;21095:552:0;;-1:-1:-1;21095:552:0;;-1:-1:-1;;;;;21313:15:0;;21291:19;21313:15;;;;;;;;;;;21347:19;;;21343:117;;;21394:50;;-1:-1:-1;;;21394:50:0;;-1:-1:-1;;;;;10235:32:1;;21394:50:0;;;10217:51:1;10284:18;;;10277:34;;;10327:18;;;10320:34;;;10190:18;;21394:50:0;10015:345:1;21343:117:0;-1:-1:-1;;;;;21583:15:0;;:9;:15;;;;;;;;;;21601:19;;;;21583:37;;21095:552;-1:-1:-1;;;;;21663:16:0;;21659:435;;21829:12;:21;;;;;;;21659:435;;;-1:-1:-1;;;;;22045:13:0;;:9;:13;;;;;;;;;;:22;;;;;;21659:435;22126:2;-1:-1:-1;;;;;22111:25:0;22120:4;-1:-1:-1;;;;;22111:25:0;;22130:5;22111:25;;;;1361::1;;1349:2;1334:18;;1215:177;22111:25:0;;;;;;;;21009:1135;;;:::o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:315;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1397:247::-;1456:6;1509:2;1497:9;1488:7;1484:23;1480:32;1477:52;;;1525:1;1522;1515:12;1477:52;1564:9;1551:23;1583:31;1608:5;1583:31;:::i;:::-;1633:5;1397:247;-1:-1:-1;;;1397:247:1:o;1649:180::-;1708:6;1761:2;1749:9;1740:7;1736:23;1732:32;1729:52;;;1777:1;1774;1767:12;1729:52;-1:-1:-1;1800:23:1;;1649:180;-1:-1:-1;1649:180:1:o;1834:456::-;1911:6;1919;1927;1980:2;1968:9;1959:7;1955:23;1951:32;1948:52;;;1996:1;1993;1986:12;1948:52;2035:9;2022:23;2054:31;2079:5;2054:31;:::i;:::-;2104:5;-1:-1:-1;2161:2:1;2146:18;;2133:32;2174:33;2133:32;2174:33;:::i;:::-;1834:456;;2226:7;;-1:-1:-1;;;2280:2:1;2265:18;;;;2252:32;;1834:456::o;2692:248::-;2760:6;2768;2821:2;2809:9;2800:7;2796:23;2792:32;2789:52;;;2837:1;2834;2827:12;2789:52;-1:-1:-1;;2860:23:1;;;2930:2;2915:18;;;2902:32;;-1:-1:-1;2692:248:1:o;2945:118::-;3031:5;3024:13;3017:21;3010:5;3007:32;2997:60;;3053:1;3050;3043:12;3068:382;3133:6;3141;3194:2;3182:9;3173:7;3169:23;3165:32;3162:52;;;3210:1;3207;3200:12;3162:52;3249:9;3236:23;3268:31;3293:5;3268:31;:::i;:::-;3318:5;-1:-1:-1;3375:2:1;3360:18;;3347:32;3388:30;3347:32;3388:30;:::i;:::-;3437:7;3427:17;;;3068:382;;;;;:::o;3924:388::-;3992:6;4000;4053:2;4041:9;4032:7;4028:23;4024:32;4021:52;;;4069:1;4066;4059:12;4021:52;4108:9;4095:23;4127:31;4152:5;4127:31;:::i;:::-;4177:5;-1:-1:-1;4234:2:1;4219:18;;4206:32;4247:33;4206:32;4247:33;:::i;4317:380::-;4396:1;4392:12;;;;4439;;;4460:61;;4514:4;4506:6;4502:17;4492:27;;4460:61;4567:2;4559:6;4556:14;4536:18;4533:38;4530:161;;4613:10;4608:3;4604:20;4601:1;4594:31;4648:4;4645:1;4638:15;4676:4;4673:1;4666:15;4530:161;;4317:380;;;:::o;4702:127::-;4763:10;4758:3;4754:20;4751:1;4744:31;4794:4;4791:1;4784:15;4818:4;4815:1;4808:15;4834:168;4907:9;;;4938;;4955:15;;;4949:22;;4935:37;4925:71;;4976:18;;:::i;5007:217::-;5047:1;5073;5063:132;;5117:10;5112:3;5108:20;5105:1;5098:31;5152:4;5149:1;5142:15;5180:4;5177:1;5170:15;5063:132;-1:-1:-1;5209:9:1;;5007:217::o;7038:245::-;7105:6;7158:2;7146:9;7137:7;7133:23;7129:32;7126:52;;;7174:1;7171;7164:12;7126:52;7206:9;7200:16;7225:28;7247:5;7225:28;:::i;12540:125::-;12605:9;;;12626:10;;;12623:36;;;12639:18;;:::i;13834:128::-;13901:9;;;13922:11;;;13919:37;;;13936:18;;:::i;14654:127::-;14715:10;14710:3;14706:20;14703:1;14696:31;14746:4;14743:1;14736:15;14770:4;14767:1;14760:15;14786:251;14856:6;14909:2;14897:9;14888:7;14884:23;14880:32;14877:52;;;14925:1;14922;14915:12;14877:52;14957:9;14951:16;14976:31;15001:5;14976:31;:::i;15042:980::-;15304:4;15352:3;15341:9;15337:19;15383:6;15372:9;15365:25;15409:2;15447:6;15442:2;15431:9;15427:18;15420:34;15490:3;15485:2;15474:9;15470:18;15463:31;15514:6;15549;15543:13;15580:6;15572;15565:22;15618:3;15607:9;15603:19;15596:26;;15657:2;15649:6;15645:15;15631:29;;15678:1;15688:195;15702:6;15699:1;15696:13;15688:195;;;15767:13;;-1:-1:-1;;;;;15763:39:1;15751:52;;15858:15;;;;15823:12;;;;15799:1;15717:9;15688:195;;;-1:-1:-1;;;;;;;15939:32:1;;;;15934:2;15919:18;;15912:60;-1:-1:-1;;;16003:3:1;15988:19;15981:35;15900:3;15042:980;-1:-1:-1;;;15042:980:1:o

Swarm Source

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