ETH Price: $2,621.92 (+7.47%)
 

Overview

Max Total Supply

2,727 ASTRAL

Holders

2,052

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 ASTRAL
0xddfed351f4cd6fcedf60be1e9f68edccd8735b5e
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
AstralFrens

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-10
*/

// SPDX-License-Identifier: MIT

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////&&&&&&&&&&////////////////////////&&&&&&&&&&////////////////////////////////////////////////
//////////////////////&&&&&&&&&&&&&&////////////////////&&&&&&&&&&&&&&//////////////////////////////////////////////
//////////////////////&OOOOO&&&&&&&&////////////////////&OOOOO&&&&&&&&//////////////////////////////////////////////
//////////////////////&OOOOO&&&&&&&&////////////////////&OOOOO&&&&&&&&//////////////////////////////////////////////
//////////////////////&OOOOO&&&&&&&&////////////////////&OOOOO&&&&&&&&//////////////////////////////////////////////
//////////////////////&OOOOO&&&&&&&&////////////////////&OOOOO&&&&&&&&//////////////////////////////////////////////
//////////////////////&&&&&&&&&&&&&&////////////////////&&&&&&&&&&&&&&//////////////////////////////////////////////
//////////////////////&&&&&&&&&&&&&&////////////////////&&&&&&&&&&&&&&//////////////////////////////////////////////
//////////////////////&&&&&&&&&&&&&&////////////////////&&&&&&&&&&&&&&//////////////////////////////////////////////
//////////////////////&&&&&&&&&&&&&&////////////////////&&&&&&&&&&&&&&//////////////////////////////////////////////
////////////////////////&&&&&&&&&&////////////////////////&&&&&&&&&&////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


