ETH Price: $3,501.40 (+4.65%)

Token

Space Riders (SPR)
 

Overview

Max Total Supply

8,888 SPR

Holders

3,282

Market

Volume (24H)

0.1084 ETH

Min Price (24H)

$106.44 @ 0.030400 ETH

Max Price (24H)

$157.56 @ 0.045000 ETH
Balance
0 SPR
0x26c434325cb59cfb1dad8fe5cd2bffc034a512ca
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Space Riders is a web3-native brand that brings creators, artists, and entrepreneurs to the forefront.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SpaceRiders

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-17
*/

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol

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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf)
        internal
        pure
        returns (bytes32)
    {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b)
        private
        pure
        returns (bytes32 value)
    {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

// File: contracts/ERC721A.sol

// Creator: Chiru Labs
// v3.0.0

pragma solidity ^0.8.4;

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error AuxQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
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 See {IERC721Enumerable-totalSupply}.
     * @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) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        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) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        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) {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        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 {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        _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
        override
    {
        if (operator == _msgSender()) revert ApproveToCaller();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

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

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].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;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership
                        .startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, 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 {}
}

// File: contracts/SpaceRiders.sol

pragma solidity >=0.8.0 <0.9.0;

interface StarToken {
    function updateRewardOnMint(address _to, uint256 _amount) external;

    function updateReward(address _from, address _to) external;

    function getReward(address _to) external;

    function spend(address _from, uint256 _amount) external;
}

contract SpaceRiders is ERC721A, Ownable {
    using Strings for uint256;
    using MerkleProof for bytes32[];

    bytes32 merkleRoot;

    string public baseURI;
    string public notRevealedUri;

    bool public isPaused = true;
    bool public isRevealed = false;
    bool public isOnlyWhitelisted = true;

    uint256 public constant MAX_SUPPLY = 8888;
    uint256 public constant WHITELIST_MAX_MINT_AMOUNT = 2;
    uint256 public constant WHITELIST_MAX_TX_MINT_AMOUNT = 2;
    uint256 public constant MAX_TX_MINT_AMOUNT = 2;
    uint256 public maxMintAmount = 4;
    uint256 public cost = 0.05 ether;
    uint256 public marketingSupply = 100;

    StarToken public starToken;

    event NewSpaceRiderMinted(address sender, uint256 mintAmount);

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _initNotRevealedUri
    ) ERC721A(_name, _symbol) {
        setNotRevealedURI(_initNotRevealedUri);
    }

    modifier mustPassChecks(uint256 _mintAmount) {
        require(
            (!isPaused || msg.sender == owner()) &&
                _mintAmount > 0 &&
                (_mintAmount <= MAX_TX_MINT_AMOUNT) &&
                totalSupply() + _mintAmount <= MAX_SUPPLY - marketingSupply,
            isPaused
                ? "Sale is paused"
                : (
                    _mintAmount == 0
                        ? "You need to mint at least 1"
                        : (
                            _mintAmount > MAX_TX_MINT_AMOUNT
                                ? "Max transaction mint amount exceed"
                                : "Supply limit exceeded"
                        )
                )
        );
        if (isOnlyWhitelisted == true) {
            require(
                _mintAmount <= WHITELIST_MAX_TX_MINT_AMOUNT &&
                    _numberMinted(msg.sender) + _mintAmount <=
                    WHITELIST_MAX_MINT_AMOUNT,
                _mintAmount > WHITELIST_MAX_TX_MINT_AMOUNT
                    ? "Whitelist max transaction mint amount exceed"
                    : "Whitelist max mint amount exceed"
            );
        } else {
            require(
                _numberMinted(msg.sender) + _mintAmount <= maxMintAmount,
                "Max mint amount exceed"
            );
        }
        require(
            msg.value >= cost * _mintAmount || msg.sender == owner(),
            "Insufficient funds"
        );
        _;
    }

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

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

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(_exists(tokenId));
        if (isRevealed == false) {
            return notRevealedUri;
        }
        string memory currentBaseURI = _baseURI();
        return
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        tokenId.toString(),
                        ".json"
                    )
                )
                : "";
    }

    function _processMint(uint256 _mintAmount) internal {
        _safeMint(msg.sender, _mintAmount);
        emit NewSpaceRiderMinted(msg.sender, _mintAmount);
        starToken.updateRewardOnMint(msg.sender, _mintAmount);
    }

    function mint(uint256 _mintAmount)
        public
        payable
        mustPassChecks(_mintAmount)
    {
        require(
            isOnlyWhitelisted == false || msg.sender == owner(),
            "Whitelist only"
        );
        _processMint(_mintAmount);
    }

    function presaleMint(uint256 _mintAmount, bytes32[] memory proof)
        public
        payable
        mustPassChecks(_mintAmount)
    {
        require(
            (isOnlyWhitelisted == true &&
                proof.verify(
                    merkleRoot,
                    keccak256(abi.encodePacked(msg.sender))
                )) || msg.sender == owner(),
            !isOnlyWhitelisted ? "Whitelist sale ended" : "Not whitelisted"
        );
        _processMint(_mintAmount);
    }

    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = _startTokenId();
        uint256 ownedTokenIndex = 0;
        address latestOwnerAddress;

        while (
            ownedTokenIndex < ownerTokenCount && currentTokenId <= MAX_SUPPLY
        ) {
            TokenOwnership memory ownership = _ownerships[currentTokenId];

            if (!ownership.burned && ownership.addr != address(0)) {
                latestOwnerAddress = ownership.addr;
            }

            if (latestOwnerAddress == _owner) {
                ownedTokenIds[ownedTokenIndex] = currentTokenId;

                ownedTokenIndex++;
            }

            currentTokenId++;
        }
        return ownedTokenIds;
    }

    function mintedTotalOf(address _owner) public view returns (uint256) {
        return _numberMinted(_owner);
    }

    function toggleIsPaused() public onlyOwner {
        isPaused = !isPaused;
    }

    function toggleIsOnlyWhitelisted() public onlyOwner {
        isOnlyWhitelisted = !isOnlyWhitelisted;
    }

    function toggleIsRevealed() public onlyOwner {
        if (!isRevealed) require(bytes(baseURI).length > 0, "BaseURI not set");
        isRevealed = !isRevealed;
    }

    function setToken(address _contract) external onlyOwner {
        starToken = StarToken(_contract);
    }

    function setCost(uint256 _newCost) public onlyOwner {
        cost = _newCost;
    }

    function setMaxMintAmount(uint256 _newMaxMintAmount) public onlyOwner {
        maxMintAmount = _newMaxMintAmount;
    }

    function setMarketingSupply(uint256 _newMarketingSupply) public onlyOwner {
        require(
            _newMarketingSupply <= MAX_SUPPLY - totalSupply(),
            "Must be less than remaining supply"
        );
        marketingSupply = _newMarketingSupply;
    }

    function setMerkleRoot(bytes32 root) public onlyOwner {
        merkleRoot = root;
    }

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function airdrop(address[] calldata _users) public payable onlyOwner {
        require(
            marketingSupply > 0 &&
                _users.length <= marketingSupply &&
                _users.length > 0 &&
                (totalSupply() + _users.length < MAX_SUPPLY - marketingSupply),
            marketingSupply <= 0
                ? "Marketing supply empty"
                : (
                    _users.length > marketingSupply
                        ? "Addresses exceed marketing supply"
                        : (
                            _users.length == 0
                                ? "At least 1 address required"
                                : "Supply limit exceeded"
                        )
                )
        );

        for (uint256 i = 0; i < _users.length; i++) {
            _safeMint(_users[i], 1);
            emit NewSpaceRiderMinted(_users[i], 1);
            --marketingSupply;
            starToken.updateReward(address(0), _users[i]);
        }
    }

    function withdraw() public payable onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "No balance to withdraw");
        (bool successA, ) = payable(0x077aC19FF94d46F7155Ea660C92ab53bf8868763)
            .call{value: (balance / 100) * 20}("");
        (bool successB, ) = payable(0xCaD5307601377933A39cBd364581C57c7B7e6799)
            .call{value: (balance / 100) * 20}("");
        (bool successC, ) = payable(0x51D8f89Fae2e82c4bAcF6Ec270f36624bc9C6D1E)
            .call{value: (balance / 100) * 15}("");
        (bool successD, ) = payable(0x47aE9C38436D895529054A253CF55F5fCe03C369)
            .call{value: (balance / 100) * 5}("");
        (bool successE, ) = payable(0x2A76bAA2F2cFB1b17aE672C995B3C41398e86cCD)
            .call{value: (balance / 100) * 40}("");
        require(
            successA && successB && successC && successD && successE,
            "Withdraw failed"
        );
        assert(address(this).balance == 0);
    }

    function claimTokens() external {
        starToken.updateReward(msg.sender, address(0));
        starToken.getReward(msg.sender);
    }

    function spendTokens(uint256 _amount) external {
        starToken.spend(msg.sender, _amount);
    }

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 tokenId,
        uint256 quantity
    ) internal virtual override {
        super._beforeTokenTransfers(from, to, tokenId, quantity);
        if (from != address(0)) {
            starToken.updateReward(from, to);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MintedQueryForZeroAddress","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"NewSpaceRiderMinted","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":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TX_MINT_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_MAX_MINT_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_MAX_TX_MINT_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOnlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"mintedTotalOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","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":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMarketingSupply","type":"uint256"}],"name":"setMarketingSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"spendTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"starToken","outputs":[{"internalType":"contract StarToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleIsOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleIsPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleIsRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052600c805462ffffff1916620100011790556004600d5566b1a2bc2ec50000600e556064600f553480156200003757600080fd5b5060405162003600380380620036008339810160408190526200005a91620002d7565b825183908390620000739060029060208501906200017a565b508051620000899060039060208401906200017a565b50506001600055506200009c33620000b0565b620000a78162000102565b505050620003bb565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6008546001600160a01b03163314620001615760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b80516200017690600b9060208401906200017a565b5050565b828054620001889062000368565b90600052602060002090601f016020900481019282620001ac5760008555620001f7565b82601f10620001c757805160ff1916838001178555620001f7565b82800160010185558215620001f7579182015b82811115620001f7578251825591602001919060010190620001da565b506200020592915062000209565b5090565b5b808211156200020557600081556001016200020a565b600082601f8301126200023257600080fd5b81516001600160401b03808211156200024f576200024f620003a5565b604051601f8301601f19908116603f011681019082821181831017156200027a576200027a620003a5565b816040528381526020925086838588010111156200029757600080fd5b600091505b83821015620002bb57858201830151818301840152908201906200029c565b83821115620002cd5760008385830101525b9695505050505050565b600080600060608486031215620002ed57600080fd5b83516001600160401b03808211156200030557600080fd5b620003138783880162000220565b945060208601519150808211156200032a57600080fd5b620003388783880162000220565b935060408601519150808211156200034f57600080fd5b506200035e8682870162000220565b9150509250925092565b600181811c908216806200037d57607f821691505b602082108114156200039f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61323580620003cb6000396000f3fe6080604052600436106102935760003560e01c80636352211e1161015a578063aba458b3116100c1578063e0bd29eb1161007a578063e0bd29eb1461071e578063e3e1e8ef1461073e578063e985e9c514610751578063f2c4ce1e1461079a578063f2fde38b146107ba578063f9613d7f146107da57600080fd5b8063aba458b3146103d7578063b187bd261461068f578063b7ca51e8146106a9578063b88d4fde146106c9578063c87b56dd146106e9578063cc94513f1461070957600080fd5b80638da5cb5b116101135780638da5cb5b146105e95780638e39f5151461060757806395d89b41146106275780639c7cbec61461063c578063a0712d681461065c578063a22cb4651461066f57600080fd5b80636352211e1461054c5780636c0360eb1461056c57806370a0823114610581578063715018a6146105a1578063729ad39e146105b65780637cb64759146105c957600080fd5b806323b872dd116101fe57806344a0d68a116101b757806344a0d68a146104c257806347116f3f146103d757806348c54b9d146104e257806354214f69146104f757806355f804b314610516578063624bb58f1461053657600080fd5b806323b872dd1461041757806332cb6b0c146104375780633ccfd60b1461044d57806342842e0e14610455578063438b6300146104755780634432fcd5146104a257600080fd5b806313faede61161025057806313faede61461037e578063144fa6d7146103a257806318160ddd146103c2578063199983ba146103d757806321b80420146103ec578063239c70ae1461040157600080fd5b806301ffc9a71461029857806306fdde03146102cd578063081812fc146102ef578063081c8c4414610327578063088a4ed01461033c578063095ea7b31461035e575b600080fd5b3480156102a457600080fd5b506102b86102b3366004612d5f565b6107ef565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e2610841565b6040516102c49190612f85565b3480156102fb57600080fd5b5061030f61030a366004612d46565b6108d3565b6040516001600160a01b0390911681526020016102c4565b34801561033357600080fd5b506102e2610917565b34801561034857600080fd5b5061035c610357366004612d46565b6109a5565b005b34801561036a57600080fd5b5061035c610379366004612ca8565b6109dd565b34801561038a57600080fd5b50610394600e5481565b6040519081526020016102c4565b3480156103ae57600080fd5b5061035c6103bd366004612b67565b610a6b565b3480156103ce57600080fd5b50610394610ab7565b3480156103e357600080fd5b50610394600281565b3480156103f857600080fd5b5061035c610ac5565b34801561040d57600080fd5b50610394600d5481565b34801561042357600080fd5b5061035c610432366004612bb5565b610b6b565b34801561044357600080fd5b506103946122b881565b61035c610b76565b34801561046157600080fd5b5061035c610470366004612bb5565b610ea2565b34801561048157600080fd5b50610495610490366004612b67565b610ebd565b6040516102c49190612f41565b3480156104ae57600080fd5b506103946104bd366004612b67565b611004565b3480156104ce57600080fd5b5061035c6104dd366004612d46565b61100f565b3480156104ee57600080fd5b5061035c61103e565b34801561050357600080fd5b50600c546102b890610100900460ff1681565b34801561052257600080fd5b5061035c610531366004612d99565b611101565b34801561054257600080fd5b50610394600f5481565b34801561055857600080fd5b5061030f610567366004612d46565b611142565b34801561057857600080fd5b506102e2611154565b34801561058d57600080fd5b5061039461059c366004612b67565b611161565b3480156105ad57600080fd5b5061035c6111af565b61035c6105c4366004612cd2565b6111e5565b3480156105d557600080fd5b5061035c6105e4366004612d46565b6114b0565b3480156105f557600080fd5b506008546001600160a01b031661030f565b34801561061357600080fd5b5061035c610622366004612d46565b6114df565b34801561063357600080fd5b506102e2611547565b34801561064857600080fd5b50600c546102b89062010000900460ff1681565b61035c61066a366004612d46565b611556565b34801561067b57600080fd5b5061035c61068a366004612c6c565b61188d565b34801561069b57600080fd5b50600c546102b89060ff1681565b3480156106b557600080fd5b5060105461030f906001600160a01b031681565b3480156106d557600080fd5b5061035c6106e4366004612bf1565b611923565b3480156106f557600080fd5b506102e2610704366004612d46565b61196e565b34801561071557600080fd5b5061035c611a7f565b34801561072a57600080fd5b5061035c610739366004612d46565b611ac8565b61035c61074c366004612de1565b611b65565b34801561075d57600080fd5b506102b861076c366004612b82565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156107a657600080fd5b5061035c6107b5366004612d99565b611f41565b3480156107c657600080fd5b5061035c6107d5366004612b67565b611f7e565b3480156107e657600080fd5b5061035c612019565b60006001600160e01b031982166380ac58cd60e01b148061082057506001600160e01b03198216635b5e139f60e01b145b8061083b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060028054610850906130a2565b80601f016020809104026020016040519081016040528092919081815260200182805461087c906130a2565b80156108c95780601f1061089e576101008083540402835291602001916108c9565b820191906000526020600020905b8154815290600101906020018083116108ac57829003601f168201915b5050505050905090565b60006108de82612057565b6108fb576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600b8054610924906130a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610950906130a2565b801561099d5780601f106109725761010080835404028352916020019161099d565b820191906000526020600020905b81548152906001019060200180831161098057829003601f168201915b505050505081565b6008546001600160a01b031633146109d85760405162461bcd60e51b81526004016109cf90612f98565b60405180910390fd5b600d55565b60006109e882611142565b9050806001600160a01b0316836001600160a01b03161415610a1d5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610a3d5750610a3b813361076c565b155b15610a5b576040516367d9dca160e11b815260040160405180910390fd5b610a66838383612090565b505050565b6008546001600160a01b03163314610a955760405162461bcd60e51b81526004016109cf90612f98565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b600154600054036000190190565b6008546001600160a01b03163314610aef5760405162461bcd60e51b81526004016109cf90612f98565b600c54610100900460ff16610b4e576000600a8054610b0d906130a2565b905011610b4e5760405162461bcd60e51b815260206004820152600f60248201526e10985cd9555492481b9bdd081cd95d608a1b60448201526064016109cf565b600c805461ff001981166101009182900460ff1615909102179055565b610a668383836120ec565b6008546001600160a01b03163314610ba05760405162461bcd60e51b81526004016109cf90612f98565b4780610be75760405162461bcd60e51b81526020600482015260166024820152754e6f2062616c616e636520746f20776974686472617760501b60448201526064016109cf565b600073077ac19ff94d46f7155ea660c92ab53bf8868763610c09606484613015565b610c14906014613029565b604051600081818185875af1925050503d8060008114610c50576040519150601f19603f3d011682016040523d82523d6000602084013e610c55565b606091505b509091506000905073cad5307601377933a39cbd364581c57c7b7e6799610c7d606485613015565b610c88906014613029565b604051600081818185875af1925050503d8060008114610cc4576040519150601f19603f3d011682016040523d82523d6000602084013e610cc9565b606091505b50909150600090507351d8f89fae2e82c4bacf6ec270f36624bc9c6d1e610cf1606486613015565b610cfc90600f613029565b604051600081818185875af1925050503d8060008114610d38576040519150601f19603f3d011682016040523d82523d6000602084013e610d3d565b606091505b50909150600090507347ae9c38436d895529054a253cf55f5fce03c369610d65606487613015565b610d70906005613029565b604051600081818185875af1925050503d8060008114610dac576040519150601f19603f3d011682016040523d82523d6000602084013e610db1565b606091505b5090915060009050732a76baa2f2cfb1b17ae672c995b3c41398e86ccd610dd9606488613015565b610de4906028613029565b604051600081818185875af1925050503d8060008114610e20576040519150601f19603f3d011682016040523d82523d6000602084013e610e25565b606091505b50509050848015610e335750835b8015610e3c5750825b8015610e455750815b8015610e4e5750805b610e8c5760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a191c985dc819985a5b1959608a1b60448201526064016109cf565b4715610e9a57610e9a61310c565b505050505050565b610a6683838360405180602001604052806000815250611923565b60606000610eca83611161565b90506000816001600160401b03811115610ee657610ee6613164565b604051908082528060200260200182016040528015610f0f578160200160208202803683370190505b50905060016000805b8482108015610f2957506122b88311155b15610ff957600083815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161580159282018390529091610f96575080516001600160a01b031615155b15610fa057805191505b876001600160a01b0316826001600160a01b03161415610fe65783858481518110610fcd57610fcd61314e565b602090810291909101015282610fe2816130dd565b9350505b83610ff0816130dd565b94505050610f18565b509195945050505050565b600061083b8261230a565b6008546001600160a01b031633146110395760405162461bcd60e51b81526004016109cf90612f98565b600e55565b601054604051636918579d60e11b8152336004820152600060248201526001600160a01b039091169063d230af3a90604401600060405180830381600087803b15801561108a57600080fd5b505af115801561109e573d6000803e3d6000fd5b5050601054604051630c00007b60e41b81523360048201526001600160a01b03909116925063c00007b09150602401600060405180830381600087803b1580156110e757600080fd5b505af11580156110fb573d6000803e3d6000fd5b50505050565b6008546001600160a01b0316331461112b5760405162461bcd60e51b81526004016109cf90612f98565b805161113e90600a906020840190612a5b565b5050565b600061114d8261235f565b5192915050565b600a8054610924906130a2565b60006001600160a01b03821661118a576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146111d95760405162461bcd60e51b81526004016109cf90612f98565b6111e36000612486565b565b6008546001600160a01b0316331461120f5760405162461bcd60e51b81526004016109cf90612f98565b6000600f541180156112235750600f548111155b801561122e57508015155b80156112595750600f54611244906122b8613048565b8161124d610ab7565b6112579190612ffd565b105b600f54156112fc57600f5482116112de5781156112a3576040518060400160405280601581526020017414dd5c1c1b1e481b1a5b5a5d08195e18d959591959605a1b81525061132c565b6040518060400160405280601b81526020017f4174206c6561737420312061646472657373207265717569726564000000000081525061132c565b6040518060600160405280602181526020016131df6021913961132c565b604051806040016040528060168152602001754d61726b6574696e6720737570706c7920656d70747960501b8152505b9061134a5760405162461bcd60e51b81526004016109cf9190612f85565b5060005b81811015610a665761138783838381811061136b5761136b61314e565b90506020020160208101906113809190612b67565b60016124d8565b7f8133fb1b6bc303c39a6a28413898d8f2ff9918a8fea94703812c9fe07d8dd5628383838181106113ba576113ba61314e565b90506020020160208101906113cf9190612b67565b604080516001600160a01b039092168252600160208301520160405180910390a1600f600081546113ff9061308b565b909155506010546001600160a01b031663d230af3a60008585858181106114285761142861314e565b905060200201602081019061143d9190612b67565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401600060405180830381600087803b15801561148557600080fd5b505af1158015611499573d6000803e3d6000fd5b5050505080806114a8906130dd565b91505061134e565b6008546001600160a01b031633146114da5760405162461bcd60e51b81526004016109cf90612f98565b600955565b60105460405163af7d6ca360e01b8152336004820152602481018390526001600160a01b039091169063af7d6ca3906044015b600060405180830381600087803b15801561152c57600080fd5b505af1158015611540573d6000803e3d6000fd5b5050505050565b606060038054610850906130a2565b600c54819060ff16158061157457506008546001600160a01b031633145b80156115805750600081115b801561158d575060028111155b80156115b95750600f546115a3906122b8613048565b816115ac610ab7565b6115b69190612ffd565b11155b600c5460ff1661165d5781156116225760028211611604576040518060400160405280601581526020017414dd5c1c1b1e481b1a5b5a5d08195e18d959591959605a1b815250611685565b6040518060600160405280602281526020016131bd60229139611685565b6040518060400160405280601b81526020017f596f75206e65656420746f206d696e74206174206c6561737420310000000000815250611685565b6040518060400160405280600e81526020016d14d85b19481a5cc81c185d5cd95960921b8152505b906116a35760405162461bcd60e51b81526004016109cf9190612f85565b50600c5462010000900460ff1615156001141561176057600281111580156116df57506002816116d23361230a565b6116dc9190612ffd565b11155b60028211611722576040518060400160405280602081526020017f57686974656c697374206d6178206d696e7420616d6f756e742065786365656481525061173c565b6040518060600160405280602c8152602001613191602c91395b9061175a5760405162461bcd60e51b81526004016109cf9190612f85565b506117be565b600d548161176d3361230a565b6117779190612ffd565b11156117be5760405162461bcd60e51b815260206004820152601660248201527513585e081b5a5b9d08185b5bdd5b9d08195e18d9595960521b60448201526064016109cf565b80600e546117cc9190613029565b341015806117e457506008546001600160a01b031633145b6118255760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b60448201526064016109cf565b600c5462010000900460ff16158061184757506008546001600160a01b031633145b6118845760405162461bcd60e51b815260206004820152600e60248201526d57686974656c697374206f6e6c7960901b60448201526064016109cf565b61113e826124f2565b6001600160a01b0382163314156118b75760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61192e8484846120ec565b6001600160a01b0383163b15158015611950575061194e8484848461256c565b155b156110fb576040516368d2bf6b60e11b815260040160405180910390fd5b606061197982612057565b61198257600080fd5b600c54610100900460ff16611a2357600b805461199e906130a2565b80601f01602080910402602001604051908101604052809291908181526020018280546119ca906130a2565b8015611a175780601f106119ec57610100808354040283529160200191611a17565b820191906000526020600020905b8154815290600101906020018083116119fa57829003601f168201915b50505050509050919050565b6000611a2d612664565b90506000815111611a4d5760405180602001604052806000815250611a78565b80611a5784612673565b604051602001611a68929190612ec5565b6040516020818303038152906040525b9392505050565b6008546001600160a01b03163314611aa95760405162461bcd60e51b81526004016109cf90612f98565b600c805462ff0000198116620100009182900460ff1615909102179055565b6008546001600160a01b03163314611af25760405162461bcd60e51b81526004016109cf90612f98565b611afa610ab7565b611b06906122b8613048565b811115611b605760405162461bcd60e51b815260206004820152602260248201527f4d757374206265206c657373207468616e2072656d61696e696e6720737570706044820152616c7960f01b60648201526084016109cf565b600f55565b600c54829060ff161580611b8357506008546001600160a01b031633145b8015611b8f5750600081115b8015611b9c575060028111155b8015611bc85750600f54611bb2906122b8613048565b81611bbb610ab7565b611bc59190612ffd565b11155b600c5460ff16611c6c578115611c315760028211611c13576040518060400160405280601581526020017414dd5c1c1b1e481b1a5b5a5d08195e18d959591959605a1b815250611c94565b6040518060600160405280602281526020016131bd60229139611c94565b6040518060400160405280601b81526020017f596f75206e65656420746f206d696e74206174206c6561737420310000000000815250611c94565b6040518060400160405280600e81526020016d14d85b19481a5cc81c185d5cd95960921b8152505b90611cb25760405162461bcd60e51b81526004016109cf9190612f85565b50600c5462010000900460ff16151560011415611d6f5760028111158015611cee5750600281611ce13361230a565b611ceb9190612ffd565b11155b60028211611d31576040518060400160405280602081526020017f57686974656c697374206d6178206d696e7420616d6f756e7420657863656564815250611d4b565b6040518060600160405280602c8152602001613191602c91395b90611d695760405162461bcd60e51b81526004016109cf9190612f85565b50611dcd565b600d5481611d7c3361230a565b611d869190612ffd565b1115611dcd5760405162461bcd60e51b815260206004820152601660248201527513585e081b5a5b9d08185b5bdd5b9d08195e18d9595960521b60448201526064016109cf565b80600e54611ddb9190613029565b34101580611df357506008546001600160a01b031633145b611e345760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b60448201526064016109cf565b600c5462010000900460ff1615156001148015611e9857506009546040516bffffffffffffffffffffffff193360601b166020820152611e98919060340160405160208183030381529060405280519060200120846127709092919063ffffffff16565b80611ead57506008546001600160a01b031633145b600c5462010000900460ff1615611eeb576040518060400160405280600f81526020016e139bdd081dda1a5d195b1a5cdd1959608a1b815250611f19565b6040518060400160405280601481526020017315da1a5d195b1a5cdd081cd85b1948195b99195960621b8152505b90611f375760405162461bcd60e51b81526004016109cf9190612f85565b50610a66836124f2565b6008546001600160a01b03163314611f6b5760405162461bcd60e51b81526004016109cf90612f98565b805161113e90600b906020840190612a5b565b6008546001600160a01b03163314611fa85760405162461bcd60e51b81526004016109cf90612f98565b6001600160a01b03811661200d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109cf565b61201681612486565b50565b6008546001600160a01b031633146120435760405162461bcd60e51b81526004016109cf90612f98565b600c805460ff19811660ff90911615179055565b60008160011115801561206b575060005482105b801561083b575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006120f78261235f565b80519091506000906001600160a01b0316336001600160a01b0316148061212557508151612125903361076c565b80612140575033612135846108d3565b6001600160a01b0316145b90508061216057604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146121955760405162a1148160e81b815260040160405180910390fd5b6001600160a01b0384166121bc57604051633a954ecd60e21b815260040160405180910390fd5b6121c98585856001612786565b6121d96000848460000151612090565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102179092559086018083529120549091166122c3576000548110156122c357825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611540565b60006001600160a01b038216612333576040516335ebb31960e01b815260040160405180910390fd5b506001600160a01b0316600090815260056020526040902054600160401b90046001600160401b031690565b6040805160608101825260008082526020820181905291810191909152818060011115801561238f575060005481105b1561246d57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529061246b5780516001600160a01b031615612402579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612466579392505050565b612402565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61113e828260405180602001604052806000815250612802565b6124fc33826124d8565b60408051338152602081018390527f8133fb1b6bc303c39a6a28413898d8f2ff9918a8fea94703812c9fe07d8dd562910160405180910390a160105460405163cc240c0160e01b8152336004820152602481018390526001600160a01b039091169063cc240c0190604401611512565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906125a1903390899088908890600401612f04565b602060405180830381600087803b1580156125bb57600080fd5b505af19250505080156125eb575060408051601f3d908101601f191682019092526125e891810190612d7c565b60015b612646573d808015612619576040519150601f19603f3d011682016040523d82523d6000602084013e61261e565b606091505b50805161263e576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600a8054610850906130a2565b6060816126975750506040805180820190915260018152600360fc1b602082015290565b8160005b81156126c157806126ab816130dd565b91506126ba9050600a83613015565b915061269b565b6000816001600160401b038111156126db576126db613164565b6040519080825280601f01601f191660200182016040528015612705576020820181803683370190505b5090505b841561265c5761271a600183613048565b9150612727600a866130f8565b612732906030612ffd565b60f81b8183815181106127475761274761314e565b60200101906001600160f81b031916908160001a905350612769600a86613015565b9450612709565b60008261277d858461280f565b14949350505050565b6001600160a01b038416156110fb57601054604051636918579d60e11b81526001600160a01b03868116600483015285811660248301529091169063d230af3a90604401600060405180830381600087803b1580156127e457600080fd5b505af11580156127f8573d6000803e3d6000fd5b5050505050505050565b610a668383836001612883565b600081815b845181101561287b5760008582815181106128315761283161314e565b602002602001015190508083116128575760008381526020829052604090209250612868565b600081815260208490526040902092505b5080612873816130dd565b915050612814565b509392505050565b6000546001600160a01b0385166128ac57604051622e076360e81b815260040160405180910390fd5b836128ca5760405163b562e8dd60e01b815260040160405180910390fd5b6128d76000868387612786565b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561298357506001600160a01b0387163b15155b15612a0c575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46129d4600088848060010195508861256c565b6129f1576040516368d2bf6b60e11b815260040160405180910390fd5b80821415612989578260005414612a0757600080fd5b612a52565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415612a0d575b50600055611540565b828054612a67906130a2565b90600052602060002090601f016020900481019282612a895760008555612acf565b82601f10612aa257805160ff1916838001178555612acf565b82800160010185558215612acf579182015b82811115612acf578251825591602001919060010190612ab4565b50612adb929150612adf565b5090565b5b80821115612adb5760008155600101612ae0565b60006001600160401b03831115612b0d57612b0d613164565b612b20601f8401601f1916602001612fcd565b9050828152838383011115612b3457600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612b6257600080fd5b919050565b600060208284031215612b7957600080fd5b611a7882612b4b565b60008060408385031215612b9557600080fd5b612b9e83612b4b565b9150612bac60208401612b4b565b90509250929050565b600080600060608486031215612bca57600080fd5b612bd384612b4b565b9250612be160208501612b4b565b9150604084013590509250925092565b60008060008060808587031215612c0757600080fd5b612c1085612b4b565b9350612c1e60208601612b4b565b92506040850135915060608501356001600160401b03811115612c4057600080fd5b8501601f81018713612c5157600080fd5b612c6087823560208401612af4565b91505092959194509250565b60008060408385031215612c7f57600080fd5b612c8883612b4b565b915060208301358015158114612c9d57600080fd5b809150509250929050565b60008060408385031215612cbb57600080fd5b612cc483612b4b565b946020939093013593505050565b60008060208385031215612ce557600080fd5b82356001600160401b0380821115612cfc57600080fd5b818501915085601f830112612d1057600080fd5b813581811115612d1f57600080fd5b8660208260051b8501011115612d3457600080fd5b60209290920196919550909350505050565b600060208284031215612d5857600080fd5b5035919050565b600060208284031215612d7157600080fd5b8135611a788161317a565b600060208284031215612d8e57600080fd5b8151611a788161317a565b600060208284031215612dab57600080fd5b81356001600160401b03811115612dc157600080fd5b8201601f81018413612dd257600080fd5b61265c84823560208401612af4565b60008060408385031215612df457600080fd5b823591506020808401356001600160401b0380821115612e1357600080fd5b818601915086601f830112612e2757600080fd5b813581811115612e3957612e39613164565b8060051b9150612e4a848301612fcd565b8181528481019084860184860187018b1015612e6557600080fd5b600095505b83861015612e88578035835260019590950194918601918601612e6a565b508096505050505050509250929050565b60008151808452612eb181602086016020860161305f565b601f01601f19169290920160200192915050565b60008351612ed781846020880161305f565b835190830190612eeb81836020880161305f565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f3790830184612e99565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612f7957835183529284019291840191600101612f5d565b50909695505050505050565b602081526000611a786020830184612e99565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f191681016001600160401b0381118282101715612ff557612ff5613164565b604052919050565b6000821982111561301057613010613122565b500190565b60008261302457613024613138565b500490565b600081600019048311821515161561304357613043613122565b500290565b60008282101561305a5761305a613122565b500390565b60005b8381101561307a578181015183820152602001613062565b838111156110fb5750506000910152565b60008161309a5761309a613122565b506000190190565b600181811c908216806130b657607f821691505b602082108114156130d757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156130f1576130f1613122565b5060010190565b60008261310757613107613138565b500690565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461201657600080fdfe57686974656c697374206d6178207472616e73616374696f6e206d696e7420616d6f756e74206578636565644d6178207472616e73616374696f6e206d696e7420616d6f756e742065786365656441646472657373657320657863656564206d61726b6574696e6720737570706c79a264697066735822122096a4b54dd9ff03c08872ab04db0f6aa890bf21c2044ffb485912593e849d410f64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000c5370616365205269646572730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000353505200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d523669354379566263716d71626468364462345875335a524762574a476e59437374473442385353676f79360000000000000000000000

Deployed Bytecode

0x6080604052600436106102935760003560e01c80636352211e1161015a578063aba458b3116100c1578063e0bd29eb1161007a578063e0bd29eb1461071e578063e3e1e8ef1461073e578063e985e9c514610751578063f2c4ce1e1461079a578063f2fde38b146107ba578063f9613d7f146107da57600080fd5b8063aba458b3146103d7578063b187bd261461068f578063b7ca51e8146106a9578063b88d4fde146106c9578063c87b56dd146106e9578063cc94513f1461070957600080fd5b80638da5cb5b116101135780638da5cb5b146105e95780638e39f5151461060757806395d89b41146106275780639c7cbec61461063c578063a0712d681461065c578063a22cb4651461066f57600080fd5b80636352211e1461054c5780636c0360eb1461056c57806370a0823114610581578063715018a6146105a1578063729ad39e146105b65780637cb64759146105c957600080fd5b806323b872dd116101fe57806344a0d68a116101b757806344a0d68a146104c257806347116f3f146103d757806348c54b9d146104e257806354214f69146104f757806355f804b314610516578063624bb58f1461053657600080fd5b806323b872dd1461041757806332cb6b0c146104375780633ccfd60b1461044d57806342842e0e14610455578063438b6300146104755780634432fcd5146104a257600080fd5b806313faede61161025057806313faede61461037e578063144fa6d7146103a257806318160ddd146103c2578063199983ba146103d757806321b80420146103ec578063239c70ae1461040157600080fd5b806301ffc9a71461029857806306fdde03146102cd578063081812fc146102ef578063081c8c4414610327578063088a4ed01461033c578063095ea7b31461035e575b600080fd5b3480156102a457600080fd5b506102b86102b3366004612d5f565b6107ef565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e2610841565b6040516102c49190612f85565b3480156102fb57600080fd5b5061030f61030a366004612d46565b6108d3565b6040516001600160a01b0390911681526020016102c4565b34801561033357600080fd5b506102e2610917565b34801561034857600080fd5b5061035c610357366004612d46565b6109a5565b005b34801561036a57600080fd5b5061035c610379366004612ca8565b6109dd565b34801561038a57600080fd5b50610394600e5481565b6040519081526020016102c4565b3480156103ae57600080fd5b5061035c6103bd366004612b67565b610a6b565b3480156103ce57600080fd5b50610394610ab7565b3480156103e357600080fd5b50610394600281565b3480156103f857600080fd5b5061035c610ac5565b34801561040d57600080fd5b50610394600d5481565b34801561042357600080fd5b5061035c610432366004612bb5565b610b6b565b34801561044357600080fd5b506103946122b881565b61035c610b76565b34801561046157600080fd5b5061035c610470366004612bb5565b610ea2565b34801561048157600080fd5b50610495610490366004612b67565b610ebd565b6040516102c49190612f41565b3480156104ae57600080fd5b506103946104bd366004612b67565b611004565b3480156104ce57600080fd5b5061035c6104dd366004612d46565b61100f565b3480156104ee57600080fd5b5061035c61103e565b34801561050357600080fd5b50600c546102b890610100900460ff1681565b34801561052257600080fd5b5061035c610531366004612d99565b611101565b34801561054257600080fd5b50610394600f5481565b34801561055857600080fd5b5061030f610567366004612d46565b611142565b34801561057857600080fd5b506102e2611154565b34801561058d57600080fd5b5061039461059c366004612b67565b611161565b3480156105ad57600080fd5b5061035c6111af565b61035c6105c4366004612cd2565b6111e5565b3480156105d557600080fd5b5061035c6105e4366004612d46565b6114b0565b3480156105f557600080fd5b506008546001600160a01b031661030f565b34801561061357600080fd5b5061035c610622366004612d46565b6114df565b34801561063357600080fd5b506102e2611547565b34801561064857600080fd5b50600c546102b89062010000900460ff1681565b61035c61066a366004612d46565b611556565b34801561067b57600080fd5b5061035c61068a366004612c6c565b61188d565b34801561069b57600080fd5b50600c546102b89060ff1681565b3480156106b557600080fd5b5060105461030f906001600160a01b031681565b3480156106d557600080fd5b5061035c6106e4366004612bf1565b611923565b3480156106f557600080fd5b506102e2610704366004612d46565b61196e565b34801561071557600080fd5b5061035c611a7f565b34801561072a57600080fd5b5061035c610739366004612d46565b611ac8565b61035c61074c366004612de1565b611b65565b34801561075d57600080fd5b506102b861076c366004612b82565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156107a657600080fd5b5061035c6107b5366004612d99565b611f41565b3480156107c657600080fd5b5061035c6107d5366004612b67565b611f7e565b3480156107e657600080fd5b5061035c612019565b60006001600160e01b031982166380ac58cd60e01b148061082057506001600160e01b03198216635b5e139f60e01b145b8061083b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060028054610850906130a2565b80601f016020809104026020016040519081016040528092919081815260200182805461087c906130a2565b80156108c95780601f1061089e576101008083540402835291602001916108c9565b820191906000526020600020905b8154815290600101906020018083116108ac57829003601f168201915b5050505050905090565b60006108de82612057565b6108fb576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600b8054610924906130a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610950906130a2565b801561099d5780601f106109725761010080835404028352916020019161099d565b820191906000526020600020905b81548152906001019060200180831161098057829003601f168201915b505050505081565b6008546001600160a01b031633146109d85760405162461bcd60e51b81526004016109cf90612f98565b60405180910390fd5b600d55565b60006109e882611142565b9050806001600160a01b0316836001600160a01b03161415610a1d5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610a3d5750610a3b813361076c565b155b15610a5b576040516367d9dca160e11b815260040160405180910390fd5b610a66838383612090565b505050565b6008546001600160a01b03163314610a955760405162461bcd60e51b81526004016109cf90612f98565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b600154600054036000190190565b6008546001600160a01b03163314610aef5760405162461bcd60e51b81526004016109cf90612f98565b600c54610100900460ff16610b4e576000600a8054610b0d906130a2565b905011610b4e5760405162461bcd60e51b815260206004820152600f60248201526e10985cd9555492481b9bdd081cd95d608a1b60448201526064016109cf565b600c805461ff001981166101009182900460ff1615909102179055565b610a668383836120ec565b6008546001600160a01b03163314610ba05760405162461bcd60e51b81526004016109cf90612f98565b4780610be75760405162461bcd60e51b81526020600482015260166024820152754e6f2062616c616e636520746f20776974686472617760501b60448201526064016109cf565b600073077ac19ff94d46f7155ea660c92ab53bf8868763610c09606484613015565b610c14906014613029565b604051600081818185875af1925050503d8060008114610c50576040519150601f19603f3d011682016040523d82523d6000602084013e610c55565b606091505b509091506000905073cad5307601377933a39cbd364581c57c7b7e6799610c7d606485613015565b610c88906014613029565b604051600081818185875af1925050503d8060008114610cc4576040519150601f19603f3d011682016040523d82523d6000602084013e610cc9565b606091505b50909150600090507351d8f89fae2e82c4bacf6ec270f36624bc9c6d1e610cf1606486613015565b610cfc90600f613029565b604051600081818185875af1925050503d8060008114610d38576040519150601f19603f3d011682016040523d82523d6000602084013e610d3d565b606091505b50909150600090507347ae9c38436d895529054a253cf55f5fce03c369610d65606487613015565b610d70906005613029565b604051600081818185875af1925050503d8060008114610dac576040519150601f19603f3d011682016040523d82523d6000602084013e610db1565b606091505b5090915060009050732a76baa2f2cfb1b17ae672c995b3c41398e86ccd610dd9606488613015565b610de4906028613029565b604051600081818185875af1925050503d8060008114610e20576040519150601f19603f3d011682016040523d82523d6000602084013e610e25565b606091505b50509050848015610e335750835b8015610e3c5750825b8015610e455750815b8015610e4e5750805b610e8c5760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a191c985dc819985a5b1959608a1b60448201526064016109cf565b4715610e9a57610e9a61310c565b505050505050565b610a6683838360405180602001604052806000815250611923565b60606000610eca83611161565b90506000816001600160401b03811115610ee657610ee6613164565b604051908082528060200260200182016040528015610f0f578160200160208202803683370190505b50905060016000805b8482108015610f2957506122b88311155b15610ff957600083815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161580159282018390529091610f96575080516001600160a01b031615155b15610fa057805191505b876001600160a01b0316826001600160a01b03161415610fe65783858481518110610fcd57610fcd61314e565b602090810291909101015282610fe2816130dd565b9350505b83610ff0816130dd565b94505050610f18565b509195945050505050565b600061083b8261230a565b6008546001600160a01b031633146110395760405162461bcd60e51b81526004016109cf90612f98565b600e55565b601054604051636918579d60e11b8152336004820152600060248201526001600160a01b039091169063d230af3a90604401600060405180830381600087803b15801561108a57600080fd5b505af115801561109e573d6000803e3d6000fd5b5050601054604051630c00007b60e41b81523360048201526001600160a01b03909116925063c00007b09150602401600060405180830381600087803b1580156110e757600080fd5b505af11580156110fb573d6000803e3d6000fd5b50505050565b6008546001600160a01b0316331461112b5760405162461bcd60e51b81526004016109cf90612f98565b805161113e90600a906020840190612a5b565b5050565b600061114d8261235f565b5192915050565b600a8054610924906130a2565b60006001600160a01b03821661118a576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146111d95760405162461bcd60e51b81526004016109cf90612f98565b6111e36000612486565b565b6008546001600160a01b0316331461120f5760405162461bcd60e51b81526004016109cf90612f98565b6000600f541180156112235750600f548111155b801561122e57508015155b80156112595750600f54611244906122b8613048565b8161124d610ab7565b6112579190612ffd565b105b600f54156112fc57600f5482116112de5781156112a3576040518060400160405280601581526020017414dd5c1c1b1e481b1a5b5a5d08195e18d959591959605a1b81525061132c565b6040518060400160405280601b81526020017f4174206c6561737420312061646472657373207265717569726564000000000081525061132c565b6040518060600160405280602181526020016131df6021913961132c565b604051806040016040528060168152602001754d61726b6574696e6720737570706c7920656d70747960501b8152505b9061134a5760405162461bcd60e51b81526004016109cf9190612f85565b5060005b81811015610a665761138783838381811061136b5761136b61314e565b90506020020160208101906113809190612b67565b60016124d8565b7f8133fb1b6bc303c39a6a28413898d8f2ff9918a8fea94703812c9fe07d8dd5628383838181106113ba576113ba61314e565b90506020020160208101906113cf9190612b67565b604080516001600160a01b039092168252600160208301520160405180910390a1600f600081546113ff9061308b565b909155506010546001600160a01b031663d230af3a60008585858181106114285761142861314e565b905060200201602081019061143d9190612b67565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401600060405180830381600087803b15801561148557600080fd5b505af1158015611499573d6000803e3d6000fd5b5050505080806114a8906130dd565b91505061134e565b6008546001600160a01b031633146114da5760405162461bcd60e51b81526004016109cf90612f98565b600955565b60105460405163af7d6ca360e01b8152336004820152602481018390526001600160a01b039091169063af7d6ca3906044015b600060405180830381600087803b15801561152c57600080fd5b505af1158015611540573d6000803e3d6000fd5b5050505050565b606060038054610850906130a2565b600c54819060ff16158061157457506008546001600160a01b031633145b80156115805750600081115b801561158d575060028111155b80156115b95750600f546115a3906122b8613048565b816115ac610ab7565b6115b69190612ffd565b11155b600c5460ff1661165d5781156116225760028211611604576040518060400160405280601581526020017414dd5c1c1b1e481b1a5b5a5d08195e18d959591959605a1b815250611685565b6040518060600160405280602281526020016131bd60229139611685565b6040518060400160405280601b81526020017f596f75206e65656420746f206d696e74206174206c6561737420310000000000815250611685565b6040518060400160405280600e81526020016d14d85b19481a5cc81c185d5cd95960921b8152505b906116a35760405162461bcd60e51b81526004016109cf9190612f85565b50600c5462010000900460ff1615156001141561176057600281111580156116df57506002816116d23361230a565b6116dc9190612ffd565b11155b60028211611722576040518060400160405280602081526020017f57686974656c697374206d6178206d696e7420616d6f756e742065786365656481525061173c565b6040518060600160405280602c8152602001613191602c91395b9061175a5760405162461bcd60e51b81526004016109cf9190612f85565b506117be565b600d548161176d3361230a565b6117779190612ffd565b11156117be5760405162461bcd60e51b815260206004820152601660248201527513585e081b5a5b9d08185b5bdd5b9d08195e18d9595960521b60448201526064016109cf565b80600e546117cc9190613029565b341015806117e457506008546001600160a01b031633145b6118255760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b60448201526064016109cf565b600c5462010000900460ff16158061184757506008546001600160a01b031633145b6118845760405162461bcd60e51b815260206004820152600e60248201526d57686974656c697374206f6e6c7960901b60448201526064016109cf565b61113e826124f2565b6001600160a01b0382163314156118b75760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61192e8484846120ec565b6001600160a01b0383163b15158015611950575061194e8484848461256c565b155b156110fb576040516368d2bf6b60e11b815260040160405180910390fd5b606061197982612057565b61198257600080fd5b600c54610100900460ff16611a2357600b805461199e906130a2565b80601f01602080910402602001604051908101604052809291908181526020018280546119ca906130a2565b8015611a175780601f106119ec57610100808354040283529160200191611a17565b820191906000526020600020905b8154815290600101906020018083116119fa57829003601f168201915b50505050509050919050565b6000611a2d612664565b90506000815111611a4d5760405180602001604052806000815250611a78565b80611a5784612673565b604051602001611a68929190612ec5565b6040516020818303038152906040525b9392505050565b6008546001600160a01b03163314611aa95760405162461bcd60e51b81526004016109cf90612f98565b600c805462ff0000198116620100009182900460ff1615909102179055565b6008546001600160a01b03163314611af25760405162461bcd60e51b81526004016109cf90612f98565b611afa610ab7565b611b06906122b8613048565b811115611b605760405162461bcd60e51b815260206004820152602260248201527f4d757374206265206c657373207468616e2072656d61696e696e6720737570706044820152616c7960f01b60648201526084016109cf565b600f55565b600c54829060ff161580611b8357506008546001600160a01b031633145b8015611b8f5750600081115b8015611b9c575060028111155b8015611bc85750600f54611bb2906122b8613048565b81611bbb610ab7565b611bc59190612ffd565b11155b600c5460ff16611c6c578115611c315760028211611c13576040518060400160405280601581526020017414dd5c1c1b1e481b1a5b5a5d08195e18d959591959605a1b815250611c94565b6040518060600160405280602281526020016131bd60229139611c94565b6040518060400160405280601b81526020017f596f75206e65656420746f206d696e74206174206c6561737420310000000000815250611c94565b6040518060400160405280600e81526020016d14d85b19481a5cc81c185d5cd95960921b8152505b90611cb25760405162461bcd60e51b81526004016109cf9190612f85565b50600c5462010000900460ff16151560011415611d6f5760028111158015611cee5750600281611ce13361230a565b611ceb9190612ffd565b11155b60028211611d31576040518060400160405280602081526020017f57686974656c697374206d6178206d696e7420616d6f756e7420657863656564815250611d4b565b6040518060600160405280602c8152602001613191602c91395b90611d695760405162461bcd60e51b81526004016109cf9190612f85565b50611dcd565b600d5481611d7c3361230a565b611d869190612ffd565b1115611dcd5760405162461bcd60e51b815260206004820152601660248201527513585e081b5a5b9d08185b5bdd5b9d08195e18d9595960521b60448201526064016109cf565b80600e54611ddb9190613029565b34101580611df357506008546001600160a01b031633145b611e345760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b60448201526064016109cf565b600c5462010000900460ff1615156001148015611e9857506009546040516bffffffffffffffffffffffff193360601b166020820152611e98919060340160405160208183030381529060405280519060200120846127709092919063ffffffff16565b80611ead57506008546001600160a01b031633145b600c5462010000900460ff1615611eeb576040518060400160405280600f81526020016e139bdd081dda1a5d195b1a5cdd1959608a1b815250611f19565b6040518060400160405280601481526020017315da1a5d195b1a5cdd081cd85b1948195b99195960621b8152505b90611f375760405162461bcd60e51b81526004016109cf9190612f85565b50610a66836124f2565b6008546001600160a01b03163314611f6b5760405162461bcd60e51b81526004016109cf90612f98565b805161113e90600b906020840190612a5b565b6008546001600160a01b03163314611fa85760405162461bcd60e51b81526004016109cf90612f98565b6001600160a01b03811661200d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109cf565b61201681612486565b50565b6008546001600160a01b031633146120435760405162461bcd60e51b81526004016109cf90612f98565b600c805460ff19811660ff90911615179055565b60008160011115801561206b575060005482105b801561083b575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006120f78261235f565b80519091506000906001600160a01b0316336001600160a01b0316148061212557508151612125903361076c565b80612140575033612135846108d3565b6001600160a01b0316145b90508061216057604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146121955760405162a1148160e81b815260040160405180910390fd5b6001600160a01b0384166121bc57604051633a954ecd60e21b815260040160405180910390fd5b6121c98585856001612786565b6121d96000848460000151612090565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102179092559086018083529120549091166122c3576000548110156122c357825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611540565b60006001600160a01b038216612333576040516335ebb31960e01b815260040160405180910390fd5b506001600160a01b0316600090815260056020526040902054600160401b90046001600160401b031690565b6040805160608101825260008082526020820181905291810191909152818060011115801561238f575060005481105b1561246d57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529061246b5780516001600160a01b031615612402579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612466579392505050565b612402565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61113e828260405180602001604052806000815250612802565b6124fc33826124d8565b60408051338152602081018390527f8133fb1b6bc303c39a6a28413898d8f2ff9918a8fea94703812c9fe07d8dd562910160405180910390a160105460405163cc240c0160e01b8152336004820152602481018390526001600160a01b039091169063cc240c0190604401611512565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906125a1903390899088908890600401612f04565b602060405180830381600087803b1580156125bb57600080fd5b505af19250505080156125eb575060408051601f3d908101601f191682019092526125e891810190612d7c565b60015b612646573d808015612619576040519150601f19603f3d011682016040523d82523d6000602084013e61261e565b606091505b50805161263e576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600a8054610850906130a2565b6060816126975750506040805180820190915260018152600360fc1b602082015290565b8160005b81156126c157806126ab816130dd565b91506126ba9050600a83613015565b915061269b565b6000816001600160401b038111156126db576126db613164565b6040519080825280601f01601f191660200182016040528015612705576020820181803683370190505b5090505b841561265c5761271a600183613048565b9150612727600a866130f8565b612732906030612ffd565b60f81b8183815181106127475761274761314e565b60200101906001600160f81b031916908160001a905350612769600a86613015565b9450612709565b60008261277d858461280f565b14949350505050565b6001600160a01b038416156110fb57601054604051636918579d60e11b81526001600160a01b03868116600483015285811660248301529091169063d230af3a90604401600060405180830381600087803b1580156127e457600080fd5b505af11580156127f8573d6000803e3d6000fd5b5050505050505050565b610a668383836001612883565b600081815b845181101561287b5760008582815181106128315761283161314e565b602002602001015190508083116128575760008381526020829052604090209250612868565b600081815260208490526040902092505b5080612873816130dd565b915050612814565b509392505050565b6000546001600160a01b0385166128ac57604051622e076360e81b815260040160405180910390fd5b836128ca5760405163b562e8dd60e01b815260040160405180910390fd5b6128d76000868387612786565b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561298357506001600160a01b0387163b15155b15612a0c575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46129d4600088848060010195508861256c565b6129f1576040516368d2bf6b60e11b815260040160405180910390fd5b80821415612989578260005414612a0757600080fd5b612a52565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415612a0d575b50600055611540565b828054612a67906130a2565b90600052602060002090601f016020900481019282612a895760008555612acf565b82601f10612aa257805160ff1916838001178555612acf565b82800160010185558215612acf579182015b82811115612acf578251825591602001919060010190612ab4565b50612adb929150612adf565b5090565b5b80821115612adb5760008155600101612ae0565b60006001600160401b03831115612b0d57612b0d613164565b612b20601f8401601f1916602001612fcd565b9050828152838383011115612b3457600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612b6257600080fd5b919050565b600060208284031215612b7957600080fd5b611a7882612b4b565b60008060408385031215612b9557600080fd5b612b9e83612b4b565b9150612bac60208401612b4b565b90509250929050565b600080600060608486031215612bca57600080fd5b612bd384612b4b565b9250612be160208501612b4b565b9150604084013590509250925092565b60008060008060808587031215612c0757600080fd5b612c1085612b4b565b9350612c1e60208601612b4b565b92506040850135915060608501356001600160401b03811115612c4057600080fd5b8501601f81018713612c5157600080fd5b612c6087823560208401612af4565b91505092959194509250565b60008060408385031215612c7f57600080fd5b612c8883612b4b565b915060208301358015158114612c9d57600080fd5b809150509250929050565b60008060408385031215612cbb57600080fd5b612cc483612b4b565b946020939093013593505050565b60008060208385031215612ce557600080fd5b82356001600160401b0380821115612cfc57600080fd5b818501915085601f830112612d1057600080fd5b813581811115612d1f57600080fd5b8660208260051b8501011115612d3457600080fd5b60209290920196919550909350505050565b600060208284031215612d5857600080fd5b5035919050565b600060208284031215612d7157600080fd5b8135611a788161317a565b600060208284031215612d8e57600080fd5b8151611a788161317a565b600060208284031215612dab57600080fd5b81356001600160401b03811115612dc157600080fd5b8201601f81018413612dd257600080fd5b61265c84823560208401612af4565b60008060408385031215612df457600080fd5b823591506020808401356001600160401b0380821115612e1357600080fd5b818601915086601f830112612e2757600080fd5b813581811115612e3957612e39613164565b8060051b9150612e4a848301612fcd565b8181528481019084860184860187018b1015612e6557600080fd5b600095505b83861015612e88578035835260019590950194918601918601612e6a565b508096505050505050509250929050565b60008151808452612eb181602086016020860161305f565b601f01601f19169290920160200192915050565b60008351612ed781846020880161305f565b835190830190612eeb81836020880161305f565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f3790830184612e99565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612f7957835183529284019291840191600101612f5d565b50909695505050505050565b602081526000611a786020830184612e99565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f191681016001600160401b0381118282101715612ff557612ff5613164565b604052919050565b6000821982111561301057613010613122565b500190565b60008261302457613024613138565b500490565b600081600019048311821515161561304357613043613122565b500290565b60008282101561305a5761305a613122565b500390565b60005b8381101561307a578181015183820152602001613062565b838111156110fb5750506000910152565b60008161309a5761309a613122565b506000190190565b600181811c908216806130b657607f821691505b602082108114156130d757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156130f1576130f1613122565b5060010190565b60008261310757613107613138565b500690565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461201657600080fdfe57686974656c697374206d6178207472616e73616374696f6e206d696e7420616d6f756e74206578636565644d6178207472616e73616374696f6e206d696e7420616d6f756e742065786365656441646472657373657320657863656564206d61726b6574696e6720737570706c79a264697066735822122096a4b54dd9ff03c08872ab04db0f6aa890bf21c2044ffb485912593e849d410f64736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000c5370616365205269646572730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000353505200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d523669354379566263716d71626468364462345875335a524762574a476e59437374473442385353676f79360000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Space Riders
Arg [1] : _symbol (string): SPR
Arg [2] : _initNotRevealedUri (string): ipfs://QmR6i5CyVbcqmqbdh6Db4Xu3ZRGbWJGnYCstG4B8SSgoy6

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [4] : 5370616365205269646572730000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 5350520000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [8] : 697066733a2f2f516d523669354379566263716d71626468364462345875335a
Arg [9] : 524762574a476e59437374473442385353676f79360000000000000000000000


Deployed Bytecode Sourcemap

50028:9491:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31507:355;;;;;;;;;;-1:-1:-1;31507:355:0;;;;;:::i;:::-;;:::i;:::-;;;9379:14:1;;9372:22;9354:41;;9342:2;9327:18;31507:355:0;;;;;;;;34974:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;36574:245::-;;;;;;;;;;-1:-1:-1;36574:245:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7165:32:1;;;7147:51;;7135:2;7120:18;36574:245:0;7001:203:1;50203:28:0;;;;;;;;;;;;;:::i;56124:122::-;;;;;;;;;;-1:-1:-1;56124:122:0;;;;;:::i;:::-;;:::i;:::-;;36137:371;;;;;;;;;;-1:-1:-1;36137:371:0;;;;;:::i;:::-;;:::i;50619:32::-;;;;;;;;;;;;;;;;;;;13253:25:1;;;13241:2;13226:18;50619:32:0;13107:177:1;55915:107:0;;;;;;;;;;-1:-1:-1;55915:107:0;;;;;:::i;:::-;;:::i;30756:303::-;;;;;;;;;;;;;:::i;50404:53::-;;;;;;;;;;;;50456:1;50404:53;;55738:169;;;;;;;;;;;;;:::i;50580:32::-;;;;;;;;;;;;;;;;37545:170;;;;;;;;;;-1:-1:-1;37545:170:0;;;;;:::i;:::-;;:::i;50356:41::-;;;;;;;;;;;;50393:4;50356:41;;57916:1006;;;:::i;37786:185::-;;;;;;;;;;-1:-1:-1;37786:185:0;;;;;:::i;:::-;;:::i;54454:945::-;;;;;;;;;;-1:-1:-1;54454:945:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;55407:116::-;;;;;;;;;;-1:-1:-1;55407:116:0;;;;;:::i;:::-;;:::i;56030:86::-;;;;;;;;;;-1:-1:-1;56030:86:0;;;;;:::i;:::-;;:::i;58930:139::-;;;;;;;;;;;;;:::i;50274:30::-;;;;;;;;;;-1:-1:-1;50274:30:0;;;;;;;;;;;56768:104;;;;;;;;;;-1:-1:-1;56768:104:0;;;;;:::i;:::-;;:::i;50658:36::-;;;;;;;;;;;;;;;;34783:124;;;;;;;;;;-1:-1:-1;34783:124:0;;;;;:::i;:::-;;:::i;50175:21::-;;;;;;;;;;;;;:::i;31926:206::-;;;;;;;;;;-1:-1:-1;31926:206:0;;;;;:::i;:::-;;:::i;7265:103::-;;;;;;;;;;;;;:::i;56880:1028::-;;;;;;:::i;:::-;;:::i;56536:90::-;;;;;;;;;;-1:-1:-1;56536:90:0;;;;;:::i;:::-;;:::i;6614:87::-;;;;;;;;;;-1:-1:-1;6687:6:0;;-1:-1:-1;;;;;6687:6:0;6614:87;;59077:102;;;;;;;;;;-1:-1:-1;59077:102:0;;;;;:::i;:::-;;:::i;35143:104::-;;;;;;;;;;;;;:::i;50311:36::-;;;;;;;;;;-1:-1:-1;50311:36:0;;;;;;;;;;;53652:280;;;;;;:::i;:::-;;:::i;36891:302::-;;;;;;;;;;-1:-1:-1;36891:302:0;;;;;:::i;:::-;;:::i;50240:27::-;;;;;;;;;;-1:-1:-1;50240:27:0;;;;;;;;50703:26;;;;;;;;;;-1:-1:-1;50703:26:0;;;;-1:-1:-1;;;;;50703:26:0;;;38042:406;;;;;;;;;;-1:-1:-1;38042:406:0;;;;;:::i;:::-;;:::i;52778:629::-;;;;;;;;;;-1:-1:-1;52778:629:0;;;;;:::i;:::-;;:::i;55621:109::-;;;;;;;;;;;;;:::i;56254:274::-;;;;;;;;;;-1:-1:-1;56254:274:0;;;;;:::i;:::-;;:::i;53940:506::-;;;;;;:::i;:::-;;:::i;37264:214::-;;;;;;;;;;-1:-1:-1;37264:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;37435:25:0;;;37406:4;37435:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;37264:214;56634:126;;;;;;;;;;-1:-1:-1;56634:126:0;;;;;:::i;:::-;;:::i;7523:238::-;;;;;;;;;;-1:-1:-1;7523:238:0;;;;;:::i;:::-;;:::i;55531:82::-;;;;;;;;;;;;;:::i;31507:355::-;31654:4;-1:-1:-1;;;;;;31696:40:0;;-1:-1:-1;;;31696:40:0;;:105;;-1:-1:-1;;;;;;;31753:48:0;;-1:-1:-1;;;31753:48:0;31696:105;:158;;;-1:-1:-1;;;;;;;;;;20051:40:0;;;31818:36;31676:178;31507:355;-1:-1:-1;;31507:355:0:o;34974:100::-;35028:13;35061:5;35054:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34974:100;:::o;36574:245::-;36678:7;36708:16;36716:7;36708;:16::i;:::-;36703:64;;36733:34;;-1:-1:-1;;;36733:34:0;;;;;;;;;;;36703:64;-1:-1:-1;36787:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;36787:24:0;;36574:245::o;50203:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56124:122::-;6687:6;;-1:-1:-1;;;;;6687:6:0;5397:10;6834:23;6826:68;;;;-1:-1:-1;;;6826:68:0;;;;;;;:::i;:::-;;;;;;;;;56205:13:::1;:33:::0;56124:122::o;36137:371::-;36210:13;36226:24;36242:7;36226:15;:24::i;:::-;36210:40;;36271:5;-1:-1:-1;;;;;36265:11:0;:2;-1:-1:-1;;;;;36265:11:0;;36261:48;;;36285:24;;-1:-1:-1;;;36285:24:0;;;;;;;;;;;36261:48;5397:10;-1:-1:-1;;;;;36326:21:0;;;;;;:63;;-1:-1:-1;36352:37:0;36369:5;5397:10;37264:214;:::i;36352:37::-;36351:38;36326:63;36322:138;;;36413:35;;-1:-1:-1;;;36413:35:0;;;;;;;;;;;36322:138;36472:28;36481:2;36485:7;36494:5;36472:8;:28::i;:::-;36199:309;36137:371;;:::o;55915:107::-;6687:6;;-1:-1:-1;;;;;6687:6:0;5397:10;6834:23;6826:68;;;;-1:-1:-1;;;6826:68:0;;;;;;;:::i;:::-;55982:9:::1;:32:::0;;-1:-1:-1;;;;;;55982:32:0::1;-1:-1:-1::0;;;;;55982:32:0;;;::::1;::::0;;;::::1;::::0;;55915:107::o;30756:303::-;52645:1;31010:12;30800:7;30994:13;:28;-1:-1:-1;;30994:46:0;;30756:303::o;55738:169::-;6687:6;;-1:-1:-1;;;;;6687:6:0;5397:10;6834:23;6826:68;;;;-1:-1:-1;;;6826:68:0;;;;;;;:::i;:::-;55799:10:::1;::::0;::::1;::::0;::::1;;;55794:70;;55843:1;55825:7;55819:21;;;;;:::i;:::-;;;:25;55811:53;;;::::0;-1:-1:-1;;;55811:53:0;;11212:2:1;55811:53:0::1;::::0;::::1;11194:21:1::0;11251:2;11231:18;;;11224:30;-1:-1:-1;;;11270:18:1;;;11263:45;11325:18;;55811:53:0::1;11010:339:1::0;55811:53:0::1;55889:10;::::0;;-1:-1:-1;;55875:24:0;::::1;55889:10;::::0;;;::::1;;;55888:11;55875:24:::0;;::::1;;::::0;;55738:169::o;37545:170::-;37679:28;37689:4;37695:2;37699:7;37679:9;:28::i;57916:1006::-;6687:6;;-1:-1:-1;;;;;6687:6:0;5397:10;6834:23;6826:68;;;;-1:-1:-1;;;6826:68:0;;;;;;;:::i;:::-;57990:21:::1;58030:11:::0;58022:46:::1;;;::::0;-1:-1:-1;;;58022:46:0;;12615:2:1;58022:46:0::1;::::0;::::1;12597:21:1::0;12654:2;12634:18;;;12627:30;-1:-1:-1;;;12673:18:1;;;12666:52;12735:18;;58022:46:0::1;12413:346:1::0;58022:46:0::1;58080:13;58107:42;58178:13;58188:3;58178:7:::0;:13:::1;:::i;:::-;58177:20;::::0;58195:2:::1;58177:20;:::i;:::-;58099:103;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;58079:123:0;;-1:-1:-1;58214:13:0::1;::::0;-1:-1:-1;58241:42:0::1;58312:13;58322:3;58312:7:::0;:13:::1;:::i;:::-;58311:20;::::0;58329:2:::1;58311:20;:::i;:::-;58233:103;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;58213:123:0;;-1:-1:-1;58348:13:0::1;::::0;-1:-1:-1;58375:42:0::1;58446:13;58456:3;58446:7:::0;:13:::1;:::i;:::-;58445:20;::::0;58463:2:::1;58445:20;:::i;:::-;58367:103;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;58347:123:0;;-1:-1:-1;58482:13:0::1;::::0;-1:-1:-1;58509:42:0::1;58580:13;58590:3;58580:7:::0;:13:::1;:::i;:::-;58579:19;::::0;58597:1:::1;58579:19;:::i;:::-;58501:102;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;58481:122:0;;-1:-1:-1;58615:13:0::1;::::0;-1:-1:-1;58642:42:0::1;58713:13;58723:3;58713:7:::0;:13:::1;:::i;:::-;58712:20;::::0;58730:2:::1;58712:20;:::i;:::-;58634:103;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58614:123;;;58770:8;:20;;;;;58782:8;58770:20;:32;;;;;58794:8;58770:32;:44;;;;;58806:8;58770:44;:56;;;;;58818:8;58770:56;58748:121;;;::::0;-1:-1:-1;;;58748:121:0;;10868:2:1;58748:121:0::1;::::0;::::1;10850:21:1::0;10907:2;10887:18;;;10880:30;-1:-1:-1;;;10926:18:1;;;10919:45;10981:18;;58748:121:0::1;10666:339:1::0;58748:121:0::1;58887:21;:26:::0;58880:34:::1;;;;:::i;:::-;57961:961;;;;;;57916:1006::o:0;37786:185::-;37924:39;37941:4;37947:2;37951:7;37924:39;;;;;;;;;;;;:16;:39::i;54454:945::-;54541:16;54575:23;54601:17;54611:6;54601:9;:17::i;:::-;54575:43;;54629:30;54676:15;-1:-1:-1;;;;;54662:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54662:30:0;-1:-1:-1;54629:63:0;-1:-1:-1;52645:1:0;54703:22;;54831:530;54870:15;54852;:33;:65;;;;;50393:4;54889:14;:28;;54852:65;54831:530;;;54944:31;54978:27;;;:11;:27;;;;;;;;;54944:61;;;;;;;;;-1:-1:-1;;;;;54944:61:0;;;;-1:-1:-1;;;54944:61:0;;-1:-1:-1;;;;;54944:61:0;;;;;;;;-1:-1:-1;;;54944:61:0;;;;;;;;;;;;;;;;55026:49;;-1:-1:-1;55047:14:0;;-1:-1:-1;;;;;55047:28:0;;;55026:49;55022:125;;;55117:14;;;-1:-1:-1;55022:125:0;55189:6;-1:-1:-1;;;;;55167:28:0;:18;-1:-1:-1;;;;;55167:28:0;;55163:154;;;55249:14;55216:13;55230:15;55216:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;55284:17;;;;:::i;:::-;;;;55163:154;55333:16;;;;:::i;:::-;;;;54929:432;54831:530;;;-1:-1:-1;55378:13:0;;54454:945;-1:-1:-1;;;;;54454:945:0:o;55407:116::-;55467:7;55494:21;55508:6;55494:13;:21::i;56030:86::-;6687:6;;-1:-1:-1;;;;;6687:6:0;5397:10;6834:23;6826:68;;;;-1:-1:-1;;;6826:68:0;;;;;;;:::i;:::-;56093:4:::1;:15:::0;56030:86::o;58930:139::-;58973:9;;:46;;-1:-1:-1;;;58973:46:0;;58996:10;58973:46;;;7421:34:1;58973:9:0;7471:18:1;;;7464:43;-1:-1:-1;;;;;58973:9:0;;;;:22;;7356:18:1;;58973:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59030:9:0;;:31;;-1:-1:-1;;;59030:31:0;;59050:10;59030:31;;;7147:51:1;-1:-1:-1;;;;;59030:9:0;;;;-1:-1:-1;59030:19:0;;-1:-1:-1;7120:18:1;;59030:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58930:139::o;56768:104::-;6687:6;;-1:-1:-1;;;;;6687:6:0;5397:10;6834:23;6826:68;;;;-1:-1:-1;;;6826:68:0;;;;;;;:::i;:::-;56843:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;56768:104:::0;:::o;34783:124::-;34847:7;34874:20;34886:7;34874:11;:20::i;:::-;:25;;34783:124;-1:-1:-1;;34783:124:0:o;50175:21::-;;;;;;;:::i;31926:206::-;31990:7;-1:-1:-1;;;;;32014:19:0;;32010:60;;32042:28;;-1:-1:-1;;;32042:28:0;;;;;;;;;;;32010:60;-1:-1:-1;;;;;;32096:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;32096:27:0;;31926:206::o;7265:103::-;6687:6;;-1:-1:-1;;;;;6687:6:0;5397:10;6834:23;6826:68;;;;-1:-1:-1;;;6826:68:0;;;;;;;:::i;:::-;7330:30:::1;7357:1;7330:18;:30::i;:::-;7265:103::o:0;56880:1028::-;6687:6;;-1:-1:-1;;;;;6687:6:0;5397:10;6834:23;6826:68;;;;-1:-1:-1;;;6826:68:0;;;;;;;:::i;:::-;57000:1:::1;56982:15;;:19;:72;;;;-1:-1:-1::0;57039:15:0::1;::::0;57022:32;::::1;;56982:72;:110;;;;-1:-1:-1::0;57075:17:0;;;56982:110:::1;:193;;;;-1:-1:-1::0;57159:15:0::1;::::0;57146:28:::1;::::0;50393:4:::1;57146:28;:::i;:::-;57130:6:::0;57114:13:::1;:11;:13::i;:::-;:29;;;;:::i;:::-;:60;56982:193;57190:15;::::0;:20;:448:::1;;57313:15;::::0;57297:31;::::1;:322;;57450:18:::0;;:142:::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;57450:142:0::1;;::::0;57190:448:::1;;57450:142;;;;;;;;;;;;;;;;;::::0;57190:448:::1;;57297:322;;;;;;;;;;;;;;;;;;57190:448;;;;;;;;;;;;;;;;-1:-1:-1::0;;;57190:448:0::1;;::::0;::::1;56960:689;;;;;-1:-1:-1::0;;;56960:689:0::1;;;;;;;;:::i;:::-;;57667:9;57662:239;57682:17:::0;;::::1;57662:239;;;57721:23;57731:6;;57738:1;57731:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;57742:1;57721:9;:23::i;:::-;57764:33;57784:6;;57791:1;57784:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;57764:33;::::0;;-1:-1:-1;;;;;8211:32:1;;;8193:51;;57795:1:0::1;8275:2:1::0;8260:18;;8253:34;8166:18;57764:33:0::1;;;;;;;57814:15;;57812:17;;;;;:::i;:::-;::::0;;;-1:-1:-1;57844:9:0::1;::::0;-1:-1:-1;;;;;57844:9:0::1;:22;:9;57879:6:::0;;57886:1;57879:9;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;57844:45;::::0;-1:-1:-1;;;;;;57844:45:0::1;::::0;;;;;;-1:-1:-1;;;;;7439:15:1;;;57844:45:0::1;::::0;::::1;7421:34:1::0;7491:15;;7471:18;;;7464:43;7356:18;;57844:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;57701:3;;;;;:::i;:::-;;;;57662:239;;56536:90:::0;6687:6;;-1:-1:-1;;;;;6687:6:0;5397:10;6834:23;6826:68;;;;-1:-1:-1;;;6826:68:0;;;;;;;:::i;:::-;56601:10:::1;:17:::0;56536:90::o;59077:102::-;59135:9;;:36;;-1:-1:-1;;;59135:36:0;;59151:10;59135:36;;;8193:51:1;8260:18;;;8253:34;;;-1:-1:-1;;;;;59135:9:0;;;;:15;;8166:18:1;;59135:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59077:102;:::o;35143:104::-;35199:13;35232:7;35225:14;;;;;:::i;53652:280::-;51102:8;;53744:11;;51102:8;;51101:9;;:34;;-1:-1:-1;6687:6:0;;-1:-1:-1;;;;;6687:6:0;51114:10;:21;51101:34;51100:72;;;;;51171:1;51157:11;:15;51100:72;:128;;;;;50572:1;51194:11;:33;;51100:128;:208;;;;-1:-1:-1;51293:15:0;;51280:28;;50393:4;51280:28;:::i;:::-;51265:11;51249:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:59;;51100:208;51323:8;;;;:428;;51410:16;;:322;;50572:1;51542:11;:32;:163;;;;;;;;;;;;;;;-1:-1:-1;;;51542:163:0;;;51323:428;;51542:163;;;;;;;;;;;;;;;;;;51323:428;;51410:322;;;;;;;;;;;;;;;;;;51323:428;;;;;;;;;;;;;;;;-1:-1:-1;;;51323:428:0;;;;51078:684;;;;;-1:-1:-1;;;51078:684:0;;;;;;;;:::i;:::-;-1:-1:-1;51777:17:0;;;;;;;:25;;51798:4;51777:25;51773:618;;;50519:1;51845:11;:43;;:157;;;;;50456:1;51941:11;51913:25;51927:10;51913:13;:25::i;:::-;:39;;;;:::i;:::-;:89;;51845:157;50519:1;52021:11;:42;:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51819:387;;;;;-1:-1:-1;;;51819:387:0;;;;;;;;:::i;:::-;;51773:618;;;52308:13;;52293:11;52265:25;52279:10;52265:13;:25::i;:::-;:39;;;;:::i;:::-;:56;;52239:140;;;;-1:-1:-1;;;52239:140:0;;11903:2:1;52239:140:0;;;11885:21:1;11942:2;11922:18;;;11915:30;-1:-1:-1;;;11961:18:1;;;11954:52;12023:18;;52239:140:0;11701:346:1;52239:140:0;52443:11;52436:4;;:18;;;;:::i;:::-;52423:9;:31;;:56;;;-1:-1:-1;6687:6:0;;-1:-1:-1;;;;;6687:6:0;52458:10;:21;52423:56;52401:124;;;;-1:-1:-1;;;52401:124:0;;11556:2:1;52401:124:0;;;11538:21:1;11595:2;11575:18;;;11568:30;-1:-1:-1;;;11614:18:1;;;11607:48;11672:18;;52401:124:0;11354:342:1;52401:124:0;53795:17:::1;::::0;;;::::1;;;:26;::::0;:51:::1;;-1:-1:-1::0;6687:6:0;;-1:-1:-1;;;;;6687:6:0;53825:10:::1;:21;53795:51;53773:115;;;::::0;-1:-1:-1;;;53773:115:0;;12966:2:1;53773:115:0::1;::::0;::::1;12948:21:1::0;13005:2;12985:18;;;12978:30;-1:-1:-1;;;13024:18:1;;;13017:44;13078:18;;53773:115:0::1;12764:338:1::0;53773:115:0::1;53899:25;53912:11;53899:12;:25::i;36891:302::-:0;-1:-1:-1;;;;;37005:24:0;;5397:10;37005:24;37001:54;;;37038:17;;-1:-1:-1;;;37038:17:0;;;;;;;;;;;37001:54;5397:10;37068:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;37068:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;37068:53:0;;;;;;;;;;37137:48;;9354:41:1;;;37068:42:0;;5397:10;37137:48;;9327:18:1;37137:48:0;;;;;;;36891:302;;:::o;38042:406::-;38209:28;38219:4;38225:2;38229:7;38209:9;:28::i;:::-;-1:-1:-1;;;;;38266:13:0;;9645:19;:23;;38266:89;;;;;38299:56;38330:4;38336:2;38340:7;38349:5;38299:30;:56::i;:::-;38298:57;38266:89;38248:193;;;38389:40;;-1:-1:-1;;;38389:40:0;;;;;;;;;;;52778:629;52896:13;52935:16;52943:7;52935;:16::i;:::-;52927:25;;;;;;52967:10;;;;;;;52963:73;;53010:14;53003:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52778:629;;;:::o;52963:73::-;53046:28;53077:10;:8;:10::i;:::-;53046:41;;53149:1;53124:14;53118:28;:32;:281;;;;;;;;;;;;;;;;;53242:14;53283:18;:7;:16;:18::i;:::-;53199:159;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53118:281;53098:301;52778:629;-1:-1:-1;;;52778:629:0:o;55621:109::-;6687:6;;-1:-1:-1;;;;;6687:6:0;5397:10;6834:23;6826:68;;;;-1:-1:-1;;;6826:68:0;;;;;;;:::i;:::-;55705:17:::1;::::0;;-1:-1:-1;;55684:38:0;::::1;55705:17:::0;;;;::::1;;;55704:18;55684:38:::0;;::::1;;::::0;;55621:109::o;56254:274::-;6687:6;;-1:-1:-1;;;;;6687:6:0;5397:10;6834:23;6826:68;;;;-1:-1:-1;;;6826:68:0;;;;;;;:::i;:::-;56397:13:::1;:11;:13::i;:::-;56384:26;::::0;50393:4:::1;56384:26;:::i;:::-;56361:19;:49;;56339:133;;;::::0;-1:-1:-1;;;56339:133:0;;10058:2:1;56339:133:0::1;::::0;::::1;10040:21:1::0;10097:2;10077:18;;;10070:30;10136:34;10116:18;;;10109:62;-1:-1:-1;;;10187:18:1;;;10180:32;10229:19;;56339:133:0::1;9856:398:1::0;56339:133:0::1;56483:15;:37:::0;56254:274::o;53940:506::-;51102:8;;54063:11;;51102:8;;51101:9;;:34;;-1:-1:-1;6687:6:0;;-1:-1:-1;;;;;6687:6:0;51114:10;:21;51101:34;51100:72;;;;;51171:1;51157:11;:15;51100:72;:128;;;;;50572:1;51194:11;:33;;51100:128;:208;;;;-1:-1:-1;51293:15:0;;51280:28;;50393:4;51280:28;:::i;:::-;51265:11;51249:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:59;;51100:208;51323:8;;;;:428;;51410:16;;:322;;50572:1;51542:11;:32;:163;;;;;;;;;;;;;;;-1:-1:-1;;;51542:163:0;;;51323:428;;51542:163;;;;;;;;;;;;;;;;;;51323:428;;51410:322;;;;;;;;;;;;;;;;;;51323:428;;;;;;;;;;;;;;;;-1:-1:-1;;;51323:428:0;;;;51078:684;;;;;-1:-1:-1;;;51078:684:0;;;;;;;;:::i;:::-;-1:-1:-1;51777:17:0;;;;;;;:25;;51798:4;51777:25;51773:618;;;50519:1;51845:11;:43;;:157;;;;;50456:1;51941:11;51913:25;51927:10;51913:13;:25::i;:::-;:39;;;;:::i;:::-;:89;;51845:157;50519:1;52021:11;:42;:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51819:387;;;;;-1:-1:-1;;;51819:387:0;;;;;;;;:::i;:::-;;51773:618;;;52308:13;;52293:11;52265:25;52279:10;52265:13;:25::i;:::-;:39;;;;:::i;:::-;:56;;52239:140;;;;-1:-1:-1;;;52239:140:0;;11903:2:1;52239:140:0;;;11885:21:1;11942:2;11922:18;;;11915:30;-1:-1:-1;;;11961:18:1;;;11954:52;12023:18;;52239:140:0;11701:346:1;52239:140:0;52443:11;52436:4;;:18;;;;:::i;:::-;52423:9;:31;;:56;;;-1:-1:-1;6687:6:0;;-1:-1:-1;;;;;6687:6:0;52458:10;:21;52423:56;52401:124;;;;-1:-1:-1;;;52401:124:0;;11556:2:1;52401:124:0;;;11538:21:1;11595:2;11575:18;;;11568:30;-1:-1:-1;;;11614:18:1;;;11607:48;11672:18;;52401:124:0;11354:342:1;52401:124:0;54115:17:::1;::::0;;;::::1;;;:25;;54136:4;54115:25;:172:::0;::::1;;;-1:-1:-1::0;54196:10:0::1;::::0;54239:28:::1;::::0;-1:-1:-1;;54256:10:0::1;6064:2:1::0;6060:15;6056:53;54239:28:0::1;::::0;::::1;6044:66:1::0;54161:126:0::1;::::0;54196:10;6126:12:1;;54239:28:0::1;;;;;;;;;;;;54229:39;;;;;;54161:5;:12;;:126;;;;;:::i;:::-;54114:199;;;-1:-1:-1::0;6687:6:0;;-1:-1:-1;;;;;6687:6:0;54292:10:::1;:21;54114:199;54329:17;::::0;;;::::1;;;54328:18;:63;;;;;;;;;;;;;;;-1:-1:-1::0;;;54328:63:0::1;;::::0;::::1;;;;;;;;;;;;;;;;-1:-1:-1::0;;;54328:63:0::1;;::::0;::::1;54092:310;;;;;-1:-1:-1::0;;;54092:310:0::1;;;;;;;;:::i;:::-;;54413:25;54426:11;54413:12;:25::i;56634:126::-:0;6687:6;;-1:-1:-1;;;;;6687:6:0;5397:10;6834:23;6826:68;;;;-1:-1:-1;;;6826:68:0;;;;;;;:::i;:::-;56720:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;7523:238::-:0;6687:6;;-1:-1:-1;;;;;6687:6:0;5397:10;6834:23;6826:68;;;;-1:-1:-1;;;6826:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7626:22:0;::::1;7604:110;;;::::0;-1:-1:-1;;;7604:110:0;;10461:2:1;7604:110:0::1;::::0;::::1;10443:21:1::0;10500:2;10480:18;;;10473:30;10539:34;10519:18;;;10512:62;-1:-1:-1;;;10590:18:1;;;10583:36;10636:19;;7604:110:0::1;10259:402:1::0;7604:110:0::1;7725:28;7744:8;7725:18;:28::i;:::-;7523:238:::0;:::o;55531:82::-;6687:6;;-1:-1:-1;;;;;6687:6:0;5397:10;6834:23;6826:68;;;;-1:-1:-1;;;6826:68:0;;;;;;;:::i;:::-;55597:8:::1;::::0;;-1:-1:-1;;55585:20:0;::::1;55597:8;::::0;;::::1;55596:9;55585:20;::::0;;55531:82::o;38703:213::-;38760:4;38816:7;52645:1;38797:26;;:66;;;;;38850:13;;38840:7;:23;38797:66;:111;;;;-1:-1:-1;;38881:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;38881:27:0;;;;38880:28;;38703:213::o;46583:196::-;46698:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;46698:29:0;-1:-1:-1;;;;;46698:29:0;;;;;;;;;46743:28;;46698:24;;46743:28;;;;;;;46583:196;;;:::o;42033:2138::-;42148:35;42186:20;42198:7;42186:11;:20::i;:::-;42261:18;;42148:58;;-1:-1:-1;42219:22:0;;-1:-1:-1;;;;;42245:34:0;5397:10;-1:-1:-1;;;;;42245:34:0;;:101;;;-1:-1:-1;42313:18:0;;42296:50;;5397:10;37264:214;:::i;42296:50::-;42245:154;;;-1:-1:-1;5397:10:0;42363:20;42375:7;42363:11;:20::i;:::-;-1:-1:-1;;;;;42363:36:0;;42245:154;42219:181;;42418:17;42413:66;;42444:35;;-1:-1:-1;;;42444:35:0;;;;;;;;;;;42413:66;42516:4;-1:-1:-1;;;;;42494:26:0;:13;:18;;;-1:-1:-1;;;;;42494:26:0;;42490:67;;42529:28;;-1:-1:-1;;;42529:28:0;;;;;;;;;;;42490:67;-1:-1:-1;;;;;42572:16:0;;42568:52;;42597:23;;-1:-1:-1;;;42597:23:0;;;;;;;;;;;42568:52;42633:43;42655:4;42661:2;42665:7;42674:1;42633:21;:43::i;:::-;42741:49;42758:1;42762:7;42771:13;:18;;;42741:8;:49::i;:::-;-1:-1:-1;;;;;43086:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;43086:31:0;;;-1:-1:-1;;;;;43086:31:0;;;-1:-1:-1;;43086:31:0;;;;;;;43132:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;43132:29:0;;;;;;;;;;;43178:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;43223:61:0;;;;-1:-1:-1;;;43268:15:0;43223:61;;;;;;;;;;;43558:11;;;43588:24;;;;;:29;43558:11;;43588:29;43584:471;;43813:13;;43799:11;:27;43795:245;;;43883:18;;;43851:24;;;:11;:24;;;;;;;;:50;;43966:54;;;;-1:-1:-1;;;;;43924:96:0;-1:-1:-1;;;43924:96:0;-1:-1:-1;;;;;;43924:96:0;;;-1:-1:-1;;;;;43851:50:0;;;43924:96;;;;;;;43795:245;43061:1005;44102:7;44098:2;-1:-1:-1;;;;;44083:27:0;44092:4;-1:-1:-1;;;;;44083:27:0;;;;;;;;;;;44121:42;58930:139;32214:207;32275:7;-1:-1:-1;;;;;32299:19:0;;32295:59;;32327:27;;-1:-1:-1;;;32327:27:0;;;;;;;;;;;32295:59;-1:-1:-1;;;;;;32380:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;32380:32:0;;-1:-1:-1;;;;;32380:32:0;;32214:207::o;33581:1140::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;33723:7:0;;52645:1;33772:23;;:47;;;;;33806:13;;33799:4;:20;33772:47;33768:886;;;33840:31;33874:17;;;:11;:17;;;;;;;;;33840:51;;;;;;;;;-1:-1:-1;;;;;33840:51:0;;;;-1:-1:-1;;;33840:51:0;;-1:-1:-1;;;;;33840:51:0;;;;;;;;-1:-1:-1;;;33840:51:0;;;;;;;;;;;;;;33910:729;;33960:14;;-1:-1:-1;;;;;33960:28:0;;33956:101;;34024:9;33581:1140;-1:-1:-1;;;33581:1140:0:o;33956:101::-;-1:-1:-1;;;34399:6:0;34444:17;;;;:11;:17;;;;;;;;;34432:29;;;;;;;;;-1:-1:-1;;;;;34432:29:0;;;;;-1:-1:-1;;;34432:29:0;;-1:-1:-1;;;;;34432:29:0;;;;;;;;-1:-1:-1;;;34432:29:0;;;;;;;;;;;;;34492:28;34488:109;;34560:9;33581:1140;-1:-1:-1;;;33581:1140:0:o;34488:109::-;34359:261;;;33821:833;33768:886;34682:31;;-1:-1:-1;;;34682:31:0;;;;;;;;;;;7921:191;8014:6;;;-1:-1:-1;;;;;8031:17:0;;;-1:-1:-1;;;;;;8031:17:0;;;;;;;8064:40;;8014:6;;;8031:17;8014:6;;8064:40;;7995:16;;8064:40;7984:128;7921:191;:::o;38924:104::-;38993:27;39003:2;39007:8;38993:27;;;;;;;;;;;;:9;:27::i;53415:229::-;53478:34;53488:10;53500:11;53478:9;:34::i;:::-;53528:44;;;53548:10;8193:51:1;;8275:2;8260:18;;8253:34;;;53528:44:0;;8166:18:1;53528:44:0;;;;;;;53583:9;;:53;;-1:-1:-1;;;53583:53:0;;53612:10;53583:53;;;8193:51:1;8260:18;;;8253:34;;;-1:-1:-1;;;;;53583:9:0;;;;:28;;8166:18:1;;53583:53:0;8011:282:1;47271:772:0;47468:155;;-1:-1:-1;;;47468:155:0;;47434:4;;-1:-1:-1;;;;;47468:36:0;;;;;:155;;5397:10;;47554:4;;47577:7;;47603:5;;47468:155;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47468:155:0;;;;;;;;-1:-1:-1;;47468:155:0;;;;;;;;;;;;:::i;:::-;;;47451:585;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47794:13:0;;47790:235;;47840:40;;-1:-1:-1;;;47840:40:0;;;;;;;;;;;47790:235;47983:6;47977:13;47968:6;47964:2;47960:15;47953:38;47451:585;-1:-1:-1;;;;;;47679:55:0;-1:-1:-1;;;47679:55:0;;-1:-1:-1;47451:585:0;47271:772;;;;;;:::o;52662:108::-;52722:13;52755:7;52748:14;;;;;:::i;2849:723::-;2905:13;3126:10;3122:53;;-1:-1:-1;;3153:10:0;;;;;;;;;;;;-1:-1:-1;;;3153:10:0;;;;;2849:723::o;3122:53::-;3200:5;3185:12;3241:78;3248:9;;3241:78;;3274:8;;;;:::i;:::-;;-1:-1:-1;3297:10:0;;-1:-1:-1;3305:2:0;3297:10;;:::i;:::-;;;3241:78;;;3329:19;3361:6;-1:-1:-1;;;;;3351:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3351:17:0;;3329:39;;3379:154;3386:10;;3379:154;;3413:11;3423:1;3413:11;;:::i;:::-;;-1:-1:-1;3482:10:0;3490:2;3482:5;:10;:::i;:::-;3469:24;;:2;:24;:::i;:::-;3456:39;;3439:6;3446;3439:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;3439:56:0;;;;;;;;-1:-1:-1;3510:11:0;3519:2;3510:11;;:::i;:::-;;;3379:154;;956:190;1081:4;1134;1105:25;1118:5;1125:4;1105:12;:25::i;:::-;:33;;956:190;-1:-1:-1;;;;956:190:0:o;59187:329::-;-1:-1:-1;;;;;59430:18:0;;;59426:83;;59465:9;;:32;;-1:-1:-1;;;59465:32:0;;-1:-1:-1;;;;;7439:15:1;;;59465:32:0;;;7421:34:1;7491:15;;;7471:18;;;7464:43;59465:9:0;;;;:22;;7356:18:1;;59465:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59187:329;;;;:::o;39391:163::-;39514:32;39520:2;39524:8;39534:5;39541:4;39514:5;:32::i;1508:707::-;1618:7;1666:4;1618:7;1681:497;1705:5;:12;1701:1;:16;1681:497;;;1739:20;1762:5;1768:1;1762:8;;;;;;;;:::i;:::-;;;;;;;1739:31;;1805:12;1789;:28;1785:382;;2318:13;2373:15;;;2409:4;2402:15;;;2456:4;2440:21;;1917:57;;1785:382;;;2318:13;2373:15;;;2409:4;2402:15;;;2456:4;2440:21;;2094:57;;1785:382;-1:-1:-1;1719:3:0;;;;:::i;:::-;;;;1681:497;;;-1:-1:-1;2195:12:0;1508:707;-1:-1:-1;;;1508:707:0:o;39813:1966::-;39952:20;39975:13;-1:-1:-1;;;;;40003:16:0;;39999:48;;40028:19;;-1:-1:-1;;;40028:19:0;;;;;;;;;;;39999:48;40062:13;40058:44;;40084:18;;-1:-1:-1;;;40084:18:0;;;;;;;;;;;40058:44;40115:61;40145:1;40149:2;40153:12;40167:8;40115:21;:61::i;:::-;-1:-1:-1;;;;;40453:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;40512:49:0;;-1:-1:-1;;;;;40453:44:0;;;;;;;40512:49;;;-1:-1:-1;;;;;40453:44:0;;;;;;40512:49;;;;;;;;;;;;;;;;40578:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;40628:66:0;;;;-1:-1:-1;;;40678:15:0;40628:66;;;;;;;;;;40578:25;40775:23;;;40819:4;:23;;;;-1:-1:-1;;;;;;40827:13:0;;9645:19;:23;;40827:15;40815:832;;;40863:505;40894:38;;40919:12;;-1:-1:-1;;;;;40894:38:0;;;40911:1;;40894:38;;40911:1;;40894:38;40986:212;41055:1;41088:2;41121:14;;;;;;41166:5;40986:30;:212::i;:::-;40955:365;;41256:40;;-1:-1:-1;;;41256:40:0;;;;;;;;;;;40955:365;41363:3;41347:12;:19;;40863:505;;41449:12;41432:13;;:29;41428:43;;41463:8;;;41428:43;40815:832;;;41512:120;41543:40;;41568:14;;;;;-1:-1:-1;;;;;41543:40:0;;;41560:1;;41543:40;;41560:1;;41543:40;41627:3;41611:12;:19;;41512:120;;40815:832;-1:-1:-1;41661:13:0;:28;41711:60;58930:139;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:186::-;662:6;715:2;703:9;694:7;690:23;686:32;683:52;;;731:1;728;721:12;683:52;754:29;773:9;754:29;:::i;794:260::-;862:6;870;923:2;911:9;902:7;898:23;894:32;891:52;;;939:1;936;929:12;891:52;962:29;981:9;962:29;:::i;:::-;952:39;;1010:38;1044:2;1033:9;1029:18;1010:38;:::i;:::-;1000:48;;794:260;;;;;:::o;1059:328::-;1136:6;1144;1152;1205:2;1193:9;1184:7;1180:23;1176:32;1173:52;;;1221:1;1218;1211:12;1173:52;1244:29;1263:9;1244:29;:::i;:::-;1234:39;;1292:38;1326:2;1315:9;1311:18;1292:38;:::i;:::-;1282:48;;1377:2;1366:9;1362:18;1349:32;1339:42;;1059:328;;;;;:::o;1392:666::-;1487:6;1495;1503;1511;1564:3;1552:9;1543:7;1539:23;1535:33;1532:53;;;1581:1;1578;1571:12;1532:53;1604:29;1623:9;1604:29;:::i;:::-;1594:39;;1652:38;1686:2;1675:9;1671:18;1652:38;:::i;:::-;1642:48;;1737:2;1726:9;1722:18;1709:32;1699:42;;1792:2;1781:9;1777:18;1764:32;-1:-1:-1;;;;;1811:6:1;1808:30;1805:50;;;1851:1;1848;1841:12;1805:50;1874:22;;1927:4;1919:13;;1915:27;-1:-1:-1;1905:55:1;;1956:1;1953;1946:12;1905:55;1979:73;2044:7;2039:2;2026:16;2021:2;2017;2013:11;1979:73;:::i;:::-;1969:83;;;1392:666;;;;;;;:::o;2063:347::-;2128:6;2136;2189:2;2177:9;2168:7;2164:23;2160:32;2157:52;;;2205:1;2202;2195:12;2157:52;2228:29;2247:9;2228:29;:::i;:::-;2218:39;;2307:2;2296:9;2292:18;2279:32;2354:5;2347:13;2340:21;2333:5;2330:32;2320:60;;2376:1;2373;2366:12;2320:60;2399:5;2389:15;;;2063:347;;;;;:::o;2415:254::-;2483:6;2491;2544:2;2532:9;2523:7;2519:23;2515:32;2512:52;;;2560:1;2557;2550:12;2512:52;2583:29;2602:9;2583:29;:::i;:::-;2573:39;2659:2;2644:18;;;;2631:32;;-1:-1:-1;;;2415:254:1:o;2674:615::-;2760:6;2768;2821:2;2809:9;2800:7;2796:23;2792:32;2789:52;;;2837:1;2834;2827:12;2789:52;2877:9;2864:23;-1:-1:-1;;;;;2947:2:1;2939:6;2936:14;2933:34;;;2963:1;2960;2953:12;2933:34;3001:6;2990:9;2986:22;2976:32;;3046:7;3039:4;3035:2;3031:13;3027:27;3017:55;;3068:1;3065;3058:12;3017:55;3108:2;3095:16;3134:2;3126:6;3123:14;3120:34;;;3150:1;3147;3140:12;3120:34;3203:7;3198:2;3188:6;3185:1;3181:14;3177:2;3173:23;3169:32;3166:45;3163:65;;;3224:1;3221;3214:12;3163:65;3255:2;3247:11;;;;;3277:6;;-1:-1:-1;2674:615:1;;-1:-1:-1;;;;2674:615:1:o;3294:180::-;3353:6;3406:2;3394:9;3385:7;3381:23;3377:32;3374:52;;;3422:1;3419;3412:12;3374:52;-1:-1:-1;3445:23:1;;3294:180;-1:-1:-1;3294:180:1:o;3479:245::-;3537:6;3590:2;3578:9;3569:7;3565:23;3561:32;3558:52;;;3606:1;3603;3596:12;3558:52;3645:9;3632:23;3664:30;3688:5;3664:30;:::i;3729:249::-;3798:6;3851:2;3839:9;3830:7;3826:23;3822:32;3819:52;;;3867:1;3864;3857:12;3819:52;3899:9;3893:16;3918:30;3942:5;3918:30;:::i;3983:450::-;4052:6;4105:2;4093:9;4084:7;4080:23;4076:32;4073:52;;;4121:1;4118;4111:12;4073:52;4161:9;4148:23;-1:-1:-1;;;;;4186:6:1;4183:30;4180:50;;;4226:1;4223;4216:12;4180:50;4249:22;;4302:4;4294:13;;4290:27;-1:-1:-1;4280:55:1;;4331:1;4328;4321:12;4280:55;4354:73;4419:7;4414:2;4401:16;4396:2;4392;4388:11;4354:73;:::i;4623:1025::-;4716:6;4724;4777:2;4765:9;4756:7;4752:23;4748:32;4745:52;;;4793:1;4790;4783:12;4745:52;4829:9;4816:23;4806:33;;4858:2;4911;4900:9;4896:18;4883:32;-1:-1:-1;;;;;4975:2:1;4967:6;4964:14;4961:34;;;4991:1;4988;4981:12;4961:34;5029:6;5018:9;5014:22;5004:32;;5074:7;5067:4;5063:2;5059:13;5055:27;5045:55;;5096:1;5093;5086:12;5045:55;5132:2;5119:16;5154:2;5150;5147:10;5144:36;;;5160:18;;:::i;:::-;5206:2;5203:1;5199:10;5189:20;;5229:28;5253:2;5249;5245:11;5229:28;:::i;:::-;5291:15;;;5322:12;;;;5354:11;;;5384;;;5380:20;;5377:33;-1:-1:-1;5374:53:1;;;5423:1;5420;5413:12;5374:53;5445:1;5436:10;;5455:163;5469:2;5466:1;5463:9;5455:163;;;5526:17;;5514:30;;5487:1;5480:9;;;;;5564:12;;;;5596;;5455:163;;;5459:3;5637:5;5627:15;;;;;;;;4623:1025;;;;;:::o;5653:257::-;5694:3;5732:5;5726:12;5759:6;5754:3;5747:19;5775:63;5831:6;5824:4;5819:3;5815:14;5808:4;5801:5;5797:16;5775:63;:::i;:::-;5892:2;5871:15;-1:-1:-1;;5867:29:1;5858:39;;;;5899:4;5854:50;;5653:257;-1:-1:-1;;5653:257:1:o;6149:637::-;6429:3;6467:6;6461:13;6483:53;6529:6;6524:3;6517:4;6509:6;6505:17;6483:53;:::i;:::-;6599:13;;6558:16;;;;6621:57;6599:13;6558:16;6655:4;6643:17;;6621:57;:::i;:::-;-1:-1:-1;;;6700:20:1;;6729:22;;;6778:1;6767:13;;6149:637;-1:-1:-1;;;;6149:637:1:o;7518:488::-;-1:-1:-1;;;;;7787:15:1;;;7769:34;;7839:15;;7834:2;7819:18;;7812:43;7886:2;7871:18;;7864:34;;;7934:3;7929:2;7914:18;;7907:31;;;7712:4;;7955:45;;7980:19;;7972:6;7955:45;:::i;:::-;7947:53;7518:488;-1:-1:-1;;;;;;7518:488:1:o;8577:632::-;8748:2;8800:21;;;8870:13;;8773:18;;;8892:22;;;8719:4;;8748:2;8971:15;;;;8945:2;8930:18;;;8719:4;9014:169;9028:6;9025:1;9022:13;9014:169;;;9089:13;;9077:26;;9158:15;;;;9123:12;;;;9050:1;9043:9;9014:169;;;-1:-1:-1;9200:3:1;;8577:632;-1:-1:-1;;;;;;8577:632:1:o;9632:219::-;9781:2;9770:9;9763:21;9744:4;9801:44;9841:2;9830:9;9826:18;9818:6;9801:44;:::i;12052:356::-;12254:2;12236:21;;;12273:18;;;12266:30;12332:34;12327:2;12312:18;;12305:62;12399:2;12384:18;;12052:356::o;13289:275::-;13360:2;13354:9;13425:2;13406:13;;-1:-1:-1;;13402:27:1;13390:40;;-1:-1:-1;;;;;13445:34:1;;13481:22;;;13442:62;13439:88;;;13507:18;;:::i;:::-;13543:2;13536:22;13289:275;;-1:-1:-1;13289:275:1:o;13569:128::-;13609:3;13640:1;13636:6;13633:1;13630:13;13627:39;;;13646:18;;:::i;:::-;-1:-1:-1;13682:9:1;;13569:128::o;13702:120::-;13742:1;13768;13758:35;;13773:18;;:::i;:::-;-1:-1:-1;13807:9:1;;13702:120::o;13827:168::-;13867:7;13933:1;13929;13925:6;13921:14;13918:1;13915:21;13910:1;13903:9;13896:17;13892:45;13889:71;;;13940:18;;:::i;:::-;-1:-1:-1;13980:9:1;;13827:168::o;14000:125::-;14040:4;14068:1;14065;14062:8;14059:34;;;14073:18;;:::i;:::-;-1:-1:-1;14110:9:1;;14000:125::o;14130:258::-;14202:1;14212:113;14226:6;14223:1;14220:13;14212:113;;;14302:11;;;14296:18;14283:11;;;14276:39;14248:2;14241:10;14212:113;;;14343:6;14340:1;14337:13;14334:48;;;-1:-1:-1;;14378:1:1;14360:16;;14353:27;14130:258::o;14393:136::-;14432:3;14460:5;14450:39;;14469:18;;:::i;:::-;-1:-1:-1;;;14505:18:1;;14393:136::o;14534:380::-;14613:1;14609:12;;;;14656;;;14677:61;;14731:4;14723:6;14719:17;14709:27;;14677:61;14784:2;14776:6;14773:14;14753:18;14750:38;14747:161;;;14830:10;14825:3;14821:20;14818:1;14811:31;14865:4;14862:1;14855:15;14893:4;14890:1;14883:15;14747:161;;14534:380;;;:::o;14919:135::-;14958:3;-1:-1:-1;;14979:17:1;;14976:43;;;14999:18;;:::i;:::-;-1:-1:-1;15046:1:1;15035:13;;14919:135::o;15059:112::-;15091:1;15117;15107:35;;15122:18;;:::i;:::-;-1:-1:-1;15156:9:1;;15059:112::o;15176:127::-;15237:10;15232:3;15228:20;15225:1;15218:31;15268:4;15265:1;15258:15;15292:4;15289:1;15282:15;15308:127;15369:10;15364:3;15360:20;15357:1;15350:31;15400:4;15397:1;15390:15;15424:4;15421:1;15414:15;15440:127;15501:10;15496:3;15492:20;15489:1;15482:31;15532:4;15529:1;15522:15;15556:4;15553:1;15546:15;15572:127;15633:10;15628:3;15624:20;15621:1;15614:31;15664:4;15661:1;15654:15;15688:4;15685:1;15678:15;15704:127;15765:10;15760:3;15756:20;15753:1;15746:31;15796:4;15793:1;15786:15;15820:4;15817:1;15810:15;15836:131;-1:-1:-1;;;;;;15910:32:1;;15900:43;;15890:71;;15957:1;15954;15947:12

Swarm Source

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