ETH Price: $3,388.69 (+1.70%)

PharaGoddess (PGS)
 

Overview

TokenID

3229

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

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:
PharaGoddess

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: GPL-3.0
// File: @openzeppelin/contracts/utils/Strings.sol

pragma solidity ^0.8.9;

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



pragma solidity ^0.8.9;

/**
 * @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/access/Ownable.sol



pragma solidity ^0.8.9;


/**
 * @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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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



pragma solidity ^0.8.9;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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

pragma solidity ^0.8.9;

/**
 * @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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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



pragma solidity ^0.8.9;

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



pragma solidity ^0.8.9;


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



pragma solidity ^0.8.9;


/**
 * @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`, 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 Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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

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



pragma solidity ^0.8.9;


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


pragma solidity >=0.8.9;
// to enable certain compiler features



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;
    
    //Mapping para atribuirle un URI para cada token
    mapping(uint256 => string) internal id_to_URI;

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

    /**
     * @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 overriden 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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 || getApproved(tokenId) == spender || isApprovedForAll(owner, 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);
    }

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

    /**
     * @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 of token that is not own");
        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);
    }

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

pragma solidity ^0.8.9;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


pragma solidity ^0.8.9;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}


// Creator: Chiru Labs

pragma solidity ^0.8.9;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        revert('ERC721A: unable to get token of owner by index');
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @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 overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: approve to caller');

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 {
        _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 override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: 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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        require(quantity != 0, 'ERC721A: quantity must be greater than 0');

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    require(
                        _checkOnERC721Received(address(0), to, updatedIndex, _data),
                        'ERC721A: transfer to non ERC721Receiver implementer'
                    );
                }

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

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

    /**
     * @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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert('ERC721A: transfer to non ERC721Receiver implementer');
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)


library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}



contract PharaGoddess is ERC721A, Ownable, ReentrancyGuard{
    
    using Strings for uint256;
    using SafeMath for uint256;
    
    //declares the maximum amount of tokens that can be minted, total and in presale
    uint256 private maxTotalTokens;
    
    //initial part of the URI for the metadata
    string private _currentBaseURI;
        
    //cost of mints depending on state of sale    
    uint private mintCostPreSale1 = 0.1 ether;
    uint private mintCostPreSale2 = 0.1 ether;
    uint private mintCostPublicSale = 0.2 ether;

    //
    uint private amountForPreSale1 = 1000;
    uint private amountForPreSale2 = 1000;
    uint private amountForPublicSale = 2000;
    uint public mintedAmountPreSale1 = 0;
    uint public mintedAmountPreSale2 = 0;
    uint public mintedAmountPublicSale = 0;

    
    //maximum amount of mints allowed per person
    uint256 public maxMintPreSalePerWallet = 5;
    uint256 public maxMintPublicSalePerWallet = 5;

    //the amount of reserved mints that have currently been executed by creator and giveaways
    uint private _reservedMints;
    
    //the maximum amount of reserved mints allowed for creator and giveaways
    uint private maxReservedMints = 33;
    
    //dummy address that we use to sign the mint transaction to make sure it is valid
    address private dummy = 0x80E4929c869102140E69550BBECC20bEd61B080c;
    
    //Reveal nft or not
    bool public revealed = false;

    // whitelist enable
    bool public whitelistEnable = true;

    //dictates if sale is paused or not
    bool private paused;

    //amount of mints that each address has executed
    mapping(address => uint256) public mintsPerAddressPreSale;
    mapping(address => uint256) public mintsPerAddressPublicSale;
    
    //current state os sale
    enum State {NoSale, PreSale1, PreSale2, PublicSale}
    State public saleState = State.NoSale;

    //defines the uri for when the NFTs have not been yet revealed
    string public unrevealedURI;

    // Minting fund
    uint256 private ethFund;

    // Royalty
    uint256 public totalEthRoyaltyPayout;
    uint256 private PRECISION_FACTOR = 10 ** 18;
    uint256 private accEthPerShare;
    mapping(uint256 => uint256) private royaltyDebt;

    
    //declaring initial values for variables
    constructor() ERC721A('PharaGoddess', 'PGS') {
        maxTotalTokens = 4000;
    }
    
    //in case somebody accidentaly sends funds or transaction to contract
    receive() payable external {}
    fallback() payable external {
        revert();
    }
    
    //visualize baseURI
    function _baseURI() internal view virtual override returns (string memory) {
        return _currentBaseURI;
    }
    
    //change baseURI in case needed for IPFS
    function changeBaseURI(string memory baseURI_) public onlyOwner {
        _currentBaseURI = baseURI_;
    }

    function changeUnrevealedURI(string memory unrevealedURI_) public onlyOwner {
        unrevealedURI = unrevealedURI_;
    }

    // for frontend
    function setWhitelistEnable(bool enable) public onlyOwner {
        whitelistEnable = enable;
    }

    function switchToPreSale1(uint256 price, uint maxAmount) public onlyOwner {
        saleState = State.PreSale1;
        mintCostPreSale1 = price;
        amountForPreSale1 = maxAmount;
    }

    function switchToPreSale2(uint256 price, uint maxAmount) public onlyOwner {
        saleState = State.PreSale2;
        mintCostPreSale2 = price;
        amountForPreSale2 = maxAmount;
    }

    function switchToPublicSale(uint256 price, uint maxAmount) public onlyOwner {
        saleState = State.PublicSale;
        mintCostPublicSale = price;
        amountForPublicSale = maxAmount;
    }
    
    function setMaxMintPreSalePerWallet(uint maxAmount) public onlyOwner {
        maxMintPreSalePerWallet = maxAmount;
    }

    function setMaxMintPublicSalePerWallet(uint maxAmount) public onlyOwner {
        maxMintPublicSalePerWallet = maxAmount;
    }

    modifier onlyValidAccess(uint8 _v, bytes32 _r, bytes32 _s) {
        require( isValidAccessMessage(msg.sender,_v,_r,_s), 'Invalid Signature' );
        _;
    }
 
    /* 
    * @dev Verifies if message was signed by owner to give access to _add for this contract.
    *      Assumes Geth signature prefix.
    * @param _add Address of agent with access
    * @param _v ECDSA signature parameter v.
    * @param _r ECDSA signature parameters r.
    * @param _s ECDSA signature parameters s.
    * @return Validity of access message for a given address.
    */
    function isValidAccessMessage(address _add, uint8 _v, bytes32 _r, bytes32 _s) view public returns (bool) {
        bytes32 hash = keccak256(abi.encodePacked(address(this), _add));
        return dummy == ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), _v, _r, _s);
    }
    
    //mint a @param number of NFTs in presale
    function presaleMint(uint256 number, uint8 _v, bytes32 _r, bytes32 _s) onlyValidAccess(_v,  _r, _s) public payable nonReentrant{
        require(!paused, "Sale is paused!");
        require(saleState == State.PreSale1 || saleState == State.PreSale2, "PreSale in not open yet!");
        if(saleState == State.PreSale1){
            require(mintedAmountPreSale1 + number <= amountForPreSale1, "Not enough NFTs for PreSale1 left to mint..");
        }else{ 
            require(mintedAmountPreSale2 + number <= amountForPreSale2, "Not enough NFTs for PreSale2 left to mint..");
        }
        require(totalSupply() + number <= maxTotalTokens - (maxReservedMints  - _reservedMints), "Not enough NFTs left to mint..");
        require(mintsPerAddressPreSale[msg.sender] + number <= maxMintPreSalePerWallet, "Maximum Mints per Address exceeded!");
        require(msg.value >= mintCost() * number, "Not sufficient Ether to mint this amount of NFTs");
        
        _safeMint(msg.sender, number);

        mintsPerAddressPreSale[msg.sender] += number;
        if(saleState == State.PreSale1){
            mintedAmountPreSale1 += number;
        }else {
            mintedAmountPreSale2 += number;
        }

        ethFund += msg.value;
    }

    //mint a @param number of NFTs in public sale
    function publicSaleMint(uint256 number) public payable nonReentrant{
        require(!paused, "Sale is paused!");
        require(saleState == State.PublicSale, "Public Sale in not open yet!");
        require(mintedAmountPublicSale + number <= amountForPublicSale, "Not enough NFTs for PublicSale left to mint..");
        require(totalSupply() + number <= maxTotalTokens - (maxReservedMints - _reservedMints), "Not enough NFTs left to mint..");
        require(mintsPerAddressPublicSale[msg.sender] + number <= maxMintPublicSalePerWallet, "Maximum Mints per Address exceeded!");
        require(msg.value >= mintCost() * number, "Not sufficient Ether to mint this amount of NFTs");

        _safeMint(msg.sender, number);
        mintsPerAddressPublicSale[msg.sender] += number;
        mintedAmountPublicSale += number;

        ethFund += msg.value;
    }
    
    function tokenURI(uint256 tokenId_) public view virtual override returns (string memory) {
        require(_exists(tokenId_), "ERC721Metadata: URI query for nonexistent token");
        
        if (revealed == false) { // Not revealed yet
            return unrevealedURI;
        }
        else {
            string memory baseURI = _baseURI();
            return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId_.toString(), '.json')) : "";
        }    
    }
    
    //reserved NFTs for creator
    function reservedMint(uint number, address recipient) public onlyOwner {
        require(_reservedMints + number <= maxReservedMints, "Not enough Reserved NFTs left to mint..");
        _safeMint(recipient, number);
        _reservedMints += number; 
        
    }
    
    //burn the tokens that have not been sold yet
    function burnUnsoldTokens() public onlyOwner {
        maxTotalTokens = totalSupply();
    }
    
    //retrieve all funds recieved from minting
    function withdrawFund() public onlyOwner {
        require(ethFund > 0, 'No Funds to withdraw, Balance is 0');

        _withdraw(payable(0xd7DDfE7233D872d3600549b570b3631604aA5ffF), ethFund); 
        ethFund = 0; // Reset
    }
    
    //send the percentage of funds to a shareholder´s wallet
    function _withdraw(address payable account, uint256 amount) internal {
        (bool sent, ) = account.call{value: amount}("");
        require(sent, "Failed to send Ether");
    }
    
    //change the dummy account used for signing transactions
    function changeDummy(address _dummy) public onlyOwner {
        dummy = _dummy;
    }
    
    //to see the total amount of reserved mints left 
    function reservedMintsLeft() public onlyOwner view returns(uint) {
        return maxReservedMints - _reservedMints;
    }

    
    //gets the cost of current mint
    function mintCost() public view returns(uint) {
        if (saleState == State.NoSale || saleState == State.PreSale1) {
            return mintCostPreSale1;
        }
        else if(saleState == State.PreSale2){
            return mintCostPreSale2;
        }
        else {
            return mintCostPublicSale;
        }
    }

    function addRewardForRoyalty() payable public {
        totalEthRoyaltyPayout += msg.value;
        accEthPerShare = accEthPerShare.add(msg.value.mul(PRECISION_FACTOR).div(totalSupply()));
    }

    function pendingRoyaltyReward(address account) public view returns (uint256){
        uint256 holdAmount = balanceOf(account);
        uint256 pendingReward = 0;
        for (uint256 i = 0; i < holdAmount; i++) {
            uint256 id = tokenOfOwnerByIndex(account, i);
            pendingReward += (accEthPerShare.div(PRECISION_FACTOR)).sub(royaltyDebt[id]);
        }
        return pendingReward;
    }

    function claimRoyaltyReward() public nonReentrant{
        uint256 holdAmount = balanceOf(msg.sender);
        uint256 pendingReward = 0;
        for (uint256 i = 0; i < holdAmount; i++) {
            uint256 id = tokenOfOwnerByIndex(msg.sender, i);
            pendingReward += (accEthPerShare.div(PRECISION_FACTOR)).sub(royaltyDebt[id]);
            royaltyDebt[id] = accEthPerShare.div(PRECISION_FACTOR);
        }
        _withdraw(payable(msg.sender), pendingReward);
    }

    function reveal() public onlyOwner {
        revealed = true;
    }

    function isSalePaused() public view returns(bool) {
        return paused;
    }

    //turn the pause on and off
    function toggleSalePause() public onlyOwner {
        paused = !paused;
    }
}

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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"addRewardForRoyalty","outputs":[],"stateMutability":"payable","type":"function"},{"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":"burnUnsoldTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dummy","type":"address"}],"name":"changeDummy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"unrevealedURI_","type":"string"}],"name":"changeUnrevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRoyaltyReward","outputs":[],"stateMutability":"nonpayable","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":"isSalePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"isValidAccessMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPreSalePerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPublicSalePerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedAmountPreSale1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedAmountPreSale2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedAmountPublicSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintsPerAddressPreSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintsPerAddressPublicSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"pendingRoyaltyReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"reservedMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedMintsLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"name":"saleState","outputs":[{"internalType":"enum PharaGoddess.State","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxAmount","type":"uint256"}],"name":"setMaxMintPreSalePerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxAmount","type":"uint256"}],"name":"setMaxMintPublicSalePerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"setWhitelistEnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"}],"name":"switchToPreSale1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"}],"name":"switchToPreSale2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"}],"name":"switchToPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSalePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"totalEthRoyaltyPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"unrevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistEnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405267016345785d8a0000600b819055600c556702c68af0bb140000600d556103e8600e819055600f556107d0601055600060118190556012819055601355600560148190556015556021601755601880546001600160b01b03191675010080e4929c869102140e69550bbecc20bed61b080c179055601b805460ff19169055670de0b6b3a7640000601f553480156200009b57600080fd5b50604080518082018252600c81526b5068617261476f646465737360a01b60208083019182528351808501909452600384526250475360e81b908401528151919291620000eb9160019162000185565b5080516200010190600290602084019062000185565b5050506200011e620001186200012f60201b60201c565b62000133565b6001600855610fa060095562000268565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000193906200022b565b90600052602060002090601f016020900481019282620001b7576000855562000202565b82601f10620001d257805160ff191683800117855562000202565b8280016001018555821562000202579182015b8281111562000202578251825591602001919060010190620001e5565b506200021092915062000214565b5090565b5b8082111562000210576000815560010162000215565b600181811c908216806200024057607f821691505b602082108114156200026257634e487b7160e01b600052602260045260246000fd5b50919050565b61337a80620002786000396000f3fe6080604052600436106103385760003560e01c8063715018a6116101ab578063bdb4b848116100f7578063dcd4e73211610095578063e3b182531161006f578063e3b18253146108fe578063e985e9c514610914578063f2fde38b1461095d578063f71e13a81461097d57600080fd5b8063dcd4e732146108b6578063e07fa3c1146108c9578063e282327e146108de57600080fd5b8063cb155f96116100d1578063cb155f9614610849578063cec4ab9c14610869578063d47513de1461088a578063dc9e206f146108a057600080fd5b8063bdb4b848146107f4578063c4d8b9df14610809578063c87b56dd1461082957600080fd5b8063a22cb46511610164578063b3ab66b01161013e578063b3ab66b014610774578063b3b9b8b114610787578063b56d2f67146107b4578063b88d4fde146107d457600080fd5b8063a22cb46514610729578063a475b5dd14610749578063acef455e1461075e57600080fd5b8063715018a61461068c57806373a7a013146106a15780638da5cb5b146106c1578063940bb344146106df57806395d89b41146106f457806398fb0f0a1461070957600080fd5b806332624114116102855780635614e6dc1161022357806367797bf6116101fd57806367797bf614610621578063702bceba146106415780637035bf181461065757806370a082311461066c57600080fd5b80635614e6dc146105ad578063603f4d52146105da5780636352211e1461060157600080fd5b806342842e0e1161025f57806342842e0e146105375780634520e916146105575780634f6ccce71461056c578063518302271461058c57600080fd5b806332624114146104e257806339a0c6f91461050257806339f5fd971461052257600080fd5b806318160ddd116102f25780632545e9c4116102cc5780632545e9c41461048f57806327e8a11a146104975780632c6ff0c7146104ac5780632f745c59146104c257600080fd5b806318160ddd1461043057806318df64031461044f57806323b872dd1461046f57600080fd5b80628ca816146103445780630191a6571461037457806301ffc9a71461039657806306fdde03146103b6578063081812fc146103d8578063095ea7b31461041057600080fd5b3661033f57005b600080fd5b34801561035057600080fd5b50601854600160b01b900460ff165b60405190151581526020015b60405180910390f35b34801561038057600080fd5b5061039461038f366004612c3e565b61099d565b005b3480156103a257600080fd5b5061035f6103b1366004612c6f565b6109f2565b3480156103c257600080fd5b506103cb610a5f565b60405161036b9190612ce4565b3480156103e457600080fd5b506103f86103f3366004612cf7565b610af1565b6040516001600160a01b03909116815260200161036b565b34801561041c57600080fd5b5061039461042b366004612d10565b610b7c565b34801561043c57600080fd5b506000545b60405190815260200161036b565b34801561045b57600080fd5b5061039461046a366004612d3a565b610c94565b34801561047b57600080fd5b5061039461048a366004612d66565b610d52565b610394610d5d565b3480156104a357600080fd5b50610394610da6565b3480156104b857600080fd5b5061044160135481565b3480156104ce57600080fd5b506104416104dd366004612d10565b610df1565b3480156104ee57600080fd5b5061035f6104fd366004612db3565b610f4e565b34801561050e57600080fd5b5061039461051d366004612e81565b61105a565b34801561052e57600080fd5b5061039461109b565b34801561054357600080fd5b50610394610552366004612d66565b611177565b34801561056357600080fd5b50610441611192565b34801561057857600080fd5b50610441610587366004612cf7565b6111d4565b34801561059857600080fd5b5060185461035f90600160a01b900460ff1681565b3480156105b957600080fd5b506104416105c8366004612c3e565b601a6020526000908152604090205481565b3480156105e657600080fd5b50601b546105f49060ff1681565b60405161036b9190612ee0565b34801561060d57600080fd5b506103f861061c366004612cf7565b611236565b34801561062d57600080fd5b5061039461063c366004612cf7565b611248565b34801561064d57600080fd5b5061044160115481565b34801561066357600080fd5b506103cb611277565b34801561067857600080fd5b50610441610687366004612c3e565b611305565b34801561069857600080fd5b50610394611396565b3480156106ad57600080fd5b506104416106bc366004612c3e565b6113cc565b3480156106cd57600080fd5b506007546001600160a01b03166103f8565b3480156106eb57600080fd5b5061039461144a565b34801561070057600080fd5b506103cb61147c565b34801561071557600080fd5b50610394610724366004612f08565b61148b565b34801561073557600080fd5b50610394610744366004612f3a565b6114cd565b34801561075557600080fd5b50610394611592565b34801561076a57600080fd5b50610441601e5481565b610394610782366004612cf7565b6115d1565b34801561079357600080fd5b506104416107a2366004612c3e565b60196020526000908152604090205481565b3480156107c057600080fd5b506103946107cf366004612f64565b611875565b3480156107e057600080fd5b506103946107ef366004612f7f565b6118bd565b34801561080057600080fd5b506104416118f6565b34801561081557600080fd5b50610394610824366004612e81565b61196b565b34801561083557600080fd5b506103cb610844366004612cf7565b6119a8565b34801561085557600080fd5b50610394610864366004612f08565b611b1d565b34801561087557600080fd5b5060185461035f90600160a81b900460ff1681565b34801561089657600080fd5b5061044160125481565b3480156108ac57600080fd5b5061044160155481565b6103946108c4366004612ffb565b611b5f565b3480156108d557600080fd5b50610394611f48565b3480156108ea57600080fd5b506103946108f9366004612cf7565b611ff6565b34801561090a57600080fd5b5061044160145481565b34801561092057600080fd5b5061035f61092f366004613021565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561096957600080fd5b50610394610978366004612c3e565b612025565b34801561098957600080fd5b50610394610998366004612f08565b6120c0565b6007546001600160a01b031633146109d05760405162461bcd60e51b81526004016109c79061304b565b60405180910390fd5b601880546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b1480610a2357506001600160e01b03198216635b5e139f60e01b145b80610a3e57506001600160e01b0319821663780e9d6360e01b145b80610a5957506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610a6e90613080565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9a90613080565b8015610ae75780601f10610abc57610100808354040283529160200191610ae7565b820191906000526020600020905b815481529060010190602001808311610aca57829003601f168201915b5050505050905090565b6000610afe826000541190565b610b605760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084016109c7565b506000908152600560205260409020546001600160a01b031690565b6000610b8782611236565b9050806001600160a01b0316836001600160a01b03161415610bf65760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016109c7565b336001600160a01b0382161480610c125750610c12813361092f565b610c845760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016109c7565b610c8f838383612102565b505050565b6007546001600160a01b03163314610cbe5760405162461bcd60e51b81526004016109c79061304b565b60175482601654610ccf91906130d1565b1115610d2d5760405162461bcd60e51b815260206004820152602760248201527f4e6f7420656e6f756768205265736572766564204e465473206c65667420746f6044820152661036b4b73a171760c91b60648201526084016109c7565b610d37818361215e565b8160166000828254610d4991906130d1565b90915550505050565b610c8f838383612178565b34601e6000828254610d6f91906130d1565b90915550610da19050610d98610d8460005490565b601f54610d9290349061245d565b906124dc565b60205490612537565b602055565b6007546001600160a01b03163314610dd05760405162461bcd60e51b81526004016109c79061304b565b6018805460ff60b01b198116600160b01b9182900460ff1615909102179055565b6000610dfc83611305565b8210610e555760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016109c7565b600080549080805b83811015610eee576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610eb057805192505b876001600160a01b0316836001600160a01b03161415610ee55786841415610ede57509350610a5992505050565b6001909301925b50600101610e5d565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016109c7565b6040516bffffffffffffffffffffffff1930606090811b8216602084015286901b1660348201526000908190604801604051602081830303815290604052805190602001209050600181604051602001610fd491907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015611032573d6000803e3d6000fd5b5050604051601f1901516018546001600160a01b03908116911614925050505b949350505050565b6007546001600160a01b031633146110845760405162461bcd60e51b81526004016109c79061304b565b805161109790600a906020840190612b97565b5050565b600260085414156110be5760405162461bcd60e51b81526004016109c7906130e9565b600260085560006110ce33611305565b90506000805b828110156111635760006110e83383610df1565b905061111e6021600083815260200190815260200160002054611118601f546020546124dc90919063ffffffff16565b90612596565b61112890846130d1565b9250611141601f546020546124dc90919063ffffffff16565b600091825260216020526040909120558061115b81613120565b9150506110d4565b5061116e33826125f2565b50506001600855565b610c8f838383604051806020016040528060008152506118bd565b6007546000906001600160a01b031633146111bf5760405162461bcd60e51b81526004016109c79061304b565b6016546017546111cf919061313b565b905090565b6000805482106112325760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016109c7565b5090565b60006112418261268c565b5192915050565b6007546001600160a01b031633146112725760405162461bcd60e51b81526004016109c79061304b565b601455565b601c805461128490613080565b80601f01602080910402602001604051908101604052809291908181526020018280546112b090613080565b80156112fd5780601f106112d2576101008083540402835291602001916112fd565b820191906000526020600020905b8154815290600101906020018083116112e057829003601f168201915b505050505081565b60006001600160a01b0382166113715760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016109c7565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b031633146113c05760405162461bcd60e51b81526004016109c79061304b565b6113ca6000612763565b565b6000806113d883611305565b90506000805b828110156114425760006113f28683610df1565b90506114226021600083815260200190815260200160002054611118601f546020546124dc90919063ffffffff16565b61142c90846130d1565b925050808061143a90613120565b9150506113de565b509392505050565b6007546001600160a01b031633146114745760405162461bcd60e51b81526004016109c79061304b565b600054600955565b606060028054610a6e90613080565b6007546001600160a01b031633146114b55760405162461bcd60e51b81526004016109c79061304b565b601b805460ff19166003179055600d91909155601055565b6001600160a01b0382163314156115265760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016109c7565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546001600160a01b031633146115bc5760405162461bcd60e51b81526004016109c79061304b565b6018805460ff60a01b1916600160a01b179055565b600260085414156115f45760405162461bcd60e51b81526004016109c7906130e9565b6002600855601854600160b01b900460ff16156116455760405162461bcd60e51b815260206004820152600f60248201526e53616c65206973207061757365642160881b60448201526064016109c7565b6003601b5460ff16600381111561165e5761165e612eca565b146116ab5760405162461bcd60e51b815260206004820152601c60248201527f5075626c69632053616c6520696e206e6f74206f70656e20796574210000000060448201526064016109c7565b601054816013546116bc91906130d1565b11156117205760405162461bcd60e51b815260206004820152602d60248201527f4e6f7420656e6f756768204e46547320666f72205075626c696353616c65206c60448201526c32b33a103a379036b4b73a171760991b60648201526084016109c7565b601654601754611730919061313b565b60095461173d919061313b565b8161174760005490565b61175191906130d1565b111561179f5760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e000060448201526064016109c7565b601554336000908152601a60205260409020546117bd9083906130d1565b11156117db5760405162461bcd60e51b81526004016109c790613152565b806117e46118f6565b6117ee9190613195565b34101561180d5760405162461bcd60e51b81526004016109c7906131b4565b611817338261215e565b336000908152601a6020526040812080548392906118369084906130d1565b92505081905550806013600082825461184f91906130d1565b9250508190555034601d600082825461186891906130d1565b9091555050600160085550565b6007546001600160a01b0316331461189f5760405162461bcd60e51b81526004016109c79061304b565b60188054911515600160a81b0260ff60a81b19909216919091179055565b6118c8848484612178565b6118d4848484846127b5565b6118f05760405162461bcd60e51b81526004016109c790613204565b50505050565b600080601b5460ff16600381111561191057611910612eca565b148061193257506001601b5460ff16600381111561193057611930612eca565b145b1561193e5750600b5490565b6002601b5460ff16600381111561195757611957612eca565b14156119645750600c5490565b50600d5490565b6007546001600160a01b031633146119955760405162461bcd60e51b81526004016109c79061304b565b805161109790601c906020840190612b97565b60606119b5826000541190565b611a195760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109c7565b601854600160a01b900460ff16611abc57601c8054611a3790613080565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6390613080565b8015611ab05780601f10611a8557610100808354040283529160200191611ab0565b820191906000526020600020905b815481529060010190602001808311611a9357829003601f168201915b50505050509050919050565b6000611ac66128bf565b90506000815111611ae65760405180602001604052806000815250611b11565b80611af0846128ce565b604051602001611b01929190613257565b6040516020818303038152906040525b9392505050565b919050565b6007546001600160a01b03163314611b475760405162461bcd60e51b81526004016109c79061304b565b601b805460ff19166002179055600c91909155600f55565b828282611b6e33848484610f4e565b611bae5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964205369676e617475726560781b60448201526064016109c7565b60026008541415611bd15760405162461bcd60e51b81526004016109c7906130e9565b6002600855601854600160b01b900460ff1615611c225760405162461bcd60e51b815260206004820152600f60248201526e53616c65206973207061757365642160881b60448201526064016109c7565b6001601b5460ff166003811115611c3b57611c3b612eca565b1480611c5d57506002601b5460ff166003811115611c5b57611c5b612eca565b145b611ca95760405162461bcd60e51b815260206004820152601860248201527f50726553616c6520696e206e6f74206f70656e2079657421000000000000000060448201526064016109c7565b6001601b5460ff166003811115611cc257611cc2612eca565b1415611d4057600e5487601154611cd991906130d1565b1115611d3b5760405162461bcd60e51b815260206004820152602b60248201527f4e6f7420656e6f756768204e46547320666f722050726553616c6531206c656660448201526a3a103a379036b4b73a171760a91b60648201526084016109c7565b611db3565b600f5487601254611d5191906130d1565b1115611db35760405162461bcd60e51b815260206004820152602b60248201527f4e6f7420656e6f756768204e46547320666f722050726553616c6532206c656660448201526a3a103a379036b4b73a171760a91b60648201526084016109c7565b601654601754611dc3919061313b565b600954611dd0919061313b565b87611dda60005490565b611de491906130d1565b1115611e325760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e000060448201526064016109c7565b60145433600090815260196020526040902054611e509089906130d1565b1115611e6e5760405162461bcd60e51b81526004016109c790613152565b86611e776118f6565b611e819190613195565b341015611ea05760405162461bcd60e51b81526004016109c7906131b4565b611eaa338861215e565b3360009081526019602052604081208054899290611ec99084906130d1565b9091555060019050601b5460ff166003811115611ee857611ee8612eca565b1415611f0b578660116000828254611f0091906130d1565b90915550611f239050565b8660126000828254611f1d91906130d1565b90915550505b34601d6000828254611f3591906130d1565b9091555050600160085550505050505050565b6007546001600160a01b03163314611f725760405162461bcd60e51b81526004016109c79061304b565b6000601d5411611fcf5760405162461bcd60e51b815260206004820152602260248201527f4e6f2046756e647320746f2077697468647261772c2042616c616e6365206973604482015261020360f41b60648201526084016109c7565b611fef73d7ddfe7233d872d3600549b570b3631604aa5fff601d546125f2565b6000601d55565b6007546001600160a01b031633146120205760405162461bcd60e51b81526004016109c79061304b565b601555565b6007546001600160a01b0316331461204f5760405162461bcd60e51b81526004016109c79061304b565b6001600160a01b0381166120b45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109c7565b6120bd81612763565b50565b6007546001600160a01b031633146120ea5760405162461bcd60e51b81526004016109c79061304b565b601b805460ff19166001179055600b91909155600e55565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6110978282604051806020016040528060008152506129cc565b60006121838261268c565b80519091506000906001600160a01b0316336001600160a01b031614806121ba5750336121af84610af1565b6001600160a01b0316145b806121cc575081516121cc903361092f565b9050806122365760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016109c7565b846001600160a01b031682600001516001600160a01b0316146122aa5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016109c7565b6001600160a01b03841661230e5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016109c7565b61231e6000848460000151612102565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b4267ffffffffffffffff1602179055908601808352912054909116612413576123c6816000541190565b15612413578251600082815260036020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60008261246c57506000610a59565b60006124788385613195565b90508261248585836132ac565b14611b115760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016109c7565b600080821161252d5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f00000000000060448201526064016109c7565b611b1182846132ac565b60008061254483856130d1565b905083811015611b115760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016109c7565b6000828211156125e85760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f77000060448201526064016109c7565b611b11828461313b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461263f576040519150601f19603f3d011682016040523d82523d6000602084013e612644565b606091505b5050905080610c8f5760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b60448201526064016109c7565b60408051808201909152600080825260208201526126ab826000541190565b61270a5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016109c7565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215612759579392505050565b506000190161270c565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b156128b757604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906127f99033908990889088906004016132c0565b602060405180830381600087803b15801561281357600080fd5b505af1925050508015612843575060408051601f3d908101601f19168201909252612840918101906132fd565b60015b61289d573d808015612871576040519150601f19603f3d011682016040523d82523d6000602084013e612876565b606091505b5080516128955760405162461bcd60e51b81526004016109c790613204565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611052565b506001611052565b6060600a8054610a6e90613080565b6060816128f25750506040805180820190915260018152600360fc1b602082015290565b8160005b811561291c578061290681613120565b91506129159050600a836132ac565b91506128f6565b60008167ffffffffffffffff81111561293757612937612df5565b6040519080825280601f01601f191660200182016040528015612961576020820181803683370190505b5090505b84156110525761297660018361313b565b9150612983600a8661331a565b61298e9060306130d1565b60f81b8183815181106129a3576129a361332e565b60200101906001600160f81b031916908160001a9053506129c5600a866132ac565b9450612965565b610c8f83838360016000546001600160a01b038516612a375760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016109c7565b83612a955760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b60648201526084016109c7565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b85811015612b8e5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315612b8257612b6660008884886127b5565b612b825760405162461bcd60e51b81526004016109c790613204565b60019182019101612b13565b50600055612456565b828054612ba390613080565b90600052602060002090601f016020900481019282612bc55760008555612c0b565b82601f10612bde57805160ff1916838001178555612c0b565b82800160010185558215612c0b579182015b82811115612c0b578251825591602001919060010190612bf0565b506112329291505b808211156112325760008155600101612c13565b80356001600160a01b0381168114611b1857600080fd5b600060208284031215612c5057600080fd5b611b1182612c27565b6001600160e01b0319811681146120bd57600080fd5b600060208284031215612c8157600080fd5b8135611b1181612c59565b60005b83811015612ca7578181015183820152602001612c8f565b838111156118f05750506000910152565b60008151808452612cd0816020860160208601612c8c565b601f01601f19169290920160200192915050565b602081526000611b116020830184612cb8565b600060208284031215612d0957600080fd5b5035919050565b60008060408385031215612d2357600080fd5b612d2c83612c27565b946020939093013593505050565b60008060408385031215612d4d57600080fd5b82359150612d5d60208401612c27565b90509250929050565b600080600060608486031215612d7b57600080fd5b612d8484612c27565b9250612d9260208501612c27565b9150604084013590509250925092565b803560ff81168114611b1857600080fd5b60008060008060808587031215612dc957600080fd5b612dd285612c27565b9350612de060208601612da2565b93969395505050506040820135916060013590565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612e2657612e26612df5565b604051601f8501601f19908116603f01168101908282118183101715612e4e57612e4e612df5565b81604052809350858152868686011115612e6757600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612e9357600080fd5b813567ffffffffffffffff811115612eaa57600080fd5b8201601f81018413612ebb57600080fd5b61105284823560208401612e0b565b634e487b7160e01b600052602160045260246000fd5b6020810160048310612f0257634e487b7160e01b600052602160045260246000fd5b91905290565b60008060408385031215612f1b57600080fd5b50508035926020909101359150565b80358015158114611b1857600080fd5b60008060408385031215612f4d57600080fd5b612f5683612c27565b9150612d5d60208401612f2a565b600060208284031215612f7657600080fd5b611b1182612f2a565b60008060008060808587031215612f9557600080fd5b612f9e85612c27565b9350612fac60208601612c27565b925060408501359150606085013567ffffffffffffffff811115612fcf57600080fd5b8501601f81018713612fe057600080fd5b612fef87823560208401612e0b565b91505092959194509250565b6000806000806080858703121561301157600080fd5b84359350612de060208601612da2565b6000806040838503121561303457600080fd5b61303d83612c27565b9150612d5d60208401612c27565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061309457607f821691505b602082108114156130b557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156130e4576130e46130bb565b500190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000600019821415613134576131346130bb565b5060010190565b60008282101561314d5761314d6130bb565b500390565b60208082526023908201527f4d6178696d756d204d696e74732070657220416464726573732065786365656460408201526265642160e81b606082015260800190565b60008160001904831182151516156131af576131af6130bb565b500290565b60208082526030908201527f4e6f742073756666696369656e7420457468657220746f206d696e742074686960408201526f7320616d6f756e74206f66204e46547360801b606082015260800190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60008351613269818460208801612c8c565b83519083019061327d818360208801612c8c565b64173539b7b760d91b9101908152600501949350505050565b634e487b7160e01b600052601260045260246000fd5b6000826132bb576132bb613296565b500490565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906132f390830184612cb8565b9695505050505050565b60006020828403121561330f57600080fd5b8151611b1181612c59565b60008261332957613329613296565b500690565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220f8b943235d72fafe3941b043e00397fdfd22e59846b61b8f97b3de6c3dfaba1564736f6c63430008090033