// 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/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// 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: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

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

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

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

    // ==============================
    //            IERC721
    // ==============================

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

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

    // ==============================
    //        IERC721Metadata
    // ==============================

    /**
     * @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: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @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 IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;
    
    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

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

    // The number of tokens burned.
    uint256 private _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 `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count. 
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev 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 Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

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

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

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

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> BITPOS_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 {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // 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.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * 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) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

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

    /**
     * @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, _toString(tokenId))) : '';
    }

    /**
     * @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 Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

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

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

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), 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.code.length != 0)
            if (!_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 && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

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

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

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

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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 {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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 {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

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

    /**
     * @dev 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 ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__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 {}

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), 
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length, 
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for { 
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp { 
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } { // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }
            
            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

pragma solidity ^0.8.2;

contract AstralFrens is ERC721A, Ownable, ReentrancyGuard {

    using Strings for uint256;

    string public _astralUri;

    bool public is_dreaming = false;

    uint256 public astral_frens = 5555;
    uint256 public free_per_wallet = 1; 
    uint256 public per_wallet = 5;
    uint256 public price = 0.03 ether;

    mapping(address => uint256) public wallet_balance;
   
	constructor() ERC721A("AstralFrens", "ASTRAL") {}

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

 	function walkInDream(uint256 frens) public payable {
        uint256 cost = price * frens;
  	    uint256 total = totalSupply();
        require(is_dreaming);
        require(frens <= per_wallet, "Cannot Mint That Many");
        require(wallet_balance[msg.sender] < per_wallet, "Max per Wallet Reached");
        require(total + frens <= astral_frens);

        if(wallet_balance[msg.sender] < free_per_wallet) {
                uint256 quantity = frens - free_per_wallet;
                cost = price * quantity;
        }

        require(msg.value >= cost, "Not enough supply.");

        _safeMint(msg.sender, frens);
        wallet_balance[msg.sender] += frens;
    }

    //Functions for Lucid Dreaming Gurus

    function startDreaming(bool _state) external onlyOwner {
        is_dreaming = _state;
    }

    function setFreeFrens(uint256 _freeFrens) external onlyOwner {
        free_per_wallet = _freeFrens;
    }

    function setPerWallet(uint256 _maxPerWallet) external onlyOwner {
        per_wallet = _maxPerWallet;
    }

    function setAstralUri(string memory uri) external onlyOwner {
        _astralUri = uri;
    }

 	function makeFrenWalkInDream(address astral_fren, uint256 _frens) public onlyOwner {
  	    uint256 total = totalSupply();
	    require(total + _frens <= astral_frens);
        _safeMint(astral_fren, _frens);
    }

    function wakeUp(uint256 _amount) public onlyOwner {
        uint256 balance = address(this).balance;
        require(_amount <= balance);
        payable(msg.sender).transfer(_amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_astralUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"astral_frens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"free_per_wallet","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":"is_dreaming","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"astral_fren","type":"address"},{"internalType":"uint256","name":"_frens","type":"uint256"}],"name":"makeFrenWalkInDream","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"per_wallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setAstralUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_freeFrens","type":"uint256"}],"name":"setFreeFrens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerWallet","type":"uint256"}],"name":"setPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"startDreaming","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"uint256","name":"_amount","type":"uint256"}],"name":"wakeUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"frens","type":"uint256"}],"name":"walkInDream","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wallet_balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040526000600b60006101000a81548160ff0219169083151502179055506115b3600c556001600d556005600e55666a94d74f430000600f553480156200004757600080fd5b506040518060400160405280600b81526020017f41737472616c4672656e730000000000000000000000000000000000000000008152506040518060400160405280600681526020017f41535452414c00000000000000000000000000000000000000000000000000008152508160029080519060200190620000cc929190620001ff565b508060039080519060200190620000e5929190620001ff565b50620000f66200012c60201b60201c565b60008190555050506200011e620001126200013160201b60201c565b6200013960201b60201c565b600160098190555062000314565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020d90620002af565b90600052602060002090601f0160209004810192826200023157600085556200027d565b82601f106200024c57805160ff19168380011785556200027d565b828001600101855582156200027d579182015b828111156200027c5782518255916020019190600101906200025f565b5b5090506200028c919062000290565b5090565b5b80821115620002ab57600081600090555060010162000291565b5090565b60006002820490506001821680620002c857607f821691505b60208210811415620002df57620002de620002e5565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612f6980620003246000396000f3fe6080604052600436106101d85760003560e01c8063738f99e611610102578063b7294bc011610095578063cf00b56311610064578063cf00b56314610689578063e985e9c5146106b2578063f0b1292a146106ef578063f2fde38b1461072c576101d8565b8063b7294bc0146105cf578063b88d4fde146105f8578063c51f82a314610621578063c87b56dd1461064c576101d8565b806395d89b41116100d157806395d89b41146105275780639e6d65a414610552578063a035b1fe1461057b578063a22cb465146105a6576101d8565b8063738f99e61461048c57806380b63e7e146104b75780638cb68071146104e05780638da5cb5b146104fc576101d8565b806342842e0e1161017a578063608aadc811610149578063608aadc8146103d05780636352211e146103fb57806370a0823114610438578063715018a614610475576101d8565b806342842e0e1461032857806350ea70c21461035157806353ab6e561461037c578063586f1489146103a7576101d8565b8063095ea7b3116101b6578063095ea7b3146102825780631112b323146102ab57806318160ddd146102d457806323b872dd146102ff576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612699565b610755565b6040516102119190612973565b60405180910390f35b34801561022657600080fd5b5061022f6107e7565b60405161023c919061298e565b60405180910390f35b34801561025157600080fd5b5061026c6004803603810190610267919061273c565b610879565b604051610279919061290c565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a4919061262c565b6108f5565b005b3480156102b757600080fd5b506102d260048036038101906102cd919061266c565b610a9c565b005b3480156102e057600080fd5b506102e9610b35565b6040516102f69190612a50565b60405180910390f35b34801561030b57600080fd5b5061032660048036038101906103219190612516565b610b4c565b005b34801561033457600080fd5b5061034f600480360381019061034a9190612516565b610b5c565b005b34801561035d57600080fd5b50610366610b7c565b6040516103739190612a50565b60405180910390f35b34801561038857600080fd5b50610391610b82565b60405161039e919061298e565b60405180910390f35b3480156103b357600080fd5b506103ce60048036038101906103c9919061262c565b610c10565b005b3480156103dc57600080fd5b506103e5610cc1565b6040516103f29190612a50565b60405180910390f35b34801561040757600080fd5b50610422600480360381019061041d919061273c565b610cc7565b60405161042f919061290c565b60405180910390f35b34801561044457600080fd5b5061045f600480360381019061045a91906124a9565b610cd9565b60405161046c9190612a50565b60405180910390f35b34801561048157600080fd5b5061048a610d92565b005b34801561049857600080fd5b506104a1610e1a565b6040516104ae9190612973565b60405180910390f35b3480156104c357600080fd5b506104de60048036038101906104d9919061273c565b610e2d565b005b6104fa60048036038101906104f5919061273c565b610f06565b005b34801561050857600080fd5b50610511611134565b60405161051e919061290c565b60405180910390f35b34801561053357600080fd5b5061053c61115e565b604051610549919061298e565b60405180910390f35b34801561055e57600080fd5b50610579600480360381019061057491906126f3565b6111f0565b005b34801561058757600080fd5b50610590611286565b60405161059d9190612a50565b60405180910390f35b3480156105b257600080fd5b506105cd60048036038101906105c891906125ec565b61128c565b005b3480156105db57600080fd5b506105f660048036038101906105f1919061273c565b611404565b005b34801561060457600080fd5b5061061f600480360381019061061a9190612569565b61148a565b005b34801561062d57600080fd5b506106366114fd565b6040516106439190612a50565b60405180910390f35b34801561065857600080fd5b50610673600480360381019061066e919061273c565b611503565b604051610680919061298e565b60405180910390f35b34801561069557600080fd5b506106b060048036038101906106ab919061273c565b6115a2565b005b3480156106be57600080fd5b506106d960048036038101906106d491906124d6565b611628565b6040516106e69190612973565b60405180910390f35b3480156106fb57600080fd5b50610716600480360381019061071191906124a9565b6116bc565b6040516107239190612a50565b60405180910390f35b34801561073857600080fd5b50610753600480360381019061074e91906124a9565b6116d4565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107b057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107e05750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546107f690612ccf565b80601f016020809104026020016040519081016040528092919081815260200182805461082290612ccf565b801561086f5780601f106108445761010080835404028352916020019161086f565b820191906000526020600020905b81548152906001019060200180831161085257829003601f168201915b5050505050905090565b6000610884826117cc565b6108ba576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109008261182b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610968576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109876118f9565b73ffffffffffffffffffffffffffffffffffffffff16146109ea576109b3816109ae6118f9565b611628565b6109e9576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610aa4611901565b73ffffffffffffffffffffffffffffffffffffffff16610ac2611134565b73ffffffffffffffffffffffffffffffffffffffff1614610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90612a10565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b6000610b3f611909565b6001546000540303905090565b610b5783838361190e565b505050565b610b778383836040518060200160405280600081525061148a565b505050565b600d5481565b600a8054610b8f90612ccf565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbb90612ccf565b8015610c085780601f10610bdd57610100808354040283529160200191610c08565b820191906000526020600020905b815481529060010190602001808311610beb57829003601f168201915b505050505081565b610c18611901565b73ffffffffffffffffffffffffffffffffffffffff16610c36611134565b73ffffffffffffffffffffffffffffffffffffffff1614610c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8390612a10565b60405180910390fd5b6000610c96610b35565b9050600c548282610ca79190612b35565b1115610cb257600080fd5b610cbc8383611cb8565b505050565b600e5481565b6000610cd28261182b565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d41576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610d9a611901565b73ffffffffffffffffffffffffffffffffffffffff16610db8611134565b73ffffffffffffffffffffffffffffffffffffffff1614610e0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0590612a10565b60405180910390fd5b610e186000611cd6565b565b600b60009054906101000a900460ff1681565b610e35611901565b73ffffffffffffffffffffffffffffffffffffffff16610e53611134565b73ffffffffffffffffffffffffffffffffffffffff1614610ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea090612a10565b60405180910390fd5b600047905080821115610ebb57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610f01573d6000803e3d6000fd5b505050565b600081600f54610f169190612b8b565b90506000610f22610b35565b9050600b60009054906101000a900460ff16610f3d57600080fd5b600e54831115610f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f79906129d0565b60405180910390fd5b600e54601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611005576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffc906129f0565b60405180910390fd5b600c5483826110149190612b35565b111561101f57600080fd5b600d54601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561108c576000600d54846110789190612be5565b905080600f546110889190612b8b565b9250505b813410156110cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c690612a30565b60405180910390fd5b6110d93384611cb8565b82601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111289190612b35565b92505081905550505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461116d90612ccf565b80601f016020809104026020016040519081016040528092919081815260200182805461119990612ccf565b80156111e65780601f106111bb576101008083540402835291602001916111e6565b820191906000526020600020905b8154815290600101906020018083116111c957829003601f168201915b5050505050905090565b6111f8611901565b73ffffffffffffffffffffffffffffffffffffffff16611216611134565b73ffffffffffffffffffffffffffffffffffffffff161461126c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126390612a10565b60405180910390fd5b80600a90805190602001906112829291906122bd565b5050565b600f5481565b6112946118f9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112f9576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006113066118f9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113b36118f9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113f89190612973565b60405180910390a35050565b61140c611901565b73ffffffffffffffffffffffffffffffffffffffff1661142a611134565b73ffffffffffffffffffffffffffffffffffffffff1614611480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147790612a10565b60405180910390fd5b80600d8190555050565b61149584848461190e565b60008373ffffffffffffffffffffffffffffffffffffffff163b146114f7576114c084848484611d9c565b6114f6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600c5481565b606061150e826117cc565b611544576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061154e611efc565b905060008151141561156f576040518060200160405280600081525061159a565b8061157984611f8e565b60405160200161158a9291906128e8565b6040516020818303038152906040525b915050919050565b6115aa611901565b73ffffffffffffffffffffffffffffffffffffffff166115c8611134565b73ffffffffffffffffffffffffffffffffffffffff161461161e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161590612a10565b60405180910390fd5b80600e8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60106020528060005260406000206000915090505481565b6116dc611901565b73ffffffffffffffffffffffffffffffffffffffff166116fa611134565b73ffffffffffffffffffffffffffffffffffffffff1614611750576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174790612a10565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b7906129b0565b60405180910390fd5b6117c981611cd6565b50565b6000816117d7611909565b111580156117e6575060005482105b8015611824575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000808290508061183a611909565b116118c2576000548110156118c15760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156118bf575b60008114156118b557600460008360019003935083815260200190815260200160002054905061188a565b80925050506118f4565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b600090565b60006119198261182b565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611980576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166119a16118f9565b73ffffffffffffffffffffffffffffffffffffffff1614806119d057506119cf856119ca6118f9565b611628565b5b80611a1557506119de6118f9565b73ffffffffffffffffffffffffffffffffffffffff166119fd84610879565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611a4e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ab5576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ac28585856001611fe8565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611bbf86611fee565b1717600460008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415611c49576000600184019050600060046000838152602001908152602001600020541415611c47576000548114611c46578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611cb18585856001611ff8565b5050505050565b611cd2828260405180602001604052806000815250611ffe565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611dc26118f9565b8786866040518563ffffffff1660e01b8152600401611de49493929190612927565b602060405180830381600087803b158015611dfe57600080fd5b505af1925050508015611e2f57506040513d601f19601f82011682018060405250810190611e2c91906126c6565b60015b611ea9573d8060008114611e5f576040519150601f19603f3d011682016040523d82523d6000602084013e611e64565b606091505b50600081511415611ea1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a8054611f0b90612ccf565b80601f0160208091040260200160405190810160405280929190818152602001828054611f3790612ccf565b8015611f845780601f10611f5957610100808354040283529160200191611f84565b820191906000526020600020905b815481529060010190602001808311611f6757829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015611fd457600183039250600a81066030018353600a81049050611fb4565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561206b576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156120a6576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120b36000858386611fe8565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612118600185146122b3565b901b60a042901b61212886611fee565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b1461222c575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121dc6000878480600101955087611d9c565b612212576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061216d57826000541461222757600080fd5b612297565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061222d575b8160008190555050506122ad6000858386611ff8565b50505050565b6000819050919050565b8280546122c990612ccf565b90600052602060002090601f0160209004810192826122eb5760008555612332565b82601f1061230457805160ff1916838001178555612332565b82800160010185558215612332579182015b82811115612331578251825591602001919060010190612316565b5b50905061233f9190612343565b5090565b5b8082111561235c576000816000905550600101612344565b5090565b600061237361236e84612a90565b612a6b565b90508281526020810184848401111561238f5761238e612dc4565b5b61239a848285612c8d565b509392505050565b60006123b56123b084612ac1565b612a6b565b9050828152602081018484840111156123d1576123d0612dc4565b5b6123dc848285612c8d565b509392505050565b6000813590506123f381612ed7565b92915050565b60008135905061240881612eee565b92915050565b60008135905061241d81612f05565b92915050565b60008151905061243281612f05565b92915050565b600082601f83011261244d5761244c612dbf565b5b813561245d848260208601612360565b91505092915050565b600082601f83011261247b5761247a612dbf565b5b813561248b8482602086016123a2565b91505092915050565b6000813590506124a381612f1c565b92915050565b6000602082840312156124bf576124be612dce565b5b60006124cd848285016123e4565b91505092915050565b600080604083850312156124ed576124ec612dce565b5b60006124fb858286016123e4565b925050602061250c858286016123e4565b9150509250929050565b60008060006060848603121561252f5761252e612dce565b5b600061253d868287016123e4565b935050602061254e868287016123e4565b925050604061255f86828701612494565b9150509250925092565b6000806000806080858703121561258357612582612dce565b5b6000612591878288016123e4565b94505060206125a2878288016123e4565b93505060406125b387828801612494565b925050606085013567ffffffffffffffff8111156125d4576125d3612dc9565b5b6125e087828801612438565b91505092959194509250565b6000806040838503121561260357612602612dce565b5b6000612611858286016123e4565b9250506020612622858286016123f9565b9150509250929050565b6000806040838503121561264357612642612dce565b5b6000612651858286016123e4565b925050602061266285828601612494565b9150509250929050565b60006020828403121561268257612681612dce565b5b6000612690848285016123f9565b91505092915050565b6000602082840312156126af576126ae612dce565b5b60006126bd8482850161240e565b91505092915050565b6000602082840312156126dc576126db612dce565b5b60006126ea84828501612423565b91505092915050565b60006020828403121561270957612708612dce565b5b600082013567ffffffffffffffff81111561272757612726612dc9565b5b61273384828501612466565b91505092915050565b60006020828403121561275257612751612dce565b5b600061276084828501612494565b91505092915050565b61277281612c19565b82525050565b61278181612c2b565b82525050565b600061279282612af2565b61279c8185612b08565b93506127ac818560208601612c9c565b6127b581612dd3565b840191505092915050565b60006127cb82612afd565b6127d58185612b19565b93506127e5818560208601612c9c565b6127ee81612dd3565b840191505092915050565b600061280482612afd565b61280e8185612b2a565b935061281e818560208601612c9c565b80840191505092915050565b6000612837602683612b19565b915061284282612de4565b604082019050919050565b600061285a601583612b19565b915061286582612e33565b602082019050919050565b600061287d601683612b19565b915061288882612e5c565b602082019050919050565b60006128a0602083612b19565b91506128ab82612e85565b602082019050919050565b60006128c3601283612b19565b91506128ce82612eae565b602082019050919050565b6128e281612c83565b82525050565b60006128f482856127f9565b915061290082846127f9565b91508190509392505050565b60006020820190506129216000830184612769565b92915050565b600060808201905061293c6000830187612769565b6129496020830186612769565b61295660408301856128d9565b81810360608301526129688184612787565b905095945050505050565b60006020820190506129886000830184612778565b92915050565b600060208201905081810360008301526129a881846127c0565b905092915050565b600060208201905081810360008301526129c98161282a565b9050919050565b600060208201905081810360008301526129e98161284d565b9050919050565b60006020820190508181036000830152612a0981612870565b9050919050565b60006020820190508181036000830152612a2981612893565b9050919050565b60006020820190508181036000830152612a49816128b6565b9050919050565b6000602082019050612a6560008301846128d9565b92915050565b6000612a75612a86565b9050612a818282612d01565b919050565b6000604051905090565b600067ffffffffffffffff821115612aab57612aaa612d90565b5b612ab482612dd3565b9050602081019050919050565b600067ffffffffffffffff821115612adc57612adb612d90565b5b612ae582612dd3565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612b4082612c83565b9150612b4b83612c83565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612b8057612b7f612d32565b5b828201905092915050565b6000612b9682612c83565b9150612ba183612c83565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612bda57612bd9612d32565b5b828202905092915050565b6000612bf082612c83565b9150612bfb83612c83565b925082821015612c0e57612c0d612d32565b5b828203905092915050565b6000612c2482612c63565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612cba578082015181840152602081019050612c9f565b83811115612cc9576000848401525b50505050565b60006002820490506001821680612ce757607f821691505b60208210811415612cfb57612cfa612d61565b5b50919050565b612d0a82612dd3565b810181811067ffffffffffffffff82111715612d2957612d28612d90565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74204d696e742054686174204d616e790000000000000000000000600082015250565b7f4d6178207065722057616c6c6574205265616368656400000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f7420656e6f75676820737570706c792e0000000000000000000000000000600082015250565b612ee081612c19565b8114612eeb57600080fd5b50565b612ef781612c2b565b8114612f0257600080fd5b50565b612f0e81612c37565b8114612f1957600080fd5b50565b612f2581612c83565b8114612f3057600080fd5b5056fea26469706673582212206d6f8193751bfd42f0c2b8590e3497a914788280d11be79627d3cdf4f6623ca164736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101d85760003560e01c8063738f99e611610102578063b7294bc011610095578063cf00b56311610064578063cf00b56314610689578063e985e9c5146106b2578063f0b1292a146106ef578063f2fde38b1461072c576101d8565b8063b7294bc0146105cf578063b88d4fde146105f8578063c51f82a314610621578063c87b56dd1461064c576101d8565b806395d89b41116100d157806395d89b41146105275780639e6d65a414610552578063a035b1fe1461057b578063a22cb465146105a6576101d8565b8063738f99e61461048c57806380b63e7e146104b75780638cb68071146104e05780638da5cb5b146104fc576101d8565b806342842e0e1161017a578063608aadc811610149578063608aadc8146103d05780636352211e146103fb57806370a0823114610438578063715018a614610475576101d8565b806342842e0e1461032857806350ea70c21461035157806353ab6e561461037c578063586f1489146103a7576101d8565b8063095ea7b3116101b6578063095ea7b3146102825780631112b323146102ab57806318160ddd146102d457806323b872dd146102ff576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612699565b610755565b6040516102119190612973565b60405180910390f35b34801561022657600080fd5b5061022f6107e7565b60405161023c919061298e565b60405180910390f35b34801561025157600080fd5b5061026c6004803603810190610267919061273c565b610879565b604051610279919061290c565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a4919061262c565b6108f5565b005b3480156102b757600080fd5b506102d260048036038101906102cd919061266c565b610a9c565b005b3480156102e057600080fd5b506102e9610b35565b6040516102f69190612a50565b60405180910390f35b34801561030b57600080fd5b5061032660048036038101906103219190612516565b610b4c565b005b34801561033457600080fd5b5061034f600480360381019061034a9190612516565b610b5c565b005b34801561035d57600080fd5b50610366610b7c565b6040516103739190612a50565b60405180910390f35b34801561038857600080fd5b50610391610b82565b60405161039e919061298e565b60405180910390f35b3480156103b357600080fd5b506103ce60048036038101906103c9919061262c565b610c10565b005b3480156103dc57600080fd5b506103e5610cc1565b6040516103f29190612a50565b60405180910390f35b34801561040757600080fd5b50610422600480360381019061041d919061273c565b610cc7565b60405161042f919061290c565b60405180910390f35b34801561044457600080fd5b5061045f600480360381019061045a91906124a9565b610cd9565b60405161046c9190612a50565b60405180910390f35b34801561048157600080fd5b5061048a610d92565b005b34801561049857600080fd5b506104a1610e1a565b6040516104ae9190612973565b60405180910390f35b3480156104c357600080fd5b506104de60048036038101906104d9919061273c565b610e2d565b005b6104fa60048036038101906104f5919061273c565b610f06565b005b34801561050857600080fd5b50610511611134565b60405161051e919061290c565b60405180910390f35b34801561053357600080fd5b5061053c61115e565b604051610549919061298e565b60405180910390f35b34801561055e57600080fd5b50610579600480360381019061057491906126f3565b6111f0565b005b34801561058757600080fd5b50610590611286565b60405161059d9190612a50565b60405180910390f35b3480156105b257600080fd5b506105cd60048036038101906105c891906125ec565b61128c565b005b3480156105db57600080fd5b506105f660048036038101906105f1919061273c565b611404565b005b34801561060457600080fd5b5061061f600480360381019061061a9190612569565b61148a565b005b34801561062d57600080fd5b506106366114fd565b6040516106439190612a50565b60405180910390f35b34801561065857600080fd5b50610673600480360381019061066e919061273c565b611503565b604051610680919061298e565b60405180910390f35b34801561069557600080fd5b506106b060048036038101906106ab919061273c565b6115a2565b005b3480156106be57600080fd5b506106d960048036038101906106d491906124d6565b611628565b6040516106e69190612973565b60405180910390f35b3480156106fb57600080fd5b50610716600480360381019061071191906124a9565b6116bc565b6040516107239190612a50565b60405180910390f35b34801561073857600080fd5b50610753600480360381019061074e91906124a9565b6116d4565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107b057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107e05750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546107f690612ccf565b80601f016020809104026020016040519081016040528092919081815260200182805461082290612ccf565b801561086f5780601f106108445761010080835404028352916020019161086f565b820191906000526020600020905b81548152906001019060200180831161085257829003601f168201915b5050505050905090565b6000610884826117cc565b6108ba576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109008261182b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610968576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109876118f9565b73ffffffffffffffffffffffffffffffffffffffff16146109ea576109b3816109ae6118f9565b611628565b6109e9576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610aa4611901565b73ffffffffffffffffffffffffffffffffffffffff16610ac2611134565b73ffffffffffffffffffffffffffffffffffffffff1614610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90612a10565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b6000610b3f611909565b6001546000540303905090565b610b5783838361190e565b505050565b610b778383836040518060200160405280600081525061148a565b505050565b600d5481565b600a8054610b8f90612ccf565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbb90612ccf565b8015610c085780601f10610bdd57610100808354040283529160200191610c08565b820191906000526020600020905b815481529060010190602001808311610beb57829003601f168201915b505050505081565b610c18611901565b73ffffffffffffffffffffffffffffffffffffffff16610c36611134565b73ffffffffffffffffffffffffffffffffffffffff1614610c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8390612a10565b60405180910390fd5b6000610c96610b35565b9050600c548282610ca79190612b35565b1115610cb257600080fd5b610cbc8383611cb8565b505050565b600e5481565b6000610cd28261182b565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d41576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610d9a611901565b73ffffffffffffffffffffffffffffffffffffffff16610db8611134565b73ffffffffffffffffffffffffffffffffffffffff1614610e0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0590612a10565b60405180910390fd5b610e186000611cd6565b565b600b60009054906101000a900460ff1681565b610e35611901565b73ffffffffffffffffffffffffffffffffffffffff16610e53611134565b73ffffffffffffffffffffffffffffffffffffffff1614610ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea090612a10565b60405180910390fd5b600047905080821115610ebb57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610f01573d6000803e3d6000fd5b505050565b600081600f54610f169190612b8b565b90506000610f22610b35565b9050600b60009054906101000a900460ff16610f3d57600080fd5b600e54831115610f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f79906129d0565b60405180910390fd5b600e54601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611005576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffc906129f0565b60405180910390fd5b600c5483826110149190612b35565b111561101f57600080fd5b600d54601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561108c576000600d54846110789190612be5565b905080600f546110889190612b8b565b9250505b813410156110cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c690612a30565b60405180910390fd5b6110d93384611cb8565b82601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111289190612b35565b92505081905550505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461116d90612ccf565b80601f016020809104026020016040519081016040528092919081815260200182805461119990612ccf565b80156111e65780601f106111bb576101008083540402835291602001916111e6565b820191906000526020600020905b8154815290600101906020018083116111c957829003601f168201915b5050505050905090565b6111f8611901565b73ffffffffffffffffffffffffffffffffffffffff16611216611134565b73ffffffffffffffffffffffffffffffffffffffff161461126c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126390612a10565b60405180910390fd5b80600a90805190602001906112829291906122bd565b5050565b600f5481565b6112946118f9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112f9576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006113066118f9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113b36118f9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113f89190612973565b60405180910390a35050565b61140c611901565b73ffffffffffffffffffffffffffffffffffffffff1661142a611134565b73ffffffffffffffffffffffffffffffffffffffff1614611480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147790612a10565b60405180910390fd5b80600d8190555050565b61149584848461190e565b60008373ffffffffffffffffffffffffffffffffffffffff163b146114f7576114c084848484611d9c565b6114f6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600c5481565b606061150e826117cc565b611544576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061154e611efc565b905060008151141561156f576040518060200160405280600081525061159a565b8061157984611f8e565b60405160200161158a9291906128e8565b6040516020818303038152906040525b915050919050565b6115aa611901565b73ffffffffffffffffffffffffffffffffffffffff166115c8611134565b73ffffffffffffffffffffffffffffffffffffffff161461161e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161590612a10565b60405180910390fd5b80600e8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60106020528060005260406000206000915090505481565b6116dc611901565b73ffffffffffffffffffffffffffffffffffffffff166116fa611134565b73ffffffffffffffffffffffffffffffffffffffff1614611750576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174790612a10565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b7906129b0565b60405180910390fd5b6117c981611cd6565b50565b6000816117d7611909565b111580156117e6575060005482105b8015611824575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000808290508061183a611909565b116118c2576000548110156118c15760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156118bf575b60008114156118b557600460008360019003935083815260200190815260200160002054905061188a565b80925050506118f4565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b600090565b60006119198261182b565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611980576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166119a16118f9565b73ffffffffffffffffffffffffffffffffffffffff1614806119d057506119cf856119ca6118f9565b611628565b5b80611a1557506119de6118f9565b73ffffffffffffffffffffffffffffffffffffffff166119fd84610879565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611a4e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ab5576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ac28585856001611fe8565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611bbf86611fee565b1717600460008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415611c49576000600184019050600060046000838152602001908152602001600020541415611c47576000548114611c46578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611cb18585856001611ff8565b5050505050565b611cd2828260405180602001604052806000815250611ffe565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611dc26118f9565b8786866040518563ffffffff1660e01b8152600401611de49493929190612927565b602060405180830381600087803b158015611dfe57600080fd5b505af1925050508015611e2f57506040513d601f19601f82011682018060405250810190611e2c91906126c6565b60015b611ea9573d8060008114611e5f576040519150601f19603f3d011682016040523d82523d6000602084013e611e64565b606091505b50600081511415611ea1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a8054611f0b90612ccf565b80601f0160208091040260200160405190810160405280929190818152602001828054611f3790612ccf565b8015611f845780601f10611f5957610100808354040283529160200191611f84565b820191906000526020600020905b815481529060010190602001808311611f6757829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015611fd457600183039250600a81066030018353600a81049050611fb4565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561206b576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156120a6576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120b36000858386611fe8565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612118600185146122b3565b901b60a042901b61212886611fee565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b1461222c575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121dc6000878480600101955087611d9c565b612212576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061216d57826000541461222757600080fd5b612297565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061222d575b8160008190555050506122ad6000858386611ff8565b50505050565b6000819050919050565b8280546122c990612ccf565b90600052602060002090601f0160209004810192826122eb5760008555612332565b82601f1061230457805160ff1916838001178555612332565b82800160010185558215612332579182015b82811115612331578251825591602001919060010190612316565b5b50905061233f9190612343565b5090565b5b8082111561235c576000816000905550600101612344565b5090565b600061237361236e84612a90565b612a6b565b90508281526020810184848401111561238f5761238e612dc4565b5b61239a848285612c8d565b509392505050565b60006123b56123b084612ac1565b612a6b565b9050828152602081018484840111156123d1576123d0612dc4565b5b6123dc848285612c8d565b509392505050565b6000813590506123f381612ed7565b92915050565b60008135905061240881612eee565b92915050565b60008135905061241d81612f05565b92915050565b60008151905061243281612f05565b92915050565b600082601f83011261244d5761244c612dbf565b5b813561245d848260208601612360565b91505092915050565b600082601f83011261247b5761247a612dbf565b5b813561248b8482602086016123a2565b91505092915050565b6000813590506124a381612f1c565b92915050565b6000602082840312156124bf576124be612dce565b5b60006124cd848285016123e4565b91505092915050565b600080604083850312156124ed576124ec612dce565b5b60006124fb858286016123e4565b925050602061250c858286016123e4565b9150509250929050565b60008060006060848603121561252f5761252e612dce565b5b600061253d868287016123e4565b935050602061254e868287016123e4565b925050604061255f86828701612494565b9150509250925092565b6000806000806080858703121561258357612582612dce565b5b6000612591878288016123e4565b94505060206125a2878288016123e4565b93505060406125b387828801612494565b925050606085013567ffffffffffffffff8111156125d4576125d3612dc9565b5b6125e087828801612438565b91505092959194509250565b6000806040838503121561260357612602612dce565b5b6000612611858286016123e4565b9250506020612622858286016123f9565b9150509250929050565b6000806040838503121561264357612642612dce565b5b6000612651858286016123e4565b925050602061266285828601612494565b9150509250929050565b60006020828403121561268257612681612dce565b5b6000612690848285016123f9565b91505092915050565b6000602082840312156126af576126ae612dce565b5b60006126bd8482850161240e565b91505092915050565b6000602082840312156126dc576126db612dce565b5b60006126ea84828501612423565b91505092915050565b60006020828403121561270957612708612dce565b5b600082013567ffffffffffffffff81111561272757612726612dc9565b5b61273384828501612466565b91505092915050565b60006020828403121561275257612751612dce565b5b600061276084828501612494565b91505092915050565b61277281612c19565b82525050565b61278181612c2b565b82525050565b600061279282612af2565b61279c8185612b08565b93506127ac818560208601612c9c565b6127b581612dd3565b840191505092915050565b60006127cb82612afd565b6127d58185612b19565b93506127e5818560208601612c9c565b6127ee81612dd3565b840191505092915050565b600061280482612afd565b61280e8185612b2a565b935061281e818560208601612c9c565b80840191505092915050565b6000612837602683612b19565b915061284282612de4565b604082019050919050565b600061285a601583612b19565b915061286582612e33565b602082019050919050565b600061287d601683612b19565b915061288882612e5c565b602082019050919050565b60006128a0602083612b19565b91506128ab82612e85565b602082019050919050565b60006128c3601283612b19565b91506128ce82612eae565b602082019050919050565b6128e281612c83565b82525050565b60006128f482856127f9565b915061290082846127f9565b91508190509392505050565b60006020820190506129216000830184612769565b92915050565b600060808201905061293c6000830187612769565b6129496020830186612769565b61295660408301856128d9565b81810360608301526129688184612787565b905095945050505050565b60006020820190506129886000830184612778565b92915050565b600060208201905081810360008301526129a881846127c0565b905092915050565b600060208201905081810360008301526129c98161282a565b9050919050565b600060208201905081810360008301526129e98161284d565b9050919050565b60006020820190508181036000830152612a0981612870565b9050919050565b60006020820190508181036000830152612a2981612893565b9050919050565b60006020820190508181036000830152612a49816128b6565b9050919050565b6000602082019050612a6560008301846128d9565b92915050565b6000612a75612a86565b9050612a818282612d01565b919050565b6000604051905090565b600067ffffffffffffffff821115612aab57612aaa612d90565b5b612ab482612dd3565b9050602081019050919050565b600067ffffffffffffffff821115612adc57612adb612d90565b5b612ae582612dd3565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612b4082612c83565b9150612b4b83612c83565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612b8057612b7f612d32565b5b828201905092915050565b6000612b9682612c83565b9150612ba183612c83565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612bda57612bd9612d32565b5b828202905092915050565b6000612bf082612c83565b9150612bfb83612c83565b925082821015612c0e57612c0d612d32565b5b828203905092915050565b6000612c2482612c63565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612cba578082015181840152602081019050612c9f565b83811115612cc9576000848401525b50505050565b60006002820490506001821680612ce757607f821691505b60208210811415612cfb57612cfa612d61565b5b50919050565b612d0a82612dd3565b810181811067ffffffffffffffff82111715612d2957612d28612d90565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74204d696e742054686174204d616e790000000000000000000000600082015250565b7f4d6178207065722057616c6c6574205265616368656400000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f7420656e6f75676820737570706c792e0000000000000000000000000000600082015250565b612ee081612c19565b8114612eeb57600080fd5b50565b612ef781612c2b565b8114612f0257600080fd5b50565b612f0e81612c37565b8114612f1957600080fd5b50565b612f2581612c83565b8114612f3057600080fd5b5056fea26469706673582212206d6f8193751bfd42f0c2b8590e3497a914788280d11be79627d3cdf4f6623ca164736f6c63430008070033

Deployed Bytecode Sourcemap

48489:2168:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23188:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28201:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30269:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29729:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49798:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22242:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31155:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31396:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48704:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48590:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50234:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48746:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27990:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23867:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9298:103;;;;;;;;;;;;;:::i;:::-;;48623:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50460:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49056:690;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8647:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28370:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50133:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48782:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30545:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49900:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31652:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48663:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28545:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50016:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30924:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48824:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9556:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23188:615;23273:4;23588:10;23573:25;;:11;:25;;;;:102;;;;23665:10;23650:25;;:11;:25;;;;23573:102;:179;;;;23742:10;23727:25;;:11;:25;;;;23573:179;23553:199;;23188:615;;;:::o;28201:100::-;28255:13;28288:5;28281:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28201:100;:::o;30269:204::-;30337:7;30362:16;30370:7;30362;:16::i;:::-;30357:64;;30387:34;;;;;;;;;;;;;;30357:64;30441:15;:24;30457:7;30441:24;;;;;;;;;;;;;;;;;;;;;30434:31;;30269:204;;;:::o;29729:474::-;29802:13;29834:27;29853:7;29834:18;:27::i;:::-;29802:61;;29884:5;29878:11;;:2;:11;;;29874:48;;;29898:24;;;;;;;;;;;;;;29874:48;29962:5;29939:28;;:19;:17;:19::i;:::-;:28;;;29935:175;;29987:44;30004:5;30011:19;:17;:19::i;:::-;29987:16;:44::i;:::-;29982:128;;30059:35;;;;;;;;;;;;;;29982:128;29935:175;30149:2;30122:15;:24;30138:7;30122:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30187:7;30183:2;30167:28;;30176:5;30167:28;;;;;;;;;;;;29791:412;29729:474;;:::o;49798:94::-;8878:12;:10;:12::i;:::-;8867:23;;:7;:5;:7::i;:::-;:23;;;8859:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49878:6:::1;49864:11;;:20;;;;;;;;;;;;;;;;;;49798:94:::0;:::o;22242:315::-;22295:7;22523:15;:13;:15::i;:::-;22508:12;;22492:13;;:28;:46;22485:53;;22242:315;:::o;31155:170::-;31289:28;31299:4;31305:2;31309:7;31289:9;:28::i;:::-;31155:170;;;:::o;31396:185::-;31534:39;31551:4;31557:2;31561:7;31534:39;;;;;;;;;;;;:16;:39::i;:::-;31396:185;;;:::o;48704:34::-;;;;:::o;48590:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50234:218::-;8878:12;:10;:12::i;:::-;8867:23;;:7;:5;:7::i;:::-;:23;;;8859:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50327:13:::1;50343;:11;:13::i;:::-;50327:29;;50390:12;;50380:6;50372:5;:14;;;;:::i;:::-;:30;;50364:39;;;::::0;::::1;;50414:30;50424:11;50437:6;50414:9;:30::i;:::-;50317:135;50234:218:::0;;:::o;48746:29::-;;;;:::o;27990:144::-;28054:7;28097:27;28116:7;28097:18;:27::i;:::-;28074:52;;27990:144;;;:::o;23867:224::-;23931:7;23972:1;23955:19;;:5;:19;;;23951:60;;;23983:28;;;;;;;;;;;;;;23951:60;19206:13;24029:18;:25;24048:5;24029:25;;;;;;;;;;;;;;;;:54;24022:61;;23867:224;;;:::o;9298:103::-;8878:12;:10;:12::i;:::-;8867:23;;:7;:5;:7::i;:::-;:23;;;8859:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9363:30:::1;9390:1;9363:18;:30::i;:::-;9298:103::o:0;48623:31::-;;;;;;;;;;;;;:::o;50460:194::-;8878:12;:10;:12::i;:::-;8867:23;;:7;:5;:7::i;:::-;:23;;;8859:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50521:15:::1;50539:21;50521:39;;50590:7;50579;:18;;50571:27;;;::::0;::::1;;50617:10;50609:28;;:37;50638:7;50609:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;50510:144;50460:194:::0;:::o;49056:690::-;49118:12;49141:5;49133;;:13;;;;:::i;:::-;49118:28;;49156:13;49172;:11;:13::i;:::-;49156:29;;49204:11;;;;;;;;;;;49196:20;;;;;;49244:10;;49235:5;:19;;49227:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;49328:10;;49299:14;:26;49314:10;49299:26;;;;;;;;;;;;;;;;:39;49291:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;49401:12;;49392:5;49384;:13;;;;:::i;:::-;:29;;49376:38;;;;;;49459:15;;49430:14;:26;49445:10;49430:26;;;;;;;;;;;;;;;;:44;49427:164;;;49495:16;49522:15;;49514:5;:23;;;;:::i;:::-;49495:42;;49571:8;49563:5;;:16;;;;:::i;:::-;49556:23;;49476:115;49427:164;49624:4;49611:9;:17;;49603:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;49664:28;49674:10;49686:5;49664:9;:28::i;:::-;49733:5;49703:14;:26;49718:10;49703:26;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;49107:639;;49056:690;:::o;8647:87::-;8693:7;8720:6;;;;;;;;;;;8713:13;;8647:87;:::o;28370:104::-;28426:13;28459:7;28452:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28370:104;:::o;50133:95::-;8878:12;:10;:12::i;:::-;8867:23;;:7;:5;:7::i;:::-;:23;;;8859:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50217:3:::1;50204:10;:16;;;;;;;;;;;;:::i;:::-;;50133:95:::0;:::o;48782:33::-;;;;:::o;30545:308::-;30656:19;:17;:19::i;:::-;30644:31;;:8;:31;;;30640:61;;;30684:17;;;;;;;;;;;;;;30640:61;30766:8;30714:18;:39;30733:19;:17;:19::i;:::-;30714:39;;;;;;;;;;;;;;;:49;30754:8;30714:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;30826:8;30790:55;;30805:19;:17;:19::i;:::-;30790:55;;;30836:8;30790:55;;;;;;:::i;:::-;;;;;;;;30545:308;;:::o;49900:108::-;8878:12;:10;:12::i;:::-;8867:23;;:7;:5;:7::i;:::-;:23;;;8859:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49990:10:::1;49972:15;:28;;;;49900:108:::0;:::o;31652:396::-;31819:28;31829:4;31835:2;31839:7;31819:9;:28::i;:::-;31880:1;31862:2;:14;;;:19;31858:183;;31901:56;31932:4;31938:2;31942:7;31951:5;31901:30;:56::i;:::-;31896:145;;31985:40;;;;;;;;;;;;;;31896:145;31858:183;31652:396;;;;:::o;48663:34::-;;;;:::o;28545:318::-;28618:13;28649:16;28657:7;28649;:16::i;:::-;28644:59;;28674:29;;;;;;;;;;;;;;28644:59;28716:21;28740:10;:8;:10::i;:::-;28716:34;;28793:1;28774:7;28768:21;:26;;:87;;;;;;;;;;;;;;;;;28821:7;28830:18;28840:7;28830:9;:18::i;:::-;28804:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28768:87;28761:94;;;28545:318;;;:::o;50016:109::-;8878:12;:10;:12::i;:::-;8867:23;;:7;:5;:7::i;:::-;:23;;;8859:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50104:13:::1;50091:10;:26;;;;50016:109:::0;:::o;30924:164::-;31021:4;31045:18;:25;31064:5;31045:25;;;;;;;;;;;;;;;:35;31071:8;31045:35;;;;;;;;;;;;;;;;;;;;;;;;;31038:42;;30924:164;;;;:::o;48824:49::-;;;;;;;;;;;;;;;;;:::o;9556:201::-;8878:12;:10;:12::i;:::-;8867:23;;:7;:5;:7::i;:::-;:23;;;8859:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9665:1:::1;9645:22;;:8;:22;;;;9637:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9721:28;9740:8;9721:18;:28::i;:::-;9556:201:::0;:::o;32303:273::-;32360:4;32416:7;32397:15;:13;:15::i;:::-;:26;;:66;;;;;32450:13;;32440:7;:23;32397:66;:152;;;;;32548:1;19976:8;32501:17;:26;32519:7;32501:26;;;;;;;;;;;;:43;:48;32397:152;32377:172;;32303:273;;;:::o;25505:1129::-;25572:7;25592:12;25607:7;25592:22;;25675:4;25656:15;:13;:15::i;:::-;:23;25652:915;;25709:13;;25702:4;:20;25698:869;;;25747:14;25764:17;:23;25782:4;25764:23;;;;;;;;;;;;25747:40;;25880:1;19976:8;25853:6;:23;:28;25849:699;;;26372:113;26389:1;26379:6;:11;26372:113;;;26432:17;:25;26450:6;;;;;;;26432:25;;;;;;;;;;;;26423:34;;26372:113;;;26518:6;26511:13;;;;;;25849:699;25724:843;25698:869;25652:915;26595:31;;;;;;;;;;;;;;25505:1129;;;;:::o;46285:105::-;46345:7;46372:10;46365:17;;46285:105;:::o;7371:98::-;7424:7;7451:10;7444:17;;7371:98;:::o;21765:92::-;21821:7;21765:92;:::o;37542:2515::-;37657:27;37687;37706:7;37687:18;:27::i;:::-;37657:57;;37772:4;37731:45;;37747:19;37731:45;;;37727:86;;37785:28;;;;;;;;;;;;;;37727:86;37826:22;37875:4;37852:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;37896:43;37913:4;37919:19;:17;:19::i;:::-;37896:16;:43::i;:::-;37852:87;:147;;;;37980:19;:17;:19::i;:::-;37956:43;;:20;37968:7;37956:11;:20::i;:::-;:43;;;37852:147;37826:174;;38018:17;38013:66;;38044:35;;;;;;;;;;;;;;38013:66;38108:1;38094:16;;:2;:16;;;38090:52;;;38119:23;;;;;;;;;;;;;;38090:52;38155:43;38177:4;38183:2;38187:7;38196:1;38155:21;:43::i;:::-;38271:15;:24;38287:7;38271:24;;;;;;;;;;;;38264:31;;;;;;;;;;;38663:18;:24;38682:4;38663:24;;;;;;;;;;;;;;;;38661:26;;;;;;;;;;;;38732:18;:22;38751:2;38732:22;;;;;;;;;;;;;;;;38730:24;;;;;;;;;;;20258:8;19860:3;39113:15;:41;;39071:21;39089:2;39071:17;:21::i;:::-;:84;:128;39025:17;:26;39043:7;39025:26;;;;;;;;;;;:174;;;;39369:1;20258:8;39319:19;:46;:51;39315:626;;;39391:19;39423:1;39413:7;:11;39391:33;;39580:1;39546:17;:30;39564:11;39546:30;;;;;;;;;;;;:35;39542:384;;;39684:13;;39669:11;:28;39665:242;;39864:19;39831:17;:30;39849:11;39831:30;;;;;;;;;;;:52;;;;39665:242;39542:384;39372:569;39315:626;39988:7;39984:2;39969:27;;39978:4;39969:27;;;;;;;;;;;;40007:42;40028:4;40034:2;40038:7;40047:1;40007:20;:42::i;:::-;37646:2411;;37542:2515;;;:::o;32660:104::-;32729:27;32739:2;32743:8;32729:27;;;;;;;;;;;;:9;:27::i;:::-;32660:104;;:::o;9917:191::-;9991:16;10010:6;;;;;;;;;;;9991:25;;10036:8;10027:6;;:17;;;;;;;;;;;;;;;;;;10091:8;10060:40;;10081:8;10060:40;;;;;;;;;;;;9980:128;9917:191;:::o;43754:716::-;43917:4;43963:2;43938:45;;;43984:19;:17;:19::i;:::-;44005:4;44011:7;44020:5;43938:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43934:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44238:1;44221:6;:13;:18;44217:235;;;44267:40;;;;;;;;;;;;;;44217:235;44410:6;44404:13;44395:6;44391:2;44387:15;44380:38;43934:529;44107:54;;;44097:64;;;:6;:64;;;;44090:71;;;43754:716;;;;;;:::o;48939:111::-;48999:13;49032:10;49025:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48939:111;:::o;46496:1959::-;46553:17;46974:3;46967:4;46961:11;46957:21;46950:28;;47065:3;47059:4;47052:17;47171:3;47628:5;47758:1;47753:3;47749:11;47742:18;;47895:2;47889:4;47885:13;47881:2;47877:22;47872:3;47864:36;47936:2;47930:4;47926:13;47918:21;;47519:682;47955:4;47519:682;;;48130:1;48125:3;48121:11;48114:18;;48181:2;48175:4;48171:13;48167:2;48163:22;48158:3;48150:36;48051:2;48045:4;48041:13;48033:21;;47519:682;;;47523:431;48252:3;48247;48243:13;48367:2;48362:3;48358:12;48351:19;;48430:6;48425:3;48418:19;46592:1856;;46496:1959;;;:::o;45118:159::-;;;;;:::o;29290:148::-;29354:14;29415:5;29405:15;;29290:148;;;:::o;45936:158::-;;;;;:::o;33137:2236::-;33260:20;33283:13;;33260:36;;33325:1;33311:16;;:2;:16;;;33307:48;;;33336:19;;;;;;;;;;;;;;33307:48;33382:1;33370:8;:13;33366:44;;;33392:18;;;;;;;;;;;;;;33366:44;33423:61;33453:1;33457:2;33461:12;33475:8;33423:21;:61::i;:::-;34027:1;19343:2;33998:1;:25;;33997:31;33985:8;:44;33959:18;:22;33978:2;33959:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;20123:3;34428:29;34455:1;34443:8;:13;34428:14;:29::i;:::-;:56;;19860:3;34365:15;:41;;34323:21;34341:2;34323:17;:21::i;:::-;:84;:162;34272:17;:31;34290:12;34272:31;;;;;;;;;;;:213;;;;34502:20;34525:12;34502:35;;34552:11;34581:8;34566:12;:23;34552:37;;34628:1;34610:2;:14;;;:19;34606:635;;34650:313;34706:12;34702:2;34681:38;;34698:1;34681:38;;;;;;;;;;;;34747:69;34786:1;34790:2;34794:14;;;;;;34810:5;34747:30;:69::i;:::-;34742:174;;34852:40;;;;;;;;;;;;;;34742:174;34958:3;34943:12;:18;34650:313;;35044:12;35027:13;;:29;35023:43;;35058:8;;;35023:43;34606:635;;;35107:119;35163:14;;;;;;35159:2;35138:40;;35155:1;35138:40;;;;;;;;;;;;35221:3;35206:12;:18;35107:119;;34606:635;35271:12;35255:13;:28;;;;33736:1559;;35305:60;35334:1;35338:2;35342:12;35356:8;35305:20;:60::i;:::-;33249:2124;33137:2236;;;:::o;29525:142::-;29583:14;29644:5;29634:15;;29525:142;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:118::-;7574:24;7592:5;7574:24;:::i;:::-;7569:3;7562:37;7487:118;;:::o;7611:109::-;7692:21;7707:5;7692:21;:::i;:::-;7687:3;7680:34;7611:109;;:::o;7726:360::-;7812:3;7840:38;7872:5;7840:38;:::i;:::-;7894:70;7957:6;7952:3;7894:70;:::i;:::-;7887:77;;7973:52;8018:6;8013:3;8006:4;7999:5;7995:16;7973:52;:::i;:::-;8050:29;8072:6;8050:29;:::i;:::-;8045:3;8041:39;8034:46;;7816:270;7726:360;;;;:::o;8092:364::-;8180:3;8208:39;8241:5;8208:39;:::i;:::-;8263:71;8327:6;8322:3;8263:71;:::i;:::-;8256:78;;8343:52;8388:6;8383:3;8376:4;8369:5;8365:16;8343:52;:::i;:::-;8420:29;8442:6;8420:29;:::i;:::-;8415:3;8411:39;8404:46;;8184:272;8092:364;;;;:::o;8462:377::-;8568:3;8596:39;8629:5;8596:39;:::i;:::-;8651:89;8733:6;8728:3;8651:89;:::i;:::-;8644:96;;8749:52;8794:6;8789:3;8782:4;8775:5;8771:16;8749:52;:::i;:::-;8826:6;8821:3;8817:16;8810:23;;8572:267;8462:377;;;;:::o;8845:366::-;8987:3;9008:67;9072:2;9067:3;9008:67;:::i;:::-;9001:74;;9084:93;9173:3;9084:93;:::i;:::-;9202:2;9197:3;9193:12;9186:19;;8845:366;;;:::o;9217:::-;9359:3;9380:67;9444:2;9439:3;9380:67;:::i;:::-;9373:74;;9456:93;9545:3;9456:93;:::i;:::-;9574:2;9569:3;9565:12;9558:19;;9217:366;;;:::o;9589:::-;9731:3;9752:67;9816:2;9811:3;9752:67;:::i;:::-;9745:74;;9828:93;9917:3;9828:93;:::i;:::-;9946:2;9941:3;9937:12;9930:19;;9589:366;;;:::o;9961:::-;10103:3;10124:67;10188:2;10183:3;10124:67;:::i;:::-;10117:74;;10200:93;10289:3;10200:93;:::i;:::-;10318:2;10313:3;10309:12;10302:19;;9961:366;;;:::o;10333:::-;10475:3;10496:67;10560:2;10555:3;10496:67;:::i;:::-;10489:74;;10572:93;10661:3;10572:93;:::i;:::-;10690:2;10685:3;10681:12;10674:19;;10333:366;;;:::o;10705:118::-;10792:24;10810:5;10792:24;:::i;:::-;10787:3;10780:37;10705:118;;:::o;10829:435::-;11009:3;11031:95;11122:3;11113:6;11031:95;:::i;:::-;11024:102;;11143:95;11234:3;11225:6;11143:95;:::i;:::-;11136:102;;11255:3;11248:10;;10829:435;;;;;:::o;11270:222::-;11363:4;11401:2;11390:9;11386:18;11378:26;;11414:71;11482:1;11471:9;11467:17;11458:6;11414:71;:::i;:::-;11270:222;;;;:::o;11498:640::-;11693:4;11731:3;11720:9;11716:19;11708:27;;11745:71;11813:1;11802:9;11798:17;11789:6;11745:71;:::i;:::-;11826:72;11894:2;11883:9;11879:18;11870:6;11826:72;:::i;:::-;11908;11976:2;11965:9;11961:18;11952:6;11908:72;:::i;:::-;12027:9;12021:4;12017:20;12012:2;12001:9;11997:18;11990:48;12055:76;12126:4;12117:6;12055:76;:::i;:::-;12047:84;;11498:640;;;;;;;:::o;12144:210::-;12231:4;12269:2;12258:9;12254:18;12246:26;;12282:65;12344:1;12333:9;12329:17;12320:6;12282:65;:::i;:::-;12144:210;;;;:::o;12360:313::-;12473:4;12511:2;12500:9;12496:18;12488:26;;12560:9;12554:4;12550:20;12546:1;12535:9;12531:17;12524:47;12588:78;12661:4;12652:6;12588:78;:::i;:::-;12580:86;;12360:313;;;;:::o;12679:419::-;12845:4;12883:2;12872:9;12868:18;12860:26;;12932:9;12926:4;12922:20;12918:1;12907:9;12903:17;12896:47;12960:131;13086:4;12960:131;:::i;:::-;12952:139;;12679:419;;;:::o;13104:::-;13270:4;13308:2;13297:9;13293:18;13285:26;;13357:9;13351:4;13347:20;13343:1;13332:9;13328:17;13321:47;13385:131;13511:4;13385:131;:::i;:::-;13377:139;;13104:419;;;:::o;13529:::-;13695:4;13733:2;13722:9;13718:18;13710:26;;13782:9;13776:4;13772:20;13768:1;13757:9;13753:17;13746:47;13810:131;13936:4;13810:131;:::i;:::-;13802:139;;13529:419;;;:::o;13954:::-;14120:4;14158:2;14147:9;14143:18;14135:26;;14207:9;14201:4;14197:20;14193:1;14182:9;14178:17;14171:47;14235:131;14361:4;14235:131;:::i;:::-;14227:139;;13954:419;;;:::o;14379:::-;14545:4;14583:2;14572:9;14568:18;14560:26;;14632:9;14626:4;14622:20;14618:1;14607:9;14603:17;14596:47;14660:131;14786:4;14660:131;:::i;:::-;14652:139;;14379:419;;;:::o;14804:222::-;14897:4;14935:2;14924:9;14920:18;14912:26;;14948:71;15016:1;15005:9;15001:17;14992:6;14948:71;:::i;:::-;14804:222;;;;:::o;15032:129::-;15066:6;15093:20;;:::i;:::-;15083:30;;15122:33;15150:4;15142:6;15122:33;:::i;:::-;15032:129;;;:::o;15167:75::-;15200:6;15233:2;15227:9;15217:19;;15167:75;:::o;15248:307::-;15309:4;15399:18;15391:6;15388:30;15385:56;;;15421:18;;:::i;:::-;15385:56;15459:29;15481:6;15459:29;:::i;:::-;15451:37;;15543:4;15537;15533:15;15525:23;;15248:307;;;:::o;15561:308::-;15623:4;15713:18;15705:6;15702:30;15699:56;;;15735:18;;:::i;:::-;15699:56;15773:29;15795:6;15773:29;:::i;:::-;15765:37;;15857:4;15851;15847:15;15839:23;;15561:308;;;:::o;15875:98::-;15926:6;15960:5;15954:12;15944:22;;15875:98;;;:::o;15979:99::-;16031:6;16065:5;16059:12;16049:22;;15979:99;;;:::o;16084:168::-;16167:11;16201:6;16196:3;16189:19;16241:4;16236:3;16232:14;16217:29;;16084:168;;;;:::o;16258:169::-;16342:11;16376:6;16371:3;16364:19;16416:4;16411:3;16407:14;16392:29;;16258:169;;;;:::o;16433:148::-;16535:11;16572:3;16557:18;;16433:148;;;;:::o;16587:305::-;16627:3;16646:20;16664:1;16646:20;:::i;:::-;16641:25;;16680:20;16698:1;16680:20;:::i;:::-;16675:25;;16834:1;16766:66;16762:74;16759:1;16756:81;16753:107;;;16840:18;;:::i;:::-;16753:107;16884:1;16881;16877:9;16870:16;;16587:305;;;;:::o;16898:348::-;16938:7;16961:20;16979:1;16961:20;:::i;:::-;16956:25;;16995:20;17013:1;16995:20;:::i;:::-;16990:25;;17183:1;17115:66;17111:74;17108:1;17105:81;17100:1;17093:9;17086:17;17082:105;17079:131;;;17190:18;;:::i;:::-;17079:131;17238:1;17235;17231:9;17220:20;;16898:348;;;;:::o;17252:191::-;17292:4;17312:20;17330:1;17312:20;:::i;:::-;17307:25;;17346:20;17364:1;17346:20;:::i;:::-;17341:25;;17385:1;17382;17379:8;17376:34;;;17390:18;;:::i;:::-;17376:34;17435:1;17432;17428:9;17420:17;;17252:191;;;;:::o;17449:96::-;17486:7;17515:24;17533:5;17515:24;:::i;:::-;17504:35;;17449:96;;;:::o;17551:90::-;17585:7;17628:5;17621:13;17614:21;17603:32;;17551:90;;;:::o;17647:149::-;17683:7;17723:66;17716:5;17712:78;17701:89;;17647:149;;;:::o;17802:126::-;17839:7;17879:42;17872:5;17868:54;17857:65;;17802:126;;;:::o;17934:77::-;17971:7;18000:5;17989:16;;17934:77;;;:::o;18017:154::-;18101:6;18096:3;18091;18078:30;18163:1;18154:6;18149:3;18145:16;18138:27;18017:154;;;:::o;18177:307::-;18245:1;18255:113;18269:6;18266:1;18263:13;18255:113;;;18354:1;18349:3;18345:11;18339:18;18335:1;18330:3;18326:11;18319:39;18291:2;18288:1;18284:10;18279:15;;18255:113;;;18386:6;18383:1;18380:13;18377:101;;;18466:1;18457:6;18452:3;18448:16;18441:27;18377:101;18226:258;18177:307;;;:::o;18490:320::-;18534:6;18571:1;18565:4;18561:12;18551:22;;18618:1;18612:4;18608:12;18639:18;18629:81;;18695:4;18687:6;18683:17;18673:27;;18629:81;18757:2;18749:6;18746:14;18726:18;18723:38;18720:84;;;18776:18;;:::i;:::-;18720:84;18541:269;18490:320;;;:::o;18816:281::-;18899:27;18921:4;18899:27;:::i;:::-;18891:6;18887:40;19029:6;19017:10;19014:22;18993:18;18981:10;18978:34;18975:62;18972:88;;;19040:18;;:::i;:::-;18972:88;19080:10;19076:2;19069:22;18859:238;18816:281;;:::o;19103:180::-;19151:77;19148:1;19141:88;19248:4;19245:1;19238:15;19272:4;19269:1;19262:15;19289:180;19337:77;19334:1;19327:88;19434:4;19431:1;19424:15;19458:4;19455:1;19448:15;19475:180;19523:77;19520:1;19513:88;19620:4;19617:1;19610:15;19644:4;19641:1;19634:15;19661:117;19770:1;19767;19760:12;19784:117;19893:1;19890;19883:12;19907:117;20016:1;20013;20006:12;20030:117;20139:1;20136;20129:12;20153:102;20194:6;20245:2;20241:7;20236:2;20229:5;20225:14;20221:28;20211:38;;20153:102;;;:::o;20261:225::-;20401:34;20397:1;20389:6;20385:14;20378:58;20470:8;20465:2;20457:6;20453:15;20446:33;20261:225;:::o;20492:171::-;20632:23;20628:1;20620:6;20616:14;20609:47;20492:171;:::o;20669:172::-;20809:24;20805:1;20797:6;20793:14;20786:48;20669:172;:::o;20847:182::-;20987:34;20983:1;20975:6;20971:14;20964:58;20847:182;:::o;21035:168::-;21175:20;21171:1;21163:6;21159:14;21152:44;21035:168;:::o;21209:122::-;21282:24;21300:5;21282:24;:::i;:::-;21275:5;21272:35;21262:63;;21321:1;21318;21311:12;21262:63;21209:122;:::o;21337:116::-;21407:21;21422:5;21407:21;:::i;:::-;21400:5;21397:32;21387:60;;21443:1;21440;21433:12;21387:60;21337:116;:::o;21459:120::-;21531:23;21548:5;21531:23;:::i;:::-;21524:5;21521:34;21511:62;;21569:1;21566;21559:12;21511:62;21459:120;:::o;21585:122::-;21658:24;21676:5;21658:24;:::i;:::-;21651:5;21648:35;21638:63;;21697:1;21694;21687:12;21638:63;21585:122;:::o

Swarm Source

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