ETH Price: $3,879.33 (+7.50%)

Token

ERC-20: EGGsly.io by Karrie Ross (EGGSLY)
 

Overview

Max Total Supply

200 EGGSLY

Holders

118

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 EGGSLY
0xdf4a2fb9d41f02344afdbffde91415b3c45fae03
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:
Eggsly

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 100000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Dependency file: @openzeppelin/contracts/utils/introspection/IERC165.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

// pragma solidity ^0.8.0;

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


// Dependency file: @openzeppelin/contracts/token/ERC721/IERC721.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/utils/introspection/IERC165.sol";

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


// Dependency file: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

// pragma solidity ^0.8.0;

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


// Dependency file: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol

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

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/token/ERC721/IERC721.sol";

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


// Dependency file: @openzeppelin/contracts/utils/Address.sol

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

// pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// Dependency file: @openzeppelin/contracts/utils/Context.sol

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

// pragma solidity ^0.8.0;

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

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


// Dependency file: @openzeppelin/contracts/utils/Strings.sol

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

// pragma solidity ^0.8.0;

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

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

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

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

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


// Dependency file: @openzeppelin/contracts/utils/introspection/ERC165.sol

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

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/utils/introspection/IERC165.sol";

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


// Dependency file: @openzeppelin/contracts/token/ERC721/ERC721.sol

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

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
// import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
// import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
// import "@openzeppelin/contracts/utils/Address.sol";
// import "@openzeppelin/contracts/utils/Context.sol";
// import "@openzeppelin/contracts/utils/Strings.sol";
// import "@openzeppelin/contracts/utils/introspection/ERC165.sol";

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be 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 {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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


// Dependency file: @openzeppelin/contracts/access/Ownable.sol

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

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/utils/Context.sol";

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

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

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

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

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


// Dependency file: @openzeppelin/contracts/utils/cryptography/ECDSA.sol

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

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/utils/Strings.sol";

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}


// Dependency file: @openzeppelin/contracts/utils/Counters.sol

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

// pragma solidity ^0.8.0;

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

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

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

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

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


// Dependency file: node_modules/erc721a/contracts/ERC721A.sol

// Creator: Chiru Labs

// pragma solidity ^0.8.4;

