ETH Price: $2,436.83 (+4.57%)

Token

MetaGochiCreatures (MGNFTC)
 

Overview

Max Total Supply

5,547 MGNFTC

Holders

162

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 MGNFTC
0x7be1fc9460a5f331e984e8064b6b6f0399cb5b82
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MetaGochiCreatures

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-26
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/utils/Counters.sol


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


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

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

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

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing 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);
    }
}

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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

// File: contracts/MetaGochiCreatures.sol


pragma solidity ^0.8.7;





contract MetaGochiCreatures is ERC721, Ownable {
  using Strings for uint256;
  using Counters for Counters.Counter;

  Counters.Counter private supply;

  string public uriPrefix = "";
    
  uint256 public maxMintAmountPerTx = 20;

  bool public paused = true;

  address public devWallet = 0x7CBd384B73D3fF4b278023B3e8a354c436Bdc60f;
  address public singleEggToken = 0x90749BcAE7bDeE78fD7b8829aeAc855c32A56376;
  address public twinEggToken = 0x7F1cf2796D7C33B8f5AcBB02c7FFfab51F7A3D36;

  constructor() ERC721("MetaGochiCreatures", "MGNFTC") {
  }

  modifier mintCompliance(uint256 _mintAmount) {
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "MetaGochiNft: Invalid mint amount!");
    _;
  }

  function totalSupply() public view returns (uint256) {
    return supply.current();
  }

  function mint(uint256 _singleEggAmount, uint256 _twinEggAmount) public payable mintCompliance(_singleEggAmount + _twinEggAmount * 2) {
    require(!paused, "The contract is paused!");
	
    if(_singleEggAmount > 0) {
      uint256 singleTokenBal = IERC20(singleEggToken).balanceOf(msg.sender);
      require(singleTokenBal >= _singleEggAmount, "MetaGochiNft: Not enough single egg token balance");

      // transfer tokens back to dev wallet
      IERC20(singleEggToken).transferFrom(msg.sender, devWallet, _singleEggAmount);
      _mintLoop(msg.sender, _singleEggAmount);
    }

    if(_twinEggAmount > 0) {
    	uint256 twinTokenBal = IERC20(twinEggToken).balanceOf(msg.sender);
      require(twinTokenBal >= _twinEggAmount, "MetaGochiNft: Not enough twin egg token balance");

      // transfer tokens back to dev wallet
    	IERC20(twinEggToken).transferFrom(msg.sender, devWallet, _twinEggAmount);
    	_mintLoop(msg.sender, _twinEggAmount * 2);
    }
  }

  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

  function tokenURI(uint256 _tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(_tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _tokenId.toString()))
        : "";
  }

  // only owner functions
  function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
    _mintLoop(_receiver, _mintAmount);
  }

  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setPaused(bool _state) public onlyOwner {
    paused = _state;
  }

  function setDevWallet(address _devWallet) public onlyOwner {
    devWallet = _devWallet;
  }

  function setSingleEggToken(address _singleEggToken) public onlyOwner {
    singleEggToken = _singleEggToken;
  }

  function setTwinEggToken(address _twinEggToken) public onlyOwner {
    twinEggToken = _twinEggToken;
  }

  // internal functions
  function _mintLoop(address _receiver, uint256 _mintAmount) internal {
    for (uint256 i = 0; i < _mintAmount; i++) {
      supply.increment();
      _safeMint(_receiver, supply.current());
    }
  }

  function _baseURI() internal view virtual override returns (string memory) {
    return uriPrefix;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_singleEggAmount","type":"uint256"},{"internalType":"uint256","name":"_twinEggAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devWallet","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_singleEggToken","type":"address"}],"name":"setSingleEggToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_twinEggToken","type":"address"}],"name":"setTwinEggToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"singleEggToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"twinEggToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"}]

608060405260405180602001604052806000815250600890805190602001906200002b929190620002ed565b5060146009556001600a60006101000a81548160ff021916908315150217905550737cbd384b73d3ff4b278023b3e8a354c436bdc60f600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507390749bcae7bdee78fd7b8829aeac855c32a56376600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737f1cf2796d7c33b8f5acbb02c7fffab51f7a3d36600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200015857600080fd5b506040518060400160405280601281526020017f4d657461476f63686943726561747572657300000000000000000000000000008152506040518060400160405280600681526020017f4d474e46544300000000000000000000000000000000000000000000000000008152508160009080519060200190620001dd929190620002ed565b508060019080519060200190620001f6929190620002ed565b505050620002196200020d6200021f60201b60201c565b6200022760201b60201c565b62000402565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002fb906200039d565b90600052602060002090601f0160209004810192826200031f57600085556200036b565b82601f106200033a57805160ff19168380011785556200036b565b828001600101855582156200036b579182015b828111156200036a5782518255916020019190600101906200034d565b5b5090506200037a91906200037e565b5090565b5b80821115620003995760008160009055506001016200037f565b5090565b60006002820490506001821680620003b657607f821691505b60208210811415620003cd57620003cc620003d3565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6141fd80620004126000396000f3fe6080604052600436106101e35760003560e01c806370a0823111610102578063a22cb46511610095578063c87b56dd11610064578063c87b56dd146106bd578063e985e9c5146106fa578063efbd73f414610737578063f2fde38b14610760576101e3565b8063a22cb46514610619578063b071401b14610642578063b88d4fde1461066b578063c4b7bb4514610694576101e3565b80638da5cb5b116100d15780638da5cb5b1461056d5780638ea5220f1461059857806394354fd0146105c357806395d89b41146105ee576101e3565b806370a08231146104c5578063715018a61461050257806378518829146105195780637ec4a65914610544576101e3565b806323b872dd1161017a57806355a095181161014957806355a09518146104075780635c975abb1461043257806362b99ad41461045d5780636352211e14610488576101e3565b806323b872dd1461034f578063301abd671461037857806342842e0e146103a1578063438b6300146103ca576101e3565b806316c38b3c116101b657806316c38b3c146102b657806318160ddd146102df5780631b2ef1ca1461030a5780631f53ac0214610326576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190612df8565b610789565b60405161021c919061346a565b60405180910390f35b34801561023157600080fd5b5061023a61086b565b6040516102479190613485565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190612e9b565b6108fd565b60405161028491906133aa565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190612d5e565b610982565b005b3480156102c257600080fd5b506102dd60048036038101906102d89190612d9e565b610a9a565b005b3480156102eb57600080fd5b506102f4610b33565b6040516103019190613727565b60405180910390f35b610324600480360381019061031f9190612f35565b610b44565b005b34801561033257600080fd5b5061034d60048036038101906103489190612bdb565b610fc4565b005b34801561035b57600080fd5b5061037660048036038101906103719190612c48565b611084565b005b34801561038457600080fd5b5061039f600480360381019061039a9190612bdb565b6110e4565b005b3480156103ad57600080fd5b506103c860048036038101906103c39190612c48565b6111a4565b005b3480156103d657600080fd5b506103f160048036038101906103ec9190612bdb565b6111c4565b6040516103fe9190613448565b60405180910390f35b34801561041357600080fd5b5061041c6112c1565b60405161042991906133aa565b60405180910390f35b34801561043e57600080fd5b506104476112e7565b604051610454919061346a565b60405180910390f35b34801561046957600080fd5b506104726112fa565b60405161047f9190613485565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190612e9b565b611388565b6040516104bc91906133aa565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190612bdb565b61143a565b6040516104f99190613727565b60405180910390f35b34801561050e57600080fd5b506105176114f2565b005b34801561052557600080fd5b5061052e61157a565b60405161053b91906133aa565b60405180910390f35b34801561055057600080fd5b5061056b60048036038101906105669190612e52565b6115a0565b005b34801561057957600080fd5b50610582611636565b60405161058f91906133aa565b60405180910390f35b3480156105a457600080fd5b506105ad611660565b6040516105ba91906133aa565b60405180910390f35b3480156105cf57600080fd5b506105d8611686565b6040516105e59190613727565b60405180910390f35b3480156105fa57600080fd5b5061060361168c565b6040516106109190613485565b60405180910390f35b34801561062557600080fd5b50610640600480360381019061063b9190612d1e565b61171e565b005b34801561064e57600080fd5b5061066960048036038101906106649190612e9b565b611734565b005b34801561067757600080fd5b50610692600480360381019061068d9190612c9b565b6117ba565b005b3480156106a057600080fd5b506106bb60048036038101906106b69190612bdb565b61181c565b005b3480156106c957600080fd5b506106e460048036038101906106df9190612e9b565b6118dc565b6040516106f19190613485565b60405180910390f35b34801561070657600080fd5b50610721600480360381019061071c9190612c08565b611983565b60405161072e919061346a565b60405180910390f35b34801561074357600080fd5b5061075e60048036038101906107599190612ef5565b611a17565b005b34801561076c57600080fd5b5061078760048036038101906107829190612bdb565b611af4565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061085457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610864575061086382611bec565b5b9050919050565b60606000805461087a90613a10565b80601f01602080910402602001604051908101604052809291908181526020018280546108a690613a10565b80156108f35780601f106108c8576101008083540402835291602001916108f3565b820191906000526020600020905b8154815290600101906020018083116108d657829003601f168201915b5050505050905090565b600061090882611c56565b610947576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093e90613667565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061098d82611388565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f5906136e7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a1d611cc2565b73ffffffffffffffffffffffffffffffffffffffff161480610a4c5750610a4b81610a46611cc2565b611983565b5b610a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a82906135e7565b60405180910390fd5b610a958383611cca565b505050565b610aa2611cc2565b73ffffffffffffffffffffffffffffffffffffffff16610ac0611636565b73ffffffffffffffffffffffffffffffffffffffff1614610b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0d90613687565b60405180910390fd5b80600a60006101000a81548160ff02191690831515021790555050565b6000610b3f6007611d83565b905090565b600281610b5191906138cc565b82610b5c9190613845565b600081118015610b6e57506009548111155b610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba490613547565b60405180910390fd5b600a60009054906101000a900460ff1615610bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf4906136a7565b60405180910390fd5b6000831115610dd8576000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610c6391906133aa565b60206040518083038186803b158015610c7b57600080fd5b505afa158015610c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb39190612ec8565b905083811015610cf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cef906135c7565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16876040518463ffffffff1660e01b8152600401610d79939291906133c5565b602060405180830381600087803b158015610d9357600080fd5b505af1158015610da7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcb9190612dcb565b50610dd63385611d91565b505b6000821115610fbf576000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610e3e91906133aa565b60206040518083038186803b158015610e5657600080fd5b505afa158015610e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8e9190612ec8565b905082811015610ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca906134e7565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518463ffffffff1660e01b8152600401610f54939291906133c5565b602060405180830381600087803b158015610f6e57600080fd5b505af1158015610f82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa69190612dcb565b50610fbd33600285610fb891906138cc565b611d91565b505b505050565b610fcc611cc2565b73ffffffffffffffffffffffffffffffffffffffff16610fea611636565b73ffffffffffffffffffffffffffffffffffffffff1614611040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103790613687565b60405180910390fd5b80600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61109561108f611cc2565b82611dd1565b6110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb90613707565b60405180910390fd5b6110df838383611eaf565b505050565b6110ec611cc2565b73ffffffffffffffffffffffffffffffffffffffff1661110a611636565b73ffffffffffffffffffffffffffffffffffffffff1614611160576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115790613687565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6111bf838383604051806020016040528060008152506117ba565b505050565b606060006111d18361143a565b905060008167ffffffffffffffff8111156111ef576111ee613ba9565b5b60405190808252806020026020018201604052801561121d5781602001602082028036833780820191505090505b50905060006001905060005b838110156112b557600061123c83611388565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112a1578284838151811061128657611285613b7a565b5b602002602001018181525050818061129d90613a73565b9250505b82806112ac90613a73565b93505050611229565b82945050505050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900460ff1681565b6008805461130790613a10565b80601f016020809104026020016040519081016040528092919081815260200182805461133390613a10565b80156113805780601f1061135557610100808354040283529160200191611380565b820191906000526020600020905b81548152906001019060200180831161136357829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611431576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142890613627565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a290613607565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114fa611cc2565b73ffffffffffffffffffffffffffffffffffffffff16611518611636565b73ffffffffffffffffffffffffffffffffffffffff161461156e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156590613687565b60405180910390fd5b6115786000612116565b565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6115a8611cc2565b73ffffffffffffffffffffffffffffffffffffffff166115c6611636565b73ffffffffffffffffffffffffffffffffffffffff161461161c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161390613687565b60405180910390fd5b80600890805190602001906116329291906129c5565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b60606001805461169b90613a10565b80601f01602080910402602001604051908101604052809291908181526020018280546116c790613a10565b80156117145780601f106116e957610100808354040283529160200191611714565b820191906000526020600020905b8154815290600101906020018083116116f757829003601f168201915b5050505050905090565b611730611729611cc2565b83836121dc565b5050565b61173c611cc2565b73ffffffffffffffffffffffffffffffffffffffff1661175a611636565b73ffffffffffffffffffffffffffffffffffffffff16146117b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a790613687565b60405180910390fd5b8060098190555050565b6117cb6117c5611cc2565b83611dd1565b61180a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180190613707565b60405180910390fd5b61181684848484612349565b50505050565b611824611cc2565b73ffffffffffffffffffffffffffffffffffffffff16611842611636565b73ffffffffffffffffffffffffffffffffffffffff1614611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f90613687565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606118e782611c56565b611926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191d906136c7565b60405180910390fd5b60006119306123a5565b90506000815111611950576040518060200160405280600081525061197b565b8061195a84612437565b60405160200161196b929190613386565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b81600081118015611a2a57506009548111155b611a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6090613547565b60405180910390fd5b611a71611cc2565b73ffffffffffffffffffffffffffffffffffffffff16611a8f611636565b73ffffffffffffffffffffffffffffffffffffffff1614611ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adc90613687565b60405180910390fd5b611aef8284611d91565b505050565b611afc611cc2565b73ffffffffffffffffffffffffffffffffffffffff16611b1a611636565b73ffffffffffffffffffffffffffffffffffffffff1614611b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6790613687565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd7906134c7565b60405180910390fd5b611be981612116565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d3d83611388565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60005b81811015611dcc57611da66007612598565b611db983611db46007611d83565b6125ae565b8080611dc490613a73565b915050611d94565b505050565b6000611ddc82611c56565b611e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e12906135a7565b60405180910390fd5b6000611e2683611388565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e685750611e678185611983565b5b80611ea657508373ffffffffffffffffffffffffffffffffffffffff16611e8e846108fd565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ecf82611388565b73ffffffffffffffffffffffffffffffffffffffff1614611f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1c90613507565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8c90613567565b60405180910390fd5b611fa08383836125cc565b611fab600082611cca565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ffb9190613926565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120529190613845565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121118383836125d1565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561224b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224290613587565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161233c919061346a565b60405180910390a3505050565b612354848484611eaf565b612360848484846125d6565b61239f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612396906134a7565b60405180910390fd5b50505050565b6060600880546123b490613a10565b80601f01602080910402602001604051908101604052809291908181526020018280546123e090613a10565b801561242d5780601f106124025761010080835404028352916020019161242d565b820191906000526020600020905b81548152906001019060200180831161241057829003601f168201915b5050505050905090565b6060600082141561247f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612593565b600082905060005b600082146124b157808061249a90613a73565b915050600a826124aa919061389b565b9150612487565b60008167ffffffffffffffff8111156124cd576124cc613ba9565b5b6040519080825280601f01601f1916602001820160405280156124ff5781602001600182028036833780820191505090505b5090505b6000851461258c576001826125189190613926565b9150600a856125279190613abc565b60306125339190613845565b60f81b81838151811061254957612548613b7a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612585919061389b565b9450612503565b8093505050505b919050565b6001816000016000828254019250508190555050565b6125c882826040518060200160405280600081525061276d565b5050565b505050565b505050565b60006125f78473ffffffffffffffffffffffffffffffffffffffff166127c8565b15612760578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612620611cc2565b8786866040518563ffffffff1660e01b815260040161264294939291906133fc565b602060405180830381600087803b15801561265c57600080fd5b505af192505050801561268d57506040513d601f19601f8201168201806040525081019061268a9190612e25565b60015b612710573d80600081146126bd576040519150601f19603f3d011682016040523d82523d6000602084013e6126c2565b606091505b50600081511415612708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ff906134a7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612765565b600190505b949350505050565b61277783836127eb565b61278460008484846125d6565b6127c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ba906134a7565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561285b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285290613647565b60405180910390fd5b61286481611c56565b156128a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289b90613527565b60405180910390fd5b6128b0600083836125cc565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129009190613845565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129c1600083836125d1565b5050565b8280546129d190613a10565b90600052602060002090601f0160209004810192826129f35760008555612a3a565b82601f10612a0c57805160ff1916838001178555612a3a565b82800160010185558215612a3a579182015b82811115612a39578251825591602001919060010190612a1e565b5b509050612a479190612a4b565b5090565b5b80821115612a64576000816000905550600101612a4c565b5090565b6000612a7b612a7684613767565b613742565b905082815260208101848484011115612a9757612a96613bdd565b5b612aa28482856139ce565b509392505050565b6000612abd612ab884613798565b613742565b905082815260208101848484011115612ad957612ad8613bdd565b5b612ae48482856139ce565b509392505050565b600081359050612afb8161416b565b92915050565b600081359050612b1081614182565b92915050565b600081519050612b2581614182565b92915050565b600081359050612b3a81614199565b92915050565b600081519050612b4f81614199565b92915050565b600082601f830112612b6a57612b69613bd8565b5b8135612b7a848260208601612a68565b91505092915050565b600082601f830112612b9857612b97613bd8565b5b8135612ba8848260208601612aaa565b91505092915050565b600081359050612bc0816141b0565b92915050565b600081519050612bd5816141b0565b92915050565b600060208284031215612bf157612bf0613be7565b5b6000612bff84828501612aec565b91505092915050565b60008060408385031215612c1f57612c1e613be7565b5b6000612c2d85828601612aec565b9250506020612c3e85828601612aec565b9150509250929050565b600080600060608486031215612c6157612c60613be7565b5b6000612c6f86828701612aec565b9350506020612c8086828701612aec565b9250506040612c9186828701612bb1565b9150509250925092565b60008060008060808587031215612cb557612cb4613be7565b5b6000612cc387828801612aec565b9450506020612cd487828801612aec565b9350506040612ce587828801612bb1565b925050606085013567ffffffffffffffff811115612d0657612d05613be2565b5b612d1287828801612b55565b91505092959194509250565b60008060408385031215612d3557612d34613be7565b5b6000612d4385828601612aec565b9250506020612d5485828601612b01565b9150509250929050565b60008060408385031215612d7557612d74613be7565b5b6000612d8385828601612aec565b9250506020612d9485828601612bb1565b9150509250929050565b600060208284031215612db457612db3613be7565b5b6000612dc284828501612b01565b91505092915050565b600060208284031215612de157612de0613be7565b5b6000612def84828501612b16565b91505092915050565b600060208284031215612e0e57612e0d613be7565b5b6000612e1c84828501612b2b565b91505092915050565b600060208284031215612e3b57612e3a613be7565b5b6000612e4984828501612b40565b91505092915050565b600060208284031215612e6857612e67613be7565b5b600082013567ffffffffffffffff811115612e8657612e85613be2565b5b612e9284828501612b83565b91505092915050565b600060208284031215612eb157612eb0613be7565b5b6000612ebf84828501612bb1565b91505092915050565b600060208284031215612ede57612edd613be7565b5b6000612eec84828501612bc6565b91505092915050565b60008060408385031215612f0c57612f0b613be7565b5b6000612f1a85828601612bb1565b9250506020612f2b85828601612aec565b9150509250929050565b60008060408385031215612f4c57612f4b613be7565b5b6000612f5a85828601612bb1565b9250506020612f6b85828601612bb1565b9150509250929050565b6000612f818383613368565b60208301905092915050565b612f968161395a565b82525050565b6000612fa7826137d9565b612fb18185613807565b9350612fbc836137c9565b8060005b83811015612fed578151612fd48882612f75565b9750612fdf836137fa565b925050600181019050612fc0565b5085935050505092915050565b6130038161396c565b82525050565b6000613014826137e4565b61301e8185613818565b935061302e8185602086016139dd565b61303781613bec565b840191505092915050565b600061304d826137ef565b6130578185613829565b93506130678185602086016139dd565b61307081613bec565b840191505092915050565b6000613086826137ef565b613090818561383a565b93506130a08185602086016139dd565b80840191505092915050565b60006130b9603283613829565b91506130c482613bfd565b604082019050919050565b60006130dc602683613829565b91506130e782613c4c565b604082019050919050565b60006130ff602f83613829565b915061310a82613c9b565b604082019050919050565b6000613122602583613829565b915061312d82613cea565b604082019050919050565b6000613145601c83613829565b915061315082613d39565b602082019050919050565b6000613168602283613829565b915061317382613d62565b604082019050919050565b600061318b602483613829565b915061319682613db1565b604082019050919050565b60006131ae601983613829565b91506131b982613e00565b602082019050919050565b60006131d1602c83613829565b91506131dc82613e29565b604082019050919050565b60006131f4603183613829565b91506131ff82613e78565b604082019050919050565b6000613217603883613829565b915061322282613ec7565b604082019050919050565b600061323a602a83613829565b915061324582613f16565b604082019050919050565b600061325d602983613829565b915061326882613f65565b604082019050919050565b6000613280602083613829565b915061328b82613fb4565b602082019050919050565b60006132a3602c83613829565b91506132ae82613fdd565b604082019050919050565b60006132c6602083613829565b91506132d18261402c565b602082019050919050565b60006132e9601783613829565b91506132f482614055565b602082019050919050565b600061330c602f83613829565b91506133178261407e565b604082019050919050565b600061332f602183613829565b915061333a826140cd565b604082019050919050565b6000613352603183613829565b915061335d8261411c565b604082019050919050565b613371816139c4565b82525050565b613380816139c4565b82525050565b6000613392828561307b565b915061339e828461307b565b91508190509392505050565b60006020820190506133bf6000830184612f8d565b92915050565b60006060820190506133da6000830186612f8d565b6133e76020830185612f8d565b6133f46040830184613377565b949350505050565b60006080820190506134116000830187612f8d565b61341e6020830186612f8d565b61342b6040830185613377565b818103606083015261343d8184613009565b905095945050505050565b600060208201905081810360008301526134628184612f9c565b905092915050565b600060208201905061347f6000830184612ffa565b92915050565b6000602082019050818103600083015261349f8184613042565b905092915050565b600060208201905081810360008301526134c0816130ac565b9050919050565b600060208201905081810360008301526134e0816130cf565b9050919050565b60006020820190508181036000830152613500816130f2565b9050919050565b6000602082019050818103600083015261352081613115565b9050919050565b6000602082019050818103600083015261354081613138565b9050919050565b600060208201905081810360008301526135608161315b565b9050919050565b600060208201905081810360008301526135808161317e565b9050919050565b600060208201905081810360008301526135a0816131a1565b9050919050565b600060208201905081810360008301526135c0816131c4565b9050919050565b600060208201905081810360008301526135e0816131e7565b9050919050565b600060208201905081810360008301526136008161320a565b9050919050565b600060208201905081810360008301526136208161322d565b9050919050565b6000602082019050818103600083015261364081613250565b9050919050565b6000602082019050818103600083015261366081613273565b9050919050565b6000602082019050818103600083015261368081613296565b9050919050565b600060208201905081810360008301526136a0816132b9565b9050919050565b600060208201905081810360008301526136c0816132dc565b9050919050565b600060208201905081810360008301526136e0816132ff565b9050919050565b6000602082019050818103600083015261370081613322565b9050919050565b6000602082019050818103600083015261372081613345565b9050919050565b600060208201905061373c6000830184613377565b92915050565b600061374c61375d565b90506137588282613a42565b919050565b6000604051905090565b600067ffffffffffffffff82111561378257613781613ba9565b5b61378b82613bec565b9050602081019050919050565b600067ffffffffffffffff8211156137b3576137b2613ba9565b5b6137bc82613bec565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613850826139c4565b915061385b836139c4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138905761388f613aed565b5b828201905092915050565b60006138a6826139c4565b91506138b1836139c4565b9250826138c1576138c0613b1c565b5b828204905092915050565b60006138d7826139c4565b91506138e2836139c4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561391b5761391a613aed565b5b828202905092915050565b6000613931826139c4565b915061393c836139c4565b92508282101561394f5761394e613aed565b5b828203905092915050565b6000613965826139a4565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156139fb5780820151818401526020810190506139e0565b83811115613a0a576000848401525b50505050565b60006002820490506001821680613a2857607f821691505b60208210811415613a3c57613a3b613b4b565b5b50919050565b613a4b82613bec565b810181811067ffffffffffffffff82111715613a6a57613a69613ba9565b5b80604052505050565b6000613a7e826139c4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ab157613ab0613aed565b5b600182019050919050565b6000613ac7826139c4565b9150613ad2836139c4565b925082613ae257613ae1613b1c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d657461476f6368694e66743a204e6f7420656e6f756768207477696e20656760008201527f6720746f6b656e2062616c616e63650000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d657461476f6368694e66743a20496e76616c6964206d696e7420616d6f756e60008201527f7421000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d657461476f6368694e66743a204e6f7420656e6f7567682073696e676c652060008201527f65676720746f6b656e2062616c616e6365000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6141748161395a565b811461417f57600080fd5b50565b61418b8161396c565b811461419657600080fd5b50565b6141a281613978565b81146141ad57600080fd5b50565b6141b9816139c4565b81146141c457600080fd5b5056fea2646970667358221220f8ee24e1544dc3e517dddcce9c0869e1a347e0eca6a102a01c87c56d40c7324a64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101e35760003560e01c806370a0823111610102578063a22cb46511610095578063c87b56dd11610064578063c87b56dd146106bd578063e985e9c5146106fa578063efbd73f414610737578063f2fde38b14610760576101e3565b8063a22cb46514610619578063b071401b14610642578063b88d4fde1461066b578063c4b7bb4514610694576101e3565b80638da5cb5b116100d15780638da5cb5b1461056d5780638ea5220f1461059857806394354fd0146105c357806395d89b41146105ee576101e3565b806370a08231146104c5578063715018a61461050257806378518829146105195780637ec4a65914610544576101e3565b806323b872dd1161017a57806355a095181161014957806355a09518146104075780635c975abb1461043257806362b99ad41461045d5780636352211e14610488576101e3565b806323b872dd1461034f578063301abd671461037857806342842e0e146103a1578063438b6300146103ca576101e3565b806316c38b3c116101b657806316c38b3c146102b657806318160ddd146102df5780631b2ef1ca1461030a5780631f53ac0214610326576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190612df8565b610789565b60405161021c919061346a565b60405180910390f35b34801561023157600080fd5b5061023a61086b565b6040516102479190613485565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190612e9b565b6108fd565b60405161028491906133aa565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190612d5e565b610982565b005b3480156102c257600080fd5b506102dd60048036038101906102d89190612d9e565b610a9a565b005b3480156102eb57600080fd5b506102f4610b33565b6040516103019190613727565b60405180910390f35b610324600480360381019061031f9190612f35565b610b44565b005b34801561033257600080fd5b5061034d60048036038101906103489190612bdb565b610fc4565b005b34801561035b57600080fd5b5061037660048036038101906103719190612c48565b611084565b005b34801561038457600080fd5b5061039f600480360381019061039a9190612bdb565b6110e4565b005b3480156103ad57600080fd5b506103c860048036038101906103c39190612c48565b6111a4565b005b3480156103d657600080fd5b506103f160048036038101906103ec9190612bdb565b6111c4565b6040516103fe9190613448565b60405180910390f35b34801561041357600080fd5b5061041c6112c1565b60405161042991906133aa565b60405180910390f35b34801561043e57600080fd5b506104476112e7565b604051610454919061346a565b60405180910390f35b34801561046957600080fd5b506104726112fa565b60405161047f9190613485565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190612e9b565b611388565b6040516104bc91906133aa565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190612bdb565b61143a565b6040516104f99190613727565b60405180910390f35b34801561050e57600080fd5b506105176114f2565b005b34801561052557600080fd5b5061052e61157a565b60405161053b91906133aa565b60405180910390f35b34801561055057600080fd5b5061056b60048036038101906105669190612e52565b6115a0565b005b34801561057957600080fd5b50610582611636565b60405161058f91906133aa565b60405180910390f35b3480156105a457600080fd5b506105ad611660565b6040516105ba91906133aa565b60405180910390f35b3480156105cf57600080fd5b506105d8611686565b6040516105e59190613727565b60405180910390f35b3480156105fa57600080fd5b5061060361168c565b6040516106109190613485565b60405180910390f35b34801561062557600080fd5b50610640600480360381019061063b9190612d1e565b61171e565b005b34801561064e57600080fd5b5061066960048036038101906106649190612e9b565b611734565b005b34801561067757600080fd5b50610692600480360381019061068d9190612c9b565b6117ba565b005b3480156106a057600080fd5b506106bb60048036038101906106b69190612bdb565b61181c565b005b3480156106c957600080fd5b506106e460048036038101906106df9190612e9b565b6118dc565b6040516106f19190613485565b60405180910390f35b34801561070657600080fd5b50610721600480360381019061071c9190612c08565b611983565b60405161072e919061346a565b60405180910390f35b34801561074357600080fd5b5061075e60048036038101906107599190612ef5565b611a17565b005b34801561076c57600080fd5b5061078760048036038101906107829190612bdb565b611af4565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061085457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610864575061086382611bec565b5b9050919050565b60606000805461087a90613a10565b80601f01602080910402602001604051908101604052809291908181526020018280546108a690613a10565b80156108f35780601f106108c8576101008083540402835291602001916108f3565b820191906000526020600020905b8154815290600101906020018083116108d657829003601f168201915b5050505050905090565b600061090882611c56565b610947576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093e90613667565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061098d82611388565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f5906136e7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a1d611cc2565b73ffffffffffffffffffffffffffffffffffffffff161480610a4c5750610a4b81610a46611cc2565b611983565b5b610a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a82906135e7565b60405180910390fd5b610a958383611cca565b505050565b610aa2611cc2565b73ffffffffffffffffffffffffffffffffffffffff16610ac0611636565b73ffffffffffffffffffffffffffffffffffffffff1614610b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0d90613687565b60405180910390fd5b80600a60006101000a81548160ff02191690831515021790555050565b6000610b3f6007611d83565b905090565b600281610b5191906138cc565b82610b5c9190613845565b600081118015610b6e57506009548111155b610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba490613547565b60405180910390fd5b600a60009054906101000a900460ff1615610bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf4906136a7565b60405180910390fd5b6000831115610dd8576000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610c6391906133aa565b60206040518083038186803b158015610c7b57600080fd5b505afa158015610c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb39190612ec8565b905083811015610cf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cef906135c7565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16876040518463ffffffff1660e01b8152600401610d79939291906133c5565b602060405180830381600087803b158015610d9357600080fd5b505af1158015610da7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcb9190612dcb565b50610dd63385611d91565b505b6000821115610fbf576000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610e3e91906133aa565b60206040518083038186803b158015610e5657600080fd5b505afa158015610e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8e9190612ec8565b905082811015610ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca906134e7565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518463ffffffff1660e01b8152600401610f54939291906133c5565b602060405180830381600087803b158015610f6e57600080fd5b505af1158015610f82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa69190612dcb565b50610fbd33600285610fb891906138cc565b611d91565b505b505050565b610fcc611cc2565b73ffffffffffffffffffffffffffffffffffffffff16610fea611636565b73ffffffffffffffffffffffffffffffffffffffff1614611040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103790613687565b60405180910390fd5b80600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61109561108f611cc2565b82611dd1565b6110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb90613707565b60405180910390fd5b6110df838383611eaf565b505050565b6110ec611cc2565b73ffffffffffffffffffffffffffffffffffffffff1661110a611636565b73ffffffffffffffffffffffffffffffffffffffff1614611160576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115790613687565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6111bf838383604051806020016040528060008152506117ba565b505050565b606060006111d18361143a565b905060008167ffffffffffffffff8111156111ef576111ee613ba9565b5b60405190808252806020026020018201604052801561121d5781602001602082028036833780820191505090505b50905060006001905060005b838110156112b557600061123c83611388565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112a1578284838151811061128657611285613b7a565b5b602002602001018181525050818061129d90613a73565b9250505b82806112ac90613a73565b93505050611229565b82945050505050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900460ff1681565b6008805461130790613a10565b80601f016020809104026020016040519081016040528092919081815260200182805461133390613a10565b80156113805780601f1061135557610100808354040283529160200191611380565b820191906000526020600020905b81548152906001019060200180831161136357829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611431576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142890613627565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a290613607565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114fa611cc2565b73ffffffffffffffffffffffffffffffffffffffff16611518611636565b73ffffffffffffffffffffffffffffffffffffffff161461156e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156590613687565b60405180910390fd5b6115786000612116565b565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6115a8611cc2565b73ffffffffffffffffffffffffffffffffffffffff166115c6611636565b73ffffffffffffffffffffffffffffffffffffffff161461161c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161390613687565b60405180910390fd5b80600890805190602001906116329291906129c5565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b60606001805461169b90613a10565b80601f01602080910402602001604051908101604052809291908181526020018280546116c790613a10565b80156117145780601f106116e957610100808354040283529160200191611714565b820191906000526020600020905b8154815290600101906020018083116116f757829003601f168201915b5050505050905090565b611730611729611cc2565b83836121dc565b5050565b61173c611cc2565b73ffffffffffffffffffffffffffffffffffffffff1661175a611636565b73ffffffffffffffffffffffffffffffffffffffff16146117b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a790613687565b60405180910390fd5b8060098190555050565b6117cb6117c5611cc2565b83611dd1565b61180a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180190613707565b60405180910390fd5b61181684848484612349565b50505050565b611824611cc2565b73ffffffffffffffffffffffffffffffffffffffff16611842611636565b73ffffffffffffffffffffffffffffffffffffffff1614611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f90613687565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606118e782611c56565b611926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191d906136c7565b60405180910390fd5b60006119306123a5565b90506000815111611950576040518060200160405280600081525061197b565b8061195a84612437565b60405160200161196b929190613386565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b81600081118015611a2a57506009548111155b611a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6090613547565b60405180910390fd5b611a71611cc2565b73ffffffffffffffffffffffffffffffffffffffff16611a8f611636565b73ffffffffffffffffffffffffffffffffffffffff1614611ae5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adc90613687565b60405180910390fd5b611aef8284611d91565b505050565b611afc611cc2565b73ffffffffffffffffffffffffffffffffffffffff16611b1a611636565b73ffffffffffffffffffffffffffffffffffffffff1614611b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6790613687565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd7906134c7565b60405180910390fd5b611be981612116565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d3d83611388565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60005b81811015611dcc57611da66007612598565b611db983611db46007611d83565b6125ae565b8080611dc490613a73565b915050611d94565b505050565b6000611ddc82611c56565b611e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e12906135a7565b60405180910390fd5b6000611e2683611388565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e685750611e678185611983565b5b80611ea657508373ffffffffffffffffffffffffffffffffffffffff16611e8e846108fd565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ecf82611388565b73ffffffffffffffffffffffffffffffffffffffff1614611f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1c90613507565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8c90613567565b60405180910390fd5b611fa08383836125cc565b611fab600082611cca565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ffb9190613926565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120529190613845565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121118383836125d1565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561224b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224290613587565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161233c919061346a565b60405180910390a3505050565b612354848484611eaf565b612360848484846125d6565b61239f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612396906134a7565b60405180910390fd5b50505050565b6060600880546123b490613a10565b80601f01602080910402602001604051908101604052809291908181526020018280546123e090613a10565b801561242d5780601f106124025761010080835404028352916020019161242d565b820191906000526020600020905b81548152906001019060200180831161241057829003601f168201915b5050505050905090565b6060600082141561247f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612593565b600082905060005b600082146124b157808061249a90613a73565b915050600a826124aa919061389b565b9150612487565b60008167ffffffffffffffff8111156124cd576124cc613ba9565b5b6040519080825280601f01601f1916602001820160405280156124ff5781602001600182028036833780820191505090505b5090505b6000851461258c576001826125189190613926565b9150600a856125279190613abc565b60306125339190613845565b60f81b81838151811061254957612548613b7a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612585919061389b565b9450612503565b8093505050505b919050565b6001816000016000828254019250508190555050565b6125c882826040518060200160405280600081525061276d565b5050565b505050565b505050565b60006125f78473ffffffffffffffffffffffffffffffffffffffff166127c8565b15612760578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612620611cc2565b8786866040518563ffffffff1660e01b815260040161264294939291906133fc565b602060405180830381600087803b15801561265c57600080fd5b505af192505050801561268d57506040513d601f19601f8201168201806040525081019061268a9190612e25565b60015b612710573d80600081146126bd576040519150601f19603f3d011682016040523d82523d6000602084013e6126c2565b606091505b50600081511415612708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ff906134a7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612765565b600190505b949350505050565b61277783836127eb565b61278460008484846125d6565b6127c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ba906134a7565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561285b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285290613647565b60405180910390fd5b61286481611c56565b156128a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289b90613527565b60405180910390fd5b6128b0600083836125cc565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129009190613845565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129c1600083836125d1565b5050565b8280546129d190613a10565b90600052602060002090601f0160209004810192826129f35760008555612a3a565b82601f10612a0c57805160ff1916838001178555612a3a565b82800160010185558215612a3a579182015b82811115612a39578251825591602001919060010190612a1e565b5b509050612a479190612a4b565b5090565b5b80821115612a64576000816000905550600101612a4c565b5090565b6000612a7b612a7684613767565b613742565b905082815260208101848484011115612a9757612a96613bdd565b5b612aa28482856139ce565b509392505050565b6000612abd612ab884613798565b613742565b905082815260208101848484011115612ad957612ad8613bdd565b5b612ae48482856139ce565b509392505050565b600081359050612afb8161416b565b92915050565b600081359050612b1081614182565b92915050565b600081519050612b2581614182565b92915050565b600081359050612b3a81614199565b92915050565b600081519050612b4f81614199565b92915050565b600082601f830112612b6a57612b69613bd8565b5b8135612b7a848260208601612a68565b91505092915050565b600082601f830112612b9857612b97613bd8565b5b8135612ba8848260208601612aaa565b91505092915050565b600081359050612bc0816141b0565b92915050565b600081519050612bd5816141b0565b92915050565b600060208284031215612bf157612bf0613be7565b5b6000612bff84828501612aec565b91505092915050565b60008060408385031215612c1f57612c1e613be7565b5b6000612c2d85828601612aec565b9250506020612c3e85828601612aec565b9150509250929050565b600080600060608486031215612c6157612c60613be7565b5b6000612c6f86828701612aec565b9350506020612c8086828701612aec565b9250506040612c9186828701612bb1565b9150509250925092565b60008060008060808587031215612cb557612cb4613be7565b5b6000612cc387828801612aec565b9450506020612cd487828801612aec565b9350506040612ce587828801612bb1565b925050606085013567ffffffffffffffff811115612d0657612d05613be2565b5b612d1287828801612b55565b91505092959194509250565b60008060408385031215612d3557612d34613be7565b5b6000612d4385828601612aec565b9250506020612d5485828601612b01565b9150509250929050565b60008060408385031215612d7557612d74613be7565b5b6000612d8385828601612aec565b9250506020612d9485828601612bb1565b9150509250929050565b600060208284031215612db457612db3613be7565b5b6000612dc284828501612b01565b91505092915050565b600060208284031215612de157612de0613be7565b5b6000612def84828501612b16565b91505092915050565b600060208284031215612e0e57612e0d613be7565b5b6000612e1c84828501612b2b565b91505092915050565b600060208284031215612e3b57612e3a613be7565b5b6000612e4984828501612b40565b91505092915050565b600060208284031215612e6857612e67613be7565b5b600082013567ffffffffffffffff811115612e8657612e85613be2565b5b612e9284828501612b83565b91505092915050565b600060208284031215612eb157612eb0613be7565b5b6000612ebf84828501612bb1565b91505092915050565b600060208284031215612ede57612edd613be7565b5b6000612eec84828501612bc6565b91505092915050565b60008060408385031215612f0c57612f0b613be7565b5b6000612f1a85828601612bb1565b9250506020612f2b85828601612aec565b9150509250929050565b60008060408385031215612f4c57612f4b613be7565b5b6000612f5a85828601612bb1565b9250506020612f6b85828601612bb1565b9150509250929050565b6000612f818383613368565b60208301905092915050565b612f968161395a565b82525050565b6000612fa7826137d9565b612fb18185613807565b9350612fbc836137c9565b8060005b83811015612fed578151612fd48882612f75565b9750612fdf836137fa565b925050600181019050612fc0565b5085935050505092915050565b6130038161396c565b82525050565b6000613014826137e4565b61301e8185613818565b935061302e8185602086016139dd565b61303781613bec565b840191505092915050565b600061304d826137ef565b6130578185613829565b93506130678185602086016139dd565b61307081613bec565b840191505092915050565b6000613086826137ef565b613090818561383a565b93506130a08185602086016139dd565b80840191505092915050565b60006130b9603283613829565b91506130c482613bfd565b604082019050919050565b60006130dc602683613829565b91506130e782613c4c565b604082019050919050565b60006130ff602f83613829565b915061310a82613c9b565b604082019050919050565b6000613122602583613829565b915061312d82613cea565b604082019050919050565b6000613145601c83613829565b915061315082613d39565b602082019050919050565b6000613168602283613829565b915061317382613d62565b604082019050919050565b600061318b602483613829565b915061319682613db1565b604082019050919050565b60006131ae601983613829565b91506131b982613e00565b602082019050919050565b60006131d1602c83613829565b91506131dc82613e29565b604082019050919050565b60006131f4603183613829565b91506131ff82613e78565b604082019050919050565b6000613217603883613829565b915061322282613ec7565b604082019050919050565b600061323a602a83613829565b915061324582613f16565b604082019050919050565b600061325d602983613829565b915061326882613f65565b604082019050919050565b6000613280602083613829565b915061328b82613fb4565b602082019050919050565b60006132a3602c83613829565b91506132ae82613fdd565b604082019050919050565b60006132c6602083613829565b91506132d18261402c565b602082019050919050565b60006132e9601783613829565b91506132f482614055565b602082019050919050565b600061330c602f83613829565b91506133178261407e565b604082019050919050565b600061332f602183613829565b915061333a826140cd565b604082019050919050565b6000613352603183613829565b915061335d8261411c565b604082019050919050565b613371816139c4565b82525050565b613380816139c4565b82525050565b6000613392828561307b565b915061339e828461307b565b91508190509392505050565b60006020820190506133bf6000830184612f8d565b92915050565b60006060820190506133da6000830186612f8d565b6133e76020830185612f8d565b6133f46040830184613377565b949350505050565b60006080820190506134116000830187612f8d565b61341e6020830186612f8d565b61342b6040830185613377565b818103606083015261343d8184613009565b905095945050505050565b600060208201905081810360008301526134628184612f9c565b905092915050565b600060208201905061347f6000830184612ffa565b92915050565b6000602082019050818103600083015261349f8184613042565b905092915050565b600060208201905081810360008301526134c0816130ac565b9050919050565b600060208201905081810360008301526134e0816130cf565b9050919050565b60006020820190508181036000830152613500816130f2565b9050919050565b6000602082019050818103600083015261352081613115565b9050919050565b6000602082019050818103600083015261354081613138565b9050919050565b600060208201905081810360008301526135608161315b565b9050919050565b600060208201905081810360008301526135808161317e565b9050919050565b600060208201905081810360008301526135a0816131a1565b9050919050565b600060208201905081810360008301526135c0816131c4565b9050919050565b600060208201905081810360008301526135e0816131e7565b9050919050565b600060208201905081810360008301526136008161320a565b9050919050565b600060208201905081810360008301526136208161322d565b9050919050565b6000602082019050818103600083015261364081613250565b9050919050565b6000602082019050818103600083015261366081613273565b9050919050565b6000602082019050818103600083015261368081613296565b9050919050565b600060208201905081810360008301526136a0816132b9565b9050919050565b600060208201905081810360008301526136c0816132dc565b9050919050565b600060208201905081810360008301526136e0816132ff565b9050919050565b6000602082019050818103600083015261370081613322565b9050919050565b6000602082019050818103600083015261372081613345565b9050919050565b600060208201905061373c6000830184613377565b92915050565b600061374c61375d565b90506137588282613a42565b919050565b6000604051905090565b600067ffffffffffffffff82111561378257613781613ba9565b5b61378b82613bec565b9050602081019050919050565b600067ffffffffffffffff8211156137b3576137b2613ba9565b5b6137bc82613bec565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613850826139c4565b915061385b836139c4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138905761388f613aed565b5b828201905092915050565b60006138a6826139c4565b91506138b1836139c4565b9250826138c1576138c0613b1c565b5b828204905092915050565b60006138d7826139c4565b91506138e2836139c4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561391b5761391a613aed565b5b828202905092915050565b6000613931826139c4565b915061393c836139c4565b92508282101561394f5761394e613aed565b5b828203905092915050565b6000613965826139a4565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156139fb5780820151818401526020810190506139e0565b83811115613a0a576000848401525b50505050565b60006002820490506001821680613a2857607f821691505b60208210811415613a3c57613a3b613b4b565b5b50919050565b613a4b82613bec565b810181811067ffffffffffffffff82111715613a6a57613a69613ba9565b5b80604052505050565b6000613a7e826139c4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ab157613ab0613aed565b5b600182019050919050565b6000613ac7826139c4565b9150613ad2836139c4565b925082613ae257613ae1613b1c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d657461476f6368694e66743a204e6f7420656e6f756768207477696e20656760008201527f6720746f6b656e2062616c616e63650000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d657461476f6368694e66743a20496e76616c6964206d696e7420616d6f756e60008201527f7421000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d657461476f6368694e66743a204e6f7420656e6f7567682073696e676c652060008201527f65676720746f6b656e2062616c616e6365000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6141748161395a565b811461417f57600080fd5b50565b61418b8161396c565b811461419657600080fd5b50565b6141a281613978565b81146141ad57600080fd5b50565b6141b9816139c4565b81146141c457600080fd5b5056fea2646970667358221220f8ee24e1544dc3e517dddcce9c0869e1a347e0eca6a102a01c87c56d40c7324a64736f6c63430008070033

Deployed Bytecode Sourcemap

55397:4042:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42200:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43145:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44705:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44228:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58682:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56143:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56238:981;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58765:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45455:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58865:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45865:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57225:604;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55749:74;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55643:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55559:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42839:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42569:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22783:103;;;;;;;;;;;;;:::i;:::-;;55828:72;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58576:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22132:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55675:69;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55598:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43314:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44998:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58440:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46121:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58985:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57835:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45224:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58279:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23041:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42200:305;42302:4;42354:25;42339:40;;;:11;:40;;;;:105;;;;42411:33;42396:48;;;:11;:48;;;;42339:105;:158;;;;42461:36;42485:11;42461:23;:36::i;:::-;42339:158;42319:178;;42200:305;;;:::o;43145:100::-;43199:13;43232:5;43225:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43145:100;:::o;44705:221::-;44781:7;44809:16;44817:7;44809;:16::i;:::-;44801:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44894:15;:24;44910:7;44894:24;;;;;;;;;;;;;;;;;;;;;44887:31;;44705:221;;;:::o;44228:411::-;44309:13;44325:23;44340:7;44325:14;:23::i;:::-;44309:39;;44373:5;44367:11;;:2;:11;;;;44359:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;44467:5;44451:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;44476:37;44493:5;44500:12;:10;:12::i;:::-;44476:16;:37::i;:::-;44451:62;44429:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;44610:21;44619:2;44623:7;44610:8;:21::i;:::-;44298:341;44228:411;;:::o;58682:77::-;22363:12;:10;:12::i;:::-;22352:23;;:7;:5;:7::i;:::-;:23;;;22344:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58747:6:::1;58738;;:15;;;;;;;;;;;;;;;;;;58682:77:::0;:::o;56143:89::-;56187:7;56210:16;:6;:14;:16::i;:::-;56203:23;;56143:89;:::o;56238:981::-;56368:1;56351:14;:18;;;;:::i;:::-;56332:16;:37;;;;:::i;:::-;56046:1;56032:11;:15;:52;;;;;56066:18;;56051:11;:33;;56032:52;56024:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;56387:6:::1;;;;;;;;;;;56386:7;56378:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;56453:1;56434:16;:20;56431:396;;;56465:22;56497:14;;;;;;;;;;;56490:32;;;56523:10;56490:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56465:69;;56569:16;56551:14;:34;;56543:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;56702:14;;;;;;;;;;;56695:35;;;56731:10;56743:9;;;;;;;;;;;56754:16;56695:76;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;56780:39;56790:10;56802:16;56780:9;:39::i;:::-;56456:371;56431:396;56855:1;56838:14;:18;56835:379;;;56866:20;56896:12;;;;;;;;;;;56889:30;;;56920:10;56889:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56866:65;;56964:14;56948:12;:30;;56940:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;57092:12;;;;;;;;;;;57085:33;;;57119:10;57131:9;;;;;;;;;;;57142:14;57085:72;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57165:41;57175:10;57204:1;57187:14;:18;;;;:::i;:::-;57165:9;:41::i;:::-;56858:356;56835:379;56238:981:::0;;;:::o;58765:94::-;22363:12;:10;:12::i;:::-;22352:23;;:7;:5;:7::i;:::-;:23;;;22344:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58843:10:::1;58831:9;;:22;;;;;;;;;;;;;;;;;;58765:94:::0;:::o;45455:339::-;45650:41;45669:12;:10;:12::i;:::-;45683:7;45650:18;:41::i;:::-;45642:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;45758:28;45768:4;45774:2;45778:7;45758:9;:28::i;:::-;45455:339;;;:::o;58865:114::-;22363:12;:10;:12::i;:::-;22352:23;;:7;:5;:7::i;:::-;:23;;;22344:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58958:15:::1;58941:14;;:32;;;;;;;;;;;;;;;;;;58865:114:::0;:::o;45865:185::-;46003:39;46020:4;46026:2;46030:7;46003:39;;;;;;;;;;;;:16;:39::i;:::-;45865:185;;;:::o;57225:604::-;57300:16;57328:23;57354:17;57364:6;57354:9;:17::i;:::-;57328:43;;57378:30;57425:15;57411:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57378:63;;57448:22;57473:1;57448:26;;57481:23;57517:278;57542:15;57524;:33;57517:278;;;57568:25;57596:23;57604:14;57596:7;:23::i;:::-;57568:51;;57655:6;57634:27;;:17;:27;;;57630:131;;;57707:14;57674:13;57688:15;57674:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;57734:17;;;;;:::i;:::-;;;;57630:131;57771:16;;;;;:::i;:::-;;;;57559:236;57517:278;;;57810:13;57803:20;;;;;;57225:604;;;:::o;55749:74::-;;;;;;;;;;;;;:::o;55643:25::-;;;;;;;;;;;;;:::o;55559:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42839:239::-;42911:7;42931:13;42947:7;:16;42955:7;42947:16;;;;;;;;;;;;;;;;;;;;;42931:32;;42999:1;42982:19;;:5;:19;;;;42974:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43065:5;43058:12;;;42839:239;;;:::o;42569:208::-;42641:7;42686:1;42669:19;;:5;:19;;;;42661:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;42753:9;:16;42763:5;42753:16;;;;;;;;;;;;;;;;42746:23;;42569:208;;;:::o;22783:103::-;22363:12;:10;:12::i;:::-;22352:23;;:7;:5;:7::i;:::-;:23;;;22344:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22848:30:::1;22875:1;22848:18;:30::i;:::-;22783:103::o:0;55828:72::-;;;;;;;;;;;;;:::o;58576:100::-;22363:12;:10;:12::i;:::-;22352:23;;:7;:5;:7::i;:::-;:23;;;22344:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58660:10:::1;58648:9;:22;;;;;;;;;;;;:::i;:::-;;58576:100:::0;:::o;22132:87::-;22178:7;22205:6;;;;;;;;;;;22198:13;;22132:87;:::o;55675:69::-;;;;;;;;;;;;;:::o;55598:38::-;;;;:::o;43314:104::-;43370:13;43403:7;43396:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43314:104;:::o;44998:155::-;45093:52;45112:12;:10;:12::i;:::-;45126:8;45136;45093:18;:52::i;:::-;44998:155;;:::o;58440:130::-;22363:12;:10;:12::i;:::-;22352:23;;:7;:5;:7::i;:::-;:23;;;22344:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58545:19:::1;58524:18;:40;;;;58440:130:::0;:::o;46121:328::-;46296:41;46315:12;:10;:12::i;:::-;46329:7;46296:18;:41::i;:::-;46288:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;46402:39;46416:4;46422:2;46426:7;46435:5;46402:13;:39::i;:::-;46121:328;;;;:::o;58985:106::-;22363:12;:10;:12::i;:::-;22352:23;;:7;:5;:7::i;:::-;:23;;;22344:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59072:13:::1;59057:12;;:28;;;;;;;;;;;;;;;;;;58985:106:::0;:::o;57835:411::-;57934:13;57975:17;57983:8;57975:7;:17::i;:::-;57959:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;58066:28;58097:10;:8;:10::i;:::-;58066:41;;58152:1;58127:14;58121:28;:32;:119;;;;;;;;;;;;;;;;;58189:14;58205:19;:8;:17;:19::i;:::-;58172:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58121:119;58114:126;;;57835:411;;;:::o;45224:164::-;45321:4;45345:18;:25;45364:5;45345:25;;;;;;;;;;;;;;;:35;45371:8;45345:35;;;;;;;;;;;;;;;;;;;;;;;;;45338:42;;45224:164;;;;:::o;58279:155::-;58365:11;56046:1;56032:11;:15;:52;;;;;56066:18;;56051:11;:33;;56032:52;56024:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;22363:12:::1;:10;:12::i;:::-;22352:23;;:7;:5;:7::i;:::-;:23;;;22344:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58395:33:::2;58405:9;58416:11;58395:9;:33::i;:::-;58279:155:::0;;;:::o;23041:201::-;22363:12;:10;:12::i;:::-;22352:23;;:7;:5;:7::i;:::-;:23;;;22344:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23150:1:::1;23130:22;;:8;:22;;;;23122:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23206:28;23225:8;23206:18;:28::i;:::-;23041:201:::0;:::o;34939:157::-;35024:4;35063:25;35048:40;;;:11;:40;;;;35041:47;;34939:157;;;:::o;47959:127::-;48024:4;48076:1;48048:30;;:7;:16;48056:7;48048:16;;;;;;;;;;;;;;;;;;;;;:30;;;;48041:37;;47959:127;;;:::o;7915:98::-;7968:7;7995:10;7988:17;;7915:98;:::o;52105:174::-;52207:2;52180:15;:24;52196:7;52180:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;52263:7;52259:2;52225:46;;52234:23;52249:7;52234:14;:23::i;:::-;52225:46;;;;;;;;;;;;52105:174;;:::o;4519:114::-;4584:7;4611;:14;;;4604:21;;4519:114;;;:::o;59122:204::-;59202:9;59197:124;59221:11;59217:1;:15;59197:124;;;59248:18;:6;:16;:18::i;:::-;59275:38;59285:9;59296:16;:6;:14;:16::i;:::-;59275:9;:38::i;:::-;59234:3;;;;;:::i;:::-;;;;59197:124;;;;59122:204;;:::o;48253:348::-;48346:4;48371:16;48379:7;48371;:16::i;:::-;48363:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;48447:13;48463:23;48478:7;48463:14;:23::i;:::-;48447:39;;48516:5;48505:16;;:7;:16;;;:52;;;;48525:32;48542:5;48549:7;48525:16;:32::i;:::-;48505:52;:87;;;;48585:7;48561:31;;:20;48573:7;48561:11;:20::i;:::-;:31;;;48505:87;48497:96;;;48253:348;;;;:::o;51362:625::-;51521:4;51494:31;;:23;51509:7;51494:14;:23::i;:::-;:31;;;51486:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;51600:1;51586:16;;:2;:16;;;;51578:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;51656:39;51677:4;51683:2;51687:7;51656:20;:39::i;:::-;51760:29;51777:1;51781:7;51760:8;:29::i;:::-;51821:1;51802:9;:15;51812:4;51802:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;51850:1;51833:9;:13;51843:2;51833:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;51881:2;51862:7;:16;51870:7;51862:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;51920:7;51916:2;51901:27;;51910:4;51901:27;;;;;;;;;;;;51941:38;51961:4;51967:2;51971:7;51941:19;:38::i;:::-;51362:625;;;:::o;23402:191::-;23476:16;23495:6;;;;;;;;;;;23476:25;;23521:8;23512:6;;:17;;;;;;;;;;;;;;;;;;23576:8;23545:40;;23566:8;23545:40;;;;;;;;;;;;23465:128;23402:191;:::o;52421:315::-;52576:8;52567:17;;:5;:17;;;;52559:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;52663:8;52625:18;:25;52644:5;52625:25;;;;;;;;;;;;;;;:35;52651:8;52625:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;52709:8;52687:41;;52702:5;52687:41;;;52719:8;52687:41;;;;;;:::i;:::-;;;;;;;;52421:315;;;:::o;47331:::-;47488:28;47498:4;47504:2;47508:7;47488:9;:28::i;:::-;47535:48;47558:4;47564:2;47568:7;47577:5;47535:22;:48::i;:::-;47527:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;47331:315;;;;:::o;59332:104::-;59392:13;59421:9;59414:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59332:104;:::o;5477:723::-;5533:13;5763:1;5754:5;:10;5750:53;;;5781:10;;;;;;;;;;;;;;;;;;;;;5750:53;5813:12;5828:5;5813:20;;5844:14;5869:78;5884:1;5876:4;:9;5869:78;;5902:8;;;;;:::i;:::-;;;;5933:2;5925:10;;;;;:::i;:::-;;;5869:78;;;5957:19;5989:6;5979:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5957:39;;6007:154;6023:1;6014:5;:10;6007:154;;6051:1;6041:11;;;;;:::i;:::-;;;6118:2;6110:5;:10;;;;:::i;:::-;6097:2;:24;;;;:::i;:::-;6084:39;;6067:6;6074;6067:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;6147:2;6138:11;;;;;:::i;:::-;;;6007:154;;;6185:6;6171:21;;;;;5477:723;;;;:::o;4641:127::-;4748:1;4730:7;:14;;;:19;;;;;;;;;;;4641:127;:::o;48943:110::-;49019:26;49029:2;49033:7;49019:26;;;;;;;;;;;;:9;:26::i;:::-;48943:110;;:::o;54672:126::-;;;;:::o;55183:125::-;;;;:::o;53301:799::-;53456:4;53477:15;:2;:13;;;:15::i;:::-;53473:620;;;53529:2;53513:36;;;53550:12;:10;:12::i;:::-;53564:4;53570:7;53579:5;53513:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53509:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53772:1;53755:6;:13;:18;53751:272;;;53798:60;;;;;;;;;;:::i;:::-;;;;;;;;53751:272;53973:6;53967:13;53958:6;53954:2;53950:15;53943:38;53509:529;53646:41;;;53636:51;;;:6;:51;;;;53629:58;;;;;53473:620;54077:4;54070:11;;53301:799;;;;;;;:::o;49280:321::-;49410:18;49416:2;49420:7;49410:5;:18::i;:::-;49461:54;49492:1;49496:2;49500:7;49509:5;49461:22;:54::i;:::-;49439:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;49280:321;;;:::o;24833:326::-;24893:4;25150:1;25128:7;:19;;;:23;25121:30;;24833:326;;;:::o;49937:439::-;50031:1;50017:16;;:2;:16;;;;50009:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;50090:16;50098:7;50090;:16::i;:::-;50089:17;50081:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;50152:45;50181:1;50185:2;50189:7;50152:20;:45::i;:::-;50227:1;50210:9;:13;50220:2;50210:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;50258:2;50239:7;:16;50247:7;50239:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;50303:7;50299:2;50278:33;;50295:1;50278:33;;;;;;;;;;;;50324:44;50352:1;50356:2;50360:7;50324:19;:44::i;:::-;49937:439;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1179:5;1210:6;1204:13;1195:22;;1226:30;1250:5;1226:30;:::i;:::-;1125:137;;;;:::o;1268:::-;1313:5;1351:6;1338:20;1329:29;;1367:32;1393:5;1367:32;:::i;:::-;1268:137;;;;:::o;1411:141::-;1467:5;1498:6;1492:13;1483:22;;1514:32;1540:5;1514:32;:::i;:::-;1411:141;;;;:::o;1571:338::-;1626:5;1675:3;1668:4;1660:6;1656:17;1652:27;1642:122;;1683:79;;:::i;:::-;1642:122;1800:6;1787:20;1825:78;1899:3;1891:6;1884:4;1876:6;1872:17;1825:78;:::i;:::-;1816:87;;1632:277;1571:338;;;;:::o;1929:340::-;1985:5;2034:3;2027:4;2019:6;2015:17;2011:27;2001:122;;2042:79;;:::i;:::-;2001:122;2159:6;2146:20;2184:79;2259:3;2251:6;2244:4;2236:6;2232:17;2184:79;:::i;:::-;2175:88;;1991:278;1929:340;;;;:::o;2275:139::-;2321:5;2359:6;2346:20;2337:29;;2375:33;2402:5;2375:33;:::i;:::-;2275:139;;;;:::o;2420:143::-;2477:5;2508:6;2502:13;2493:22;;2524:33;2551:5;2524:33;:::i;:::-;2420:143;;;;:::o;2569:329::-;2628:6;2677:2;2665:9;2656:7;2652:23;2648:32;2645:119;;;2683:79;;:::i;:::-;2645:119;2803:1;2828:53;2873:7;2864:6;2853:9;2849:22;2828:53;:::i;:::-;2818:63;;2774:117;2569:329;;;;:::o;2904:474::-;2972:6;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;2904:474;;;;;:::o;3384:619::-;3461:6;3469;3477;3526:2;3514:9;3505:7;3501:23;3497:32;3494:119;;;3532:79;;:::i;:::-;3494:119;3652:1;3677:53;3722:7;3713:6;3702:9;3698:22;3677:53;:::i;:::-;3667:63;;3623:117;3779:2;3805:53;3850:7;3841:6;3830:9;3826:22;3805:53;:::i;:::-;3795:63;;3750:118;3907:2;3933:53;3978:7;3969:6;3958:9;3954:22;3933:53;:::i;:::-;3923:63;;3878:118;3384:619;;;;;:::o;4009:943::-;4104:6;4112;4120;4128;4177:3;4165:9;4156:7;4152:23;4148:33;4145:120;;;4184:79;;:::i;:::-;4145:120;4304:1;4329:53;4374:7;4365:6;4354:9;4350:22;4329:53;:::i;:::-;4319:63;;4275:117;4431:2;4457:53;4502:7;4493:6;4482:9;4478:22;4457:53;:::i;:::-;4447:63;;4402:118;4559:2;4585:53;4630:7;4621:6;4610:9;4606:22;4585:53;:::i;:::-;4575:63;;4530:118;4715:2;4704:9;4700:18;4687:32;4746:18;4738:6;4735:30;4732:117;;;4768:79;;:::i;:::-;4732:117;4873:62;4927:7;4918:6;4907:9;4903:22;4873:62;:::i;:::-;4863:72;;4658:287;4009:943;;;;;;;:::o;4958:468::-;5023:6;5031;5080:2;5068:9;5059:7;5055:23;5051:32;5048:119;;;5086:79;;:::i;:::-;5048:119;5206:1;5231:53;5276:7;5267:6;5256:9;5252:22;5231:53;:::i;:::-;5221:63;;5177:117;5333:2;5359:50;5401:7;5392:6;5381:9;5377:22;5359:50;:::i;:::-;5349:60;;5304:115;4958:468;;;;;:::o;5432:474::-;5500:6;5508;5557:2;5545:9;5536:7;5532:23;5528:32;5525:119;;;5563:79;;:::i;:::-;5525:119;5683:1;5708:53;5753:7;5744:6;5733:9;5729:22;5708:53;:::i;:::-;5698:63;;5654:117;5810:2;5836:53;5881:7;5872:6;5861:9;5857:22;5836:53;:::i;:::-;5826:63;;5781:118;5432:474;;;;;:::o;5912:323::-;5968:6;6017:2;6005:9;5996:7;5992:23;5988:32;5985:119;;;6023:79;;:::i;:::-;5985:119;6143:1;6168:50;6210:7;6201:6;6190:9;6186:22;6168:50;:::i;:::-;6158:60;;6114:114;5912:323;;;;:::o;6241:345::-;6308:6;6357:2;6345:9;6336:7;6332:23;6328:32;6325:119;;;6363:79;;:::i;:::-;6325:119;6483:1;6508:61;6561:7;6552:6;6541:9;6537:22;6508:61;:::i;:::-;6498:71;;6454:125;6241:345;;;;:::o;6592:327::-;6650:6;6699:2;6687:9;6678:7;6674:23;6670:32;6667:119;;;6705:79;;:::i;:::-;6667:119;6825:1;6850:52;6894:7;6885:6;6874:9;6870:22;6850:52;:::i;:::-;6840:62;;6796:116;6592:327;;;;:::o;6925:349::-;6994:6;7043:2;7031:9;7022:7;7018:23;7014:32;7011:119;;;7049:79;;:::i;:::-;7011:119;7169:1;7194:63;7249:7;7240:6;7229:9;7225:22;7194:63;:::i;:::-;7184:73;;7140:127;6925:349;;;;:::o;7280:509::-;7349:6;7398:2;7386:9;7377:7;7373:23;7369:32;7366:119;;;7404:79;;:::i;:::-;7366:119;7552:1;7541:9;7537:17;7524:31;7582:18;7574:6;7571:30;7568:117;;;7604:79;;:::i;:::-;7568:117;7709:63;7764:7;7755:6;7744:9;7740:22;7709:63;:::i;:::-;7699:73;;7495:287;7280:509;;;;:::o;7795:329::-;7854:6;7903:2;7891:9;7882:7;7878:23;7874:32;7871:119;;;7909:79;;:::i;:::-;7871:119;8029:1;8054:53;8099:7;8090:6;8079:9;8075:22;8054:53;:::i;:::-;8044:63;;8000:117;7795:329;;;;:::o;8130:351::-;8200:6;8249:2;8237:9;8228:7;8224:23;8220:32;8217:119;;;8255:79;;:::i;:::-;8217:119;8375:1;8400:64;8456:7;8447:6;8436:9;8432:22;8400:64;:::i;:::-;8390:74;;8346:128;8130:351;;;;:::o;8487:474::-;8555:6;8563;8612:2;8600:9;8591:7;8587:23;8583:32;8580:119;;;8618:79;;:::i;:::-;8580:119;8738:1;8763:53;8808:7;8799:6;8788:9;8784:22;8763:53;:::i;:::-;8753:63;;8709:117;8865:2;8891:53;8936:7;8927:6;8916:9;8912:22;8891:53;:::i;:::-;8881:63;;8836:118;8487:474;;;;;:::o;8967:::-;9035:6;9043;9092:2;9080:9;9071:7;9067:23;9063:32;9060:119;;;9098:79;;:::i;:::-;9060:119;9218:1;9243:53;9288:7;9279:6;9268:9;9264:22;9243:53;:::i;:::-;9233:63;;9189:117;9345:2;9371:53;9416:7;9407:6;9396:9;9392:22;9371:53;:::i;:::-;9361:63;;9316:118;8967:474;;;;;:::o;9447:179::-;9516:10;9537:46;9579:3;9571:6;9537:46;:::i;:::-;9615:4;9610:3;9606:14;9592:28;;9447:179;;;;:::o;9632:118::-;9719:24;9737:5;9719:24;:::i;:::-;9714:3;9707:37;9632:118;;:::o;9786:732::-;9905:3;9934:54;9982:5;9934:54;:::i;:::-;10004:86;10083:6;10078:3;10004:86;:::i;:::-;9997:93;;10114:56;10164:5;10114:56;:::i;:::-;10193:7;10224:1;10209:284;10234:6;10231:1;10228:13;10209:284;;;10310:6;10304:13;10337:63;10396:3;10381:13;10337:63;:::i;:::-;10330:70;;10423:60;10476:6;10423:60;:::i;:::-;10413:70;;10269:224;10256:1;10253;10249:9;10244:14;;10209:284;;;10213:14;10509:3;10502:10;;9910:608;;;9786:732;;;;:::o;10524:109::-;10605:21;10620:5;10605:21;:::i;:::-;10600:3;10593:34;10524:109;;:::o;10639:360::-;10725:3;10753:38;10785:5;10753:38;:::i;:::-;10807:70;10870:6;10865:3;10807:70;:::i;:::-;10800:77;;10886:52;10931:6;10926:3;10919:4;10912:5;10908:16;10886:52;:::i;:::-;10963:29;10985:6;10963:29;:::i;:::-;10958:3;10954:39;10947:46;;10729:270;10639:360;;;;:::o;11005:364::-;11093:3;11121:39;11154:5;11121:39;:::i;:::-;11176:71;11240:6;11235:3;11176:71;:::i;:::-;11169:78;;11256:52;11301:6;11296:3;11289:4;11282:5;11278:16;11256:52;:::i;:::-;11333:29;11355:6;11333:29;:::i;:::-;11328:3;11324:39;11317:46;;11097:272;11005:364;;;;:::o;11375:377::-;11481:3;11509:39;11542:5;11509:39;:::i;:::-;11564:89;11646:6;11641:3;11564:89;:::i;:::-;11557:96;;11662:52;11707:6;11702:3;11695:4;11688:5;11684:16;11662:52;:::i;:::-;11739:6;11734:3;11730:16;11723:23;;11485:267;11375:377;;;;:::o;11758:366::-;11900:3;11921:67;11985:2;11980:3;11921:67;:::i;:::-;11914:74;;11997:93;12086:3;11997:93;:::i;:::-;12115:2;12110:3;12106:12;12099:19;;11758:366;;;:::o;12130:::-;12272:3;12293:67;12357:2;12352:3;12293:67;:::i;:::-;12286:74;;12369:93;12458:3;12369:93;:::i;:::-;12487:2;12482:3;12478:12;12471:19;;12130:366;;;:::o;12502:::-;12644:3;12665:67;12729:2;12724:3;12665:67;:::i;:::-;12658:74;;12741:93;12830:3;12741:93;:::i;:::-;12859:2;12854:3;12850:12;12843:19;;12502:366;;;:::o;12874:::-;13016:3;13037:67;13101:2;13096:3;13037:67;:::i;:::-;13030:74;;13113:93;13202:3;13113:93;:::i;:::-;13231:2;13226:3;13222:12;13215:19;;12874:366;;;:::o;13246:::-;13388:3;13409:67;13473:2;13468:3;13409:67;:::i;:::-;13402:74;;13485:93;13574:3;13485:93;:::i;:::-;13603:2;13598:3;13594:12;13587:19;;13246:366;;;:::o;13618:::-;13760:3;13781:67;13845:2;13840:3;13781:67;:::i;:::-;13774:74;;13857:93;13946:3;13857:93;:::i;:::-;13975:2;13970:3;13966:12;13959:19;;13618:366;;;:::o;13990:::-;14132:3;14153:67;14217:2;14212:3;14153:67;:::i;:::-;14146:74;;14229:93;14318:3;14229:93;:::i;:::-;14347:2;14342:3;14338:12;14331:19;;13990:366;;;:::o;14362:::-;14504:3;14525:67;14589:2;14584:3;14525:67;:::i;:::-;14518:74;;14601:93;14690:3;14601:93;:::i;:::-;14719:2;14714:3;14710:12;14703:19;;14362:366;;;:::o;14734:::-;14876:3;14897:67;14961:2;14956:3;14897:67;:::i;:::-;14890:74;;14973:93;15062:3;14973:93;:::i;:::-;15091:2;15086:3;15082:12;15075:19;;14734:366;;;:::o;15106:::-;15248:3;15269:67;15333:2;15328:3;15269:67;:::i;:::-;15262:74;;15345:93;15434:3;15345:93;:::i;:::-;15463:2;15458:3;15454:12;15447:19;;15106:366;;;:::o;15478:::-;15620:3;15641:67;15705:2;15700:3;15641:67;:::i;:::-;15634:74;;15717:93;15806:3;15717:93;:::i;:::-;15835:2;15830:3;15826:12;15819:19;;15478:366;;;:::o;15850:::-;15992:3;16013:67;16077:2;16072:3;16013:67;:::i;:::-;16006:74;;16089:93;16178:3;16089:93;:::i;:::-;16207:2;16202:3;16198:12;16191:19;;15850:366;;;:::o;16222:::-;16364:3;16385:67;16449:2;16444:3;16385:67;:::i;:::-;16378:74;;16461:93;16550:3;16461:93;:::i;:::-;16579:2;16574:3;16570:12;16563:19;;16222:366;;;:::o;16594:::-;16736:3;16757:67;16821:2;16816:3;16757:67;:::i;:::-;16750:74;;16833:93;16922:3;16833:93;:::i;:::-;16951:2;16946:3;16942:12;16935:19;;16594:366;;;:::o;16966:::-;17108:3;17129:67;17193:2;17188:3;17129:67;:::i;:::-;17122:74;;17205:93;17294:3;17205:93;:::i;:::-;17323:2;17318:3;17314:12;17307:19;;16966:366;;;:::o;17338:::-;17480:3;17501:67;17565:2;17560:3;17501:67;:::i;:::-;17494:74;;17577:93;17666:3;17577:93;:::i;:::-;17695:2;17690:3;17686:12;17679:19;;17338:366;;;:::o;17710:::-;17852:3;17873:67;17937:2;17932:3;17873:67;:::i;:::-;17866:74;;17949:93;18038:3;17949:93;:::i;:::-;18067:2;18062:3;18058:12;18051:19;;17710:366;;;:::o;18082:::-;18224:3;18245:67;18309:2;18304:3;18245:67;:::i;:::-;18238:74;;18321:93;18410:3;18321:93;:::i;:::-;18439:2;18434:3;18430:12;18423:19;;18082:366;;;:::o;18454:::-;18596:3;18617:67;18681:2;18676:3;18617:67;:::i;:::-;18610:74;;18693:93;18782:3;18693:93;:::i;:::-;18811:2;18806:3;18802:12;18795:19;;18454:366;;;:::o;18826:::-;18968:3;18989:67;19053:2;19048:3;18989:67;:::i;:::-;18982:74;;19065:93;19154:3;19065:93;:::i;:::-;19183:2;19178:3;19174:12;19167:19;;18826:366;;;:::o;19198:108::-;19275:24;19293:5;19275:24;:::i;:::-;19270:3;19263:37;19198:108;;:::o;19312:118::-;19399:24;19417:5;19399:24;:::i;:::-;19394:3;19387:37;19312:118;;:::o;19436:435::-;19616:3;19638:95;19729:3;19720:6;19638:95;:::i;:::-;19631:102;;19750:95;19841:3;19832:6;19750:95;:::i;:::-;19743:102;;19862:3;19855:10;;19436:435;;;;;:::o;19877:222::-;19970:4;20008:2;19997:9;19993:18;19985:26;;20021:71;20089:1;20078:9;20074:17;20065:6;20021:71;:::i;:::-;19877:222;;;;:::o;20105:442::-;20254:4;20292:2;20281:9;20277:18;20269:26;;20305:71;20373:1;20362:9;20358:17;20349:6;20305:71;:::i;:::-;20386:72;20454:2;20443:9;20439:18;20430:6;20386:72;:::i;:::-;20468;20536:2;20525:9;20521:18;20512:6;20468:72;:::i;:::-;20105:442;;;;;;:::o;20553:640::-;20748:4;20786:3;20775:9;20771:19;20763:27;;20800:71;20868:1;20857:9;20853:17;20844:6;20800:71;:::i;:::-;20881:72;20949:2;20938:9;20934:18;20925:6;20881:72;:::i;:::-;20963;21031:2;21020:9;21016:18;21007:6;20963:72;:::i;:::-;21082:9;21076:4;21072:20;21067:2;21056:9;21052:18;21045:48;21110:76;21181:4;21172:6;21110:76;:::i;:::-;21102:84;;20553:640;;;;;;;:::o;21199:373::-;21342:4;21380:2;21369:9;21365:18;21357:26;;21429:9;21423:4;21419:20;21415:1;21404:9;21400:17;21393:47;21457:108;21560:4;21551:6;21457:108;:::i;:::-;21449:116;;21199:373;;;;:::o;21578:210::-;21665:4;21703:2;21692:9;21688:18;21680:26;;21716:65;21778:1;21767:9;21763:17;21754:6;21716:65;:::i;:::-;21578:210;;;;:::o;21794:313::-;21907:4;21945:2;21934:9;21930:18;21922:26;;21994:9;21988:4;21984:20;21980:1;21969:9;21965:17;21958:47;22022:78;22095:4;22086:6;22022:78;:::i;:::-;22014:86;;21794:313;;;;:::o;22113:419::-;22279:4;22317:2;22306:9;22302:18;22294:26;;22366:9;22360:4;22356:20;22352:1;22341:9;22337:17;22330:47;22394:131;22520:4;22394:131;:::i;:::-;22386:139;;22113:419;;;:::o;22538:::-;22704:4;22742:2;22731:9;22727:18;22719:26;;22791:9;22785:4;22781:20;22777:1;22766:9;22762:17;22755:47;22819:131;22945:4;22819:131;:::i;:::-;22811:139;;22538:419;;;:::o;22963:::-;23129:4;23167:2;23156:9;23152:18;23144:26;;23216:9;23210:4;23206:20;23202:1;23191:9;23187:17;23180:47;23244:131;23370:4;23244:131;:::i;:::-;23236:139;;22963:419;;;:::o;23388:::-;23554:4;23592:2;23581:9;23577:18;23569:26;;23641:9;23635:4;23631:20;23627:1;23616:9;23612:17;23605:47;23669:131;23795:4;23669:131;:::i;:::-;23661:139;;23388:419;;;:::o;23813:::-;23979:4;24017:2;24006:9;24002:18;23994:26;;24066:9;24060:4;24056:20;24052:1;24041:9;24037:17;24030:47;24094:131;24220:4;24094:131;:::i;:::-;24086:139;;23813:419;;;:::o;24238:::-;24404:4;24442:2;24431:9;24427:18;24419:26;;24491:9;24485:4;24481:20;24477:1;24466:9;24462:17;24455:47;24519:131;24645:4;24519:131;:::i;:::-;24511:139;;24238:419;;;:::o;24663:::-;24829:4;24867:2;24856:9;24852:18;24844:26;;24916:9;24910:4;24906:20;24902:1;24891:9;24887:17;24880:47;24944:131;25070:4;24944:131;:::i;:::-;24936:139;;24663:419;;;:::o;25088:::-;25254:4;25292:2;25281:9;25277:18;25269:26;;25341:9;25335:4;25331:20;25327:1;25316:9;25312:17;25305:47;25369:131;25495:4;25369:131;:::i;:::-;25361:139;;25088:419;;;:::o;25513:::-;25679:4;25717:2;25706:9;25702:18;25694:26;;25766:9;25760:4;25756:20;25752:1;25741:9;25737:17;25730:47;25794:131;25920:4;25794:131;:::i;:::-;25786:139;;25513:419;;;:::o;25938:::-;26104:4;26142:2;26131:9;26127:18;26119:26;;26191:9;26185:4;26181:20;26177:1;26166:9;26162:17;26155:47;26219:131;26345:4;26219:131;:::i;:::-;26211:139;;25938:419;;;:::o;26363:::-;26529:4;26567:2;26556:9;26552:18;26544:26;;26616:9;26610:4;26606:20;26602:1;26591:9;26587:17;26580:47;26644:131;26770:4;26644:131;:::i;:::-;26636:139;;26363:419;;;:::o;26788:::-;26954:4;26992:2;26981:9;26977:18;26969:26;;27041:9;27035:4;27031:20;27027:1;27016:9;27012:17;27005:47;27069:131;27195:4;27069:131;:::i;:::-;27061:139;;26788:419;;;:::o;27213:::-;27379:4;27417:2;27406:9;27402:18;27394:26;;27466:9;27460:4;27456:20;27452:1;27441:9;27437:17;27430:47;27494:131;27620:4;27494:131;:::i;:::-;27486:139;;27213:419;;;:::o;27638:::-;27804:4;27842:2;27831:9;27827:18;27819:26;;27891:9;27885:4;27881:20;27877:1;27866:9;27862:17;27855:47;27919:131;28045:4;27919:131;:::i;:::-;27911:139;;27638:419;;;:::o;28063:::-;28229:4;28267:2;28256:9;28252:18;28244:26;;28316:9;28310:4;28306:20;28302:1;28291:9;28287:17;28280:47;28344:131;28470:4;28344:131;:::i;:::-;28336:139;;28063:419;;;:::o;28488:::-;28654:4;28692:2;28681:9;28677:18;28669:26;;28741:9;28735:4;28731:20;28727:1;28716:9;28712:17;28705:47;28769:131;28895:4;28769:131;:::i;:::-;28761:139;;28488:419;;;:::o;28913:::-;29079:4;29117:2;29106:9;29102:18;29094:26;;29166:9;29160:4;29156:20;29152:1;29141:9;29137:17;29130:47;29194:131;29320:4;29194:131;:::i;:::-;29186:139;;28913:419;;;:::o;29338:::-;29504:4;29542:2;29531:9;29527:18;29519:26;;29591:9;29585:4;29581:20;29577:1;29566:9;29562:17;29555:47;29619:131;29745:4;29619:131;:::i;:::-;29611:139;;29338:419;;;:::o;29763:::-;29929:4;29967:2;29956:9;29952:18;29944:26;;30016:9;30010:4;30006:20;30002:1;29991:9;29987:17;29980:47;30044:131;30170:4;30044:131;:::i;:::-;30036:139;;29763:419;;;:::o;30188:::-;30354:4;30392:2;30381:9;30377:18;30369:26;;30441:9;30435:4;30431:20;30427:1;30416:9;30412:17;30405:47;30469:131;30595:4;30469:131;:::i;:::-;30461:139;;30188:419;;;:::o;30613:222::-;30706:4;30744:2;30733:9;30729:18;30721:26;;30757:71;30825:1;30814:9;30810:17;30801:6;30757:71;:::i;:::-;30613:222;;;;:::o;30841:129::-;30875:6;30902:20;;:::i;:::-;30892:30;;30931:33;30959:4;30951:6;30931:33;:::i;:::-;30841:129;;;:::o;30976:75::-;31009:6;31042:2;31036:9;31026:19;;30976:75;:::o;31057:307::-;31118:4;31208:18;31200:6;31197:30;31194:56;;;31230:18;;:::i;:::-;31194:56;31268:29;31290:6;31268:29;:::i;:::-;31260:37;;31352:4;31346;31342:15;31334:23;;31057:307;;;:::o;31370:308::-;31432:4;31522:18;31514:6;31511:30;31508:56;;;31544:18;;:::i;:::-;31508:56;31582:29;31604:6;31582:29;:::i;:::-;31574:37;;31666:4;31660;31656:15;31648:23;;31370:308;;;:::o;31684:132::-;31751:4;31774:3;31766:11;;31804:4;31799:3;31795:14;31787:22;;31684:132;;;:::o;31822:114::-;31889:6;31923:5;31917:12;31907:22;;31822:114;;;:::o;31942:98::-;31993:6;32027:5;32021:12;32011:22;;31942:98;;;:::o;32046:99::-;32098:6;32132:5;32126:12;32116:22;;32046:99;;;:::o;32151:113::-;32221:4;32253;32248:3;32244:14;32236:22;;32151:113;;;:::o;32270:184::-;32369:11;32403:6;32398:3;32391:19;32443:4;32438:3;32434:14;32419:29;;32270:184;;;;:::o;32460:168::-;32543:11;32577:6;32572:3;32565:19;32617:4;32612:3;32608:14;32593:29;;32460:168;;;;:::o;32634:169::-;32718:11;32752:6;32747:3;32740:19;32792:4;32787:3;32783:14;32768:29;;32634:169;;;;:::o;32809:148::-;32911:11;32948:3;32933:18;;32809:148;;;;:::o;32963:305::-;33003:3;33022:20;33040:1;33022:20;:::i;:::-;33017:25;;33056:20;33074:1;33056:20;:::i;:::-;33051:25;;33210:1;33142:66;33138:74;33135:1;33132:81;33129:107;;;33216:18;;:::i;:::-;33129:107;33260:1;33257;33253:9;33246:16;;32963:305;;;;:::o;33274:185::-;33314:1;33331:20;33349:1;33331:20;:::i;:::-;33326:25;;33365:20;33383:1;33365:20;:::i;:::-;33360:25;;33404:1;33394:35;;33409:18;;:::i;:::-;33394:35;33451:1;33448;33444:9;33439:14;;33274:185;;;;:::o;33465:348::-;33505:7;33528:20;33546:1;33528:20;:::i;:::-;33523:25;;33562:20;33580:1;33562:20;:::i;:::-;33557:25;;33750:1;33682:66;33678:74;33675:1;33672:81;33667:1;33660:9;33653:17;33649:105;33646:131;;;33757:18;;:::i;:::-;33646:131;33805:1;33802;33798:9;33787:20;;33465:348;;;;:::o;33819:191::-;33859:4;33879:20;33897:1;33879:20;:::i;:::-;33874:25;;33913:20;33931:1;33913:20;:::i;:::-;33908:25;;33952:1;33949;33946:8;33943:34;;;33957:18;;:::i;:::-;33943:34;34002:1;33999;33995:9;33987:17;;33819:191;;;;:::o;34016:96::-;34053:7;34082:24;34100:5;34082:24;:::i;:::-;34071:35;;34016:96;;;:::o;34118:90::-;34152:7;34195:5;34188:13;34181:21;34170:32;;34118:90;;;:::o;34214:149::-;34250:7;34290:66;34283:5;34279:78;34268:89;;34214:149;;;:::o;34369:126::-;34406:7;34446:42;34439:5;34435:54;34424:65;;34369:126;;;:::o;34501:77::-;34538:7;34567:5;34556:16;;34501:77;;;:::o;34584:154::-;34668:6;34663:3;34658;34645:30;34730:1;34721:6;34716:3;34712:16;34705:27;34584:154;;;:::o;34744:307::-;34812:1;34822:113;34836:6;34833:1;34830:13;34822:113;;;34921:1;34916:3;34912:11;34906:18;34902:1;34897:3;34893:11;34886:39;34858:2;34855:1;34851:10;34846:15;;34822:113;;;34953:6;34950:1;34947:13;34944:101;;;35033:1;35024:6;35019:3;35015:16;35008:27;34944:101;34793:258;34744:307;;;:::o;35057:320::-;35101:6;35138:1;35132:4;35128:12;35118:22;;35185:1;35179:4;35175:12;35206:18;35196:81;;35262:4;35254:6;35250:17;35240:27;;35196:81;35324:2;35316:6;35313:14;35293:18;35290:38;35287:84;;;35343:18;;:::i;:::-;35287:84;35108:269;35057:320;;;:::o;35383:281::-;35466:27;35488:4;35466:27;:::i;:::-;35458:6;35454:40;35596:6;35584:10;35581:22;35560:18;35548:10;35545:34;35542:62;35539:88;;;35607:18;;:::i;:::-;35539:88;35647:10;35643:2;35636:22;35426:238;35383:281;;:::o;35670:233::-;35709:3;35732:24;35750:5;35732:24;:::i;:::-;35723:33;;35778:66;35771:5;35768:77;35765:103;;;35848:18;;:::i;:::-;35765:103;35895:1;35888:5;35884:13;35877:20;;35670:233;;;:::o;35909:176::-;35941:1;35958:20;35976:1;35958:20;:::i;:::-;35953:25;;35992:20;36010:1;35992:20;:::i;:::-;35987:25;;36031:1;36021:35;;36036:18;;:::i;:::-;36021:35;36077:1;36074;36070:9;36065:14;;35909:176;;;;:::o;36091:180::-;36139:77;36136:1;36129:88;36236:4;36233:1;36226:15;36260:4;36257:1;36250:15;36277:180;36325:77;36322:1;36315:88;36422:4;36419:1;36412:15;36446:4;36443:1;36436:15;36463:180;36511:77;36508:1;36501:88;36608:4;36605:1;36598:15;36632:4;36629:1;36622:15;36649:180;36697:77;36694:1;36687:88;36794:4;36791:1;36784:15;36818:4;36815:1;36808:15;36835:180;36883:77;36880:1;36873:88;36980:4;36977:1;36970:15;37004:4;37001:1;36994:15;37021:117;37130:1;37127;37120:12;37144:117;37253:1;37250;37243:12;37267:117;37376:1;37373;37366:12;37390:117;37499:1;37496;37489:12;37513:102;37554:6;37605:2;37601:7;37596:2;37589:5;37585:14;37581:28;37571:38;;37513:102;;;:::o;37621:237::-;37761:34;37757:1;37749:6;37745:14;37738:58;37830:20;37825:2;37817:6;37813:15;37806:45;37621:237;:::o;37864:225::-;38004:34;38000:1;37992:6;37988:14;37981:58;38073:8;38068:2;38060:6;38056:15;38049:33;37864:225;:::o;38095:234::-;38235:34;38231:1;38223:6;38219:14;38212:58;38304:17;38299:2;38291:6;38287:15;38280:42;38095:234;:::o;38335:224::-;38475:34;38471:1;38463:6;38459:14;38452:58;38544:7;38539:2;38531:6;38527:15;38520:32;38335:224;:::o;38565:178::-;38705:30;38701:1;38693:6;38689:14;38682:54;38565:178;:::o;38749:221::-;38889:34;38885:1;38877:6;38873:14;38866:58;38958:4;38953:2;38945:6;38941:15;38934:29;38749:221;:::o;38976:223::-;39116:34;39112:1;39104:6;39100:14;39093:58;39185:6;39180:2;39172:6;39168:15;39161:31;38976:223;:::o;39205:175::-;39345:27;39341:1;39333:6;39329:14;39322:51;39205:175;:::o;39386:231::-;39526:34;39522:1;39514:6;39510:14;39503:58;39595:14;39590:2;39582:6;39578:15;39571:39;39386:231;:::o;39623:236::-;39763:34;39759:1;39751:6;39747:14;39740:58;39832:19;39827:2;39819:6;39815:15;39808:44;39623:236;:::o;39865:243::-;40005:34;40001:1;39993:6;39989:14;39982:58;40074:26;40069:2;40061:6;40057:15;40050:51;39865:243;:::o;40114:229::-;40254:34;40250:1;40242:6;40238:14;40231:58;40323:12;40318:2;40310:6;40306:15;40299:37;40114:229;:::o;40349:228::-;40489:34;40485:1;40477:6;40473:14;40466:58;40558:11;40553:2;40545:6;40541:15;40534:36;40349:228;:::o;40583:182::-;40723:34;40719:1;40711:6;40707:14;40700:58;40583:182;:::o;40771:231::-;40911:34;40907:1;40899:6;40895:14;40888:58;40980:14;40975:2;40967:6;40963:15;40956:39;40771:231;:::o;41008:182::-;41148:34;41144:1;41136:6;41132:14;41125:58;41008:182;:::o;41196:173::-;41336:25;41332:1;41324:6;41320:14;41313:49;41196:173;:::o;41375:234::-;41515:34;41511:1;41503:6;41499:14;41492:58;41584:17;41579:2;41571:6;41567:15;41560:42;41375:234;:::o;41615:220::-;41755:34;41751:1;41743:6;41739:14;41732:58;41824:3;41819:2;41811:6;41807:15;41800:28;41615:220;:::o;41841:236::-;41981:34;41977:1;41969:6;41965:14;41958:58;42050:19;42045:2;42037:6;42033:15;42026:44;41841:236;:::o;42083:122::-;42156:24;42174:5;42156:24;:::i;:::-;42149:5;42146:35;42136:63;;42195:1;42192;42185:12;42136:63;42083:122;:::o;42211:116::-;42281:21;42296:5;42281:21;:::i;:::-;42274:5;42271:32;42261:60;;42317:1;42314;42307:12;42261:60;42211:116;:::o;42333:120::-;42405:23;42422:5;42405:23;:::i;:::-;42398:5;42395:34;42385:62;;42443:1;42440;42433:12;42385:62;42333:120;:::o;42459:122::-;42532:24;42550:5;42532:24;:::i;:::-;42525:5;42522:35;42512:63;;42571:1;42568;42561:12;42512:63;42459:122;:::o

Swarm Source

ipfs://f8ee24e1544dc3e517dddcce9c0869e1a347e0eca6a102a01c87c56d40c7324a
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.