ETH Price: $3,921.53 (-0.31%)

Token

RaveRavens (RAVE)
 

Overview

Max Total Supply

5,555 RAVE

Holders

2,069

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 RAVE
0xe072cb60847afba3647a96bd442ec40b67e9c67f
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
RaveRavens

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-01
*/

//    ▄████████    ▄████████  ▄█    █▄     ▄████████         ▄████████    ▄████████  ▄█    █▄     ▄████████ ███▄▄▄▄      ▄████████ 
//   ███    ███   ███    ███ ███    ███   ███    ███        ███    ███   ███    ███ ███    ███   ███    ███ ███▀▀▀██▄   ███    ███ 
//   ███    ███   ███    ███ ███    ███   ███    █▀         ███    ███   ███    ███ ███    ███   ███    █▀  ███   ███   ███    █▀  
//  ▄███▄▄▄▄██▀   ███    ███ ███    ███  ▄███▄▄▄           ▄███▄▄▄▄██▀   ███    ███ ███    ███  ▄███▄▄▄     ███   ███   ███        
// ▀▀███▀▀▀▀▀   ▀███████████ ███    ███ ▀▀███▀▀▀          ▀▀███▀▀▀▀▀   ▀███████████ ███    ███ ▀▀███▀▀▀     ███   ███ ▀███████████ 
// ▀███████████   ███    ███ ███    ███   ███    █▄       ▀███████████   ███    ███ ███    ███   ███    █▄  ███   ███          ███ 
//   ███    ███   ███    ███ ███    ███   ███    ███        ███    ███   ███    ███ ███    ███   ███    ███ ███   ███    ▄█    ███ 
//   ███    ███   ███    █▀   ▀██████▀    ██████████        ███    ███   ███    █▀   ▀██████▀    ██████████  ▀█   █▀   ▄████████▀  
//   ███    ███                                             ███    ███                                                             
// ******************************************@@@/**************&@@@,,,,           @@@@*******************************************************************
// ..**..*****************/////////**********@@%@@**********@@@*.                     @@@@***********************************..........**.,**************
// *******************///////////////******@@%%(((@@@@****@@..     @@@@@@@@@@@@@((((      @@************************************************************/
// *******************////////*************@@%%%%%((((@@((    @#(((/////////////////##@@@@// %@*********************************************************/
// ********************************....@@..@@##%%%%%@@((    @@(((////////***********,,,,,,##@@@**********************************************************
// ************************************@@@@**@@%%%@@((    @@(((//////****////*******,,,,,,,,,(#@@********************************************************
// **************************************@@##@@%@@((((  @@%%%%%##////**///////**********,,,,,,,**##@@****************************************************
// **************************************@@//((@@@@@@@@@%%%%%%%((////////////*************,,,,,,,,,((@@**************************************************
// **************************************@@##@@ ....((@@%%%%%%(((((////////*****////********,,,,,,,,,@@@@************************************************
// **************************************@@,,((@@@  ..((@@%%((@@@@@@@@@@@/////**//****//**///**,,,,,,//@@@@@(********************************************
// ********.......**..**..***************@@((@@@@@@@  ..##@@((@@@@@@@@@@@@@@@@(/////******///**////////@@..@(*******************************........**..*
// **************************************@@((@@@@@@@  ..##@@((@@@%%%%//////%%@@@@@//////*********//////@@..@(********************************************
// **************************************@@((@@#@@@@  ..##@@(((&@@@&@,,..       ((&&@@/////////////////@@  @(********************************************
// **************************************@@((@@#%%@@  ..##@@(((((@@@@@@,,..       //&&@@///////////////@@//@(********************************************
// **************************************@@((@@#%%@@  ..##@@(((((/(@@@@@@,,..       //%%@@(((////((////@@&&@*.....,,,,..,,,,,****************************
// *******************,,...........,,,,,,@@((@@@@@@@  ..##@@(((((((((((((@@&&&&&&&&&&&@@((((@@&&&&&&&&&&&@@@@@@@****************************************,
// **********,,.........*****************@@..,,@@@  ,,##@@((((((((((((((((((((((((((((((((@@&&&&&@@@@&&#########@@@@@@@@**********************,,.........
// ****,,,,,,..****************************@@..,  ////%%@@((((((((((((((((((((((((((((((@@&&&&&@@&&&&&&&&&&#############@@@(*************,,,,,..*********
// ******************************************//&@@@@@@######((((((((((((((((((((((((((((@@&&&&&&&&&&&&&&&######################@@@@**********************
// *********************************************@@##########//((((((((((((((((((((((((@@&&&&&&&&&&&&&&&&&&&######################&&@@********************
// ,,............,,,,,,,**,,.............@@@@@@@//////########((((((((((((((((((((((((@@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#############&&@@...........,,,,,,,
// ******************************........**@@(((((////######%%%(((((((((((((((((((((@@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&####&&&&@@****************
// ..............,**********,,.......********@@(((#(######%%%%##%(((((((((((((((((@@&&&&&&&&@@@@@@@@@@@@@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@/.......,,*****
// ********,,..**.........,,,,,,...************@@@((########%%%%%%%(((((((((((((@@&&&&&&@@@@&&&&&&&&&&&&&@@@@@@@@@@@@@&&&&&&&&&&&&&&&&&&&@(*,,..**.......
// ******,,..**********************,,,,,,,,@@((/////((&&@@@@@@#######%%%%(((((@@&&&&&&&&&&&&&@@@@@@@@////((&@@@@******///////////@@@@@@&&@(,..***********
// ....,,******************************,,@@((%%%%%((****((&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@##**%%%%%%%%%%%&&@@,,,,.................@@@(**************
// ************************************@@((((*******((####((%%&&&@@//@@###############%%%%%%@@@&&&&##******&&&&&@@***************************************
// *******************,,**,,,,,,.......,,,,@@%%%%%((((((////%%%&&&&@@@@((&&@@@@@@@@@@@@@@@@@/%&&&&&&&((((///////((@@************************************,
// ******,,,,,,,,********************,,..@@&&&&@@@@@@@@@******(%%&&&&@@@@  &&&%%%%%%%%%%&&  @&&&&&&&@*******#%&&&&@@**********************,,,,,,,,*******
// ,,,,,,,,,,************************,,@@&&&&&&&&&&&&&&&@@*****//%%%%&&@@@@  @@@@@@@@@@@  @@&@@&&%%****//(((&@@@@@..,,,,,,,,,,,,,,,,,,,,,,,,,,***********
// **,,..*********************,,.....@@&&&&&&&&&&&&&&&&&&&@@@@@&&////%%&&@@@@&&&..@@@@**@@@@&%%&&**((@@@@@@@@@@@@@*********************,,.,**************
// **......,,***********,,.........**@@@@&&&&&&&&&&&&&&&&&&&@@@@@@@@@##%%&&@@@@@@@////@@@@@@&&&**((@@@@@@@@@@@@@***********************.....,,***********
// ,,.......................,,,,,,,**@@@@@@&&%%%%&&&&&&&@@&&@@@@@##@@@@%%%%&&@@@@@  ,,@@@@@@@&&**##%%@@@@@@@&&@@*****************,,,,,,..................
// ,,,,.................,,,,,,,,,,,,,,,**@@@@%%%%&((%%&&&&@@@@@@@@@&&@@@@@@&&&@@@@  ..@@@@@@&&&%%%%@@@@@@@@&&&@@**,,,,,,,,,,,,,,,,,,,,,,,................
// ....................................@@@@&&&&%&&&&((&&&&@@@@@@@@@&&@@@@@@@@#&&@@@@@@@@@@@@@&&##%%@@@@@@&&&&&@@@@.......................................
// ********,,....,,,***************,,,,@@@@@@((&&&%%&&&&@@@@@@@@@@@&&&&@@@@..@@@@@@@@@@@@@@@@@&##&&@@@@@@@@&&&@@@@........,,,,,,,,,*********,,....,,,,***
// ************.......,,*************@@@@&&&&&&#((%%((@@@@@@@@@@@&&&&&&@@@@..@@@@@@@@@@@@@@@@#(@@@@@@@@@@@@@@@@@@@@@,,,,,,,*********************........,
// ********,,......................@@@@@@&&&&&&@@@((&&@@@@@@@@@@@@@@@&&@@@@//&,.@@@@@@@@@@@@@*.@@@@@@@@@@@@@@@@@&&@@,,,,,,,,,***************,,...........
// .............................,,,@@@@@@@@&&&&&&&%%&&@@@@@@@@@@@@@@@@@@@@@ .&@@@@@@@@@@@@@@@#/@@@@&&@@@@@@@@@&&&&@@@@...................................
// ....*******************,,,,,,,&&@@&&&&&&&&%%&&&&&@@@@@@@@&&&&&&&&@@@@@&&@@,%@,,@@@@@@@@@@/&@&&@@&&&&@@@@@&&&&&&&&@@&&.................****************
// ....,,***************,,,,,,,,,@@@@&&&&&&%%@@#%%@@@@@@@@@@&&&&&&&&@@@@@&&@@/&@@@@@@@@@@@@@.%@@@@@&&&&@@@@@@@&&&&&&&&@@.................,***************
// ........,,,,,,*******,,,,,,,,,@@&&&&&&@@@@@@@@@@@@@@@@@&&&&&&&&&&&@@@@&&@@.&@@@@@@@@@@@@@/&@@@@@&&&&@@@@@@@@@@@@@@@@@@@..................,,,,,,*******


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

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


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

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

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




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


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

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


// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

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

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

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

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

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

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

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

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

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

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

            if (to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

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

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

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

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex != end);

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}


// Creator: Chiru Labs

pragma solidity ^0.8.4;

error InvalidQueryRange();