Deployed Bytecode

0x6080604052600436106103385760003560e01c8063715018a6116101ab578063bdb4b848116100f7578063dcd4e73211610095578063e3b182531161006f578063e3b18253146108fe578063e985e9c514610914578063f2fde38b1461095d578063f71e13a81461097d57600080fd5b8063dcd4e732146108b6578063e07fa3c1146108c9578063e282327e146108de57600080fd5b8063cb155f96116100d1578063cb155f9614610849578063cec4ab9c14610869578063d47513de1461088a578063dc9e206f146108a057600080fd5b8063bdb4b848146107f4578063c4d8b9df14610809578063c87b56dd1461082957600080fd5b8063a22cb46511610164578063b3ab66b01161013e578063b3ab66b014610774578063b3b9b8b114610787578063b56d2f67146107b4578063b88d4fde146107d457600080fd5b8063a22cb46514610729578063a475b5dd14610749578063acef455e1461075e57600080fd5b8063715018a61461068c57806373a7a013146106a15780638da5cb5b146106c1578063940bb344146106df57806395d89b41146106f457806398fb0f0a1461070957600080fd5b806332624114116102855780635614e6dc1161022357806367797bf6116101fd57806367797bf614610621578063702bceba146106415780637035bf181461065757806370a082311461066c57600080fd5b80635614e6dc146105ad578063603f4d52146105da5780636352211e1461060157600080fd5b806342842e0e1161025f57806342842e0e146105375780634520e916146105575780634f6ccce71461056c578063518302271461058c57600080fd5b806332624114146104e257806339a0c6f91461050257806339f5fd971461052257600080fd5b806318160ddd116102f25780632545e9c4116102cc5780632545e9c41461048f57806327e8a11a146104975780632c6ff0c7146104ac5780632f745c59146104c257600080fd5b806318160ddd1461043057806318df64031461044f57806323b872dd1461046f57600080fd5b80628ca816146103445780630191a6571461037457806301ffc9a71461039657806306fdde03146103b6578063081812fc146103d8578063095ea7b31461041057600080fd5b3661033f57005b600080fd5b34801561035057600080fd5b50601854600160b01b900460ff165b60405190151581526020015b60405180910390f35b34801561038057600080fd5b5061039461038f366004612c3e565b61099d565b005b3480156103a257600080fd5b5061035f6103b1366004612c6f565b6109f2565b3480156103c257600080fd5b506103cb610a5f565b60405161036b9190612ce4565b3480156103e457600080fd5b506103f86103f3366004612cf7565b610af1565b6040516001600160a01b03909116815260200161036b565b34801561041c57600080fd5b5061039461042b366004612d10565b610b7c565b34801561043c57600080fd5b506000545b60405190815260200161036b565b34801561045b57600080fd5b5061039461046a366004612d3a565b610c94565b34801561047b57600080fd5b5061039461048a366004612d66565b610d52565b610394610d5d565b3480156104a357600080fd5b50610394610da6565b3480156104b857600080fd5b5061044160135481565b3480156104ce57600080fd5b506104416104dd366004612d10565b610df1565b3480156104ee57600080fd5b5061035f6104fd366004612db3565b610f4e565b34801561050e57600080fd5b5061039461051d366004612e81565b61105a565b34801561052e57600080fd5b5061039461109b565b34801561054357600080fd5b50610394610552366004612d66565b611177565b34801561056357600080fd5b50610441611192565b34801561057857600080fd5b50610441610587366004612cf7565b6111d4565b34801561059857600080fd5b5060185461035f90600160a01b900460ff1681565b3480156105b957600080fd5b506104416105c8366004612c3e565b601a6020526000908152604090205481565b3480156105e657600080fd5b50601b546105f49060ff1681565b60405161036b9190612ee0565b34801561060d57600080fd5b506103f861061c366004612cf7565b611236565b34801561062d57600080fd5b5061039461063c366004612cf7565b611248565b34801561064d57600080fd5b5061044160115481565b34801561066357600080fd5b506103cb611277565b34801561067857600080fd5b50610441610687366004612c3e565b611305565b34801561069857600080fd5b50610394611396565b3480156106ad57600080fd5b506104416106bc366004612c3e565b6113cc565b3480156106cd57600080fd5b506007546001600160a01b03166103f8565b3480156106eb57600080fd5b5061039461144a565b34801561070057600080fd5b506103cb61147c565b34801561071557600080fd5b50610394610724366004612f08565b61148b565b34801561073557600080fd5b50610394610744366004612f3a565b6114cd565b34801561075557600080fd5b50610394611592565b34801561076a57600080fd5b50610441601e5481565b610394610782366004612cf7565b6115d1565b34801561079357600080fd5b506104416107a2366004612c3e565b60196020526000908152604090205481565b3480156107c057600080fd5b506103946107cf366004612f64565b611875565b3480156107e057600080fd5b506103946107ef366004612f7f565b6118bd565b34801561080057600080fd5b506104416118f6565b34801561081557600080fd5b50610394610824366004612e81565b61196b565b34801561083557600080fd5b506103cb610844366004612cf7565b6119a8565b34801561085557600080fd5b50610394610864366004612f08565b611b1d565b34801561087557600080fd5b5060185461035f90600160a81b900460ff1681565b34801561089657600080fd5b5061044160125481565b3480156108ac57600080fd5b5061044160155481565b6103946108c4366004612ffb565b611b5f565b3480156108d557600080fd5b50610394611f48565b3480156108ea57600080fd5b506103946108f9366004612cf7565b611ff6565b34801561090a57600080fd5b5061044160145481565b34801561092057600080fd5b5061035f61092f366004613021565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561096957600080fd5b50610394610978366004612c3e565b612025565b34801561098957600080fd5b50610394610998366004612f08565b6120c0565b6007546001600160a01b031633146109d05760405162461bcd60e51b81526004016109c79061304b565b60405180910390fd5b601880546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b1480610a2357506001600160e01b03198216635b5e139f60e01b145b80610a3e57506001600160e01b0319821663780e9d6360e01b145b80610a5957506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610a6e90613080565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9a90613080565b8015610ae75780601f10610abc57610100808354040283529160200191610ae7565b820191906000526020600020905b815481529060010190602001808311610aca57829003601f168201915b5050505050905090565b6000610afe826000541190565b610b605760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084016109c7565b506000908152600560205260409020546001600160a01b031690565b6000610b8782611236565b9050806001600160a01b0316836001600160a01b03161415610bf65760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016109c7565b336001600160a01b0382161480610c125750610c12813361092f565b610c845760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016109c7565b610c8f838383612102565b505050565b6007546001600160a01b03163314610cbe5760405162461bcd60e51b81526004016109c79061304b565b60175482601654610ccf91906130d1565b1115610d2d5760405162461bcd60e51b815260206004820152602760248201527f4e6f7420656e6f756768205265736572766564204e465473206c65667420746f6044820152661036b4b73a171760c91b60648201526084016109c7565b610d37818361215e565b8160166000828254610d4991906130d1565b90915550505050565b610c8f838383612178565b34601e6000828254610d6f91906130d1565b90915550610da19050610d98610d8460005490565b601f54610d9290349061245d565b906124dc565b60205490612537565b602055565b6007546001600160a01b03163314610dd05760405162461bcd60e51b81526004016109c79061304b565b6018805460ff60b01b198116600160b01b9182900460ff1615909102179055565b6000610dfc83611305565b8210610e555760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016109c7565b600080549080805b83811015610eee576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610eb057805192505b876001600160a01b0316836001600160a01b03161415610ee55786841415610ede57509350610a5992505050565b6001909301925b50600101610e5d565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016109c7565b6040516bffffffffffffffffffffffff1930606090811b8216602084015286901b1660348201526000908190604801604051602081830303815290604052805190602001209050600181604051602001610fd491907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015611032573d6000803e3d6000fd5b5050604051601f1901516018546001600160a01b03908116911614925050505b949350505050565b6007546001600160a01b031633146110845760405162461bcd60e51b81526004016109c79061304b565b805161109790600a906020840190612b97565b5050565b600260085414156110be5760405162461bcd60e51b81526004016109c7906130e9565b600260085560006110ce33611305565b90506000805b828110156111635760006110e83383610df1565b905061111e6021600083815260200190815260200160002054611118601f546020546124dc90919063ffffffff16565b90612596565b61112890846130d1565b9250611141601f546020546124dc90919063ffffffff16565b600091825260216020526040909120558061115b81613120565b9150506110d4565b5061116e33826125f2565b50506001600855565b610c8f838383604051806020016040528060008152506118bd565b6007546000906001600160a01b031633146111bf5760405162461bcd60e51b81526004016109c79061304b565b6016546017546111cf919061313b565b905090565b6000805482106112325760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016109c7565b5090565b60006112418261268c565b5192915050565b6007546001600160a01b031633146112725760405162461bcd60e51b81526004016109c79061304b565b601455565b601c805461128490613080565b80601f01602080910402602001604051908101604052809291908181526020018280546112b090613080565b80156112fd5780601f106112d2576101008083540402835291602001916112fd565b820191906000526020600020905b8154815290600101906020018083116112e057829003601f168201915b505050505081565b60006001600160a01b0382166113715760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016109c7565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b031633146113c05760405162461bcd60e51b81526004016109c79061304b565b6113ca6000612763565b565b6000806113d883611305565b90506000805b828110156114425760006113f28683610df1565b90506114226021600083815260200190815260200160002054611118601f546020546124dc90919063ffffffff16565b61142c90846130d1565b925050808061143a90613120565b9150506113de565b509392505050565b6007546001600160a01b031633146114745760405162461bcd60e51b81526004016109c79061304b565b600054600955565b606060028054610a6e90613080565b6007546001600160a01b031633146114b55760405162461bcd60e51b81526004016109c79061304b565b601b805460ff19166003179055600d91909155601055565b6001600160a01b0382163314156115265760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016109c7565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546001600160a01b031633146115bc5760405162461bcd60e51b81526004016109c79061304b565b6018805460ff60a01b1916600160a01b179055565b600260085414156115f45760405162461bcd60e51b81526004016109c7906130e9565b6002600855601854600160b01b900460ff16156116455760405162461bcd60e51b815260206004820152600f60248201526e53616c65206973207061757365642160881b60448201526064016109c7565b6003601b5460ff16600381111561165e5761165e612eca565b146116ab5760405162461bcd60e51b815260206004820152601c60248201527f5075626c69632053616c6520696e206e6f74206f70656e20796574210000000060448201526064016109c7565b601054816013546116bc91906130d1565b11156117205760405162461bcd60e51b815260206004820152602d60248201527f4e6f7420656e6f756768204e46547320666f72205075626c696353616c65206c60448201526c32b33a103a379036b4b73a171760991b60648201526084016109c7565b601654601754611730919061313b565b60095461173d919061313b565b8161174760005490565b61175191906130d1565b111561179f5760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e000060448201526064016109c7565b601554336000908152601a60205260409020546117bd9083906130d1565b11156117db5760405162461bcd60e51b81526004016109c790613152565b806117e46118f6565b6117ee9190613195565b34101561180d5760405162461bcd60e51b81526004016109c7906131b4565b611817338261215e565b336000908152601a6020526040812080548392906118369084906130d1565b92505081905550806013600082825461184f91906130d1565b9250508190555034601d600082825461186891906130d1565b9091555050600160085550565b6007546001600160a01b0316331461189f5760405162461bcd60e51b81526004016109c79061304b565b60188054911515600160a81b0260ff60a81b19909216919091179055565b6118c8848484612178565b6118d4848484846127b5565b6118f05760405162461bcd60e51b81526004016109c790613204565b50505050565b600080601b5460ff16600381111561191057611910612eca565b148061193257506001601b5460ff16600381111561193057611930612eca565b145b1561193e5750600b5490565b6002601b5460ff16600381111561195757611957612eca565b14156119645750600c5490565b50600d5490565b6007546001600160a01b031633146119955760405162461bcd60e51b81526004016109c79061304b565b805161109790601c906020840190612b97565b60606119b5826000541190565b611a195760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109c7565b601854600160a01b900460ff16611abc57601c8054611a3790613080565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6390613080565b8015611ab05780601f10611a8557610100808354040283529160200191611ab0565b820191906000526020600020905b815481529060010190602001808311611a9357829003601f168201915b50505050509050919050565b6000611ac66128bf565b90506000815111611ae65760405180602001604052806000815250611b11565b80611af0846128ce565b604051602001611b01929190613257565b6040516020818303038152906040525b9392505050565b919050565b6007546001600160a01b03163314611b475760405162461bcd60e51b81526004016109c79061304b565b601b805460ff19166002179055600c91909155600f55565b828282611b6e33848484610f4e565b611bae5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964205369676e617475726560781b60448201526064016109c7565b60026008541415611bd15760405162461bcd60e51b81526004016109c7906130e9565b6002600855601854600160b01b900460ff1615611c225760405162461bcd60e51b815260206004820152600f60248201526e53616c65206973207061757365642160881b60448201526064016109c7565b6001601b5460ff166003811115611c3b57611c3b612eca565b1480611c5d57506002601b5460ff166003811115611c5b57611c5b612eca565b145b611ca95760405162461bcd60e51b815260206004820152601860248201527f50726553616c6520696e206e6f74206f70656e2079657421000000000000000060448201526064016109c7565b6001601b5460ff166003811115611cc257611cc2612eca565b1415611d4057600e5487601154611cd991906130d1565b1115611d3b5760405162461bcd60e51b815260206004820152602b60248201527f4e6f7420656e6f756768204e46547320666f722050726553616c6531206c656660448201526a3a103a379036b4b73a171760a91b60648201526084016109c7565b611db3565b600f5487601254611d5191906130d1565b1115611db35760405162461bcd60e51b815260206004820152602b60248201527f4e6f7420656e6f756768204e46547320666f722050726553616c6532206c656660448201526a3a103a379036b4b73a171760a91b60648201526084016109c7565b601654601754611dc3919061313b565b600954611dd0919061313b565b87611dda60005490565b611de491906130d1565b1115611e325760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e000060448201526064016109c7565b60145433600090815260196020526040902054611e509089906130d1565b1115611e6e5760405162461bcd60e51b81526004016109c790613152565b86611e776118f6565b611e819190613195565b341015611ea05760405162461bcd60e51b81526004016109c7906131b4565b611eaa338861215e565b3360009081526019602052604081208054899290611ec99084906130d1565b9091555060019050601b5460ff166003811115611ee857611ee8612eca565b1415611f0b578660116000828254611f0091906130d1565b90915550611f239050565b8660126000828254611f1d91906130d1565b90915550505b34601d6000828254611f3591906130d1565b9091555050600160085550505050505050565b6007546001600160a01b03163314611f725760405162461bcd60e51b81526004016109c79061304b565b6000601d5411611fcf5760405162461bcd60e51b815260206004820152602260248201527f4e6f2046756e647320746f2077697468647261772c2042616c616e6365206973604482015261020360f41b60648201526084016109c7565b611fef73d7ddfe7233d872d3600549b570b3631604aa5fff601d546125f2565b6000601d55565b6007546001600160a01b031633146120205760405162461bcd60e51b81526004016109c79061304b565b601555565b6007546001600160a01b0316331461204f5760405162461bcd60e51b81526004016109c79061304b565b6001600160a01b0381166120b45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109c7565b6120bd81612763565b50565b6007546001600160a01b031633146120ea5760405162461bcd60e51b81526004016109c79061304b565b601b805460ff19166001179055600b91909155600e55565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6110978282604051806020016040528060008152506129cc565b60006121838261268c565b80519091506000906001600160a01b0316336001600160a01b031614806121ba5750336121af84610af1565b6001600160a01b0316145b806121cc575081516121cc903361092f565b9050806122365760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016109c7565b846001600160a01b031682600001516001600160a01b0316146122aa5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016109c7565b6001600160a01b03841661230e5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016109c7565b61231e6000848460000151612102565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b4267ffffffffffffffff1602179055908601808352912054909116612413576123c6816000541190565b15612413578251600082815260036020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60008261246c57506000610a59565b60006124788385613195565b90508261248585836132ac565b14611b115760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016109c7565b600080821161252d5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f00000000000060448201526064016109c7565b611b1182846132ac565b60008061254483856130d1565b905083811015611b115760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016109c7565b6000828211156125e85760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f77000060448201526064016109c7565b611b11828461313b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461263f576040519150601f19603f3d011682016040523d82523d6000602084013e612644565b606091505b5050905080610c8f5760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b60448201526064016109c7565b60408051808201909152600080825260208201526126ab826000541190565b61270a5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016109c7565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215612759579392505050565b506000190161270c565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b156128b757604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906127f99033908990889088906004016132c0565b602060405180830381600087803b15801561281357600080fd5b505af1925050508015612843575060408051601f3d908101601f19168201909252612840918101906132fd565b60015b61289d573d808015612871576040519150601f19603f3d011682016040523d82523d6000602084013e612876565b606091505b5080516128955760405162461bcd60e51b81526004016109c790613204565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611052565b506001611052565b6060600a8054610a6e90613080565b6060816128f25750506040805180820190915260018152600360fc1b602082015290565b8160005b811561291c578061290681613120565b91506129159050600a836132ac565b91506128f6565b60008167ffffffffffffffff81111561293757612937612df5565b6040519080825280601f01601f191660200182016040528015612961576020820181803683370190505b5090505b84156110525761297660018361313b565b9150612983600a8661331a565b61298e9060306130d1565b60f81b8183815181106129a3576129a361332e565b60200101906001600160f81b031916908160001a9053506129c5600a866132ac565b9450612965565b610c8f83838360016000546001600160a01b038516612a375760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016109c7565b83612a955760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b60648201526084016109c7565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b85811015612b8e5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315612b8257612b6660008884886127b5565b612b825760405162461bcd60e51b81526004016109c790613204565b60019182019101612b13565b50600055612456565b828054612ba390613080565b90600052602060002090601f016020900481019282612bc55760008555612c0b565b82601f10612bde57805160ff1916838001178555612c0b565b82800160010185558215612c0b579182015b82811115612c0b578251825591602001919060010190612bf0565b506112329291505b808211156112325760008155600101612c13565b80356001600160a01b0381168114611b1857600080fd5b600060208284031215612c5057600080fd5b611b1182612c27565b6001600160e01b0319811681146120bd57600080fd5b600060208284031215612c8157600080fd5b8135611b1181612c59565b60005b83811015612ca7578181015183820152602001612c8f565b838111156118f05750506000910152565b60008151808452612cd0816020860160208601612c8c565b601f01601f19169290920160200192915050565b602081526000611b116020830184612cb8565b600060208284031215612d0957600080fd5b5035919050565b60008060408385031215612d2357600080fd5b612d2c83612c27565b946020939093013593505050565b60008060408385031215612d4d57600080fd5b82359150612d5d60208401612c27565b90509250929050565b600080600060608486031215612d7b57600080fd5b612d8484612c27565b9250612d9260208501612c27565b9150604084013590509250925092565b803560ff81168114611b1857600080fd5b60008060008060808587031215612dc957600080fd5b612dd285612c27565b9350612de060208601612da2565b93969395505050506040820135916060013590565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612e2657612e26612df5565b604051601f8501601f19908116603f01168101908282118183101715612e4e57612e4e612df5565b81604052809350858152868686011115612e6757600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612e9357600080fd5b813567ffffffffffffffff811115612eaa57600080fd5b8201601f81018413612ebb57600080fd5b61105284823560208401612e0b565b634e487b7160e01b600052602160045260246000fd5b6020810160048310612f0257634e487b7160e01b600052602160045260246000fd5b91905290565b60008060408385031215612f1b57600080fd5b50508035926020909101359150565b80358015158114611b1857600080fd5b60008060408385031215612f4d57600080fd5b612f5683612c27565b9150612d5d60208401612f2a565b600060208284031215612f7657600080fd5b611b1182612f2a565b60008060008060808587031215612f9557600080fd5b612f9e85612c27565b9350612fac60208601612c27565b925060408501359150606085013567ffffffffffffffff811115612fcf57600080fd5b8501601f81018713612fe057600080fd5b612fef87823560208401612e0b565b91505092959194509250565b6000806000806080858703121561301157600080fd5b84359350612de060208601612da2565b6000806040838503121561303457600080fd5b61303d83612c27565b9150612d5d60208401612c27565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061309457607f821691505b602082108114156130b557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156130e4576130e46130bb565b500190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000600019821415613134576131346130bb565b5060010190565b60008282101561314d5761314d6130bb565b500390565b60208082526023908201527f4d6178696d756d204d696e74732070657220416464726573732065786365656460408201526265642160e81b606082015260800190565b60008160001904831182151516156131af576131af6130bb565b500290565b60208082526030908201527f4e6f742073756666696369656e7420457468657220746f206d696e742074686960408201526f7320616d6f756e74206f66204e46547360801b606082015260800190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60008351613269818460208801612c8c565b83519083019061327d818360208801612c8c565b64173539b7b760d91b9101908152600501949350505050565b634e487b7160e01b600052601260045260246000fd5b6000826132bb576132bb613296565b500490565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906132f390830184612cb8565b9695505050505050565b60006020828403121561330f57600080fd5b8151611b1181612c59565b60008261332957613329613296565b500690565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220f8b943235d72fafe3941b043e00397fdfd22e59846b61b8f97b3de6c3dfaba1564736f6c63430008090033

