ETH Price: $3,545.23 (+7.52%)

Token

HappyBirthdayPinatas (HBD)
 

Overview

Max Total Supply

167 HBD

Holders

84

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 HBD
0xc90df27fd516b708c464b831be255a807ef7b6bd
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:
HappyBirthday

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-18
*/

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/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);
}

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

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

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

pragma solidity ^0.8.0;


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

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

pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

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

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: contracts/ethereum/HappyBirthday.sol

/**                                                                    
*      ___                      _____                  ___          ___            
*     /__/\        _____       /  /::\                /__/\        /  /\     ___   
*     \  \:\      /  /::\     /  /:/\:\               \  \:\      /  /:/_   /  /\  
*      \__\:\    /  /:/\:\   /  /:/  \:\               \  \:\    /  /:/ /\ /  /:/  
*  ___ /  /::\  /  /:/~/::\ /__/:/ \__\:|          _____\__\:\  /  /:/ /://  /:/   
* /__/\  /:/\:\/__/:/ /:/\:|\  \:\ /  /:/         /__/::::::::\/__/:/ /://  /::\   
* \  \:\/:/__\/\  \:\/:/~/:/ \  \:\  /:/          \  \:\~~\~~\/\  \:\/://__/:/\:\  
*  \  \::/      \  \::/ /:/   \  \:\/:/            \  \:\  ~~~  \  \::/ \__\/  \:\ 
*   \  \:\       \  \:\/:/     \  \::/              \  \:\       \  \:\      \  \:\
*    \  \:\       \  \::/       \__\/                \  \:\       \  \:\      \__\/
*     \__\/        \__\/                              \__\/        \__\/                  
**/

pragma solidity 0.8.0;

/**
 * @title HappyBirthday NFT minting contract
 * @dev Extends ERC721 Non-Fungible Token Standard basic implementation
 */