// import '/Users/mcasanova/Projects/CasanovaDevStudio/Dev/hashku-contracts/eggsly/node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol';
// import '/Users/mcasanova/Projects/CasanovaDevStudio/Dev/hashku-contracts/eggsly/node_modules/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol';
// import '/Users/mcasanova/Projects/CasanovaDevStudio/Dev/hashku-contracts/eggsly/node_modules/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol';
// import '/Users/mcasanova/Projects/CasanovaDevStudio/Dev/hashku-contracts/eggsly/node_modules/@openzeppelin/contracts/utils/Address.sol';
// import '/Users/mcasanova/Projects/CasanovaDevStudio/Dev/hashku-contracts/eggsly/node_modules/@openzeppelin/contracts/utils/Context.sol';
// import '/Users/mcasanova/Projects/CasanovaDevStudio/Dev/hashku-contracts/eggsly/node_modules/@openzeppelin/contracts/utils/Strings.sol';
// import '/Users/mcasanova/Projects/CasanovaDevStudio/Dev/hashku-contracts/eggsly/node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol';

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

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

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // 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_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * 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) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

        _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 virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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 _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    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;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

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

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _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);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.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;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // 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 storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @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 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        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 TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * 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`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    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.
     * And also called after one token has been burned.
     *
     * 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` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}


// Root file: contracts/Eggsly.sol


/*
*
* Eggsly.io by Karrie Ross Contract
* 
* Contract by Matt Casanova [Twitter: @DevGuyThings]
* 
* Project launched with Hashku
*
*/

pragma solidity >=0.8.13;

// import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
// import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
// import "@openzeppelin/contracts/access/Ownable.sol";
// import "@openzeppelin/contracts/utils/Address.sol";
// import "@openzeppelin/contracts/utils/Strings.sol";
// import "@openzeppelin/contracts/utils/Context.sol";
// import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
// import "@openzeppelin/contracts/utils/Counters.sol";
// import "erc721a/contracts/ERC721A.sol";

contract Eggsly is Context, Ownable, ERC721A {
    using Address for address;
    using Strings for uint256;
    using ECDSA for bytes32;
    using Counters for Counters.Counter;

    uint256 public totalShopped;
    string public baseTokenURI = "https://storage.hashku.com/api/karrie-ross/eggsly/";
    string public key = "EGGSLY";
    string public group = "init";
    uint256 public maxMintPerAddress;
    uint256 public maxMintPerTransaction;
    uint256 public maxTokens = 1000;
    uint256 public price = 22000000000000000;
    bool public isPublic = true;
    bool public isClosed;
    address public verifySigner = 0x9441aC38201d9249AE2568b5fa4dDDD8f6850df7;
    address public devAddress;
    uint256 public devAmountAvailable;
    uint256 public devAmountRemitted;
    address public withdrawalAddress;
    address public delegatedAddress;
    mapping(address => uint256) public tokensMinted;

    event ContractUpdated(string _type);
    event Withdrawal(string _type, address _to, uint256 _amount);

    modifier onlyDevAddress() {
        require(_msgSender() == devAddress, "dev_only");
        _;
    }

    modifier onlyWithdrawer() {
        require(withdrawalAddress != address(0), "no_withdrawals");
        require(withdrawalAddress == _msgSender(), "not_allowed");
        _;
    }

    function _startTokenId() internal override view virtual returns (uint256) {
        return 1;
    }

    constructor() ERC721A("EGGsly.io by Karrie Ross", "EGGSLY") {
        devAddress = _msgSender();
        withdrawalAddress = _msgSender();
    }

    // for use by Hashku widget and max quantity checks
    function nextToken() public view returns (uint256) {
        return totalSupply();
    }

    // return the token URI for a specific token
    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), "no_token");

        return bytes(baseTokenURI).length > 0 ? string(abi.encodePacked(baseTokenURI, _tokenId.toString())) : "";
    }

    // internal mint function 
    function mint(address _to, uint256 _amount) internal {
       _mint(_to, _amount, "", false);
    }

    // owner sends NFTs to addresses
    function send(address[] calldata _addresses, uint256[] calldata _amounts) external onlyOwner {
        require(_addresses.length == _amounts.length, "amount_mismatch");

        uint256 total;
        for (uint256 t = 0; t < _amounts.length; t++) {
            total += _amounts[t];
        }

        require(totalSupply() + total <= maxTokens, "not_enough_tokens");

        delete total;

        for (uint256 i = 0; i < _addresses.length; i++) {
            mint(_addresses[i], _amounts[i]);
        }
    }

    // dev amount will be 10% of payments, rounded down
    function splitPayment(uint256 _paymentAmount) internal {
        devAmountAvailable += _paymentAmount / 10;
    }

    // buy NFTs - version without signature required for public mint
    function shop(uint256 _amount) external payable {
        require(!isClosed, "closed");
        require(isPublic, "not_allowed");
        require(canMint(_amount), "not_enough_tokens");
        require(price * _amount == msg.value, "incorrect_funds");

        splitPayment(price * _amount);

        tokensMinted[_msgSender()] += _amount;

        mint(_msgSender(), _amount);
    }

    // buy NFTs
    function shop(uint256 _amount, bytes memory _signature) external payable {
        require(!isClosed, "closed");
        require(verifySignature(_signature), "invalid_signature");
        require(canMint(_amount), "not_enough_tokens");
        require(price * _amount == msg.value, "incorrect_funds");
        
        splitPayment(price * _amount);

        tokensMinted[_msgSender()] += _amount;

        mint(_msgSender(), _amount);
    }

    // check on restrictions related to amounts of tokens to be minted
    function canMint(uint256 _amount) public view returns (bool) {
        if (maxTokens > 0) {
            if (totalSupply() + _amount > maxTokens) {
                return false;
            }
        }

        if (maxMintPerAddress > 0) {
            if (tokensMinted[_msgSender()] + _amount > maxMintPerAddress) {
                return false;
            }
        }

        return true;
    }

    // this is used for Hashku mints where restrictions might be placed on who can mint
    function eligible() public pure returns (bool) {
        return true;
    }

    // owner set the contract key for signature verification
    function setKey(string calldata _key) external onlyOwner {
        key = _key;
        emit ContractUpdated("key");
    }

    // owner set the contract to public mode
    function setIsPublic(bool _public) external onlyOwner {
        isPublic = _public;
        emit ContractUpdated("isPublic");
    }

    // owner set the contract to closed
    function setIsClosed(bool _closed) external onlyOwner {
        isClosed = _closed;
        emit ContractUpdated("isClosed");
    }

    // owner set the price of minting
    function setPrice(uint256 _price) external onlyOwner {
        price = _price;
        emit ContractUpdated("price");
    }

    // owner set the price of minting
    function setMaxTokens(uint256 _tokens) external onlyOwner {
        maxTokens = _tokens;
        emit ContractUpdated("maxTokens");
    }

    // set the maximum amount an address may mint
    function setMaxMintPerAddress(uint256 _amount) external onlyOwner {
        maxMintPerAddress = _amount;
        emit ContractUpdated("maxMintPerAddress");
    }

    // set the current contract group for signature verification
    function setGroup(string memory _group) external onlyOwner {
        group = _group;
        emit ContractUpdated("group");
    }

    // owner set a new base token URI
    function setBaseUri(string calldata _baseTokenURI) external onlyOwner {
        baseTokenURI = _baseTokenURI;
        emit ContractUpdated("baseURI");
    }

    // owner set a new address for signature verification
    function setVerifySigner(address _verifySigner) external onlyOwner {
        verifySigner = _verifySigner;
        emit ContractUpdated("verifySigner");
    }

    // verify signature based on contract key, contract group, token amount, and the msg sender
    function verifySignature(
        bytes memory _signature
    ) internal view returns (bool) {
        bytes32 _messageHash = keccak256(abi.encodePacked(key, group, _msgSender()));

        return _messageHash.toEthSignedMessageHash().recover(_signature) == verifySigner;
    }

    // withdrawal address convenience method for pulling balance of contract
    function seeBalance() external view returns (uint256) {
        return address(this).balance;
    }

    // amount available for owner withdrawal
    function balanceAvailable() public view returns (uint256) {
        if (address(this).balance <= devAmountAvailable) {
            return 0;
        }
        return address(this).balance - devAmountAvailable;
    }

    // withdrawal address set a new withdrawal address
    function setWithdrawalAddress(address _address) external onlyOwner {
        withdrawalAddress = _address;
        emit ContractUpdated("withdrawalAddress");
    }

    // withdrawal address send an amount to an address
    function withdraw(address payable _to, uint256 _amount) external onlyWithdrawer returns (bool) {
        require(balanceAvailable() > 0, "insufficient_funds");
        require(_amount <= balanceAvailable(), "insufficient_funds");
        _to.transfer(_amount);
        emit Withdrawal("owner", _to, _amount);
        return true;
    }

    // withdrawal address send an amount to an address
    function devWithdraw(address payable _to, uint256 _amount) external onlyDevAddress returns (bool) {
        require(_amount <= devAmountAvailable, "insufficient_funds");
        devAmountAvailable -= _amount;
        devAmountRemitted += _amount;
        _to.transfer(_amount);
        emit Withdrawal("dev", _to, _amount);
        return true;
    }

    // dev set a new address for dev withdrawal
    function setDevAddress(address _devAddress) external onlyDevAddress {
        devAddress = _devAddress;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"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":false,"internalType":"string","name":"_type","type":"string"}],"name":"ContractUpdated","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_type","type":"string"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Withdrawal","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"canMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delegatedAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devAmountAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devAmountRemitted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"devWithdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eligible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"group","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"isClosed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"key","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","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":"nextToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"seeBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"send","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devAddress","type":"address"}],"name":"setDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_group","type":"string"}],"name":"setGroup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_closed","type":"bool"}],"name":"setIsClosed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_public","type":"bool"}],"name":"setIsPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_key","type":"string"}],"name":"setKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxMintPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"setMaxTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_verifySigner","type":"address"}],"name":"setVerifySigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setWithdrawalAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"shop","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"shop","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShopped","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":"verifySigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawalAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60e060405260326080818152906200474560a03980516200002991600a91602090910190620001ed565b5060408051808201909152600680825265454747534c5960d01b60209092019182526200005991600b91620001ed565b50604080518082019091526004808252631a5b9a5d60e21b60209092019182526200008791600c91620001ed565b506103e8600f55664e28e2290f00006010556011805461ff01600160b01b031916759441ac38201d9249ae2568b5fa4dddd8f6850df70001179055348015620000cf57600080fd5b506040518060400160405280601881526020017f454747736c792e696f206279204b617272696520526f7373000000000000000081525060405180604001604052806006815260200165454747534c5960d01b8152506200013f620001396200019960201b60201c565b6200019d565b815162000154906003906020850190620001ed565b5080516200016a906004906020840190620001ed565b5050600180555060128054336001600160a01b03199182168117909255601580549091169091179055620002cf565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620001fb9062000293565b90600052602060002090601f0160209004810192826200021f57600085556200026a565b82601f106200023a57805160ff19168380011785556200026a565b828001600101855582156200026a579182015b828111156200026a5782518255916020019190600101906200024d565b50620002789291506200027c565b5090565b5b808211156200027857600081556001016200027d565b600181811c90821680620002a857607f821691505b602082108103620002c957634e487b7160e01b600052602260045260246000fd5b50919050565b61446680620002df6000396000f3fe6080604052600436106103605760003560e01c80639499ac54116101c6578063d8701554116100f7578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b146109c5578063f3fef3a3146109e5578063fdab3b3f14610a05578063ffc325e314610a2557600080fd5b8063e985e9c514610922578063effdf5a614610978578063f2bcd0221461099857600080fd5b8063e09a470a116100d1578063e09a470a146108a3578063e0d11a47146108b9578063e8315742146108d9578063e8c61831146108ef57600080fd5b8063d870155414610863578063da69c08314610876578063dc9a15351461088957600080fd5b8063b88d4fde11610164578063c97b97301161013e578063c97b9730146107fa578063d0d41fe11461081a578063d547cfb71461083a578063d832d92f1461084f57600080fd5b8063b88d4fde1461079b578063c2b6b58c146107bb578063c87b56dd146107da57600080fd5b8063a0bcfc7f116101a0578063a0bcfc7f1461071b578063a22cb4651461073b578063a645ff5f1461075b578063af42d1061461077b57600080fd5b80639499ac541461046757806395d89b41146106f0578063a035b1fe1461070557600080fd5b806342842e0e116102a05780636dc351361161023e5780637da2d1f4116102185780637da2d1f41461067a57806381b5359a1461068f5780638da5cb5b146106a557806391b7f5ed146106d057600080fd5b80636dc351361461062f57806370a0823114610645578063715018a61461066557600080fd5b8063546104811161027a57806354610481146105ac578063572849c4146105d95780635dd871a3146105ef5780636352211e1461060f57600080fd5b806342842e0e14610559578063429a1bb01461057957806349668b4a1461058c57600080fd5b806318160ddd1161030d57806323b872dd116102e757806323b872dd146104e257806329e7ef2d146105025780633943380c146105175780633ad10ef61461052c57600080fd5b806318160ddd146104675780631e14d44b146104a257806321b8092e146104c257600080fd5b8063081812fc1161033e578063081812fc146103e0578063095ea7b31461042557806311e776fe1461044757600080fd5b806301f569971461036557806301ffc9a71461038e57806306fdde03146103be575b600080fd5b34801561037157600080fd5b5061037b600e5481565b6040519081526020015b60405180910390f35b34801561039a57600080fd5b506103ae6103a9366004613b9e565b610a52565b6040519015158152602001610385565b3480156103ca57600080fd5b506103d3610b37565b6040516103859190613c38565b3480156103ec57600080fd5b506104006103fb366004613c4b565b610bc9565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610385565b34801561043157600080fd5b50610445610440366004613c86565b610c33565b005b34801561045357600080fd5b50610445610462366004613c4b565b610d19565b34801561047357600080fd5b50600254600154037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161037b565b3480156104ae57600080fd5b506104456104bd366004613c4b565b610e0f565b3480156104ce57600080fd5b506104456104dd366004613cb2565b610ef5565b3480156104ee57600080fd5b506104456104fd366004613ccf565b611018565b34801561050e57600080fd5b506103d3611023565b34801561052357600080fd5b506103d36110b1565b34801561053857600080fd5b506012546104009073ffffffffffffffffffffffffffffffffffffffff1681565b34801561056557600080fd5b50610445610574366004613ccf565b6110be565b34801561058557600080fd5b504761037b565b34801561059857600080fd5b506104456105a7366004613d25565b6110d9565b3480156105b857600080fd5b5061037b6105c7366004613cb2565b60176020526000908152604090205481565b3480156105e557600080fd5b5061037b600d5481565b3480156105fb57600080fd5b506103ae61060a366004613c4b565b6111ec565b34801561061b57600080fd5b5061040061062a366004613c4b565b61127a565b34801561063b57600080fd5b5061037b60095481565b34801561065157600080fd5b5061037b610660366004613cb2565b61128c565b34801561067157600080fd5b5061044561130e565b34801561068657600080fd5b5061037b61139b565b34801561069b57600080fd5b5061037b60135481565b3480156106b157600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610400565b3480156106dc57600080fd5b506104456106eb366004613c4b565b6113be565b3480156106fc57600080fd5b506103d36114a4565b34801561071157600080fd5b5061037b60105481565b34801561072757600080fd5b50610445610736366004613d40565b6114b3565b34801561074757600080fd5b50610445610756366004613db2565b6115ac565b34801561076757600080fd5b50610445610776366004613e2c565b611692565b34801561078757600080fd5b50610445610796366004613d40565b6118d1565b3480156107a757600080fd5b506104456107b6366004613f7b565b6119be565b3480156107c757600080fd5b506011546103ae90610100900460ff1681565b3480156107e657600080fd5b506103d36107f5366004613c4b565b611a35565b34801561080657600080fd5b50610445610815366004613fe7565b611b02565b34801561082657600080fd5b50610445610835366004613cb2565b611bf6565b34801561084657600080fd5b506103d3611cd4565b34801561085b57600080fd5b5060016103ae565b610445610871366004614030565b611ce1565b610445610884366004613c4b565b611ef0565b34801561089557600080fd5b506011546103ae9060ff1681565b3480156108af57600080fd5b5061037b60145481565b3480156108c557600080fd5b506104456108d4366004613cb2565b6120f6565b3480156108e557600080fd5b5061037b600f5481565b3480156108fb57600080fd5b506011546104009062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561092e57600080fd5b506103ae61093d366004614077565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561098457600080fd5b506103ae610993366004613c86565b61221e565b3480156109a457600080fd5b506015546104009073ffffffffffffffffffffffffffffffffffffffff1681565b3480156109d157600080fd5b506104456109e0366004613cb2565b612426565b3480156109f157600080fd5b506103ae610a00366004613c86565b612553565b348015610a1157600080fd5b50610445610a20366004613d25565b6127fd565b348015610a3157600080fd5b506016546104009073ffffffffffffffffffffffffffffffffffffffff1681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480610ae557507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610b3157507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606060038054610b46906140b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610b72906140b0565b8015610bbf5780601f10610b9457610100808354040283529160200191610bbf565b820191906000526020600020905b815481529060010190602001808311610ba257829003601f168201915b5050505050905090565b6000610bd48261290c565b610c0a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060009081526007602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610c3e8261127a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ca5576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821614801590610cd25750610cd0813361093d565b155b15610d09576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d1483838361295e565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600f8190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e049060208082526009908201527f6d6178546f6b656e730000000000000000000000000000000000000000000000604082015260600190565b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d96565b600d8190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e049060208082526011908201527f6d61784d696e7450657241646472657373000000000000000000000000000000604082015260600190565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d96565b6015805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e049060208082526011908201527f7769746864726177616c41646472657373000000000000000000000000000000604082015260600190565b610d148383836129df565b600c8054611030906140b0565b80601f016020809104026020016040519081016040528092919081815260200182805461105c906140b0565b80156110a95780601f1061107e576101008083540402835291602001916110a9565b820191906000526020600020905b81548152906001019060200180831161108c57829003601f168201915b505050505081565b600b8054611030906140b0565b610d14838383604051806020016040528060008152506119be565b60005473ffffffffffffffffffffffffffffffffffffffff16331461115a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d96565b60118054821515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9091161790556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e049060208082526008908201527f6973436c6f736564000000000000000000000000000000000000000000000000604082015260600190565b600f546000901561123e57600f54600254600154849190037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016112309190614132565b111561123e57506000919050565b600d541561127257600d5433600090815260176020526040902054611264908490614132565b111561127257506000919050565b506001919050565b600061128582612d17565b5192915050565b600073ffffffffffffffffffffffffffffffffffffffff82166112db576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5073ffffffffffffffffffffffffffffffffffffffff1660009081526006602052604090205467ffffffffffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff16331461138f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d96565b6113996000612ef2565b565b600060135447116113ac5750600090565b6013546113b9904761414a565b905090565b60005473ffffffffffffffffffffffffffffffffffffffff16331461143f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d96565b60108190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e049060208082526005908201527f7072696365000000000000000000000000000000000000000000000000000000604082015260600190565b606060048054610b46906140b0565b60005473ffffffffffffffffffffffffffffffffffffffff163314611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d96565b611540600a8383613a45565b507f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b4426040516115a09060208082526007908201527f6261736555524900000000000000000000000000000000000000000000000000604082015260600190565b60405180910390a15050565b3373ffffffffffffffffffffffffffffffffffffffff8316036115fb576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d96565b82811461177c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f616d6f756e745f6d69736d6174636800000000000000000000000000000000006044820152606401610d96565b6000805b828110156117c05783838281811061179a5761179a614161565b90506020020135826117ac9190614132565b9150806117b881614190565b915050611780565b50600f54600254600154839190037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016117fa9190614132565b1115611862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f6e6f745f656e6f7567685f746f6b656e730000000000000000000000000000006044820152606401610d96565b506000805b848110156118c9576118b786868381811061188457611884614161565b90506020020160208101906118999190613cb2565b8585848181106118ab576118ab614161565b90506020020135612f67565b806118c181614190565b915050611867565b505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d96565b61195e600b8383613a45565b507f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b4426040516115a09060208082526003908201527f6b65790000000000000000000000000000000000000000000000000000000000604082015260600190565b6119c98484846129df565b73ffffffffffffffffffffffffffffffffffffffff83163b151580156119f857506119f684848484612f83565b155b15611a2f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611a408261290c565b611aa6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f6e6f5f746f6b656e0000000000000000000000000000000000000000000000006044820152606401610d96565b6000600a8054611ab5906140b0565b905011611ad15760405180602001604052806000815250610b31565b600a611adc836130fd565b604051602001611aed929190614298565b60405160208183030381529060405292915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611b83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d96565b8051611b9690600c906020840190613ae7565b507f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b442604051610e049060208082526005908201527f67726f7570000000000000000000000000000000000000000000000000000000604082015260600190565b60125473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f6465765f6f6e6c790000000000000000000000000000000000000000000000006044820152606401610d96565b601280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600a8054611030906140b0565b601154610100900460ff1615611d53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f636c6f73656400000000000000000000000000000000000000000000000000006044820152606401610d96565b611d5c81613232565b611dc2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f696e76616c69645f7369676e61747572650000000000000000000000000000006044820152606401610d96565b611dcb826111ec565b611e31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f6e6f745f656e6f7567685f746f6b656e730000000000000000000000000000006044820152606401610d96565b3482601054611e4091906142bd565b14611ea7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e636f72726563745f66756e647300000000000000000000000000000000006044820152606401610d96565b611ebd82601054611eb891906142bd565b613323565b3360009081526017602052604081208054849290611edc908490614132565b90915550611eec90503383612f67565b5050565b601154610100900460ff1615611f62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f636c6f73656400000000000000000000000000000000000000000000000000006044820152606401610d96565b60115460ff16611fce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f745f616c6c6f7765640000000000000000000000000000000000000000006044820152606401610d96565b611fd7816111ec565b61203d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f6e6f745f656e6f7567685f746f6b656e730000000000000000000000000000006044820152606401610d96565b348160105461204c91906142bd565b146120b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e636f72726563745f66756e647300000000000000000000000000000000006044820152606401610d96565b6120c481601054611eb891906142bd565b33600090815260176020526040812080548392906120e3908490614132565b909155506120f390503382612f67565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314612177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d96565b6011805473ffffffffffffffffffffffffffffffffffffffff831662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff9091161790556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e04906020808252600c908201527f7665726966795369676e65720000000000000000000000000000000000000000604082015260600190565b60125460009073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146122b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f6465765f6f6e6c790000000000000000000000000000000000000000000000006044820152606401610d96565b601354821115612324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e73756666696369656e745f66756e647300000000000000000000000000006044820152606401610d96565b8160136000828254612336919061414a565b92505081905550816014600082825461234f9190614132565b909155505060405173ffffffffffffffffffffffffffffffffffffffff84169083156108fc029084906000818181858888f19350505050158015612397573d6000803e3d6000fd5b506040805160608082526003908201527f6465760000000000000000000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff851660208201529081018390527fd0cfd60d55acd3226ac0fafab52ad35f0ab2fb6eedb946f7d8405108d71df46d9060a0015b60405180910390a150600192915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146124a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d96565b73ffffffffffffffffffffffffffffffffffffffff811661254a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d96565b6120f381612ef2565b60155460009073ffffffffffffffffffffffffffffffffffffffff166125d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6e6f5f7769746864726177616c730000000000000000000000000000000000006044820152606401610d96565b60155473ffffffffffffffffffffffffffffffffffffffff163314612656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f745f616c6c6f7765640000000000000000000000000000000000000000006044820152606401610d96565b600061266061139b565b116126c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e73756666696369656e745f66756e647300000000000000000000000000006044820152606401610d96565b6126cf61139b565b821115612738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e73756666696369656e745f66756e647300000000000000000000000000006044820152606401610d96565b60405173ffffffffffffffffffffffffffffffffffffffff84169083156108fc029084906000818181858888f1935050505015801561277b573d6000803e3d6000fd5b506040805160608082526005908201527f6f776e6572000000000000000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff851660208201529081018390527fd0cfd60d55acd3226ac0fafab52ad35f0ab2fb6eedb946f7d8405108d71df46d9060a001612415565b60005473ffffffffffffffffffffffffffffffffffffffff16331461287e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d96565b601180548215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091161790556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e049060208082526008908201527f69735075626c6963000000000000000000000000000000000000000000000000604082015260600190565b600081600111158015612920575060015482105b8015610b315750506000908152600560205260409020547c0100000000000000000000000000000000000000000000000000000000900460ff161590565b60008281526007602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006129ea82612d17565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612a55576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff86161480612a805750612a80853361093d565b80612aa8575033612a9084610bc9565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612ae1576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416612b2e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b3a6000848761295e565b73ffffffffffffffffffffffffffffffffffffffff858116600090815260066020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000080821667ffffffffffffffff9283167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080547fffffffff00000000000000000000000000000000000000000000000000000000169094177401000000000000000000000000000000000000000042909216919091021783558701808452922080549193909116612cb1576001548214612cb1578054602086015167ffffffffffffffff1674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8a16171781555b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60408051606081018252600080825260208201819052918101919091528180600111158015612d47575060015481105b15612ec0576000818152600560209081526040918290208251606081018452905473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000810467ffffffffffffffff16928201929092527c010000000000000000000000000000000000000000000000000000000090910460ff16151591810182905290612ebe57805173ffffffffffffffffffffffffffffffffffffffff1615612dff579392505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016000818152600560209081526040918290208251606081018452905473ffffffffffffffffffffffffffffffffffffffff811680835274010000000000000000000000000000000000000000820467ffffffffffffffff16938301939093527c0100000000000000000000000000000000000000000000000000000000900460ff1615159281019290925215612eb9579392505050565b612dff565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611eec8282604051806020016040528060008152506000613347565b6040517f150b7a0200000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290612fde9033908990889088906004016142fa565b6020604051808303816000875af1925050508015613037575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261303491810190614343565b60015b6130ae573d808015613065576040519150601f19603f3d011682016040523d82523d6000602084013e61306a565b606091505b5080516000036130a6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490505b949350505050565b60608160000361314057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561316a578061315481614190565b91506131639050600a8361438f565b9150613144565b60008167ffffffffffffffff81111561318557613185613e98565b6040519080825280601f01601f1916602001820160405280156131af576020820181803683370190505b5090505b84156130f5576131c460018361414a565b91506131d1600a866143a3565b6131dc906030614132565b60f81b8183815181106131f1576131f1614161565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061322b600a8661438f565b94506131b3565b600080600b600c3360405160200161324c939291906143b7565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052805160209091012060115490915062010000900473ffffffffffffffffffffffffffffffffffffffff16613305846132ff846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b906135f5565b73ffffffffffffffffffffffffffffffffffffffff16149392505050565b61332e600a8261438f565b6013600082825461333f9190614132565b909155505050565b60015473ffffffffffffffffffffffffffffffffffffffff8516613397576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000036133d1576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516600081815260066020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000811667ffffffffffffffff8083168c018116918217680100000000000000007fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090941690921783900481168c01811690920217909155858452600590925290912080547fffffffff0000000000000000000000000000000000000000000000000000000016909217740100000000000000000000000000000000000000004290921691909102179055808085018380156134ec575073ffffffffffffffffffffffffffffffffffffffff87163b15155b1561359a575b604051829073ffffffffffffffffffffffffffffffffffffffff8916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461354a6000888480600101955088612f83565b613580576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036134f257826001541461359557600080fd5b6135ec565b5b60405160018301929073ffffffffffffffffffffffffffffffffffffffff8916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480820361359b575b50600155612d10565b60008060006136048585613619565b9150915061361181613687565b509392505050565b600080825160410361364f5760208301516040840151606085015160001a613643878285856138db565b94509450505050613680565b8251604003613678576020830151604084015161366d8683836139f3565b935093505050613680565b506000905060025b9250929050565b600081600481111561369b5761369b614401565b036136a35750565b60018160048111156136b7576136b7614401565b0361371e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610d96565b600281600481111561373257613732614401565b03613799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610d96565b60038160048111156137ad576137ad614401565b0361383a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610d96565b600481600481111561384e5761384e614401565b036120f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610d96565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561391257506000905060036139ea565b8460ff16601b1415801561392a57508460ff16601c14155b1561393b57506000905060046139ea565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561398f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166139e3576000600192509250506139ea565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831681613a2960ff86901c601b614132565b9050613a37878288856138db565b935093505050935093915050565b828054613a51906140b0565b90600052602060002090601f016020900481019282613a735760008555613ad7565b82601f10613aaa578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555613ad7565b82800160010185558215613ad7579182015b82811115613ad7578235825591602001919060010190613abc565b50613ae3929150613b5b565b5090565b828054613af3906140b0565b90600052602060002090601f016020900481019282613b155760008555613ad7565b82601f10613b2e57805160ff1916838001178555613ad7565b82800160010185558215613ad7579182015b82811115613ad7578251825591602001919060010190613b40565b5b80821115613ae35760008155600101613b5c565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146120f357600080fd5b600060208284031215613bb057600080fd5b8135613bbb81613b70565b9392505050565b60005b83811015613bdd578181015183820152602001613bc5565b83811115611a2f5750506000910152565b60008151808452613c06816020860160208601613bc2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613bbb6020830184613bee565b600060208284031215613c5d57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146120f357600080fd5b60008060408385031215613c9957600080fd5b8235613ca481613c64565b946020939093013593505050565b600060208284031215613cc457600080fd5b8135613bbb81613c64565b600080600060608486031215613ce457600080fd5b8335613cef81613c64565b92506020840135613cff81613c64565b929592945050506040919091013590565b80358015158114613d2057600080fd5b919050565b600060208284031215613d3757600080fd5b613bbb82613d10565b60008060208385031215613d5357600080fd5b823567ffffffffffffffff80821115613d6b57600080fd5b818501915085601f830112613d7f57600080fd5b813581811115613d8e57600080fd5b866020828501011115613da057600080fd5b60209290920196919550909350505050565b60008060408385031215613dc557600080fd5b8235613dd081613c64565b9150613dde60208401613d10565b90509250929050565b60008083601f840112613df957600080fd5b50813567ffffffffffffffff811115613e1157600080fd5b6020830191508360208260051b850101111561368057600080fd5b60008060008060408587031215613e4257600080fd5b843567ffffffffffffffff80821115613e5a57600080fd5b613e6688838901613de7565b90965094506020870135915080821115613e7f57600080fd5b50613e8c87828801613de7565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115613ee257613ee2613e98565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715613f2857613f28613e98565b81604052809350858152868686011115613f4157600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112613f6c57600080fd5b613bbb83833560208501613ec7565b60008060008060808587031215613f9157600080fd5b8435613f9c81613c64565b93506020850135613fac81613c64565b925060408501359150606085013567ffffffffffffffff811115613fcf57600080fd5b613fdb87828801613f5b565b91505092959194509250565b600060208284031215613ff957600080fd5b813567ffffffffffffffff81111561401057600080fd5b8201601f8101841361402157600080fd5b6130f584823560208401613ec7565b6000806040838503121561404357600080fd5b82359150602083013567ffffffffffffffff81111561406157600080fd5b61406d85828601613f5b565b9150509250929050565b6000806040838503121561408a57600080fd5b823561409581613c64565b915060208301356140a581613c64565b809150509250929050565b600181811c908216806140c457607f821691505b6020821081036140fd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561414557614145614103565b500190565b60008282101561415c5761415c614103565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036141c1576141c1614103565b5060010190565b8054600090600181811c90808316806141e257607f831692505b6020808410820361421c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b818015614230576001811461425f5761428c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952848901965061428c565b60008881526020902060005b868110156142845781548b82015290850190830161426b565b505084890196505b50505050505092915050565b60006142a482856141c8565b83516142b4818360208801613bc2565b01949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142f5576142f5614103565b500290565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526143396080830184613bee565b9695505050505050565b60006020828403121561435557600080fd5b8151613bbb81613b70565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261439e5761439e614360565b500490565b6000826143b2576143b2614360565b500690565b60006143cc6143c683876141c8565b856141c8565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168352505060140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea2646970667358221220df303c8d76cd9d9147d74a46fef65e21423999f868691d9c64682c984cf0522764736f6c634300080d003368747470733a2f2f73746f726167652e686173686b752e636f6d2f6170692f6b61727269652d726f73732f656767736c792f

Deployed Bytecode

0x6080604052600436106103605760003560e01c80639499ac54116101c6578063d8701554116100f7578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b146109c5578063f3fef3a3146109e5578063fdab3b3f14610a05578063ffc325e314610a2557600080fd5b8063e985e9c514610922578063effdf5a614610978578063f2bcd0221461099857600080fd5b8063e09a470a116100d1578063e09a470a146108a3578063e0d11a47146108b9578063e8315742146108d9578063e8c61831146108ef57600080fd5b8063d870155414610863578063da69c08314610876578063dc9a15351461088957600080fd5b8063b88d4fde11610164578063c97b97301161013e578063c97b9730146107fa578063d0d41fe11461081a578063d547cfb71461083a578063d832d92f1461084f57600080fd5b8063b88d4fde1461079b578063c2b6b58c146107bb578063c87b56dd146107da57600080fd5b8063a0bcfc7f116101a0578063a0bcfc7f1461071b578063a22cb4651461073b578063a645ff5f1461075b578063af42d1061461077b57600080fd5b80639499ac541461046757806395d89b41146106f0578063a035b1fe1461070557600080fd5b806342842e0e116102a05780636dc351361161023e5780637da2d1f4116102185780637da2d1f41461067a57806381b5359a1461068f5780638da5cb5b146106a557806391b7f5ed146106d057600080fd5b80636dc351361461062f57806370a0823114610645578063715018a61461066557600080fd5b8063546104811161027a57806354610481146105ac578063572849c4146105d95780635dd871a3146105ef5780636352211e1461060f57600080fd5b806342842e0e14610559578063429a1bb01461057957806349668b4a1461058c57600080fd5b806318160ddd1161030d57806323b872dd116102e757806323b872dd146104e257806329e7ef2d146105025780633943380c146105175780633ad10ef61461052c57600080fd5b806318160ddd146104675780631e14d44b146104a257806321b8092e146104c257600080fd5b8063081812fc1161033e578063081812fc146103e0578063095ea7b31461042557806311e776fe1461044757600080fd5b806301f569971461036557806301ffc9a71461038e57806306fdde03146103be575b600080fd5b34801561037157600080fd5b5061037b600e5481565b6040519081526020015b60405180910390f35b34801561039a57600080fd5b506103ae6103a9366004613b9e565b610a52565b6040519015158152602001610385565b3480156103ca57600080fd5b506103d3610b37565b6040516103859190613c38565b3480156103ec57600080fd5b506104006103fb366004613c4b565b610bc9565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610385565b34801561043157600080fd5b50610445610440366004613c86565b610c33565b005b34801561045357600080fd5b50610445610462366004613c4b565b610d19565b34801561047357600080fd5b50600254600154037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161037b565b3480156104ae57600080fd5b506104456104bd366004613c4b565b610e0f565b3480156104ce57600080fd5b506104456104dd366004613cb2565b610ef5565b3480156104ee57600080fd5b506104456104fd366004613ccf565b611018565b34801561050e57600080fd5b506103d3611023565b34801561052357600080fd5b506103d36110b1565b34801561053857600080fd5b506012546104009073ffffffffffffffffffffffffffffffffffffffff1681565b34801561056557600080fd5b50610445610574366004613ccf565b6110be565b34801561058557600080fd5b504761037b565b34801561059857600080fd5b506104456105a7366004613d25565b6110d9565b3480156105b857600080fd5b5061037b6105c7366004613cb2565b60176020526000908152604090205481565b3480156105e557600080fd5b5061037b600d5481565b3480156105fb57600080fd5b506103ae61060a366004613c4b565b6111ec565b34801561061b57600080fd5b5061040061062a366004613c4b565b61127a565b34801561063b57600080fd5b5061037b60095481565b34801561065157600080fd5b5061037b610660366004613cb2565b61128c565b34801561067157600080fd5b5061044561130e565b34801561068657600080fd5b5061037b61139b565b34801561069b57600080fd5b5061037b60135481565b3480156106b157600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610400565b3480156106dc57600080fd5b506104456106eb366004613c4b565b6113be565b3480156106fc57600080fd5b506103d36114a4565b34801561071157600080fd5b5061037b60105481565b34801561072757600080fd5b50610445610736366004613d40565b6114b3565b34801561074757600080fd5b50610445610756366004613db2565b6115ac565b34801561076757600080fd5b50610445610776366004613e2c565b611692565b34801561078757600080fd5b50610445610796366004613d40565b6118d1565b3480156107a757600080fd5b506104456107b6366004613f7b565b6119be565b3480156107c757600080fd5b506011546103ae90610100900460ff1681565b3480156107e657600080fd5b506103d36107f5366004613c4b565b611a35565b34801561080657600080fd5b50610445610815366004613fe7565b611b02565b34801561082657600080fd5b50610445610835366004613cb2565b611bf6565b34801561084657600080fd5b506103d3611cd4565b34801561085b57600080fd5b5060016103ae565b610445610871366004614030565b611ce1565b610445610884366004613c4b565b611ef0565b34801561089557600080fd5b506011546103ae9060ff1681565b3480156108af57600080fd5b5061037b60145481565b3480156108c557600080fd5b506104456108d4366004613cb2565b6120f6565b3480156108e557600080fd5b5061037b600f5481565b3480156108fb57600080fd5b506011546104009062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561092e57600080fd5b506103ae61093d366004614077565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561098457600080fd5b506103ae610993366004613c86565b61221e565b3480156109a457600080fd5b506015546104009073ffffffffffffffffffffffffffffffffffffffff1681565b3480156109d157600080fd5b506104456109e0366004613cb2565b612426565b3480156109f157600080fd5b506103ae610a00366004613c86565b612553565b348015610a1157600080fd5b50610445610a20366004613d25565b6127fd565b348015610a3157600080fd5b506016546104009073ffffffffffffffffffffffffffffffffffffffff1681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480610ae557507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610b3157507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606060038054610b46906140b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610b72906140b0565b8015610bbf5780601f10610b9457610100808354040283529160200191610bbf565b820191906000526020600020905b815481529060010190602001808311610ba257829003601f168201915b5050505050905090565b6000610bd48261290c565b610c0a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060009081526007602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610c3e8261127a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ca5576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821614801590610cd25750610cd0813361093d565b155b15610d09576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d1483838361295e565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600f8190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e049060208082526009908201527f6d6178546f6b656e730000000000000000000000000000000000000000000000604082015260600190565b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d96565b600d8190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e049060208082526011908201527f6d61784d696e7450657241646472657373000000000000000000000000000000604082015260600190565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d96565b6015805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e049060208082526011908201527f7769746864726177616c41646472657373000000000000000000000000000000604082015260600190565b610d148383836129df565b600c8054611030906140b0565b80601f016020809104026020016040519081016040528092919081815260200182805461105c906140b0565b80156110a95780601f1061107e576101008083540402835291602001916110a9565b820191906000526020600020905b81548152906001019060200180831161108c57829003601f168201915b505050505081565b600b8054611030906140b0565b610d14838383604051806020016040528060008152506119be565b60005473ffffffffffffffffffffffffffffffffffffffff16331461115a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d96565b60118054821515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9091161790556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e049060208082526008908201527f6973436c6f736564000000000000000000000000000000000000000000000000604082015260600190565b600f546000901561123e57600f54600254600154849190037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016112309190614132565b111561123e57506000919050565b600d541561127257600d5433600090815260176020526040902054611264908490614132565b111561127257506000919050565b506001919050565b600061128582612d17565b5192915050565b600073ffffffffffffffffffffffffffffffffffffffff82166112db576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5073ffffffffffffffffffffffffffffffffffffffff1660009081526006602052604090205467ffffffffffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff16331461138f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d96565b6113996000612ef2565b565b600060135447116113ac5750600090565b6013546113b9904761414a565b905090565b60005473ffffffffffffffffffffffffffffffffffffffff16331461143f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d96565b60108190556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e049060208082526005908201527f7072696365000000000000000000000000000000000000000000000000000000604082015260600190565b606060048054610b46906140b0565b60005473ffffffffffffffffffffffffffffffffffffffff163314611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d96565b611540600a8383613a45565b507f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b4426040516115a09060208082526007908201527f6261736555524900000000000000000000000000000000000000000000000000604082015260600190565b60405180910390a15050565b3373ffffffffffffffffffffffffffffffffffffffff8316036115fb576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d96565b82811461177c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f616d6f756e745f6d69736d6174636800000000000000000000000000000000006044820152606401610d96565b6000805b828110156117c05783838281811061179a5761179a614161565b90506020020135826117ac9190614132565b9150806117b881614190565b915050611780565b50600f54600254600154839190037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016117fa9190614132565b1115611862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f6e6f745f656e6f7567685f746f6b656e730000000000000000000000000000006044820152606401610d96565b506000805b848110156118c9576118b786868381811061188457611884614161565b90506020020160208101906118999190613cb2565b8585848181106118ab576118ab614161565b90506020020135612f67565b806118c181614190565b915050611867565b505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d96565b61195e600b8383613a45565b507f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b4426040516115a09060208082526003908201527f6b65790000000000000000000000000000000000000000000000000000000000604082015260600190565b6119c98484846129df565b73ffffffffffffffffffffffffffffffffffffffff83163b151580156119f857506119f684848484612f83565b155b15611a2f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611a408261290c565b611aa6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f6e6f5f746f6b656e0000000000000000000000000000000000000000000000006044820152606401610d96565b6000600a8054611ab5906140b0565b905011611ad15760405180602001604052806000815250610b31565b600a611adc836130fd565b604051602001611aed929190614298565b60405160208183030381529060405292915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611b83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d96565b8051611b9690600c906020840190613ae7565b507f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b442604051610e049060208082526005908201527f67726f7570000000000000000000000000000000000000000000000000000000604082015260600190565b60125473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f6465765f6f6e6c790000000000000000000000000000000000000000000000006044820152606401610d96565b601280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600a8054611030906140b0565b601154610100900460ff1615611d53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f636c6f73656400000000000000000000000000000000000000000000000000006044820152606401610d96565b611d5c81613232565b611dc2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f696e76616c69645f7369676e61747572650000000000000000000000000000006044820152606401610d96565b611dcb826111ec565b611e31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f6e6f745f656e6f7567685f746f6b656e730000000000000000000000000000006044820152606401610d96565b3482601054611e4091906142bd565b14611ea7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e636f72726563745f66756e647300000000000000000000000000000000006044820152606401610d96565b611ebd82601054611eb891906142bd565b613323565b3360009081526017602052604081208054849290611edc908490614132565b90915550611eec90503383612f67565b5050565b601154610100900460ff1615611f62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f636c6f73656400000000000000000000000000000000000000000000000000006044820152606401610d96565b60115460ff16611fce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f745f616c6c6f7765640000000000000000000000000000000000000000006044820152606401610d96565b611fd7816111ec565b61203d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f6e6f745f656e6f7567685f746f6b656e730000000000000000000000000000006044820152606401610d96565b348160105461204c91906142bd565b146120b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e636f72726563745f66756e647300000000000000000000000000000000006044820152606401610d96565b6120c481601054611eb891906142bd565b33600090815260176020526040812080548392906120e3908490614132565b909155506120f390503382612f67565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314612177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d96565b6011805473ffffffffffffffffffffffffffffffffffffffff831662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff9091161790556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e04906020808252600c908201527f7665726966795369676e65720000000000000000000000000000000000000000604082015260600190565b60125460009073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146122b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f6465765f6f6e6c790000000000000000000000000000000000000000000000006044820152606401610d96565b601354821115612324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e73756666696369656e745f66756e647300000000000000000000000000006044820152606401610d96565b8160136000828254612336919061414a565b92505081905550816014600082825461234f9190614132565b909155505060405173ffffffffffffffffffffffffffffffffffffffff84169083156108fc029084906000818181858888f19350505050158015612397573d6000803e3d6000fd5b506040805160608082526003908201527f6465760000000000000000000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff851660208201529081018390527fd0cfd60d55acd3226ac0fafab52ad35f0ab2fb6eedb946f7d8405108d71df46d9060a0015b60405180910390a150600192915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146124a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d96565b73ffffffffffffffffffffffffffffffffffffffff811661254a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d96565b6120f381612ef2565b60155460009073ffffffffffffffffffffffffffffffffffffffff166125d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6e6f5f7769746864726177616c730000000000000000000000000000000000006044820152606401610d96565b60155473ffffffffffffffffffffffffffffffffffffffff163314612656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f745f616c6c6f7765640000000000000000000000000000000000000000006044820152606401610d96565b600061266061139b565b116126c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e73756666696369656e745f66756e647300000000000000000000000000006044820152606401610d96565b6126cf61139b565b821115612738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e73756666696369656e745f66756e647300000000000000000000000000006044820152606401610d96565b60405173ffffffffffffffffffffffffffffffffffffffff84169083156108fc029084906000818181858888f1935050505015801561277b573d6000803e3d6000fd5b506040805160608082526005908201527f6f776e6572000000000000000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff851660208201529081018390527fd0cfd60d55acd3226ac0fafab52ad35f0ab2fb6eedb946f7d8405108d71df46d9060a001612415565b60005473ffffffffffffffffffffffffffffffffffffffff16331461287e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d96565b601180548215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091161790556040517f38b9241ba197630c4329259c93d6a140b00cbe738808b738f460c5571d02b44290610e049060208082526008908201527f69735075626c6963000000000000000000000000000000000000000000000000604082015260600190565b600081600111158015612920575060015482105b8015610b315750506000908152600560205260409020547c0100000000000000000000000000000000000000000000000000000000900460ff161590565b60008281526007602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006129ea82612d17565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612a55576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff86161480612a805750612a80853361093d565b80612aa8575033612a9084610bc9565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612ae1576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416612b2e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b3a6000848761295e565b73ffffffffffffffffffffffffffffffffffffffff858116600090815260066020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000080821667ffffffffffffffff9283167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080547fffffffff00000000000000000000000000000000000000000000000000000000169094177401000000000000000000000000000000000000000042909216919091021783558701808452922080549193909116612cb1576001548214612cb1578054602086015167ffffffffffffffff1674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8a16171781555b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60408051606081018252600080825260208201819052918101919091528180600111158015612d47575060015481105b15612ec0576000818152600560209081526040918290208251606081018452905473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000810467ffffffffffffffff16928201929092527c010000000000000000000000000000000000000000000000000000000090910460ff16151591810182905290612ebe57805173ffffffffffffffffffffffffffffffffffffffff1615612dff579392505050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016000818152600560209081526040918290208251606081018452905473ffffffffffffffffffffffffffffffffffffffff811680835274010000000000000000000000000000000000000000820467ffffffffffffffff16938301939093527c0100000000000000000000000000000000000000000000000000000000900460ff1615159281019290925215612eb9579392505050565b612dff565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611eec8282604051806020016040528060008152506000613347565b6040517f150b7a0200000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290612fde9033908990889088906004016142fa565b6020604051808303816000875af1925050508015613037575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261303491810190614343565b60015b6130ae573d808015613065576040519150601f19603f3d011682016040523d82523d6000602084013e61306a565b606091505b5080516000036130a6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490505b949350505050565b60608160000361314057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561316a578061315481614190565b91506131639050600a8361438f565b9150613144565b60008167ffffffffffffffff81111561318557613185613e98565b6040519080825280601f01601f1916602001820160405280156131af576020820181803683370190505b5090505b84156130f5576131c460018361414a565b91506131d1600a866143a3565b6131dc906030614132565b60f81b8183815181106131f1576131f1614161565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061322b600a8661438f565b94506131b3565b600080600b600c3360405160200161324c939291906143b7565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052805160209091012060115490915062010000900473ffffffffffffffffffffffffffffffffffffffff16613305846132ff846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b906135f5565b73ffffffffffffffffffffffffffffffffffffffff16149392505050565b61332e600a8261438f565b6013600082825461333f9190614132565b909155505050565b60015473ffffffffffffffffffffffffffffffffffffffff8516613397576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000036133d1576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516600081815260066020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000811667ffffffffffffffff8083168c018116918217680100000000000000007fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090941690921783900481168c01811690920217909155858452600590925290912080547fffffffff0000000000000000000000000000000000000000000000000000000016909217740100000000000000000000000000000000000000004290921691909102179055808085018380156134ec575073ffffffffffffffffffffffffffffffffffffffff87163b15155b1561359a575b604051829073ffffffffffffffffffffffffffffffffffffffff8916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461354a6000888480600101955088612f83565b613580576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036134f257826001541461359557600080fd5b6135ec565b5b60405160018301929073ffffffffffffffffffffffffffffffffffffffff8916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480820361359b575b50600155612d10565b60008060006136048585613619565b9150915061361181613687565b509392505050565b600080825160410361364f5760208301516040840151606085015160001a613643878285856138db565b94509450505050613680565b8251604003613678576020830151604084015161366d8683836139f3565b935093505050613680565b506000905060025b9250929050565b600081600481111561369b5761369b614401565b036136a35750565b60018160048111156136b7576136b7614401565b0361371e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610d96565b600281600481111561373257613732614401565b03613799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610d96565b60038160048111156137ad576137ad614401565b0361383a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610d96565b600481600481111561384e5761384e614401565b036120f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610d96565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561391257506000905060036139ea565b8460ff16601b1415801561392a57508460ff16601c14155b1561393b57506000905060046139ea565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561398f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166139e3576000600192509250506139ea565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831681613a2960ff86901c601b614132565b9050613a37878288856138db565b935093505050935093915050565b828054613a51906140b0565b90600052602060002090601f016020900481019282613a735760008555613ad7565b82601f10613aaa578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555613ad7565b82800160010185558215613ad7579182015b82811115613ad7578235825591602001919060010190613abc565b50613ae3929150613b5b565b5090565b828054613af3906140b0565b90600052602060002090601f016020900481019282613b155760008555613ad7565b82601f10613b2e57805160ff1916838001178555613ad7565b82800160010185558215613ad7579182015b82811115613ad7578251825591602001919060010190613b40565b5b80821115613ae35760008155600101613b5c565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146120f357600080fd5b600060208284031215613bb057600080fd5b8135613bbb81613b70565b9392505050565b60005b83811015613bdd578181015183820152602001613bc5565b83811115611a2f5750506000910152565b60008151808452613c06816020860160208601613bc2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613bbb6020830184613bee565b600060208284031215613c5d57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146120f357600080fd5b60008060408385031215613c9957600080fd5b8235613ca481613c64565b946020939093013593505050565b600060208284031215613cc457600080fd5b8135613bbb81613c64565b600080600060608486031215613ce457600080fd5b8335613cef81613c64565b92506020840135613cff81613c64565b929592945050506040919091013590565b80358015158114613d2057600080fd5b919050565b600060208284031215613d3757600080fd5b613bbb82613d10565b60008060208385031215613d5357600080fd5b823567ffffffffffffffff80821115613d6b57600080fd5b818501915085601f830112613d7f57600080fd5b813581811115613d8e57600080fd5b866020828501011115613da057600080fd5b60209290920196919550909350505050565b60008060408385031215613dc557600080fd5b8235613dd081613c64565b9150613dde60208401613d10565b90509250929050565b60008083601f840112613df957600080fd5b50813567ffffffffffffffff811115613e1157600080fd5b6020830191508360208260051b850101111561368057600080fd5b60008060008060408587031215613e4257600080fd5b843567ffffffffffffffff80821115613e5a57600080fd5b613e6688838901613de7565b90965094506020870135915080821115613e7f57600080fd5b50613e8c87828801613de7565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115613ee257613ee2613e98565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715613f2857613f28613e98565b81604052809350858152868686011115613f4157600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112613f6c57600080fd5b613bbb83833560208501613ec7565b60008060008060808587031215613f9157600080fd5b8435613f9c81613c64565b93506020850135613fac81613c64565b925060408501359150606085013567ffffffffffffffff811115613fcf57600080fd5b613fdb87828801613f5b565b91505092959194509250565b600060208284031215613ff957600080fd5b813567ffffffffffffffff81111561401057600080fd5b8201601f8101841361402157600080fd5b6130f584823560208401613ec7565b6000806040838503121561404357600080fd5b82359150602083013567ffffffffffffffff81111561406157600080fd5b61406d85828601613f5b565b9150509250929050565b6000806040838503121561408a57600080fd5b823561409581613c64565b915060208301356140a581613c64565b809150509250929050565b600181811c908216806140c457607f821691505b6020821081036140fd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561414557614145614103565b500190565b60008282101561415c5761415c614103565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036141c1576141c1614103565b5060010190565b8054600090600181811c90808316806141e257607f831692505b6020808410820361421c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b818015614230576001811461425f5761428c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952848901965061428c565b60008881526020902060005b868110156142845781548b82015290850190830161426b565b505084890196505b50505050505092915050565b60006142a482856141c8565b83516142b4818360208801613bc2565b01949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142f5576142f5614103565b500290565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526143396080830184613bee565b9695505050505050565b60006020828403121561435557600080fd5b8151613bbb81613b70565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261439e5761439e614360565b500490565b6000826143b2576143b2614360565b500690565b60006143cc6143c683876141c8565b856141c8565b60609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168352505060140192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea2646970667358221220df303c8d76cd9d9147d74a46fef65e21423999f868691d9c64682c984cf0522764736f6c634300080d0033

Deployed Bytecode Sourcemap

72993:8449:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73414:36;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;73414:36:0;;;;;;;;54510:305;;;;;;;;;;-1:-1:-1;54510:305:0;;;;;:::i;:::-;;:::i;:::-;;;793:14:1;;786:22;768:41;;756:2;741:18;54510:305:0;628:187:1;57623:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;59126:204::-;;;;;;;;;;-1:-1:-1;59126:204:0;;;;;:::i;:::-;;:::i;:::-;;;1991:42:1;1979:55;;;1961:74;;1949:2;1934:18;59126:204:0;1815:226:1;58689:371:0;;;;;;;;;;-1:-1:-1;58689:371:0;;;;;:::i;:::-;;:::i;:::-;;78363:140;;;;;;;;;;-1:-1:-1;78363:140:0;;;;;:::i;:::-;;:::i;53759:303::-;;;;;;;;;;-1:-1:-1;54013:12:0;;77566:4;53997:13;:28;:46;;53759:303;;78562:164;;;;;;;;;;-1:-1:-1;78562:164:0;;;;;:::i;:::-;;:::i;80279:166::-;;;;;;;;;;-1:-1:-1;80279:166:0;;;;;:::i;:::-;;:::i;59991:170::-;;;;;;;;;;-1:-1:-1;59991:170:0;;;;;:::i;:::-;;:::i;73340:28::-;;;;;;;;;;;;;:::i;73305:::-;;;;;;;;;;;;;:::i;73682:25::-;;;;;;;;;;-1:-1:-1;73682:25:0;;;;;;;;60232:185;;;;;;;;;;-1:-1:-1;60232:185:0;;;;;:::i;:::-;;:::i;79840:101::-;;;;;;;;;;-1:-1:-1;79912:21:0;79840:101;;78009:134;;;;;;;;;;-1:-1:-1;78009:134:0;;;;;:::i;:::-;;:::i;73870:47::-;;;;;;;;;;-1:-1:-1;73870:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;73375:32;;;;;;;;;;;;;;;;76994:410;;;;;;;;;;-1:-1:-1;76994:410:0;;;;;:::i;:::-;;:::i;57431:125::-;;;;;;;;;;-1:-1:-1;57431:125:0;;;;;:::i;:::-;;:::i;73183:27::-;;;;;;;;;;;;;;;;54879:206;;;;;;;;;;-1:-1:-1;54879:206:0;;;;;:::i;:::-;;:::i;37277:103::-;;;;;;;;;;;;;:::i;79995:220::-;;;;;;;;;;;;;:::i;73714:33::-;;;;;;;;;;;;;;;;36626:87;;;;;;;;;;-1:-1:-1;36672:7:0;36699:6;;;36626:87;;78190:126;;;;;;;;;;-1:-1:-1;78190:126:0;;;;;:::i;:::-;;:::i;57792:104::-;;;;;;;;;;;;;:::i;73495:40::-;;;;;;;;;;;;;;;;78979:159;;;;;;;;;;-1:-1:-1;78979:159:0;;;;;:::i;:::-;;:::i;59402:287::-;;;;;;;;;;-1:-1:-1;59402:287:0;;;;;:::i;:::-;;:::i;75259:526::-;;;;;;;;;;-1:-1:-1;75259:526:0;;;;;:::i;:::-;;:::i;77648:124::-;;;;;;;;;;-1:-1:-1;77648:124:0;;;;;:::i;:::-;;:::i;60488:369::-;;;;;;;;;;-1:-1:-1;60488:369:0;;;;;:::i;:::-;;:::i;73576:20::-;;;;;;;;;;-1:-1:-1;73576:20:0;;;;;;;;;;;74809:263;;;;;;;;;;-1:-1:-1;74809:263:0;;;;;:::i;:::-;;:::i;78800:132::-;;;;;;;;;;-1:-1:-1;78800:132:0;;;;;:::i;:::-;;:::i;81328:111::-;;;;;;;;;;-1:-1:-1;81328:111:0;;;;;:::i;:::-;;:::i;73217:81::-;;;;;;;;;;;;;:::i;77501:77::-;;;;;;;;;;-1:-1:-1;77566:4:0;77501:77;;76462:452;;;;;;:::i;:::-;;:::i;76043:394::-;;;;;;:::i;:::-;;:::i;73542:27::-;;;;;;;;;;-1:-1:-1;73542:27:0;;;;;;;;73754:32;;;;;;;;;;;;;;;;79205:161;;;;;;;;;;-1:-1:-1;79205:161:0;;;;;:::i;:::-;;:::i;73457:31::-;;;;;;;;;;;;;;;;73603:72;;;;;;;;;;-1:-1:-1;73603:72:0;;;;;;;;;;;59760:164;;;;;;;;;;-1:-1:-1;59760:164:0;;;;;:::i;:::-;59881:25;;;;59857:4;59881:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;59760:164;80914:357;;;;;;;;;;-1:-1:-1;80914:357:0;;;;;:::i;:::-;;:::i;73793:32::-;;;;;;;;;;-1:-1:-1;73793:32:0;;;;;;;;37535:201;;;;;;;;;;-1:-1:-1;37535:201:0;;;;;:::i;:::-;;:::i;80509:341::-;;;;;;;;;;-1:-1:-1;80509:341:0;;;;;:::i;:::-;;:::i;77826:134::-;;;;;;;;;;-1:-1:-1;77826:134:0;;;;;:::i;:::-;;:::i;73832:31::-;;;;;;;;;;-1:-1:-1;73832:31:0;;;;;;;;54510:305;54612:4;54649:40;;;54664:25;54649:40;;:105;;-1:-1:-1;54706:48:0;;;54721:33;54706:48;54649:105;:158;;;-1:-1:-1;20478:25:0;20463:40;;;;54771:36;54629:178;54510:305;-1:-1:-1;;54510:305:0:o;57623:100::-;57677:13;57710:5;57703:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57623:100;:::o;59126:204::-;59194:7;59219:16;59227:7;59219;:16::i;:::-;59214:64;;59244:34;;;;;;;;;;;;;;59214:64;-1:-1:-1;59298:24:0;;;;:15;:24;;;;;;;;;59126:204::o;58689:371::-;58762:13;58778:24;58794:7;58778:15;:24::i;:::-;58762:40;;58823:5;58817:11;;:2;:11;;;58813:48;;58837:24;;;;;;;;;;;;;;58813:48;17133:10;58878:21;;;;;;;:63;;-1:-1:-1;58904:37:0;58921:5;17133:10;59760:164;:::i;58904:37::-;58903:38;58878:63;58874:138;;;58965:35;;;;;;;;;;;;;;58874:138;59024:28;59033:2;59037:7;59046:5;59024:8;:28::i;:::-;58751:309;58689:371;;:::o;78363:140::-;36672:7;36699:6;36846:23;36699:6;17133:10;36846:23;36838:68;;;;;;;9647:2:1;36838:68:0;;;9629:21:1;;;9666:18;;;9659:30;9725:34;9705:18;;;9698:62;9777:18;;36838:68:0;;;;;;;;;78432:9:::1;:19:::0;;;78467:28:::1;::::0;::::1;::::0;::::1;::::0;10008:2:1;9990:21;;;10047:1;10027:18;;;10020:29;10085:11;10080:2;10065:18;;10058:39;10129:2;10114:18;;9806:332;78467:28:0::1;;;;;;;;78363:140:::0;:::o;78562:164::-;36672:7;36699:6;36846:23;36699:6;17133:10;36846:23;36838:68;;;;;;;9647:2:1;36838:68:0;;;9629:21:1;;;9666:18;;;9659:30;9725:34;9705:18;;;9698:62;9777:18;;36838:68:0;9445:356:1;36838:68:0;78639:17:::1;:27:::0;;;78682:36:::1;::::0;::::1;::::0;::::1;::::0;10345:2:1;10327:21;;;10384:2;10364:18;;;10357:30;10423:19;10418:2;10403:18;;10396:47;10475:2;10460:18;;10143:341;80279:166:0;36672:7;36699:6;36846:23;36699:6;17133:10;36846:23;36838:68;;;;;;;9647:2:1;36838:68:0;;;9629:21:1;;;9666:18;;;9659:30;9725:34;9705:18;;;9698:62;9777:18;;36838:68:0;9445:356:1;36838:68:0;80357:17:::1;:28:::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;80401:36:::1;::::0;::::1;::::0;::::1;::::0;10691:2:1;10673:21;;;10730:2;10710:18;;;10703:30;10769:19;10764:2;10749:18;;10742:47;10821:2;10806:18;;10489:341;59991:170:0;60125:28;60135:4;60141:2;60145:7;60125:9;:28::i;73340:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;73305:::-;;;;;;;:::i;60232:185::-;60370:39;60387:4;60393:2;60397:7;60370:39;;;;;;;;;;;;:16;:39::i;78009:134::-;36672:7;36699:6;36846:23;36699:6;17133:10;36846:23;36838:68;;;;;;;9647:2:1;36838:68:0;;;9629:21:1;;;9666:18;;;9659:30;9725:34;9705:18;;;9698:62;9777:18;;36838:68:0;9445:356:1;36838:68:0;78074:8:::1;:18:::0;;;::::1;;;;::::0;;;::::1;;::::0;;78108:27:::1;::::0;::::1;::::0;::::1;::::0;11037:2:1;11019:21;;;11076:1;11056:18;;;11049:29;11114:10;11109:2;11094:18;;11087:38;11157:2;11142:18;;10835:331;76994:410:0;77070:9;;77049:4;;77070:13;77066:133;;77130:9;;54013:12;;77566:4;53997:13;77120:7;;53997:28;;:46;;77104:23;;;;:::i;:::-;:35;77100:88;;;-1:-1:-1;77167:5:0;;76994:410;-1:-1:-1;76994:410:0:o;77100:88::-;77215:17;;:21;77211:162;;77296:17;;17133:10;77257:26;;;;:12;:26;;;;;;:36;;77286:7;;77257:36;:::i;:::-;:56;77253:109;;;-1:-1:-1;77341:5:0;;76994:410;-1:-1:-1;76994:410:0:o;77253:109::-;-1:-1:-1;77392:4:0;;76994:410;-1:-1:-1;76994:410:0:o;57431:125::-;57495:7;57522:21;57535:7;57522:12;:21::i;:::-;:26;;57431:125;-1:-1:-1;;57431:125:0:o;54879:206::-;54943:7;54967:19;;;54963:60;;54995:28;;;;;;;;;;;;;;54963:60;-1:-1:-1;55049:19:0;;;;;;:12;:19;;;;;:27;;;;54879:206::o;37277:103::-;36672:7;36699:6;36846:23;36699:6;17133:10;36846:23;36838:68;;;;;;;9647:2:1;36838:68:0;;;9629:21:1;;;9666:18;;;9659:30;9725:34;9705:18;;;9698:62;9777:18;;36838:68:0;9445:356:1;36838:68:0;37342:30:::1;37369:1;37342:18;:30::i;:::-;37277:103::o:0;79995:220::-;80044:7;80093:18;;80068:21;:43;80064:84;;-1:-1:-1;80135:1:0;;79995:220::o;80064:84::-;80189:18;;80165:42;;:21;:42;:::i;:::-;80158:49;;79995:220;:::o;78190:126::-;36672:7;36699:6;36846:23;36699:6;17133:10;36846:23;36838:68;;;;;;;9647:2:1;36838:68:0;;;9629:21:1;;;9666:18;;;9659:30;9725:34;9705:18;;;9698:62;9777:18;;36838:68:0;9445:356:1;36838:68:0;78254:5:::1;:14:::0;;;78284:24:::1;::::0;::::1;::::0;::::1;::::0;11825:2:1;11807:21;;;11864:1;11844:18;;;11837:29;11902:7;11897:2;11882:18;;11875:35;11942:2;11927:18;;11623:328;57792:104:0;57848:13;57881:7;57874:14;;;;;:::i;78979:159::-;36672:7;36699:6;36846:23;36699:6;17133:10;36846:23;36838:68;;;;;;;9647:2:1;36838:68:0;;;9629:21:1;;;9666:18;;;9659:30;9725:34;9705:18;;;9698:62;9777:18;;36838:68:0;9445:356:1;36838:68:0;79060:28:::1;:12;79075:13:::0;;79060:28:::1;:::i;:::-;;79104:26;;;;;12158:2:1::0;12140:21;;;12197:1;12177:18;;;12170:29;12235:9;12230:2;12215:18;;12208:37;12277:2;12262:18;;11956:330;79104:26:0::1;;;;;;;;78979:159:::0;;:::o;59402:287::-;17133:10;59501:24;;;;59497:54;;59534:17;;;;;;;;;;;;;;59497:54;17133:10;59564:32;;;;:18;:32;;;;;;;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;59633:48;;768:41:1;;;59564:42:0;;17133:10;59633:48;;741:18:1;59633:48:0;;;;;;;59402:287;;:::o;75259:526::-;36672:7;36699:6;36846:23;36699:6;17133:10;36846:23;36838:68;;;;;;;9647:2:1;36838:68:0;;;9629:21:1;;;9666:18;;;9659:30;9725:34;9705:18;;;9698:62;9777:18;;36838:68:0;9445:356:1;36838:68:0;75371:36;;::::1;75363:64;;;::::0;::::1;::::0;;12493:2:1;75363:64:0::1;::::0;::::1;12475:21:1::0;12532:2;12512:18;;;12505:30;12571:17;12551:18;;;12544:45;12606:18;;75363:64:0::1;12291:339:1::0;75363:64:0::1;75440:13;::::0;75464:93:::1;75484:19:::0;;::::1;75464:93;;;75534:8;;75543:1;75534:11;;;;;;;:::i;:::-;;;;;;;75525:20;;;;;:::i;:::-;::::0;-1:-1:-1;75505:3:0;::::1;::::0;::::1;:::i;:::-;;;;75464:93;;;-1:-1:-1::0;75602:9:0::1;::::0;54013:12;;77566:4;53997:13;75593:5;;53997:28;;:46;;75577:21:::1;;;;:::i;:::-;:34;;75569:64;;;::::0;::::1;::::0;;13226:2:1;75569:64:0::1;::::0;::::1;13208:21:1::0;13265:2;13245:18;;;13238:30;13304:19;13284:18;;;13277:47;13341:18;;75569:64:0::1;13024:341:1::0;75569:64:0::1;-1:-1:-1::0;75646:12:0::1;::::0;75671:107:::1;75691:21:::0;;::::1;75671:107;;;75734:32;75739:10;;75750:1;75739:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;75754:8;;75763:1;75754:11;;;;;;;:::i;:::-;;;;;;;75734:4;:32::i;:::-;75714:3:::0;::::1;::::0;::::1;:::i;:::-;;;;75671:107;;;;75352:433;75259:526:::0;;;;:::o;77648:124::-;36672:7;36699:6;36846:23;36699:6;17133:10;36846:23;36838:68;;;;;;;9647:2:1;36838:68:0;;;9629:21:1;;;9666:18;;;9659:30;9725:34;9705:18;;;9698:62;9777:18;;36838:68:0;9445:356:1;36838:68:0;77716:10:::1;:3;77722:4:::0;;77716:10:::1;:::i;:::-;;77742:22;;;;;13572:2:1::0;13554:21;;;13611:1;13591:18;;;13584:29;13649:5;13644:2;13629:18;;13622:33;13687:2;13672:18;;13370:326;60488:369:0;60655:28;60665:4;60671:2;60675:7;60655:9;:28::i;:::-;60698:13;;;9385:19;:23;;60698:76;;;;;60718:56;60749:4;60755:2;60759:7;60768:5;60718:30;:56::i;:::-;60717:57;60698:76;60694:156;;;60798:40;;;;;;;;;;;;;;60694:156;60488:369;;;;:::o;74809:263::-;74883:13;74917:17;74925:8;74917:7;:17::i;:::-;74909:38;;;;;;;13903:2:1;74909:38:0;;;13885:21:1;13942:1;13922:18;;;13915:29;13980:10;13960:18;;;13953:38;14008:18;;74909:38:0;13701:331:1;74909:38:0;74996:1;74973:12;74967:26;;;;;:::i;:::-;;;:30;:97;;;;;;;;;;;;;;;;;75024:12;75038:19;:8;:17;:19::i;:::-;75007:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74960:104;74809:263;-1:-1:-1;;74809:263:0:o;78800:132::-;36672:7;36699:6;36846:23;36699:6;17133:10;36846:23;36838:68;;;;;;;9647:2:1;36838:68:0;;;9629:21:1;;;9666:18;;;9659:30;9725:34;9705:18;;;9698:62;9777:18;;36838:68:0;9445:356:1;36838:68:0;78870:14;;::::1;::::0;:5:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;:::-;;78900:24;;;;;15839:2:1::0;15821:21;;;15878:1;15858:18;;;15851:29;15916:7;15911:2;15896:18;;15889:35;15956:2;15941:18;;15637:328;81328:111:0;74098:10;;;;17133;74082:26;;;74074:47;;;;;;;16172:2:1;74074:47:0;;;16154:21:1;16211:1;16191:18;;;16184:29;16249:10;16229:18;;;16222:38;16277:18;;74074:47:0;15970:331:1;74074:47:0;81407:10:::1;:24:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;81328:111::o;73217:81::-;;;;;;;:::i;76462:452::-;76555:8;;;;;;;76554:9;76546:28;;;;;;;16508:2:1;76546:28:0;;;16490:21:1;16547:1;16527:18;;;16520:29;16585:8;16565:18;;;16558:36;16611:18;;76546:28:0;16306:329:1;76546:28:0;76593:27;76609:10;76593:15;:27::i;:::-;76585:57;;;;;;;16842:2:1;76585:57:0;;;16824:21:1;16881:2;16861:18;;;16854:30;16920:19;16900:18;;;16893:47;16957:18;;76585:57:0;16640:341:1;76585:57:0;76661:16;76669:7;76661;:16::i;:::-;76653:46;;;;;;;13226:2:1;76653:46:0;;;13208:21:1;13265:2;13245:18;;;13238:30;13304:19;13284:18;;;13277:47;13341:18;;76653:46:0;13024:341:1;76653:46:0;76737:9;76726:7;76718:5;;:15;;;;:::i;:::-;:28;76710:56;;;;;;;17421:2:1;76710:56:0;;;17403:21:1;17460:2;17440:18;;;17433:30;17499:17;17479:18;;;17472:45;17534:18;;76710:56:0;17219:339:1;76710:56:0;76787:29;76808:7;76800:5;;:15;;;;:::i;:::-;76787:12;:29::i;:::-;17133:10;76829:26;;;;:12;:26;;;;;:37;;76859:7;;76829:26;:37;;76859:7;;76829:37;:::i;:::-;;;;-1:-1:-1;76879:27:0;;-1:-1:-1;17133:10:0;76898:7;76879:4;:27::i;:::-;76462:452;;:::o;76043:394::-;76111:8;;;;;;;76110:9;76102:28;;;;;;;16508:2:1;76102:28:0;;;16490:21:1;16547:1;16527:18;;;16520:29;16585:8;16565:18;;;16558:36;16611:18;;76102:28:0;16306:329:1;76102:28:0;76149:8;;;;76141:32;;;;;;;17765:2:1;76141:32:0;;;17747:21:1;17804:2;17784:18;;;17777:30;17843:13;17823:18;;;17816:41;17874:18;;76141:32:0;17563:335:1;76141:32:0;76192:16;76200:7;76192;:16::i;:::-;76184:46;;;;;;;13226:2:1;76184:46:0;;;13208:21:1;13265:2;13245:18;;;13238:30;13304:19;13284:18;;;13277:47;13341:18;;76184:46:0;13024:341:1;76184:46:0;76268:9;76257:7;76249:5;;:15;;;;:::i;:::-;:28;76241:56;;;;;;;17421:2:1;76241:56:0;;;17403:21:1;17460:2;17440:18;;;17433:30;17499:17;17479:18;;;17472:45;17534:18;;76241:56:0;17219:339:1;76241:56:0;76310:29;76331:7;76323:5;;:15;;;;:::i;76310:29::-;17133:10;76352:26;;;;:12;:26;;;;;:37;;76382:7;;76352:26;:37;;76382:7;;76352:37;:::i;:::-;;;;-1:-1:-1;76402:27:0;;-1:-1:-1;17133:10:0;76421:7;76402:4;:27::i;:::-;76043:394;:::o;79205:161::-;36672:7;36699:6;36846:23;36699:6;17133:10;36846:23;36838:68;;;;;;;9647:2:1;36838:68:0;;;9629:21:1;;;9666:18;;;9659:30;9725:34;9705:18;;;9698:62;9777:18;;36838:68:0;9445:356:1;36838:68:0;79283:12:::1;:28:::0;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;;::::0;;79327:31:::1;::::0;::::1;::::0;::::1;::::0;18105:2:1;18087:21;;;18144:2;18124:18;;;18117:30;18183:14;18178:2;18163:18;;18156:42;18230:2;18215:18;;17903:336;80914:357:0;74098:10;;81006:4;;74098:10;;17133;74082:26;;;74074:47;;;;;;;16172:2:1;74074:47:0;;;16154:21:1;16211:1;16191:18;;;16184:29;16249:10;16229:18;;;16222:38;16277:18;;74074:47:0;15970:331:1;74074:47:0;81042:18:::1;;81031:7;:29;;81023:60;;;::::0;::::1;::::0;;18446:2:1;81023:60:0::1;::::0;::::1;18428:21:1::0;18485:2;18465:18;;;18458:30;18524:20;18504:18;;;18497:48;18562:18;;81023:60:0::1;18244:342:1::0;81023:60:0::1;81116:7;81094:18;;:29;;;;;;;:::i;:::-;;;;;;;;81155:7;81134:17;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;81173:21:0::1;::::0;:12:::1;::::0;::::1;::::0;:21;::::1;;;::::0;81186:7;;81173:21:::1;::::0;;;81186:7;81173:12;:21;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;81210:31:0::1;::::0;;18857:2:1;18839:21;;;18896:1;18876:18;;;18869:29;18935:5;18929:3;18914:19;;18907:34;19027:42;19015:55;;19008:4;18993:20;;18986:85;19087:18;;;19080:34;;;81210:31:0::1;::::0;18973:3:1;18958:19;81210:31:0::1;;;;;;;;-1:-1:-1::0;81259:4:0::1;80914:357:::0;;;;:::o;37535:201::-;36672:7;36699:6;36846:23;36699:6;17133:10;36846:23;36838:68;;;;;;;9647:2:1;36838:68:0;;;9629:21:1;;;9666:18;;;9659:30;9725:34;9705:18;;;9698:62;9777:18;;36838:68:0;9445:356:1;36838:68:0;37624:22:::1;::::0;::::1;37616:73;;;::::0;::::1;::::0;;19327:2:1;37616:73:0::1;::::0;::::1;19309:21:1::0;19366:2;19346:18;;;19339:30;19405:34;19385:18;;;19378:62;19476:8;19456:18;;;19449:36;19502:19;;37616:73:0::1;19125:402:1::0;37616:73:0::1;37700:28;37719:8;37700:18;:28::i;80509:341::-:0;74194:17;;80598:4;;74194:31;:17;74186:58;;;;;;;19734:2:1;74186:58:0;;;19716:21:1;19773:2;19753:18;;;19746:30;19812:16;19792:18;;;19785:44;19846:18;;74186:58:0;19532:338:1;74186:58:0;74263:17;;:33;:17;17133:10;74263:33;74255:57;;;;;;;17765:2:1;74255:57:0;;;17747:21:1;17804:2;17784:18;;;17777:30;17843:13;17823:18;;;17816:41;17874:18;;74255:57:0;17563:335:1;74255:57:0;80644:1:::1;80623:18;:16;:18::i;:::-;:22;80615:53;;;::::0;::::1;::::0;;18446:2:1;80615:53:0::1;::::0;::::1;18428:21:1::0;18485:2;18465:18;;;18458:30;18524:20;18504:18;;;18497:48;18562:18;;80615:53:0::1;18244:342:1::0;80615:53:0::1;80698:18;:16;:18::i;:::-;80687:7;:29;;80679:60;;;::::0;::::1;::::0;;18446:2:1;80679:60:0::1;::::0;::::1;18428:21:1::0;18485:2;18465:18;;;18458:30;18524:20;18504:18;;;18497:48;18562:18;;80679:60:0::1;18244:342:1::0;80679:60:0::1;80750:21;::::0;:12:::1;::::0;::::1;::::0;:21;::::1;;;::::0;80763:7;;80750:21:::1;::::0;;;80763:7;80750:12;:21;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;80787:33:0::1;::::0;;20141:2:1;20123:21;;;20180:1;20160:18;;;20153:29;20219:7;20213:3;20198:19;;20191:36;20313:42;20301:55;;20294:4;20279:20;;20272:85;20373:18;;;20366:34;;;80787:33:0::1;::::0;20259:3:1;20244:19;80787:33:0::1;19875:531:1::0;77826:134:0;36672:7;36699:6;36846:23;36699:6;17133:10;36846:23;36838:68;;;;;;;9647:2:1;36838:68:0;;;9629:21:1;;;9666:18;;;9659:30;9725:34;9705:18;;;9698:62;9777:18;;36838:68:0;9445:356:1;36838:68:0;77891:8:::1;:18:::0;;;::::1;;::::0;;;::::1;;::::0;;77925:27:::1;::::0;::::1;::::0;::::1;::::0;20613:2:1;20595:21;;;20652:1;20632:18;;;20625:29;20690:10;20685:2;20670:18;;20663:38;20733:2;20718:18;;20411:331;61112:174:0;61169:4;61212:7;77566:4;61193:26;;:53;;;;;61233:13;;61223:7;:23;61193:53;:85;;;;-1:-1:-1;;61251:20:0;;;;:11;:20;;;;;:27;;;;;;61250:28;;61112:174::o;69269:196::-;69384:24;;;;:15;:24;;;;;;:29;;;;;;;;;;;;;;69429:28;;69384:24;;69429:28;;;;;;;69269:196;;;:::o;64212:2130::-;64327:35;64365:21;64378:7;64365:12;:21::i;:::-;64327:59;;64425:4;64403:26;;:13;:18;;;:26;;;64399:67;;64438:28;;;;;;;;;;;;;;64399:67;64479:22;17133:10;64505:20;;;;;:73;;-1:-1:-1;64542:36:0;64559:4;17133:10;59760:164;:::i;64542:36::-;64505:126;;;-1:-1:-1;17133:10:0;64595:20;64607:7;64595:11;:20::i;:::-;:36;;;64505:126;64479:153;;64650:17;64645:66;;64676:35;;;;;;;;;;;;;;64645:66;64726:16;;;64722:52;;64751:23;;;;;;;;;;;;;;64722:52;64895:35;64912:1;64916:7;64925:4;64895:8;:35::i;:::-;65226:18;;;;;;;;:12;:18;;;;;;;;:31;;;;;;;;;;;;;;;;;;65272:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;65272:29:0;;;;;;;;;;;65352:20;;;:11;:20;;;;;;65387:18;;65420:49;;;;;;65453:15;65420:49;;;;;;;;;;65743:11;;65803:24;;;;;65846:13;;65352:20;;65803:24;;65846:13;65842:384;;66056:13;;66041:11;:28;66037:174;;66094:20;;66163:28;;;;66137:54;;;;;;;;66094:20;;;66137:54;;;;66037:174;65201:1036;;;66273:7;66269:2;66254:27;;66263:4;66254:27;;;;;;;;;;;;66292:42;64316:2026;;64212:2130;;;:::o;56260:1109::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;56371:7:0;;77566:4;56420:23;;:47;;;;;56454:13;;56447:4;:20;56420:47;56416:886;;;56488:31;56522:17;;;:11;:17;;;;;;;;;56488:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56558:729;;56608:14;;:28;;;56604:101;;56672:9;56260:1109;-1:-1:-1;;;56260:1109:0:o;56604:101::-;-1:-1:-1;57047:6:0;;57092:17;;;;:11;:17;;;;;;;;;57080:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57140:28;57136:109;;57208:9;56260:1109;-1:-1:-1;;;56260:1109:0:o;57136:109::-;57007:261;;;56469:833;56416:886;57330:31;;;;;;;;;;;;;;37896:191;37970:16;37989:6;;;38006:17;;;;;;;;;;38039:40;;37989:6;;;;;;;38039:40;;37970:16;38039:40;37959:128;37896:191;:::o;75112:101::-;75175:30;75181:3;75186:7;75175:30;;;;;;;;;;;;75199:5;75175;:30::i;69957:667::-;70141:72;;;;;70120:4;;70141:36;;;;;;:72;;17133:10;;70192:4;;70198:7;;70207:5;;70141:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70141:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;70137:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70375:6;:13;70392:1;70375:18;70371:235;;70421:40;;;;;;;;;;;;;;70371:235;70564:6;70558:13;70549:6;70545:2;70541:15;70534:38;70137:480;70260:55;;70270:45;70260:55;;-1:-1:-1;70137:480:0;69957:667;;;;;;:::o;17646:723::-;17702:13;17923:5;17932:1;17923:10;17919:53;;-1:-1:-1;;17950:10:0;;;;;;;;;;;;;;;;;;17646:723::o;17919:53::-;17997:5;17982:12;18038:78;18045:9;;18038:78;;18071:8;;;;:::i;:::-;;-1:-1:-1;18094:10:0;;-1:-1:-1;18102:2:0;18094:10;;:::i;:::-;;;18038:78;;;18126:19;18158:6;18148:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18148:17:0;;18126:39;;18176:154;18183:10;;18176:154;;18210:11;18220:1;18210:11;;:::i;:::-;;-1:-1:-1;18279:10:0;18287:2;18279:5;:10;:::i;:::-;18266:24;;:2;:24;:::i;:::-;18253:39;;18236:6;18243;18236:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;18307:11:0;18316:2;18307:11;;:::i;:::-;;;18176:154;;79471:283;79560:4;;79627:3;79632:5;17133:10;79610:42;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;79600:53;;79610:42;79600:53;;;;79734:12;;79600:53;;-1:-1:-1;79734:12:0;;;;;79673:57;79719:10;79673:37;79600:53;46585:58;;22649:66:1;46585:58:0;;;22637:79:1;22732:12;;;22725:28;;;46452:7:0;;22769:12:1;;46585:58:0;;;;;;;;;;;;46575:69;;;;;;46568:76;;46383:269;;;;79673:37;:45;;:57::i;:::-;:73;;;;79471:283;-1:-1:-1;;;79471:283:0:o;75850:115::-;75938:19;75955:2;75938:14;:19;:::i;:::-;75916:18;;:41;;;;;;;:::i;:::-;;;;-1:-1:-1;;;75850:115:0:o;62183:1775::-;62345:13;;62373:16;;;62369:48;;62398:19;;;;;;;;;;;;;;62369:48;62432:8;62444:1;62432:13;62428:44;;62454:18;;;;;;;;;;;;;;62428:44;62823:16;;;;;;;:12;:16;;;;;;;;:44;;62882:49;;;62823:44;;;;;;;;62882:49;;;;62823:44;;;;;;;62882:49;;;;;;;;;;;;;;;;62948:25;;;:11;:25;;;;;;:35;;62998:66;;;;;;63048:15;62998:66;;;;;;;;;;62948:25;63145:23;;;63189:4;:23;;;;-1:-1:-1;63197:13:0;;;9385:19;:23;;63197:15;63185:641;;;63233:314;63264:38;;63289:12;;63264:38;;;;63281:1;;63264:38;;63281:1;;63264:38;63330:69;63369:1;63373:2;63377:14;;;;;;63393:5;63330:30;:69::i;:::-;63325:174;;63435:40;;;;;;;;;;;;;;63325:174;63542:3;63526:12;:19;63233:314;;63628:12;63611:13;;:29;63607:43;;63642:8;;;63607:43;63185:641;;;63691:120;63722:40;;63747:14;;;;;63722:40;;;;63739:1;;63722:40;;63739:1;;63722:40;63806:3;63790:12;:19;63691:120;;63185:641;-1:-1:-1;63840:13:0;:28;63890:60;60488:369;42581:231;42659:7;42680:17;42699:18;42721:27;42732:4;42738:9;42721:10;:27::i;:::-;42679:69;;;;42759:18;42771:5;42759:11;:18::i;:::-;-1:-1:-1;42795:9:0;42581:231;-1:-1:-1;;;42581:231:0:o;40471:1308::-;40552:7;40561:12;40786:9;:16;40806:2;40786:22;40782:990;;41082:4;41067:20;;41061:27;41132:4;41117:20;;41111:27;41190:4;41175:20;;41169:27;40825:9;41161:36;41233:25;41244:4;41161:36;41061:27;41111;41233:10;:25::i;:::-;41226:32;;;;;;;;;40782:990;41280:9;:16;41300:2;41280:22;41276:496;;41555:4;41540:20;;41534:27;41606:4;41591:20;;41585:27;41648:23;41659:4;41534:27;41585;41648:10;:23::i;:::-;41641:30;;;;;;;;41276:496;-1:-1:-1;41720:1:0;;-1:-1:-1;41724:35:0;41276:496;40471:1308;;;;;:::o;38742:643::-;38820:20;38811:5;:29;;;;;;;;:::i;:::-;;38807:571;;38742:643;:::o;38807:571::-;38918:29;38909:5;:38;;;;;;;;:::i;:::-;;38905:473;;38964:34;;;;;23183:2:1;38964:34:0;;;23165:21:1;23222:2;23202:18;;;23195:30;23261:26;23241:18;;;23234:54;23305:18;;38964:34:0;22981:348:1;38905:473:0;39029:35;39020:5;:44;;;;;;;;:::i;:::-;;39016:362;;39081:41;;;;;23536:2:1;39081:41:0;;;23518:21:1;23575:2;23555:18;;;23548:30;23614:33;23594:18;;;23587:61;23665:18;;39081:41:0;23334:355:1;39016:362:0;39153:30;39144:5;:39;;;;;;;;:::i;:::-;;39140:238;;39200:44;;;;;23896:2:1;39200:44:0;;;23878:21:1;23935:2;23915:18;;;23908:30;23974:34;23954:18;;;23947:62;24045:4;24025:18;;;24018:32;24067:19;;39200:44:0;23694:398:1;39140:238:0;39275:30;39266:5;:39;;;;;;;;:::i;:::-;;39262:116;;39322:44;;;;;24299:2:1;39322:44:0;;;24281:21:1;24338:2;24318:18;;;24311:30;24377:34;24357:18;;;24350:62;24448:4;24428:18;;;24421:32;24470:19;;39322:44:0;24097:398:1;44033:1632:0;44164:7;;45098:66;45085:79;;45081:163;;;-1:-1:-1;45197:1:0;;-1:-1:-1;45201:30:0;45181:51;;45081:163;45258:1;:7;;45263:2;45258:7;;:18;;;;;45269:1;:7;;45274:2;45269:7;;45258:18;45254:102;;;-1:-1:-1;45309:1:0;;-1:-1:-1;45313:30:0;45293:51;;45254:102;45470:24;;;45453:14;45470:24;;;;;;;;;24727:25:1;;;24800:4;24788:17;;24768:18;;;24761:45;;;;24822:18;;;24815:34;;;24865:18;;;24858:34;;;45470:24:0;;24699:19:1;;45470:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45470:24:0;;;;;;-1:-1:-1;;45509:20:0;;;45505:103;;45562:1;45566:29;45546:50;;;;;;;45505:103;45628:6;-1:-1:-1;45636:20:0;;-1:-1:-1;44033:1632:0;;;;;;;;:::o;43075:344::-;43189:7;;43248:66;43235:80;;43189:7;43342:25;43358:3;43343:18;;;43365:2;43342:25;:::i;:::-;43326:42;;43386:25;43397:4;43403:1;43406;43409;43386:10;:25::i;:::-;43379:32;;;;;;43075:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;196:177:1;281:66;274:5;270:78;263:5;260:89;250:117;;363:1;360;353:12;378:245;436:6;489:2;477:9;468:7;464:23;460:32;457:52;;;505:1;502;495:12;457:52;544:9;531:23;563:30;587:5;563:30;:::i;:::-;612:5;378:245;-1:-1:-1;;;378:245:1:o;820:258::-;892:1;902:113;916:6;913:1;910:13;902:113;;;992:11;;;986:18;973:11;;;966:39;938:2;931:10;902:113;;;1033:6;1030:1;1027:13;1024:48;;;-1:-1:-1;;1068:1:1;1050:16;;1043:27;820:258::o;1083:317::-;1125:3;1163:5;1157:12;1190:6;1185:3;1178:19;1206:63;1262:6;1255:4;1250:3;1246:14;1239:4;1232:5;1228:16;1206:63;:::i;:::-;1314:2;1302:15;1319:66;1298:88;1289:98;;;;1389:4;1285:109;;1083:317;-1:-1:-1;;1083:317:1:o;1405:220::-;1554:2;1543:9;1536:21;1517:4;1574:45;1615:2;1604:9;1600:18;1592:6;1574:45;:::i;1630:180::-;1689:6;1742:2;1730:9;1721:7;1717:23;1713:32;1710:52;;;1758:1;1755;1748:12;1710:52;-1:-1:-1;1781:23:1;;1630:180;-1:-1:-1;1630:180:1:o;2046:154::-;2132:42;2125:5;2121:54;2114:5;2111:65;2101:93;;2190:1;2187;2180:12;2205:315;2273:6;2281;2334:2;2322:9;2313:7;2309:23;2305:32;2302:52;;;2350:1;2347;2340:12;2302:52;2389:9;2376:23;2408:31;2433:5;2408:31;:::i;:::-;2458:5;2510:2;2495:18;;;;2482:32;;-1:-1:-1;;;2205:315:1:o;2525:247::-;2584:6;2637:2;2625:9;2616:7;2612:23;2608:32;2605:52;;;2653:1;2650;2643:12;2605:52;2692:9;2679:23;2711:31;2736:5;2711:31;:::i;2777:456::-;2854:6;2862;2870;2923:2;2911:9;2902:7;2898:23;2894:32;2891:52;;;2939:1;2936;2929:12;2891:52;2978:9;2965:23;2997:31;3022:5;2997:31;:::i;:::-;3047:5;-1:-1:-1;3104:2:1;3089:18;;3076:32;3117:33;3076:32;3117:33;:::i;:::-;2777:456;;3169:7;;-1:-1:-1;;;3223:2:1;3208:18;;;;3195:32;;2777:456::o;3238:160::-;3303:20;;3359:13;;3352:21;3342:32;;3332:60;;3388:1;3385;3378:12;3332:60;3238:160;;;:::o;3403:180::-;3459:6;3512:2;3500:9;3491:7;3487:23;3483:32;3480:52;;;3528:1;3525;3518:12;3480:52;3551:26;3567:9;3551:26;:::i;3588:592::-;3659:6;3667;3720:2;3708:9;3699:7;3695:23;3691:32;3688:52;;;3736:1;3733;3726:12;3688:52;3776:9;3763:23;3805:18;3846:2;3838:6;3835:14;3832:34;;;3862:1;3859;3852:12;3832:34;3900:6;3889:9;3885:22;3875:32;;3945:7;3938:4;3934:2;3930:13;3926:27;3916:55;;3967:1;3964;3957:12;3916:55;4007:2;3994:16;4033:2;4025:6;4022:14;4019:34;;;4049:1;4046;4039:12;4019:34;4094:7;4089:2;4080:6;4076:2;4072:15;4068:24;4065:37;4062:57;;;4115:1;4112;4105:12;4062:57;4146:2;4138:11;;;;;4168:6;;-1:-1:-1;3588:592:1;;-1:-1:-1;;;;3588:592:1:o;4185:315::-;4250:6;4258;4311:2;4299:9;4290:7;4286:23;4282:32;4279:52;;;4327:1;4324;4317:12;4279:52;4366:9;4353:23;4385:31;4410:5;4385:31;:::i;:::-;4435:5;-1:-1:-1;4459:35:1;4490:2;4475:18;;4459:35;:::i;:::-;4449:45;;4185:315;;;;;:::o;4505:367::-;4568:8;4578:6;4632:3;4625:4;4617:6;4613:17;4609:27;4599:55;;4650:1;4647;4640:12;4599:55;-1:-1:-1;4673:20:1;;4716:18;4705:30;;4702:50;;;4748:1;4745;4738:12;4702:50;4785:4;4777:6;4773:17;4761:29;;4845:3;4838:4;4828:6;4825:1;4821:14;4813:6;4809:27;4805:38;4802:47;4799:67;;;4862:1;4859;4852:12;4877:773;4999:6;5007;5015;5023;5076:2;5064:9;5055:7;5051:23;5047:32;5044:52;;;5092:1;5089;5082:12;5044:52;5132:9;5119:23;5161:18;5202:2;5194:6;5191:14;5188:34;;;5218:1;5215;5208:12;5188:34;5257:70;5319:7;5310:6;5299:9;5295:22;5257:70;:::i;:::-;5346:8;;-1:-1:-1;5231:96:1;-1:-1:-1;5434:2:1;5419:18;;5406:32;;-1:-1:-1;5450:16:1;;;5447:36;;;5479:1;5476;5469:12;5447:36;;5518:72;5582:7;5571:8;5560:9;5556:24;5518:72;:::i;:::-;4877:773;;;;-1:-1:-1;5609:8:1;-1:-1:-1;;;;4877:773:1:o;5655:184::-;5707:77;5704:1;5697:88;5804:4;5801:1;5794:15;5828:4;5825:1;5818:15;5844:690;5908:5;5938:18;5979:2;5971:6;5968:14;5965:40;;;5985:18;;:::i;:::-;6119:2;6113:9;6185:2;6173:15;;6024:66;6169:24;;;6195:2;6165:33;6161:42;6149:55;;;6219:18;;;6239:22;;;6216:46;6213:72;;;6265:18;;:::i;:::-;6305:10;6301:2;6294:22;6334:6;6325:15;;6364:6;6356;6349:22;6404:3;6395:6;6390:3;6386:16;6383:25;6380:45;;;6421:1;6418;6411:12;6380:45;6471:6;6466:3;6459:4;6451:6;6447:17;6434:44;6526:1;6519:4;6510:6;6502;6498:19;6494:30;6487:41;;;;5844:690;;;;;:::o;6539:220::-;6581:5;6634:3;6627:4;6619:6;6615:17;6611:27;6601:55;;6652:1;6649;6642:12;6601:55;6674:79;6749:3;6740:6;6727:20;6720:4;6712:6;6708:17;6674:79;:::i;6764:665::-;6859:6;6867;6875;6883;6936:3;6924:9;6915:7;6911:23;6907:33;6904:53;;;6953:1;6950;6943:12;6904:53;6992:9;6979:23;7011:31;7036:5;7011:31;:::i;:::-;7061:5;-1:-1:-1;7118:2:1;7103:18;;7090:32;7131:33;7090:32;7131:33;:::i;:::-;7183:7;-1:-1:-1;7237:2:1;7222:18;;7209:32;;-1:-1:-1;7292:2:1;7277:18;;7264:32;7319:18;7308:30;;7305:50;;;7351:1;7348;7341:12;7305:50;7374:49;7415:7;7406:6;7395:9;7391:22;7374:49;:::i;:::-;7364:59;;;6764:665;;;;;;;:::o;7434:450::-;7503:6;7556:2;7544:9;7535:7;7531:23;7527:32;7524:52;;;7572:1;7569;7562:12;7524:52;7612:9;7599:23;7645:18;7637:6;7634:30;7631:50;;;7677:1;7674;7667:12;7631:50;7700:22;;7753:4;7745:13;;7741:27;-1:-1:-1;7731:55:1;;7782:1;7779;7772:12;7731:55;7805:73;7870:7;7865:2;7852:16;7847:2;7843;7839:11;7805:73;:::i;7889:388::-;7966:6;7974;8027:2;8015:9;8006:7;8002:23;7998:32;7995:52;;;8043:1;8040;8033:12;7995:52;8079:9;8066:23;8056:33;;8140:2;8129:9;8125:18;8112:32;8167:18;8159:6;8156:30;8153:50;;;8199:1;8196;8189:12;8153:50;8222:49;8263:7;8254:6;8243:9;8239:22;8222:49;:::i;:::-;8212:59;;;7889:388;;;;;:::o;8282:::-;8350:6;8358;8411:2;8399:9;8390:7;8386:23;8382:32;8379:52;;;8427:1;8424;8417:12;8379:52;8466:9;8453:23;8485:31;8510:5;8485:31;:::i;:::-;8535:5;-1:-1:-1;8592:2:1;8577:18;;8564:32;8605:33;8564:32;8605:33;:::i;:::-;8657:7;8647:17;;;8282:388;;;;;:::o;9003:437::-;9082:1;9078:12;;;;9125;;;9146:61;;9200:4;9192:6;9188:17;9178:27;;9146:61;9253:2;9245:6;9242:14;9222:18;9219:38;9216:218;;9290:77;9287:1;9280:88;9391:4;9388:1;9381:15;9419:4;9416:1;9409:15;9216:218;;9003:437;;;:::o;11171:184::-;11223:77;11220:1;11213:88;11320:4;11317:1;11310:15;11344:4;11341:1;11334:15;11360:128;11400:3;11431:1;11427:6;11424:1;11421:13;11418:39;;;11437:18;;:::i;:::-;-1:-1:-1;11473:9:1;;11360:128::o;11493:125::-;11533:4;11561:1;11558;11555:8;11552:34;;;11566:18;;:::i;:::-;-1:-1:-1;11603:9:1;;11493:125::o;12635:184::-;12687:77;12684:1;12677:88;12784:4;12781:1;12774:15;12808:4;12805:1;12798:15;12824:195;12863:3;12894:66;12887:5;12884:77;12881:103;;12964:18;;:::i;:::-;-1:-1:-1;13011:1:1;13000:13;;12824:195::o;14163:1088::-;14248:12;;14213:3;;14303:1;14323:18;;;;14376;;;;14403:61;;14457:4;14449:6;14445:17;14435:27;;14403:61;14483:2;14531;14523:6;14520:14;14500:18;14497:38;14494:218;;14568:77;14565:1;14558:88;14669:4;14666:1;14659:15;14697:4;14694:1;14687:15;14494:218;14728:18;14755:162;;;;14931:1;14926:319;;;;14721:524;;14755:162;14803:66;14792:9;14788:82;14783:3;14776:95;14900:6;14895:3;14891:16;14884:23;;14755:162;;14926:319;14110:1;14103:14;;;14147:4;14134:18;;15020:1;15034:165;15048:6;15045:1;15042:13;15034:165;;;15126:14;;15113:11;;;15106:35;15169:16;;;;15063:10;;15034:165;;;15038:3;;15228:6;15223:3;15219:16;15212:23;;14721:524;;;;;;;14163:1088;;;;:::o;15256:376::-;15432:3;15460:38;15494:3;15486:6;15460:38;:::i;:::-;15527:6;15521:13;15543:52;15588:6;15584:2;15577:4;15569:6;15565:17;15543:52;:::i;:::-;15611:15;;15256:376;-1:-1:-1;;;;15256:376:1:o;16986:228::-;17026:7;17152:1;17084:66;17080:74;17077:1;17074:81;17069:1;17062:9;17055:17;17051:105;17048:131;;;17159:18;;:::i;:::-;-1:-1:-1;17199:9:1;;16986:228::o;20747:512::-;20941:4;20970:42;21051:2;21043:6;21039:15;21028:9;21021:34;21103:2;21095:6;21091:15;21086:2;21075:9;21071:18;21064:43;;21143:6;21138:2;21127:9;21123:18;21116:34;21186:3;21181:2;21170:9;21166:18;21159:31;21207:46;21248:3;21237:9;21233:19;21225:6;21207:46;:::i;:::-;21199:54;20747:512;-1:-1:-1;;;;;;20747:512:1:o;21264:249::-;21333:6;21386:2;21374:9;21365:7;21361:23;21357:32;21354:52;;;21402:1;21399;21392:12;21354:52;21434:9;21428:16;21453:30;21477:5;21453:30;:::i;21518:184::-;21570:77;21567:1;21560:88;21667:4;21664:1;21657:15;21691:4;21688:1;21681:15;21707:120;21747:1;21773;21763:35;;21778:18;;:::i;:::-;-1:-1:-1;21812:9:1;;21707:120::o;21832:112::-;21864:1;21890;21880:35;;21895:18;;:::i;:::-;-1:-1:-1;21929:9:1;;21832:112::o;21949:453::-;22150:3;22181:73;22215:38;22249:3;22241:6;22215:38;:::i;:::-;22207:6;22181:73;:::i;:::-;22285:2;22281:15;;;;22298:66;22277:88;22263:103;;-1:-1:-1;;22393:2:1;22382:14;;21949:453;-1:-1:-1;;21949:453:1:o;22792:184::-;22844:77;22841:1;22834:88;22941:4;22938:1;22931:15;22965:4;22962:1;22955:15

Swarm Source

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

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