ETH Price: $2,504.18 (-4.95%)

Token

Noobs (NOOBS)
 

Overview

Max Total Supply

5,555 NOOBS

Holders

2,750

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
fangksbin.eth
Balance
2 NOOBS
0xab1EF6A2Bd769dCe3dA9Cd96e8f16F00F50eE6e6
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:
Noobs

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
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);
}

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721AQueryable compliant contract.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721ABurnable compliant contract.
 */
interface IERC721ABurnable is IERC721A {
    /**
     * @dev Burns `tokenId`. See {ERC721A-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) external;
}

pragma solidity ^0.8.4;

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

pragma solidity ^0.8.4;

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

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

pragma solidity ^0.8.4;

/**
 * @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;
        return ownership;
    }

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

/**
 * @title ERC721A Burnable Token
 * @dev ERC721A Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721ABurnable is ERC721A, IERC721ABurnable {
    /**
     * @dev Burns `tokenId`. See {ERC721A-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual override {
        _burn(tokenId, true);
    }
}

pragma solidity ^0.8.4;

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

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

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

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


pragma solidity ^0.8.4;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex;
                // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}

pragma solidity ^0.8.4;

contract Noobs is ERC721AQueryable, ERC721ABurnable, Ownable {
    using EnumerableSet for EnumerableSet.UintSet;

    uint256 public constant MAX_SUPPLY = 5555;

    uint256 public maxByWallet = 2;
    mapping(address => uint256) public mintedByWallet;
    mapping(address => uint256) public walletWhitelist;

    // 0:close | 1:whitelist | 2:open
    uint8 public saleState = 0;

    bool public collectMarketing = true;

    //baseURI
    string public baseURI;

    //uriSuffix
    string public uriSuffix;

    constructor(
        string memory name,
        string memory symbol,
        string memory baseURI_,
        string memory uriSuffix_
    ) ERC721A(name, symbol) {
        baseURI = baseURI_;
        uriSuffix = uriSuffix_;
    }

    uint256 public MINT_PRICE = .01 ether;
    uint256 public FREE_MINT_UNTIL = 555;

    /******************** PUBLIC ********************/

    function mint(uint256 amount) external payable {
        require(saleState != 0, "Cant mint yet");
        require(msg.sender == tx.origin, "not allowed");
        require(amount + _totalMinted()  <= MAX_SUPPLY, "Exceed MAX_SUPPLY");
        require(amount > 0, "Amount can't be 0");

        if(saleState == 1) {
            require(amount + mintedByWallet[msg.sender] <= walletWhitelist[msg.sender], "Exceed whitelist mint for this wallet");
            mintedByWallet[msg.sender] += amount;
            _safeMint(msg.sender, amount);
        } else if(saleState == 2) {
            require(amount + mintedByWallet[msg.sender] <= (maxByWallet + walletWhitelist[msg.sender]), "Exceed maxByWallet");
            if (collectMarketing) {
                if(FREE_MINT_UNTIL < _totalMinted()) {
                    require(amount * MINT_PRICE <= msg.value, "Invalid payment amount");
                }
            }



            mintedByWallet[msg.sender] += amount;
            _safeMint(msg.sender, amount);            
        }
    }

    /******************** OVERRIDES ********************/

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

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

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        if (bytes(baseURI).length == 0) {
            return _toString(tokenId);
        }

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

    /******************** OWNER ********************/

    /// @notice Set baseURI.
    /// @param newBaseURI New baseURI.
    /// @param newUriSuffix New uriSuffix.
    function setBaseURI(string memory newBaseURI, string memory newUriSuffix) external onlyOwner {
        baseURI = newBaseURI;
        uriSuffix = newUriSuffix;
    }

    /// @notice Set saleState.
    /// @param newSaleState New sale state.
    function setSaleState(uint8 newSaleState) external onlyOwner {
        saleState = newSaleState;
    }

    /// @notice Set collectMarketing.
    /// @param newCollectMarketing New collect marketing flag.
    function setCollectMarketing(bool newCollectMarketing) external onlyOwner {
        collectMarketing = newCollectMarketing;
    }

    /// @notice Set maxByWallet.
    /// @param newMaxByWallet New max by wallet
    function setMaxByWallet(uint256 newMaxByWallet) external onlyOwner {
        maxByWallet = newMaxByWallet;
    }

    /******************** ALPHA MINT ********************/

    function alphaMint(address[] calldata addresses, uint256[] calldata count) external onlyOwner {
        require(saleState == 0, "sale is open!");
        require(addresses.length == count.length, "mismatching lengths!");

        for (uint256 i; i < addresses.length; i++) {
            _safeMint(addresses[i], count[i]);
        }

        require(_totalMinted() <= MAX_SUPPLY, "Exceed MAX_SUPPLY");
    }

    function setWhitelist(address[] calldata addresses, uint256[] calldata count) external onlyOwner {
        require(saleState == 0, "sale is open!");

        require(addresses.length == count.length, "mismatching lengths!");

        for (uint256 i; i < addresses.length; i++) {
            walletWhitelist[addresses[i]]=count[i];
        }
    }