Deployed Bytecode Sourcemap

61849:10919:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64454:8;;;61849:10919;;;;;;;;;;;;;;;;64454:8;;;61849:10919;;;;;;;;;;;;;;;;;;;;;;;;;;64454:8;;;61849:10919;;;;;;;;;;;;;;;;64454:8;;;61849:10919;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64454:8;;;61849:10919;;;;;;;;;;;;;;;;64454:8;;;61849:10919;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64454:8;;;61849:10919;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64454:8;;;61849:10919;;;;;;;;;;;;;;;;64454:8;;;61849:10919;;;;;;;;;;;;;;;;;;;;;;;;;;64454:8;;;61849:10919;;;;;;;;;;;;;;;;64454:8;;;61849:10919;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64454:8;;;61849:10919;;;;;;;;;;;;;;;;64454:8;;;61849:10919;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64454:8;;;61849:10919;;;;;;64454:8;;;72563:82;;;;;;;;;;-1:-1:-1;72631:6:0;;-1:-1:-1;;;72631:6:0;;;;72563:82;;;179:14:1;;172:22;154:41;;142:2;127:18;72563:82:0;;;;;;;;70688:87;;;;;;;;;;-1:-1:-1;70688:87:0;;;;;:::i;:::-;;:::i;:::-;;41710:372;;;;;;;;;;-1:-1:-1;41710:372:0;;;;;:::i;:::-;;:::i;43596:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;45158:214::-;;;;;;;;;;-1:-1:-1;45158:214:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2061:32:1;;;2043:51;;2031:2;2016:18;45158:214:0;1897:203:1;44679:413:0;;;;;;;;;;-1:-1:-1;44679:413:0;;;;;:::i;:::-;;:::i;39959:108::-;;;;;;;;;;-1:-1:-1;40020:7:0;40047:12;39959:108;;;2510:25:1;;;2498:2;2483:18;39959:108:0;2364:177:1;69635:270:0;;;;;;;;;;-1:-1:-1;69635:270:0;;;;;:::i;:::-;;:::i;46034:170::-;;;;;;;;;;-1:-1:-1;46034:170:0;;;;;:::i;:::-;;:::i;71364:197::-;;;:::i;72686:79::-;;;;;;;;;;;;;:::i;62643:38::-;;;;;;;;;;;;;;;;40631:1007;;;;;;;;;;-1:-1:-1;40631:1007:0;;;;;:::i;:::-;;:::i;66524:306::-;;;;;;;;;;-1:-1:-1;66524:306:0;;;;;:::i;:::-;;:::i;64681:109::-;;;;;;;;;;-1:-1:-1;64681:109:0;;;;;:::i;:::-;;:::i;71991:487::-;;;;;;;;;;;;;:::i;46275:185::-;;;;;;;;;;-1:-1:-1;46275:185:0;;;;;:::i;:::-;;:::i;70842:124::-;;;;;;;;;;;;;:::i;40144:187::-;;;;;;;;;;-1:-1:-1;40144:187:0;;;;;:::i;:::-;;:::i;63300:28::-;;;;;;;;;;-1:-1:-1;63300:28:0;;;;-1:-1:-1;;;63300:28:0;;;;;;63592:60;;;;;;;;;;-1:-1:-1;63592:60:0;;;;;:::i;:::-;;;;;;;;;;;;;;63751:37;;;;;;;;;;-1:-1:-1;63751:37:0;;;;;;;;;;;;;;;:::i;43405:124::-;;;;;;;;;;-1:-1:-1;43405:124:0;;;;;:::i;:::-;;:::i;65679:123::-;;;;;;;;;;-1:-1:-1;65679:123:0;;;;;:::i;:::-;;:::i;62557:36::-;;;;;;;;;;;;;;;;63865:27;;;;;;;;;;;;;:::i;42146:221::-;;;;;;;;;;-1:-1:-1;42146:221:0;;;;;:::i;:::-;;:::i;4591:94::-;;;;;;;;;;;;;:::i;71569:414::-;;;;;;;;;;-1:-1:-1;71569:414:0;;;;;:::i;:::-;;:::i;3940:87::-;;;;;;;;;;-1:-1:-1;4013:6:0;;-1:-1:-1;;;;;4013:6:0;3940:87;;69968:94;;;;;;;;;;;;;:::i;43765:104::-;;;;;;;;;;;;;:::i;65465:202::-;;;;;;;;;;-1:-1:-1;65465:202:0;;;;;:::i;:::-;;:::i;45444:288::-;;;;;;;;;;-1:-1:-1;45444:288:0;;;;;:::i;:::-;;:::i;72486:69::-;;;;;;;;;;;;;:::i;63970:36::-;;;;;;;;;;;;;;;;68213:872;;;;;;:::i;:::-;;:::i;63528:57::-;;;;;;;;;;-1:-1:-1;63528:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;64952:101;;;;;;;;;;-1:-1:-1;64952:101:0;;;;;:::i;:::-;;:::i;46531:355::-;;;;;;;;;;-1:-1:-1;46531:355:0;;;;;:::i;:::-;;:::i;71017:339::-;;;;;;;;;;;;;:::i;64798:125::-;;;;;;;;;;-1:-1:-1;64798:125:0;;;;;:::i;:::-;;:::i;69097:493::-;;;;;;;;;;-1:-1:-1;69097:493:0;;;;;:::i;:::-;;:::i;65263:194::-;;;;;;;;;;-1:-1:-1;65263:194:0;;;;;:::i;:::-;;:::i;63362:34::-;;;;;;;;;;-1:-1:-1;63362:34:0;;;;-1:-1:-1;;;63362:34:0;;;;;;62600:36;;;;;;;;;;;;;;;;62795:45;;;;;;;;;;;;;;;;66889:1265;;;;;;:::i;:::-;;:::i;70122:234::-;;;;;;;;;;;;;:::i;65810:129::-;;;;;;;;;;-1:-1:-1;65810:129:0;;;;;:::i;:::-;;:::i;62746:42::-;;;;;;;;;;;;;;;;45803:164;;;;;;;;;;-1:-1:-1;45803:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;45924:25:0;;;45900:4;45924:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;45803:164;4840:192;;;;;;;;;;-1:-1:-1;4840:192:0;;;;;:::i;:::-;;:::i;65061:194::-;;;;;;;;;;-1:-1:-1;65061:194:0;;;;;:::i;:::-;;:::i;70688:87::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;;;;;;;;;70753:5:::1;:14:::0;;-1:-1:-1;;;;;;70753:14:0::1;-1:-1:-1::0;;;;;70753:14:0;;;::::1;::::0;;;::::1;::::0;;70688:87::o;41710:372::-;41812:4;-1:-1:-1;;;;;;41849:40:0;;-1:-1:-1;;;41849:40:0;;:105;;-1:-1:-1;;;;;;;41906:48:0;;-1:-1:-1;;;41906:48:0;41849:105;:172;;;-1:-1:-1;;;;;;;41971:50:0;;-1:-1:-1;;;41971:50:0;41849:172;:225;;;-1:-1:-1;;;;;;;;;;16031:40:0;;;42038:36;41829:245;41710:372;-1:-1:-1;;41710:372:0:o;43596:100::-;43650:13;43683:5;43676:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43596:100;:::o;45158:214::-;45226:7;45254:16;45262:7;47198:4;47232:12;-1:-1:-1;47222:22:0;47141:111;45254:16;45246:74;;;;-1:-1:-1;;;45246:74:0;;8536:2:1;45246:74:0;;;8518:21:1;8575:2;8555:18;;;8548:30;8614:34;8594:18;;;8587:62;-1:-1:-1;;;8665:18:1;;;8658:43;8718:19;;45246:74:0;8334:409:1;45246:74:0;-1:-1:-1;45340:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;45340:24:0;;45158:214::o;44679:413::-;44752:13;44768:24;44784:7;44768:15;:24::i;:::-;44752:40;;44817:5;-1:-1:-1;;;;;44811:11:0;:2;-1:-1:-1;;;;;44811:11:0;;;44803:58;;;;-1:-1:-1;;;44803:58:0;;8950:2:1;44803:58:0;;;8932:21:1;8989:2;8969:18;;;8962:30;9028:34;9008:18;;;9001:62;-1:-1:-1;;;9079:18:1;;;9072:32;9121:19;;44803:58:0;8748:398:1;44803:58:0;2808:10;-1:-1:-1;;;;;44896:21:0;;;;:62;;-1:-1:-1;44921:37:0;44938:5;2808:10;45803:164;:::i;44921:37::-;44874:169;;;;-1:-1:-1;;;44874:169:0;;9353:2:1;44874:169:0;;;9335:21:1;9392:2;9372:18;;;9365:30;9431:34;9411:18;;;9404:62;9502:27;9482:18;;;9475:55;9547:19;;44874:169:0;9151:421:1;44874:169:0;45056:28;45065:2;45069:7;45078:5;45056:8;:28::i;:::-;44741:351;44679:413;;:::o;69635:270::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;69752:16:::1;;69742:6;69725:14;;:23;;;;:::i;:::-;:43;;69717:95;;;::::0;-1:-1:-1;;;69717:95:0;;10044:2:1;69717:95:0::1;::::0;::::1;10026:21:1::0;10083:2;10063:18;;;10056:30;10122:34;10102:18;;;10095:62;-1:-1:-1;;;10173:18:1;;;10166:37;10220:19;;69717:95:0::1;9842:403:1::0;69717:95:0::1;69823:28;69833:9;69844:6;69823:9;:28::i;:::-;69880:6;69862:14;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;69635:270:0:o;46034:170::-;46168:28;46178:4;46184:2;46188:7;46168:9;:28::i;71364:197::-;71446:9;71421:21;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;71483:70:0;;-1:-1:-1;71502:50:0;71538:13;40020:7;40047:12;;39959:108;71538:13;71516:16;;71502:31;;:9;;:13;:31::i;:::-;:35;;:50::i;:::-;71483:14;;;:18;:70::i;:::-;71466:14;:87;71364:197::o;72686:79::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;72751:6:::1;::::0;;-1:-1:-1;;;;72741:16:0;::::1;-1:-1:-1::0;;;72751:6:0;;;::::1;;;72750:7;72741:16:::0;;::::1;;::::0;;72686:79::o;40631:1007::-;40720:7;40756:16;40766:5;40756:9;:16::i;:::-;40748:5;:24;40740:71;;;;-1:-1:-1;;;40740:71:0;;10452:2:1;40740:71:0;;;10434:21:1;10491:2;10471:18;;;10464:30;10530:34;10510:18;;;10503:62;-1:-1:-1;;;10581:18:1;;;10574:32;10623:19;;40740:71:0;10250:398:1;40740:71:0;40822:22;40047:12;;;40822:22;;41085:466;41105:14;41101:1;:18;41085:466;;;41145:31;41179:14;;;:11;:14;;;;;;;;;41145:48;;;;;;;;;-1:-1:-1;;;;;41145:48:0;;;;;-1:-1:-1;;;41145:48:0;;;;;;;;;;;;41216:28;41212:111;;41289:14;;;-1:-1:-1;41212:111:0;41366:5;-1:-1:-1;;;;;41345:26:0;:17;-1:-1:-1;;;;;41345:26:0;;41341:195;;;41415:5;41400:11;:20;41396:85;;;-1:-1:-1;41456:1:0;-1:-1:-1;41449:8:0;;-1:-1:-1;;;41449:8:0;41396:85;41503:13;;;;;41341:195;-1:-1:-1;41121:3:0;;41085:466;;;-1:-1:-1;41574:56:0;;-1:-1:-1;;;41574:56:0;;10855:2:1;41574:56:0;;;10837:21:1;10894:2;10874:18;;;10867:30;10933:34;10913:18;;;10906:62;-1:-1:-1;;;10984:18:1;;;10977:44;11038:19;;41574:56:0;10653:410:1;66524:306:0;66665:37;;-1:-1:-1;;66690:4:0;11295:2:1;11291:15;;;11287:24;;66665:37:0;;;11275::1;11346:15;;;11342:24;11328:12;;;11321:46;66623:4:0;;;;11383:12:1;;66665:37:0;;;;;;;;;;;;66655:48;;;;;;66640:63;;66730:92;66803:4;66750:58;;;;;;;11648:66:1;11636:79;;11740:2;11731:12;;11724:28;;;;11777:2;11768:12;;11406:380;66750:58:0;;;;-1:-1:-1;;66750:58:0;;;;;;;;;66740:69;;66750:58;66740:69;;;;66730:92;;;;;;;;;12018:25:1;12091:4;12079:17;;12059:18;;;12052:45;12113:18;;;12106:34;;;12156:18;;;12149:34;;;11990:19;;66730:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;66730:92:0;;-1:-1:-1;;66730:92:0;;66721:5;;-1:-1:-1;;;;;66721:5:0;;;:101;;;;-1:-1:-1;;;66524:306:0;;;;;;;:::o;64681:109::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;64756:26;;::::1;::::0;:15:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;:::-;;64681:109:::0;:::o;71991:487::-;36352:1;36950:7;;:19;;36942:63;;;;-1:-1:-1;;;36942:63:0;;;;;;;:::i;:::-;36352:1;37083:7;:18;72051::::1;72072:21;72082:10;72072:9;:21::i;:::-;72051:42;;72104:21;72145:9:::0;72140:275:::1;72164:10;72160:1;:14;72140:275;;;72196:10;72209:34;72229:10;72241:1;72209:19;:34::i;:::-;72196:47;;72275:59;72318:11;:15;72330:2;72318:15;;;;;;;;;;;;72276:36;72295:16;;72276:14;;:18;;:36;;;;:::i;:::-;72275:42:::0;::::1;:59::i;:::-;72258:76;::::0;;::::1;:::i;:::-;;;72367:36;72386:16;;72367:14;;:18;;:36;;;;:::i;:::-;72349:15;::::0;;;:11:::1;:15;::::0;;;;;:54;72176:3;::::1;::::0;::::1;:::i;:::-;;;;72140:275;;;;72425:45;72443:10;72456:13;72425:9;:45::i;:::-;-1:-1:-1::0;;36308:1:0;37262:7;:22;71991:487::o;46275:185::-;46413:39;46430:4;46436:2;46440:7;46413:39;;;;;;;;;;;;:16;:39::i;70842:124::-;4013:6;;70901:4;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;70944:14:::1;;70925:16;;:33;;;;:::i;:::-;70918:40;;70842:124:::0;:::o;40144:187::-;40211:7;40047:12;;40239:5;:21;40231:69;;;;-1:-1:-1;;;40231:69:0;;13026:2:1;40231:69:0;;;13008:21:1;13065:2;13045:18;;;13038:30;13104:34;13084:18;;;13077:62;-1:-1:-1;;;13155:18:1;;;13148:33;13198:19;;40231:69:0;12824:399:1;40231:69:0;-1:-1:-1;40318:5:0;40144:187::o;43405:124::-;43469:7;43496:20;43508:7;43496:11;:20::i;:::-;:25;;43405:124;-1:-1:-1;;43405:124:0:o;65679:123::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;65759:23:::1;:35:::0;65679:123::o;63865:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42146:221::-;42210:7;-1:-1:-1;;;;;42238:19:0;;42230:75;;;;-1:-1:-1;;;42230:75:0;;13430:2:1;42230:75:0;;;13412:21:1;13469:2;13449:18;;;13442:30;13508:34;13488:18;;;13481:62;-1:-1:-1;;;13559:18:1;;;13552:41;13610:19;;42230:75:0;13228:407:1;42230:75:0;-1:-1:-1;;;;;;42331:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;42331:27:0;;42146:221::o;4591:94::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;4656:21:::1;4674:1;4656:9;:21::i;:::-;4591:94::o:0;71569:414::-;71637:7;71656:18;71677;71687:7;71677:9;:18::i;:::-;71656:39;;71706:21;71747:9;71742:203;71766:10;71762:1;:14;71742:203;;;71798:10;71811:31;71831:7;71840:1;71811:19;:31::i;:::-;71798:44;;71874:59;71917:11;:15;71929:2;71917:15;;;;;;;;;;;;71875:36;71894:16;;71875:14;;:18;;:36;;;;:::i;71874:59::-;71857:76;;;;:::i;:::-;;;71783:162;71778:3;;;;;:::i;:::-;;;;71742:203;;;-1:-1:-1;71962:13:0;71569:414;-1:-1:-1;;;71569:414:0:o;69968:94::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;40020:7;40047:12;70024:14:::1;:30:::0;69968:94::o;43765:104::-;43821:13;43854:7;43847:14;;;;;:::i;65465:202::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;65552:9:::1;:28:::0;;-1:-1:-1;;65552:28:0::1;65564:16;65552:28;::::0;;65591:18:::1;:26:::0;;;;65628:19:::1;:31:::0;65465:202::o;45444:288::-;-1:-1:-1;;;;;45539:24:0;;2808:10;45539:24;;45531:63;;;;-1:-1:-1;;;45531:63:0;;13842:2:1;45531:63:0;;;13824:21:1;13881:2;13861:18;;;13854:30;13920:28;13900:18;;;13893:56;13966:18;;45531:63:0;13640:350:1;45531:63:0;2808:10;45607:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;45607:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;45607:53:0;;;;;;;;;;45676:48;;154:41:1;;;45607:42:0;;2808:10;45676:48;;127:18:1;45676:48:0;;;;;;;45444:288;;:::o;72486:69::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;72532:8:::1;:15:::0;;-1:-1:-1;;;;72532:15:0::1;-1:-1:-1::0;;;72532:15:0::1;::::0;;72486:69::o;68213:872::-;36352:1;36950:7;;:19;;36942:63;;;;-1:-1:-1;;;36942:63:0;;;;;;;:::i;:::-;36352:1;37083:7;:18;68300:6:::1;::::0;-1:-1:-1;;;68300:6:0;::::1;;;68299:7;68291:35;;;::::0;-1:-1:-1;;;68291:35:0;;14197:2:1;68291:35:0::1;::::0;::::1;14179:21:1::0;14236:2;14216:18;;;14209:30;-1:-1:-1;;;14255:18:1;;;14248:45;14310:18;;68291:35:0::1;13995:339:1::0;68291:35:0::1;68358:16;68345:9;::::0;::::1;;:29;::::0;::::1;;;;;;:::i;:::-;;68337:70;;;::::0;-1:-1:-1;;;68337:70:0;;14541:2:1;68337:70:0::1;::::0;::::1;14523:21:1::0;14580:2;14560:18;;;14553:30;14619;14599:18;;;14592:58;14667:18;;68337:70:0::1;14339:352:1::0;68337:70:0::1;68461:19;;68451:6;68426:22;;:31;;;;:::i;:::-;:54;;68418:112;;;::::0;-1:-1:-1;;;68418:112:0;;14898:2:1;68418:112:0::1;::::0;::::1;14880:21:1::0;14937:2;14917:18;;;14910:30;14976:34;14956:18;;;14949:62;-1:-1:-1;;;15027:18:1;;;15020:43;15080:19;;68418:112:0::1;14696:409:1::0;68418:112:0::1;68612:14;;68593:16;;:33;;;;:::i;:::-;68575:14;;:52;;;;:::i;:::-;68565:6;68549:13;40020:7:::0;40047:12;;39959:108;68549:13:::1;:22;;;;:::i;:::-;:78;;68541:121;;;::::0;-1:-1:-1;;;68541:121:0;;15312:2:1;68541:121:0::1;::::0;::::1;15294:21:1::0;15351:2;15331:18;;;15324:30;15390:32;15370:18;;;15363:60;15440:18;;68541:121:0::1;15110:354:1::0;68541:121:0::1;68731:26;::::0;68707:10:::1;68681:37;::::0;;;:25:::1;:37;::::0;;;;;:46:::1;::::0;68721:6;;68681:46:::1;:::i;:::-;:76;;68673:124;;;;-1:-1:-1::0;;;68673:124:0::1;;;;;;;:::i;:::-;68842:6;68829:10;:8;:10::i;:::-;:19;;;;:::i;:::-;68816:9;:32;;68808:93;;;;-1:-1:-1::0;;;68808:93:0::1;;;;;;;:::i;:::-;68914:29;68924:10;68936:6;68914:9;:29::i;:::-;68980:10;68954:37;::::0;;;:25:::1;:37;::::0;;;;:47;;68995:6;;68954:37;:47:::1;::::0;68995:6;;68954:47:::1;:::i;:::-;;;;;;;;69038:6;69012:22;;:32;;;;;;;:::i;:::-;;;;;;;;69068:9;69057:7;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;36308:1:0;37262:7;:22;-1:-1:-1;68213:872:0:o;64952:101::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;65021:15:::1;:24:::0;;;::::1;;-1:-1:-1::0;;;65021:24:0::1;-1:-1:-1::0;;;;65021:24:0;;::::1;::::0;;;::::1;::::0;;64952:101::o;46531:355::-;46690:28;46700:4;46706:2;46710:7;46690:9;:28::i;:::-;46751:48;46774:4;46780:2;46784:7;46793:5;46751:22;:48::i;:::-;46729:149;;;;-1:-1:-1;;;46729:149:0;;;;;;;:::i;:::-;46531:355;;;;:::o;71017:339::-;71057:4;;71078:9;;;;:25;;;;;;;;:::i;:::-;;:56;;;-1:-1:-1;71120:14:0;71107:9;;;;:27;;;;;;;;:::i;:::-;;71078:56;71074:275;;;-1:-1:-1;71158:16:0;;;71017:339::o;71074:275::-;71217:14;71204:9;;;;:27;;;;;;;;:::i;:::-;;71201:148;;;-1:-1:-1;71254:16:0;;;71017:339::o;71201:148::-;-1:-1:-1;71319:18:0;;;71017:339::o;64798:125::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;64885:30;;::::1;::::0;:13:::1;::::0;:30:::1;::::0;::::1;::::0;::::1;:::i;69097:493::-:0;69171:13;69205:17;69213:8;47198:4;47232:12;-1:-1:-1;47222:22:0;47141:111;69205:17;69197:77;;;;-1:-1:-1;;;69197:77:0;;17085:2:1;69197:77:0;;;17067:21:1;17124:2;17104:18;;;17097:30;17163:34;17143:18;;;17136:62;-1:-1:-1;;;17214:18:1;;;17207:45;17269:19;;69197:77:0;16883:411:1;69197:77:0;69299:8;;-1:-1:-1;;;69299:8:0;;;;69295:284;;69360:13;69353:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69097:493;;;:::o;69295:284::-;69415:21;69439:10;:8;:10::i;:::-;69415:34;;69495:1;69477:7;69471:21;:25;:96;;;;;;;;;;;;;;;;;69523:7;69532:19;:8;:17;:19::i;:::-;69506:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69471:96;69464:103;69097:493;-1:-1:-1;;;69097:493:0:o;69295:284::-;69097:493;;;:::o;65263:194::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;65348:9:::1;:26:::0;;-1:-1:-1;;65348:26:0::1;65360:14;65348:26;::::0;;65385:16:::1;:24:::0;;;;-1:-1:-1;65420:29:0;65263:194::o;66889:1265::-;66976:2;66981;66985;66026:41;66047:10;66058:2;66061;66064;66026:20;:41::i;:::-;66017:73;;;;-1:-1:-1;;;66017:73:0;;18143:2:1;66017:73:0;;;18125:21:1;18182:2;18162:18;;;18155:30;-1:-1:-1;;;18201:18:1;;;18194:47;18258:18;;66017:73:0;17941:341:1;66017:73:0;36352:1:::1;36950:7;;:19;;36942:63;;;;-1:-1:-1::0;;;36942:63:0::1;;;;;;;:::i;:::-;36352:1;37083:7;:18:::0;67036:6:::2;::::0;-1:-1:-1;;;67036:6:0;::::2;;;67035:7;67027:35;;;::::0;-1:-1:-1;;;67027:35:0;;14197:2:1;67027:35:0::2;::::0;::::2;14179:21:1::0;14236:2;14216:18;;;14209:30;-1:-1:-1;;;14255:18:1;;;14248:45;14310:18;;67027:35:0::2;13995:339:1::0;67027:35:0::2;67094:14;67081:9;::::0;::::2;;:27;::::0;::::2;;;;;;:::i;:::-;;:58;;;-1:-1:-1::0;67125:14:0::2;67112:9;::::0;::::2;;:27;::::0;::::2;;;;;;:::i;:::-;;67081:58;67073:95;;;::::0;-1:-1:-1;;;67073:95:0;;18489:2:1;67073:95:0::2;::::0;::::2;18471:21:1::0;18528:2;18508:18;;;18501:30;18567:26;18547:18;;;18540:54;18611:18;;67073:95:0::2;18287:348:1::0;67073:95:0::2;67195:14;67182:9;::::0;::::2;;:27;::::0;::::2;;;;;;:::i;:::-;;67179:302;;;67266:17;;67256:6;67233:20;;:29;;;;:::i;:::-;:50;;67225:106;;;::::0;-1:-1:-1;;;67225:106:0;;18842:2:1;67225:106:0::2;::::0;::::2;18824:21:1::0;18881:2;18861:18;;;18854:30;18920:34;18900:18;;;18893:62;-1:-1:-1;;;18971:18:1;;;18964:41;19022:19;;67225:106:0::2;18640:407:1::0;67225:106:0::2;67179:302;;;67404:17;;67394:6;67371:20;;:29;;;;:::i;:::-;:50;;67363:106;;;::::0;-1:-1:-1;;;67363:106:0;;19254:2:1;67363:106:0::2;::::0;::::2;19236:21:1::0;19293:2;19273:18;;;19266:30;19332:34;19312:18;;;19305:62;-1:-1:-1;;;19383:18:1;;;19376:41;19434:19;;67363:106:0::2;19052:407:1::0;67363:106:0::2;67563:14;;67543:16;;:34;;;;:::i;:::-;67525:14;;:53;;;;:::i;:::-;67515:6;67499:13;40020:7:::0;40047:12;;39959:108;67499:13:::2;:22;;;;:::i;:::-;:79;;67491:122;;;::::0;-1:-1:-1;;;67491:122:0;;15312:2:1;67491:122:0::2;::::0;::::2;15294:21:1::0;15351:2;15331:18;;;15324:30;15390:32;15370:18;;;15363:60;15440:18;;67491:122:0::2;15110:354:1::0;67491:122:0::2;67679:23;::::0;67655:10:::2;67632:34;::::0;;;:22:::2;:34;::::0;;;;;:43:::2;::::0;67669:6;;67632:43:::2;:::i;:::-;:70;;67624:118;;;;-1:-1:-1::0;;;67624:118:0::2;;;;;;;:::i;:::-;67787:6;67774:10;:8;:10::i;:::-;:19;;;;:::i;:::-;67761:9;:32;;67753:93;;;;-1:-1:-1::0;;;67753:93:0::2;;;;;;;:::i;:::-;67867:29;67877:10;67889:6;67867:9;:29::i;:::-;67932:10;67909:34;::::0;;;:22:::2;:34;::::0;;;;:44;;67947:6;;67909:34;:44:::2;::::0;67947:6;;67909:44:::2;:::i;:::-;::::0;;;-1:-1:-1;67980:14:0::2;::::0;-1:-1:-1;67967:9:0::2;::::0;::::2;;:27;::::0;::::2;;;;;;:::i;:::-;;67964:150;;;68034:6;68010:20;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;67964:150:0::2;::::0;-1:-1:-1;67964:150:0::2;;68096:6;68072:20;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;67964:150:0::2;68137:9;68126:7;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;36308:1:0::1;37262:7;:22:::0;-1:-1:-1;;;;;;;66889:1265:0:o;70122:234::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;70192:1:::1;70182:7;;:11;70174:58;;;::::0;-1:-1:-1;;;70174:58:0;;19666:2:1;70174:58:0::1;::::0;::::1;19648:21:1::0;19705:2;19685:18;;;19678:30;19744:34;19724:18;;;19717:62;-1:-1:-1;;;19795:18:1;;;19788:32;19837:19;;70174:58:0::1;19464:398:1::0;70174:58:0::1;70245:71;70263:42;70308:7;;70245:9;:71::i;:::-;70338:1;70328:7;:11:::0;70122:234::o;65810:129::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;65893:26:::1;:38:::0;65810:129::o;4840:192::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4929:22:0;::::1;4921:73;;;::::0;-1:-1:-1;;;4921:73:0;;20069:2:1;4921:73:0::1;::::0;::::1;20051:21:1::0;20108:2;20088:18;;;20081:30;20147:34;20127:18;;;20120:62;-1:-1:-1;;;20198:18:1;;;20191:36;20244:19;;4921:73:0::1;19867:402:1::0;4921:73:0::1;5005:19;5015:8;5005:9;:19::i;:::-;4840:192:::0;:::o;65061:194::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;65146:9:::1;:26:::0;;-1:-1:-1;;65146:26:0::1;65158:14;65146:26;::::0;;65183:16:::1;:24:::0;;;;65218:17:::1;:29:::0;65061:194::o;52061:196::-;52176:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;52176:29:0;-1:-1:-1;;;;;52176:29:0;;;;;;;;;52221:28;;52176:24;;52221:28;;;;;;;52061:196;;;:::o;47260:104::-;47329:27;47339:2;47343:8;47329:27;;;;;;;;;;;;:9;:27::i;49941:2002::-;50056:35;50094:20;50106:7;50094:11;:20::i;:::-;50169:18;;50056:58;;-1:-1:-1;50127:22:0;;-1:-1:-1;;;;;50153:34:0;2808:10;-1:-1:-1;;;;;50153:34:0;;:87;;;-1:-1:-1;2808:10:0;50204:20;50216:7;50204:11;:20::i;:::-;-1:-1:-1;;;;;50204:36:0;;50153:87;:154;;;-1:-1:-1;50274:18:0;;50257:50;;2808:10;45803:164;:::i;50257:50::-;50127:181;;50329:17;50321:80;;;;-1:-1:-1;;;50321:80:0;;20476:2:1;50321:80:0;;;20458:21:1;20515:2;20495:18;;;20488:30;20554:34;20534:18;;;20527:62;-1:-1:-1;;;20605:18:1;;;20598:48;20663:19;;50321:80:0;20274:414:1;50321:80:0;50444:4;-1:-1:-1;;;;;50422:26:0;:13;:18;;;-1:-1:-1;;;;;50422:26:0;;50414:77;;;;-1:-1:-1;;;50414:77:0;;20895:2:1;50414:77:0;;;20877:21:1;20934:2;20914:18;;;20907:30;20973:34;20953:18;;;20946:62;-1:-1:-1;;;21024:18:1;;;21017:36;21070:19;;50414:77:0;20693:402:1;50414:77:0;-1:-1:-1;;;;;50510:16:0;;50502:66;;;;-1:-1:-1;;;50502:66:0;;21302:2:1;50502:66:0;;;21284:21:1;21341:2;21321:18;;;21314:30;21380:34;21360:18;;;21353:62;-1:-1:-1;;;21431:18:1;;;21424:35;21476:19;;50502:66:0;21100:401:1;50502:66:0;50689:49;50706:1;50710:7;50719:13;:18;;;50689:8;:49::i;:::-;-1:-1:-1;;;;;51034:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;;;;;51034:31:0;;;-1:-1:-1;;;;;51034:31:0;;;-1:-1:-1;;51034:31:0;;;;;;;51080:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;51080:29:0;;;;;;;;;;;;;51126:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;51171:61:0;;;;-1:-1:-1;;;51216:15:0;51171:61;;;;;;51506:11;;;51536:24;;;;;:29;51506:11;;51536:29;51532:295;;51604:20;51612:11;47198:4;47232:12;-1:-1:-1;47222:22:0;47141:111;51604:20;51600:212;;;51681:18;;;51649:24;;;:11;:24;;;;;;;;:50;;51764:28;;;;51722:70;;-1:-1:-1;;;51722:70:0;-1:-1:-1;;;;;;51722:70:0;;;-1:-1:-1;;;;;51649:50:0;;;51722:70;;;;;;;51600:212;51009:829;51874:7;51870:2;-1:-1:-1;;;;;51855:27:0;51864:4;-1:-1:-1;;;;;51855:27:0;;;;;;;;;;;51893:42;50045:1898;;49941:2002;;;:::o;57955:220::-;58013:7;58037:6;58033:20;;-1:-1:-1;58052:1:0;58045:8;;58033:20;58064:9;58076:5;58080:1;58076;:5;:::i;:::-;58064:17;-1:-1:-1;58109:1:0;58100:5;58104:1;58064:17;58100:5;:::i;:::-;:10;58092:56;;;;-1:-1:-1;;;58092:56:0;;21965:2:1;58092:56:0;;;21947:21:1;22004:2;21984:18;;;21977:30;22043:34;22023:18;;;22016:62;-1:-1:-1;;;22094:18:1;;;22087:31;22135:19;;58092:56:0;21763:397:1;58653:153:0;58711:7;58743:1;58739;:5;58731:44;;;;-1:-1:-1;;;58731:44:0;;22367:2:1;58731:44:0;;;22349:21:1;22406:2;22386:18;;;22379:30;22445:28;22425:18;;;22418:56;22491:18;;58731:44:0;22165:350:1;58731:44:0;58793:5;58797:1;58793;:5;:::i;57076:179::-;57134:7;;57166:5;57170:1;57166;:5;:::i;:::-;57154:17;;57195:1;57190;:6;;57182:46;;;;-1:-1:-1;;;57182:46:0;;22722:2:1;57182:46:0;;;22704:21:1;22761:2;22741:18;;;22734:30;22800:29;22780:18;;;22773:57;22847:18;;57182:46:0;22520:351:1;57538:158:0;57596:7;57629:1;57624;:6;;57616:49;;;;-1:-1:-1;;;57616:49:0;;23078:2:1;57616:49:0;;;23060:21:1;23117:2;23097:18;;;23090:30;23156:32;23136:18;;;23129:60;23206:18;;57616:49:0;22876:354:1;57616:49:0;57683:5;57687:1;57683;:5;:::i;70431:183::-;70512:9;70527:7;-1:-1:-1;;;;;70527:12:0;70547:6;70527:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70511:47;;;70577:4;70569:37;;;;-1:-1:-1;;;70569:37:0;;23647:2:1;70569:37:0;;;23629:21:1;23686:2;23666:18;;;23659:30;-1:-1:-1;;;23705:18:1;;;23698:50;23765:18;;70569:37:0;23445:344:1;42806:537:0;-1:-1:-1;;;;;;;;;;;;;;;;;42909:16:0;42917:7;47198:4;47232:12;-1:-1:-1;47222:22:0;47141:111;42909:16;42901:71;;;;-1:-1:-1;;;42901:71:0;;23996:2:1;42901:71:0;;;23978:21:1;24035:2;24015:18;;;24008:30;24074:34;24054:18;;;24047:62;-1:-1:-1;;;24125:18:1;;;24118:40;24175:19;;42901:71:0;23794:406:1;42901:71:0;43030:7;43010:245;43077:31;43111:17;;;:11;:17;;;;;;;;;43077:51;;;;;;;;;-1:-1:-1;;;;;43077:51:0;;;;;-1:-1:-1;;;43077:51:0;;;;;;;;;;;;43151:28;43147:93;;43211:9;42806:537;-1:-1:-1;;;42806:537:0:o;43147:93::-;-1:-1:-1;;;43050:6:0;43010:245;;5040:173;5115:6;;;-1:-1:-1;;;;;5132:17:0;;;-1:-1:-1;;;;;;5132:17:0;;;;;;;5165:40;;5115:6;;;5132:17;5115:6;;5165:40;;5096:16;;5165:40;5085:128;5040:173;:::o;52822:804::-;52977:4;-1:-1:-1;;;;;52998:13:0;;6309:20;6357:8;52994:625;;53034:72;;-1:-1:-1;;;53034:72:0;;-1:-1:-1;;;;;53034:36:0;;;;;:72;;2808:10;;53085:4;;53091:7;;53100:5;;53034:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53034:72:0;;;;;;;;-1:-1:-1;;53034:72:0;;;;;;;;;;;;:::i;:::-;;;53030:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53280:13:0;;53276:273;;53323:61;;-1:-1:-1;;;53323:61:0;;;;;;;:::i;53276:273::-;53499:6;53493:13;53484:6;53480:2;53476:15;53469:38;53030:534;-1:-1:-1;;;;;;53157:55:0;-1:-1:-1;;;53157:55:0;;-1:-1:-1;53150:62:0;;52994:625;-1:-1:-1;53603:4:0;53596:11;;64507:116;64567:13;64600:15;64593:22;;;;;:::i;344:723::-;400:13;621:10;617:53;;-1:-1:-1;;648:10:0;;;;;;;;;;;;-1:-1:-1;;;648:10:0;;;;;344:723::o;617:53::-;695:5;680:12;736:78;743:9;;736:78;;769:8;;;;:::i;:::-;;-1:-1:-1;792:10:0;;-1:-1:-1;800:2:0;792:10;;:::i;:::-;;;736:78;;;824:19;856:6;846:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;846:17:0;;824:39;;874:154;881:10;;874:154;;908:11;918:1;908:11;;:::i;:::-;;-1:-1:-1;977:10:0;985:2;977:5;:10;:::i;:::-;964:24;;:2;:24;:::i;:::-;951:39;;934:6;941;934:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;934:56:0;;;;;;;;-1:-1:-1;1005:11:0;1014:2;1005:11;;:::i;:::-;;;874:154;;47727:163;47850:32;47856:2;47860:8;47870:5;47877:4;48288:20;48311:12;-1:-1:-1;;;;;48342:16:0;;48334:62;;;;-1:-1:-1;;;48334:62:0;;25820:2:1;48334:62:0;;;25802:21:1;25859:2;25839:18;;;25832:30;25898:34;25878:18;;;25871:62;-1:-1:-1;;;25949:18:1;;;25942:31;25990:19;;48334:62:0;25618:397:1;48334:62:0;48415:13;48407:66;;;;-1:-1:-1;;;48407:66:0;;26222:2:1;48407:66:0;;;26204:21:1;26261:2;26241:18;;;26234:30;26300:34;26280:18;;;26273:62;-1:-1:-1;;;26351:18:1;;;26344:38;26399:19;;48407:66:0;26020:404:1;48407:66:0;-1:-1:-1;;;;;48825:16:0;;;;;;:12;:16;;;;;;;;:45;;-1:-1:-1;;;;;;;;;48825:45:0;;-1:-1:-1;;;;;48825:45:0;;;;;;;;;;48885:50;;;;;;;;;;;;;;48952:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;49002:66:0;;;;-1:-1:-1;;;49052:15:0;49002:66;;;;;;;48952:25;;49137:415;49157:8;49153:1;:12;49137:415;;;49196:38;;49221:12;;-1:-1:-1;;;;;49196:38:0;;;49213:1;;49196:38;;49213:1;;49196:38;49257:4;49253:249;;;49320:59;49351:1;49355:2;49359:12;49373:5;49320:22;:59::i;:::-;49286:196;;;;-1:-1:-1;;;49286:196:0;;;;;;;:::i;:::-;49522:14;;;;;49167:3;49137:415;;;-1:-1:-1;49568:12:0;:27;49619:60;46531:355;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;206:173:1;274:20;;-1:-1:-1;;;;;323:31:1;;313:42;;303:70;;369:1;366;359:12;384:186;443:6;496:2;484:9;475:7;471:23;467:32;464:52;;;512:1;509;502:12;464:52;535:29;554:9;535:29;:::i;575:131::-;-1:-1:-1;;;;;;649:32:1;;639:43;;629:71;;696:1;693;686:12;711:245;769:6;822:2;810:9;801:7;797:23;793:32;790:52;;;838:1;835;828:12;790:52;877:9;864:23;896:30;920:5;896:30;:::i;961:258::-;1033:1;1043:113;1057:6;1054:1;1051:13;1043:113;;;1133:11;;;1127:18;1114:11;;;1107:39;1079:2;1072:10;1043:113;;;1174:6;1171:1;1168:13;1165:48;;;-1:-1:-1;;1209:1:1;1191:16;;1184:27;961:258::o;1224:::-;1266:3;1304:5;1298:12;1331:6;1326:3;1319:19;1347:63;1403:6;1396:4;1391:3;1387:14;1380:4;1373:5;1369:16;1347:63;:::i;:::-;1464:2;1443:15;-1:-1:-1;;1439:29:1;1430:39;;;;1471:4;1426:50;;1224:258;-1:-1:-1;;1224:258:1:o;1487:220::-;1636:2;1625:9;1618:21;1599:4;1656:45;1697:2;1686:9;1682:18;1674:6;1656:45;:::i;1712:180::-;1771:6;1824:2;1812:9;1803:7;1799:23;1795:32;1792:52;;;1840:1;1837;1830:12;1792:52;-1:-1:-1;1863:23:1;;1712:180;-1:-1:-1;1712:180:1:o;2105:254::-;2173:6;2181;2234:2;2222:9;2213:7;2209:23;2205:32;2202:52;;;2250:1;2247;2240:12;2202:52;2273:29;2292:9;2273:29;:::i;:::-;2263:39;2349:2;2334:18;;;;2321:32;;-1:-1:-1;;;2105:254:1:o;2546:::-;2614:6;2622;2675:2;2663:9;2654:7;2650:23;2646:32;2643:52;;;2691:1;2688;2681:12;2643:52;2727:9;2714:23;2704:33;;2756:38;2790:2;2779:9;2775:18;2756:38;:::i;:::-;2746:48;;2546:254;;;;;:::o;2805:328::-;2882:6;2890;2898;2951:2;2939:9;2930:7;2926:23;2922:32;2919:52;;;2967:1;2964;2957:12;2919:52;2990:29;3009:9;2990:29;:::i;:::-;2980:39;;3038:38;3072:2;3061:9;3057:18;3038:38;:::i;:::-;3028:48;;3123:2;3112:9;3108:18;3095:32;3085:42;;2805:328;;;;;:::o;3138:156::-;3204:20;;3264:4;3253:16;;3243:27;;3233:55;;3284:1;3281;3274:12;3299:393;3383:6;3391;3399;3407;3460:3;3448:9;3439:7;3435:23;3431:33;3428:53;;;3477:1;3474;3467:12;3428:53;3500:29;3519:9;3500:29;:::i;:::-;3490:39;;3548:36;3580:2;3569:9;3565:18;3548:36;:::i;:::-;3299:393;;3538:46;;-1:-1:-1;;;;3631:2:1;3616:18;;3603:32;;3682:2;3667:18;3654:32;;3299:393::o;3697:127::-;3758:10;3753:3;3749:20;3746:1;3739:31;3789:4;3786:1;3779:15;3813:4;3810:1;3803:15;3829:632;3894:5;3924:18;3965:2;3957:6;3954:14;3951:40;;;3971:18;;:::i;:::-;4046:2;4040:9;4014:2;4100:15;;-1:-1:-1;;4096:24:1;;;4122:2;4092:33;4088:42;4076:55;;;4146:18;;;4166:22;;;4143:46;4140:72;;;4192:18;;:::i;:::-;4232:10;4228:2;4221:22;4261:6;4252:15;;4291:6;4283;4276:22;4331:3;4322:6;4317:3;4313:16;4310:25;4307:45;;;4348:1;4345;4338:12;4307:45;4398:6;4393:3;4386:4;4378:6;4374:17;4361:44;4453:1;4446:4;4437:6;4429;4425:19;4421:30;4414:41;;;;3829:632;;;;;:::o;4466:451::-;4535:6;4588:2;4576:9;4567:7;4563:23;4559:32;4556:52;;;4604:1;4601;4594:12;4556:52;4644:9;4631:23;4677:18;4669:6;4666:30;4663:50;;;4709:1;4706;4699:12;4663:50;4732:22;;4785:4;4777:13;;4773:27;-1:-1:-1;4763:55:1;;4814:1;4811;4804:12;4763:55;4837:74;4903:7;4898:2;4885:16;4880:2;4876;4872:11;4837:74;:::i;4922:127::-;4983:10;4978:3;4974:20;4971:1;4964:31;5014:4;5011:1;5004:15;5038:4;5035:1;5028:15;5054:338;5196:2;5181:18;;5229:1;5218:13;;5208:144;;5274:10;5269:3;5265:20;5262:1;5255:31;5309:4;5306:1;5299:15;5337:4;5334:1;5327:15;5208:144;5361:25;;;5054:338;:::o;5397:248::-;5465:6;5473;5526:2;5514:9;5505:7;5501:23;5497:32;5494:52;;;5542:1;5539;5532:12;5494:52;-1:-1:-1;;5565:23:1;;;5635:2;5620:18;;;5607:32;;-1:-1:-1;5397:248:1:o;5650:160::-;5715:20;;5771:13;;5764:21;5754:32;;5744:60;;5800:1;5797;5790:12;5815:254;5880:6;5888;5941:2;5929:9;5920:7;5916:23;5912:32;5909:52;;;5957:1;5954;5947:12;5909:52;5980:29;5999:9;5980:29;:::i;:::-;5970:39;;6028:35;6059:2;6048:9;6044:18;6028:35;:::i;6074:180::-;6130:6;6183:2;6171:9;6162:7;6158:23;6154:32;6151:52;;;6199:1;6196;6189:12;6151:52;6222:26;6238:9;6222:26;:::i;6259:667::-;6354:6;6362;6370;6378;6431:3;6419:9;6410:7;6406:23;6402:33;6399:53;;;6448:1;6445;6438:12;6399:53;6471:29;6490:9;6471:29;:::i;:::-;6461:39;;6519:38;6553:2;6542:9;6538:18;6519:38;:::i;:::-;6509:48;;6604:2;6593:9;6589:18;6576:32;6566:42;;6659:2;6648:9;6644:18;6631:32;6686:18;6678:6;6675:30;6672:50;;;6718:1;6715;6708:12;6672:50;6741:22;;6794:4;6786:13;;6782:27;-1:-1:-1;6772:55:1;;6823:1;6820;6813:12;6772:55;6846:74;6912:7;6907:2;6894:16;6889:2;6885;6881:11;6846:74;:::i;:::-;6836:84;;;6259:667;;;;;;;:::o;6931:387::-;7015:6;7023;7031;7039;7092:3;7080:9;7071:7;7067:23;7063:33;7060:53;;;7109:1;7106;7099:12;7060:53;7145:9;7132:23;7122:33;;7174:36;7206:2;7195:9;7191:18;7174:36;:::i;7323:260::-;7391:6;7399;7452:2;7440:9;7431:7;7427:23;7423:32;7420:52;;;7468:1;7465;7458:12;7420:52;7491:29;7510:9;7491:29;:::i;:::-;7481:39;;7539:38;7573:2;7562:9;7558:18;7539:38;:::i;7588:356::-;7790:2;7772:21;;;7809:18;;;7802:30;7868:34;7863:2;7848:18;;7841:62;7935:2;7920:18;;7588:356::o;7949:380::-;8028:1;8024:12;;;;8071;;;8092:61;;8146:4;8138:6;8134:17;8124:27;;8092:61;8199:2;8191:6;8188:14;8168:18;8165:38;8162:161;;;8245:10;8240:3;8236:20;8233:1;8226:31;8280:4;8277:1;8270:15;8308:4;8305:1;8298:15;8162:161;;7949:380;;;:::o;9577:127::-;9638:10;9633:3;9629:20;9626:1;9619:31;9669:4;9666:1;9659:15;9693:4;9690:1;9683:15;9709:128;9749:3;9780:1;9776:6;9773:1;9770:13;9767:39;;;9786:18;;:::i;:::-;-1:-1:-1;9822:9:1;;9709:128::o;12194:355::-;12396:2;12378:21;;;12435:2;12415:18;;;12408:30;12474:33;12469:2;12454:18;;12447:61;12540:2;12525:18;;12194:355::o;12554:135::-;12593:3;-1:-1:-1;;12614:17:1;;12611:43;;;12634:18;;:::i;:::-;-1:-1:-1;12681:1:1;12670:13;;12554:135::o;12694:125::-;12734:4;12762:1;12759;12756:8;12753:34;;;12767:18;;:::i;:::-;-1:-1:-1;12804:9:1;;12694:125::o;15469:399::-;15671:2;15653:21;;;15710:2;15690:18;;;15683:30;15749:34;15744:2;15729:18;;15722:62;-1:-1:-1;;;15815:2:1;15800:18;;15793:33;15858:3;15843:19;;15469:399::o;15873:168::-;15913:7;15979:1;15975;15971:6;15967:14;15964:1;15961:21;15956:1;15949:9;15942:17;15938:45;15935:71;;;15986:18;;:::i;:::-;-1:-1:-1;16026:9:1;;15873:168::o;16046:412::-;16248:2;16230:21;;;16287:2;16267:18;;;16260:30;16326:34;16321:2;16306:18;;16299:62;-1:-1:-1;;;16392:2:1;16377:18;;16370:46;16448:3;16433:19;;16046:412::o;16463:415::-;16665:2;16647:21;;;16704:2;16684:18;;;16677:30;16743:34;16738:2;16723:18;;16716:62;-1:-1:-1;;;16809:2:1;16794:18;;16787:49;16868:3;16853:19;;16463:415::o;17299:637::-;17579:3;17617:6;17611:13;17633:53;17679:6;17674:3;17667:4;17659:6;17655:17;17633:53;:::i;:::-;17749:13;;17708:16;;;;17771:57;17749:13;17708:16;17805:4;17793:17;;17771:57;:::i;:::-;-1:-1:-1;;;17850:20:1;;17879:22;;;17928:1;17917:13;;17299:637;-1:-1:-1;;;;17299:637:1:o;21506:127::-;21567:10;21562:3;21558:20;21555:1;21548:31;21598:4;21595:1;21588:15;21622:4;21619:1;21612:15;21638:120;21678:1;21704;21694:35;;21709:18;;:::i;:::-;-1:-1:-1;21743:9:1;;21638:120::o;24621:489::-;-1:-1:-1;;;;;24890:15:1;;;24872:34;;24942:15;;24937:2;24922:18;;24915:43;24989:2;24974:18;;24967:34;;;25037:3;25032:2;25017:18;;25010:31;;;24815:4;;25058:46;;25084:19;;25076:6;25058:46;:::i;:::-;25050:54;24621:489;-1:-1:-1;;;;;;24621:489:1:o;25115:249::-;25184:6;25237:2;25225:9;25216:7;25212:23;25208:32;25205:52;;;25253:1;25250;25243:12;25205:52;25285:9;25279:16;25304:30;25328:5;25304:30;:::i;25369:112::-;25401:1;25427;25417:35;;25432:18;;:::i;:::-;-1:-1:-1;25466:9:1;;25369:112::o;25486:127::-;25547:10;25542:3;25538:20;25535:1;25528:31;25578:4;25575:1;25568:15;25602:4;25599:1;25592:15

Swarm Source

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