contract HappyBirthday is ERC721Enumerable, Ownable {
    uint256 public constant PINATA_SUPPLY = 3660;
    uint256 public constant PINATA_PRICE = 55000000000000000; // 0.055 ETH

    bool _saleIsActive = false;
    string _baseTokenURI;

    /**
     * @dev Initializes the contract by setting a `baseURI` for the token collection.
     */
    constructor(string memory baseURI) ERC721("HappyBirthdayPinatas", "HBD") {
        setBaseURI(baseURI);
    }

    /**
     * @notice Mints `tokenId` and transfers it to `to`. A fee is deposited into the contract.
     *
     * Requirements:
     * - `_saleIsActive` must be set to true by the contract owner
     * - `tokenId` must be in range 0 TO `NORMAL_PINATA_SUPPLY`
     * - Message value must be greater than or equal to static price for the token. The single `SPECIAL_PINATA_TOKEN_ID` requires a higher value.
     * - `tokenId` must not exist
     */
    function mint(address to, uint256 tokenId) public payable {
        if (msg.sender != owner()) {
            require(_saleIsActive, "Sales are not active");
        }

        require(tokenId < PINATA_SUPPLY, "Invalid tokenId");
        require(msg.value >= PINATA_PRICE, "Value below price");

        _safeMint(to, tokenId);
    }

    /**
     * @dev Sets the `baseURI` for the token collection.
     */
    function setBaseURI(string memory baseURI) public onlyOwner {
        _baseTokenURI = baseURI;
    }

    /**
     * @dev Sets minting sales to the `isActive` status
     * @param isActive A boolean that denotes if sales should be set to active.
     */
    function setSaleActive(bool isActive) public onlyOwner {
        _saleIsActive = isActive;
    }

    /**
     * @dev Sends full contract balance to the message sender
     */
    function withdraw() public payable onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    /**
     * @dev Base URI for computing {tokenURI}
     */
    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }

    /**
     * @dev Overriding function to prevent ability to renounce ownership
     */
    function renounceOwnership() public virtual override onlyOwner {
        revert("Cannot renounce ownership");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"PINATA_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PINATA_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isActive","type":"bool"}],"name":"setSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600a60146101000a81548160ff0219169083151502179055503480156200002c57600080fd5b5060405162004068380380620040688339818101604052810190620000529190620003ba565b6040518060400160405280601481526020017f4861707079426972746864617950696e617461730000000000000000000000008152506040518060400160405280600381526020017f48424400000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000d692919062000298565b508060019080519060200190620000ef92919062000298565b505050600062000104620001bb60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620001b481620001c360201b60201c565b50620005a5565b600033905090565b620001d3620001bb60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620001f96200026e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000252576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002499062000441565b60405180910390fd5b80600b90805190602001906200026a92919062000298565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002a69062000511565b90600052602060002090601f016020900481019282620002ca576000855562000316565b82601f10620002e557805160ff191683800117855562000316565b8280016001018555821562000316579182015b8281111562000315578251825591602001919060010190620002f8565b5b50905062000325919062000329565b5090565b5b80821115620003445760008160009055506001016200032a565b5090565b60006200035f620003598462000497565b62000463565b9050828152602081018484840111156200037857600080fd5b62000385848285620004db565b509392505050565b600082601f8301126200039f57600080fd5b8151620003b184826020860162000348565b91505092915050565b600060208284031215620003cd57600080fd5b600082015167ffffffffffffffff811115620003e857600080fd5b620003f6848285016200038d565b91505092915050565b60006200040e602083620004ca565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600060208201905081810360008301526200045c81620003ff565b9050919050565b6000604051905081810181811067ffffffffffffffff821117156200048d576200048c62000576565b5b8060405250919050565b600067ffffffffffffffff821115620004b557620004b462000576565b5b601f19601f8301169050602081019050919050565b600082825260208201905092915050565b60005b83811015620004fb578082015181840152602081019050620004de565b838111156200050b576000848401525b50505050565b600060028204905060018216806200052a57607f821691505b6020821081141562000541576200054062000547565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613ab380620005b56000396000f3fe6080604052600436106101665760003560e01c806355f804b3116100d157806395d89b411161008a578063c87b56dd11610064578063c87b56dd1461050c578063d495c89f14610549578063e985e9c514610574578063f2fde38b146105b157610166565b806395d89b411461048f578063a22cb465146104ba578063b88d4fde146104e357610166565b806355f804b3146103815780636352211e146103aa57806370a08231146103e7578063715018a614610424578063841718a61461043b5780638da5cb5b1461046457610166565b80632f745c59116101235780632f745c591461028d5780633901246d146102ca5780633ccfd60b146102f557806340c10f19146102ff57806342842e0e1461031b5780634f6ccce71461034457610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461023957806323b872dd14610264575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d91906129a0565b6105da565b60405161019f919061334b565b60405180910390f35b3480156101b457600080fd5b506101bd610654565b6040516101ca9190613366565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f59190612a33565b6106e6565b60405161020791906132e4565b60405180910390f35b34801561021c57600080fd5b506102376004803603810190610232919061293b565b61076b565b005b34801561024557600080fd5b5061024e610883565b60405161025b9190613648565b60405180910390f35b34801561027057600080fd5b5061028b60048036038101906102869190612835565b610890565b005b34801561029957600080fd5b506102b460048036038101906102af919061293b565b6108f0565b6040516102c19190613648565b60405180910390f35b3480156102d657600080fd5b506102df610995565b6040516102ec9190613648565b60405180910390f35b6102fd6109a0565b005b6103196004803603810190610314919061293b565b610a6b565b005b34801561032757600080fd5b50610342600480360381019061033d9190612835565b610b91565b005b34801561035057600080fd5b5061036b60048036038101906103669190612a33565b610bb1565b6040516103789190613648565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a391906129f2565b610c48565b005b3480156103b657600080fd5b506103d160048036038101906103cc9190612a33565b610cde565b6040516103de91906132e4565b60405180910390f35b3480156103f357600080fd5b5061040e600480360381019061040991906127d0565b610d90565b60405161041b9190613648565b60405180910390f35b34801561043057600080fd5b50610439610e48565b005b34801561044757600080fd5b50610462600480360381019061045d9190612977565b610eff565b005b34801561047057600080fd5b50610479610f98565b60405161048691906132e4565b60405180910390f35b34801561049b57600080fd5b506104a4610fc2565b6040516104b19190613366565b60405180910390f35b3480156104c657600080fd5b506104e160048036038101906104dc91906128ff565b611054565b005b3480156104ef57600080fd5b5061050a60048036038101906105059190612884565b6111d5565b005b34801561051857600080fd5b50610533600480360381019061052e9190612a33565b611237565b6040516105409190613366565b60405180910390f35b34801561055557600080fd5b5061055e6112de565b60405161056b9190613648565b60405180910390f35b34801561058057600080fd5b5061059b600480360381019061059691906127f9565b6112e4565b6040516105a8919061334b565b60405180910390f35b3480156105bd57600080fd5b506105d860048036038101906105d391906127d0565b611378565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064d575061064c82611524565b5b9050919050565b606060008054610663906138a8565b80601f016020809104026020016040519081016040528092919081815260200182805461068f906138a8565b80156106dc5780601f106106b1576101008083540402835291602001916106dc565b820191906000526020600020905b8154815290600101906020018083116106bf57829003601f168201915b5050505050905090565b60006106f182611606565b610730576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072790613528565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061077682610cde565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107de906135c8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610806611672565b73ffffffffffffffffffffffffffffffffffffffff16148061083557506108348161082f611672565b6112e4565b5b610874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086b906134a8565b60405180910390fd5b61087e838361167a565b505050565b6000600880549050905090565b6108a161089b611672565b82611733565b6108e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d7906135e8565b60405180910390fd5b6108eb838383611811565b505050565b60006108fb83610d90565b821061093c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093390613388565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b66c3663566a5800081565b6109a8611672565b73ffffffffffffffffffffffffffffffffffffffff166109c6610f98565b73ffffffffffffffffffffffffffffffffffffffff1614610a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1390613548565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610a67573d6000803e3d6000fd5b5050565b610a73610f98565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610af557600a60149054906101000a900460ff16610af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aeb906133c8565b60405180910390fd5b5b610e4c8110610b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3090613468565b60405180910390fd5b66c3663566a58000341015610b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7a906135a8565b60405180910390fd5b610b8d8282611a6d565b5050565b610bac838383604051806020016040528060008152506111d5565b505050565b6000610bbb610883565b8210610bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf390613608565b60405180910390fd5b60088281548110610c36577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610c50611672565b73ffffffffffffffffffffffffffffffffffffffff16610c6e610f98565b73ffffffffffffffffffffffffffffffffffffffff1614610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb90613548565b60405180910390fd5b80600b9080519060200190610cda9291906125f4565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7e906134e8565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df8906134c8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e50611672565b73ffffffffffffffffffffffffffffffffffffffff16610e6e610f98565b73ffffffffffffffffffffffffffffffffffffffff1614610ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebb90613548565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef690613628565b60405180910390fd5b610f07611672565b73ffffffffffffffffffffffffffffffffffffffff16610f25610f98565b73ffffffffffffffffffffffffffffffffffffffff1614610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7290613548565b60405180910390fd5b80600a60146101000a81548160ff02191690831515021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610fd1906138a8565b80601f0160208091040260200160405190810160405280929190818152602001828054610ffd906138a8565b801561104a5780601f1061101f5761010080835404028352916020019161104a565b820191906000526020600020905b81548152906001019060200180831161102d57829003601f168201915b5050505050905090565b61105c611672565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c190613448565b60405180910390fd5b80600560006110d7611672565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611184611672565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111c9919061334b565b60405180910390a35050565b6111e66111e0611672565b83611733565b611225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121c906135e8565b60405180910390fd5b61123184848484611a8b565b50505050565b606061124282611606565b611281576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127890613588565b60405180910390fd5b600061128b611ae7565b905060008151116112ab57604051806020016040528060008152506112d6565b806112b584611b79565b6040516020016112c69291906132c0565b6040516020818303038152906040525b915050919050565b610e4c81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611380611672565b73ffffffffffffffffffffffffffffffffffffffff1661139e610f98565b73ffffffffffffffffffffffffffffffffffffffff16146113f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113eb90613548565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b906133e8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806115ef57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806115ff57506115fe82611d26565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166116ed83610cde565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061173e82611606565b61177d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177490613488565b60405180910390fd5b600061178883610cde565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806117f757508373ffffffffffffffffffffffffffffffffffffffff166117df846106e6565b73ffffffffffffffffffffffffffffffffffffffff16145b80611808575061180781856112e4565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661183182610cde565b73ffffffffffffffffffffffffffffffffffffffff1614611887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187e90613568565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ee90613428565b60405180910390fd5b611902838383611d90565b61190d60008261167a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461195d91906137be565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119b49190613737565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611a87828260405180602001604052806000815250611ea4565b5050565b611a96848484611811565b611aa284848484611eff565b611ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad8906133a8565b60405180910390fd5b50505050565b6060600b8054611af6906138a8565b80601f0160208091040260200160405190810160405280929190818152602001828054611b22906138a8565b8015611b6f5780601f10611b4457610100808354040283529160200191611b6f565b820191906000526020600020905b815481529060010190602001808311611b5257829003601f168201915b5050505050905090565b60606000821415611bc1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611d21565b600082905060005b60008214611bf3578080611bdc906138da565b915050600a82611bec919061378d565b9150611bc9565b60008167ffffffffffffffff811115611c35577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611c675781602001600182028036833780820191505090505b5090505b60008514611d1a57600182611c8091906137be565b9150600a85611c8f9190613923565b6030611c9b9190613737565b60f81b818381518110611cd7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611d13919061378d565b9450611c6b565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611d9b838383612096565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611dde57611dd98161209b565b611e1d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611e1c57611e1b83826120e4565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e6057611e5b81612251565b611e9f565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611e9e57611e9d8282612394565b5b5b505050565b611eae8383612413565b611ebb6000848484611eff565b611efa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef1906133a8565b60405180910390fd5b505050565b6000611f208473ffffffffffffffffffffffffffffffffffffffff166125e1565b15612089578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f49611672565b8786866040518563ffffffff1660e01b8152600401611f6b94939291906132ff565b602060405180830381600087803b158015611f8557600080fd5b505af1925050508015611fb657506040513d601f19601f82011682018060405250810190611fb391906129c9565b60015b612039573d8060008114611fe6576040519150601f19603f3d011682016040523d82523d6000602084013e611feb565b606091505b50600081511415612031576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612028906133a8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061208e565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016120f184610d90565b6120fb91906137be565b90506000600760008481526020019081526020016000205490508181146121e0576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061226591906137be565b90506000600960008481526020019081526020016000205490506000600883815481106122bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612303577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612378577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061239f83610d90565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247a90613508565b60405180910390fd5b61248c81611606565b156124cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c390613408565b60405180910390fd5b6124d860008383611d90565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125289190613737565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612600906138a8565b90600052602060002090601f0160209004810192826126225760008555612669565b82601f1061263b57805160ff1916838001178555612669565b82800160010185558215612669579182015b8281111561266857825182559160200191906001019061264d565b5b509050612676919061267a565b5090565b5b8082111561269357600081600090555060010161267b565b5090565b60006126aa6126a584613694565b613663565b9050828152602081018484840111156126c257600080fd5b6126cd848285613866565b509392505050565b60006126e86126e3846136c4565b613663565b90508281526020810184848401111561270057600080fd5b61270b848285613866565b509392505050565b60008135905061272281613a21565b92915050565b60008135905061273781613a38565b92915050565b60008135905061274c81613a4f565b92915050565b60008151905061276181613a4f565b92915050565b600082601f83011261277857600080fd5b8135612788848260208601612697565b91505092915050565b600082601f8301126127a257600080fd5b81356127b28482602086016126d5565b91505092915050565b6000813590506127ca81613a66565b92915050565b6000602082840312156127e257600080fd5b60006127f084828501612713565b91505092915050565b6000806040838503121561280c57600080fd5b600061281a85828601612713565b925050602061282b85828601612713565b9150509250929050565b60008060006060848603121561284a57600080fd5b600061285886828701612713565b935050602061286986828701612713565b925050604061287a868287016127bb565b9150509250925092565b6000806000806080858703121561289a57600080fd5b60006128a887828801612713565b94505060206128b987828801612713565b93505060406128ca878288016127bb565b925050606085013567ffffffffffffffff8111156128e757600080fd5b6128f387828801612767565b91505092959194509250565b6000806040838503121561291257600080fd5b600061292085828601612713565b925050602061293185828601612728565b9150509250929050565b6000806040838503121561294e57600080fd5b600061295c85828601612713565b925050602061296d858286016127bb565b9150509250929050565b60006020828403121561298957600080fd5b600061299784828501612728565b91505092915050565b6000602082840312156129b257600080fd5b60006129c08482850161273d565b91505092915050565b6000602082840312156129db57600080fd5b60006129e984828501612752565b91505092915050565b600060208284031215612a0457600080fd5b600082013567ffffffffffffffff811115612a1e57600080fd5b612a2a84828501612791565b91505092915050565b600060208284031215612a4557600080fd5b6000612a53848285016127bb565b91505092915050565b612a65816137f2565b82525050565b612a7481613804565b82525050565b6000612a85826136f4565b612a8f818561370a565b9350612a9f818560208601613875565b612aa881613a10565b840191505092915050565b6000612abe826136ff565b612ac8818561371b565b9350612ad8818560208601613875565b612ae181613a10565b840191505092915050565b6000612af7826136ff565b612b01818561372c565b9350612b11818560208601613875565b80840191505092915050565b6000612b2a602b8361371b565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612b9060328361371b565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612bf660148361371b565b91507f53616c657320617265206e6f74206163746976650000000000000000000000006000830152602082019050919050565b6000612c3660268361371b565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612c9c601c8361371b565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612cdc60248361371b565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612d4260198361371b565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000612d82600f8361371b565b91507f496e76616c696420746f6b656e496400000000000000000000000000000000006000830152602082019050919050565b6000612dc2602c8361371b565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000612e2860388361371b565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000612e8e602a8361371b565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000612ef460298361371b565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000612f5a60208361371b565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000612f9a602c8361371b565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061300060208361371b565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061304060298361371b565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006130a6602f8361371b565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061310c60118361371b565b91507f56616c75652062656c6f772070726963650000000000000000000000000000006000830152602082019050919050565b600061314c60218361371b565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131b260318361371b565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613218602c8361371b565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b600061327e60198361371b565b91507f43616e6e6f742072656e6f756e6365206f776e657273686970000000000000006000830152602082019050919050565b6132ba8161385c565b82525050565b60006132cc8285612aec565b91506132d88284612aec565b91508190509392505050565b60006020820190506132f96000830184612a5c565b92915050565b60006080820190506133146000830187612a5c565b6133216020830186612a5c565b61332e60408301856132b1565b81810360608301526133408184612a7a565b905095945050505050565b60006020820190506133606000830184612a6b565b92915050565b600060208201905081810360008301526133808184612ab3565b905092915050565b600060208201905081810360008301526133a181612b1d565b9050919050565b600060208201905081810360008301526133c181612b83565b9050919050565b600060208201905081810360008301526133e181612be9565b9050919050565b6000602082019050818103600083015261340181612c29565b9050919050565b6000602082019050818103600083015261342181612c8f565b9050919050565b6000602082019050818103600083015261344181612ccf565b9050919050565b6000602082019050818103600083015261346181612d35565b9050919050565b6000602082019050818103600083015261348181612d75565b9050919050565b600060208201905081810360008301526134a181612db5565b9050919050565b600060208201905081810360008301526134c181612e1b565b9050919050565b600060208201905081810360008301526134e181612e81565b9050919050565b6000602082019050818103600083015261350181612ee7565b9050919050565b6000602082019050818103600083015261352181612f4d565b9050919050565b6000602082019050818103600083015261354181612f8d565b9050919050565b6000602082019050818103600083015261356181612ff3565b9050919050565b6000602082019050818103600083015261358181613033565b9050919050565b600060208201905081810360008301526135a181613099565b9050919050565b600060208201905081810360008301526135c1816130ff565b9050919050565b600060208201905081810360008301526135e18161313f565b9050919050565b60006020820190508181036000830152613601816131a5565b9050919050565b600060208201905081810360008301526136218161320b565b9050919050565b6000602082019050818103600083015261364181613271565b9050919050565b600060208201905061365d60008301846132b1565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561368a576136896139e1565b5b8060405250919050565b600067ffffffffffffffff8211156136af576136ae6139e1565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156136df576136de6139e1565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006137428261385c565b915061374d8361385c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561378257613781613954565b5b828201905092915050565b60006137988261385c565b91506137a38361385c565b9250826137b3576137b2613983565b5b828204905092915050565b60006137c98261385c565b91506137d48361385c565b9250828210156137e7576137e6613954565b5b828203905092915050565b60006137fd8261383c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613893578082015181840152602081019050613878565b838111156138a2576000848401525b50505050565b600060028204905060018216806138c057607f821691505b602082108114156138d4576138d36139b2565b5b50919050565b60006138e58261385c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561391857613917613954565b5b600182019050919050565b600061392e8261385c565b91506139398361385c565b92508261394957613948613983565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613a2a816137f2565b8114613a3557600080fd5b50565b613a4181613804565b8114613a4c57600080fd5b50565b613a5881613810565b8114613a6357600080fd5b50565b613a6f8161385c565b8114613a7a57600080fd5b5056fea264697066735822122091f5bdcdc8d994116f42579a968dbaf04405a15b3ae5b152f0fbb81e2449ba8764736f6c634300080000330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000007568747470733a2f2f6d36326137377975676d703364667a6279647335647a616462707837697a7772663663746267666f72356d3273367033647973712e617277656176652e6e65742f5a3751505f78517a483747584963446c30655144432d5f305a74457668544359726f395a71586e374869552f0000000000000000000000

