ETH Price: $2,571.87 (+0.67%)

Token

ChillRx (CLRX)
 

Overview

Max Total Supply

0 CLRX

Holders

3,127

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 CLRX
0x09cf4b997293fad670c65d2ae215fcbd8a9d6f2f
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

ChillRx is his next-gen artist ecosystem, web3 record label, and music NFT alpha club for everyone from creatives to collectors.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ChillRx

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-18
*/

// Sources flattened with hardhat v2.8.1 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

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

pragma solidity ^0.8.0;

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

// File @openzeppelin/contracts/token/ERC721/[email protected]

// OpenZeppelin Contracts v4.4.1 (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/[email protected]

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

pragma solidity ^0.8.0;

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

// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

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

pragma solidity ^0.8.0;

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

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

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

// File @openzeppelin/contracts/utils/[email protected]

// OpenZeppelin Contracts v4.4.1 (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;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.0;

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

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

// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.0;

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

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

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

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

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

// File @openzeppelin/contracts/utils/introspection/[email protected]

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

pragma solidity ^0.8.0;

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

// File @openzeppelin/contracts/token/ERC721/[email protected]

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

pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File @openzeppelin/contracts/access/[email protected]

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.0;

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

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

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

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

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

// File @openzeppelin/contracts/utils/cryptography/[email protected]

// OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

// File contracts/ChillRx.sol

pragma solidity ^0.8.4;