    function withdraw() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"string","name":"uriSuffix_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"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":"FREE_MINT_UNTIL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"count","type":"uint256[]"}],"name":"alphaMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectMarketing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"maxByWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedByWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleState","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"},{"internalType":"string","name":"newUriSuffix","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newCollectMarketing","type":"bool"}],"name":"setCollectMarketing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxByWallet","type":"uint256"}],"name":"setMaxByWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newSaleState","type":"uint8"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"count","type":"uint256[]"}],"name":"setWhitelist","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"walletWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526002600955600c805461ffff1916610100179055662386f26fc10000600f5561022b6010553480156200003657600080fd5b5060405162002b5738038062002b57833981016040819052620000599162000280565b8351849084906200007290600290602085019062000123565b5080516200008890600390602084019062000123565b50506001600055506200009b33620000d1565b8151620000b090600d90602085019062000123565b508051620000c690600e90602084019062000123565b50505050506200038c565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001319062000339565b90600052602060002090601f016020900481019282620001555760008555620001a0565b82601f106200017057805160ff1916838001178555620001a0565b82800160010185558215620001a0579182015b82811115620001a057825182559160200191906001019062000183565b50620001ae929150620001b2565b5090565b5b80821115620001ae5760008155600101620001b3565b600082601f830112620001db57600080fd5b81516001600160401b0380821115620001f857620001f862000376565b604051601f8301601f19908116603f0116810190828211818310171562000223576200022362000376565b816040528381526020925086838588010111156200024057600080fd5b600091505b8382101562000264578582018301518183018401529082019062000245565b83821115620002765760008385830101525b9695505050505050565b600080600080608085870312156200029757600080fd5b84516001600160401b0380821115620002af57600080fd5b620002bd88838901620001c9565b95506020870151915080821115620002d457600080fd5b620002e288838901620001c9565b94506040870151915080821115620002f957600080fd5b6200030788838901620001c9565b935060608701519150808211156200031e57600080fd5b506200032d87828801620001c9565b91505092959194509250565b600181811c908216806200034e57607f821691505b602082108114156200037057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6127bb806200039c6000396000f3fe60806040526004361061023b5760003560e01c80636790a9de1161012e578063a22cb465116100ab578063c87b56dd1161006f578063c87b56dd146106ba578063e985e9c5146106da578063f013e0e1146106fa578063f09a03c01461071a578063f2fde38b1461073a57600080fd5b8063a22cb46514610621578063b88d4fde14610641578063b974f63314610661578063c002d23d14610677578063c23dc68f1461068d57600080fd5b80638da5cb5b116100f25780638da5cb5b1461059c5780639434b805146105ba57806395d89b41146105d957806399a2557a146105ee578063a0712d681461060e57600080fd5b80636790a9de146105055780636c0360eb1461052557806370a082311461053a578063715018a61461055a5780638462151c1461056f57600080fd5b806334ecc70a116101bc5780635503a0e8116101805780635503a0e8146104575780635a67de071461046c5780635bbb21771461048c578063603f4d52146104b95780636352211e146104e557600080fd5b806334ecc70a146103bf5780633ccfd60b146103d557806342842e0e146103ea57806342966c681461040a5780634a81d9dd1461042a57600080fd5b806317d985141161020357806317d985141461032c57806318160ddd1461034c57806323b872dd146103695780632e0674211461038957806332cb6b0c146103a957600080fd5b806301ffc9a71461024057806306fdde0314610275578063081812fc14610297578063095ea7b3146102cf5780630d758111146102f1575b600080fd5b34801561024c57600080fd5b5061026061025b3660046122f6565b61075a565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061028a6107ac565b60405161026c91906125a7565b3480156102a357600080fd5b506102b76102b2366004612393565b61083e565b6040516001600160a01b03909116815260200161026c565b3480156102db57600080fd5b506102ef6102ea366004612167565b610882565b005b3480156102fd57600080fd5b5061031e61030c366004612038565b600a6020526000908152604090205481565b60405190815260200161026c565b34801561033857600080fd5b506102ef6103473660046122db565b610955565b34801561035857600080fd5b50600154600054036000190161031e565b34801561037557600080fd5b506102ef610384366004612086565b6109a2565b34801561039557600080fd5b506102ef6103a4366004612393565b6109b2565b3480156103b557600080fd5b5061031e6115b381565b3480156103cb57600080fd5b5061031e60095481565b3480156103e157600080fd5b506102ef6109e1565b3480156103f657600080fd5b506102ef610405366004612086565b610a47565b34801561041657600080fd5b506102ef610425366004612393565b610a62565b34801561043657600080fd5b5061031e610445366004612038565b600b6020526000908152604090205481565b34801561046357600080fd5b5061028a610a6d565b34801561047857600080fd5b506102ef6104873660046123ac565b610afb565b34801561049857600080fd5b506104ac6104a736600461222f565b610b3b565b60405161026c9190612505565b3480156104c557600080fd5b50600c546104d39060ff1681565b60405160ff909116815260200161026c565b3480156104f157600080fd5b506102b7610500366004612393565b610c01565b34801561051157600080fd5b506102ef610520366004612330565b610c0c565b34801561053157600080fd5b5061028a610c5d565b34801561054657600080fd5b5061031e610555366004612038565b610c6a565b34801561056657600080fd5b506102ef610cb8565b34801561057b57600080fd5b5061058f61058a366004612038565b610cee565b60405161026c919061256f565b3480156105a857600080fd5b506008546001600160a01b03166102b7565b3480156105c657600080fd5b50600c5461026090610100900460ff1681565b3480156105e557600080fd5b5061028a610df6565b3480156105fa57600080fd5b5061058f610609366004612191565b610e05565b6102ef61061c366004612393565b610f90565b34801561062d57600080fd5b506102ef61063c36600461213d565b61126c565b34801561064d57600080fd5b506102ef61065c3660046120c2565b611302565b34801561066d57600080fd5b5061031e60105481565b34801561068357600080fd5b5061031e600f5481565b34801561069957600080fd5b506106ad6106a8366004612393565b61134c565b60405161026c91906125ef565b3480156106c657600080fd5b5061028a6106d5366004612393565b6113c1565b3480156106e657600080fd5b506102606106f5366004612053565b61143c565b34801561070657600080fd5b506102ef6107153660046121c4565b61146a565b34801561072657600080fd5b506102ef6107353660046121c4565b61159f565b34801561074657600080fd5b506102ef610755366004612038565b61170a565b60006301ffc9a760e01b6001600160e01b03198316148061078b57506380ac58cd60e01b6001600160e01b03198316145b806107a65750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546107bb906126b7565b80601f01602080910402602001604051908101604052809291908181526020018280546107e7906126b7565b80156108345780601f1061080957610100808354040283529160200191610834565b820191906000526020600020905b81548152906001019060200180831161081757829003601f168201915b5050505050905090565b6000610849826117a2565b610866576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061088d826117d7565b9050806001600160a01b0316836001600160a01b031614156108c25760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216146108f9576108dc813361143c565b6108f9576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b031633146109885760405162461bcd60e51b815260040161097f906125ba565b60405180910390fd5b600c80549115156101000261ff0019909216919091179055565b6109ad838383611840565b505050565b6008546001600160a01b031633146109dc5760405162461bcd60e51b815260040161097f906125ba565b600955565b6008546001600160a01b03163314610a0b5760405162461bcd60e51b815260040161097f906125ba565b6008546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610a44573d6000803e3d6000fd5b50565b6109ad83838360405180602001604052806000815250611302565b610a448160016119cf565b600e8054610a7a906126b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa6906126b7565b8015610af35780601f10610ac857610100808354040283529160200191610af3565b820191906000526020600020905b815481529060010190602001808311610ad657829003601f168201915b505050505081565b6008546001600160a01b03163314610b255760405162461bcd60e51b815260040161097f906125ba565b600c805460ff191660ff92909216919091179055565b80516060906000816001600160401b03811115610b5a57610b5a612739565b604051908082528060200260200182016040528015610ba557816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181610b785790505b50905060005b828114610bf957610bd4858281518110610bc757610bc7612723565b602002602001015161134c565b828281518110610be657610be6612723565b6020908102919091010152600101610bab565b509392505050565b60006107a6826117d7565b6008546001600160a01b03163314610c365760405162461bcd60e51b815260040161097f906125ba565b8151610c4990600d906020850190611eb1565b5080516109ad90600e906020840190611eb1565b600d8054610a7a906126b7565b60006001600160a01b038216610c93576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b03163314610ce25760405162461bcd60e51b815260040161097f906125ba565b610cec6000611b11565b565b60606000806000610cfe85610c6a565b90506000816001600160401b03811115610d1a57610d1a612739565b604051908082528060200260200182016040528015610d43578160200160208202803683370190505b509050610d69604080516060810182526000808252602082018190529181019190915290565b60015b838614610dea57610d7c81611b63565b9150816040015115610d8d57610de2565b81516001600160a01b031615610da257815194505b876001600160a01b0316856001600160a01b03161415610de25780838780600101985081518110610dd557610dd5612723565b6020026020010181815250505b600101610d6c565b50909695505050505050565b6060600380546107bb906126b7565b6060818310610e2757604051631960ccad60e11b815260040160405180910390fd5b600080610e3360005490565b90506001851015610e4357600194505b80841115610e4f578093505b6000610e5a87610c6a565b905084861015610e795785850381811015610e73578091505b50610e7d565b5060005b6000816001600160401b03811115610e9757610e97612739565b604051908082528060200260200182016040528015610ec0578160200160208202803683370190505b50905081610ed3579350610f8992505050565b6000610ede8861134c565b905060008160400151610eef575080515b885b888114158015610f015750848714155b15610f7d57610f0f81611b63565b9250826040015115610f2057610f75565b82516001600160a01b031615610f3557825191505b8a6001600160a01b0316826001600160a01b03161415610f755780848880600101995081518110610f6857610f68612723565b6020026020010181815250505b600101610ef1565b50505092835250909150505b9392505050565b600c5460ff16610fd25760405162461bcd60e51b815260206004820152600d60248201526c10d85b9d081b5a5b9d081e595d609a1b604482015260640161097f565b33321461100f5760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b604482015260640161097f565b6115b361101f6000546000190190565b6110299083612654565b111561106b5760405162461bcd60e51b8152602060048201526011602482015270457863656564204d41585f535550504c5960781b604482015260640161097f565b600081116110af5760405162461bcd60e51b81526020600482015260116024820152700416d6f756e742063616e2774206265203607c1b604482015260640161097f565b600c5460ff166001141561116e57336000908152600b6020908152604080832054600a909252909120546110e39083612654565b111561113f5760405162461bcd60e51b815260206004820152602560248201527f4578636565642077686974656c697374206d696e7420666f7220746869732077604482015264185b1b195d60da1b606482015260840161097f565b336000908152600a60205260408120805483929061115e908490612654565b90915550610a4490503382611b98565b600c5460ff1660021415610a4457336000908152600b60205260409020546009546111999190612654565b336000908152600a60205260409020546111b39083612654565b11156111f65760405162461bcd60e51b8152602060048201526012602482015271115e18d95959081b585e109e55d85b1b195d60721b604482015260640161097f565b600c54610100900460ff161561113f5760005460001901601054101561113f5734600f5482611225919061266c565b111561113f5760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081c185e5b595b9d08185b5bdd5b9d60521b604482015260640161097f565b6001600160a01b0382163314156112965760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61130d848484611840565b6001600160a01b0383163b156113465761132984848484611bb6565b611346576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6040805160608082018352600080835260208084018290528385018290528451928301855281835282018190529281019290925290600183108061139257506000548310155b1561139d5792915050565b6113a683611b63565b90508060400151156113b85792915050565b610f8983611cad565b60606113cc826117a2565b6113e957604051630a14c4b560e41b815260040160405180910390fd5b600d80546113f6906126b7565b15159050611407576107a682611cdb565b600d61141283611cdb565b600e60405160200161142693929190612495565b6040516020818303038152906040529050919050565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6008546001600160a01b031633146114945760405162461bcd60e51b815260040161097f906125ba565b600c5460ff16156114d75760405162461bcd60e51b815260206004820152600d60248201526c73616c65206973206f70656e2160981b604482015260640161097f565b82811461151d5760405162461bcd60e51b81526020600482015260146024820152736d69736d61746368696e67206c656e677468732160601b604482015260640161097f565b60005b838110156115985782828281811061153a5761153a612723565b90506020020135600b600087878581811061155757611557612723565b905060200201602081019061156c9190612038565b6001600160a01b0316815260208101919091526040016000205580611590816126f2565b915050611520565b5050505050565b6008546001600160a01b031633146115c95760405162461bcd60e51b815260040161097f906125ba565b600c5460ff161561160c5760405162461bcd60e51b815260206004820152600d60248201526c73616c65206973206f70656e2160981b604482015260640161097f565b8281146116525760405162461bcd60e51b81526020600482015260146024820152736d69736d61746368696e67206c656e677468732160601b604482015260640161097f565b60005b838110156116b7576116a585858381811061167257611672612723565b90506020020160208101906116879190612038565b84848481811061169957611699612723565b90506020020135611b98565b806116af816126f2565b915050611655565b506115b36116c86000546000190190565b11156113465760405162461bcd60e51b8152602060048201526011602482015270457863656564204d41585f535550504c5960781b604482015260640161097f565b6008546001600160a01b031633146117345760405162461bcd60e51b815260040161097f906125ba565b6001600160a01b0381166117995760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161097f565b610a4481611b11565b6000816001111580156117b6575060005482105b80156107a6575050600090815260046020526040902054600160e01b161590565b600081806001116118275760005481101561182757600081815260046020526040902054600160e01b8116611825575b80610f89575060001901600081815260046020526040902054611807565b505b604051636f96cda160e11b815260040160405180910390fd5b600061184b826117d7565b9050836001600160a01b0316816001600160a01b03161461187e5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061189c575061189c853361143c565b806118b75750336118ac8461083e565b6001600160a01b0316145b9050806118d757604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0384166118fe57604051633a954ecd60e21b815260040160405180910390fd5b600083815260066020908152604080832080546001600160a01b03191690556001600160a01b038881168452600583528184208054600019019055871683528083208054600101905585835260049091529020600160e11b4260a01b86178117909155821661199b57600183016000818152600460205260409020546119995760005481146119995760008181526004602052604090208390555b505b82846001600160a01b0316866001600160a01b031660008051602061276683398151915260405160405180910390a4611598565b60006119da836117d7565b9050808215611a3e576000336001600160a01b0383161480611a015750611a01823361143c565b80611a1c575033611a118661083e565b6001600160a01b0316145b905080611a3c57604051632ce44b5f60e11b815260040160405180910390fd5b505b600084815260066020908152604080832080546001600160a01b03191690556001600160a01b03841683526005825280832080546fffffffffffffffffffffffffffffffff01905586835260049091529020600360e01b4260a01b8317179055600160e11b8216611add5760018401600081815260046020526040902054611adb576000548114611adb5760008181526004602052604090208390555b505b60405184906000906001600160a01b03841690600080516020612766833981519152908390a4505060018054810190555050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60408051606081018252600080825260208201819052918101919091526000828152600460205260409020546107a690611d2a565b611bb2828260405180602001604052806000815250611d64565b5050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611beb9033908990889088906004016124c8565b602060405180830381600087803b158015611c0557600080fd5b505af1925050508015611c35575060408051601f3d908101601f19168201909252611c3291810190612313565b60015b611c90573d808015611c63576040519150601f19603f3d011682016040523d82523d6000602084013e611c68565b606091505b508051611c88576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60408051606081018252600080825260208201819052918101919091526107a6611cd6836117d7565b611d2a565b604080516080810191829052607f0190826030600a8206018353600a90045b8015611d1857600183039250600a81066030018353600a9004611cfa565b50819003601f19909101908152919050565b604080516060810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b90921615159082015290565b6000546001600160a01b038416611d8d57604051622e076360e81b815260040160405180910390fd5b82611dab5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15611e6e575b60405182906001600160a01b03881690600090600080516020612766833981519152908290a4611e376000878480600101955087611bb6565b611e54576040516368d2bf6b60e11b815260040160405180910390fd5b808210611dfe578260005414611e6957600080fd5b611ea1565b5b6040516001830192906001600160a01b03881690600090600080516020612766833981519152908290a4808210611e6f575b5060009081556113469085838684565b828054611ebd906126b7565b90600052602060002090601f016020900481019282611edf5760008555611f25565b82601f10611ef857805160ff1916838001178555611f25565b82800160010185558215611f25579182015b82811115611f25578251825591602001919060010190611f0a565b50611f31929150611f35565b5090565b5b80821115611f315760008155600101611f36565b60006001600160401b03831115611f6357611f63612739565b611f76601f8401601f1916602001612624565b9050828152838383011115611f8a57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114611fb857600080fd5b919050565b60008083601f840112611fcf57600080fd5b5081356001600160401b03811115611fe657600080fd5b6020830191508360208260051b850101111561200157600080fd5b9250929050565b80358015158114611fb857600080fd5b600082601f83011261202957600080fd5b610f8983833560208501611f4a565b60006020828403121561204a57600080fd5b610f8982611fa1565b6000806040838503121561206657600080fd5b61206f83611fa1565b915061207d60208401611fa1565b90509250929050565b60008060006060848603121561209b57600080fd5b6120a484611fa1565b92506120b260208501611fa1565b9150604084013590509250925092565b600080600080608085870312156120d857600080fd5b6120e185611fa1565b93506120ef60208601611fa1565b92506040850135915060608501356001600160401b0381111561211157600080fd5b8501601f8101871361212257600080fd5b61213187823560208401611f4a565b91505092959194509250565b6000806040838503121561215057600080fd5b61215983611fa1565b915061207d60208401612008565b6000806040838503121561217a57600080fd5b61218383611fa1565b946020939093013593505050565b6000806000606084860312156121a657600080fd5b6121af84611fa1565b95602085013595506040909401359392505050565b600080600080604085870312156121da57600080fd5b84356001600160401b03808211156121f157600080fd5b6121fd88838901611fbd565b9096509450602087013591508082111561221657600080fd5b5061222387828801611fbd565b95989497509550505050565b6000602080838503121561224257600080fd5b82356001600160401b038082111561225957600080fd5b818501915085601f83011261226d57600080fd5b81358181111561227f5761227f612739565b8060051b9150612290848301612624565b8181528481019084860184860187018a10156122ab57600080fd5b600095505b838610156122ce5780358352600195909501949186019186016122b0565b5098975050505050505050565b6000602082840312156122ed57600080fd5b610f8982612008565b60006020828403121561230857600080fd5b8135610f898161274f565b60006020828403121561232557600080fd5b8151610f898161274f565b6000806040838503121561234357600080fd5b82356001600160401b038082111561235a57600080fd5b61236686838701612018565b9350602085013591508082111561237c57600080fd5b5061238985828601612018565b9150509250929050565b6000602082840312156123a557600080fd5b5035919050565b6000602082840312156123be57600080fd5b813560ff81168114610f8957600080fd5b600081518084526123e781602086016020860161268b565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061241557607f831692505b602080841082141561243757634e487b7160e01b600052602260045260246000fd5b81801561244b576001811461245c57612489565b60ff19861689528489019650612489565b60008881526020902060005b868110156124815781548b820152908501908301612468565b505084890196505b50505050505092915050565b60006124a182866123fb565b84516124b181836020890161268b565b6124bd818301866123fb565b979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906124fb908301846123cf565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610dea5761255c83855180516001600160a01b031682526020808201516001600160401b0316908301526040908101511515910152565b9284019260609290920191600101612521565b6020808252825182820181905260009190848201906040850190845b81811015610dea5783518352928401929184019160010161258b565b602081526000610f8960208301846123cf565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b81516001600160a01b031681526020808301516001600160401b031690820152604080830151151590820152606081016107a6565b604051601f8201601f191681016001600160401b038111828210171561264c5761264c612739565b604052919050565b600082198211156126675761266761270d565b500190565b60008160001904831182151516156126865761268661270d565b500290565b60005b838110156126a657818101518382015260200161268e565b838111156113465750506000910152565b600181811c908216806126cb57607f821691505b602082108114156126ec57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127065761270661270d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610a4457600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122076e3dde664c2b14a056137ed2c1d5804de062d021e5aae1cb0805bb0efbe3b4664736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000054e6f6f627300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054e4f4f4253000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b68747470733a2f2f6e6f3062732e7774662f6170692f6d6574612f00000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061023b5760003560e01c80636790a9de1161012e578063a22cb465116100ab578063c87b56dd1161006f578063c87b56dd146106ba578063e985e9c5146106da578063f013e0e1146106fa578063f09a03c01461071a578063f2fde38b1461073a57600080fd5b8063a22cb46514610621578063b88d4fde14610641578063b974f63314610661578063c002d23d14610677578063c23dc68f1461068d57600080fd5b80638da5cb5b116100f25780638da5cb5b1461059c5780639434b805146105ba57806395d89b41146105d957806399a2557a146105ee578063a0712d681461060e57600080fd5b80636790a9de146105055780636c0360eb1461052557806370a082311461053a578063715018a61461055a5780638462151c1461056f57600080fd5b806334ecc70a116101bc5780635503a0e8116101805780635503a0e8146104575780635a67de071461046c5780635bbb21771461048c578063603f4d52146104b95780636352211e146104e557600080fd5b806334ecc70a146103bf5780633ccfd60b146103d557806342842e0e146103ea57806342966c681461040a5780634a81d9dd1461042a57600080fd5b806317d985141161020357806317d985141461032c57806318160ddd1461034c57806323b872dd146103695780632e0674211461038957806332cb6b0c146103a957600080fd5b806301ffc9a71461024057806306fdde0314610275578063081812fc14610297578063095ea7b3146102cf5780630d758111146102f1575b600080fd5b34801561024c57600080fd5b5061026061025b3660046122f6565b61075a565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061028a6107ac565b60405161026c91906125a7565b3480156102a357600080fd5b506102b76102b2366004612393565b61083e565b6040516001600160a01b03909116815260200161026c565b3480156102db57600080fd5b506102ef6102ea366004612167565b610882565b005b3480156102fd57600080fd5b5061031e61030c366004612038565b600a6020526000908152604090205481565b60405190815260200161026c565b34801561033857600080fd5b506102ef6103473660046122db565b610955565b34801561035857600080fd5b50600154600054036000190161031e565b34801561037557600080fd5b506102ef610384366004612086565b6109a2565b34801561039557600080fd5b506102ef6103a4366004612393565b6109b2565b3480156103b557600080fd5b5061031e6115b381565b3480156103cb57600080fd5b5061031e60095481565b3480156103e157600080fd5b506102ef6109e1565b3480156103f657600080fd5b506102ef610405366004612086565b610a47565b34801561041657600080fd5b506102ef610425366004612393565b610a62565b34801561043657600080fd5b5061031e610445366004612038565b600b6020526000908152604090205481565b34801561046357600080fd5b5061028a610a6d565b34801561047857600080fd5b506102ef6104873660046123ac565b610afb565b34801561049857600080fd5b506104ac6104a736600461222f565b610b3b565b60405161026c9190612505565b3480156104c557600080fd5b50600c546104d39060ff1681565b60405160ff909116815260200161026c565b3480156104f157600080fd5b506102b7610500366004612393565b610c01565b34801561051157600080fd5b506102ef610520366004612330565b610c0c565b34801561053157600080fd5b5061028a610c5d565b34801561054657600080fd5b5061031e610555366004612038565b610c6a565b34801561056657600080fd5b506102ef610cb8565b34801561057b57600080fd5b5061058f61058a366004612038565b610cee565b60405161026c919061256f565b3480156105a857600080fd5b506008546001600160a01b03166102b7565b3480156105c657600080fd5b50600c5461026090610100900460ff1681565b3480156105e557600080fd5b5061028a610df6565b3480156105fa57600080fd5b5061058f610609366004612191565b610e05565b6102ef61061c366004612393565b610f90565b34801561062d57600080fd5b506102ef61063c36600461213d565b61126c565b34801561064d57600080fd5b506102ef61065c3660046120c2565b611302565b34801561066d57600080fd5b5061031e60105481565b34801561068357600080fd5b5061031e600f5481565b34801561069957600080fd5b506106ad6106a8366004612393565b61134c565b60405161026c91906125ef565b3480156106c657600080fd5b5061028a6106d5366004612393565b6113c1565b3480156106e657600080fd5b506102606106f5366004612053565b61143c565b34801561070657600080fd5b506102ef6107153660046121c4565b61146a565b34801561072657600080fd5b506102ef6107353660046121c4565b61159f565b34801561074657600080fd5b506102ef610755366004612038565b61170a565b60006301ffc9a760e01b6001600160e01b03198316148061078b57506380ac58cd60e01b6001600160e01b03198316145b806107a65750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546107bb906126b7565b80601f01602080910402602001604051908101604052809291908181526020018280546107e7906126b7565b80156108345780601f1061080957610100808354040283529160200191610834565b820191906000526020600020905b81548152906001019060200180831161081757829003601f168201915b5050505050905090565b6000610849826117a2565b610866576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061088d826117d7565b9050806001600160a01b0316836001600160a01b031614156108c25760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216146108f9576108dc813361143c565b6108f9576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b031633146109885760405162461bcd60e51b815260040161097f906125ba565b60405180910390fd5b600c80549115156101000261ff0019909216919091179055565b6109ad838383611840565b505050565b6008546001600160a01b031633146109dc5760405162461bcd60e51b815260040161097f906125ba565b600955565b6008546001600160a01b03163314610a0b5760405162461bcd60e51b815260040161097f906125ba565b6008546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610a44573d6000803e3d6000fd5b50565b6109ad83838360405180602001604052806000815250611302565b610a448160016119cf565b600e8054610a7a906126b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa6906126b7565b8015610af35780601f10610ac857610100808354040283529160200191610af3565b820191906000526020600020905b815481529060010190602001808311610ad657829003601f168201915b505050505081565b6008546001600160a01b03163314610b255760405162461bcd60e51b815260040161097f906125ba565b600c805460ff191660ff92909216919091179055565b80516060906000816001600160401b03811115610b5a57610b5a612739565b604051908082528060200260200182016040528015610ba557816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181610b785790505b50905060005b828114610bf957610bd4858281518110610bc757610bc7612723565b602002602001015161134c565b828281518110610be657610be6612723565b6020908102919091010152600101610bab565b509392505050565b60006107a6826117d7565b6008546001600160a01b03163314610c365760405162461bcd60e51b815260040161097f906125ba565b8151610c4990600d906020850190611eb1565b5080516109ad90600e906020840190611eb1565b600d8054610a7a906126b7565b60006001600160a01b038216610c93576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b03163314610ce25760405162461bcd60e51b815260040161097f906125ba565b610cec6000611b11565b565b60606000806000610cfe85610c6a565b90506000816001600160401b03811115610d1a57610d1a612739565b604051908082528060200260200182016040528015610d43578160200160208202803683370190505b509050610d69604080516060810182526000808252602082018190529181019190915290565b60015b838614610dea57610d7c81611b63565b9150816040015115610d8d57610de2565b81516001600160a01b031615610da257815194505b876001600160a01b0316856001600160a01b03161415610de25780838780600101985081518110610dd557610dd5612723565b6020026020010181815250505b600101610d6c565b50909695505050505050565b6060600380546107bb906126b7565b6060818310610e2757604051631960ccad60e11b815260040160405180910390fd5b600080610e3360005490565b90506001851015610e4357600194505b80841115610e4f578093505b6000610e5a87610c6a565b905084861015610e795785850381811015610e73578091505b50610e7d565b5060005b6000816001600160401b03811115610e9757610e97612739565b604051908082528060200260200182016040528015610ec0578160200160208202803683370190505b50905081610ed3579350610f8992505050565b6000610ede8861134c565b905060008160400151610eef575080515b885b888114158015610f015750848714155b15610f7d57610f0f81611b63565b9250826040015115610f2057610f75565b82516001600160a01b031615610f3557825191505b8a6001600160a01b0316826001600160a01b03161415610f755780848880600101995081518110610f6857610f68612723565b6020026020010181815250505b600101610ef1565b50505092835250909150505b9392505050565b600c5460ff16610fd25760405162461bcd60e51b815260206004820152600d60248201526c10d85b9d081b5a5b9d081e595d609a1b604482015260640161097f565b33321461100f5760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b604482015260640161097f565b6115b361101f6000546000190190565b6110299083612654565b111561106b5760405162461bcd60e51b8152602060048201526011602482015270457863656564204d41585f535550504c5960781b604482015260640161097f565b600081116110af5760405162461bcd60e51b81526020600482015260116024820152700416d6f756e742063616e2774206265203607c1b604482015260640161097f565b600c5460ff166001141561116e57336000908152600b6020908152604080832054600a909252909120546110e39083612654565b111561113f5760405162461bcd60e51b815260206004820152602560248201527f4578636565642077686974656c697374206d696e7420666f7220746869732077604482015264185b1b195d60da1b606482015260840161097f565b336000908152600a60205260408120805483929061115e908490612654565b90915550610a4490503382611b98565b600c5460ff1660021415610a4457336000908152600b60205260409020546009546111999190612654565b336000908152600a60205260409020546111b39083612654565b11156111f65760405162461bcd60e51b8152602060048201526012602482015271115e18d95959081b585e109e55d85b1b195d60721b604482015260640161097f565b600c54610100900460ff161561113f5760005460001901601054101561113f5734600f5482611225919061266c565b111561113f5760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081c185e5b595b9d08185b5bdd5b9d60521b604482015260640161097f565b6001600160a01b0382163314156112965760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61130d848484611840565b6001600160a01b0383163b156113465761132984848484611bb6565b611346576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6040805160608082018352600080835260208084018290528385018290528451928301855281835282018190529281019290925290600183108061139257506000548310155b1561139d5792915050565b6113a683611b63565b90508060400151156113b85792915050565b610f8983611cad565b60606113cc826117a2565b6113e957604051630a14c4b560e41b815260040160405180910390fd5b600d80546113f6906126b7565b15159050611407576107a682611cdb565b600d61141283611cdb565b600e60405160200161142693929190612495565b6040516020818303038152906040529050919050565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6008546001600160a01b031633146114945760405162461bcd60e51b815260040161097f906125ba565b600c5460ff16156114d75760405162461bcd60e51b815260206004820152600d60248201526c73616c65206973206f70656e2160981b604482015260640161097f565b82811461151d5760405162461bcd60e51b81526020600482015260146024820152736d69736d61746368696e67206c656e677468732160601b604482015260640161097f565b60005b838110156115985782828281811061153a5761153a612723565b90506020020135600b600087878581811061155757611557612723565b905060200201602081019061156c9190612038565b6001600160a01b0316815260208101919091526040016000205580611590816126f2565b915050611520565b5050505050565b6008546001600160a01b031633146115c95760405162461bcd60e51b815260040161097f906125ba565b600c5460ff161561160c5760405162461bcd60e51b815260206004820152600d60248201526c73616c65206973206f70656e2160981b604482015260640161097f565b8281146116525760405162461bcd60e51b81526020600482015260146024820152736d69736d61746368696e67206c656e677468732160601b604482015260640161097f565b60005b838110156116b7576116a585858381811061167257611672612723565b90506020020160208101906116879190612038565b84848481811061169957611699612723565b90506020020135611b98565b806116af816126f2565b915050611655565b506115b36116c86000546000190190565b11156113465760405162461bcd60e51b8152602060048201526011602482015270457863656564204d41585f535550504c5960781b604482015260640161097f565b6008546001600160a01b031633146117345760405162461bcd60e51b815260040161097f906125ba565b6001600160a01b0381166117995760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161097f565b610a4481611b11565b6000816001111580156117b6575060005482105b80156107a6575050600090815260046020526040902054600160e01b161590565b600081806001116118275760005481101561182757600081815260046020526040902054600160e01b8116611825575b80610f89575060001901600081815260046020526040902054611807565b505b604051636f96cda160e11b815260040160405180910390fd5b600061184b826117d7565b9050836001600160a01b0316816001600160a01b03161461187e5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061189c575061189c853361143c565b806118b75750336118ac8461083e565b6001600160a01b0316145b9050806118d757604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0384166118fe57604051633a954ecd60e21b815260040160405180910390fd5b600083815260066020908152604080832080546001600160a01b03191690556001600160a01b038881168452600583528184208054600019019055871683528083208054600101905585835260049091529020600160e11b4260a01b86178117909155821661199b57600183016000818152600460205260409020546119995760005481146119995760008181526004602052604090208390555b505b82846001600160a01b0316866001600160a01b031660008051602061276683398151915260405160405180910390a4611598565b60006119da836117d7565b9050808215611a3e576000336001600160a01b0383161480611a015750611a01823361143c565b80611a1c575033611a118661083e565b6001600160a01b0316145b905080611a3c57604051632ce44b5f60e11b815260040160405180910390fd5b505b600084815260066020908152604080832080546001600160a01b03191690556001600160a01b03841683526005825280832080546fffffffffffffffffffffffffffffffff01905586835260049091529020600360e01b4260a01b8317179055600160e11b8216611add5760018401600081815260046020526040902054611adb576000548114611adb5760008181526004602052604090208390555b505b60405184906000906001600160a01b03841690600080516020612766833981519152908390a4505060018054810190555050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60408051606081018252600080825260208201819052918101919091526000828152600460205260409020546107a690611d2a565b611bb2828260405180602001604052806000815250611d64565b5050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611beb9033908990889088906004016124c8565b602060405180830381600087803b158015611c0557600080fd5b505af1925050508015611c35575060408051601f3d908101601f19168201909252611c3291810190612313565b60015b611c90573d808015611c63576040519150601f19603f3d011682016040523d82523d6000602084013e611c68565b606091505b508051611c88576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60408051606081018252600080825260208201819052918101919091526107a6611cd6836117d7565b611d2a565b604080516080810191829052607f0190826030600a8206018353600a90045b8015611d1857600183039250600a81066030018353600a9004611cfa565b50819003601f19909101908152919050565b604080516060810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b90921615159082015290565b6000546001600160a01b038416611d8d57604051622e076360e81b815260040160405180910390fd5b82611dab5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15611e6e575b60405182906001600160a01b03881690600090600080516020612766833981519152908290a4611e376000878480600101955087611bb6565b611e54576040516368d2bf6b60e11b815260040160405180910390fd5b808210611dfe578260005414611e6957600080fd5b611ea1565b5b6040516001830192906001600160a01b03881690600090600080516020612766833981519152908290a4808210611e6f575b5060009081556113469085838684565b828054611ebd906126b7565b90600052602060002090601f016020900481019282611edf5760008555611f25565b82601f10611ef857805160ff1916838001178555611f25565b82800160010185558215611f25579182015b82811115611f25578251825591602001919060010190611f0a565b50611f31929150611f35565b5090565b5b80821115611f315760008155600101611f36565b60006001600160401b03831115611f6357611f63612739565b611f76601f8401601f1916602001612624565b9050828152838383011115611f8a57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114611fb857600080fd5b919050565b60008083601f840112611fcf57600080fd5b5081356001600160401b03811115611fe657600080fd5b6020830191508360208260051b850101111561200157600080fd5b9250929050565b80358015158114611fb857600080fd5b600082601f83011261202957600080fd5b610f8983833560208501611f4a565b60006020828403121561204a57600080fd5b610f8982611fa1565b6000806040838503121561206657600080fd5b61206f83611fa1565b915061207d60208401611fa1565b90509250929050565b60008060006060848603121561209b57600080fd5b6120a484611fa1565b92506120b260208501611fa1565b9150604084013590509250925092565b600080600080608085870312156120d857600080fd5b6120e185611fa1565b93506120ef60208601611fa1565b92506040850135915060608501356001600160401b0381111561211157600080fd5b8501601f8101871361212257600080fd5b61213187823560208401611f4a565b91505092959194509250565b6000806040838503121561215057600080fd5b61215983611fa1565b915061207d60208401612008565b6000806040838503121561217a57600080fd5b61218383611fa1565b946020939093013593505050565b6000806000606084860312156121a657600080fd5b6121af84611fa1565b95602085013595506040909401359392505050565b600080600080604085870312156121da57600080fd5b84356001600160401b03808211156121f157600080fd5b6121fd88838901611fbd565b9096509450602087013591508082111561221657600080fd5b5061222387828801611fbd565b95989497509550505050565b6000602080838503121561224257600080fd5b82356001600160401b038082111561225957600080fd5b818501915085601f83011261226d57600080fd5b81358181111561227f5761227f612739565b8060051b9150612290848301612624565b8181528481019084860184860187018a10156122ab57600080fd5b600095505b838610156122ce5780358352600195909501949186019186016122b0565b5098975050505050505050565b6000602082840312156122ed57600080fd5b610f8982612008565b60006020828403121561230857600080fd5b8135610f898161274f565b60006020828403121561232557600080fd5b8151610f898161274f565b6000806040838503121561234357600080fd5b82356001600160401b038082111561235a57600080fd5b61236686838701612018565b9350602085013591508082111561237c57600080fd5b5061238985828601612018565b9150509250929050565b6000602082840312156123a557600080fd5b5035919050565b6000602082840312156123be57600080fd5b813560ff81168114610f8957600080fd5b600081518084526123e781602086016020860161268b565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061241557607f831692505b602080841082141561243757634e487b7160e01b600052602260045260246000fd5b81801561244b576001811461245c57612489565b60ff19861689528489019650612489565b60008881526020902060005b868110156124815781548b820152908501908301612468565b505084890196505b50505050505092915050565b60006124a182866123fb565b84516124b181836020890161268b565b6124bd818301866123fb565b979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906124fb908301846123cf565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610dea5761255c83855180516001600160a01b031682526020808201516001600160401b0316908301526040908101511515910152565b9284019260609290920191600101612521565b6020808252825182820181905260009190848201906040850190845b81811015610dea5783518352928401929184019160010161258b565b602081526000610f8960208301846123cf565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b81516001600160a01b031681526020808301516001600160401b031690820152604080830151151590820152606081016107a6565b604051601f8201601f191681016001600160401b038111828210171561264c5761264c612739565b604052919050565b600082198211156126675761266761270d565b500190565b60008160001904831182151516156126865761268661270d565b500290565b60005b838110156126a657818101518382015260200161268e565b838111156113465750506000910152565b600181811c908216806126cb57607f821691505b602082108114156126ec57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127065761270661270d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610a4457600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122076e3dde664c2b14a056137ed2c1d5804de062d021e5aae1cb0805bb0efbe3b4664736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000054e6f6f627300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054e4f4f4253000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b68747470733a2f2f6e6f3062732e7774662f6170692f6d6574612f00000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Noobs