Deployed Bytecode

0x6080604052600436106101665760003560e01c806355f804b3116100d157806395d89b411161008a578063c87b56dd11610064578063c87b56dd1461050c578063d495c89f14610549578063e985e9c514610574578063f2fde38b146105b157610166565b806395d89b411461048f578063a22cb465146104ba578063b88d4fde146104e357610166565b806355f804b3146103815780636352211e146103aa57806370a08231146103e7578063715018a614610424578063841718a61461043b5780638da5cb5b1461046457610166565b80632f745c59116101235780632f745c591461028d5780633901246d146102ca5780633ccfd60b146102f557806340c10f19146102ff57806342842e0e1461031b5780634f6ccce71461034457610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461023957806323b872dd14610264575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d91906129a0565b6105da565b60405161019f919061334b565b60405180910390f35b3480156101b457600080fd5b506101bd610654565b6040516101ca9190613366565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f59190612a33565b6106e6565b60405161020791906132e4565b60405180910390f35b34801561021c57600080fd5b506102376004803603810190610232919061293b565b61076b565b005b34801561024557600080fd5b5061024e610883565b60405161025b9190613648565b60405180910390f35b34801561027057600080fd5b5061028b60048036038101906102869190612835565b610890565b005b34801561029957600080fd5b506102b460048036038101906102af919061293b565b6108f0565b6040516102c19190613648565b60405180910390f35b3480156102d657600080fd5b506102df610995565b6040516102ec9190613648565b60405180910390f35b6102fd6109a0565b005b6103196004803603810190610314919061293b565b610a6b565b005b34801561032757600080fd5b50610342600480360381019061033d9190612835565b610b91565b005b34801561035057600080fd5b5061036b60048036038101906103669190612a33565b610bb1565b6040516103789190613648565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a391906129f2565b610c48565b005b3480156103b657600080fd5b506103d160048036038101906103cc9190612a33565b610cde565b6040516103de91906132e4565b60405180910390f35b3480156103f357600080fd5b5061040e600480360381019061040991906127d0565b610d90565b60405161041b9190613648565b60405180910390f35b34801561043057600080fd5b50610439610e48565b005b34801561044757600080fd5b50610462600480360381019061045d9190612977565b610eff565b005b34801561047057600080fd5b50610479610f98565b60405161048691906132e4565b60405180910390f35b34801561049b57600080fd5b506104a4610fc2565b6040516104b19190613366565b60405180910390f35b3480156104c657600080fd5b506104e160048036038101906104dc91906128ff565b611054565b005b3480156104ef57600080fd5b5061050a60048036038101906105059190612884565b6111d5565b005b34801561051857600080fd5b50610533600480360381019061052e9190612a33565b611237565b6040516105409190613366565b60405180910390f35b34801561055557600080fd5b5061055e6112de565b60405161056b9190613648565b60405180910390f35b34801561058057600080fd5b5061059b600480360381019061059691906127f9565b6112e4565b6040516105a8919061334b565b60405180910390f35b3480156105bd57600080fd5b506105d860048036038101906105d391906127d0565b611378565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064d575061064c82611524565b5b9050919050565b606060008054610663906138a8565b80601f016020809104026020016040519081016040528092919081815260200182805461068f906138a8565b80156106dc5780601f106106b1576101008083540402835291602001916106dc565b820191906000526020600020905b8154815290600101906020018083116106bf57829003601f168201915b5050505050905090565b60006106f182611606565b610730576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072790613528565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061077682610cde565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107de906135c8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610806611672565b73ffffffffffffffffffffffffffffffffffffffff16148061083557506108348161082f611672565b6112e4565b5b610874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086b906134a8565b60405180910390fd5b61087e838361167a565b505050565b6000600880549050905090565b6108a161089b611672565b82611733565b6108e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d7906135e8565b60405180910390fd5b6108eb838383611811565b505050565b60006108fb83610d90565b821061093c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093390613388565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b66c3663566a5800081565b6109a8611672565b73ffffffffffffffffffffffffffffffffffffffff166109c6610f98565b73ffffffffffffffffffffffffffffffffffffffff1614610a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1390613548565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610a67573d6000803e3d6000fd5b5050565b610a73610f98565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610af557600a60149054906101000a900460ff16610af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aeb906133c8565b60405180910390fd5b5b610e4c8110610b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3090613468565b60405180910390fd5b66c3663566a58000341015610b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7a906135a8565b60405180910390fd5b610b8d8282611a6d565b5050565b610bac838383604051806020016040528060008152506111d5565b505050565b6000610bbb610883565b8210610bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf390613608565b60405180910390fd5b60088281548110610c36577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610c50611672565b73ffffffffffffffffffffffffffffffffffffffff16610c6e610f98565b73ffffffffffffffffffffffffffffffffffffffff1614610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb90613548565b60405180910390fd5b80600b9080519060200190610cda9291906125f4565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7e906134e8565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df8906134c8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e50611672565b73ffffffffffffffffffffffffffffffffffffffff16610e6e610f98565b73ffffffffffffffffffffffffffffffffffffffff1614610ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebb90613548565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef690613628565b60405180910390fd5b610f07611672565b73ffffffffffffffffffffffffffffffffffffffff16610f25610f98565b73ffffffffffffffffffffffffffffffffffffffff1614610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7290613548565b60405180910390fd5b80600a60146101000a81548160ff02191690831515021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610fd1906138a8565b80601f0160208091040260200160405190810160405280929190818152602001828054610ffd906138a8565b801561104a5780601f1061101f5761010080835404028352916020019161104a565b820191906000526020600020905b81548152906001019060200180831161102d57829003601f168201915b5050505050905090565b61105c611672565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c190613448565b60405180910390fd5b80600560006110d7611672565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611184611672565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111c9919061334b565b60405180910390a35050565b6111e66111e0611672565b83611733565b611225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121c906135e8565b60405180910390fd5b61123184848484611a8b565b50505050565b606061124282611606565b611281576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127890613588565b60405180910390fd5b600061128b611ae7565b905060008151116112ab57604051806020016040528060008152506112d6565b806112b584611b79565b6040516020016112c69291906132c0565b6040516020818303038152906040525b915050919050565b610e4c81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611380611672565b73ffffffffffffffffffffffffffffffffffffffff1661139e610f98565b73ffffffffffffffffffffffffffffffffffffffff16146113f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113eb90613548565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b906133e8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806115ef57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806115ff57506115fe82611d26565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166116ed83610cde565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061173e82611606565b61177d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177490613488565b60405180910390fd5b600061178883610cde565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806117f757508373ffffffffffffffffffffffffffffffffffffffff166117df846106e6565b73ffffffffffffffffffffffffffffffffffffffff16145b80611808575061180781856112e4565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661183182610cde565b73ffffffffffffffffffffffffffffffffffffffff1614611887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187e90613568565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ee90613428565b60405180910390fd5b611902838383611d90565b61190d60008261167a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461195d91906137be565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119b49190613737565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611a87828260405180602001604052806000815250611ea4565b5050565b611a96848484611811565b611aa284848484611eff565b611ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad8906133a8565b60405180910390fd5b50505050565b6060600b8054611af6906138a8565b80601f0160208091040260200160405190810160405280929190818152602001828054611b22906138a8565b8015611b6f5780601f10611b4457610100808354040283529160200191611b6f565b820191906000526020600020905b815481529060010190602001808311611b5257829003601f168201915b5050505050905090565b60606000821415611bc1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611d21565b600082905060005b60008214611bf3578080611bdc906138da565b915050600a82611bec919061378d565b9150611bc9565b60008167ffffffffffffffff811115611c35577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611c675781602001600182028036833780820191505090505b5090505b60008514611d1a57600182611c8091906137be565b9150600a85611c8f9190613923565b6030611c9b9190613737565b60f81b818381518110611cd7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611d13919061378d565b9450611c6b565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611d9b838383612096565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611dde57611dd98161209b565b611e1d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611e1c57611e1b83826120e4565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e6057611e5b81612251565b611e9f565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611e9e57611e9d8282612394565b5b5b505050565b611eae8383612413565b611ebb6000848484611eff565b611efa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef1906133a8565b60405180910390fd5b505050565b6000611f208473ffffffffffffffffffffffffffffffffffffffff166125e1565b15612089578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f49611672565b8786866040518563ffffffff1660e01b8152600401611f6b94939291906132ff565b602060405180830381600087803b158015611f8557600080fd5b505af1925050508015611fb657506040513d601f19601f82011682018060405250810190611fb391906129c9565b60015b612039573d8060008114611fe6576040519150601f19603f3d011682016040523d82523d6000602084013e611feb565b606091505b50600081511415612031576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612028906133a8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061208e565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016120f184610d90565b6120fb91906137be565b90506000600760008481526020019081526020016000205490508181146121e0576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061226591906137be565b90506000600960008481526020019081526020016000205490506000600883815481106122bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612303577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612378577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061239f83610d90565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247a90613508565b60405180910390fd5b61248c81611606565b156124cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c390613408565b60405180910390fd5b6124d860008383611d90565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125289190613737565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612600906138a8565b90600052602060002090601f0160209004810192826126225760008555612669565b82601f1061263b57805160ff1916838001178555612669565b82800160010185558215612669579182015b8281111561266857825182559160200191906001019061264d565b5b509050612676919061267a565b5090565b5b8082111561269357600081600090555060010161267b565b5090565b60006126aa6126a584613694565b613663565b9050828152602081018484840111156126c257600080fd5b6126cd848285613866565b509392505050565b60006126e86126e3846136c4565b613663565b90508281526020810184848401111561270057600080fd5b61270b848285613866565b509392505050565b60008135905061272281613a21565b92915050565b60008135905061273781613a38565b92915050565b60008135905061274c81613a4f565b92915050565b60008151905061276181613a4f565b92915050565b600082601f83011261277857600080fd5b8135612788848260208601612697565b91505092915050565b600082601f8301126127a257600080fd5b81356127b28482602086016126d5565b91505092915050565b6000813590506127ca81613a66565b92915050565b6000602082840312156127e257600080fd5b60006127f084828501612713565b91505092915050565b6000806040838503121561280c57600080fd5b600061281a85828601612713565b925050602061282b85828601612713565b9150509250929050565b60008060006060848603121561284a57600080fd5b600061285886828701612713565b935050602061286986828701612713565b925050604061287a868287016127bb565b9150509250925092565b6000806000806080858703121561289a57600080fd5b60006128a887828801612713565b94505060206128b987828801612713565b93505060406128ca878288016127bb565b925050606085013567ffffffffffffffff8111156128e757600080fd5b6128f387828801612767565b91505092959194509250565b6000806040838503121561291257600080fd5b600061292085828601612713565b925050602061293185828601612728565b9150509250929050565b6000806040838503121561294e57600080fd5b600061295c85828601612713565b925050602061296d858286016127bb565b9150509250929050565b60006020828403121561298957600080fd5b600061299784828501612728565b91505092915050565b6000602082840312156129b257600080fd5b60006129c08482850161273d565b91505092915050565b6000602082840312156129db57600080fd5b60006129e984828501612752565b91505092915050565b600060208284031215612a0457600080fd5b600082013567ffffffffffffffff811115612a1e57600080fd5b612a2a84828501612791565b91505092915050565b600060208284031215612a4557600080fd5b6000612a53848285016127bb565b91505092915050565b612a65816137f2565b82525050565b612a7481613804565b82525050565b6000612a85826136f4565b612a8f818561370a565b9350612a9f818560208601613875565b612aa881613a10565b840191505092915050565b6000612abe826136ff565b612ac8818561371b565b9350612ad8818560208601613875565b612ae181613a10565b840191505092915050565b6000612af7826136ff565b612b01818561372c565b9350612b11818560208601613875565b80840191505092915050565b6000612b2a602b8361371b565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612b9060328361371b565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612bf660148361371b565b91507f53616c657320617265206e6f74206163746976650000000000000000000000006000830152602082019050919050565b6000612c3660268361371b565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612c9c601c8361371b565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612cdc60248361371b565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612d4260198361371b565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000612d82600f8361371b565b91507f496e76616c696420746f6b656e496400000000000000000000000000000000006000830152602082019050919050565b6000612dc2602c8361371b565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000612e2860388361371b565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000612e8e602a8361371b565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000612ef460298361371b565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000612f5a60208361371b565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000612f9a602c8361371b565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061300060208361371b565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061304060298361371b565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006130a6602f8361371b565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061310c60118361371b565b91507f56616c75652062656c6f772070726963650000000000000000000000000000006000830152602082019050919050565b600061314c60218361371b565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131b260318361371b565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613218602c8361371b565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b600061327e60198361371b565b91507f43616e6e6f742072656e6f756e6365206f776e657273686970000000000000006000830152602082019050919050565b6132ba8161385c565b82525050565b60006132cc8285612aec565b91506132d88284612aec565b91508190509392505050565b60006020820190506132f96000830184612a5c565b92915050565b60006080820190506133146000830187612a5c565b6133216020830186612a5c565b61332e60408301856132b1565b81810360608301526133408184612a7a565b905095945050505050565b60006020820190506133606000830184612a6b565b92915050565b600060208201905081810360008301526133808184612ab3565b905092915050565b600060208201905081810360008301526133a181612b1d565b9050919050565b600060208201905081810360008301526133c181612b83565b9050919050565b600060208201905081810360008301526133e181612be9565b9050919050565b6000602082019050818103600083015261340181612c29565b9050919050565b6000602082019050818103600083015261342181612c8f565b9050919050565b6000602082019050818103600083015261344181612ccf565b9050919050565b6000602082019050818103600083015261346181612d35565b9050919050565b6000602082019050818103600083015261348181612d75565b9050919050565b600060208201905081810360008301526134a181612db5565b9050919050565b600060208201905081810360008301526134c181612e1b565b9050919050565b600060208201905081810360008301526134e181612e81565b9050919050565b6000602082019050818103600083015261350181612ee7565b9050919050565b6000602082019050818103600083015261352181612f4d565b9050919050565b6000602082019050818103600083015261354181612f8d565b9050919050565b6000602082019050818103600083015261356181612ff3565b9050919050565b6000602082019050818103600083015261358181613033565b9050919050565b600060208201905081810360008301526135a181613099565b9050919050565b600060208201905081810360008301526135c1816130ff565b9050919050565b600060208201905081810360008301526135e18161313f565b9050919050565b60006020820190508181036000830152613601816131a5565b9050919050565b600060208201905081810360008301526136218161320b565b9050919050565b6000602082019050818103600083015261364181613271565b9050919050565b600060208201905061365d60008301846132b1565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561368a576136896139e1565b5b8060405250919050565b600067ffffffffffffffff8211156136af576136ae6139e1565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156136df576136de6139e1565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006137428261385c565b915061374d8361385c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561378257613781613954565b5b828201905092915050565b60006137988261385c565b91506137a38361385c565b9250826137b3576137b2613983565b5b828204905092915050565b60006137c98261385c565b91506137d48361385c565b9250828210156137e7576137e6613954565b5b828203905092915050565b60006137fd8261383c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613893578082015181840152602081019050613878565b838111156138a2576000848401525b50505050565b600060028204905060018216806138c057607f821691505b602082108114156138d4576138d36139b2565b5b50919050565b60006138e58261385c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561391857613917613954565b5b600182019050919050565b600061392e8261385c565b91506139398361385c565b92508261394957613948613983565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613a2a816137f2565b8114613a3557600080fd5b50565b613a4181613804565b8114613a4c57600080fd5b50565b613a5881613810565b8114613a6357600080fd5b50565b613a6f8161385c565b8114613a7a57600080fd5b5056fea264697066735822122091f5bdcdc8d994116f42579a968dbaf04405a15b3ae5b152f0fbb81e2449ba8764736f6c63430008000033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000007568747470733a2f2f6d36326137377975676d703364667a6279647335647a616462707837697a7772663663746267666f72356d3273367033647973712e617277656176652e6e65742f5a3751505f78517a483747584963446c30655144432d5f305a74457668544359726f395a71586e374869552f0000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string): https://m62a77yugmp3dfzbyds5dzadbpx7izwrf6ctbgfor5m2s6p3dysq.arweave.net/Z7QP_xQzH7GXIcDl0eQDC-_0ZtEvhTCYro9ZqXn7HiU/

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000075
Arg [2] : 68747470733a2f2f6d36326137377975676d703364667a6279647335647a6164
Arg [3] : 62707837697a7772663663746267666f72356d3273367033647973712e617277
Arg [4] : 656176652e6e65742f5a3751505f78517a483747584963446c30655144432d5f
Arg [5] : 305a74457668544359726f395a71586e374869552f0000000000000000000000