contract ChillRx is ERC721, Ownable {
    using Counters for Counters.Counter;
    using Strings for uint256;
    using ECDSA for bytes32;

    string public PROVENANCE;
    string public chillRxUnrevealed;
    bool public isSaleActive = false;
    bool public isRevealed = false;
    bool public isPresaleActive = false;
    bool public isMintPassExchangeEnabled = true;
    Counters.Counter public tokenMintedFromOrigin;
    uint256 public STARTING_INDEX = 0;

    address private signerAddress;
    address private fundReceiver;
    address private mintPassContractAddress;
    string private crxCollectionBaseUri;
    mapping(address => uint256) public presaleMinters;

    uint256 public constant MAX_SUPPLY = 9848;
    uint256 public constant MINTPASS_AMOUNT = 151;
    uint256 public constant ALLOWED_TOKEN_PER_TX = 10;
    uint256 public constant PRICE_PER_TOKEN = 0.0808 ether;

    constructor(address _signerAddress, address _fundReceiver)
        ERC721("ChillRx", "CLRX")
    {
        signerAddress = _signerAddress;
        fundReceiver = _fundReceiver;
    }

    modifier onlyFundReceiver() {
        require(msg.sender == fundReceiver);
        _;
    }

    modifier onlyValidAccess(bytes memory _signature, string memory _saletype) {
        require(
            isValidAccessMessage(_signature, _saletype),
            "Invalid Access Signature"
        );
        _;
    }

    function setStartingIndex(uint256 _STARTING_INDEX) external onlyOwner {
        STARTING_INDEX = _STARTING_INDEX + MINTPASS_AMOUNT;
    }

    function setChillRxUnrevealed(string calldata _chillRxUnrevealed)
        external
        onlyOwner
    {
        chillRxUnrevealed = _chillRxUnrevealed;
    }

    function setMintPassContractAddress(address _newContractAddress)
        external
        onlyOwner
    {
        mintPassContractAddress = _newContractAddress;
    }

    function setCrxCollectionBaseUri(string calldata _crxCollectionBaseUri)
        external
        onlyOwner
    {
        crxCollectionBaseUri = _crxCollectionBaseUri;
    }

    function setProvenance(string calldata provenance) external onlyOwner {
        PROVENANCE = provenance;
    }

    function toggleIsMintPassExchangeEnabled() external onlyOwner {
        isMintPassExchangeEnabled = !isMintPassExchangeEnabled;
    }

    function toggleIsPresaleActive() external onlyOwner {
        isPresaleActive = !isPresaleActive;
    }

    function toggleIsSaleActive() external onlyOwner {
        isSaleActive = !isSaleActive;
    }

    function toggleIsRevealed() external onlyOwner {
        isRevealed = !isRevealed;
    }

    function isValidAccessMessage(
        bytes memory _signature,
        string memory _saletype
    ) private view returns (bool) {
        bytes32 messagehash = keccak256(
            abi.encodePacked(address(this), msg.sender, _saletype)
        );

        address revealedSignerAddress = messagehash
            .toEthSignedMessageHash()
            .recover(_signature);

        return signerAddress == revealedSignerAddress;
    }

    function getRealId(uint256 _originalId) private pure returns (uint256) {
        return _originalId % (MAX_SUPPLY + MINTPASS_AMOUNT);
    }

    function increaseNextTokenId() private returns (uint256) {
        tokenMintedFromOrigin.increment();

        return getRealId(tokenMintedFromOrigin.current() - 1 + STARTING_INDEX);
    }

    function reserve(address[] memory _recipients, uint256[] memory _amounts)
        external
        onlyOwner
    {
        require(
            _recipients.length == _amounts.length,
            "RESERVE: arrays have different lengths"
        );

        for (uint256 j = 0; j < _recipients.length; j++) {
            for (uint256 k = 0; k < _amounts[j]; k++) {
                _safeMint(_recipients[j], increaseNextTokenId());
            }
        }
    }

    function compareStrings(string memory a, string memory b)
        private
        pure
        returns (bool)
    {
        return (keccak256(abi.encodePacked((a))) ==
            keccak256(abi.encodePacked((b))));
    }

    function checkAllowedTokenNumberAndAddToMap(
        string memory _saletype,
        uint256 _numberOfTokensToMint
    ) private {
        require(
            compareStrings(_saletype, "WL") || compareStrings(_saletype, "OG"),
            "Presale: Invalid presale type"
        );

        uint256 tokenMintLimit = (compareStrings(_saletype, "WL")) ? 2 : 3;
        require(
            presaleMinters[msg.sender] + _numberOfTokensToMint <=
                tokenMintLimit,
            "Presale: Authorized limit exceeded"
        );
        presaleMinters[msg.sender] =
            presaleMinters[msg.sender] +
            _numberOfTokensToMint;
    }

    function presaleMint(
        uint256 _numberOfTokensToMint,
        bytes memory _signature,
        string memory _saletype
    ) external payable onlyValidAccess(_signature, _saletype) {
        require(isPresaleActive, "PRESALE: presale is inactive");

        require(
            tokenMintedFromOrigin.current() + _numberOfTokensToMint <=
                MAX_SUPPLY,
            "Purchase would exceed max tokens"
        );

        require(
            PRICE_PER_TOKEN * _numberOfTokensToMint <= msg.value,
            "PRESALE: Ether value sent is incorrect"
        );

        checkAllowedTokenNumberAndAddToMap(_saletype, _numberOfTokensToMint);

        for (uint256 i = 0; i < _numberOfTokensToMint; i++) {
            _safeMint(msg.sender, increaseNextTokenId());
        }
    }

    function mint(uint256 _numberOfTokens, address _receiverAddress)
        external
        payable
    {
        require(isSaleActive, "MintError: Sale is inactive");
        require(
            _numberOfTokens <= ALLOWED_TOKEN_PER_TX,
            "MintError: Max tokens per transaction exceeded"
        );
        require(
            tokenMintedFromOrigin.current() + _numberOfTokens <= MAX_SUPPLY,
            "MintError: Purchase would exceed max tokens"
        );
        require(
            PRICE_PER_TOKEN * _numberOfTokens <= msg.value,
            "MintError: Ether value sent is incorrect"
        );
        for (uint256 i = 0; i < _numberOfTokens; i++) {
            _safeMint(_receiverAddress, increaseNextTokenId());
        }
    }

    function airdropTokenExchange(address _receiver, uint256 _passid)
        external
        returns (uint256)
    {
        require(
            msg.sender == mintPassContractAddress,
            "Token Exchange: Unauthorized"
        );

        require(
            isMintPassExchangeEnabled == true,
            "Token Exchange is inactive"
        );

        require(
            _passid > 0 && _passid <= MINTPASS_AMOUNT,
            "Token Exchange: pass id out of range"
        );

        uint256 mintedId = getRealId(
            STARTING_INDEX + _passid - MINTPASS_AMOUNT - 1
        );
        _safeMint(_receiver, mintedId);

        return mintedId;
    }

    function withdraw() external onlyFundReceiver {
        payable(fundReceiver).transfer(address(this).balance);
    }

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

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(_exists(tokenId), "tokenURI: URI query for nonexistent token");
        string memory baseURI = _baseURI();
        if (isRevealed == false || bytes(baseURI).length == 0) {
            return chillRxUnrevealed;
        }

        return string(abi.encodePacked(baseURI, tokenId.toString()));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_signerAddress","type":"address"},{"internalType":"address","name":"_fundReceiver","type":"address"}],"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":"ALLOWED_TOKEN_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTPASS_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PER_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STARTING_INDEX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_passid","type":"uint256"}],"name":"airdropTokenExchange","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chillRxUnrevealed","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintPassExchangeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numberOfTokens","type":"uint256"},{"internalType":"address","name":"_receiverAddress","type":"address"}],"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":[{"internalType":"uint256","name":"_numberOfTokensToMint","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"string","name":"_saletype","type":"string"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleMinters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"reserve","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":"_chillRxUnrevealed","type":"string"}],"name":"setChillRxUnrevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_crxCollectionBaseUri","type":"string"}],"name":"setCrxCollectionBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newContractAddress","type":"address"}],"name":"setMintPassContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenance","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_STARTING_INDEX","type":"uint256"}],"name":"setStartingIndex","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":[],"name":"toggleIsMintPassExchangeEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleIsPresaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleIsRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleIsSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenMintedFromOrigin","outputs":[{"internalType":"uint256","name":"_value","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":[{"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":"nonpayable","type":"function"}]

60806040526009805463ffffffff191663010000001790556000600b553480156200002957600080fd5b50604051620030e2380380620030e28339810160408190526200004c9162000215565b6040805180820182526007815266086d0d2d8d8a4f60cb1b60208083019182528351808501909452600484526308698a4b60e31b908401528151919291620000979160009162000152565b508051620000ad90600190602084019062000152565b505050620000ca620000c4620000fc60201b60201c565b62000100565b600c80546001600160a01b039384166001600160a01b031991821617909155600d80549290931691161790556200028a565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000160906200024d565b90600052602060002090601f016020900481019282620001845760008555620001cf565b82601f106200019f57805160ff1916838001178555620001cf565b82800160010185558215620001cf579182015b82811115620001cf578251825591602001919060010190620001b2565b50620001dd929150620001e1565b5090565b5b80821115620001dd5760008155600101620001e2565b80516001600160a01b03811681146200021057600080fd5b919050565b600080604083850312156200022957600080fd5b6200023483620001f8565b91506200024460208401620001f8565b90509250929050565b600181811c908216806200026257607f821691505b602082108114156200028457634e487b7160e01b600052602260045260246000fd5b50919050565b612e48806200029a6000396000f3fe60806040526004361061025c5760003560e01c806369e1cac1116101445780639d6be997116100b6578063d38dc1551161007a578063d38dc155146106a6578063e985e9c5146106c6578063ea4bb53d1461070f578063f2fde38b14610724578063f7de95e414610744578063ffe630b51461075a57600080fd5b80639d6be99714610613578063a22cb46514610626578063afed00a614610646578063b88d4fde14610666578063c87b56dd1461068657600080fd5b8063833b949911610108578063833b94991461057c57806384381b9d1461059857806388f2ebcb146105ad5780638da5cb5b146105cd57806394bf804d146105eb57806395d89b41146105fe57600080fd5b806369e1cac1146104fb57806370a082311461051b578063715018a61461053b578063717f47a3146105505780637aa579de1461056557600080fd5b806332cb6b0c116101dd57806354214f69116101a157806354214f691461044d578063564566a81461046c5780635a5944fb1461048657806360d938dc146104a65780636352211e146104c65780636373a6b1146104e657600080fd5b806332cb6b0c146103d857806336de00dc146103ee5780633ccfd60b1461040357806342842e0e146104185780634a0f30921461043857600080fd5b80630eb346a9116102245780630eb346a91461034d5780631609078d1461036d5780631eb5b9431461038e57806321b80420146103a357806323b872dd146103b857600080fd5b806301ffc9a71461026157806304384e971461029657806306fdde03146102d1578063081812fc146102f3578063095ea7b31461032b575b600080fd5b34801561026d57600080fd5b5061028161027c3660046125f2565b61077a565b60405190151581526020015b60405180910390f35b3480156102a257600080fd5b506102c36102b136600461262b565b60106020526000908152604090205481565b60405190815260200161028d565b3480156102dd57600080fd5b506102e66107cc565b60405161028d919061269e565b3480156102ff57600080fd5b5061031361030e3660046126b1565b61085e565b6040516001600160a01b03909116815260200161028d565b34801561033757600080fd5b5061034b6103463660046126ca565b6108f8565b005b34801561035957600080fd5b5061034b61036836600461262b565b610a0e565b34801561037957600080fd5b50600954610281906301000000900460ff1681565b34801561039a57600080fd5b506102c3609781565b3480156103af57600080fd5b5061034b610a5a565b3480156103c457600080fd5b5061034b6103d33660046126f4565b610aa1565b3480156103e457600080fd5b506102c361267881565b3480156103fa57600080fd5b506102c3600a81565b34801561040f57600080fd5b5061034b610ad2565b34801561042457600080fd5b5061034b6104333660046126f4565b610b25565b34801561044457600080fd5b5061034b610b40565b34801561045957600080fd5b5060095461028190610100900460ff1681565b34801561047857600080fd5b506009546102819060ff1681565b34801561049257600080fd5b5061034b6104a1366004612730565b610b89565b3480156104b257600080fd5b506009546102819062010000900460ff1681565b3480156104d257600080fd5b506103136104e13660046126b1565b610bbf565b3480156104f257600080fd5b506102e6610c36565b34801561050757600080fd5b5061034b610516366004612878565b610cc4565b34801561052757600080fd5b506102c361053636600461262b565b610dcd565b34801561054757600080fd5b5061034b610e54565b34801561055c57600080fd5b506102e6610e8a565b34801561057157600080fd5b50600a546102c39081565b34801561058857600080fd5b506102c367011f0f2c01da000081565b3480156105a457600080fd5b5061034b610e97565b3480156105b957600080fd5b5061034b6105c83660046126b1565b610ed5565b3480156105d957600080fd5b506006546001600160a01b0316610313565b61034b6105f9366004612938565b610f10565b34801561060a57600080fd5b506102e66110de565b61034b6106213660046129dc565b6110ed565b34801561063257600080fd5b5061034b610641366004612a5d565b6112ad565b34801561065257600080fd5b5061034b610661366004612730565b6112bc565b34801561067257600080fd5b5061034b610681366004612a99565b6112f2565b34801561069257600080fd5b506102e66106a13660046126b1565b61132a565b3480156106b257600080fd5b506102c36106c13660046126ca565b611490565b3480156106d257600080fd5b506102816106e1366004612b01565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561071b57600080fd5b5061034b6115f7565b34801561073057600080fd5b5061034b61073f36600461262b565b611642565b34801561075057600080fd5b506102c3600b5481565b34801561076657600080fd5b5061034b610775366004612730565b6116da565b60006001600160e01b031982166380ac58cd60e01b14806107ab57506001600160e01b03198216635b5e139f60e01b145b806107c657506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546107db90612b2b565b80601f016020809104026020016040519081016040528092919081815260200182805461080790612b2b565b80156108545780601f1061082957610100808354040283529160200191610854565b820191906000526020600020905b81548152906001019060200180831161083757829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108dc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061090382610bbf565b9050806001600160a01b0316836001600160a01b031614156109715760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108d3565b336001600160a01b038216148061098d575061098d81336106e1565b6109ff5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108d3565b610a098383611710565b505050565b6006546001600160a01b03163314610a385760405162461bcd60e51b81526004016108d390612b66565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b03163314610a845760405162461bcd60e51b81526004016108d390612b66565b6009805461ff001981166101009182900460ff1615909102179055565b610aab338261177e565b610ac75760405162461bcd60e51b81526004016108d390612b9b565b610a09838383611875565b600d546001600160a01b03163314610ae957600080fd5b600d546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610b22573d6000803e3d6000fd5b50565b610a09838383604051806020016040528060008152506112f2565b6006546001600160a01b03163314610b6a5760405162461bcd60e51b81526004016108d390612b66565b6009805462ff0000198116620100009182900460ff1615909102179055565b6006546001600160a01b03163314610bb35760405162461bcd60e51b81526004016108d390612b66565b610a09600f8383612543565b6000818152600260205260408120546001600160a01b0316806107c65760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108d3565b60078054610c4390612b2b565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6f90612b2b565b8015610cbc5780601f10610c9157610100808354040283529160200191610cbc565b820191906000526020600020905b815481529060010190602001808311610c9f57829003601f168201915b505050505081565b6006546001600160a01b03163314610cee5760405162461bcd60e51b81526004016108d390612b66565b8051825114610d4e5760405162461bcd60e51b815260206004820152602660248201527f524553455256453a20617272617973206861766520646966666572656e74206c604482015265656e6774687360d01b60648201526084016108d3565b60005b8251811015610a095760005b828281518110610d6f57610d6f612bec565b6020026020010151811015610dba57610da8848381518110610d9357610d93612bec565b6020026020010151610da3611a15565b611a4f565b80610db281612c18565b915050610d5d565b5080610dc581612c18565b915050610d51565b60006001600160a01b038216610e385760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108d3565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610e7e5760405162461bcd60e51b81526004016108d390612b66565b610e886000611a69565b565b60088054610c4390612b2b565b6006546001600160a01b03163314610ec15760405162461bcd60e51b81526004016108d390612b66565b6009805460ff19811660ff90911615179055565b6006546001600160a01b03163314610eff5760405162461bcd60e51b81526004016108d390612b66565b610f0a609782612c33565b600b5550565b60095460ff16610f625760405162461bcd60e51b815260206004820152601b60248201527f4d696e744572726f723a2053616c6520697320696e616374697665000000000060448201526064016108d3565b600a821115610fca5760405162461bcd60e51b815260206004820152602e60248201527f4d696e744572726f723a204d617820746f6b656e7320706572207472616e736160448201526d18dd1a5bdb88195e18d95959195960921b60648201526084016108d3565b61267882610fd7600a5490565b610fe19190612c33565b11156110435760405162461bcd60e51b815260206004820152602b60248201527f4d696e744572726f723a20507572636861736520776f756c642065786365656460448201526a206d617820746f6b656e7360a81b60648201526084016108d3565b346110568367011f0f2c01da0000612c4b565b11156110b55760405162461bcd60e51b815260206004820152602860248201527f4d696e744572726f723a2045746865722076616c75652073656e7420697320696044820152671b98dbdc9c9958dd60c21b60648201526084016108d3565b60005b82811015610a09576110cc82610da3611a15565b806110d681612c18565b9150506110b8565b6060600180546107db90612b2b565b81816110f98282611abb565b6111455760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420416363657373205369676e6174757265000000000000000060448201526064016108d3565b60095462010000900460ff1661119d5760405162461bcd60e51b815260206004820152601c60248201527f50524553414c453a2070726573616c6520697320696e6163746976650000000060448201526064016108d3565b612678856111aa600a5490565b6111b49190612c33565b11156112025760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e7360448201526064016108d3565b346112158667011f0f2c01da0000612c4b565b11156112725760405162461bcd60e51b815260206004820152602660248201527f50524553414c453a2045746865722076616c75652073656e7420697320696e636044820152651bdc9c9958dd60d21b60648201526084016108d3565b61127c8386611b68565b60005b858110156112a55761129333610da3611a15565b8061129d81612c18565b91505061127f565b505050505050565b6112b8338383611ce4565b5050565b6006546001600160a01b031633146112e65760405162461bcd60e51b81526004016108d390612b66565b610a0960088383612543565b6112fc338361177e565b6113185760405162461bcd60e51b81526004016108d390612b9b565b61132484848484611db3565b50505050565b6000818152600260205260409020546060906001600160a01b03166113a35760405162461bcd60e51b815260206004820152602960248201527f746f6b656e5552493a2055524920717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108d3565b60006113ad611de6565b600954909150610100900460ff1615806113c657508051155b1561145e57600880546113d890612b2b565b80601f016020809104026020016040519081016040528092919081815260200182805461140490612b2b565b80156114515780601f1061142657610100808354040283529160200191611451565b820191906000526020600020905b81548152906001019060200180831161143457829003601f168201915b5050505050915050919050565b8061146884611df5565b604051602001611479929190612c6a565b604051602081830303815290604052915050919050565b600e546000906001600160a01b031633146114ed5760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e2045786368616e67653a20556e617574686f72697a65640000000060448201526064016108d3565b6009546301000000900460ff16151560011461154b5760405162461bcd60e51b815260206004820152601a60248201527f546f6b656e2045786368616e676520697320696e61637469766500000000000060448201526064016108d3565b60008211801561155c575060978211155b6115b45760405162461bcd60e51b8152602060048201526024808201527f546f6b656e2045786368616e67653a2070617373206964206f7574206f662072604482015263616e676560e01b60648201526084016108d3565b60006115e46001609785600b546115cb9190612c33565b6115d59190612c99565b6115df9190612c99565b611ef3565b90506115f08482611a4f565b9392505050565b6006546001600160a01b031633146116215760405162461bcd60e51b81526004016108d390612b66565b6009805463ff00000019811663010000009182900460ff1615909102179055565b6006546001600160a01b0316331461166c5760405162461bcd60e51b81526004016108d390612b66565b6001600160a01b0381166116d15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108d3565b610b2281611a69565b6006546001600160a01b031633146117045760405162461bcd60e51b81526004016108d390612b66565b610a0960078383612543565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061174582610bbf565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166117f75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108d3565b600061180283610bbf565b9050806001600160a01b0316846001600160a01b0316148061183d5750836001600160a01b03166118328461085e565b6001600160a01b0316145b8061186d57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661188882610bbf565b6001600160a01b0316146118f05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016108d3565b6001600160a01b0382166119525760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108d3565b61195d600082611710565b6001600160a01b0383166000908152600360205260408120805460019290611986908490612c99565b90915550506001600160a01b03821660009081526003602052604081208054600192906119b4908490612c33565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611a25600a80546001019055565b611a4a600b546001611a36600a5490565b611a409190612c99565b6115df9190612c33565b905090565b6112b8828260405180602001604052806000815250611f0c565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080303384604051602001611ad393929190612cb0565b6040516020818303038152906040528051906020012090506000611b4e85611b48846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90611f3f565b600c546001600160a01b0391821691161495945050505050565b611b8c826040518060400160405280600281526020016115d360f21b815250611f63565b80611bb65750611bb682604051806040016040528060028152602001614f4760f01b815250611f63565b611c025760405162461bcd60e51b815260206004820152601d60248201527f50726573616c653a20496e76616c69642070726573616c65207479706500000060448201526064016108d3565b6000611c28836040518060400160405280600281526020016115d360f21b815250611f63565b611c33576003611c36565b60025b3360009081526010602052604090205460ff9190911691508190611c5b908490612c33565b1115611cb45760405162461bcd60e51b815260206004820152602260248201527f50726573616c653a20417574686f72697a6564206c696d697420657863656564604482015261195960f21b60648201526084016108d3565b33600090815260106020526040902054611ccf908390612c33565b33600090815260106020526040902055505050565b816001600160a01b0316836001600160a01b03161415611d465760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108d3565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611dbe848484611875565b611dca84848484611fbc565b6113245760405162461bcd60e51b81526004016108d390612cf6565b6060600f80546107db90612b2b565b606081611e195750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e435780611e2d81612c18565b9150611e3c9050600a83612d5e565b9150611e1d565b60008167ffffffffffffffff811115611e5e57611e5e6127a2565b6040519080825280601f01601f191660200182016040528015611e88576020820181803683370190505b5090505b841561186d57611e9d600183612c99565b9150611eaa600a86612d72565b611eb5906030612c33565b60f81b818381518110611eca57611eca612bec565b60200101906001600160f81b031916908160001a905350611eec600a86612d5e565b9450611e8c565b6000611f026097612678612c33565b6107c69083612d72565b611f1683836120ba565b611f236000848484611fbc565b610a095760405162461bcd60e51b81526004016108d390612cf6565b6000806000611f4e85856121fc565b91509150611f5b8161226c565b509392505050565b600081604051602001611f769190612d86565b6040516020818303038152906040528051906020012083604051602001611f9d9190612d86565b6040516020818303038152906040528051906020012014905092915050565b60006001600160a01b0384163b156120af57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612000903390899088908890600401612da2565b6020604051808303816000875af192505050801561203b575060408051601f3d908101601f1916820190925261203891810190612ddf565b60015b612095573d808015612069576040519150601f19603f3d011682016040523d82523d6000602084013e61206e565b606091505b50805161208d5760405162461bcd60e51b81526004016108d390612cf6565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061186d565b506001949350505050565b6001600160a01b0382166121105760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108d3565b6000818152600260205260409020546001600160a01b0316156121755760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108d3565b6001600160a01b038216600090815260036020526040812080546001929061219e908490612c33565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000808251604114156122335760208301516040840151606085015160001a61222787828585612427565b94509450505050612265565b82516040141561225d5760208301516040840151612252868383612514565b935093505050612265565b506000905060025b9250929050565b600081600481111561228057612280612dfc565b14156122895750565b600181600481111561229d5761229d612dfc565b14156122eb5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108d3565b60028160048111156122ff576122ff612dfc565b141561234d5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108d3565b600381600481111561236157612361612dfc565b14156123ba5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016108d3565b60048160048111156123ce576123ce612dfc565b1415610b225760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016108d3565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561245e575060009050600361250b565b8460ff16601b1415801561247657508460ff16601c14155b15612487575060009050600461250b565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156124db573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166125045760006001925092505061250b565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161253587828885612427565b935093505050935093915050565b82805461254f90612b2b565b90600052602060002090601f01602090048101928261257157600085556125b7565b82601f1061258a5782800160ff198235161785556125b7565b828001600101855582156125b7579182015b828111156125b757823582559160200191906001019061259c565b506125c39291506125c7565b5090565b5b808211156125c357600081556001016125c8565b6001600160e01b031981168114610b2257600080fd5b60006020828403121561260457600080fd5b81356115f0816125dc565b80356001600160a01b038116811461262657600080fd5b919050565b60006020828403121561263d57600080fd5b6115f08261260f565b60005b83811015612661578181015183820152602001612649565b838111156113245750506000910152565b6000815180845261268a816020860160208601612646565b601f01601f19169290920160200192915050565b6020815260006115f06020830184612672565b6000602082840312156126c357600080fd5b5035919050565b600080604083850312156126dd57600080fd5b6126e68361260f565b946020939093013593505050565b60008060006060848603121561270957600080fd5b6127128461260f565b92506127206020850161260f565b9150604084013590509250925092565b6000806020838503121561274357600080fd5b823567ffffffffffffffff8082111561275b57600080fd5b818501915085601f83011261276f57600080fd5b81358181111561277e57600080fd5b86602082850101111561279057600080fd5b60209290920196919550909350505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156127e1576127e16127a2565b604052919050565b600067ffffffffffffffff821115612803576128036127a2565b5060051b60200190565b600082601f83011261281e57600080fd5b8135602061283361282e836127e9565b6127b8565b82815260059290921b8401810191818101908684111561285257600080fd5b8286015b8481101561286d5780358352918301918301612856565b509695505050505050565b6000806040838503121561288b57600080fd5b823567ffffffffffffffff808211156128a357600080fd5b818501915085601f8301126128b757600080fd5b813560206128c761282e836127e9565b82815260059290921b840181019181810190898411156128e657600080fd5b948201945b8386101561290b576128fc8661260f565b825294820194908201906128eb565b9650508601359250508082111561292157600080fd5b5061292e8582860161280d565b9150509250929050565b6000806040838503121561294b57600080fd5b8235915061295b6020840161260f565b90509250929050565b600067ffffffffffffffff83111561297e5761297e6127a2565b612991601f8401601f19166020016127b8565b90508281528383830111156129a557600080fd5b828260208301376000602084830101529392505050565b600082601f8301126129cd57600080fd5b6115f083833560208501612964565b6000806000606084860312156129f157600080fd5b83359250602084013567ffffffffffffffff80821115612a1057600080fd5b612a1c878388016129bc565b93506040860135915080821115612a3257600080fd5b508401601f81018613612a4457600080fd5b612a5386823560208401612964565b9150509250925092565b60008060408385031215612a7057600080fd5b612a798361260f565b915060208301358015158114612a8e57600080fd5b809150509250929050565b60008060008060808587031215612aaf57600080fd5b612ab88561260f565b9350612ac66020860161260f565b925060408501359150606085013567ffffffffffffffff811115612ae957600080fd5b612af5878288016129bc565b91505092959194509250565b60008060408385031215612b1457600080fd5b612b1d8361260f565b915061295b6020840161260f565b600181811c90821680612b3f57607f821691505b60208210811415612b6057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612c2c57612c2c612c02565b5060010190565b60008219821115612c4657612c46612c02565b500190565b6000816000190483118215151615612c6557612c65612c02565b500290565b60008351612c7c818460208801612646565b835190830190612c90818360208801612646565b01949350505050565b600082821015612cab57612cab612c02565b500390565b60006bffffffffffffffffffffffff19808660601b168352808560601b166014840152508251612ce7816028850160208701612646565b91909101602801949350505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612d6d57612d6d612d48565b500490565b600082612d8157612d81612d48565b500690565b60008251612d98818460208701612646565b9190910192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612dd590830184612672565b9695505050505050565b600060208284031215612df157600080fd5b81516115f0816125dc565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220a7034cbfc2c4ba41b0df41cfa38bc5d17c20da88fcc52971e0a7414e7ea68e2964736f6c634300080b003300000000000000000000000022087445743da772fde2ece88425ad9f52c078af0000000000000000000000007b311bdcf4dd8b86c0eba5656bf03b183f51d88d

Deployed Bytecode

0x60806040526004361061025c5760003560e01c806369e1cac1116101445780639d6be997116100b6578063d38dc1551161007a578063d38dc155146106a6578063e985e9c5146106c6578063ea4bb53d1461070f578063f2fde38b14610724578063f7de95e414610744578063ffe630b51461075a57600080fd5b80639d6be99714610613578063a22cb46514610626578063afed00a614610646578063b88d4fde14610666578063c87b56dd1461068657600080fd5b8063833b949911610108578063833b94991461057c57806384381b9d1461059857806388f2ebcb146105ad5780638da5cb5b146105cd57806394bf804d146105eb57806395d89b41146105fe57600080fd5b806369e1cac1146104fb57806370a082311461051b578063715018a61461053b578063717f47a3146105505780637aa579de1461056557600080fd5b806332cb6b0c116101dd57806354214f69116101a157806354214f691461044d578063564566a81461046c5780635a5944fb1461048657806360d938dc146104a65780636352211e146104c65780636373a6b1146104e657600080fd5b806332cb6b0c146103d857806336de00dc146103ee5780633ccfd60b1461040357806342842e0e146104185780634a0f30921461043857600080fd5b80630eb346a9116102245780630eb346a91461034d5780631609078d1461036d5780631eb5b9431461038e57806321b80420146103a357806323b872dd146103b857600080fd5b806301ffc9a71461026157806304384e971461029657806306fdde03146102d1578063081812fc146102f3578063095ea7b31461032b575b600080fd5b34801561026d57600080fd5b5061028161027c3660046125f2565b61077a565b60405190151581526020015b60405180910390f35b3480156102a257600080fd5b506102c36102b136600461262b565b60106020526000908152604090205481565b60405190815260200161028d565b3480156102dd57600080fd5b506102e66107cc565b60405161028d919061269e565b3480156102ff57600080fd5b5061031361030e3660046126b1565b61085e565b6040516001600160a01b03909116815260200161028d565b34801561033757600080fd5b5061034b6103463660046126ca565b6108f8565b005b34801561035957600080fd5b5061034b61036836600461262b565b610a0e565b34801561037957600080fd5b50600954610281906301000000900460ff1681565b34801561039a57600080fd5b506102c3609781565b3480156103af57600080fd5b5061034b610a5a565b3480156103c457600080fd5b5061034b6103d33660046126f4565b610aa1565b3480156103e457600080fd5b506102c361267881565b3480156103fa57600080fd5b506102c3600a81565b34801561040f57600080fd5b5061034b610ad2565b34801561042457600080fd5b5061034b6104333660046126f4565b610b25565b34801561044457600080fd5b5061034b610b40565b34801561045957600080fd5b5060095461028190610100900460ff1681565b34801561047857600080fd5b506009546102819060ff1681565b34801561049257600080fd5b5061034b6104a1366004612730565b610b89565b3480156104b257600080fd5b506009546102819062010000900460ff1681565b3480156104d257600080fd5b506103136104e13660046126b1565b610bbf565b3480156104f257600080fd5b506102e6610c36565b34801561050757600080fd5b5061034b610516366004612878565b610cc4565b34801561052757600080fd5b506102c361053636600461262b565b610dcd565b34801561054757600080fd5b5061034b610e54565b34801561055c57600080fd5b506102e6610e8a565b34801561057157600080fd5b50600a546102c39081565b34801561058857600080fd5b506102c367011f0f2c01da000081565b3480156105a457600080fd5b5061034b610e97565b3480156105b957600080fd5b5061034b6105c83660046126b1565b610ed5565b3480156105d957600080fd5b506006546001600160a01b0316610313565b61034b6105f9366004612938565b610f10565b34801561060a57600080fd5b506102e66110de565b61034b6106213660046129dc565b6110ed565b34801561063257600080fd5b5061034b610641366004612a5d565b6112ad565b34801561065257600080fd5b5061034b610661366004612730565b6112bc565b34801561067257600080fd5b5061034b610681366004612a99565b6112f2565b34801561069257600080fd5b506102e66106a13660046126b1565b61132a565b3480156106b257600080fd5b506102c36106c13660046126ca565b611490565b3480156106d257600080fd5b506102816106e1366004612b01565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561071b57600080fd5b5061034b6115f7565b34801561073057600080fd5b5061034b61073f36600461262b565b611642565b34801561075057600080fd5b506102c3600b5481565b34801561076657600080fd5b5061034b610775366004612730565b6116da565b60006001600160e01b031982166380ac58cd60e01b14806107ab57506001600160e01b03198216635b5e139f60e01b145b806107c657506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546107db90612b2b565b80601f016020809104026020016040519081016040528092919081815260200182805461080790612b2b565b80156108545780601f1061082957610100808354040283529160200191610854565b820191906000526020600020905b81548152906001019060200180831161083757829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108dc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061090382610bbf565b9050806001600160a01b0316836001600160a01b031614156109715760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108d3565b336001600160a01b038216148061098d575061098d81336106e1565b6109ff5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108d3565b610a098383611710565b505050565b6006546001600160a01b03163314610a385760405162461bcd60e51b81526004016108d390612b66565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b03163314610a845760405162461bcd60e51b81526004016108d390612b66565b6009805461ff001981166101009182900460ff1615909102179055565b610aab338261177e565b610ac75760405162461bcd60e51b81526004016108d390612b9b565b610a09838383611875565b600d546001600160a01b03163314610ae957600080fd5b600d546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610b22573d6000803e3d6000fd5b50565b610a09838383604051806020016040528060008152506112f2565b6006546001600160a01b03163314610b6a5760405162461bcd60e51b81526004016108d390612b66565b6009805462ff0000198116620100009182900460ff1615909102179055565b6006546001600160a01b03163314610bb35760405162461bcd60e51b81526004016108d390612b66565b610a09600f8383612543565b6000818152600260205260408120546001600160a01b0316806107c65760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108d3565b60078054610c4390612b2b565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6f90612b2b565b8015610cbc5780601f10610c9157610100808354040283529160200191610cbc565b820191906000526020600020905b815481529060010190602001808311610c9f57829003601f168201915b505050505081565b6006546001600160a01b03163314610cee5760405162461bcd60e51b81526004016108d390612b66565b8051825114610d4e5760405162461bcd60e51b815260206004820152602660248201527f524553455256453a20617272617973206861766520646966666572656e74206c604482015265656e6774687360d01b60648201526084016108d3565b60005b8251811015610a095760005b828281518110610d6f57610d6f612bec565b6020026020010151811015610dba57610da8848381518110610d9357610d93612bec565b6020026020010151610da3611a15565b611a4f565b80610db281612c18565b915050610d5d565b5080610dc581612c18565b915050610d51565b60006001600160a01b038216610e385760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108d3565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610e7e5760405162461bcd60e51b81526004016108d390612b66565b610e886000611a69565b565b60088054610c4390612b2b565b6006546001600160a01b03163314610ec15760405162461bcd60e51b81526004016108d390612b66565b6009805460ff19811660ff90911615179055565b6006546001600160a01b03163314610eff5760405162461bcd60e51b81526004016108d390612b66565b610f0a609782612c33565b600b5550565b60095460ff16610f625760405162461bcd60e51b815260206004820152601b60248201527f4d696e744572726f723a2053616c6520697320696e616374697665000000000060448201526064016108d3565b600a821115610fca5760405162461bcd60e51b815260206004820152602e60248201527f4d696e744572726f723a204d617820746f6b656e7320706572207472616e736160448201526d18dd1a5bdb88195e18d95959195960921b60648201526084016108d3565b61267882610fd7600a5490565b610fe19190612c33565b11156110435760405162461bcd60e51b815260206004820152602b60248201527f4d696e744572726f723a20507572636861736520776f756c642065786365656460448201526a206d617820746f6b656e7360a81b60648201526084016108d3565b346110568367011f0f2c01da0000612c4b565b11156110b55760405162461bcd60e51b815260206004820152602860248201527f4d696e744572726f723a2045746865722076616c75652073656e7420697320696044820152671b98dbdc9c9958dd60c21b60648201526084016108d3565b60005b82811015610a09576110cc82610da3611a15565b806110d681612c18565b9150506110b8565b6060600180546107db90612b2b565b81816110f98282611abb565b6111455760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420416363657373205369676e6174757265000000000000000060448201526064016108d3565b60095462010000900460ff1661119d5760405162461bcd60e51b815260206004820152601c60248201527f50524553414c453a2070726573616c6520697320696e6163746976650000000060448201526064016108d3565b612678856111aa600a5490565b6111b49190612c33565b11156112025760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e7360448201526064016108d3565b346112158667011f0f2c01da0000612c4b565b11156112725760405162461bcd60e51b815260206004820152602660248201527f50524553414c453a2045746865722076616c75652073656e7420697320696e636044820152651bdc9c9958dd60d21b60648201526084016108d3565b61127c8386611b68565b60005b858110156112a55761129333610da3611a15565b8061129d81612c18565b91505061127f565b505050505050565b6112b8338383611ce4565b5050565b6006546001600160a01b031633146112e65760405162461bcd60e51b81526004016108d390612b66565b610a0960088383612543565b6112fc338361177e565b6113185760405162461bcd60e51b81526004016108d390612b9b565b61132484848484611db3565b50505050565b6000818152600260205260409020546060906001600160a01b03166113a35760405162461bcd60e51b815260206004820152602960248201527f746f6b656e5552493a2055524920717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108d3565b60006113ad611de6565b600954909150610100900460ff1615806113c657508051155b1561145e57600880546113d890612b2b565b80601f016020809104026020016040519081016040528092919081815260200182805461140490612b2b565b80156114515780601f1061142657610100808354040283529160200191611451565b820191906000526020600020905b81548152906001019060200180831161143457829003601f168201915b5050505050915050919050565b8061146884611df5565b604051602001611479929190612c6a565b604051602081830303815290604052915050919050565b600e546000906001600160a01b031633146114ed5760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e2045786368616e67653a20556e617574686f72697a65640000000060448201526064016108d3565b6009546301000000900460ff16151560011461154b5760405162461bcd60e51b815260206004820152601a60248201527f546f6b656e2045786368616e676520697320696e61637469766500000000000060448201526064016108d3565b60008211801561155c575060978211155b6115b45760405162461bcd60e51b8152602060048201526024808201527f546f6b656e2045786368616e67653a2070617373206964206f7574206f662072604482015263616e676560e01b60648201526084016108d3565b60006115e46001609785600b546115cb9190612c33565b6115d59190612c99565b6115df9190612c99565b611ef3565b90506115f08482611a4f565b9392505050565b6006546001600160a01b031633146116215760405162461bcd60e51b81526004016108d390612b66565b6009805463ff00000019811663010000009182900460ff1615909102179055565b6006546001600160a01b0316331461166c5760405162461bcd60e51b81526004016108d390612b66565b6001600160a01b0381166116d15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108d3565b610b2281611a69565b6006546001600160a01b031633146117045760405162461bcd60e51b81526004016108d390612b66565b610a0960078383612543565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061174582610bbf565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166117f75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108d3565b600061180283610bbf565b9050806001600160a01b0316846001600160a01b0316148061183d5750836001600160a01b03166118328461085e565b6001600160a01b0316145b8061186d57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661188882610bbf565b6001600160a01b0316146118f05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016108d3565b6001600160a01b0382166119525760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108d3565b61195d600082611710565b6001600160a01b0383166000908152600360205260408120805460019290611986908490612c99565b90915550506001600160a01b03821660009081526003602052604081208054600192906119b4908490612c33565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611a25600a80546001019055565b611a4a600b546001611a36600a5490565b611a409190612c99565b6115df9190612c33565b905090565b6112b8828260405180602001604052806000815250611f0c565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080303384604051602001611ad393929190612cb0565b6040516020818303038152906040528051906020012090506000611b4e85611b48846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90611f3f565b600c546001600160a01b0391821691161495945050505050565b611b8c826040518060400160405280600281526020016115d360f21b815250611f63565b80611bb65750611bb682604051806040016040528060028152602001614f4760f01b815250611f63565b611c025760405162461bcd60e51b815260206004820152601d60248201527f50726573616c653a20496e76616c69642070726573616c65207479706500000060448201526064016108d3565b6000611c28836040518060400160405280600281526020016115d360f21b815250611f63565b611c33576003611c36565b60025b3360009081526010602052604090205460ff9190911691508190611c5b908490612c33565b1115611cb45760405162461bcd60e51b815260206004820152602260248201527f50726573616c653a20417574686f72697a6564206c696d697420657863656564604482015261195960f21b60648201526084016108d3565b33600090815260106020526040902054611ccf908390612c33565b33600090815260106020526040902055505050565b816001600160a01b0316836001600160a01b03161415611d465760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108d3565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611dbe848484611875565b611dca84848484611fbc565b6113245760405162461bcd60e51b81526004016108d390612cf6565b6060600f80546107db90612b2b565b606081611e195750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e435780611e2d81612c18565b9150611e3c9050600a83612d5e565b9150611e1d565b60008167ffffffffffffffff811115611e5e57611e5e6127a2565b6040519080825280601f01601f191660200182016040528015611e88576020820181803683370190505b5090505b841561186d57611e9d600183612c99565b9150611eaa600a86612d72565b611eb5906030612c33565b60f81b818381518110611eca57611eca612bec565b60200101906001600160f81b031916908160001a905350611eec600a86612d5e565b9450611e8c565b6000611f026097612678612c33565b6107c69083612d72565b611f1683836120ba565b611f236000848484611fbc565b610a095760405162461bcd60e51b81526004016108d390612cf6565b6000806000611f4e85856121fc565b91509150611f5b8161226c565b509392505050565b600081604051602001611f769190612d86565b6040516020818303038152906040528051906020012083604051602001611f9d9190612d86565b6040516020818303038152906040528051906020012014905092915050565b60006001600160a01b0384163b156120af57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612000903390899088908890600401612da2565b6020604051808303816000875af192505050801561203b575060408051601f3d908101601f1916820190925261203891810190612ddf565b60015b612095573d808015612069576040519150601f19603f3d011682016040523d82523d6000602084013e61206e565b606091505b50805161208d5760405162461bcd60e51b81526004016108d390612cf6565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061186d565b506001949350505050565b6001600160a01b0382166121105760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108d3565b6000818152600260205260409020546001600160a01b0316156121755760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108d3565b6001600160a01b038216600090815260036020526040812080546001929061219e908490612c33565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000808251604114156122335760208301516040840151606085015160001a61222787828585612427565b94509450505050612265565b82516040141561225d5760208301516040840151612252868383612514565b935093505050612265565b506000905060025b9250929050565b600081600481111561228057612280612dfc565b14156122895750565b600181600481111561229d5761229d612dfc565b14156122eb5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108d3565b60028160048111156122ff576122ff612dfc565b141561234d5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108d3565b600381600481111561236157612361612dfc565b14156123ba5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016108d3565b60048160048111156123ce576123ce612dfc565b1415610b225760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016108d3565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561245e575060009050600361250b565b8460ff16601b1415801561247657508460ff16601c14155b15612487575060009050600461250b565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156124db573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166125045760006001925092505061250b565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161253587828885612427565b935093505050935093915050565b82805461254f90612b2b565b90600052602060002090601f01602090048101928261257157600085556125b7565b82601f1061258a5782800160ff198235161785556125b7565b828001600101855582156125b7579182015b828111156125b757823582559160200191906001019061259c565b506125c39291506125c7565b5090565b5b808211156125c357600081556001016125c8565b6001600160e01b031981168114610b2257600080fd5b60006020828403121561260457600080fd5b81356115f0816125dc565b80356001600160a01b038116811461262657600080fd5b919050565b60006020828403121561263d57600080fd5b6115f08261260f565b60005b83811015612661578181015183820152602001612649565b838111156113245750506000910152565b6000815180845261268a816020860160208601612646565b601f01601f19169290920160200192915050565b6020815260006115f06020830184612672565b6000602082840312156126c357600080fd5b5035919050565b600080604083850312156126dd57600080fd5b6126e68361260f565b946020939093013593505050565b60008060006060848603121561270957600080fd5b6127128461260f565b92506127206020850161260f565b9150604084013590509250925092565b6000806020838503121561274357600080fd5b823567ffffffffffffffff8082111561275b57600080fd5b818501915085601f83011261276f57600080fd5b81358181111561277e57600080fd5b86602082850101111561279057600080fd5b60209290920196919550909350505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156127e1576127e16127a2565b604052919050565b600067ffffffffffffffff821115612803576128036127a2565b5060051b60200190565b600082601f83011261281e57600080fd5b8135602061283361282e836127e9565b6127b8565b82815260059290921b8401810191818101908684111561285257600080fd5b8286015b8481101561286d5780358352918301918301612856565b509695505050505050565b6000806040838503121561288b57600080fd5b823567ffffffffffffffff808211156128a357600080fd5b818501915085601f8301126128b757600080fd5b813560206128c761282e836127e9565b82815260059290921b840181019181810190898411156128e657600080fd5b948201945b8386101561290b576128fc8661260f565b825294820194908201906128eb565b9650508601359250508082111561292157600080fd5b5061292e8582860161280d565b9150509250929050565b6000806040838503121561294b57600080fd5b8235915061295b6020840161260f565b90509250929050565b600067ffffffffffffffff83111561297e5761297e6127a2565b612991601f8401601f19166020016127b8565b90508281528383830111156129a557600080fd5b828260208301376000602084830101529392505050565b600082601f8301126129cd57600080fd5b6115f083833560208501612964565b6000806000606084860312156129f157600080fd5b83359250602084013567ffffffffffffffff80821115612a1057600080fd5b612a1c878388016129bc565b93506040860135915080821115612a3257600080fd5b508401601f81018613612a4457600080fd5b612a5386823560208401612964565b9150509250925092565b60008060408385031215612a7057600080fd5b612a798361260f565b915060208301358015158114612a8e57600080fd5b809150509250929050565b60008060008060808587031215612aaf57600080fd5b612ab88561260f565b9350612ac66020860161260f565b925060408501359150606085013567ffffffffffffffff811115612ae957600080fd5b612af5878288016129bc565b91505092959194509250565b60008060408385031215612b1457600080fd5b612b1d8361260f565b915061295b6020840161260f565b600181811c90821680612b3f57607f821691505b60208210811415612b6057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612c2c57612c2c612c02565b5060010190565b60008219821115612c4657612c46612c02565b500190565b6000816000190483118215151615612c6557612c65612c02565b500290565b60008351612c7c818460208801612646565b835190830190612c90818360208801612646565b01949350505050565b600082821015612cab57612cab612c02565b500390565b60006bffffffffffffffffffffffff19808660601b168352808560601b166014840152508251612ce7816028850160208701612646565b91909101602801949350505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612d6d57612d6d612d48565b500490565b600082612d8157612d81612d48565b500690565b60008251612d98818460208701612646565b9190910192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612dd590830184612672565b9695505050505050565b600060208284031215612df157600080fd5b81516115f0816125dc565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220a7034cbfc2c4ba41b0df41cfa38bc5d17c20da88fcc52971e0a7414e7ea68e2964736f6c634300080b0033

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

00000000000000000000000022087445743da772fde2ece88425ad9f52c078af0000000000000000000000007b311bdcf4dd8b86c0eba5656bf03b183f51d88d

-----Decoded View---------------
Arg [0] : _signerAddress (address): 0x22087445743dA772fdE2eCE88425AD9f52C078af
Arg [1] : _fundReceiver (address): 0x7B311BDCF4DD8b86c0EBa5656BF03B183F51D88d

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000022087445743da772fde2ece88425ad9f52c078af
Arg [1] : 0000000000000000000000007b311bdcf4dd8b86c0eba5656bf03b183f51d88d


Deployed Bytecode Sourcemap

49584:7932:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22030:355;;;;;;;;;;-1:-1:-1;22030:355:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;22030:355:0;;;;;;;;50224:49;;;;;;;;;;-1:-1:-1;50224:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1107:25:1;;;1095:2;1080:18;50224:49:0;961:177:1;23199:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24892:308::-;;;;;;;;;;-1:-1:-1;24892:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2243:32:1;;;2225:51;;2213:2;2198:18;24892:308:0;2079:203:1;24415:411:0;;;;;;;;;;-1:-1:-1;24415:411:0;;;;;:::i;:::-;;:::i;:::-;;51349:171;;;;;;;;;;-1:-1:-1;51349:171:0;;;;;:::i;:::-;;:::i;49920:44::-;;;;;;;;;;-1:-1:-1;49920:44:0;;;;;;;;;;;50330:45;;;;;;;;;;;;50372:3;50330:45;;52193:90;;;;;;;;;;;;;:::i;25811:376::-;;;;;;;;;;-1:-1:-1;25811:376:0;;;;;:::i;:::-;;:::i;50282:41::-;;;;;;;;;;;;50319:4;50282:41;;50382:49;;;;;;;;;;;;50429:2;50382:49;;56797:118;;;;;;;;;;;;;:::i;26258:185::-;;;;;;;;;;-1:-1:-1;26258:185:0;;;;;:::i;:::-;;:::i;51976:105::-;;;;;;;;;;;;;:::i;49841:30::-;;;;;;;;;;-1:-1:-1;49841:30:0;;;;;;;;;;;49802:32;;;;;;;;;;-1:-1:-1;49802:32:0;;;;;;;;51528:177;;;;;;;;;;-1:-1:-1;51528:177:0;;;;;:::i;:::-;;:::i;49878:35::-;;;;;;;;;;-1:-1:-1;49878:35:0;;;;;;;;;;;22806:326;;;;;;;;;;-1:-1:-1;22806:326:0;;;;;:::i;:::-;;:::i;49733:24::-;;;;;;;;;;;;;:::i;53098:472::-;;;;;;;;;;-1:-1:-1;53098:472:0;;;;;:::i;:::-;;:::i;22449:295::-;;;;;;;;;;-1:-1:-1;22449:295:0;;;;;:::i;:::-;;:::i;37170:103::-;;;;;;;;;;;;;:::i;49764:31::-;;;;;;;;;;;;;:::i;49971:45::-;;;;;;;;;;-1:-1:-1;49971:45:0;;;;;;50438:54;;;;;;;;;;;;50480:12;50438:54;;52089:96;;;;;;;;;;;;;:::i;51029:139::-;;;;;;;;;;-1:-1:-1;51029:139:0;;;;;:::i;:::-;;:::i;36519:87::-;;;;;;;;;;-1:-1:-1;36592:6:0;;-1:-1:-1;;;;;36592:6:0;36519:87;;55318:769;;;;;;:::i;:::-;;:::i;23368:104::-;;;;;;;;;;;;;:::i;54493:817::-;;;;;;:::i;:::-;;:::i;25272:187::-;;;;;;;;;;-1:-1:-1;25272:187:0;;;;;:::i;:::-;;:::i;51176:165::-;;;;;;;;;;-1:-1:-1;51176:165:0;;;;;:::i;:::-;;:::i;26514:365::-;;;;;;;;;;-1:-1:-1;26514:365:0;;;;;:::i;:::-;;:::i;57052:461::-;;;;;;;;;;-1:-1:-1;57052:461:0;;;;;:::i;:::-;;:::i;56095:694::-;;;;;;;;;;-1:-1:-1;56095:694:0;;;;;:::i;:::-;;:::i;25530:214::-;;;;;;;;;;-1:-1:-1;25530:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;25701:25:0;;;25672:4;25701:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25530:214;51833:135;;;;;;;;;;;;;:::i;37428:238::-;;;;;;;;;;-1:-1:-1;37428:238:0;;;;;:::i;:::-;;:::i;50023:33::-;;;;;;;;;;;;;;;;51713:112;;;;;;;;;;-1:-1:-1;51713:112:0;;;;;:::i;:::-;;:::i;22030:355::-;22177:4;-1:-1:-1;;;;;;22219:40:0;;-1:-1:-1;;;22219:40:0;;:105;;-1:-1:-1;;;;;;;22276:48:0;;-1:-1:-1;;;22276:48:0;22219:105;:158;;;-1:-1:-1;;;;;;;;;;20593:40:0;;;22341:36;22199:178;22030:355;-1:-1:-1;;22030:355:0:o;23199:100::-;23253:13;23286:5;23279:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23199:100;:::o;24892:308::-;25013:7;28515:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28515:16:0;25038:110;;;;-1:-1:-1;;;25038:110:0;;9277:2:1;25038:110:0;;;9259:21:1;9316:2;9296:18;;;9289:30;9355:34;9335:18;;;9328:62;-1:-1:-1;;;9406:18:1;;;9399:42;9458:19;;25038:110:0;;;;;;;;;-1:-1:-1;25168:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25168:24:0;;24892:308::o;24415:411::-;24496:13;24512:23;24527:7;24512:14;:23::i;:::-;24496:39;;24560:5;-1:-1:-1;;;;;24554:11:0;:2;-1:-1:-1;;;;;24554:11:0;;;24546:57;;;;-1:-1:-1;;;24546:57:0;;9690:2:1;24546:57:0;;;9672:21:1;9729:2;9709:18;;;9702:30;9768:34;9748:18;;;9741:62;-1:-1:-1;;;9819:18:1;;;9812:31;9860:19;;24546:57:0;9488:397:1;24546:57:0;17273:10;-1:-1:-1;;;;;24638:21:0;;;;:62;;-1:-1:-1;24663:37:0;24680:5;17273:10;25530:214;:::i;24663:37::-;24616:168;;;;-1:-1:-1;;;24616:168:0;;10092:2:1;24616:168:0;;;10074:21:1;10131:2;10111:18;;;10104:30;10170:34;10150:18;;;10143:62;10241:26;10221:18;;;10214:54;10285:19;;24616:168:0;9890:420:1;24616:168:0;24797:21;24806:2;24810:7;24797:8;:21::i;:::-;24485:341;24415:411;;:::o;51349:171::-;36592:6;;-1:-1:-1;;;;;36592:6:0;17273:10;36739:23;36731:68;;;;-1:-1:-1;;;36731:68:0;;;;;;;:::i;:::-;51467:23:::1;:45:::0;;-1:-1:-1;;;;;;51467:45:0::1;-1:-1:-1::0;;;;;51467:45:0;;;::::1;::::0;;;::::1;::::0;;51349:171::o;52193:90::-;36592:6;;-1:-1:-1;;;;;36592:6:0;17273:10;36739:23;36731:68;;;;-1:-1:-1;;;36731:68:0;;;;;;;:::i;:::-;52265:10:::1;::::0;;-1:-1:-1;;52251:24:0;::::1;52265:10;::::0;;;::::1;;;52264:11;52251:24:::0;;::::1;;::::0;;52193:90::o;25811:376::-;26020:41;17273:10;26053:7;26020:18;:41::i;:::-;25998:140;;;;-1:-1:-1;;;25998:140:0;;;;;;;:::i;:::-;26151:28;26161:4;26167:2;26171:7;26151:9;:28::i;56797:118::-;50757:12;;-1:-1:-1;;;;;50757:12:0;50743:10;:26;50735:35;;;;;;56862:12:::1;::::0;56854:53:::1;::::0;-1:-1:-1;;;;;56862:12:0;;::::1;::::0;56885:21:::1;56854:53:::0;::::1;;;::::0;56862:12:::1;56854:53:::0;56862:12;56854:53;56885:21;56862:12;56854:53;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;56797:118::o:0;26258:185::-;26396:39;26413:4;26419:2;26423:7;26396:39;;;;;;;;;;;;:16;:39::i;51976:105::-;36592:6;;-1:-1:-1;;;;;36592:6:0;17273:10;36739:23;36731:68;;;;-1:-1:-1;;;36731:68:0;;;;;;;:::i;:::-;52058:15:::1;::::0;;-1:-1:-1;;52039:34:0;::::1;52058:15:::0;;;;::::1;;;52057:16;52039:34:::0;;::::1;;::::0;;51976:105::o;51528:177::-;36592:6;;-1:-1:-1;;;;;36592:6:0;17273:10;36739:23;36731:68;;;;-1:-1:-1;;;36731:68:0;;;;;;;:::i;:::-;51653:44:::1;:20;51676:21:::0;;51653:44:::1;:::i;22806:326::-:0;22923:7;22964:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22964:16:0;23013:19;22991:110;;;;-1:-1:-1;;;22991:110:0;;11296:2:1;22991:110:0;;;11278:21:1;11335:2;11315:18;;;11308:30;11374:34;11354:18;;;11347:62;-1:-1:-1;;;11425:18:1;;;11418:39;11474:19;;22991:110:0;11094:405:1;49733:24:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53098:472::-;36592:6;;-1:-1:-1;;;;;36592:6:0;17273:10;36739:23;36731:68;;;;-1:-1:-1;;;36731:68:0;;;;;;;:::i;:::-;53269:8:::1;:15;53247:11;:18;:37;53225:125;;;::::0;-1:-1:-1;;;53225:125:0;;11706:2:1;53225:125:0::1;::::0;::::1;11688:21:1::0;11745:2;11725:18;;;11718:30;11784:34;11764:18;;;11757:62;-1:-1:-1;;;11835:18:1;;;11828:36;11881:19;;53225:125:0::1;11504:402:1::0;53225:125:0::1;53368:9;53363:200;53387:11;:18;53383:1;:22;53363:200;;;53432:9;53427:125;53451:8;53460:1;53451:11;;;;;;;;:::i;:::-;;;;;;;53447:1;:15;53427:125;;;53488:48;53498:11;53510:1;53498:14;;;;;;;;:::i;:::-;;;;;;;53514:21;:19;:21::i;:::-;53488:9;:48::i;:::-;53464:3:::0;::::1;::::0;::::1;:::i;:::-;;;;53427:125;;;-1:-1:-1::0;53407:3:0;::::1;::::0;::::1;:::i;:::-;;;;53363:200;;22449:295:::0;22566:7;-1:-1:-1;;;;;22613:19:0;;22591:111;;;;-1:-1:-1;;;22591:111:0;;12517:2:1;22591:111:0;;;12499:21:1;12556:2;12536:18;;;12529:30;12595:34;12575:18;;;12568:62;-1:-1:-1;;;12646:18:1;;;12639:40;12696:19;;22591:111:0;12315:406:1;22591:111:0;-1:-1:-1;;;;;;22720:16:0;;;;;:9;:16;;;;;;;22449:295::o;37170:103::-;36592:6;;-1:-1:-1;;;;;36592:6:0;17273:10;36739:23;36731:68;;;;-1:-1:-1;;;36731:68:0;;;;;;;:::i;:::-;37235:30:::1;37262:1;37235:18;:30::i;:::-;37170:103::o:0;49764:31::-;;;;;;;:::i;52089:96::-;36592:6;;-1:-1:-1;;;;;36592:6:0;17273:10;36739:23;36731:68;;;;-1:-1:-1;;;36731:68:0;;;;;;;:::i;:::-;52165:12:::1;::::0;;-1:-1:-1;;52149:28:0;::::1;52165:12;::::0;;::::1;52164:13;52149:28;::::0;;52089:96::o;51029:139::-;36592:6;;-1:-1:-1;;;;;36592:6:0;17273:10;36739:23;36731:68;;;;-1:-1:-1;;;36731:68:0;;;;;;;:::i;:::-;51127:33:::1;50372:3;51127:15:::0;:33:::1;:::i;:::-;51110:14;:50:::0;-1:-1:-1;51029:139:0:o;55318:769::-;55442:12;;;;55434:52;;;;-1:-1:-1;;;55434:52:0;;13061:2:1;55434:52:0;;;13043:21:1;13100:2;13080:18;;;13073:30;13139:29;13119:18;;;13112:57;13186:18;;55434:52:0;12859:351:1;55434:52:0;50429:2;55519:15;:39;;55497:135;;;;-1:-1:-1;;;55497:135:0;;13417:2:1;55497:135:0;;;13399:21:1;13456:2;13436:18;;;13429:30;13495:34;13475:18;;;13468:62;-1:-1:-1;;;13546:18:1;;;13539:44;13600:19;;55497:135:0;13215:410:1;55497:135:0;50319:4;55699:15;55665:31;:21;38992:14;;38900:114;55665:31;:49;;;;:::i;:::-;:63;;55643:156;;;;-1:-1:-1;;;55643:156:0;;13832:2:1;55643:156:0;;;13814:21:1;13871:2;13851:18;;;13844:30;13910:34;13890:18;;;13883:62;-1:-1:-1;;;13961:18:1;;;13954:41;14012:19;;55643:156:0;13630:407:1;55643:156:0;55869:9;55832:33;55850:15;50480:12;55832:33;:::i;:::-;:46;;55810:136;;;;-1:-1:-1;;;55810:136:0;;14417:2:1;55810:136:0;;;14399:21:1;14456:2;14436:18;;;14429:30;14495:34;14475:18;;;14468:62;-1:-1:-1;;;14546:18:1;;;14539:38;14594:19;;55810:136:0;14215:404:1;55810:136:0;55962:9;55957:123;55981:15;55977:1;:19;55957:123;;;56018:50;56028:16;56046:21;:19;:21::i;56018:50::-;55998:3;;;;:::i;:::-;;;;55957:123;;23368:104;23424:13;23457:7;23450:14;;;;;:::i;54493:817::-;54662:10;54674:9;50906:43;50927:10;50939:9;50906:20;:43::i;:::-;50884:117;;;;-1:-1:-1;;;50884:117:0;;14826:2:1;50884:117:0;;;14808:21:1;14865:2;14845:18;;;14838:30;14904:26;14884:18;;;14877:54;14948:18;;50884:117:0;14624:348:1;50884:117:0;54704:15:::1;::::0;;;::::1;;;54696:56;;;::::0;-1:-1:-1;;;54696:56:0;;15179:2:1;54696:56:0::1;::::0;::::1;15161:21:1::0;15218:2;15198:18;;;15191:30;15257;15237:18;;;15230:58;15305:18;;54696:56:0::1;14977:352:1::0;54696:56:0::1;50319:4;54821:21;54787:31;:21;38992:14:::0;;38900:114;54787:31:::1;:55;;;;:::i;:::-;:86;;54765:168;;;::::0;-1:-1:-1;;;54765:168:0;;15536:2:1;54765:168:0::1;::::0;::::1;15518:21:1::0;;;15555:18;;;15548:30;15614:34;15594:18;;;15587:62;15666:18;;54765:168:0::1;15334:356:1::0;54765:168:0::1;55011:9;54968:39;54986:21:::0;50480:12:::1;54968:39;:::i;:::-;:52;;54946:140;;;::::0;-1:-1:-1;;;54946:140:0;;15897:2:1;54946:140:0::1;::::0;::::1;15879:21:1::0;15936:2;15916:18;;;15909:30;15975:34;15955:18;;;15948:62;-1:-1:-1;;;16026:18:1;;;16019:36;16072:19;;54946:140:0::1;15695:402:1::0;54946:140:0::1;55099:68;55134:9;55145:21;55099:34;:68::i;:::-;55185:9;55180:123;55204:21;55200:1;:25;55180:123;;;55247:44;55257:10;55269:21;:19;:21::i;55247:44::-;55227:3:::0;::::1;::::0;::::1;:::i;:::-;;;;55180:123;;;;54493:817:::0;;;;;:::o;25272:187::-;25399:52;17273:10;25432:8;25442;25399:18;:52::i;:::-;25272:187;;:::o;51176:165::-;36592:6;;-1:-1:-1;;;;;36592:6:0;17273:10;36739:23;36731:68;;;;-1:-1:-1;;;36731:68:0;;;;;;;:::i;:::-;51295:38:::1;:17;51315:18:::0;;51295:38:::1;:::i;26514:365::-:0;26703:41;17273:10;26736:7;26703:18;:41::i;:::-;26681:140;;;;-1:-1:-1;;;26681:140:0;;;;;;;:::i;:::-;26832:39;26846:4;26852:2;26856:7;26865:5;26832:13;:39::i;:::-;26514:365;;;;:::o;57052:461::-;28491:4;28515:16;;;:7;:16;;;;;;57170:13;;-1:-1:-1;;;;;28515:16:0;57201:70;;;;-1:-1:-1;;;57201:70:0;;16304:2:1;57201:70:0;;;16286:21:1;16343:2;16323:18;;;16316:30;16382:34;16362:18;;;16355:62;-1:-1:-1;;;16433:18:1;;;16426:39;16482:19;;57201:70:0;16102:405:1;57201:70:0;57282:21;57306:10;:8;:10::i;:::-;57331;;57282:34;;-1:-1:-1;57331:10:0;;;;;:19;;:49;;-1:-1:-1;57354:21:0;;:26;57331:49;57327:106;;;57404:17;57397:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57052:461;;;:::o;57327:106::-;57476:7;57485:18;:7;:16;:18::i;:::-;57459:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57445:60;;;57052:461;;;:::o;56095:694::-;56258:23;;56197:7;;-1:-1:-1;;;;;56258:23:0;56244:10;:37;56222:115;;;;-1:-1:-1;;;56222:115:0;;17189:2:1;56222:115:0;;;17171:21:1;17228:2;17208:18;;;17201:30;17267;17247:18;;;17240:58;17315:18;;56222:115:0;16987:352:1;56222:115:0;56372:25;;;;;;;:33;;56401:4;56372:33;56350:109;;;;-1:-1:-1;;;56350:109:0;;17546:2:1;56350:109:0;;;17528:21:1;17585:2;17565:18;;;17558:30;17624:28;17604:18;;;17597:56;17670:18;;56350:109:0;17344:350:1;56350:109:0;56504:1;56494:7;:11;:41;;;;;50372:3;56509:7;:26;;56494:41;56472:127;;;;-1:-1:-1;;;56472:127:0;;17901:2:1;56472:127:0;;;17883:21:1;17940:2;17920:18;;;17913:30;17979:34;17959:18;;;17952:62;-1:-1:-1;;;18030:18:1;;;18023:34;18074:19;;56472:127:0;17699:400:1;56472:127:0;56612:16;56631:81;56700:1;50372:3;56672:7;56655:14;;:24;;;;:::i;:::-;:42;;;;:::i;:::-;:46;;;;:::i;:::-;56631:9;:81::i;:::-;56612:100;;56723:30;56733:9;56744:8;56723:9;:30::i;:::-;56773:8;56095:694;-1:-1:-1;;;56095:694:0:o;51833:135::-;36592:6;;-1:-1:-1;;;;;36592:6:0;17273:10;36739:23;36731:68;;;;-1:-1:-1;;;36731:68:0;;;;;;;:::i;:::-;51935:25:::1;::::0;;-1:-1:-1;;51906:54:0;::::1;51935:25:::0;;;;::::1;;;51934:26;51906:54:::0;;::::1;;::::0;;51833:135::o;37428:238::-;36592:6;;-1:-1:-1;;;;;36592:6:0;17273:10;36739:23;36731:68;;;;-1:-1:-1;;;36731:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37531:22:0;::::1;37509:110;;;::::0;-1:-1:-1;;;37509:110:0;;18436:2:1;37509:110:0::1;::::0;::::1;18418:21:1::0;18475:2;18455:18;;;18448:30;18514:34;18494:18;;;18487:62;-1:-1:-1;;;18565:18:1;;;18558:36;18611:19;;37509:110:0::1;18234:402:1::0;37509:110:0::1;37630:28;37649:8;37630:18;:28::i;51713:112::-:0;36592:6;;-1:-1:-1;;;;;36592:6:0;17273:10;36739:23;36731:68;;;;-1:-1:-1;;;36731:68:0;;;;;;;:::i;:::-;51794:23:::1;:10;51807::::0;;51794:23:::1;:::i;32549:174::-:0;32624:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32624:29:0;-1:-1:-1;;;;;32624:29:0;;;;;;;;:24;;32678:23;32624:24;32678:14;:23::i;:::-;-1:-1:-1;;;;;32669:46:0;;;;;;;;;;;32549:174;;:::o;28720:452::-;28849:4;28515:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28515:16:0;28871:110;;;;-1:-1:-1;;;28871:110:0;;18843:2:1;28871:110:0;;;18825:21:1;18882:2;18862:18;;;18855:30;18921:34;18901:18;;;18894:62;-1:-1:-1;;;18972:18:1;;;18965:42;19024:19;;28871:110:0;18641:408:1;28871:110:0;28992:13;29008:23;29023:7;29008:14;:23::i;:::-;28992:39;;29061:5;-1:-1:-1;;;;;29050:16:0;:7;-1:-1:-1;;;;;29050:16:0;;:64;;;;29107:7;-1:-1:-1;;;;;29083:31:0;:20;29095:7;29083:11;:20::i;:::-;-1:-1:-1;;;;;29083:31:0;;29050:64;:113;;;-1:-1:-1;;;;;;25701:25:0;;;25672:4;25701:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;29131:32;29042:122;28720:452;-1:-1:-1;;;;28720:452:0:o;31816:615::-;31989:4;-1:-1:-1;;;;;31962:31:0;:23;31977:7;31962:14;:23::i;:::-;-1:-1:-1;;;;;31962:31:0;;31940:122;;;;-1:-1:-1;;;31940:122:0;;19256:2:1;31940:122:0;;;19238:21:1;19295:2;19275:18;;;19268:30;19334:34;19314:18;;;19307:62;-1:-1:-1;;;19385:18:1;;;19378:39;19434:19;;31940:122:0;19054:405:1;31940:122:0;-1:-1:-1;;;;;32081:16:0;;32073:65;;;;-1:-1:-1;;;32073:65:0;;19666:2:1;32073:65:0;;;19648:21:1;19705:2;19685:18;;;19678:30;19744:34;19724:18;;;19717:62;-1:-1:-1;;;19795:18:1;;;19788:34;19839:19;;32073:65:0;19464:400:1;32073:65:0;32255:29;32272:1;32276:7;32255:8;:29::i;:::-;-1:-1:-1;;;;;32297:15:0;;;;;;:9;:15;;;;;:20;;32316:1;;32297:15;:20;;32316:1;;32297:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32328:13:0;;;;;;:9;:13;;;;;:18;;32345:1;;32328:13;:18;;32345:1;;32328:18;:::i;:::-;;;;-1:-1:-1;;32357:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32357:21:0;-1:-1:-1;;;;;32357:21:0;;;;;;;;;32396:27;;32357:16;;32396:27;;;;;;;31816:615;;;:::o;52898:192::-;52946:7;52966:33;:21;39111:19;;39129:1;39111:19;;;39022:127;52966:33;53019:63;53067:14;;53063:1;53029:31;:21;38992:14;;38900:114;53029:31;:35;;;;:::i;:::-;:52;;;;:::i;53019:63::-;53012:70;;52898:192;:::o;29514:110::-;29590:26;29600:2;29604:7;29590:26;;;;;;;;;;;;:9;:26::i;37826:191::-;37919:6;;;-1:-1:-1;;;;;37936:17:0;;;-1:-1:-1;;;;;;37936:17:0;;;;;;;37969:40;;37919:6;;;37936:17;37919:6;;37969:40;;37900:16;;37969:40;37889:128;37826:191;:::o;52291:450::-;52418:4;52435:19;52506:4;52513:10;52525:9;52481:54;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52457:89;;;;;;52435:111;;52559:29;52591:84;52664:10;52591:50;:11;48161:58;;22525:66:1;48161:58:0;;;22513:79:1;22608:12;;;22601:28;;;47992:7:0;;22645:12:1;;48161:58:0;;;;;;;;;;;;48133:101;;;;;;48113:121;;47896:346;;;;52591:50;:72;;:84::i;:::-;52695:13;;-1:-1:-1;;;;;52695:38:0;;;:13;;:38;;52291:450;-1:-1:-1;;;;;52291:450:0:o;53813:672::-;53979:31;53994:9;53979:31;;;;;;;;;;;;;-1:-1:-1;;;53979:31:0;;;:14;:31::i;:::-;:66;;;;54014:31;54029:9;54014:31;;;;;;;;;;;;;-1:-1:-1;;;54014:31:0;;;:14;:31::i;:::-;53957:145;;;;-1:-1:-1;;;53957:145:0;;20577:2:1;53957:145:0;;;20559:21:1;20616:2;20596:18;;;20589:30;20655:31;20635:18;;;20628:59;20704:18;;53957:145:0;20375:353:1;53957:145:0;54115:22;54141:31;54156:9;54141:31;;;;;;;;;;;;;-1:-1:-1;;;54141:31:0;;;:14;:31::i;:::-;54140:41;;54180:1;54140:41;;;54176:1;54140:41;54229:10;54214:26;;;;:14;:26;;;;;;54115:66;;;;;;-1:-1:-1;54115:66:0;;54214:50;;54243:21;;54214:50;:::i;:::-;:85;;54192:169;;;;-1:-1:-1;;;54192:169:0;;20935:2:1;54192:169:0;;;20917:21:1;20974:2;20954:18;;;20947:30;21013:34;20993:18;;;20986:62;-1:-1:-1;;;21064:18:1;;;21057:32;21106:19;;54192:169:0;20733:398:1;54192:169:0;54429:10;54414:26;;;;:14;:26;;;;;;:63;;54456:21;;54414:63;:::i;:::-;54387:10;54372:26;;;;:14;:26;;;;;:105;-1:-1:-1;;;53813:672:0:o;32865:315::-;33020:8;-1:-1:-1;;;;;33011:17:0;:5;-1:-1:-1;;;;;33011:17:0;;;33003:55;;;;-1:-1:-1;;;33003:55:0;;21338:2:1;33003:55:0;;;21320:21:1;21377:2;21357:18;;;21350:30;21416:27;21396:18;;;21389:55;21461:18;;33003:55:0;21136:349:1;33003:55:0;-1:-1:-1;;;;;33069:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;33069:46:0;;;;;;;;;;33131:41;;540::1;;;33131::0;;513:18:1;33131:41:0;;;;;;;32865:315;;;:::o;27761:352::-;27918:28;27928:4;27934:2;27938:7;27918:9;:28::i;:::-;27979:48;28002:4;28008:2;28012:7;28021:5;27979:22;:48::i;:::-;27957:148;;;;-1:-1:-1;;;27957:148:0;;;;;;;:::i;56923:121::-;56983:13;57016:20;57009:27;;;;;:::i;17776:723::-;17832:13;18053:10;18049:53;;-1:-1:-1;;18080:10:0;;;;;;;;;;;;-1:-1:-1;;;18080:10:0;;;;;17776:723::o;18049:53::-;18127:5;18112:12;18168:78;18175:9;;18168:78;;18201:8;;;;:::i;:::-;;-1:-1:-1;18224:10:0;;-1:-1:-1;18232:2:0;18224:10;;:::i;:::-;;;18168:78;;;18256:19;18288:6;18278:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18278:17:0;;18256:39;;18306:154;18313:10;;18306:154;;18340:11;18350:1;18340:11;;:::i;:::-;;-1:-1:-1;18409:10:0;18417:2;18409:5;:10;:::i;:::-;18396:24;;:2;:24;:::i;:::-;18383:39;;18366:6;18373;18366:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;18366:56:0;;;;;;;;-1:-1:-1;18437:11:0;18446:2;18437:11;;:::i;:::-;;;18306:154;;52749:141;52811:7;52853:28;50372:3;50319:4;52853:28;:::i;:::-;52838:44;;:11;:44;:::i;29851:321::-;29981:18;29987:2;29991:7;29981:5;:18::i;:::-;30032:54;30063:1;30067:2;30071:7;30080:5;30032:22;:54::i;:::-;30010:154;;;;-1:-1:-1;;;30010:154:0;;;;;;;:::i;43929:263::-;44034:7;44060:17;44079:18;44101:27;44112:4;44118:9;44101:10;:27::i;:::-;44059:69;;;;44139:18;44151:5;44139:11;:18::i;:::-;-1:-1:-1;44175:9:0;43929:263;-1:-1:-1;;;43929:263:0:o;53578:227::-;53685:4;53792:1;53774:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;53764:32;;;;;;53743:1;53725:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;53715:32;;;;;;:81;53707:90;;53578:227;;;;:::o;33745:980::-;33900:4;-1:-1:-1;;;;;33921:13:0;;9035:20;9083:8;33917:801;;33974:175;;-1:-1:-1;;;33974:175:0;;-1:-1:-1;;;;;33974:36:0;;;;;:175;;17273:10;;34068:4;;34095:7;;34125:5;;33974:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33974:175:0;;;;;;;;-1:-1:-1;;33974:175:0;;;;;;;;;;;;:::i;:::-;;;33953:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34332:13:0;;34328:320;;34375:108;;-1:-1:-1;;;34375:108:0;;;;;;;:::i;34328:320::-;34598:6;34592:13;34583:6;34579:2;34575:15;34568:38;33953:710;-1:-1:-1;;;;;;34213:51:0;-1:-1:-1;;;34213:51:0;;-1:-1:-1;34206:58:0;;33917:801;-1:-1:-1;34702:4:0;33745:980;;;;;;:::o;30508:382::-;-1:-1:-1;;;;;30588:16:0;;30580:61;;;;-1:-1:-1;;;30580:61:0;;23899:2:1;30580:61:0;;;23881:21:1;;;23918:18;;;23911:30;23977:34;23957:18;;;23950:62;24029:18;;30580:61:0;23697:356:1;30580:61:0;28491:4;28515:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28515:16:0;:30;30652:58;;;;-1:-1:-1;;;30652:58:0;;24260:2:1;30652:58:0;;;24242:21:1;24299:2;24279:18;;;24272:30;24338;24318:18;;;24311:58;24386:18;;30652:58:0;24058:352:1;30652:58:0;-1:-1:-1;;;;;30781:13:0;;;;;;:9;:13;;;;;:18;;30798:1;;30781:13;:18;;30798:1;;30781:18;:::i;:::-;;;;-1:-1:-1;;30810:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30810:21:0;-1:-1:-1;;;;;30810:21:0;;;;;;;;30849:33;;30810:16;;;30849:33;;30810:16;;30849:33;30508:382;;:::o;41787:1340::-;41895:7;41904:12;42134:9;:16;42154:2;42134:22;42130:990;;;42430:4;42415:20;;42409:27;42480:4;42465:20;;42459:27;42538:4;42523:20;;42517:27;42173:9;42509:36;42581:25;42592:4;42509:36;42409:27;42459;42581:10;:25::i;:::-;42574:32;;;;;;;;;42130:990;42628:9;:16;42648:2;42628:22;42624:496;;;42903:4;42888:20;;42882:27;42954:4;42939:20;;42933:27;42996:23;43007:4;42882:27;42933;42996:10;:23::i;:::-;42989:30;;;;;;;;42624:496;-1:-1:-1;43068:1:0;;-1:-1:-1;43072:35:0;42624:496;41787:1340;;;;;:::o;40058:643::-;40136:20;40127:5;:29;;;;;;;;:::i;:::-;;40123:571;;;40058:643;:::o;40123:571::-;40234:29;40225:5;:38;;;;;;;;:::i;:::-;;40221:473;;;40280:34;;-1:-1:-1;;;40280:34:0;;24749:2:1;40280:34:0;;;24731:21:1;24788:2;24768:18;;;24761:30;24827:26;24807:18;;;24800:54;24871:18;;40280:34:0;24547:348:1;40221:473:0;40345:35;40336:5;:44;;;;;;;;:::i;:::-;;40332:362;;;40397:41;;-1:-1:-1;;;40397:41:0;;25102:2:1;40397:41:0;;;25084:21:1;25141:2;25121:18;;;25114:30;25180:33;25160:18;;;25153:61;25231:18;;40397:41:0;24900:355:1;40332:362:0;40469:30;40460:5;:39;;;;;;;;:::i;:::-;;40456:238;;;40516:44;;-1:-1:-1;;;40516:44:0;;25462:2:1;40516:44:0;;;25444:21:1;25501:2;25481:18;;;25474:30;25540:34;25520:18;;;25513:62;-1:-1:-1;;;25591:18:1;;;25584:32;25633:19;;40516:44:0;25260:398:1;40456:238:0;40591:30;40582:5;:39;;;;;;;;:::i;:::-;;40578:116;;;40638:44;;-1:-1:-1;;;40638:44:0;;25865:2:1;40638:44:0;;;25847:21:1;25904:2;25884:18;;;25877:30;25943:34;25923:18;;;25916:62;-1:-1:-1;;;25994:18:1;;;25987:32;26036:19;;40638:44:0;25663:398:1;45509:1669:0;45640:7;;46601:66;46575:92;;46557:200;;;-1:-1:-1;46710:1:0;;-1:-1:-1;46714:30:0;46694:51;;46557:200;46771:1;:7;;46776:2;46771:7;;:18;;;;;46782:1;:7;;46787:2;46782:7;;46771:18;46767:102;;;-1:-1:-1;46822:1:0;;-1:-1:-1;46826:30:0;46806:51;;46767:102;46983:24;;;46966:14;46983:24;;;;;;;;;26293:25:1;;;26366:4;26354:17;;26334:18;;;26327:45;;;;26388:18;;;26381:34;;;26431:18;;;26424:34;;;46983:24:0;;26265:19:1;;46983:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46983:24:0;;-1:-1:-1;;46983:24:0;;;-1:-1:-1;;;;;;;47022:20:0;;47018:103;;47075:1;47079:29;47059:50;;;;;;;47018:103;47141:6;-1:-1:-1;47149:20:0;;-1:-1:-1;45509:1669:0;;;;;;;;:::o;44455:440::-;44569:7;;-1:-1:-1;;;;;44670:124:0;;44821:3;44817:12;;;44831:2;44813:21;44862:25;44873:4;44813:21;44882:1;44670:124;44862:10;:25::i;:::-;44855:32;;;;;;44455:440;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:173::-;660:20;;-1:-1:-1;;;;;709:31:1;;699:42;;689:70;;755:1;752;745:12;689:70;592:173;;;:::o;770:186::-;829:6;882:2;870:9;861:7;857:23;853:32;850:52;;;898:1;895;888:12;850:52;921:29;940:9;921:29;:::i;1143:258::-;1215:1;1225:113;1239:6;1236:1;1233:13;1225:113;;;1315:11;;;1309:18;1296:11;;;1289:39;1261:2;1254:10;1225:113;;;1356:6;1353:1;1350:13;1347:48;;;-1:-1:-1;;1391:1:1;1373:16;;1366:27;1143:258::o;1406:::-;1448:3;1486:5;1480:12;1513:6;1508:3;1501:19;1529:63;1585:6;1578:4;1573:3;1569:14;1562:4;1555:5;1551:16;1529:63;:::i;:::-;1646:2;1625:15;-1:-1:-1;;1621:29:1;1612:39;;;;1653:4;1608:50;;1406:258;-1:-1:-1;;1406:258:1:o;1669:220::-;1818:2;1807:9;1800:21;1781:4;1838:45;1879:2;1868:9;1864:18;1856:6;1838:45;:::i;1894:180::-;1953:6;2006:2;1994:9;1985:7;1981:23;1977:32;1974:52;;;2022:1;2019;2012:12;1974:52;-1:-1:-1;2045:23:1;;1894:180;-1:-1:-1;1894:180:1:o;2287:254::-;2355:6;2363;2416:2;2404:9;2395:7;2391:23;2387:32;2384:52;;;2432:1;2429;2422:12;2384:52;2455:29;2474:9;2455:29;:::i;:::-;2445:39;2531:2;2516:18;;;;2503:32;;-1:-1:-1;;;2287:254:1:o;2546:328::-;2623:6;2631;2639;2692:2;2680:9;2671:7;2667:23;2663:32;2660:52;;;2708:1;2705;2698:12;2660:52;2731:29;2750:9;2731:29;:::i;:::-;2721:39;;2779:38;2813:2;2802:9;2798:18;2779:38;:::i;:::-;2769:48;;2864:2;2853:9;2849:18;2836:32;2826:42;;2546:328;;;;;:::o;2879:592::-;2950:6;2958;3011:2;2999:9;2990:7;2986:23;2982:32;2979:52;;;3027:1;3024;3017:12;2979:52;3067:9;3054:23;3096:18;3137:2;3129:6;3126:14;3123:34;;;3153:1;3150;3143:12;3123:34;3191:6;3180:9;3176:22;3166:32;;3236:7;3229:4;3225:2;3221:13;3217:27;3207:55;;3258:1;3255;3248:12;3207:55;3298:2;3285:16;3324:2;3316:6;3313:14;3310:34;;;3340:1;3337;3330:12;3310:34;3385:7;3380:2;3371:6;3367:2;3363:15;3359:24;3356:37;3353:57;;;3406:1;3403;3396:12;3353:57;3437:2;3429:11;;;;;3459:6;;-1:-1:-1;2879:592:1;;-1:-1:-1;;;;2879:592:1:o;3476:127::-;3537:10;3532:3;3528:20;3525:1;3518:31;3568:4;3565:1;3558:15;3592:4;3589:1;3582:15;3608:275;3679:2;3673:9;3744:2;3725:13;;-1:-1:-1;;3721:27:1;3709:40;;3779:18;3764:34;;3800:22;;;3761:62;3758:88;;;3826:18;;:::i;:::-;3862:2;3855:22;3608:275;;-1:-1:-1;3608:275:1:o;3888:183::-;3948:4;3981:18;3973:6;3970:30;3967:56;;;4003:18;;:::i;:::-;-1:-1:-1;4048:1:1;4044:14;4060:4;4040:25;;3888:183::o;4076:662::-;4130:5;4183:3;4176:4;4168:6;4164:17;4160:27;4150:55;;4201:1;4198;4191:12;4150:55;4237:6;4224:20;4263:4;4287:60;4303:43;4343:2;4303:43;:::i;:::-;4287:60;:::i;:::-;4381:15;;;4467:1;4463:10;;;;4451:23;;4447:32;;;4412:12;;;;4491:15;;;4488:35;;;4519:1;4516;4509:12;4488:35;4555:2;4547:6;4543:15;4567:142;4583:6;4578:3;4575:15;4567:142;;;4649:17;;4637:30;;4687:12;;;;4600;;4567:142;;;-1:-1:-1;4727:5:1;4076:662;-1:-1:-1;;;;;;4076:662:1:o;4743:1146::-;4861:6;4869;4922:2;4910:9;4901:7;4897:23;4893:32;4890:52;;;4938:1;4935;4928:12;4890:52;4978:9;4965:23;5007:18;5048:2;5040:6;5037:14;5034:34;;;5064:1;5061;5054:12;5034:34;5102:6;5091:9;5087:22;5077:32;;5147:7;5140:4;5136:2;5132:13;5128:27;5118:55;;5169:1;5166;5159:12;5118:55;5205:2;5192:16;5227:4;5251:60;5267:43;5307:2;5267:43;:::i;5251:60::-;5345:15;;;5427:1;5423:10;;;;5415:19;;5411:28;;;5376:12;;;;5451:19;;;5448:39;;;5483:1;5480;5473:12;5448:39;5507:11;;;;5527:148;5543:6;5538:3;5535:15;5527:148;;;5609:23;5628:3;5609:23;:::i;:::-;5597:36;;5560:12;;;;5653;;;;5527:148;;;5694:5;-1:-1:-1;;5737:18:1;;5724:32;;-1:-1:-1;;5768:16:1;;;5765:36;;;5797:1;5794;5787:12;5765:36;;5820:63;5875:7;5864:8;5853:9;5849:24;5820:63;:::i;:::-;5810:73;;;4743:1146;;;;;:::o;5894:254::-;5962:6;5970;6023:2;6011:9;6002:7;5998:23;5994:32;5991:52;;;6039:1;6036;6029:12;5991:52;6075:9;6062:23;6052:33;;6104:38;6138:2;6127:9;6123:18;6104:38;:::i;:::-;6094:48;;5894:254;;;;;:::o;6153:406::-;6217:5;6251:18;6243:6;6240:30;6237:56;;;6273:18;;:::i;:::-;6311:57;6356:2;6335:15;;-1:-1:-1;;6331:29:1;6362:4;6327:40;6311:57;:::i;:::-;6302:66;;6391:6;6384:5;6377:21;6431:3;6422:6;6417:3;6413:16;6410:25;6407:45;;;6448:1;6445;6438:12;6407:45;6497:6;6492:3;6485:4;6478:5;6474:16;6461:43;6551:1;6544:4;6535:6;6528:5;6524:18;6520:29;6513:40;6153:406;;;;;:::o;6564:220::-;6606:5;6659:3;6652:4;6644:6;6640:17;6636:27;6626:55;;6677:1;6674;6667:12;6626:55;6699:79;6774:3;6765:6;6752:20;6745:4;6737:6;6733:17;6699:79;:::i;6789:737::-;6885:6;6893;6901;6954:2;6942:9;6933:7;6929:23;6925:32;6922:52;;;6970:1;6967;6960:12;6922:52;7006:9;6993:23;6983:33;;7067:2;7056:9;7052:18;7039:32;7090:18;7131:2;7123:6;7120:14;7117:34;;;7147:1;7144;7137:12;7117:34;7170:49;7211:7;7202:6;7191:9;7187:22;7170:49;:::i;:::-;7160:59;;7272:2;7261:9;7257:18;7244:32;7228:48;;7301:2;7291:8;7288:16;7285:36;;;7317:1;7314;7307:12;7285:36;-1:-1:-1;7340:24:1;;7395:4;7387:13;;7383:27;-1:-1:-1;7373:55:1;;7424:1;7421;7414:12;7373:55;7447:73;7512:7;7507:2;7494:16;7489:2;7485;7481:11;7447:73;:::i;:::-;7437:83;;;6789:737;;;;;:::o;7531:347::-;7596:6;7604;7657:2;7645:9;7636:7;7632:23;7628:32;7625:52;;;7673:1;7670;7663:12;7625:52;7696:29;7715:9;7696:29;:::i;:::-;7686:39;;7775:2;7764:9;7760:18;7747:32;7822:5;7815:13;7808:21;7801:5;7798:32;7788:60;;7844:1;7841;7834:12;7788:60;7867:5;7857:15;;;7531:347;;;;;:::o;7883:537::-;7978:6;7986;7994;8002;8055:3;8043:9;8034:7;8030:23;8026:33;8023:53;;;8072:1;8069;8062:12;8023:53;8095:29;8114:9;8095:29;:::i;:::-;8085:39;;8143:38;8177:2;8166:9;8162:18;8143:38;:::i;:::-;8133:48;;8228:2;8217:9;8213:18;8200:32;8190:42;;8283:2;8272:9;8268:18;8255:32;8310:18;8302:6;8299:30;8296:50;;;8342:1;8339;8332:12;8296:50;8365:49;8406:7;8397:6;8386:9;8382:22;8365:49;:::i;:::-;8355:59;;;7883:537;;;;;;;:::o;8425:260::-;8493:6;8501;8554:2;8542:9;8533:7;8529:23;8525:32;8522:52;;;8570:1;8567;8560:12;8522:52;8593:29;8612:9;8593:29;:::i;:::-;8583:39;;8641:38;8675:2;8664:9;8660:18;8641:38;:::i;8690:380::-;8769:1;8765:12;;;;8812;;;8833:61;;8887:4;8879:6;8875:17;8865:27;;8833:61;8940:2;8932:6;8929:14;8909:18;8906:38;8903:161;;;8986:10;8981:3;8977:20;8974:1;8967:31;9021:4;9018:1;9011:15;9049:4;9046:1;9039:15;8903:161;;8690:380;;;:::o;10315:356::-;10517:2;10499:21;;;10536:18;;;10529:30;10595:34;10590:2;10575:18;;10568:62;10662:2;10647:18;;10315:356::o;10676:413::-;10878:2;10860:21;;;10917:2;10897:18;;;10890:30;10956:34;10951:2;10936:18;;10929:62;-1:-1:-1;;;11022:2:1;11007:18;;11000:47;11079:3;11064:19;;10676:413::o;11911:127::-;11972:10;11967:3;11963:20;11960:1;11953:31;12003:4;12000:1;11993:15;12027:4;12024:1;12017:15;12043:127;12104:10;12099:3;12095:20;12092:1;12085:31;12135:4;12132:1;12125:15;12159:4;12156:1;12149:15;12175:135;12214:3;-1:-1:-1;;12235:17:1;;12232:43;;;12255:18;;:::i;:::-;-1:-1:-1;12302:1:1;12291:13;;12175:135::o;12726:128::-;12766:3;12797:1;12793:6;12790:1;12787:13;12784:39;;;12803:18;;:::i;:::-;-1:-1:-1;12839:9:1;;12726:128::o;14042:168::-;14082:7;14148:1;14144;14140:6;14136:14;14133:1;14130:21;14125:1;14118:9;14111:17;14107:45;14104:71;;;14155:18;;:::i;:::-;-1:-1:-1;14195:9:1;;14042:168::o;16512:470::-;16691:3;16729:6;16723:13;16745:53;16791:6;16786:3;16779:4;16771:6;16767:17;16745:53;:::i;:::-;16861:13;;16820:16;;;;16883:57;16861:13;16820:16;16917:4;16905:17;;16883:57;:::i;:::-;16956:20;;16512:470;-1:-1:-1;;;;16512:470:1:o;18104:125::-;18144:4;18172:1;18169;18166:8;18163:34;;;18177:18;;:::i;:::-;-1:-1:-1;18214:9:1;;18104:125::o;19869:501::-;20056:3;20088:26;20084:31;20157:2;20148:6;20144:2;20140:15;20136:24;20131:3;20124:37;20212:2;20203:6;20199:2;20195:15;20191:24;20186:2;20181:3;20177:12;20170:46;;20245:6;20239:13;20261:62;20316:6;20311:2;20306:3;20302:12;20295:4;20287:6;20283:17;20261:62;:::i;:::-;20343:16;;;;20361:2;20339:25;;19869:501;-1:-1:-1;;;;19869:501:1:o;21490:414::-;21692:2;21674:21;;;21731:2;21711:18;;;21704:30;21770:34;21765:2;21750:18;;21743:62;-1:-1:-1;;;21836:2:1;21821:18;;21814:48;21894:3;21879:19;;21490:414::o;21909:127::-;21970:10;21965:3;21961:20;21958:1;21951:31;22001:4;21998:1;21991:15;22025:4;22022:1;22015:15;22041:120;22081:1;22107;22097:35;;22112:18;;:::i;:::-;-1:-1:-1;22146:9:1;;22041:120::o;22166:112::-;22198:1;22224;22214:35;;22229:18;;:::i;:::-;-1:-1:-1;22263:9:1;;22166:112::o;22668:276::-;22799:3;22837:6;22831:13;22853:53;22899:6;22894:3;22887:4;22879:6;22875:17;22853:53;:::i;:::-;22922:16;;;;;22668:276;-1:-1:-1;;22668:276:1:o;22949:489::-;-1:-1:-1;;;;;23218:15:1;;;23200:34;;23270:15;;23265:2;23250:18;;23243:43;23317:2;23302:18;;23295:34;;;23365:3;23360:2;23345:18;;23338:31;;;23143:4;;23386:46;;23412:19;;23404:6;23386:46;:::i;:::-;23378:54;22949:489;-1:-1:-1;;;;;;22949:489:1:o;23443:249::-;23512:6;23565:2;23553:9;23544:7;23540:23;23536:32;23533:52;;;23581:1;23578;23571:12;23533:52;23613:9;23607:16;23632:30;23656:5;23632:30;:::i;24415:127::-;24476:10;24471:3;24467:20;24464:1;24457:31;24507:4;24504:1;24497:15;24531:4;24528:1;24521:15

Swarm Source

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