Arg [1] : symbol (string): NOOBS
Arg [2] : baseURI_ (string): https://no0bs.wtf/api/meta/
Arg [3] : uriSuffix_ (string):

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [5] : 4e6f6f6273000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 4e4f4f4253000000000000000000000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000001b
Arg [9] : 68747470733a2f2f6e6f3062732e7774662f6170692f6d6574612f0000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

62156:4576:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18757:612;;;;;;;;;;-1:-1:-1;18757:612:0;;;;;:::i;:::-;;:::i;:::-;;;11319:14:1;;11312:22;11294:41;;11282:2;11267:18;18757:612:0;;;;;;;;23713:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25781:204::-;;;;;;;;;;-1:-1:-1;25781:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9255:32:1;;;9237:51;;9225:2;9210:18;25781:204:0;9091:203:1;25241:474:0;;;;;;;;;;-1:-1:-1;25241:474:0;;;;;:::i;:::-;;:::i;:::-;;62365:49;;;;;;;;;;-1:-1:-1;62365:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;15921:25:1;;;15909:2;15894:18;62365:49:0;15775:177:1;65430:131:0;;;;;;;;;;-1:-1:-1;65430:131:0;;;;;:::i;:::-;;:::i;17835:303::-;;;;;;;;;;-1:-1:-1;64305:1:0;18093:12;17888:7;18077:13;:28;-1:-1:-1;;18077:46:0;17835:303;;26667:170;;;;;;;;;;-1:-1:-1;26667:170:0;;;;;:::i;:::-;;:::i;65652:114::-;;;;;;;;;;-1:-1:-1;65652:114:0;;;;;:::i;:::-;;:::i;62278:41::-;;;;;;;;;;;;62315:4;62278:41;;62328:30;;;;;;;;;;;;;;;;66623:106;;;;;;;;;;;;;:::i;26908:185::-;;;;;;;;;;-1:-1:-1;26908:185:0;;;;;:::i;:::-;;:::i;43790:94::-;;;;;;;;;;-1:-1:-1;43790:94:0;;;;;:::i;:::-;;:::i;62421:50::-;;;;;;;;;;-1:-1:-1;62421:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;62660:23;;;;;;;;;;;;;:::i;65215:104::-;;;;;;;;;;-1:-1:-1;65215:104:0;;;;;:::i;:::-;;:::i;45290:436::-;;;;;;;;;;-1:-1:-1;45290:436:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;62519:26::-;;;;;;;;;;-1:-1:-1;62519:26:0;;;;;;;;;;;16129:4:1;16117:17;;;16099:36;;16087:2;16072:18;62519:26:0;15957:184:1;23502:144:0;;;;;;;;;;-1:-1:-1;23502:144:0;;;;;:::i;:::-;;:::i;64963:167::-;;;;;;;;;;-1:-1:-1;64963:167:0;;;;;:::i;:::-;;:::i;62613:21::-;;;;;;;;;;;;;:::i;19433:224::-;;;;;;;;;;-1:-1:-1;19433:224:0;;;;;:::i;:::-;;:::i;13028:103::-;;;;;;;;;;;;;:::i;48854:812::-;;;;;;;;;;-1:-1:-1;48854:812:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;12377:87::-;;;;;;;;;;-1:-1:-1;12450:6:0;;-1:-1:-1;;;;;12450:6:0;12377:87;;62554:35;;;;;;;;;;-1:-1:-1;62554:35:0;;;;;;;;;;;23882:104;;;;;;;;;;;;;:::i;46116:2289::-;;;;;;;;;;-1:-1:-1;46116:2289:0;;;;;:::i;:::-;;:::i;63086:1058::-;;;;;;:::i;:::-;;:::i;26057:308::-;;;;;;;;;;-1:-1:-1;26057:308:0;;;;;:::i;:::-;;:::i;27164:396::-;;;;;;;;;;-1:-1:-1;27164:396:0;;;;;:::i;:::-;;:::i;62983:36::-;;;;;;;;;;;;;;;;62939:37;;;;;;;;;;;;;;;;44711:420;;;;;;;;;;-1:-1:-1;44711:420:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;64438:346::-;;;;;;;;;;-1:-1:-1;64438:346:0;;;;;:::i;:::-;;:::i;26436:164::-;;;;;;;;;;-1:-1:-1;26436:164:0;;;;;:::i;:::-;;:::i;66259:354::-;;;;;;;;;;-1:-1:-1;66259:354:0;;;;;:::i;:::-;;:::i;65836:415::-;;;;;;;;;;-1:-1:-1;65836:415:0;;;;;:::i;:::-;;:::i;13286:201::-;;;;;;;;;;-1:-1:-1;13286:201:0;;;;;:::i;:::-;;:::i;18757:612::-;18842:4;-1:-1:-1;;;;;;;;;19138:25:0;;;;:98;;-1:-1:-1;;;;;;;;;;19211:25:0;;;19138:98;:171;;;-1:-1:-1;;;;;;;;;;19284:25:0;;;19138:171;19122:187;18757:612;-1:-1:-1;;18757:612:0:o;23713:100::-;23767:13;23800:5;23793:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23713:100;:::o;25781:204::-;25849:7;25874:16;25882:7;25874;:16::i;:::-;25869:64;;25899:34;;-1:-1:-1;;;25899:34:0;;;;;;;;;;;25869:64;-1:-1:-1;25953:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25953:24:0;;25781:204::o;25241:474::-;25314:13;25346:27;25365:7;25346:18;:27::i;:::-;25314:61;;25396:5;-1:-1:-1;;;;;25390:11:0;:2;-1:-1:-1;;;;;25390:11:0;;25386:48;;;25410:24;;-1:-1:-1;;;25410:24:0;;;;;;;;;;;25386:48;41397:10;-1:-1:-1;;;;;25451:28:0;;;25447:175;;25499:44;25516:5;41397:10;26436:164;:::i;25499:44::-;25494:128;;25571:35;;-1:-1:-1;;;25571:35:0;;;;;;;;;;;25494:128;25634:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;25634:29:0;-1:-1:-1;;;;;25634:29:0;;;;;;;;;25679:28;;25634:24;;25679:28;;;;;;;25303:412;25241:474;;:::o;65430:131::-;12450:6;;-1:-1:-1;;;;;12450:6:0;41397:10;12597:23;12589:68;;;;-1:-1:-1;;;12589:68:0;;;;;;;:::i;:::-;;;;;;;;;65515:16:::1;:38:::0;;;::::1;;;;-1:-1:-1::0;;65515:38:0;;::::1;::::0;;;::::1;::::0;;65430:131::o;26667:170::-;26801:28;26811:4;26817:2;26821:7;26801:9;:28::i;:::-;26667:170;;;:::o;65652:114::-;12450:6;;-1:-1:-1;;;;;12450:6:0;41397:10;12597:23;12589:68;;;;-1:-1:-1;;;12589:68:0;;;;;;;:::i;:::-;65730:11:::1;:28:::0;65652:114::o;66623:106::-;12450:6;;-1:-1:-1;;;;;12450:6:0;41397:10;12597:23;12589:68;;;;-1:-1:-1;;;12589:68:0;;;;;;;:::i;:::-;12450:6;;66673:48:::1;::::0;-1:-1:-1;;;;;12450:6:0;;;;66699:21:::1;66673:48:::0;::::1;;;::::0;::::1;::::0;;;66699:21;12450:6;66673:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;66623:106::o:0;26908:185::-;27046:39;27063:4;27069:2;27073:7;27046:39;;;;;;;;;;;;:16;:39::i;43790:94::-;43856:20;43862:7;43871:4;43856:5;:20::i;62660:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;65215:104::-;12450:6;;-1:-1:-1;;;;;12450:6:0;41397:10;12597:23;12589:68;;;;-1:-1:-1;;;12589:68:0;;;;;;;:::i;:::-;65287:9:::1;:24:::0;;-1:-1:-1;;65287:24:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;65215:104::o;45290:436::-;45457:15;;45379:23;;45432:22;45457:15;-1:-1:-1;;;;;45520:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;45520:36:0;;-1:-1:-1;;45520:36:0;;;;;;;;;;;;45483:73;;45572:9;45567:117;45588:14;45583:1;:19;45567:117;;45640:32;45660:8;45669:1;45660:11;;;;;;;;:::i;:::-;;;;;;;45640:19;:32::i;:::-;45624:10;45635:1;45624:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;45604:3;;45567:117;;;-1:-1:-1;45701:10:0;45290:436;-1:-1:-1;;;45290:436:0:o;23502:144::-;23566:7;23609:27;23628:7;23609:18;:27::i;64963:167::-;12450:6;;-1:-1:-1;;;;;12450:6:0;41397:10;12597:23;12589:68;;;;-1:-1:-1;;;12589:68:0;;;;;;;:::i;:::-;65067:20;;::::1;::::0;:7:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;65098:24:0;;::::1;::::0;:9:::1;::::0;:24:::1;::::0;::::1;::::0;::::1;:::i;62613:21::-:0;;;;;;;:::i;19433:224::-;19497:7;-1:-1:-1;;;;;19521:19:0;;19517:60;;19549:28;;-1:-1:-1;;;19549:28:0;;;;;;;;;;;19517:60;-1:-1:-1;;;;;;19595:25:0;;;;;:18;:25;;;;;;-1:-1:-1;;;;;19595:54:0;;19433:224::o;13028:103::-;12450:6;;-1:-1:-1;;;;;12450:6:0;41397:10;12597:23;12589:68;;;;-1:-1:-1;;;12589:68:0;;;;;;;:::i;:::-;13093:30:::1;13120:1;13093:18;:30::i;:::-;13028:103::o:0;48854:812::-;48924:16;48970:19;49000:25;49036:22;49061:16;49071:5;49061:9;:16::i;:::-;49036:41;;49088:25;49130:14;-1:-1:-1;;;;;49116:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49116:29:0;;49088:57;;49156:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;49156:31:0;64305:1;49198:428;49247:14;49232:11;:29;49198:428;;49295:15;49308:1;49295:12;:15::i;:::-;49283:27;;49329:9;:16;;;49325:65;;;49366:8;;49325:65;49408:14;;-1:-1:-1;;;;;49408:28:0;;49404:103;;49477:14;;;-1:-1:-1;49404:103:0;49546:5;-1:-1:-1;;;;;49525:26:0;:17;-1:-1:-1;;;;;49525:26:0;;49521:94;;;49598:1;49572:8;49581:13;;;;;;49572:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;49521:94;49263:3;;49198:428;;;-1:-1:-1;49643:8:0;;48854:812;-1:-1:-1;;;;;;48854:812:0:o;23882:104::-;23938:13;23971:7;23964:14;;;;;:::i;46116:2289::-;46251:16;46310:4;46301:5;:13;46297:45;;46323:19;;-1:-1:-1;;;46323:19:0;;;;;;;;;;;46297:45;46353:19;46383:17;46403:14;17577:7;17604:13;;17530:95;46403:14;46383:34;-1:-1:-1;64305:1:0;46487:5;:23;46483:79;;;64305:1;46527:23;;46483:79;46630:9;46623:4;:16;46619:65;;;46663:9;46656:16;;46619:65;46694:25;46722:16;46732:5;46722:9;:16::i;:::-;46694:44;;46904:4;46896:5;:12;46892:250;;;46947:12;;;46978:31;;;46974:103;;;47050:11;47030:31;;46974:103;46910:178;46892:250;;;-1:-1:-1;47129:1:0;46892:250;47152:25;47194:17;-1:-1:-1;;;;;47180:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47180:32:0;-1:-1:-1;47152:60:0;-1:-1:-1;47227:22:0;47223:70;;47273:8;-1:-1:-1;47266:15:0;;-1:-1:-1;;;47266:15:0;47223:70;47425:31;47459:26;47479:5;47459:19;:26::i;:::-;47425:60;;47496:25;47729:9;:16;;;47724:84;;-1:-1:-1;47782:14:0;;47724:84;47835:5;47818:434;47847:4;47842:1;:9;;:45;;;;;47870:17;47855:11;:32;;47842:45;47818:434;;;47921:15;47934:1;47921:12;:15::i;:::-;47909:27;;47955:9;:16;;;47951:65;;;47992:8;;47951:65;48034:14;;-1:-1:-1;;;;;48034:28:0;;48030:103;;48103:14;;;-1:-1:-1;48030:103:0;48172:5;-1:-1:-1;;;;;48151:26:0;:17;-1:-1:-1;;;;;48151:26:0;;48147:94;;;48224:1;48198:8;48207:13;;;;;;48198:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;48147:94;47889:3;;47818:434;;;-1:-1:-1;;;48325:29:0;;;-1:-1:-1;48332:8:0;;-1:-1:-1;;46116:2289:0;;;;;;:::o;63086:1058::-;63152:9;;;;63144:40;;;;-1:-1:-1;;;63144:40:0;;13908:2:1;63144:40:0;;;13890:21:1;13947:2;13927:18;;;13920:30;-1:-1:-1;;;13966:18:1;;;13959:43;14019:18;;63144:40:0;13706:337:1;63144:40:0;63203:10;63217:9;63203:23;63195:47;;;;-1:-1:-1;;;63195:47:0;;13568:2:1;63195:47:0;;;13550:21:1;13607:2;13587:18;;;13580:30;-1:-1:-1;;;13626:18:1;;;13619:41;13677:18;;63195:47:0;13366:335:1;63195:47:0;62315:4;63270:14;18283:7;18463:13;-1:-1:-1;;18463:31:0;;18236:273;63270:14;63261:23;;:6;:23;:::i;:::-;:38;;63253:68;;;;-1:-1:-1;;;63253:68:0;;15363:2:1;63253:68:0;;;15345:21:1;15402:2;15382:18;;;15375:30;-1:-1:-1;;;15421:18:1;;;15414:47;15478:18;;63253:68:0;15161:341:1;63253:68:0;63349:1;63340:6;:10;63332:40;;;;-1:-1:-1;;;63332:40:0;;14250:2:1;63332:40:0;;;14232:21:1;14289:2;14269:18;;;14262:30;-1:-1:-1;;;14308:18:1;;;14301:47;14365:18;;63332:40:0;14048:341:1;63332:40:0;63388:9;;;;;:14;63385:752;;;63482:10;63466:27;;;;:15;:27;;;;;;;;;63436:14;:26;;;;;;;63427:35;;:6;:35;:::i;:::-;:66;;63419:116;;;;-1:-1:-1;;;63419:116:0;;14596:2:1;63419:116:0;;;14578:21:1;14635:2;14615:18;;;14608:30;14674:34;14654:18;;;14647:62;-1:-1:-1;;;14725:18:1;;;14718:35;14770:19;;63419:116:0;14394:401:1;63419:116:0;63565:10;63550:26;;;;:14;:26;;;;;:36;;63580:6;;63550:26;:36;;63580:6;;63550:36;:::i;:::-;;;;-1:-1:-1;63601:29:0;;-1:-1:-1;63611:10:0;63623:6;63601:9;:29::i;63385:752::-;63651:9;;;;63664:1;63651:14;63648:489;;;63760:10;63744:27;;;;:15;:27;;;;;;63730:11;;:41;;63744:27;63730:41;:::i;:::-;63714:10;63699:26;;;;:14;:26;;;;;;63690:35;;:6;:35;:::i;:::-;:82;;63682:113;;;;-1:-1:-1;;;63682:113:0;;12114:2:1;63682:113:0;;;12096:21:1;12153:2;12133:18;;;12126:30;-1:-1:-1;;;12172:18:1;;;12165:48;12230:18;;63682:113:0;11912:342:1;63682:113:0;63814:16;;;;;;;63810:203;;;18283:7;18463:13;-1:-1:-1;;18463:31:0;63854:15;;:32;63851:147;;;63942:9;63928:10;;63919:6;:19;;;;:::i;:::-;:32;;63911:67;;;;-1:-1:-1;;;63911:67:0;;12868:2:1;63911:67:0;;;12850:21:1;12907:2;12887:18;;;12880:30;-1:-1:-1;;;12926:18:1;;;12919:52;12988:18;;63911:67:0;12666:346:1;26057:308:0;-1:-1:-1;;;;;26156:31:0;;41397:10;26156:31;26152:61;;;26196:17;;-1:-1:-1;;;26196:17:0;;;;;;;;;;;26152:61;41397:10;26226:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;26226:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;26226:60:0;;;;;;;;;;26302:55;;11294:41:1;;;26226:49:0;;41397:10;26302:55;;11267:18:1;26302:55:0;;;;;;;26057:308;;:::o;27164:396::-;27331:28;27341:4;27347:2;27351:7;27331:9;:28::i;:::-;-1:-1:-1;;;;;27374:14:0;;;:19;27370:183;;27413:56;27444:4;27450:2;27454:7;27463:5;27413:30;:56::i;:::-;27408:145;;27497:40;;-1:-1:-1;;;27497:40:0;;;;;;;;;;;27408:145;27164:396;;;;:::o;44711:420::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64305:1:0;44867:25;;;:54;;-1:-1:-1;17577:7:0;17604:13;44896:7;:25;;44867:54;44863:103;;;44945:9;44711:420;-1:-1:-1;;44711:420:0:o;44863:103::-;44988:21;45001:7;44988:12;:21::i;:::-;44976:33;;45024:9;:16;;;45020:65;;;45064:9;44711:420;-1:-1:-1;;44711:420:0:o;45020:65::-;45102:21;45115:7;45102:12;:21::i;64438:346::-;64511:13;64542:16;64550:7;64542;:16::i;:::-;64537:59;;64567:29;;-1:-1:-1;;;64567:29:0;;;;;;;;;;;64537:59;64619:7;64613:21;;;;;:::i;:::-;:26;64609:84;;-1:-1:-1;64609:84:0;;64663:18;64673:7;64663:9;:18::i;64609:84::-;64736:7;64745:18;64755:7;64745:9;:18::i;:::-;64765:9;64719:56;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64705:71;;64438:346;;;:::o;26436:164::-;-1:-1:-1;;;;;26557:25:0;;;26533:4;26557:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26436:164::o;66259:354::-;12450:6;;-1:-1:-1;;;;;12450:6:0;41397:10;12597:23;12589:68;;;;-1:-1:-1;;;12589:68:0;;;;;;;:::i;:::-;66375:9:::1;::::0;::::1;;:14:::0;66367:40:::1;;;::::0;-1:-1:-1;;;66367:40:0;;11772:2:1;66367:40:0::1;::::0;::::1;11754:21:1::0;11811:2;11791:18;;;11784:30;-1:-1:-1;;;11830:18:1;;;11823:43;11883:18;;66367:40:0::1;11570:337:1::0;66367:40:0::1;66428:32:::0;;::::1;66420:65;;;::::0;-1:-1:-1;;;66420:65:0;;13219:2:1;66420:65:0::1;::::0;::::1;13201:21:1::0;13258:2;13238:18;;;13231:30;-1:-1:-1;;;13277:18:1;;;13270:50;13337:18;;66420:65:0::1;13017:344:1::0;66420:65:0::1;66503:9;66498:108;66514:20:::0;;::::1;66498:108;;;66586:5;;66592:1;66586:8;;;;;;;:::i;:::-;;;;;;;66556:15;:29;66572:9;;66582:1;66572:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;66556:29:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;66556:29:0;:38;66536:3;::::1;::::0;::::1;:::i;:::-;;;;66498:108;;;;66259:354:::0;;;;:::o;65836:415::-;12450:6;;-1:-1:-1;;;;;12450:6:0;41397:10;12597:23;12589:68;;;;-1:-1:-1;;;12589:68:0;;;;;;;:::i;:::-;65949:9:::1;::::0;::::1;;:14:::0;65941:40:::1;;;::::0;-1:-1:-1;;;65941:40:0;;11772:2:1;65941:40:0::1;::::0;::::1;11754:21:1::0;11811:2;11791:18;;;11784:30;-1:-1:-1;;;11830:18:1;;;11823:43;11883:18;;65941:40:0::1;11570:337:1::0;65941:40:0::1;66000:32:::0;;::::1;65992:65;;;::::0;-1:-1:-1;;;65992:65:0;;13219:2:1;65992:65:0::1;::::0;::::1;13201:21:1::0;13258:2;13238:18;;;13231:30;-1:-1:-1;;;13277:18:1;;;13270:50;13337:18;;65992:65:0::1;13017:344:1::0;65992:65:0::1;66075:9;66070:103;66086:20:::0;;::::1;66070:103;;;66128:33;66138:9;;66148:1;66138:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;66152:5;;66158:1;66152:8;;;;;;;:::i;:::-;;;;;;;66128:9;:33::i;:::-;66108:3:::0;::::1;::::0;::::1;:::i;:::-;;;;66070:103;;;;62315:4;66193:14;18283:7:::0;18463:13;-1:-1:-1;;18463:31:0;;18236:273;66193:14:::1;:28;;66185:58;;;::::0;-1:-1:-1;;;66185:58:0;;15363:2:1;66185:58:0::1;::::0;::::1;15345:21:1::0;15402:2;15382:18;;;15375:30;-1:-1:-1;;;15421:18:1;;;15414:47;15478:18;;66185:58:0::1;15161:341:1::0;13286:201:0;12450:6;;-1:-1:-1;;;;;12450:6:0;41397:10;12597:23;12589:68;;;;-1:-1:-1;;;12589:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13375:22:0;::::1;13367:73;;;::::0;-1:-1:-1;;;13367:73:0;;12461:2:1;13367:73:0::1;::::0;::::1;12443:21:1::0;12500:2;12480:18;;;12473:30;12539:34;12519:18;;;12512:62;-1:-1:-1;;;12590:18:1;;;12583:36;12636:19;;13367:73:0::1;12259:402:1::0;13367:73:0::1;13451:28;13470:8;13451:18;:28::i;27815:270::-:0;27872:4;27924:7;64305:1;27905:26;;:62;;;;;27954:13;;27944:7;:23;27905:62;:144;;;;-1:-1:-1;;28001:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;28001:43:0;:48;;27815:270::o;21070:1049::-;21137:7;21172;;64305:1;21213:23;21209:847;;21262:13;;21255:4;:20;21251:805;;;21296:14;21313:23;;;:17;:23;;;;;;-1:-1:-1;;;21394:23:0;;21390:651;;21881:105;21888:11;21881:105;;-1:-1:-1;;;21955:6:0;21937:25;;;;:17;:25;;;;;;21881:105;;21390:651;21277:779;21251:805;22080:31;;-1:-1:-1;;;22080:31:0;;;;;;;;;;;32834:2409;32949:27;32979;32998:7;32979:18;:27::i;:::-;32949:57;;33064:4;-1:-1:-1;;;;;33023:45:0;33039:19;-1:-1:-1;;;;;33023:45:0;;33019:86;;33077:28;;-1:-1:-1;;;33077:28:0;;;;;;;;;;;33019:86;33118:22;41397:10;-1:-1:-1;;;;;33144:27:0;;;;:83;;-1:-1:-1;33184:43:0;33201:4;41397:10;26436:164;:::i;33184:43::-;33144:139;;;-1:-1:-1;41397:10:0;33240:20;33252:7;33240:11;:20::i;:::-;-1:-1:-1;;;;;33240:43:0;;33144:139;33118:166;;33302:17;33297:66;;33328:35;;-1:-1:-1;;;33328:35:0;;;;;;;;;;;33297:66;-1:-1:-1;;;;;33378:16:0;;33374:52;;33403:23;;-1:-1:-1;;;33403:23:0;;;;;;;;;;;33374:52;33555:24;;;;:15;:24;;;;;;;;33548:31;;-1:-1:-1;;;;;;33548:31:0;;;-1:-1:-1;;;;;33935:24:0;;;;;:18;:24;;;;;33933:26;;-1:-1:-1;;33933:26:0;;;34009:22;;;;;;;34007:24;;-1:-1:-1;34007:24:0;;;34287:26;;;:17;:26;;;;;-1:-1:-1;;;34359:15:0;15459:3;34359:41;34325:76;;:112;;34287:150;;;34549:46;;34545:586;;34649:1;34639:11;;34617:19;34764:30;;;:17;:30;;;;;;34760:360;;34894:13;;34879:11;:28;34875:230;;35033:30;;;;:17;:30;;;;;:52;;;34875:230;34602:529;34545:586;35174:7;35170:2;-1:-1:-1;;;;;35155:27:0;35164:4;-1:-1:-1;;;;;35155:27:0;-1:-1:-1;;;;;;;;;;;35155:27:0;;;;;;;;;35193:42;27164:396;35639:2648;35719:27;35749;35768:7;35749:18;:27::i;:::-;35719:57;-1:-1:-1;35719:57:0;35854:303;;;;35888:22;41397:10;-1:-1:-1;;;;;35914:27:0;;;;:87;;-1:-1:-1;35958:43:0;35975:4;41397:10;26436:164;:::i;35958:43::-;35914:147;;;-1:-1:-1;41397:10:0;36018:20;36030:7;36018:11;:20::i;:::-;-1:-1:-1;;;;;36018:43:0;;35914:147;35888:174;;36084:17;36079:66;;36110:35;;-1:-1:-1;;;36110:35:0;;;;;;;;;;;36079:66;35873:284;35854:303;36293:24;;;;:15;:24;;;;;;;;36286:31;;-1:-1:-1;;;;;;36286:31:0;;;-1:-1:-1;;;;;36874:24:0;;;;:18;:24;;;;;:59;;36902:31;36874:59;;;37147:26;;;:17;:26;;;;;-1:-1:-1;;;37221:15:0;15459:3;37221:41;37185:78;;:140;37147:178;;-1:-1:-1;;;37437:46:0;;37433:586;;37537:1;37527:11;;37505:19;37652:30;;;:17;:30;;;;;;37648:360;;37782:13;;37767:11;:28;37763:230;;37921:30;;;;:17;:30;;;;;:52;;;37763:230;37490:529;37433:586;38043:35;;38070:7;;38066:1;;-1:-1:-1;;;;;38043:35:0;;;-1:-1:-1;;;;;;;;;;;38043:35:0;38066:1;;38043:35;-1:-1:-1;;38258:12:0;:14;;;;;;-1:-1:-1;;35639:2648:0:o;13647:191::-;13740:6;;;-1:-1:-1;;;;;13757:17:0;;;-1:-1:-1;;;;;;13757:17:0;;;;;;;13790:40;;13740:6;;;13757:17;13740:6;;13790:40;;13721:16;;13790:40;13710:128;13647:191;:::o;22626:153::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;22746:24:0;;;;:17;:24;;;;;;22727:44;;:18;:44::i;28169:104::-;28238:27;28248:2;28252:8;28238:27;;;;;;;;;;;;:9;:27::i;:::-;28169:104;;:::o;38779:716::-;38963:88;;-1:-1:-1;;;38963:88:0;;38942:4;;-1:-1:-1;;;;;38963:45:0;;;;;:88;;41397:10;;39030:4;;39036:7;;39045:5;;38963:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38963:88:0;;;;;;;;-1:-1:-1;;38963:88:0;;;;;;;;;;;;:::i;:::-;;;38959:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39246:13:0;;39242:235;;39292:40;;-1:-1:-1;;;39292:40:0;;;;;;;;;;;39242:235;39435:6;39429:13;39420:6;39416:2;39412:15;39405:38;38959:529;-1:-1:-1;;;;;;39122:64:0;-1:-1:-1;;;39122:64:0;;-1:-1:-1;38779:716:0;;;;;;:::o;23282:158::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;23385:47:0;23404:27;23423:7;23404:18;:27::i;:::-;23385:18;:47::i;41521:1878::-;41974:4;41968:11;;41981:3;41964:21;;42055:17;;;;42723:11;;;42606:5;42851:2;42865;42855:13;;42847:22;42723:11;42834:36;42906:2;42896:13;;42502:663;42925:4;42502:663;;;43094:1;43089:3;43085:11;43078:18;;43145:2;43139:4;43135:13;43131:2;43127:22;43122:3;43114:36;43016:2;43006:13;;42502:663;;;-1:-1:-1;43195:13:0;;;-1:-1:-1;;43306:12:0;;;43362:19;;;43306:12;41521:1878;-1:-1:-1;41521:1878:0:o;22213:322::-;-1:-1:-1;;;;;;;;;;;;;22323:41:0;;;;15459:3;22409:32;;;-1:-1:-1;;;;;22375:67:0;-1:-1:-1;;;22375:67:0;-1:-1:-1;;;22472:23:0;;;:28;;-1:-1:-1;;;22453:47:0;-1:-1:-1;22213:322:0:o;28646:2114::-;28769:20;28792:13;-1:-1:-1;;;;;28820:16:0;;28816:48;;28845:19;;-1:-1:-1;;;28845:19:0;;;;;;;;;;;28816:48;28879:13;28875:44;;28901:18;;-1:-1:-1;;;28901:18:0;;;;;;;;;;;28875:44;-1:-1:-1;;;;;29440:22:0;;;;;;:18;:22;;;;14942:2;29440:22;;;:70;;29478:31;29466:44;;29440:70;;;29729:31;;;:17;:31;;;;;29806:15;15459:3;29806:41;29772:76;;-1:-1:-1;29876:13:0;;15718:3;29861:56;29772:146;29729:189;;:31;;29991:23;;;;30031:14;:19;30027:609;;30067:306;30094:38;;30119:12;;-1:-1:-1;;;;;30094:38:0;;;30111:1;;-1:-1:-1;;;;;;;;;;;30094:38:0;30111:1;;30094:38;30156:69;30195:1;30199:2;30203:14;;;;;;30219:5;30156:30;:69::i;:::-;30151:166;;30257:40;;-1:-1:-1;;;30257:40:0;;;;;;;;;;;30151:166;30368:3;30353:12;:18;30067:306;;30446:12;30429:13;;:29;30425:43;;30460:8;;;30425:43;30027:609;;;30501:124;30528:40;;30553:14;;;;;-1:-1:-1;;;;;30528:40:0;;;30545:1;;-1:-1:-1;;;;;;;;;;;30528:40:0;30545:1;;30528:40;30620:3;30605:12;:18;30501:124;;30027:609;-1:-1:-1;30646:13:0;:28;;;30692:60;;30725:2;30729:12;30743:8;30692:60;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:367::-;666:8;676:6;730:3;723:4;715:6;711:17;707:27;697:55;;748:1;745;738:12;697:55;-1:-1:-1;771:20:1;;-1:-1:-1;;;;;803:30:1;;800:50;;;846:1;843;836:12;800:50;883:4;875:6;871:17;859:29;;943:3;936:4;926:6;923:1;919:14;911:6;907:27;903:38;900:47;897:67;;;960:1;957;950:12;897:67;603:367;;;;;:::o;975:160::-;1040:20;;1096:13;;1089:21;1079:32;;1069:60;;1125:1;1122;1115:12;1140:221;1183:5;1236:3;1229:4;1221:6;1217:17;1213:27;1203:55;;1254:1;1251;1244:12;1203:55;1276:79;1351:3;1342:6;1329:20;1322:4;1314:6;1310:17;1276:79;:::i;1366:186::-;1425:6;1478:2;1466:9;1457:7;1453:23;1449:32;1446:52;;;1494:1;1491;1484:12;1446:52;1517:29;1536:9;1517:29;:::i;1557:260::-;1625:6;1633;1686:2;1674:9;1665:7;1661:23;1657:32;1654:52;;;1702:1;1699;1692:12;1654:52;1725:29;1744:9;1725:29;:::i;:::-;1715:39;;1773:38;1807:2;1796:9;1792:18;1773:38;:::i;:::-;1763:48;;1557:260;;;;;:::o;1822:328::-;1899:6;1907;1915;1968:2;1956:9;1947:7;1943:23;1939:32;1936:52;;;1984:1;1981;1974:12;1936:52;2007:29;2026:9;2007:29;:::i;:::-;1997:39;;2055:38;2089:2;2078:9;2074:18;2055:38;:::i;:::-;2045:48;;2140:2;2129:9;2125:18;2112:32;2102:42;;1822:328;;;;;:::o;2155:666::-;2250:6;2258;2266;2274;2327:3;2315:9;2306:7;2302:23;2298:33;2295:53;;;2344:1;2341;2334:12;2295:53;2367:29;2386:9;2367:29;:::i;:::-;2357:39;;2415:38;2449:2;2438:9;2434:18;2415:38;:::i;:::-;2405:48;;2500:2;2489:9;2485:18;2472:32;2462:42;;2555:2;2544:9;2540:18;2527:32;-1:-1:-1;;;;;2574:6:1;2571:30;2568:50;;;2614:1;2611;2604:12;2568:50;2637:22;;2690:4;2682:13;;2678:27;-1:-1:-1;2668:55:1;;2719:1;2716;2709:12;2668:55;2742:73;2807:7;2802:2;2789:16;2784:2;2780;2776:11;2742:73;:::i;:::-;2732:83;;;2155:666;;;;;;;:::o;2826:254::-;2891:6;2899;2952:2;2940:9;2931:7;2927:23;2923:32;2920:52;;;2968:1;2965;2958:12;2920:52;2991:29;3010:9;2991:29;:::i;:::-;2981:39;;3039:35;3070:2;3059:9;3055:18;3039:35;:::i;3085:254::-;3153:6;3161;3214:2;3202:9;3193:7;3189:23;3185:32;3182:52;;;3230:1;3227;3220:12;3182:52;3253:29;3272:9;3253:29;:::i;:::-;3243:39;3329:2;3314:18;;;;3301:32;;-1:-1:-1;;;3085:254:1:o;3344:322::-;3421:6;3429;3437;3490:2;3478:9;3469:7;3465:23;3461:32;3458:52;;;3506:1;3503;3496:12;3458:52;3529:29;3548:9;3529:29;:::i;:::-;3519:39;3605:2;3590:18;;3577:32;;-1:-1:-1;3656:2:1;3641:18;;;3628:32;;3344:322;-1:-1:-1;;;3344:322:1:o;3671:773::-;3793:6;3801;3809;3817;3870:2;3858:9;3849:7;3845:23;3841:32;3838:52;;;3886:1;3883;3876:12;3838:52;3926:9;3913:23;-1:-1:-1;;;;;3996:2:1;3988:6;3985:14;3982:34;;;4012:1;4009;4002:12;3982:34;4051:70;4113:7;4104:6;4093:9;4089:22;4051:70;:::i;:::-;4140:8;;-1:-1:-1;4025:96:1;-1:-1:-1;4228:2:1;4213:18;;4200:32;;-1:-1:-1;4244:16:1;;;4241:36;;;4273:1;4270;4263:12;4241:36;;4312:72;4376:7;4365:8;4354:9;4350:24;4312:72;:::i;:::-;3671:773;;;;-1:-1:-1;4403:8:1;-1:-1:-1;;;;3671:773:1:o;4449:957::-;4533:6;4564:2;4607;4595:9;4586:7;4582:23;4578:32;4575:52;;;4623:1;4620;4613:12;4575:52;4663:9;4650:23;-1:-1:-1;;;;;4733:2:1;4725:6;4722:14;4719:34;;;4749:1;4746;4739:12;4719:34;4787:6;4776:9;4772:22;4762:32;;4832:7;4825:4;4821:2;4817:13;4813:27;4803:55;;4854:1;4851;4844:12;4803:55;4890:2;4877:16;4912:2;4908;4905:10;4902:36;;;4918:18;;:::i;:::-;4964:2;4961:1;4957:10;4947:20;;4987:28;5011:2;5007;5003:11;4987:28;:::i;:::-;5049:15;;;5080:12;;;;5112:11;;;5142;;;5138:20;;5135:33;-1:-1:-1;5132:53:1;;;5181:1;5178;5171:12;5132:53;5203:1;5194:10;;5213:163;5227:2;5224:1;5221:9;5213:163;;;5284:17;;5272:30;;5245:1;5238:9;;;;;5322:12;;;;5354;;5213:163;;;-1:-1:-1;5395:5:1;4449:957;-1:-1:-1;;;;;;;;4449:957:1:o;5411:180::-;5467:6;5520:2;5508:9;5499:7;5495:23;5491:32;5488:52;;;5536:1;5533;5526:12;5488:52;5559:26;5575:9;5559:26;:::i;5596:245::-;5654:6;5707:2;5695:9;5686:7;5682:23;5678:32;5675:52;;;5723:1;5720;5713:12;5675:52;5762:9;5749:23;5781:30;5805:5;5781:30;:::i;5846:249::-;5915:6;5968:2;5956:9;5947:7;5943:23;5939:32;5936:52;;;5984:1;5981;5974:12;5936:52;6016:9;6010:16;6035:30;6059:5;6035:30;:::i;6100:543::-;6188:6;6196;6249:2;6237:9;6228:7;6224:23;6220:32;6217:52;;;6265:1;6262;6255:12;6217:52;6305:9;6292:23;-1:-1:-1;;;;;6375:2:1;6367:6;6364:14;6361:34;;;6391:1;6388;6381:12;6361:34;6414:50;6456:7;6447:6;6436:9;6432:22;6414:50;:::i;:::-;6404:60;;6517:2;6506:9;6502:18;6489:32;6473:48;;6546:2;6536:8;6533:16;6530:36;;;6562:1;6559;6552:12;6530:36;;6585:52;6629:7;6618:8;6607:9;6603:24;6585:52;:::i;:::-;6575:62;;;6100:543;;;;;:::o;6648:180::-;6707:6;6760:2;6748:9;6739:7;6735:23;6731:32;6728:52;;;6776:1;6773;6766:12;6728:52;-1:-1:-1;6799:23:1;;6648:180;-1:-1:-1;6648:180:1:o;6833:269::-;6890:6;6943:2;6931:9;6922:7;6918:23;6914:32;6911:52;;;6959:1;6956;6949:12;6911:52;6998:9;6985:23;7048:4;7041:5;7037:16;7030:5;7027:27;7017:55;;7068:1;7065;7058:12;7107:257;7148:3;7186:5;7180:12;7213:6;7208:3;7201:19;7229:63;7285:6;7278:4;7273:3;7269:14;7262:4;7255:5;7251:16;7229:63;:::i;:::-;7346:2;7325:15;-1:-1:-1;;7321:29:1;7312:39;;;;7353:4;7308:50;;7107:257;-1:-1:-1;;7107:257:1:o;7369:973::-;7454:12;;7419:3;;7509:1;7529:18;;;;7582;;;;7609:61;;7663:4;7655:6;7651:17;7641:27;;7609:61;7689:2;7737;7729:6;7726:14;7706:18;7703:38;7700:161;;;7783:10;7778:3;7774:20;7771:1;7764:31;7818:4;7815:1;7808:15;7846:4;7843:1;7836:15;7700:161;7877:18;7904:104;;;;8022:1;8017:319;;;;7870:466;;7904:104;-1:-1:-1;;7937:24:1;;7925:37;;7982:16;;;;-1:-1:-1;7904:104:1;;8017:319;16499:1;16492:14;;;16536:4;16523:18;;8111:1;8125:165;8139:6;8136:1;8133:13;8125:165;;;8217:14;;8204:11;;;8197:35;8260:16;;;;8154:10;;8125:165;;;8129:3;;8319:6;8314:3;8310:16;8303:23;;7870:466;;;;;;;7369:973;;;;:::o;8630:456::-;8851:3;8879:38;8913:3;8905:6;8879:38;:::i;:::-;8946:6;8940:13;8962:52;9007:6;9003:2;8996:4;8988:6;8984:17;8962:52;:::i;:::-;9030:50;9072:6;9068:2;9064:15;9056:6;9030:50;:::i;:::-;9023:57;8630:456;-1:-1:-1;;;;;;;8630:456:1:o;9299:488::-;-1:-1:-1;;;;;9568:15:1;;;9550:34;;9620:15;;9615:2;9600:18;;9593:43;9667:2;9652:18;;9645:34;;;9715:3;9710:2;9695:18;;9688:31;;;9493:4;;9736:45;;9761:19;;9753:6;9736:45;:::i;:::-;9728:53;9299:488;-1:-1:-1;;;;;;9299:488:1:o;9792:720::-;10023:2;10075:21;;;10145:13;;10048:18;;;10167:22;;;9994:4;;10023:2;10246:15;;;;10220:2;10205:18;;;9994:4;10289:197;10303:6;10300:1;10297:13;10289:197;;;10352:52;10400:3;10391:6;10385:13;8431:12;;-1:-1:-1;;;;;8427:38:1;8415:51;;8519:4;8508:16;;;8502:23;-1:-1:-1;;;;;8498:48:1;8482:14;;;8475:72;8610:4;8599:16;;;8593:23;8586:31;8579:39;8563:14;;8556:63;8347:278;10352:52;10461:15;;;;10433:4;10424:14;;;;;10325:1;10318:9;10289:197;;10517:632;10688:2;10740:21;;;10810:13;;10713:18;;;10832:22;;;10659:4;;10688:2;10911:15;;;;10885:2;10870:18;;;10659:4;10954:169;10968:6;10965:1;10962:13;10954:169;;;11029:13;;11017:26;;11098:15;;;;11063:12;;;;10990:1;10983:9;10954:169;;11346:219;11495:2;11484:9;11477:21;11458:4;11515:44;11555:2;11544:9;11540:18;11532:6;11515:44;:::i;14800:356::-;15002:2;14984:21;;;15021:18;;;15014:30;15080:34;15075:2;15060:18;;15053:62;15147:2;15132:18;;14800:356::o;15507:263::-;8431:12;;-1:-1:-1;;;;;8427:38:1;8415:51;;8519:4;8508:16;;;8502:23;-1:-1:-1;;;;;8498:48:1;8482:14;;;8475:72;8610:4;8599:16;;;8593:23;8586:31;8579:39;8563:14;;;8556:63;15701:2;15686:18;;15713:51;8347:278;16146:275;16217:2;16211:9;16282:2;16263:13;;-1:-1:-1;;16259:27:1;16247:40;;-1:-1:-1;;;;;16302:34:1;;16338:22;;;16299:62;16296:88;;;16364:18;;:::i;:::-;16400:2;16393:22;16146:275;;-1:-1:-1;16146:275:1:o;16552:128::-;16592:3;16623:1;16619:6;16616:1;16613:13;16610:39;;;16629:18;;:::i;:::-;-1:-1:-1;16665:9:1;;16552:128::o;16685:168::-;16725:7;16791:1;16787;16783:6;16779:14;16776:1;16773:21;16768:1;16761:9;16754:17;16750:45;16747:71;;;16798:18;;:::i;:::-;-1:-1:-1;16838:9:1;;16685:168::o;16858:258::-;16930:1;16940:113;16954:6;16951:1;16948:13;16940:113;;;17030:11;;;17024:18;17011:11;;;17004:39;16976:2;16969:10;16940:113;;;17071:6;17068:1;17065:13;17062:48;;;-1:-1:-1;;17106:1:1;17088:16;;17081:27;16858:258::o;17121:380::-;17200:1;17196:12;;;;17243;;;17264:61;;17318:4;17310:6;17306:17;17296:27;;17264:61;17371:2;17363:6;17360:14;17340:18;17337:38;17334:161;;;17417:10;17412:3;17408:20;17405:1;17398:31;17452:4;17449:1;17442:15;17480:4;17477:1;17470:15;17334:161;;17121:380;;;:::o;17506:135::-;17545:3;-1:-1:-1;;17566:17:1;;17563:43;;;17586:18;;:::i;:::-;-1:-1:-1;17633:1:1;17622:13;;17506:135::o;17646:127::-;17707:10;17702:3;17698:20;17695:1;17688:31;17738:4;17735:1;17728:15;17762:4;17759:1;17752:15;17778:127;17839:10;17834:3;17830:20;17827:1;17820:31;17870:4;17867:1;17860:15;17894:4;17891:1;17884:15;17910:127;17971:10;17966:3;17962:20;17959:1;17952:31;18002:4;17999:1;17992:15;18026:4;18023:1;18016:15;18042:131;-1:-1:-1;;;;;;18116:32:1;;18106:43;;18096:71;;18163:1;18160;18153:12

Swarm Source

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