Deployed Bytecode Sourcemap

43910:2366:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34262:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21481:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22941:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22478:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34915:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23831:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34583:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44020:56;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45721:148;;;:::i;:::-;;44843:341;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24207:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35105:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45268:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21175:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20905:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46156:117;;;;;;;;;;;;;:::i;:::-;;45534:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41479:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21650:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23234:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24429:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21825:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43969:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23600:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42433:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34262:237;34364:4;34403:35;34388:50;;;:11;:50;;;;:103;;;;34455:36;34479:11;34455:23;:36::i;:::-;34388:103;34381:110;;34262:237;;;:::o;21481:100::-;21535:13;21568:5;21561:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21481:100;:::o;22941:221::-;23017:7;23045:16;23053:7;23045;:16::i;:::-;23037:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23130:15;:24;23146:7;23130:24;;;;;;;;;;;;;;;;;;;;;23123:31;;22941:221;;;:::o;22478:397::-;22559:13;22575:23;22590:7;22575:14;:23::i;:::-;22559:39;;22623:5;22617:11;;:2;:11;;;;22609:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22703:5;22687:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22712:37;22729:5;22736:12;:10;:12::i;:::-;22712:16;:37::i;:::-;22687:62;22679:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;22846:21;22855:2;22859:7;22846:8;:21::i;:::-;22478:397;;;:::o;34915:113::-;34976:7;35003:10;:17;;;;34996:24;;34915:113;:::o;23831:305::-;23992:41;24011:12;:10;:12::i;:::-;24025:7;23992:18;:41::i;:::-;23984:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24100:28;24110:4;24116:2;24120:7;24100:9;:28::i;:::-;23831:305;;;:::o;34583:256::-;34680:7;34716:23;34733:5;34716:16;:23::i;:::-;34708:5;:31;34700:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34805:12;:19;34818:5;34805:19;;;;;;;;;;;;;;;:26;34825:5;34805:26;;;;;;;;;;;;34798:33;;34583:256;;;;:::o;44020:56::-;44059:17;44020:56;:::o;45721:148::-;41710:12;:10;:12::i;:::-;41699:23;;:7;:5;:7::i;:::-;:23;;;41691:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45777:12:::1;45792:21;45777:36;;45832:10;45824:28;;:37;45853:7;45824:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;41770:1;45721:148::o:0;44843:341::-;44930:7;:5;:7::i;:::-;44916:21;;:10;:21;;;44912:100;;44962:13;;;;;;;;;;;44954:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;44912:100;44009:4;45032:7;:23;45024:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;44059:17;45094:9;:25;;45086:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;45154:22;45164:2;45168:7;45154:9;:22::i;:::-;44843:341;;:::o;24207:151::-;24311:39;24328:4;24334:2;24338:7;24311:39;;;;;;;;;;;;:16;:39::i;:::-;24207:151;;;:::o;35105:233::-;35180:7;35216:30;:28;:30::i;:::-;35208:5;:38;35200:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35313:10;35324:5;35313:17;;;;;;;;;;;;;;;;;;;;;;;;35306:24;;35105:233;;;:::o;45268:102::-;41710:12;:10;:12::i;:::-;41699:23;;:7;:5;:7::i;:::-;:23;;;41691:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45355:7:::1;45339:13;:23;;;;;;;;;;;;:::i;:::-;;45268:102:::0;:::o;21175:239::-;21247:7;21267:13;21283:7;:16;21291:7;21283:16;;;;;;;;;;;;;;;;;;;;;21267:32;;21335:1;21318:19;;:5;:19;;;;21310:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21401:5;21394:12;;;21175:239;;;:::o;20905:208::-;20977:7;21022:1;21005:19;;:5;:19;;;;20997:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21089:9;:16;21099:5;21089:16;;;;;;;;;;;;;;;;21082:23;;20905:208;;;:::o;46156:117::-;41710:12;:10;:12::i;:::-;41699:23;;:7;:5;:7::i;:::-;:23;;;41691:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46230:35:::1;;;;;;;;;;:::i;:::-;;;;;;;;45534:98:::0;41710:12;:10;:12::i;:::-;41699:23;;:7;:5;:7::i;:::-;:23;;;41691:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45616:8:::1;45600:13;;:24;;;;;;;;;;;;;;;;;;45534:98:::0;:::o;41479:87::-;41525:7;41552:6;;;;;;;;;;;41545:13;;41479:87;:::o;21650:104::-;21706:13;21739:7;21732:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21650:104;:::o;23234:295::-;23349:12;:10;:12::i;:::-;23337:24;;:8;:24;;;;23329:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23449:8;23404:18;:32;23423:12;:10;:12::i;:::-;23404:32;;;;;;;;;;;;;;;:42;23437:8;23404:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23502:8;23473:48;;23488:12;:10;:12::i;:::-;23473:48;;;23512:8;23473:48;;;;;;:::i;:::-;;;;;;;;23234:295;;:::o;24429:285::-;24561:41;24580:12;:10;:12::i;:::-;24594:7;24561:18;:41::i;:::-;24553:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24667:39;24681:4;24687:2;24691:7;24700:5;24667:13;:39::i;:::-;24429:285;;;;:::o;21825:360::-;21898:13;21932:16;21940:7;21932;:16::i;:::-;21924:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22013:21;22037:10;:8;:10::i;:::-;22013:34;;22089:1;22071:7;22065:21;:25;:112;;;;;;;;;;;;;;;;;22130:7;22139:18;:7;:16;:18::i;:::-;22113:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22065:112;22058:119;;;21825:360;;;:::o;43969:44::-;44009:4;43969:44;:::o;23600:164::-;23697:4;23721:18;:25;23740:5;23721:25;;;;;;;;;;;;;;;:35;23747:8;23721:35;;;;;;;;;;;;;;;;;;;;;;;;;23714:42;;23600:164;;;;:::o;42433:244::-;41710:12;:10;:12::i;:::-;41699:23;;:7;:5;:7::i;:::-;:23;;;41691:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42542:1:::1;42522:22;;:8;:22;;;;42514:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42632:8;42603:38;;42624:6;;;;;;;;;;;42603:38;;;;;;;;;;;;42661:8;42652:6;;:17;;;;;;;;;;;;;;;;;;42433:244:::0;:::o;20549:292::-;20651:4;20690:25;20675:40;;;:11;:40;;;;:105;;;;20747:33;20732:48;;;:11;:48;;;;20675:105;:158;;;;20797:36;20821:11;20797:23;:36::i;:::-;20675:158;20668:165;;20549:292;;;:::o;26181:127::-;26246:4;26298:1;26270:30;;:7;:16;26278:7;26270:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26263:37;;26181:127;;;:::o;15863:98::-;15916:7;15943:10;15936:17;;15863:98;:::o;30058:174::-;30160:2;30133:15;:24;30149:7;30133:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30216:7;30212:2;30178:46;;30187:23;30202:7;30187:14;:23::i;:::-;30178:46;;;;;;;;;;;;30058:174;;:::o;26475:348::-;26568:4;26593:16;26601:7;26593;:16::i;:::-;26585:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26669:13;26685:23;26700:7;26685:14;:23::i;:::-;26669:39;;26738:5;26727:16;;:7;:16;;;:51;;;;26771:7;26747:31;;:20;26759:7;26747:11;:20::i;:::-;:31;;;26727:51;:87;;;;26782:32;26799:5;26806:7;26782:16;:32::i;:::-;26727:87;26719:96;;;26475:348;;;;:::o;29396:544::-;29521:4;29494:31;;:23;29509:7;29494:14;:23::i;:::-;:31;;;29486:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29604:1;29590:16;;:2;:16;;;;29582:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29660:39;29681:4;29687:2;29691:7;29660:20;:39::i;:::-;29764:29;29781:1;29785:7;29764:8;:29::i;:::-;29825:1;29806:9;:15;29816:4;29806:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29854:1;29837:9;:13;29847:2;29837:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29885:2;29866:7;:16;29874:7;29866:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29924:7;29920:2;29905:27;;29914:4;29905:27;;;;;;;;;;;;29396:544;;;:::o;27165:110::-;27241:26;27251:2;27255:7;27241:26;;;;;;;;;;;;:9;:26::i;:::-;27165:110;;:::o;25596:272::-;25710:28;25720:4;25726:2;25730:7;25710:9;:28::i;:::-;25757:48;25780:4;25786:2;25790:7;25799:5;25757:22;:48::i;:::-;25749:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25596:272;;;;:::o;45942:114::-;46002:13;46035;46028:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45942:114;:::o;16514:723::-;16570:13;16800:1;16791:5;:10;16787:53;;;16818:10;;;;;;;;;;;;;;;;;;;;;16787:53;16850:12;16865:5;16850:20;;16881:14;16906:78;16921:1;16913:4;:9;16906:78;;16939:8;;;;;:::i;:::-;;;;16970:2;16962:10;;;;;:::i;:::-;;;16906:78;;;16994:19;17026:6;17016:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16994:39;;17044:154;17060:1;17051:5;:10;17044:154;;17088:1;17078:11;;;;;:::i;:::-;;;17155:2;17147:5;:10;;;;:::i;:::-;17134:2;:24;;;;:::i;:::-;17121:39;;17104:6;17111;17104:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17184:2;17175:11;;;;;:::i;:::-;;;17044:154;;;17222:6;17208:21;;;;;16514:723;;;;:::o;19065:157::-;19150:4;19189:25;19174:40;;;:11;:40;;;;19167:47;;19065:157;;;:::o;35951:555::-;36061:45;36088:4;36094:2;36098:7;36061:26;:45::i;:::-;36139:1;36123:18;;:4;:18;;;36119:187;;;36158:40;36190:7;36158:31;:40::i;:::-;36119:187;;;36228:2;36220:10;;:4;:10;;;36216:90;;36247:47;36280:4;36286:7;36247:32;:47::i;:::-;36216:90;36119:187;36334:1;36320:16;;:2;:16;;;36316:183;;;36353:45;36390:7;36353:36;:45::i;:::-;36316:183;;;36426:4;36420:10;;:2;:10;;;36416:83;;36447:40;36475:2;36479:7;36447:27;:40::i;:::-;36416:83;36316:183;35951:555;;;:::o;27502:250::-;27598:18;27604:2;27608:7;27598:5;:18::i;:::-;27635:54;27666:1;27670:2;27674:7;27683:5;27635:22;:54::i;:::-;27627:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;27502:250;;;:::o;30797:843::-;30918:4;30944:15;:2;:13;;;:15::i;:::-;30940:693;;;30996:2;30980:36;;;31017:12;:10;:12::i;:::-;31031:4;31037:7;31046:5;30980:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30976:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31243:1;31226:6;:13;:18;31222:341;;;31269:60;;;;;;;;;;:::i;:::-;;;;;;;;31222:341;31513:6;31507:13;31498:6;31494:2;31490:15;31483:38;30976:602;31113:45;;;31103:55;;;:6;:55;;;;31096:62;;;;;30940:693;31617:4;31610:11;;30797:843;;;;;;;:::o;32253:93::-;;;;:::o;37229:164::-;37333:10;:17;;;;37306:15;:24;37322:7;37306:24;;;;;;;;;;;:44;;;;37361:10;37377:7;37361:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37229:164;:::o;38020:988::-;38286:22;38336:1;38311:22;38328:4;38311:16;:22::i;:::-;:26;;;;:::i;:::-;38286:51;;38348:18;38369:17;:26;38387:7;38369:26;;;;;;;;;;;;38348:47;;38516:14;38502:10;:28;38498:328;;38547:19;38569:12;:18;38582:4;38569:18;;;;;;;;;;;;;;;:34;38588:14;38569:34;;;;;;;;;;;;38547:56;;38653:11;38620:12;:18;38633:4;38620:18;;;;;;;;;;;;;;;:30;38639:10;38620:30;;;;;;;;;;;:44;;;;38770:10;38737:17;:30;38755:11;38737:30;;;;;;;;;;;:43;;;;38498:328;;38922:17;:26;38940:7;38922:26;;;;;;;;;;;38915:33;;;38966:12;:18;38979:4;38966:18;;;;;;;;;;;;;;;:34;38985:14;38966:34;;;;;;;;;;;38959:41;;;38020:988;;;;:::o;39303:1079::-;39556:22;39601:1;39581:10;:17;;;;:21;;;;:::i;:::-;39556:46;;39613:18;39634:15;:24;39650:7;39634:24;;;;;;;;;;;;39613:45;;39985:19;40007:10;40018:14;40007:26;;;;;;;;;;;;;;;;;;;;;;;;39985:48;;40071:11;40046:10;40057;40046:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40182:10;40151:15;:28;40167:11;40151:28;;;;;;;;;;;:41;;;;40323:15;:24;40339:7;40323:24;;;;;;;;;;;40316:31;;;40358:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39303:1079;;;;:::o;36807:221::-;36892:14;36909:20;36926:2;36909:16;:20::i;:::-;36892:37;;36967:7;36940:12;:16;36953:2;36940:16;;;;;;;;;;;;;;;:24;36957:6;36940:24;;;;;;;;;;;:34;;;;37014:6;36985:17;:26;37003:7;36985:26;;;;;;;;;;;:35;;;;36807:221;;;:::o;28088:382::-;28182:1;28168:16;;:2;:16;;;;28160:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28241:16;28249:7;28241;:16::i;:::-;28240:17;28232:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28303:45;28332:1;28336:2;28340:7;28303:20;:45::i;:::-;28378:1;28361:9;:13;28371:2;28361:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28409:2;28390:7;:16;28398:7;28390:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28454:7;28450:2;28429:33;;28446:1;28429:33;;;;;;;;;;;;28088:382;;:::o;7984:422::-;8044:4;8252:12;8363:7;8351:20;8343:28;;8397:1;8390:4;:8;8383:15;;;7984:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:256::-;;4986:2;4974:9;4965:7;4961:23;4957:32;4954:2;;;5002:1;4999;4992:12;4954:2;5045:1;5070:50;5112:7;5103:6;5092:9;5088:22;5070:50;:::i;:::-;5060:60;;5016:114;4944:193;;;;:::o;5143:260::-;;5250:2;5238:9;5229:7;5225:23;5221:32;5218:2;;;5266:1;5263;5256:12;5218:2;5309:1;5334:52;5378:7;5369:6;5358:9;5354:22;5334:52;:::i;:::-;5324:62;;5280:116;5208:195;;;;:::o;5409:282::-;;5527:2;5515:9;5506:7;5502:23;5498:32;5495:2;;;5543:1;5540;5533:12;5495:2;5586:1;5611:63;5666:7;5657:6;5646:9;5642:22;5611:63;:::i;:::-;5601:73;;5557:127;5485:206;;;;:::o;5697:375::-;;5815:2;5803:9;5794:7;5790:23;5786:32;5783:2;;;5831:1;5828;5821:12;5783:2;5902:1;5891:9;5887:17;5874:31;5932:18;5924:6;5921:30;5918:2;;;5964:1;5961;5954:12;5918:2;5992:63;6047:7;6038:6;6027:9;6023:22;5992:63;:::i;:::-;5982:73;;5845:220;5773:299;;;;:::o;6078:262::-;;6186:2;6174:9;6165:7;6161:23;6157:32;6154:2;;;6202:1;6199;6192:12;6154:2;6245:1;6270:53;6315:7;6306:6;6295:9;6291:22;6270:53;:::i;:::-;6260:63;;6216:117;6144:196;;;;:::o;6346:118::-;6433:24;6451:5;6433:24;:::i;:::-;6428:3;6421:37;6411:53;;:::o;6470:109::-;6551:21;6566:5;6551:21;:::i;:::-;6546:3;6539:34;6529:50;;:::o;6585:360::-;;6699:38;6731:5;6699:38;:::i;:::-;6753:70;6816:6;6811:3;6753:70;:::i;:::-;6746:77;;6832:52;6877:6;6872:3;6865:4;6858:5;6854:16;6832:52;:::i;:::-;6909:29;6931:6;6909:29;:::i;:::-;6904:3;6900:39;6893:46;;6675:270;;;;;:::o;6951:364::-;;7067:39;7100:5;7067:39;:::i;:::-;7122:71;7186:6;7181:3;7122:71;:::i;:::-;7115:78;;7202:52;7247:6;7242:3;7235:4;7228:5;7224:16;7202:52;:::i;:::-;7279:29;7301:6;7279:29;:::i;:::-;7274:3;7270:39;7263:46;;7043:272;;;;;:::o;7321:377::-;;7455:39;7488:5;7455:39;:::i;:::-;7510:89;7592:6;7587:3;7510:89;:::i;:::-;7503:96;;7608:52;7653:6;7648:3;7641:4;7634:5;7630:16;7608:52;:::i;:::-;7685:6;7680:3;7676:16;7669:23;;7431:267;;;;;:::o;7704:375::-;;7867:67;7931:2;7926:3;7867:67;:::i;:::-;7860:74;;7964:34;7960:1;7955:3;7951:11;7944:55;8030:13;8025:2;8020:3;8016:12;8009:35;8070:2;8065:3;8061:12;8054:19;;7850:229;;;:::o;8085:382::-;;8248:67;8312:2;8307:3;8248:67;:::i;:::-;8241:74;;8345:34;8341:1;8336:3;8332:11;8325:55;8411:20;8406:2;8401:3;8397:12;8390:42;8458:2;8453:3;8449:12;8442:19;;8231:236;;;:::o;8473:318::-;;8636:67;8700:2;8695:3;8636:67;:::i;:::-;8629:74;;8733:22;8729:1;8724:3;8720:11;8713:43;8782:2;8777:3;8773:12;8766:19;;8619:172;;;:::o;8797:370::-;;8960:67;9024:2;9019:3;8960:67;:::i;:::-;8953:74;;9057:34;9053:1;9048:3;9044:11;9037:55;9123:8;9118:2;9113:3;9109:12;9102:30;9158:2;9153:3;9149:12;9142:19;;8943:224;;;:::o;9173:326::-;;9336:67;9400:2;9395:3;9336:67;:::i;:::-;9329:74;;9433:30;9429:1;9424:3;9420:11;9413:51;9490:2;9485:3;9481:12;9474:19;;9319:180;;;:::o;9505:368::-;;9668:67;9732:2;9727:3;9668:67;:::i;:::-;9661:74;;9765:34;9761:1;9756:3;9752:11;9745:55;9831:6;9826:2;9821:3;9817:12;9810:28;9864:2;9859:3;9855:12;9848:19;;9651:222;;;:::o;9879:323::-;;10042:67;10106:2;10101:3;10042:67;:::i;:::-;10035:74;;10139:27;10135:1;10130:3;10126:11;10119:48;10193:2;10188:3;10184:12;10177:19;;10025:177;;;:::o;10208:313::-;;10371:67;10435:2;10430:3;10371:67;:::i;:::-;10364:74;;10468:17;10464:1;10459:3;10455:11;10448:38;10512:2;10507:3;10503:12;10496:19;;10354:167;;;:::o;10527:376::-;;10690:67;10754:2;10749:3;10690:67;:::i;:::-;10683:74;;10787:34;10783:1;10778:3;10774:11;10767:55;10853:14;10848:2;10843:3;10839:12;10832:36;10894:2;10889:3;10885:12;10878:19;;10673:230;;;:::o;10909:388::-;;11072:67;11136:2;11131:3;11072:67;:::i;:::-;11065:74;;11169:34;11165:1;11160:3;11156:11;11149:55;11235:26;11230:2;11225:3;11221:12;11214:48;11288:2;11283:3;11279:12;11272:19;;11055:242;;;:::o;11303:374::-;;11466:67;11530:2;11525:3;11466:67;:::i;:::-;11459:74;;11563:34;11559:1;11554:3;11550:11;11543:55;11629:12;11624:2;11619:3;11615:12;11608:34;11668:2;11663:3;11659:12;11652:19;;11449:228;;;:::o;11683:373::-;;11846:67;11910:2;11905:3;11846:67;:::i;:::-;11839:74;;11943:34;11939:1;11934:3;11930:11;11923:55;12009:11;12004:2;11999:3;11995:12;11988:33;12047:2;12042:3;12038:12;12031:19;;11829:227;;;:::o;12062:330::-;;12225:67;12289:2;12284:3;12225:67;:::i;:::-;12218:74;;12322:34;12318:1;12313:3;12309:11;12302:55;12383:2;12378:3;12374:12;12367:19;;12208:184;;;:::o;12398:376::-;;12561:67;12625:2;12620:3;12561:67;:::i;:::-;12554:74;;12658:34;12654:1;12649:3;12645:11;12638:55;12724:14;12719:2;12714:3;12710:12;12703:36;12765:2;12760:3;12756:12;12749:19;;12544:230;;;:::o;12780:330::-;;12943:67;13007:2;13002:3;12943:67;:::i;:::-;12936:74;;13040:34;13036:1;13031:3;13027:11;13020:55;13101:2;13096:3;13092:12;13085:19;;12926:184;;;:::o;13116:373::-;;13279:67;13343:2;13338:3;13279:67;:::i;:::-;13272:74;;13376:34;13372:1;13367:3;13363:11;13356:55;13442:11;13437:2;13432:3;13428:12;13421:33;13480:2;13475:3;13471:12;13464:19;;13262:227;;;:::o;13495:379::-;;13658:67;13722:2;13717:3;13658:67;:::i;:::-;13651:74;;13755:34;13751:1;13746:3;13742:11;13735:55;13821:17;13816:2;13811:3;13807:12;13800:39;13865:2;13860:3;13856:12;13849:19;;13641:233;;;:::o;13880:315::-;;14043:67;14107:2;14102:3;14043:67;:::i;:::-;14036:74;;14140:19;14136:1;14131:3;14127:11;14120:40;14186:2;14181:3;14177:12;14170:19;;14026:169;;;:::o;14201:365::-;;14364:67;14428:2;14423:3;14364:67;:::i;:::-;14357:74;;14461:34;14457:1;14452:3;14448:11;14441:55;14527:3;14522:2;14517:3;14513:12;14506:25;14557:2;14552:3;14548:12;14541:19;;14347:219;;;:::o;14572:381::-;;14735:67;14799:2;14794:3;14735:67;:::i;:::-;14728:74;;14832:34;14828:1;14823:3;14819:11;14812:55;14898:19;14893:2;14888:3;14884:12;14877:41;14944:2;14939:3;14935:12;14928:19;;14718:235;;;:::o;14959:376::-;;15122:67;15186:2;15181:3;15122:67;:::i;:::-;15115:74;;15219:34;15215:1;15210:3;15206:11;15199:55;15285:14;15280:2;15275:3;15271:12;15264:36;15326:2;15321:3;15317:12;15310:19;;15105:230;;;:::o;15341:323::-;;15504:67;15568:2;15563:3;15504:67;:::i;:::-;15497:74;;15601:27;15597:1;15592:3;15588:11;15581:48;15655:2;15650:3;15646:12;15639:19;;15487:177;;;:::o;15670:118::-;15757:24;15775:5;15757:24;:::i;:::-;15752:3;15745:37;15735:53;;:::o;15794:435::-;;15996:95;16087:3;16078:6;15996:95;:::i;:::-;15989:102;;16108:95;16199:3;16190:6;16108:95;:::i;:::-;16101:102;;16220:3;16213:10;;15978:251;;;;;:::o;16235:222::-;;16366:2;16355:9;16351:18;16343:26;;16379:71;16447:1;16436:9;16432:17;16423:6;16379:71;:::i;:::-;16333:124;;;;:::o;16463:640::-;;16696:3;16685:9;16681:19;16673:27;;16710:71;16778:1;16767:9;16763:17;16754:6;16710:71;:::i;:::-;16791:72;16859:2;16848:9;16844:18;16835:6;16791:72;:::i;:::-;16873;16941:2;16930:9;16926:18;16917:6;16873:72;:::i;:::-;16992:9;16986:4;16982:20;16977:2;16966:9;16962:18;16955:48;17020:76;17091:4;17082:6;17020:76;:::i;:::-;17012:84;;16663:440;;;;;;;:::o;17109:210::-;;17234:2;17223:9;17219:18;17211:26;;17247:65;17309:1;17298:9;17294:17;17285:6;17247:65;:::i;:::-;17201:118;;;;:::o;17325:313::-;;17476:2;17465:9;17461:18;17453:26;;17525:9;17519:4;17515:20;17511:1;17500:9;17496:17;17489:47;17553:78;17626:4;17617:6;17553:78;:::i;:::-;17545:86;;17443:195;;;;:::o;17644:419::-;;17848:2;17837:9;17833:18;17825:26;;17897:9;17891:4;17887:20;17883:1;17872:9;17868:17;17861:47;17925:131;18051:4;17925:131;:::i;:::-;17917:139;;17815:248;;;:::o;18069:419::-;;18273:2;18262:9;18258:18;18250:26;;18322:9;18316:4;18312:20;18308:1;18297:9;18293:17;18286:47;18350:131;18476:4;18350:131;:::i;:::-;18342:139;;18240:248;;;:::o;18494:419::-;;18698:2;18687:9;18683:18;18675:26;;18747:9;18741:4;18737:20;18733:1;18722:9;18718:17;18711:47;18775:131;18901:4;18775:131;:::i;:::-;18767:139;;18665:248;;;:::o;18919:419::-;;19123:2;19112:9;19108:18;19100:26;;19172:9;19166:4;19162:20;19158:1;19147:9;19143:17;19136:47;19200:131;19326:4;19200:131;:::i;:::-;19192:139;;19090:248;;;:::o;19344:419::-;;19548:2;19537:9;19533:18;19525:26;;19597:9;19591:4;19587:20;19583:1;19572:9;19568:17;19561:47;19625:131;19751:4;19625:131;:::i;:::-;19617:139;;19515:248;;;:::o;19769:419::-;;19973:2;19962:9;19958:18;19950:26;;20022:9;20016:4;20012:20;20008:1;19997:9;19993:17;19986:47;20050:131;20176:4;20050:131;:::i;:::-;20042:139;;19940:248;;;:::o;20194:419::-;;20398:2;20387:9;20383:18;20375:26;;20447:9;20441:4;20437:20;20433:1;20422:9;20418:17;20411:47;20475:131;20601:4;20475:131;:::i;:::-;20467:139;;20365:248;;;:::o;20619:419::-;;20823:2;20812:9;20808:18;20800:26;;20872:9;20866:4;20862:20;20858:1;20847:9;20843:17;20836:47;20900:131;21026:4;20900:131;:::i;:::-;20892:139;;20790:248;;;:::o;21044:419::-;;21248:2;21237:9;21233:18;21225:26;;21297:9;21291:4;21287:20;21283:1;21272:9;21268:17;21261:47;21325:131;21451:4;21325:131;:::i;:::-;21317:139;;21215:248;;;:::o;21469:419::-;;21673:2;21662:9;21658:18;21650:26;;21722:9;21716:4;21712:20;21708:1;21697:9;21693:17;21686:47;21750:131;21876:4;21750:131;:::i;:::-;21742:139;;21640:248;;;:::o;21894:419::-;;22098:2;22087:9;22083:18;22075:26;;22147:9;22141:4;22137:20;22133:1;22122:9;22118:17;22111:47;22175:131;22301:4;22175:131;:::i;:::-;22167:139;;22065:248;;;:::o;22319:419::-;;22523:2;22512:9;22508:18;22500:26;;22572:9;22566:4;22562:20;22558:1;22547:9;22543:17;22536:47;22600:131;22726:4;22600:131;:::i;:::-;22592:139;;22490:248;;;:::o;22744:419::-;;22948:2;22937:9;22933:18;22925:26;;22997:9;22991:4;22987:20;22983:1;22972:9;22968:17;22961:47;23025:131;23151:4;23025:131;:::i;:::-;23017:139;;22915:248;;;:::o;23169:419::-;;23373:2;23362:9;23358:18;23350:26;;23422:9;23416:4;23412:20;23408:1;23397:9;23393:17;23386:47;23450:131;23576:4;23450:131;:::i;:::-;23442:139;;23340:248;;;:::o;23594:419::-;;23798:2;23787:9;23783:18;23775:26;;23847:9;23841:4;23837:20;23833:1;23822:9;23818:17;23811:47;23875:131;24001:4;23875:131;:::i;:::-;23867:139;;23765:248;;;:::o;24019:419::-;;24223:2;24212:9;24208:18;24200:26;;24272:9;24266:4;24262:20;24258:1;24247:9;24243:17;24236:47;24300:131;24426:4;24300:131;:::i;:::-;24292:139;;24190:248;;;:::o;24444:419::-;;24648:2;24637:9;24633:18;24625:26;;24697:9;24691:4;24687:20;24683:1;24672:9;24668:17;24661:47;24725:131;24851:4;24725:131;:::i;:::-;24717:139;;24615:248;;;:::o;24869:419::-;;25073:2;25062:9;25058:18;25050:26;;25122:9;25116:4;25112:20;25108:1;25097:9;25093:17;25086:47;25150:131;25276:4;25150:131;:::i;:::-;25142:139;;25040:248;;;:::o;25294:419::-;;25498:2;25487:9;25483:18;25475:26;;25547:9;25541:4;25537:20;25533:1;25522:9;25518:17;25511:47;25575:131;25701:4;25575:131;:::i;:::-;25567:139;;25465:248;;;:::o;25719:419::-;;25923:2;25912:9;25908:18;25900:26;;25972:9;25966:4;25962:20;25958:1;25947:9;25943:17;25936:47;26000:131;26126:4;26000:131;:::i;:::-;25992:139;;25890:248;;;:::o;26144:419::-;;26348:2;26337:9;26333:18;26325:26;;26397:9;26391:4;26387:20;26383:1;26372:9;26368:17;26361:47;26425:131;26551:4;26425:131;:::i;:::-;26417:139;;26315:248;;;:::o;26569:419::-;;26773:2;26762:9;26758:18;26750:26;;26822:9;26816:4;26812:20;26808:1;26797:9;26793:17;26786:47;26850:131;26976:4;26850:131;:::i;:::-;26842:139;;26740:248;;;:::o;26994:222::-;;27125:2;27114:9;27110:18;27102:26;;27138:71;27206:1;27195:9;27191:17;27182:6;27138:71;:::i;:::-;27092:124;;;;:::o;27222:283::-;;27288:2;27282:9;27272:19;;27330:4;27322:6;27318:17;27437:6;27425:10;27422:22;27401:18;27389:10;27386:34;27383:62;27380:2;;;27448:18;;:::i;:::-;27380:2;27488:10;27484:2;27477:22;27262:243;;;;:::o;27511:331::-;;27662:18;27654:6;27651:30;27648:2;;;27684:18;;:::i;:::-;27648:2;27769:4;27765:9;27758:4;27750:6;27746:17;27742:33;27734:41;;27830:4;27824;27820:15;27812:23;;27577:265;;;:::o;27848:332::-;;28000:18;27992:6;27989:30;27986:2;;;28022:18;;:::i;:::-;27986:2;28107:4;28103:9;28096:4;28088:6;28084:17;28080:33;28072:41;;28168:4;28162;28158:15;28150:23;;27915:265;;;:::o;28186:98::-;;28271:5;28265:12;28255:22;;28244:40;;;:::o;28290:99::-;;28376:5;28370:12;28360:22;;28349:40;;;:::o;28395:168::-;;28512:6;28507:3;28500:19;28552:4;28547:3;28543:14;28528:29;;28490:73;;;;:::o;28569:169::-;;28687:6;28682:3;28675:19;28727:4;28722:3;28718:14;28703:29;;28665:73;;;;:::o;28744:148::-;;28883:3;28868:18;;28858:34;;;;:::o;28898:305::-;;28957:20;28975:1;28957:20;:::i;:::-;28952:25;;28991:20;29009:1;28991:20;:::i;:::-;28986:25;;29145:1;29077:66;29073:74;29070:1;29067:81;29064:2;;;29151:18;;:::i;:::-;29064:2;29195:1;29192;29188:9;29181:16;;28942:261;;;;:::o;29209:185::-;;29266:20;29284:1;29266:20;:::i;:::-;29261:25;;29300:20;29318:1;29300:20;:::i;:::-;29295:25;;29339:1;29329:2;;29344:18;;:::i;:::-;29329:2;29386:1;29383;29379:9;29374:14;;29251:143;;;;:::o;29400:191::-;;29460:20;29478:1;29460:20;:::i;:::-;29455:25;;29494:20;29512:1;29494:20;:::i;:::-;29489:25;;29533:1;29530;29527:8;29524:2;;;29538:18;;:::i;:::-;29524:2;29583:1;29580;29576:9;29568:17;;29445:146;;;;:::o;29597:96::-;;29663:24;29681:5;29663:24;:::i;:::-;29652:35;;29642:51;;;:::o;29699:90::-;;29776:5;29769:13;29762:21;29751:32;;29741:48;;;:::o;29795:149::-;;29871:66;29864:5;29860:78;29849:89;;29839:105;;;:::o;29950:126::-;;30027:42;30020:5;30016:54;30005:65;;29995:81;;;:::o;30082:77::-;;30148:5;30137:16;;30127:32;;;:::o;30165:154::-;30249:6;30244:3;30239;30226:30;30311:1;30302:6;30297:3;30293:16;30286:27;30216:103;;;:::o;30325:307::-;30393:1;30403:113;30417:6;30414:1;30411:13;30403:113;;;30502:1;30497:3;30493:11;30487:18;30483:1;30478:3;30474:11;30467:39;30439:2;30436:1;30432:10;30427:15;;30403:113;;;30534:6;30531:1;30528:13;30525:2;;;30614:1;30605:6;30600:3;30596:16;30589:27;30525:2;30374:258;;;;:::o;30638:320::-;;30719:1;30713:4;30709:12;30699:22;;30766:1;30760:4;30756:12;30787:18;30777:2;;30843:4;30835:6;30831:17;30821:27;;30777:2;30905;30897:6;30894:14;30874:18;30871:38;30868:2;;;30924:18;;:::i;:::-;30868:2;30689:269;;;;:::o;30964:233::-;;31026:24;31044:5;31026:24;:::i;:::-;31017:33;;31072:66;31065:5;31062:77;31059:2;;;31142:18;;:::i;:::-;31059:2;31189:1;31182:5;31178:13;31171:20;;31007:190;;;:::o;31203:176::-;;31252:20;31270:1;31252:20;:::i;:::-;31247:25;;31286:20;31304:1;31286:20;:::i;:::-;31281:25;;31325:1;31315:2;;31330:18;;:::i;:::-;31315:2;31371:1;31368;31364:9;31359:14;;31237:142;;;;:::o;31385:180::-;31433:77;31430:1;31423:88;31530:4;31527:1;31520:15;31554:4;31551:1;31544:15;31571:180;31619:77;31616:1;31609:88;31716:4;31713:1;31706:15;31740:4;31737:1;31730:15;31757:180;31805:77;31802:1;31795:88;31902:4;31899:1;31892:15;31926:4;31923:1;31916:15;31943:180;31991:77;31988:1;31981:88;32088:4;32085:1;32078:15;32112:4;32109:1;32102:15;32129:102;;32221:2;32217:7;32212:2;32205:5;32201:14;32197:28;32187:38;;32177:54;;;:::o;32237:122::-;32310:24;32328:5;32310:24;:::i;:::-;32303:5;32300:35;32290:2;;32349:1;32346;32339:12;32290:2;32280:79;:::o;32365:116::-;32435:21;32450:5;32435:21;:::i;:::-;32428:5;32425:32;32415:2;;32471:1;32468;32461:12;32415:2;32405:76;:::o;32487:120::-;32559:23;32576:5;32559:23;:::i;:::-;32552:5;32549:34;32539:2;;32597:1;32594;32587:12;32539:2;32529:78;:::o;32613:122::-;32686:24;32704:5;32686:24;:::i;:::-;32679:5;32676:35;32666:2;;32725:1;32722;32715:12;32666:2;32656:79;:::o

Swarm Source

ipfs://91f5bdcdc8d994116f42579a968dbaf04405a15b3ae5b152f0fbb81e2449ba87
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.