/**
 * @title ERC721A Queryable
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) public view returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _currentIndex) {
            return ownership;
        }
        ownership = _ownerships[tokenId];
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory) {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _currentIndex;
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, _currentIndex)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
                ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory) {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
                ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}



pragma solidity ^0.8.14;

contract RaveRavens is ERC721AQueryable, Ownable {
    using Strings for uint256;
    
    uint256 public MAX_PARTY = 5555;
    uint256 public PLUS_ONE = 2;
    uint256 public MAX_GUESTS = 10;
    uint256 public ENTRY_TICKET = 0.0069 ether;

    uint256 public RAAAAAVE = 5;

    mapping(uint256 => uint256) public tokenTransfersCount;

    address RA = 0x02bB8CfAFe1666742A42A348cAd8A4a5Df838055;
    address VEN = 0x01eEf68380E0854b21b0cC36F4df338eD80bbc99;

    bool public partyOn = false;

    string private unRAVEaled;
    string private RAVEn;
    string private RAVING;
    string private RAVElation;

    mapping(address => uint) public guestsWasted;

    constructor() ERC721A("RaveRavens", "RAVE") {}

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

    function mint(uint256 _count) external payable {
        uint256 supply = totalSupply();
        uint256 ravensRaved = guestsWasted[_msgSender()];

        require(partyOn,  "Club is closed");
        require(supply + _count <= MAX_PARTY, "Too late");
        require(_count <= MAX_GUESTS, "Too many");

        if ( ravensRaved < PLUS_ONE && _count <= (PLUS_ONE - ravensRaved)  ) {
            require(msg.value == 0, "Nope");
        }
        else if (ravensRaved >= PLUS_ONE) {
            require(msg.value == ENTRY_TICKET * _count, "Nope");
        }
        else {
            require(msg.value == ENTRY_TICKET * ( _count + ravensRaved - PLUS_ONE), "Nope");
        }

        guestsWasted[_msgSender()] += _count;
        _safeMint(msg.sender, _count);
     
    }

    function invite(uint256 _count, address _address) external onlyOwner {
        uint256 supply = totalSupply();
        require(supply + _count <= MAX_PARTY, "Too late");
        _safeMint(_address, _count);
    }    


    //checks if address owns more than RAAAAAVE number of tokens
    function isPartyAnimal(address _wallet) public view returns (bool) {
        uint256 ownedByAddress = balanceOf(_wallet);
        return (ownedByAddress >= RAAAAAVE);
    }

    //baseURI is assigned based on the number of tokens held and transfers count
    function _baseURI(uint256 _tokenId) internal view virtual returns (string memory) {
        (bool _partyAnimal) = isPartyAnimal(ownerOf(_tokenId));
        uint256 transfersCount = tokenTransfersCount[_tokenId];

        if (transfersCount == 0) {
            return unRAVEaled;
        } else if (transfersCount < RAAAAAVE)
        {      
            if (!_partyAnimal) {
                return RAVEn;
            } else
            {
                return RAVING;
            }
        
        } else {
            return RAVElation;
        }
    }

    // check how many times the token has been transfered
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override(ERC721A) {
        super.transferFrom(from, to, tokenId);
            unchecked {
                tokenTransfersCount[tokenId]++;
            }
    }    

    function tokenURI(uint256 _tokenId) public view override returns (string memory) {
        require(_exists(_tokenId), "Nope");
        return string(abi.encodePacked(_baseURI(_tokenId), _tokenId.toString(),".json"));
    }

    function getPartyStarted() external onlyOwner {
        partyOn = !partyOn;
    }

    function setBaseURI_0(string memory baseURI) public onlyOwner {
        unRAVEaled = baseURI;
    }

    function setBaseURI_1(string memory baseURI) public onlyOwner {
        RAVEn = baseURI;
    }

    function setBaseURI_2(string memory baseURI) public onlyOwner {
        RAVING = baseURI;
    }

    function setBaseURI_3(string memory baseURI) public onlyOwner {
        RAVElation = baseURI;
    }

    function setMaxFree(uint256 _supply) public onlyOwner {
        PLUS_ONE = _supply;
    }

    function setENTRY_TICKET(uint256 _newENTRY_TICKET) external onlyOwner {
        ENTRY_TICKET = _newENTRY_TICKET;
    }

    //cap supply
    function callBouncer() public onlyOwner {
        MAX_PARTY = totalSupply();
    }

    function goHome() public payable onlyOwner {
        uint256 _share = address(this).balance / 100;
        require(payable(RA).send(_share * 50));
        require(payable(VEN).send(_share * 50));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"ENTRY_TICKET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_GUESTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PARTY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PLUS_ONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RAAAAAVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callBouncer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct ERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPartyStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"goHome","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"guestsWasted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"invite","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"isPartyAnimal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"partyOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI_0","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI_1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI_2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI_3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newENTRY_TICKET","type":"uint256"}],"name":"setENTRY_TICKET","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"setMaxFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenTransfersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526115b36009556002600a908155600b556618838370f34000600c556005600d55600f80546001600160a01b0319167302bb8cfafe1666742a42a348cad8a4a5df838055179055601080546001600160a81b0319167301eef68380e0854b21b0cc36f4df338ed80bbc991790553480156200007d57600080fd5b506040518060400160405280600a81526020016952617665526176656e7360b01b815250604051806040016040528060048152602001635241564560e01b8152508160029081620000cf9190620001ee565b506003620000de8282620001ee565b5050600160005550620000f133620000f7565b620002ba565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200017457607f821691505b6020821081036200019557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001e957600081815260208120601f850160051c81016020861015620001c45750805b601f850160051c820191505b81811015620001e557828155600101620001d0565b5050505b505050565b81516001600160401b038111156200020a576200020a62000149565b62000222816200021b84546200015f565b846200019b565b602080601f8311600181146200025a5760008415620002415750858301515b600019600386901b1c1916600185901b178555620001e5565b600085815260208120601f198616915b828110156200028b578886015182559484019460019091019084016200026a565b5085821015620002aa5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61268c80620002ca6000396000f3fe6080604052600436106102465760003560e01c80638462151c11610139578063afc25c0d116100b6578063dd4d46eb1161007a578063dd4d46eb146106c4578063e3c4650d146106da578063e43109b6146106f0578063e985e9c514610705578063f2fde38b14610725578063fc4862e41461074557600080fd5b8063afc25c0d14610617578063b88d4fde14610637578063c23dc68f14610657578063c87b56dd14610684578063d755bf99146106a457600080fd5b8063936cc8ef116100fd578063936cc8ef1461058f57806395d89b41146105af57806399a2557a146105c4578063a0712d68146105e4578063a22cb465146105f757600080fd5b80638462151c146104fb578063895613d9146105285780638ca30d29146105495780638da5cb5b146105695780639055c1111461058757600080fd5b80635b30c79b116101c757806370a082311161018b57806370a0823114610470578063715018a6146104905780637ae69023146104a55780637d138ccc146104c5578063801c6014146104e557600080fd5b80635b30c79b146103d85780635bbb2177146103ee5780636352211e1461041b57806369da64ad1461043b5780636bf1403f1461045b57600080fd5b80631a55e8241161020e5780631a55e824146103285780631aaec83c1461035557806321e7ea321461036b57806323b872dd1461039857806342842e0e146103b857600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806318160ddd146102fc575b600080fd5b34801561025757600080fd5b5061026b610266366004611e73565b610765565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102956107b7565b6040516102779190611ee8565b3480156102ae57600080fd5b506102c26102bd366004611efb565b610849565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f5366004611f30565b61088d565b005b34801561030857600080fd5b5061031a600154600054036000190190565b604051908152602001610277565b34801561033457600080fd5b5061031a610343366004611efb565b600e6020526000908152604090205481565b34801561036157600080fd5b5061031a600c5481565b34801561037757600080fd5b5061031a610386366004611f5a565b60156020526000908152604090205481565b3480156103a457600080fd5b506102fa6103b3366004611f75565b61091a565b3480156103c457600080fd5b506102fa6103d3366004611f75565b61093e565b3480156103e457600080fd5b5061031a600a5481565b3480156103fa57600080fd5b5061040e610409366004611ff7565b610959565b604051610277919061209c565b34801561042757600080fd5b506102c2610436366004611efb565b610a1f565b34801561044757600080fd5b506102fa61045636600461215d565b610a31565b34801561046757600080fd5b506102fa610a74565b34801561047c57600080fd5b5061031a61048b366004611f5a565b610ab4565b34801561049c57600080fd5b506102fa610b02565b3480156104b157600080fd5b506102fa6104c03660046121a5565b610b38565b3480156104d157600080fd5b5061026b6104e0366004611f5a565b610bc8565b3480156104f157600080fd5b5061031a600d5481565b34801561050757600080fd5b5061051b610516366004611f5a565b610be0565b60405161027791906121d1565b34801561053457600080fd5b5060105461026b90600160a01b900460ff1681565b34801561055557600080fd5b506102fa610564366004611efb565b610d25565b34801561057557600080fd5b506008546001600160a01b03166102c2565b6102fa610d54565b34801561059b57600080fd5b506102fa6105aa36600461215d565b610e05565b3480156105bb57600080fd5b50610295610e3b565b3480156105d057600080fd5b5061051b6105df366004612209565b610e4a565b6102fa6105f2366004611efb565b61100b565b34801561060357600080fd5b506102fa61061236600461223c565b6111eb565b34801561062357600080fd5b506102fa61063236600461215d565b611280565b34801561064357600080fd5b506102fa610652366004612278565b6112b6565b34801561066357600080fd5b50610677610672366004611efb565b611307565b60405161027791906122f3565b34801561069057600080fd5b5061029561069f366004611efb565b6113c1565b3480156106b057600080fd5b506102fa6106bf366004611efb565b611421565b3480156106d057600080fd5b5061031a600b5481565b3480156106e657600080fd5b5061031a60095481565b3480156106fc57600080fd5b506102fa611450565b34801561071157600080fd5b5061026b610720366004612328565b61149b565b34801561073157600080fd5b506102fa610740366004611f5a565b6114c9565b34801561075157600080fd5b506102fa61076036600461215d565b611561565b60006001600160e01b031982166380ac58cd60e01b148061079657506001600160e01b03198216635b5e139f60e01b145b806107b157506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600280546107c690612352565b80601f01602080910402602001604051908101604052809291908181526020018280546107f290612352565b801561083f5780601f106108145761010080835404028352916020019161083f565b820191906000526020600020905b81548152906001019060200180831161082257829003601f168201915b5050505050905090565b600061085482611597565b610871576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061089882610a1f565b9050806001600160a01b0316836001600160a01b0316036108cc5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906108ec57506108ea813361149b565b155b1561090a576040516367d9dca160e11b815260040160405180910390fd5b6109158383836115d0565b505050565b61092583838361162c565b6000908152600e60205260409020805460010190555050565b610915838383604051806020016040528060008152506112b6565b80516060906000816001600160401b0381111561097857610978611fb1565b6040519080825280602002602001820160405280156109c357816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816109965790505b50905060005b828114610a17576109f28582815181106109e5576109e561238c565b6020026020010151611307565b828281518110610a0457610a0461238c565b60209081029190910101526001016109c9565b509392505050565b6000610a2a82611637565b5192915050565b6008546001600160a01b03163314610a645760405162461bcd60e51b8152600401610a5b906123a2565b60405180910390fd5b6012610a708282612425565b5050565b6008546001600160a01b03163314610a9e5760405162461bcd60e51b8152600401610a5b906123a2565b610aaf600154600054036000190190565b600955565b60006001600160a01b038216610add576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b03163314610b2c5760405162461bcd60e51b8152600401610a5b906123a2565b610b36600061175e565b565b6008546001600160a01b03163314610b625760405162461bcd60e51b8152600401610a5b906123a2565b6000610b75600154600054036000190190565b600954909150610b8584836124fa565b1115610bbe5760405162461bcd60e51b8152602060048201526008602482015267546f6f206c61746560c01b6044820152606401610a5b565b61091582846117b0565b600080610bd483610ab4565b600d5411159392505050565b60606000806000610bf085610ab4565b90506000816001600160401b03811115610c0c57610c0c611fb1565b604051908082528060200260200182016040528015610c35578160200160208202803683370190505b509050610c5b604080516060810182526000808252602082018190529181019190915290565b60015b838614610d1957600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529250610d115781516001600160a01b031615610cd257815194505b876001600160a01b0316856001600160a01b031603610d115780838780600101985081518110610d0457610d0461238c565b6020026020010181815250505b600101610c5e565b50909695505050505050565b6008546001600160a01b03163314610d4f5760405162461bcd60e51b8152600401610a5b906123a2565b600c55565b6008546001600160a01b03163314610d7e5760405162461bcd60e51b8152600401610a5b906123a2565b6000610d8b606447612528565b600f549091506001600160a01b03166108fc610da883603261253c565b6040518115909202916000818181858888f19350505050610dc857600080fd5b6010546001600160a01b03166108fc610de283603261253c565b6040518115909202916000818181858888f19350505050610e0257600080fd5b50565b6008546001600160a01b03163314610e2f5760405162461bcd60e51b8152600401610a5b906123a2565b6014610a708282612425565b6060600380546107c690612352565b6060818310610e6c57604051631960ccad60e11b815260040160405180910390fd5b600080546001851015610e7e57600194505b80841115610e8a578093505b6000610e9587610ab4565b905084861015610eb45785850381811015610eae578091505b50610eb8565b5060005b6000816001600160401b03811115610ed257610ed2611fb1565b604051908082528060200260200182016040528015610efb578160200160208202803683370190505b50905081600003610f1157935061100492505050565b6000610f1c88611307565b905060008160400151610f2d575080515b885b888114158015610f3f5750848714155b15610ff857600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529350610ff05782516001600160a01b031615610fb157825191505b8a6001600160a01b0316826001600160a01b031603610ff05780848880600101995081518110610fe357610fe361238c565b6020026020010181815250505b600101610f2f565b50505092835250909150505b9392505050565b600061101e600154600054036000190190565b3360009081526015602052604090205460105491925090600160a01b900460ff1661107c5760405162461bcd60e51b815260206004820152600e60248201526d10db1d58881a5cc818db1bdcd95960921b6044820152606401610a5b565b60095461108984846124fa565b11156110c25760405162461bcd60e51b8152602060048201526008602482015267546f6f206c61746560c01b6044820152606401610a5b565b600b548311156110ff5760405162461bcd60e51b8152602060048201526008602482015267546f6f206d616e7960c01b6044820152606401610a5b565b600a548110801561111d575080600a54611119919061255b565b8311155b156111455734156111405760405162461bcd60e51b8152600401610a5b90612572565b6111bc565b600a54811061117a5782600c5461115c919061253c565b34146111405760405162461bcd60e51b8152600401610a5b90612572565b600a5461118782856124fa565b611191919061255b565b600c5461119e919061253c565b34146111bc5760405162461bcd60e51b8152600401610a5b90612572565b33600090815260156020526040812080548592906111db9084906124fa565b90915550610915905033846117b0565b336001600160a01b038316036112145760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b031633146112aa5760405162461bcd60e51b8152600401610a5b906123a2565b6011610a708282612425565b6112c18484846117ca565b6001600160a01b0383163b151580156112e357506112e1848484846119b7565b155b15611301576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6040805160608082018352600080835260208084018290528385018290528451928301855281835282018190529281019290925290600183108061134d57506000548310155b156113585792915050565b50600082815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615801592820192909252906113b85792915050565b61100483611637565b60606113cc82611597565b6113e85760405162461bcd60e51b8152600401610a5b90612572565b6113f182611aa3565b6113fa83611b96565b60405160200161140b929190612590565b6040516020818303038152906040529050919050565b6008546001600160a01b0316331461144b5760405162461bcd60e51b8152600401610a5b906123a2565b600a55565b6008546001600160a01b0316331461147a5760405162461bcd60e51b8152600401610a5b906123a2565b6010805460ff60a01b198116600160a01b9182900460ff1615909102179055565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6008546001600160a01b031633146114f35760405162461bcd60e51b8152600401610a5b906123a2565b6001600160a01b0381166115585760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a5b565b610e028161175e565b6008546001600160a01b0316331461158b5760405162461bcd60e51b8152600401610a5b906123a2565b6013610a708282612425565b6000816001111580156115ab575060005482105b80156107b1575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6109158383836117ca565b60408051606081018252600080825260208201819052918101919091528180600111158015611667575060005481105b1561174557600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906117435780516001600160a01b0316156116da579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521561173e579392505050565b6116da565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610a70828260405180602001604052806000815250611c96565b60006117d582611637565b9050836001600160a01b031681600001516001600160a01b03161461180c5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061182a575061182a853361149b565b8061184557503361183a84610849565b6001600160a01b0316145b90508061186557604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661188c57604051633a954ecd60e21b815260040160405180910390fd5b611898600084876115d0565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661196c57600054821461196c57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906119ec9033908990889088906004016125cf565b6020604051808303816000875af1925050508015611a27575060408051601f3d908101601f19168201909252611a249181019061260c565b60015b611a85573d808015611a55576040519150601f19603f3d011682016040523d82523d6000602084013e611a5a565b606091505b508051600003611a7d576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60606000611ab36104e084610a1f565b6000848152600e6020526040812054919250819003611b605760118054611ad990612352565b80601f0160208091040260200160405190810160405280929190818152602001828054611b0590612352565b8015611b525780601f10611b2757610100808354040283529160200191611b52565b820191906000526020600020905b815481529060010190602001808311611b3557829003601f168201915b505050505092505050919050565b600d54811015611b895781611b7c5760128054611ad990612352565b60138054611ad990612352565b60148054611ad990612352565b606081600003611bbd5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611be75780611bd181612629565b9150611be09050600a83612528565b9150611bc1565b6000816001600160401b03811115611c0157611c01611fb1565b6040519080825280601f01601f191660200182016040528015611c2b576020820181803683370190505b5090505b8415611a9b57611c4060018361255b565b9150611c4d600a86612642565b611c589060306124fa565b60f81b818381518110611c6d57611c6d61238c565b60200101906001600160f81b031916908160001a905350611c8f600a86612528565b9450611c2f565b6000546001600160a01b038416611cbf57604051622e076360e81b815260040160405180910390fd5b82600003611ce05760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15611e08575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611dd160008784806001019550876119b7565b611dee576040516368d2bf6b60e11b815260040160405180910390fd5b808203611d86578260005414611e0357600080fd5b611e4d565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203611e09575b5060009081556113019085838684565b6001600160e01b031981168114610e0257600080fd5b600060208284031215611e8557600080fd5b813561100481611e5d565b60005b83811015611eab578181015183820152602001611e93565b838111156113015750506000910152565b60008151808452611ed4816020860160208601611e90565b601f01601f19169290920160200192915050565b6020815260006110046020830184611ebc565b600060208284031215611f0d57600080fd5b5035919050565b80356001600160a01b0381168114611f2b57600080fd5b919050565b60008060408385031215611f4357600080fd5b611f4c83611f14565b946020939093013593505050565b600060208284031215611f6c57600080fd5b61100482611f14565b600080600060608486031215611f8a57600080fd5b611f9384611f14565b9250611fa160208501611f14565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611fef57611fef611fb1565b604052919050565b6000602080838503121561200a57600080fd5b82356001600160401b038082111561202157600080fd5b818501915085601f83011261203557600080fd5b81358181111561204757612047611fb1565b8060051b9150612058848301611fc7565b818152918301840191848101908884111561207257600080fd5b938501935b8385101561209057843582529385019390850190612077565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610d19576120f383855180516001600160a01b031682526020808201516001600160401b0316908301526040908101511515910152565b92840192606092909201916001016120b8565b60006001600160401b0383111561211f5761211f611fb1565b612132601f8401601f1916602001611fc7565b905082815283838301111561214657600080fd5b828260208301376000602084830101529392505050565b60006020828403121561216f57600080fd5b81356001600160401b0381111561218557600080fd5b8201601f8101841361219657600080fd5b611a9b84823560208401612106565b600080604083850312156121b857600080fd5b823591506121c860208401611f14565b90509250929050565b6020808252825182820181905260009190848201906040850190845b81811015610d19578351835292840192918401916001016121ed565b60008060006060848603121561221e57600080fd5b61222784611f14565b95602085013595506040909401359392505050565b6000806040838503121561224f57600080fd5b61225883611f14565b91506020830135801515811461226d57600080fd5b809150509250929050565b6000806000806080858703121561228e57600080fd5b61229785611f14565b93506122a560208601611f14565b92506040850135915060608501356001600160401b038111156122c757600080fd5b8501601f810187136122d857600080fd5b6122e787823560208401612106565b91505092959194509250565b81516001600160a01b031681526020808301516001600160401b031690820152604080830151151590820152606081016107b1565b6000806040838503121561233b57600080fd5b61234483611f14565b91506121c860208401611f14565b600181811c9082168061236657607f821691505b60208210810361238657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b601f82111561091557600081815260208120601f850160051c810160208610156123fe5750805b601f850160051c820191505b8181101561241d5782815560010161240a565b505050505050565b81516001600160401b0381111561243e5761243e611fb1565b6124528161244c8454612352565b846123d7565b602080601f831160018114612487576000841561246f5750858301515b600019600386901b1c1916600185901b17855561241d565b600085815260208120601f198616915b828110156124b657888601518255948401946001909101908401612497565b50858210156124d45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b6000821982111561250d5761250d6124e4565b500190565b634e487b7160e01b600052601260045260246000fd5b60008261253757612537612512565b500490565b6000816000190483118215151615612556576125566124e4565b500290565b60008282101561256d5761256d6124e4565b500390565b6020808252600490820152634e6f706560e01b604082015260600190565b600083516125a2818460208801611e90565b8351908301906125b6818360208801611e90565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061260290830184611ebc565b9695505050505050565b60006020828403121561261e57600080fd5b815161100481611e5d565b60006001820161263b5761263b6124e4565b5060010190565b60008261265157612651612512565b50069056fea264697066735822122070d5e4faeda752df6f6f474164cc1a0b947bd8347b1d39160458ddc628b118f764736f6c634300080f0033

Deployed Bytecode

0x6080604052600436106102465760003560e01c80638462151c11610139578063afc25c0d116100b6578063dd4d46eb1161007a578063dd4d46eb146106c4578063e3c4650d146106da578063e43109b6146106f0578063e985e9c514610705578063f2fde38b14610725578063fc4862e41461074557600080fd5b8063afc25c0d14610617578063b88d4fde14610637578063c23dc68f14610657578063c87b56dd14610684578063d755bf99146106a457600080fd5b8063936cc8ef116100fd578063936cc8ef1461058f57806395d89b41146105af57806399a2557a146105c4578063a0712d68146105e4578063a22cb465146105f757600080fd5b80638462151c146104fb578063895613d9146105285780638ca30d29146105495780638da5cb5b146105695780639055c1111461058757600080fd5b80635b30c79b116101c757806370a082311161018b57806370a0823114610470578063715018a6146104905780637ae69023146104a55780637d138ccc146104c5578063801c6014146104e557600080fd5b80635b30c79b146103d85780635bbb2177146103ee5780636352211e1461041b57806369da64ad1461043b5780636bf1403f1461045b57600080fd5b80631a55e8241161020e5780631a55e824146103285780631aaec83c1461035557806321e7ea321461036b57806323b872dd1461039857806342842e0e146103b857600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806318160ddd146102fc575b600080fd5b34801561025757600080fd5b5061026b610266366004611e73565b610765565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102956107b7565b6040516102779190611ee8565b3480156102ae57600080fd5b506102c26102bd366004611efb565b610849565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f5366004611f30565b61088d565b005b34801561030857600080fd5b5061031a600154600054036000190190565b604051908152602001610277565b34801561033457600080fd5b5061031a610343366004611efb565b600e6020526000908152604090205481565b34801561036157600080fd5b5061031a600c5481565b34801561037757600080fd5b5061031a610386366004611f5a565b60156020526000908152604090205481565b3480156103a457600080fd5b506102fa6103b3366004611f75565b61091a565b3480156103c457600080fd5b506102fa6103d3366004611f75565b61093e565b3480156103e457600080fd5b5061031a600a5481565b3480156103fa57600080fd5b5061040e610409366004611ff7565b610959565b604051610277919061209c565b34801561042757600080fd5b506102c2610436366004611efb565b610a1f565b34801561044757600080fd5b506102fa61045636600461215d565b610a31565b34801561046757600080fd5b506102fa610a74565b34801561047c57600080fd5b5061031a61048b366004611f5a565b610ab4565b34801561049c57600080fd5b506102fa610b02565b3480156104b157600080fd5b506102fa6104c03660046121a5565b610b38565b3480156104d157600080fd5b5061026b6104e0366004611f5a565b610bc8565b3480156104f157600080fd5b5061031a600d5481565b34801561050757600080fd5b5061051b610516366004611f5a565b610be0565b60405161027791906121d1565b34801561053457600080fd5b5060105461026b90600160a01b900460ff1681565b34801561055557600080fd5b506102fa610564366004611efb565b610d25565b34801561057557600080fd5b506008546001600160a01b03166102c2565b6102fa610d54565b34801561059b57600080fd5b506102fa6105aa36600461215d565b610e05565b3480156105bb57600080fd5b50610295610e3b565b3480156105d057600080fd5b5061051b6105df366004612209565b610e4a565b6102fa6105f2366004611efb565b61100b565b34801561060357600080fd5b506102fa61061236600461223c565b6111eb565b34801561062357600080fd5b506102fa61063236600461215d565b611280565b34801561064357600080fd5b506102fa610652366004612278565b6112b6565b34801561066357600080fd5b50610677610672366004611efb565b611307565b60405161027791906122f3565b34801561069057600080fd5b5061029561069f366004611efb565b6113c1565b3480156106b057600080fd5b506102fa6106bf366004611efb565b611421565b3480156106d057600080fd5b5061031a600b5481565b3480156106e657600080fd5b5061031a60095481565b3480156106fc57600080fd5b506102fa611450565b34801561071157600080fd5b5061026b610720366004612328565b61149b565b34801561073157600080fd5b506102fa610740366004611f5a565b6114c9565b34801561075157600080fd5b506102fa61076036600461215d565b611561565b60006001600160e01b031982166380ac58cd60e01b148061079657506001600160e01b03198216635b5e139f60e01b145b806107b157506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600280546107c690612352565b80601f01602080910402602001604051908101604052809291908181526020018280546107f290612352565b801561083f5780601f106108145761010080835404028352916020019161083f565b820191906000526020600020905b81548152906001019060200180831161082257829003601f168201915b5050505050905090565b600061085482611597565b610871576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061089882610a1f565b9050806001600160a01b0316836001600160a01b0316036108cc5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906108ec57506108ea813361149b565b155b1561090a576040516367d9dca160e11b815260040160405180910390fd5b6109158383836115d0565b505050565b61092583838361162c565b6000908152600e60205260409020805460010190555050565b610915838383604051806020016040528060008152506112b6565b80516060906000816001600160401b0381111561097857610978611fb1565b6040519080825280602002602001820160405280156109c357816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816109965790505b50905060005b828114610a17576109f28582815181106109e5576109e561238c565b6020026020010151611307565b828281518110610a0457610a0461238c565b60209081029190910101526001016109c9565b509392505050565b6000610a2a82611637565b5192915050565b6008546001600160a01b03163314610a645760405162461bcd60e51b8152600401610a5b906123a2565b60405180910390fd5b6012610a708282612425565b5050565b6008546001600160a01b03163314610a9e5760405162461bcd60e51b8152600401610a5b906123a2565b610aaf600154600054036000190190565b600955565b60006001600160a01b038216610add576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b03163314610b2c5760405162461bcd60e51b8152600401610a5b906123a2565b610b36600061175e565b565b6008546001600160a01b03163314610b625760405162461bcd60e51b8152600401610a5b906123a2565b6000610b75600154600054036000190190565b600954909150610b8584836124fa565b1115610bbe5760405162461bcd60e51b8152602060048201526008602482015267546f6f206c61746560c01b6044820152606401610a5b565b61091582846117b0565b600080610bd483610ab4565b600d5411159392505050565b60606000806000610bf085610ab4565b90506000816001600160401b03811115610c0c57610c0c611fb1565b604051908082528060200260200182016040528015610c35578160200160208202803683370190505b509050610c5b604080516060810182526000808252602082018190529181019190915290565b60015b838614610d1957600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529250610d115781516001600160a01b031615610cd257815194505b876001600160a01b0316856001600160a01b031603610d115780838780600101985081518110610d0457610d0461238c565b6020026020010181815250505b600101610c5e565b50909695505050505050565b6008546001600160a01b03163314610d4f5760405162461bcd60e51b8152600401610a5b906123a2565b600c55565b6008546001600160a01b03163314610d7e5760405162461bcd60e51b8152600401610a5b906123a2565b6000610d8b606447612528565b600f549091506001600160a01b03166108fc610da883603261253c565b6040518115909202916000818181858888f19350505050610dc857600080fd5b6010546001600160a01b03166108fc610de283603261253c565b6040518115909202916000818181858888f19350505050610e0257600080fd5b50565b6008546001600160a01b03163314610e2f5760405162461bcd60e51b8152600401610a5b906123a2565b6014610a708282612425565b6060600380546107c690612352565b6060818310610e6c57604051631960ccad60e11b815260040160405180910390fd5b600080546001851015610e7e57600194505b80841115610e8a578093505b6000610e9587610ab4565b905084861015610eb45785850381811015610eae578091505b50610eb8565b5060005b6000816001600160401b03811115610ed257610ed2611fb1565b604051908082528060200260200182016040528015610efb578160200160208202803683370190505b50905081600003610f1157935061100492505050565b6000610f1c88611307565b905060008160400151610f2d575080515b885b888114158015610f3f5750848714155b15610ff857600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529350610ff05782516001600160a01b031615610fb157825191505b8a6001600160a01b0316826001600160a01b031603610ff05780848880600101995081518110610fe357610fe361238c565b6020026020010181815250505b600101610f2f565b50505092835250909150505b9392505050565b600061101e600154600054036000190190565b3360009081526015602052604090205460105491925090600160a01b900460ff1661107c5760405162461bcd60e51b815260206004820152600e60248201526d10db1d58881a5cc818db1bdcd95960921b6044820152606401610a5b565b60095461108984846124fa565b11156110c25760405162461bcd60e51b8152602060048201526008602482015267546f6f206c61746560c01b6044820152606401610a5b565b600b548311156110ff5760405162461bcd60e51b8152602060048201526008602482015267546f6f206d616e7960c01b6044820152606401610a5b565b600a548110801561111d575080600a54611119919061255b565b8311155b156111455734156111405760405162461bcd60e51b8152600401610a5b90612572565b6111bc565b600a54811061117a5782600c5461115c919061253c565b34146111405760405162461bcd60e51b8152600401610a5b90612572565b600a5461118782856124fa565b611191919061255b565b600c5461119e919061253c565b34146111bc5760405162461bcd60e51b8152600401610a5b90612572565b33600090815260156020526040812080548592906111db9084906124fa565b90915550610915905033846117b0565b336001600160a01b038316036112145760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b031633146112aa5760405162461bcd60e51b8152600401610a5b906123a2565b6011610a708282612425565b6112c18484846117ca565b6001600160a01b0383163b151580156112e357506112e1848484846119b7565b155b15611301576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6040805160608082018352600080835260208084018290528385018290528451928301855281835282018190529281019290925290600183108061134d57506000548310155b156113585792915050565b50600082815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615801592820192909252906113b85792915050565b61100483611637565b60606113cc82611597565b6113e85760405162461bcd60e51b8152600401610a5b90612572565b6113f182611aa3565b6113fa83611b96565b60405160200161140b929190612590565b6040516020818303038152906040529050919050565b6008546001600160a01b0316331461144b5760405162461bcd60e51b8152600401610a5b906123a2565b600a55565b6008546001600160a01b0316331461147a5760405162461bcd60e51b8152600401610a5b906123a2565b6010805460ff60a01b198116600160a01b9182900460ff1615909102179055565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6008546001600160a01b031633146114f35760405162461bcd60e51b8152600401610a5b906123a2565b6001600160a01b0381166115585760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a5b565b610e028161175e565b6008546001600160a01b0316331461158b5760405162461bcd60e51b8152600401610a5b906123a2565b6013610a708282612425565b6000816001111580156115ab575060005482105b80156107b1575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6109158383836117ca565b60408051606081018252600080825260208201819052918101919091528180600111158015611667575060005481105b1561174557600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906117435780516001600160a01b0316156116da579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521561173e579392505050565b6116da565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610a70828260405180602001604052806000815250611c96565b60006117d582611637565b9050836001600160a01b031681600001516001600160a01b03161461180c5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061182a575061182a853361149b565b8061184557503361183a84610849565b6001600160a01b0316145b90508061186557604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661188c57604051633a954ecd60e21b815260040160405180910390fd5b611898600084876115d0565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661196c57600054821461196c57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906119ec9033908990889088906004016125cf565b6020604051808303816000875af1925050508015611a27575060408051601f3d908101601f19168201909252611a249181019061260c565b60015b611a85573d808015611a55576040519150601f19603f3d011682016040523d82523d6000602084013e611a5a565b606091505b508051600003611a7d576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60606000611ab36104e084610a1f565b6000848152600e6020526040812054919250819003611b605760118054611ad990612352565b80601f0160208091040260200160405190810160405280929190818152602001828054611b0590612352565b8015611b525780601f10611b2757610100808354040283529160200191611b52565b820191906000526020600020905b815481529060010190602001808311611b3557829003601f168201915b505050505092505050919050565b600d54811015611b895781611b7c5760128054611ad990612352565b60138054611ad990612352565b60148054611ad990612352565b606081600003611bbd5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611be75780611bd181612629565b9150611be09050600a83612528565b9150611bc1565b6000816001600160401b03811115611c0157611c01611fb1565b6040519080825280601f01601f191660200182016040528015611c2b576020820181803683370190505b5090505b8415611a9b57611c4060018361255b565b9150611c4d600a86612642565b611c589060306124fa565b60f81b818381518110611c6d57611c6d61238c565b60200101906001600160f81b031916908160001a905350611c8f600a86612528565b9450611c2f565b6000546001600160a01b038416611cbf57604051622e076360e81b815260040160405180910390fd5b82600003611ce05760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15611e08575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611dd160008784806001019550876119b7565b611dee576040516368d2bf6b60e11b815260040160405180910390fd5b808203611d86578260005414611e0357600080fd5b611e4d565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203611e09575b5060009081556113019085838684565b6001600160e01b031981168114610e0257600080fd5b600060208284031215611e8557600080fd5b813561100481611e5d565b60005b83811015611eab578181015183820152602001611e93565b838111156113015750506000910152565b60008151808452611ed4816020860160208601611e90565b601f01601f19169290920160200192915050565b6020815260006110046020830184611ebc565b600060208284031215611f0d57600080fd5b5035919050565b80356001600160a01b0381168114611f2b57600080fd5b919050565b60008060408385031215611f4357600080fd5b611f4c83611f14565b946020939093013593505050565b600060208284031215611f6c57600080fd5b61100482611f14565b600080600060608486031215611f8a57600080fd5b611f9384611f14565b9250611fa160208501611f14565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611fef57611fef611fb1565b604052919050565b6000602080838503121561200a57600080fd5b82356001600160401b038082111561202157600080fd5b818501915085601f83011261203557600080fd5b81358181111561204757612047611fb1565b8060051b9150612058848301611fc7565b818152918301840191848101908884111561207257600080fd5b938501935b8385101561209057843582529385019390850190612077565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610d19576120f383855180516001600160a01b031682526020808201516001600160401b0316908301526040908101511515910152565b92840192606092909201916001016120b8565b60006001600160401b0383111561211f5761211f611fb1565b612132601f8401601f1916602001611fc7565b905082815283838301111561214657600080fd5b828260208301376000602084830101529392505050565b60006020828403121561216f57600080fd5b81356001600160401b0381111561218557600080fd5b8201601f8101841361219657600080fd5b611a9b84823560208401612106565b600080604083850312156121b857600080fd5b823591506121c860208401611f14565b90509250929050565b6020808252825182820181905260009190848201906040850190845b81811015610d19578351835292840192918401916001016121ed565b60008060006060848603121561221e57600080fd5b61222784611f14565b95602085013595506040909401359392505050565b6000806040838503121561224f57600080fd5b61225883611f14565b91506020830135801515811461226d57600080fd5b809150509250929050565b6000806000806080858703121561228e57600080fd5b61229785611f14565b93506122a560208601611f14565b92506040850135915060608501356001600160401b038111156122c757600080fd5b8501601f810187136122d857600080fd5b6122e787823560208401612106565b91505092959194509250565b81516001600160a01b031681526020808301516001600160401b031690820152604080830151151590820152606081016107b1565b6000806040838503121561233b57600080fd5b61234483611f14565b91506121c860208401611f14565b600181811c9082168061236657607f821691505b60208210810361238657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b601f82111561091557600081815260208120601f850160051c810160208610156123fe5750805b601f850160051c820191505b8181101561241d5782815560010161240a565b505050505050565b81516001600160401b0381111561243e5761243e611fb1565b6124528161244c8454612352565b846123d7565b602080601f831160018114612487576000841561246f5750858301515b600019600386901b1c1916600185901b17855561241d565b600085815260208120601f198616915b828110156124b657888601518255948401946001909101908401612497565b50858210156124d45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b6000821982111561250d5761250d6124e4565b500190565b634e487b7160e01b600052601260045260246000fd5b60008261253757612537612512565b500490565b6000816000190483118215151615612556576125566124e4565b500290565b60008282101561256d5761256d6124e4565b500390565b6020808252600490820152634e6f706560e01b604082015260600190565b600083516125a2818460208801611e90565b8351908301906125b6818360208801611e90565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061260290830184611ebc565b9695505050505050565b60006020828403121561261e57600080fd5b815161100481611e5d565b60006001820161263b5761263b6124e4565b5060010190565b60008261265157612651612512565b50069056fea264697066735822122070d5e4faeda752df6f6f474164cc1a0b947bd8347b1d39160458ddc628b118f764736f6c634300080f0033

Deployed Bytecode Sourcemap

60182:4439:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35224:305;;;;;;;;;;-1:-1:-1;35224:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;35224:305:0;;;;;;;;38337:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;39840:204::-;;;;;;;;;;-1:-1:-1;39840:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;39840:204:0;1528:203:1;39403:371:0;;;;;;;;;;-1:-1:-1;39403:371:0;;;;;:::i;:::-;;:::i;:::-;;34473:303;;;;;;;;;;;;61018:1;34727:12;34517:7;34711:13;:28;-1:-1:-1;;34711:46:0;;34473:303;;;;2319:25:1;;;2307:2;2292:18;34473:303:0;2173:177:1;60472:54:0;;;;;;;;;;-1:-1:-1;60472:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;60385:42;;;;;;;;;;;;;;;;60819:44;;;;;;;;;;-1:-1:-1;60819:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;63036:277;;;;;;;;;;-1:-1:-1;63036:277:0;;;;;:::i;:::-;;:::i;40946:185::-;;;;;;;;;;-1:-1:-1;40946:185:0;;;;;:::i;:::-;;:::i;60314:27::-;;;;;;;;;;;;;;;;55465:459;;;;;;;;;;-1:-1:-1;55465:459:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;38145:125::-;;;;;;;;;;-1:-1:-1;38145:125:0;;;;;:::i;:::-;;:::i;63758:96::-;;;;;;;;;;-1:-1:-1;63758:96:0;;;;;:::i;:::-;;:::i;64321:84::-;;;;;;;;;;;;;:::i;35593:206::-;;;;;;;;;;-1:-1:-1;35593:206:0;;;;;:::i;:::-;;:::i;29462:103::-;;;;;;;;;;;;;:::i;61836:216::-;;;;;;;;;;-1:-1:-1;61836:216:0;;;;;:::i;:::-;;:::i;62132:175::-;;;;;;;;;;-1:-1:-1;62132:175:0;;;;;:::i;:::-;;:::i;60436:27::-;;;;;;;;;;;;;;;;59261:882;;;;;;;;;;-1:-1:-1;59261:882:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;60662:27::-;;;;;;;;;;-1:-1:-1;60662:27:0;;;;-1:-1:-1;;;60662:27:0;;;;;;64175:120;;;;;;;;;;-1:-1:-1;64175:120:0;;;;;:::i;:::-;;:::i;28811:87::-;;;;;;;;;;-1:-1:-1;28884:6:0;;-1:-1:-1;;;;;28884:6:0;28811:87;;64413:205;;;:::i;63967:101::-;;;;;;;;;;-1:-1:-1;63967:101:0;;;;;:::i;:::-;;:::i;38506:104::-;;;;;;;;;;;;;:::i;56314:2498::-;;;;;;;;;;-1:-1:-1;56314:2498:0;;;;;:::i;:::-;;:::i;61035:793::-;;;;;;:::i;:::-;;:::i;40116:287::-;;;;;;;;;;-1:-1:-1;40116:287:0;;;;;:::i;:::-;;:::i;63649:101::-;;;;;;;;;;-1:-1:-1;63649:101:0;;;;;:::i;:::-;;:::i;41202:369::-;;;;;;;;;;-1:-1:-1;41202:369:0;;;;;:::i;:::-;;:::i;54897:409::-;;;;;;;;;;-1:-1:-1;54897:409:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;63325:225::-;;;;;;;;;;-1:-1:-1;63325:225:0;;;;;:::i;:::-;;:::i;64076:91::-;;;;;;;;;;-1:-1:-1;64076:91:0;;;;;:::i;:::-;;:::i;60348:30::-;;;;;;;;;;;;;;;;60276:31;;;;;;;;;;;;;;;;63558:83;;;;;;;;;;;;;:::i;40474:164::-;;;;;;;;;;-1:-1:-1;40474:164:0;;;;;:::i;:::-;;:::i;29720:201::-;;;;;;;;;;-1:-1:-1;29720:201:0;;;;;:::i;:::-;;:::i;63862:97::-;;;;;;;;;;-1:-1:-1;63862:97:0;;;;;:::i;:::-;;:::i;35224:305::-;35326:4;-1:-1:-1;;;;;;35363:40:0;;-1:-1:-1;;;35363:40:0;;:105;;-1:-1:-1;;;;;;;35420:48:0;;-1:-1:-1;;;35420:48:0;35363:105;:158;;;-1:-1:-1;;;;;;;;;;10632:40:0;;;35485:36;35343:178;35224:305;-1:-1:-1;;35224:305:0:o;38337:100::-;38391:13;38424:5;38417:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38337:100;:::o;39840:204::-;39908:7;39933:16;39941:7;39933;:16::i;:::-;39928:64;;39958:34;;-1:-1:-1;;;39958:34:0;;;;;;;;;;;39928:64;-1:-1:-1;40012:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;40012:24:0;;39840:204::o;39403:371::-;39476:13;39492:24;39508:7;39492:15;:24::i;:::-;39476:40;;39537:5;-1:-1:-1;;;;;39531:11:0;:2;-1:-1:-1;;;;;39531:11:0;;39527:48;;39551:24;;-1:-1:-1;;;39551:24:0;;;;;;;;;;;39527:48;13460:10;-1:-1:-1;;;;;39592:21:0;;;;;;:63;;-1:-1:-1;39618:37:0;39635:5;13460:10;40474:164;:::i;39618:37::-;39617:38;39592:63;39588:138;;;39679:35;;-1:-1:-1;;;39679:35:0;;;;;;;;;;;39588:138;39738:28;39747:2;39751:7;39760:5;39738:8;:28::i;:::-;39465:309;39403:371;;:::o;63036:277::-;63179:37;63198:4;63204:2;63208:7;63179:18;:37::i;:::-;63260:28;;;;:19;:28;;;;;:30;;;;;;-1:-1:-1;;63036:277:0:o;40946:185::-;41084:39;41101:4;41107:2;41111:7;41084:39;;;;;;;;;;;;:16;:39::i;55465:459::-;55631:15;;55545:23;;55606:22;55631:15;-1:-1:-1;;;;;55698:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;55698:36:0;;-1:-1:-1;;55698:36:0;;;;;;;;;;;;55661:73;;55754:9;55749:125;55770:14;55765:1;:19;55749:125;;55826:32;55846:8;55855:1;55846:11;;;;;;;;:::i;:::-;;;;;;;55826:19;:32::i;:::-;55810:10;55821:1;55810:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;55786:3;;55749:125;;;-1:-1:-1;55895:10:0;55465:459;-1:-1:-1;;;55465:459:0:o;38145:125::-;38209:7;38236:21;38249:7;38236:12;:21::i;:::-;:26;;38145:125;-1:-1:-1;;38145:125:0:o;63758:96::-;28884:6;;-1:-1:-1;;;;;28884:6:0;13460:10;29031:23;29023:68;;;;-1:-1:-1;;;29023:68:0;;;;;;;:::i;:::-;;;;;;;;;63831:5:::1;:15;63839:7:::0;63831:5;:15:::1;:::i;:::-;;63758:96:::0;:::o;64321:84::-;28884:6;;-1:-1:-1;;;;;28884:6:0;13460:10;29031:23;29023:68;;;;-1:-1:-1;;;29023:68:0;;;;;;;:::i;:::-;64384:13:::1;61018:1:::0;34727:12;34517:7;34711:13;:28;-1:-1:-1;;34711:46:0;;34473:303;64384:13:::1;64372:9;:25:::0;64321:84::o;35593:206::-;35657:7;-1:-1:-1;;;;;35681:19:0;;35677:60;;35709:28;;-1:-1:-1;;;35709:28:0;;;;;;;;;;;35677:60;-1:-1:-1;;;;;;35763:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;35763:27:0;;35593:206::o;29462:103::-;28884:6;;-1:-1:-1;;;;;28884:6:0;13460:10;29031:23;29023:68;;;;-1:-1:-1;;;29023:68:0;;;;;;;:::i;:::-;29527:30:::1;29554:1;29527:18;:30::i;:::-;29462:103::o:0;61836:216::-;28884:6;;-1:-1:-1;;;;;28884:6:0;13460:10;29031:23;29023:68;;;;-1:-1:-1;;;29023:68:0;;;;;;;:::i;:::-;61916:14:::1;61933:13;61018:1:::0;34727:12;34517:7;34711:13;:28;-1:-1:-1;;34711:46:0;;34473:303;61933:13:::1;61984:9;::::0;61916:30;;-1:-1:-1;61965:15:0::1;61974:6:::0;61916:30;61965:15:::1;:::i;:::-;:28;;61957:49;;;::::0;-1:-1:-1;;;61957:49:0;;12451:2:1;61957:49:0::1;::::0;::::1;12433:21:1::0;12490:1;12470:18;;;12463:29;-1:-1:-1;;;12508:18:1;;;12501:38;12556:18;;61957:49:0::1;12249:331:1::0;61957:49:0::1;62017:27;62027:8;62037:6;62017:9;:27::i;62132:175::-:0;62193:4;62210:22;62235:18;62245:7;62235:9;:18::i;:::-;62290:8;;-1:-1:-1;62272:26:0;;62132:175;-1:-1:-1;;;62132:175:0:o;59261:882::-;59322:16;59376:19;59410:25;59450:22;59475:16;59485:5;59475:9;:16::i;:::-;59450:41;;59506:25;59548:14;-1:-1:-1;;;;;59534:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59534:29:0;;59506:57;;59578:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;59578:31:0;61018:1;59624:471;59673:14;59658:11;:29;59624:471;;59725:14;;;;:11;:14;;;;;;;;;59713:26;;;;;;;;;-1:-1:-1;;;;;59713:26:0;;;;-1:-1:-1;;;59713:26:0;;-1:-1:-1;;;;;59713:26:0;;;;;;;;-1:-1:-1;;;59713:26:0;;;;;;;;;;;;;;-1:-1:-1;59803:8:0;59758:73;59853:14;;-1:-1:-1;;;;;59853:28:0;;59849:111;;59926:14;;;-1:-1:-1;59849:111:0;60003:5;-1:-1:-1;;;;;59982:26:0;:17;-1:-1:-1;;;;;59982:26:0;;59978:102;;60059:1;60033:8;60042:13;;;;;;60033:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;59978:102;59689:3;;59624:471;;;-1:-1:-1;60116:8:0;;59261:882;-1:-1:-1;;;;;;59261:882:0:o;64175:120::-;28884:6;;-1:-1:-1;;;;;28884:6:0;13460:10;29031:23;29023:68;;;;-1:-1:-1;;;29023:68:0;;;;;;;:::i;:::-;64256:12:::1;:31:::0;64175:120::o;64413:205::-;28884:6;;-1:-1:-1;;;;;28884:6:0;13460:10;29031:23;29023:68;;;;-1:-1:-1;;;29023:68:0;;;;;;;:::i;:::-;64467:14:::1;64484:27;64508:3;64484:21;:27;:::i;:::-;64538:2;::::0;64467:44;;-1:-1:-1;;;;;;64538:2:0::1;64530:29;64547:11;64467:44:::0;64556:2:::1;64547:11;:::i;:::-;64530:29;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;64522:38;;;::::0;::::1;;64587:3;::::0;-1:-1:-1;;;;;64587:3:0::1;64579:30;64597:11;:6:::0;64606:2:::1;64597:11;:::i;:::-;64579:30;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;64571:39;;;::::0;::::1;;64456:162;64413:205::o:0;63967:101::-;28884:6;;-1:-1:-1;;;;;28884:6:0;13460:10;29031:23;29023:68;;;;-1:-1:-1;;;29023:68:0;;;;;;;:::i;:::-;64040:10:::1;:20;64053:7:::0;64040:10;:20:::1;:::i;38506:104::-:0;38562:13;38595:7;38588:14;;;;;:::i;56314:2498::-;56440:16;56507:4;56498:5;:13;56494:45;;56520:19;;-1:-1:-1;;;56520:19:0;;;;;;;;;;;56494:45;56554:19;56608:13;;61018:1;56699:5;:23;56695:87;;;61018:1;56743:23;;56695:87;56862:9;56855:4;:16;56851:73;;;56899:9;56892:16;;56851:73;56938:25;56966:16;56976:5;56966:9;:16::i;:::-;56938:44;;57160:4;57152:5;:12;57148:278;;;57207:12;;;57242:31;;;57238:111;;;57318:11;57298:31;;57238:111;57166:198;57148:278;;;-1:-1:-1;57409:1:0;57148:278;57440:25;57482:17;-1:-1:-1;;;;;57468:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57468:32:0;;57440:60;;57519:17;57540:1;57519:22;57515:78;;57569:8;-1:-1:-1;57562:15:0;;-1:-1:-1;;;57562:15:0;57515:78;57737:31;57771:26;57791:5;57771:19;:26::i;:::-;57737:60;;57812:25;58057:9;:16;;;58052:92;;-1:-1:-1;58114:14:0;;58052:92;58175:5;58158:477;58187:4;58182:1;:9;;:45;;;;;58210:17;58195:11;:32;;58182:45;58158:477;;;58265:14;;;;:11;:14;;;;;;;;;58253:26;;;;;;;;;-1:-1:-1;;;;;58253:26:0;;;;-1:-1:-1;;;58253:26:0;;-1:-1:-1;;;;;58253:26:0;;;;;;;;-1:-1:-1;;;58253:26:0;;;;;;;;;;;;;;-1:-1:-1;58343:8:0;58298:73;58393:14;;-1:-1:-1;;;;;58393:28:0;;58389:111;;58466:14;;;-1:-1:-1;58389:111:0;58543:5;-1:-1:-1;;;;;58522:26:0;:17;-1:-1:-1;;;;;58522:26:0;;58518:102;;58599:1;58573:8;58582:13;;;;;;58573:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;58518:102;58229:3;;58158:477;;;-1:-1:-1;;;58720:29:0;;;-1:-1:-1;58727:8:0;;-1:-1:-1;;56314:2498:0;;;;;;:::o;61035:793::-;61093:14;61110:13;61018:1;34727:12;34517:7;34711:13;:28;-1:-1:-1;;34711:46:0;;34473:303;61110:13;13460:10;61134:19;61156:26;;;:12;:26;;;;;;61203:7;;61093:30;;-1:-1:-1;61156:26:0;-1:-1:-1;;;61203:7:0;;;;61195:35;;;;-1:-1:-1;;;61195:35:0;;13217:2:1;61195:35:0;;;13199:21:1;13256:2;13236:18;;;13229:30;-1:-1:-1;;;13275:18:1;;;13268:44;13329:18;;61195:35:0;13015:338:1;61195:35:0;61268:9;;61249:15;61258:6;61249;:15;:::i;:::-;:28;;61241:49;;;;-1:-1:-1;;;61241:49:0;;12451:2:1;61241:49:0;;;12433:21:1;12490:1;12470:18;;;12463:29;-1:-1:-1;;;12508:18:1;;;12501:38;12556:18;;61241:49:0;12249:331:1;61241:49:0;61319:10;;61309:6;:20;;61301:41;;;;-1:-1:-1;;;61301:41:0;;13560:2:1;61301:41:0;;;13542:21:1;13599:1;13579:18;;;13572:29;-1:-1:-1;;;13617:18:1;;;13610:38;13665:18;;61301:41:0;13358:331:1;61301:41:0;61374:8;;61360:11;:22;:60;;;;;61408:11;61397:8;;:22;;;;:::i;:::-;61386:6;:34;;61360:60;61355:370;;;61447:9;:14;61439:31;;;;-1:-1:-1;;;61439:31:0;;;;;;;:::i;:::-;61355:370;;;61516:8;;61501:11;:23;61497:228;;61577:6;61562:12;;:21;;;;:::i;:::-;61549:9;:34;61541:51;;;;-1:-1:-1;;;61541:51:0;;;;;;;:::i;61497:228::-;61695:8;;61672:20;61681:11;61672:6;:20;:::i;:::-;:31;;;;:::i;:::-;61655:12;;:49;;;;:::i;:::-;61642:9;:62;61634:79;;;;-1:-1:-1;;;61634:79:0;;;;;;;:::i;:::-;13460:10;61737:26;;;;:12;:26;;;;;:36;;61767:6;;61737:26;:36;;61767:6;;61737:36;:::i;:::-;;;;-1:-1:-1;61784:29:0;;-1:-1:-1;61794:10:0;61806:6;61784:9;:29::i;40116:287::-;13460:10;-1:-1:-1;;;;;40215:24:0;;;40211:54;;40248:17;;-1:-1:-1;;;40248:17:0;;;;;;;;;;;40211:54;13460:10;40278:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;40278:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;40278:53:0;;;;;;;;;;40347:48;;540:41:1;;;40278:42:0;;13460:10;40347:48;;513:18:1;40347:48:0;;;;;;;40116:287;;:::o;63649:101::-;28884:6;;-1:-1:-1;;;;;28884:6:0;13460:10;29031:23;29023:68;;;;-1:-1:-1;;;29023:68:0;;;;;;;:::i;:::-;63722:10:::1;:20;63735:7:::0;63722:10;:20:::1;:::i;41202:369::-:0;41369:28;41379:4;41385:2;41389:7;41369:9;:28::i;:::-;-1:-1:-1;;;;;41412:13:0;;15066:19;:23;;41412:76;;;;;41432:56;41463:4;41469:2;41473:7;41482:5;41432:30;:56::i;:::-;41431:57;41412:76;41408:156;;;41512:40;;-1:-1:-1;;;41512:40:0;;;;;;;;;;;41408:156;41202:369;;;;:::o;54897:409::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61018:1:0;55044:25;;;:53;;;55084:13;;55073:7;:24;;55044:53;55040:102;;;55121:9;54897:409;-1:-1:-1;;54897:409:0:o;55040:102::-;-1:-1:-1;55164:20:0;;;;:11;:20;;;;;;;;;55152:32;;;;;;;;;-1:-1:-1;;;;;55152:32:0;;;;-1:-1:-1;;;55152:32:0;;-1:-1:-1;;;;;55152:32:0;;;;;;;;-1:-1:-1;;;55152:32:0;;;;;;;;;;;;;;;;55195:65;;55239:9;54897:409;-1:-1:-1;;54897:409:0:o;55195:65::-;55277:21;55290:7;55277:12;:21::i;63325:225::-;63391:13;63425:17;63433:8;63425:7;:17::i;:::-;63417:34;;;;-1:-1:-1;;;63417:34:0;;;;;;;:::i;:::-;63493:18;63502:8;63493;:18::i;:::-;63513:19;:8;:17;:19::i;:::-;63476:65;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63462:80;;63325:225;;;:::o;64076:91::-;28884:6;;-1:-1:-1;;;;;28884:6:0;13460:10;29031:23;29023:68;;;;-1:-1:-1;;;29023:68:0;;;;;;;:::i;:::-;64141:8:::1;:18:::0;64076:91::o;63558:83::-;28884:6;;-1:-1:-1;;;;;28884:6:0;13460:10;29031:23;29023:68;;;;-1:-1:-1;;;29023:68:0;;;;;;;:::i;:::-;63626:7:::1;::::0;;-1:-1:-1;;;;63615:18:0;::::1;-1:-1:-1::0;;;63626:7:0;;;::::1;;;63625:8;63615:18:::0;;::::1;;::::0;;63558:83::o;40474:164::-;-1:-1:-1;;;;;40595:25:0;;;40571:4;40595:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;40474:164::o;29720:201::-;28884:6;;-1:-1:-1;;;;;28884:6:0;13460:10;29031:23;29023:68;;;;-1:-1:-1;;;29023:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29809:22:0;::::1;29801:73;;;::::0;-1:-1:-1;;;29801:73:0;;15000:2:1;29801:73:0::1;::::0;::::1;14982:21:1::0;15039:2;15019:18;;;15012:30;15078:34;15058:18;;;15051:62;-1:-1:-1;;;15129:18:1;;;15122:36;15175:19;;29801:73:0::1;14798:402:1::0;29801:73:0::1;29885:28;29904:8;29885:18;:28::i;63862:97::-:0;28884:6;;-1:-1:-1;;;;;28884:6:0;13460:10;29031:23;29023:68;;;;-1:-1:-1;;;29023:68:0;;;;;;;:::i;:::-;63935:6:::1;:16;63944:7:::0;63935:6;:16:::1;:::i;41826:174::-:0;41883:4;41926:7;61018:1;41907:26;;:53;;;;;41947:13;;41937:7;:23;41907:53;:85;;;;-1:-1:-1;;41965:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;41965:27:0;;;;41964:28;;41826:174::o;51052:196::-;51167:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;51167:29:0;-1:-1:-1;;;;;51167:29:0;;;;;;;;;51212:28;;51167:24;;51212:28;;;;;;;51052:196;;;:::o;40705:170::-;40839:28;40849:4;40855:2;40859:7;40839:9;:28::i;36974:1109::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;37085:7:0;;61018:1;37134:23;;:47;;;;;37168:13;;37161:4;:20;37134:47;37130:886;;;37202:31;37236:17;;;:11;:17;;;;;;;;;37202:51;;;;;;;;;-1:-1:-1;;;;;37202:51:0;;;;-1:-1:-1;;;37202:51:0;;-1:-1:-1;;;;;37202:51:0;;;;;;;;-1:-1:-1;;;37202:51:0;;;;;;;;;;;;;;37272:729;;37322:14;;-1:-1:-1;;;;;37322:28:0;;37318:101;;37386:9;36974:1109;-1:-1:-1;;;36974:1109:0:o;37318:101::-;-1:-1:-1;;;37761:6:0;37806:17;;;;:11;:17;;;;;;;;;37794:29;;;;;;;;;-1:-1:-1;;;;;37794:29:0;;;;;-1:-1:-1;;;37794:29:0;;-1:-1:-1;;;;;37794:29:0;;;;;;;;-1:-1:-1;;;37794:29:0;;;;;;;;;;;;;37854:28;37850:109;;37922:9;36974:1109;-1:-1:-1;;;36974:1109:0:o;37850:109::-;37721:261;;;37183:833;37130:886;38044:31;;-1:-1:-1;;;38044:31:0;;;;;;;;;;;30081:191;30174:6;;;-1:-1:-1;;;;;30191:17:0;;;-1:-1:-1;;;;;;30191:17:0;;;;;;;30224:40;;30174:6;;;30191:17;30174:6;;30224:40;;30155:16;;30224:40;30144:128;30081:191;:::o;42084:104::-;42153:27;42163:2;42167:8;42153:27;;;;;;;;;;;;:9;:27::i;46000:2130::-;46115:35;46153:21;46166:7;46153:12;:21::i;:::-;46115:59;;46213:4;-1:-1:-1;;;;;46191:26:0;:13;:18;;;-1:-1:-1;;;;;46191:26:0;;46187:67;;46226:28;;-1:-1:-1;;;46226:28:0;;;;;;;;;;;46187:67;46267:22;13460:10;-1:-1:-1;;;;;46293:20:0;;;;:73;;-1:-1:-1;46330:36:0;46347:4;13460:10;40474:164;:::i;46330:36::-;46293:126;;;-1:-1:-1;13460:10:0;46383:20;46395:7;46383:11;:20::i;:::-;-1:-1:-1;;;;;46383:36:0;;46293:126;46267:153;;46438:17;46433:66;;46464:35;;-1:-1:-1;;;46464:35:0;;;;;;;;;;;46433:66;-1:-1:-1;;;;;46514:16:0;;46510:52;;46539:23;;-1:-1:-1;;;46539:23:0;;;;;;;;;;;46510:52;46683:35;46700:1;46704:7;46713:4;46683:8;:35::i;:::-;-1:-1:-1;;;;;47014:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;47014:31:0;;;-1:-1:-1;;;;;47014:31:0;;;-1:-1:-1;;47014:31:0;;;;;;;47060:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;47060:29:0;;;;;;;;;;;47140:20;;;:11;:20;;;;;;47175:18;;-1:-1:-1;;;;;;47208:49:0;;;;-1:-1:-1;;;47241:15:0;47208:49;;;;;;;;;;47531:11;;47591:24;;;;;47634:13;;47140:20;;47591:24;;47634:13;47630:384;;47844:13;;47829:11;:28;47825:174;;47882:20;;47951:28;;;;-1:-1:-1;;;;;47925:54:0;-1:-1:-1;;;47925:54:0;-1:-1:-1;;;;;;47925:54:0;;;-1:-1:-1;;;;;47882:20:0;;47925:54;;;;47825:174;46989:1036;;;48061:7;48057:2;-1:-1:-1;;;;;48042:27:0;48051:4;-1:-1:-1;;;;;48042:27:0;;;;;;;;;;;46104:2026;;46000:2130;;;:::o;51740:667::-;51924:72;;-1:-1:-1;;;51924:72:0;;51903:4;;-1:-1:-1;;;;;51924:36:0;;;;;:72;;13460:10;;51975:4;;51981:7;;51990:5;;51924:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51924:72:0;;;;;;;;-1:-1:-1;;51924:72:0;;;;;;;;;;;;:::i;:::-;;;51920:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52158:6;:13;52175:1;52158:18;52154:235;;52204:40;;-1:-1:-1;;;52204:40:0;;;;;;;;;;;52154:235;52347:6;52341:13;52332:6;52328:2;52324:15;52317:38;51920:480;-1:-1:-1;;;;;;52043:55:0;-1:-1:-1;;;52043:55:0;;-1:-1:-1;51920:480:0;51740:667;;;;;;:::o;62397:572::-;62464:13;62491:17;62512:32;62526:17;62534:8;62526:7;:17::i;62512:32::-;62555:22;62580:29;;;:19;:29;;;;;;62490:54;;-1:-1:-1;62626:19:0;;;62622:340;;62669:10;62662:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62397:572;;;:::o;62622:340::-;62718:8;;62701:14;:25;62697:265;;;62763:12;62758:133;;62803:5;62796:12;;;;;:::i;62758:133::-;62869:6;62862:13;;;;;:::i;62697:265::-;62940:10;62933:17;;;;;:::i;10998:723::-;11054:13;11275:5;11284:1;11275:10;11271:53;;-1:-1:-1;;11302:10:0;;;;;;;;;;;;-1:-1:-1;;;11302:10:0;;;;;10998:723::o;11271:53::-;11349:5;11334:12;11390:78;11397:9;;11390:78;;11423:8;;;;:::i;:::-;;-1:-1:-1;11446:10:0;;-1:-1:-1;11454:2:0;11446:10;;:::i;:::-;;;11390:78;;;11478:19;11510:6;-1:-1:-1;;;;;11500:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11500:17:0;;11478:39;;11528:154;11535:10;;11528:154;;11562:11;11572:1;11562:11;;:::i;:::-;;-1:-1:-1;11631:10:0;11639:2;11631:5;:10;:::i;:::-;11618:24;;:2;:24;:::i;:::-;11605:39;;11588:6;11595;11588:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;11588:56:0;;;;;;;;-1:-1:-1;11659:11:0;11668:2;11659:11;;:::i;:::-;;;11528:154;;42562:1751;42685:20;42708:13;-1:-1:-1;;;;;42736:16:0;;42732:48;;42761:19;;-1:-1:-1;;;42761:19:0;;;;;;;;;;;42732:48;42795:8;42807:1;42795:13;42791:44;;42817:18;;-1:-1:-1;;;42817:18:0;;;;;;;;;;;42791:44;-1:-1:-1;;;;;43186:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;43245:49:0;;-1:-1:-1;;;;;43186:44:0;;;;;;;43245:49;;;;-1:-1:-1;;43186:44:0;;;;;;43245:49;;;;;;;;;;;;;;;;43311:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;43361:66:0;;;-1:-1:-1;;;43411:15:0;43361:66;;;;;;;;;;;;;43311:25;;43508:23;;;;15066:19;:23;43548:633;;43588:314;43619:38;;43644:12;;-1:-1:-1;;;;;43619:38:0;;;43636:1;;43619:38;;43636:1;;43619:38;43685:69;43724:1;43728:2;43732:14;;;;;;43748:5;43685:30;:69::i;:::-;43680:174;;43790:40;;-1:-1:-1;;;43790:40:0;;;;;;;;;;;43680:174;43897:3;43881:12;:19;43588:314;;43983:12;43966:13;;:29;43962:43;;43997:8;;;43962:43;43548:633;;;44046:120;44077:40;;44102:14;;;;;-1:-1:-1;;;;;44077:40:0;;;44094:1;;44077:40;;44094:1;;44077:40;44161:3;44145:12;:19;44046:120;;43548:633;-1:-1:-1;44195:13:0;:28;;;44245:60;;44278:2;44282:12;44296:8;44245:60;:::i;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:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:186::-;2414:6;2467:2;2455:9;2446:7;2442:23;2438:32;2435:52;;;2483:1;2480;2473:12;2435:52;2506:29;2525:9;2506:29;:::i;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:127::-;2940:10;2935:3;2931:20;2928:1;2921:31;2971:4;2968:1;2961:15;2995:4;2992:1;2985:15;3011:275;3082:2;3076:9;3147:2;3128:13;;-1:-1:-1;;3124:27:1;3112:40;;-1:-1:-1;;;;;3167:34:1;;3203:22;;;3164:62;3161:88;;;3229:18;;:::i;:::-;3265:2;3258:22;3011:275;;-1:-1:-1;3011:275:1:o;3291:946::-;3375:6;3406:2;3449;3437:9;3428:7;3424:23;3420:32;3417:52;;;3465:1;3462;3455:12;3417:52;3505:9;3492:23;-1:-1:-1;;;;;3575:2:1;3567:6;3564:14;3561:34;;;3591:1;3588;3581:12;3561:34;3629:6;3618:9;3614:22;3604:32;;3674:7;3667:4;3663:2;3659:13;3655:27;3645:55;;3696:1;3693;3686:12;3645:55;3732:2;3719:16;3754:2;3750;3747:10;3744:36;;;3760:18;;:::i;:::-;3806:2;3803:1;3799:10;3789:20;;3829:28;3853:2;3849;3845:11;3829:28;:::i;:::-;3891:15;;;3961:11;;;3957:20;;;3922:12;;;;3989:19;;;3986:39;;;4021:1;4018;4011:12;3986:39;4045:11;;;;4065:142;4081:6;4076:3;4073:15;4065:142;;;4147:17;;4135:30;;4098:12;;;;4185;;;;4065:142;;;4226:5;3291:946;-1:-1:-1;;;;;;;;3291:946:1:o;4525:722::-;4758:2;4810:21;;;4880:13;;4783:18;;;4902:22;;;4729:4;;4758:2;4981:15;;;;4955:2;4940:18;;;4729:4;5024:197;5038:6;5035:1;5032:13;5024:197;;;5087:52;5135:3;5126:6;5120:13;4326:12;;-1:-1:-1;;;;;4322:38:1;4310:51;;4414:4;4403:16;;;4397:23;-1:-1:-1;;;;;4393:48:1;4377:14;;;4370:72;4505:4;4494:16;;;4488:23;4481:31;4474:39;4458:14;;4451:63;4242:278;5087:52;5196:15;;;;5168:4;5159:14;;;;;5060:1;5053:9;5024:197;;5252:407;5317:5;-1:-1:-1;;;;;5343:6:1;5340:30;5337:56;;;5373:18;;:::i;:::-;5411:57;5456:2;5435:15;;-1:-1:-1;;5431:29:1;5462:4;5427:40;5411:57;:::i;:::-;5402:66;;5491:6;5484:5;5477:21;5531:3;5522:6;5517:3;5513:16;5510:25;5507:45;;;5548:1;5545;5538:12;5507:45;5597:6;5592:3;5585:4;5578:5;5574:16;5561:43;5651:1;5644:4;5635:6;5628:5;5624:18;5620:29;5613:40;5252:407;;;;;:::o;5664:451::-;5733:6;5786:2;5774:9;5765:7;5761:23;5757:32;5754:52;;;5802:1;5799;5792:12;5754:52;5842:9;5829:23;-1:-1:-1;;;;;5867:6:1;5864:30;5861:50;;;5907:1;5904;5897:12;5861:50;5930:22;;5983:4;5975:13;;5971:27;-1:-1:-1;5961:55:1;;6012:1;6009;6002:12;5961:55;6035:74;6101:7;6096:2;6083:16;6078:2;6074;6070:11;6035:74;:::i;6120:254::-;6188:6;6196;6249:2;6237:9;6228:7;6224:23;6220:32;6217:52;;;6265:1;6262;6255:12;6217:52;6301:9;6288:23;6278:33;;6330:38;6364:2;6353:9;6349:18;6330:38;:::i;:::-;6320:48;;6120:254;;;;;:::o;6379:632::-;6550:2;6602:21;;;6672:13;;6575:18;;;6694:22;;;6521:4;;6550:2;6773:15;;;;6747:2;6732:18;;;6521:4;6816:169;6830:6;6827:1;6824:13;6816:169;;;6891:13;;6879:26;;6960:15;;;;6925:12;;;;6852:1;6845:9;6816:169;;7016:322;7093:6;7101;7109;7162:2;7150:9;7141:7;7137:23;7133:32;7130:52;;;7178:1;7175;7168:12;7130:52;7201:29;7220:9;7201:29;:::i;:::-;7191:39;7277:2;7262:18;;7249:32;;-1:-1:-1;7328:2:1;7313:18;;;7300:32;;7016:322;-1:-1:-1;;;7016:322:1:o;7343:347::-;7408:6;7416;7469:2;7457:9;7448:7;7444:23;7440:32;7437:52;;;7485:1;7482;7475:12;7437:52;7508:29;7527:9;7508:29;:::i;:::-;7498:39;;7587:2;7576:9;7572:18;7559:32;7634:5;7627:13;7620:21;7613:5;7610:32;7600:60;;7656:1;7653;7646:12;7600:60;7679:5;7669:15;;;7343:347;;;;;:::o;7695:667::-;7790:6;7798;7806;7814;7867:3;7855:9;7846:7;7842:23;7838:33;7835:53;;;7884:1;7881;7874:12;7835:53;7907:29;7926:9;7907:29;:::i;:::-;7897:39;;7955:38;7989:2;7978:9;7974:18;7955:38;:::i;:::-;7945:48;;8040:2;8029:9;8025:18;8012:32;8002:42;;8095:2;8084:9;8080:18;8067:32;-1:-1:-1;;;;;8114:6:1;8111:30;8108:50;;;8154:1;8151;8144:12;8108:50;8177:22;;8230:4;8222:13;;8218:27;-1:-1:-1;8208:55:1;;8259:1;8256;8249:12;8208:55;8282:74;8348:7;8343:2;8330:16;8325:2;8321;8317:11;8282:74;:::i;:::-;8272:84;;;7695:667;;;;;;;:::o;8367:265::-;4326:12;;-1:-1:-1;;;;;4322:38:1;4310:51;;4414:4;4403:16;;;4397:23;-1:-1:-1;;;;;4393:48:1;4377:14;;;4370:72;4505:4;4494:16;;;4488:23;4481:31;4474:39;4458:14;;;4451:63;8563:2;8548:18;;8575:51;4242:278;8637:260;8705:6;8713;8766:2;8754:9;8745:7;8741:23;8737:32;8734:52;;;8782:1;8779;8772:12;8734:52;8805:29;8824:9;8805:29;:::i;:::-;8795:39;;8853:38;8887:2;8876:9;8872:18;8853:38;:::i;8902:380::-;8981:1;8977:12;;;;9024;;;9045:61;;9099:4;9091:6;9087:17;9077:27;;9045:61;9152:2;9144:6;9141:14;9121:18;9118:38;9115:161;;9198:10;9193:3;9189:20;9186:1;9179:31;9233:4;9230:1;9223:15;9261:4;9258:1;9251:15;9115:161;;8902:380;;;:::o;9287:127::-;9348:10;9343:3;9339:20;9336:1;9329:31;9379:4;9376:1;9369:15;9403:4;9400:1;9393:15;9419:356;9621:2;9603:21;;;9640:18;;;9633:30;9699:34;9694:2;9679:18;;9672:62;9766:2;9751:18;;9419:356::o;9906:545::-;10008:2;10003:3;10000:11;9997:448;;;10044:1;10069:5;10065:2;10058:17;10114:4;10110:2;10100:19;10184:2;10172:10;10168:19;10165:1;10161:27;10155:4;10151:38;10220:4;10208:10;10205:20;10202:47;;;-1:-1:-1;10243:4:1;10202:47;10298:2;10293:3;10289:12;10286:1;10282:20;10276:4;10272:31;10262:41;;10353:82;10371:2;10364:5;10361:13;10353:82;;;10416:17;;;10397:1;10386:13;10353:82;;;10357:3;;;9906:545;;;:::o;10627:1352::-;10753:3;10747:10;-1:-1:-1;;;;;10772:6:1;10769:30;10766:56;;;10802:18;;:::i;:::-;10831:97;10921:6;10881:38;10913:4;10907:11;10881:38;:::i;:::-;10875:4;10831:97;:::i;:::-;10983:4;;11047:2;11036:14;;11064:1;11059:663;;;;11766:1;11783:6;11780:89;;;-1:-1:-1;11835:19:1;;;11829:26;11780:89;-1:-1:-1;;10584:1:1;10580:11;;;10576:24;10572:29;10562:40;10608:1;10604:11;;;10559:57;11882:81;;11029:944;;11059:663;9853:1;9846:14;;;9890:4;9877:18;;-1:-1:-1;;11095:20:1;;;11213:236;11227:7;11224:1;11221:14;11213:236;;;11316:19;;;11310:26;11295:42;;11408:27;;;;11376:1;11364:14;;;;11243:19;;11213:236;;;11217:3;11477:6;11468:7;11465:19;11462:201;;;11538:19;;;11532:26;-1:-1:-1;;11621:1:1;11617:14;;;11633:3;11613:24;11609:37;11605:42;11590:58;11575:74;;11462:201;-1:-1:-1;;;;;11709:1:1;11693:14;;;11689:22;11676:36;;-1:-1:-1;10627:1352:1:o;11984:127::-;12045:10;12040:3;12036:20;12033:1;12026:31;12076:4;12073:1;12066:15;12100:4;12097:1;12090:15;12116:128;12156:3;12187:1;12183:6;12180:1;12177:13;12174:39;;;12193:18;;:::i;:::-;-1:-1:-1;12229:9:1;;12116:128::o;12585:127::-;12646:10;12641:3;12637:20;12634:1;12627:31;12677:4;12674:1;12667:15;12701:4;12698:1;12691:15;12717:120;12757:1;12783;12773:35;;12788:18;;:::i;:::-;-1:-1:-1;12822:9:1;;12717:120::o;12842:168::-;12882:7;12948:1;12944;12940:6;12936:14;12933:1;12930:21;12925:1;12918:9;12911:17;12907:45;12904:71;;;12955:18;;:::i;:::-;-1:-1:-1;12995:9:1;;12842:168::o;13694:125::-;13734:4;13762:1;13759;13756:8;13753:34;;;13767:18;;:::i;:::-;-1:-1:-1;13804:9:1;;13694:125::o;13824:327::-;14026:2;14008:21;;;14065:1;14045:18;;;14038:29;-1:-1:-1;;;14098:2:1;14083:18;;14076:34;14142:2;14127:18;;13824:327::o;14156:637::-;14436:3;14474:6;14468:13;14490:53;14536:6;14531:3;14524:4;14516:6;14512:17;14490:53;:::i;:::-;14606:13;;14565:16;;;;14628:57;14606:13;14565:16;14662:4;14650:17;;14628:57;:::i;:::-;-1:-1:-1;;;14707:20:1;;14736:22;;;14785:1;14774:13;;14156:637;-1:-1:-1;;;;14156:637:1:o;15205:489::-;-1:-1:-1;;;;;15474:15:1;;;15456:34;;15526:15;;15521:2;15506:18;;15499:43;15573:2;15558:18;;15551:34;;;15621:3;15616:2;15601:18;;15594:31;;;15399:4;;15642:46;;15668:19;;15660:6;15642:46;:::i;:::-;15634:54;15205:489;-1:-1:-1;;;;;;15205:489:1:o;15699:249::-;15768:6;15821:2;15809:9;15800:7;15796:23;15792:32;15789:52;;;15837:1;15834;15827:12;15789:52;15869:9;15863:16;15888:30;15912:5;15888:30;:::i;15953:135::-;15992:3;16013:17;;;16010:43;;16033:18;;:::i;:::-;-1:-1:-1;16080:1:1;16069:13;;15953:135::o;16093:112::-;16125:1;16151;16141:35;;16156:18;;:::i;:::-;-1:-1:-1;16190:9:1;;16093:112::o

Swarm Source

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