ETH Price: $2,524.64 (+0.31%)

PEPE Embryos (PEPE)
 

Overview

TokenID

1827

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
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:
PEPEEmbryos

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
berlin EvmVersion, MIT license
File 1 of 20 : NFT.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.18;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "./lib/ERC721A.sol";
import "./interfaces/IERC6551Registry.sol";
import "./interfaces/IERC2981.sol";
import "./lib/ERC2981.sol";
import "./lib/ERC721Royalty.sol";

contract PEPEEmbryos is ERC721A, Ownable, ERC721Royalty {
    bool public paused;
    bool public saleIsActive;
    uint256 private _salt = 490;
    string private _baseURIextended;

    uint256 public MAX_SUPPLY;
    /// @custom:precision 18
    uint256 public wlPrice;
    bool public isWLMintOn;

    uint256 public currentPrice;
    uint256 public walletLimit;

    address public erc6551Registry;
    address public accountImplementation;

    bool public isFreeMintOn;
    uint256 public freeMintLimit;
    mapping(address => uint256) public freeMintedByUser;
    mapping(address => bool) public isWhitelistedUser;

    /**
     * @param _name NFT Name
     * @param _symbol NFT Symbol
     * @param _uri Token URI used for metadata
     * @param limit Wallet Limit
     * @param price Initial Price | precision:18
     * @param maxSupply Maximum # of NFTs
     */
    constructor(
        string memory _name,
        string memory _symbol,
        string memory _uri,
        uint256 limit,
        uint256 price,
        uint256 maxSupply,
        address _receiver,
        uint96 feeNumerator
    ) payable ERC721A(_name, _symbol) {
        _baseURIextended = _uri;
        currentPrice = price;
        walletLimit = limit;
        MAX_SUPPLY = maxSupply;

        isFreeMintOn = true;
        freeMintLimit = 10;

        _setDefaultRoyalty(_receiver, feeNumerator);
    }

    /**
     * @dev An external method for users to purchase and mint NFTs. Requires that the sale
     * is active, that the minted NFTs will not exceed the `MAX_SUPPLY`, and that a
     * sufficient payable value is sent.
     * @param amount The number of NFTs to mint.
     */
    function publicMint(uint256 amount) external payable {
        uint256 ts = totalSupply();
        // uint256 minted = _numberMinted(msg.sender);

        require(saleIsActive, "Sale must be active to mint tokens");
        require(ts + amount <= MAX_SUPPLY, "Purchase would exceed max tokens");
        require(
            currentPrice * amount == msg.value,
            "Sent value is not correct"
        );

        _mint(amount, ts);
    }

    /**
     * @dev An external method for users to mint NFTs in free phase.
     * @param amount The number of NFTs to mint.
     */
    function freeMint(uint256 amount) external {
        uint256 ts = totalSupply();

        require(isFreeMintOn, "Free mint is diabled.");
        require(
            amount + freeMintedByUser[msg.sender] <= freeMintLimit,
            "Exceeds free limit"
        );
        require(ts + amount <= MAX_SUPPLY, "Purchase would exceed max tokens");

        _mint(amount, ts);
        freeMintedByUser[msg.sender] += amount;
    }

    /**
     * @dev An external method for whilteliste users to mint NFTs.
     * @param amount The number of NFTs to mint.
     */
    function wlMint(uint256 amount) external payable {
        uint256 ts = totalSupply();

        require(isWLMintOn, "WL mint is disabled.");
        require(isWhitelistedUser[msg.sender], "Address != whitelisted");
        require(ts + amount <= MAX_SUPPLY, "Purchase would exceed max tokens");
        require(wlPrice * amount == msg.value, "Sent value is not correct");

        _mint(amount, ts);
    }

    function _mint(uint256 _amount, uint256 _ts) internal {
        require(!paused, "MINTING: Paused!");
        _safeMint(msg.sender, _amount);

        for (uint256 i = 0; i < _amount; i++) {
            IERC6551Registry(erc6551Registry).createAccount(
                accountImplementation,
                getChainID(),
                address(this),
                _ts + i,
                _salt,
                ""
            );
        }
    }

    function burn(uint256 tokenId) external {
        require(_exists(tokenId), "Invalid Id!");
        require(ownerOf(tokenId) == msg.sender, "Not a NFT Owner");
        _burn(tokenId);
    }

    /**
     * @dev A way for the owner to reserve a specifc number of NFTs without having to
     * interact with the sale.
     * @param to The address to send reserved NFTs to.
     * @param amount The number of NFTs to reserve.
     */
    function reserve(address to, uint256 amount) external onlyOwner {
        uint256 ts = totalSupply();
        require(ts + amount <= MAX_SUPPLY, "Purchase would exceed max tokens");
        _safeMint(to, amount);
    }

    /**
     * @dev A way for the owner to withdraw all proceeds from the sale.
     */
    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    /**
     * @dev Sets whether or not the NFT sale is active.
     * @param isActive Whether or not the sale will be active.
     */
    function setSaleIsActive(bool isActive) external onlyOwner {
        saleIsActive = isActive;
    }

    function setFreeMintLimit(uint256 _limit) external onlyOwner {
        freeMintLimit = _limit;
    }

    function setPauseStatus(bool _status) external onlyOwner {
        paused = _status;
    }

    function setWhitelistUsersStatus(
        address[] memory _users,
        bool _status
    ) external onlyOwner {
        for (uint256 i; i < _users.length; i++) {
            isWhitelistedUser[_users[i]] = _status;
        }
    }

    /**
     * @dev Sets the price of each NFT during the initial sale.
     * @param price The price of each NFT during the initial sale | precision:18
     */
    function setCurrentPrice(uint256 price) external onlyOwner {
        currentPrice = price;
    }

    /**
     * @dev Sets the price of each NFT for whitelisted users.
     * @param price The price of each NFT precision:18
     */
    function setWLPrice(uint256 price) external onlyOwner {
        wlPrice = price;
    }

    /**
     * @dev Sets the address of erc6551 registry contract
     * @param _addr new address of ERC6551 Registry contract
     */
    function setRegistryAddress(address _addr) external onlyOwner {
        erc6551Registry = _addr;
    }

    /**
     * @dev Sets the address of erc6551 Implementation contract
     * @param _addr new address of implementation contract
     */
    function setImplementationAddress(address _addr) external onlyOwner {
        accountImplementation = _addr;
    }

    /**
     * @dev Sets the maximum number of NFTs that can be sold to a specific address.
     * @param limit The maximum number of NFTs that be bought by a wallet.
     */
    function setWalletLimit(uint256 limit) external onlyOwner {
        walletLimit = limit;
    }

    /**
     * @dev Updates the Roaylaty fee for NFT.
     * @param _receiver New Receiver of royalty.
     * @param feeNumerator Roaylaty Fee.
     */
    function setFeeInfo(
        address _receiver,
        uint96 feeNumerator
    ) external onlyOwner {
        _setDefaultRoyalty(_receiver, feeNumerator);
    }

    /**
     * @dev Updates the baseURI that will be used to retrieve NFT metadata.
     * @param baseURI_ The baseURI to be used.
     */
    function setBaseURI(string memory baseURI_) external onlyOwner {
        _baseURIextended = baseURI_;
    }

    function updateFreeMintStatus(bool status) external onlyOwner {
        isFreeMintOn = status;
    }

    function updateWLMintStatus(bool status) external onlyOwner {
        isWLMintOn = status;
    }

    function updateAccountSalt(uint256 _slt) external onlyOwner {
        _salt = _slt;
    }

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

    function supportsInterface(
        bytes4 interfaceId
    ) public view override(ERC721A, ERC721Royalty) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    function getChainID() public view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }
}

File 2 of 20 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

File 3 of 20 : ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

    /**
     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

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

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

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

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

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

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

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

        _afterTokenTransfer(address(0), to, tokenId, 1);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId, 1);

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId, 1);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(address from, address to, uint256 tokenId) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

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

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}

    /**
     * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
     *
     * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant
     * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such
     * that `ownerOf(tokenId)` is `a`.
     */
    // solhint-disable-next-line func-name-mixedcase
    function __unsafe_increaseBalance(address account, uint256 amount) internal {
        _balances[account] += amount;
    }
}

File 4 of 20 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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);
}

File 5 of 20 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 6 of 20 : ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, firstTokenId, batchSize);

        if (batchSize > 1) {
            // Will only trigger during construction. Batch transferring (minting) is not available afterwards.
            revert("ERC721Enumerable: consecutive transfers not supported");
        }

        uint256 tokenId = firstTokenId;

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 7 of 20 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 8 of 20 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 9 of 20 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

File 10 of 20 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 11 of 20 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

import "./math/Math.sol";
import "./math/SignedMath.sol";

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toString(int256 value) internal pure returns (string memory) {
        return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value))));
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }

    /**
     * @dev Returns true if the two strings are equal.
     */
    function equal(string memory a, string memory b) internal pure returns (bool) {
        return keccak256(bytes(a)) == keccak256(bytes(b));
    }
}

File 12 of 20 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

pragma solidity ^0.8.0;

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

File 14 of 20 : Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
        }
    }
}

File 15 of 20 : SignedMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two signed numbers.
     */
    function min(int256 a, int256 b) internal pure returns (int256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}

File 16 of 20 : IERC2981.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/introspection/IERC165.sol";

interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(
        uint256 tokenId,
        uint256 salePrice
    ) external view returns (address receiver, uint256 royaltyAmount);
}

File 17 of 20 : IERC6551Registry.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IERC6551Registry {
    event AccountCreated(
        address account,
        address implementation,
        uint256 chainId,
        address tokenContract,
        uint256 tokenId,
        uint256 salt
    );

    function createAccount(
        address implementation,
        uint256 chainId,
        address tokenContract,
        uint256 tokenId,
        uint256 seed,
        bytes calldata initData
    ) external returns (address);

    function account(
        address implementation,
        uint256 chainId,
        address tokenContract,
        uint256 tokenId,
        uint256 salt
    ) external view returns (address);
}

File 18 of 20 : ERC2981.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "../interfaces/IERC2981.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";

abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(
        uint256 tokenId,
        uint256 salePrice
    ) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) /
            _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(
            feeNumerator <= _feeDenominator(),
            "ERC2981: royalty fee will exceed salePrice"
        );
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(
            feeNumerator <= _feeDenominator(),
            "ERC2981: royalty fee will exceed salePrice"
        );
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

File 19 of 20 : ERC721A.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

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

File 20 of 20 : ERC721Royalty.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./ERC2981.sol";
import "./ERC721A.sol";

abstract contract ERC721Royalty is ERC2981, ERC721A {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(
        bytes4 interfaceId
    ) public view virtual override(ERC721A, ERC2981) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "evmVersion": "berlin",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accountImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"erc6551Registry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMintedByUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"isFreeMintOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWLMintOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelistedUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setCurrentPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setFeeInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setFreeMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setImplementationAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setPauseStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setRegistryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isActive","type":"bool"}],"name":"setSaleIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setWLPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setWhitelistUsersStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_slt","type":"uint256"}],"name":"updateAccountSalt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"updateFreeMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"updateWLMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"walletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"wlMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"wlPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040526101ea600b5560405162002dd338038062002dd38339810160408190526200002c91620002ff565b878760046200003c838262000462565b5060056200004b828262000462565b50506000600255506200005e33620000ae565b600c6200006c878262000462565b5060108490556011859055600d8390556013805460ff60a01b1916600160a01b179055600a601455620000a0828262000100565b50505050505050506200052e565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b0382161115620001745760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084015b60405180910390fd5b6001600160a01b038216620001cc5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016200016b565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600055565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200022d57600080fd5b81516001600160401b03808211156200024a576200024a62000205565b604051601f8301601f19908116603f0116810190828211818310171562000275576200027562000205565b816040528381526020925086838588010111156200029257600080fd5b600091505b83821015620002b6578582018301518183018401529082019062000297565b600093810190920192909252949350505050565b80516001600160a01b0381168114620002e257600080fd5b919050565b80516001600160601b0381168114620002e257600080fd5b600080600080600080600080610100898b0312156200031d57600080fd5b88516001600160401b03808211156200033557600080fd5b620003438c838d016200021b565b995060208b01519150808211156200035a57600080fd5b620003688c838d016200021b565b985060408b01519150808211156200037f57600080fd5b506200038e8b828c016200021b565b965050606089015194506080890151935060a08901519250620003b460c08a01620002ca565b9150620003c460e08a01620002e7565b90509295985092959890939650565b600181811c90821680620003e857607f821691505b6020821081036200040957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200045d57600081815260208120601f850160051c81016020861015620004385750805b601f850160051c820191505b81811015620004595782815560010162000444565b5050505b505050565b81516001600160401b038111156200047e576200047e62000205565b62000496816200048f8454620003d3565b846200040f565b602080601f831160018114620004ce5760008415620004b55750858301515b600019600386901b1c1916600185901b17855562000459565b600085815260208120601f198616915b82811015620004ff57888601518255948401946001909101908401620004de565b50858210156200051e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612895806200053e6000396000f3fe6080604052600436106102ff5760003560e01c80637c928fe911610190578063c87b56dd116100dc578063ecade2f011610095578063f2fde38b1161006f578063f2fde38b146108ec578063f34e4bdc1461090c578063f6a5b8e614610939578063fa02b8671461095957600080fd5b8063ecade2f01461088c578063f07b92cd146108ac578063f1d5f517146108cc57600080fd5b8063c87b56dd146107bb578063cc47a40b146107db578063d46e0aab146107fb578063d88c271e1461081b578063e985e9c51461084b578063eb8d24441461086b57600080fd5b8063a1ca2a5711610149578063b88d4fde11610123578063b88d4fde14610745578063bd2f6eb814610765578063c38bb53714610785578063c7f8d01a146107a557600080fd5b8063a1ca2a57146106e4578063a22cb46514610705578063ab7b49931461072557600080fd5b80637c928fe91461063b57806385faec0f1461065b5780638da5cb5b1461067b57806395d89b411461069957806399b2b20a146106ae5780639d1b464a146106ce57600080fd5b806332cb6b0c1161024f57806355f804b3116102085780636352211e116101e25780636352211e146105d35780636aabb947146105f357806370a0823114610606578063715018a61461062657600080fd5b806355f804b31461057f578063564b81ef1461059f5780635c975abb146105b257600080fd5b806332cb6b0c146104e45780633c8463a1146104fa5780633ccfd60b146105105780633dc7fdd61461052557806342842e0e1461053f57806342966c681461055f57600080fd5b8063095ea7b3116102bc57806318b200711161029657806318b200711461045257806323b872dd146104725780632a55205a146104925780632db11544146104d157600080fd5b8063095ea7b3146103f957806311464fbe1461041957806318160ddd1461043957600080fd5b806301ffc9a71461030457806302c8898914610339578063056d5afe1461035b57806306fdde0314610393578063081812fc146103b557806308346d85146103d5575b600080fd5b34801561031057600080fd5b5061032461031f366004612133565b610979565b60405190151581526020015b60405180910390f35b34801561034557600080fd5b50610359610354366004612165565b61098a565b005b34801561036757600080fd5b5060125461037b906001600160a01b031681565b6040516001600160a01b039091168152602001610330565b34801561039f57600080fd5b506103a86109b0565b60405161033091906121d0565b3480156103c157600080fd5b5061037b6103d03660046121e3565b610a42565b3480156103e157600080fd5b506103eb60145481565b604051908152602001610330565b34801561040557600080fd5b50610359610414366004612211565b610a86565b34801561042557600080fd5b5060135461037b906001600160a01b031681565b34801561044557600080fd5b50600354600254036103eb565b34801561045e57600080fd5b5061035961046d3660046121e3565b610b13565b34801561047e57600080fd5b5061035961048d36600461223d565b610b20565b34801561049e57600080fd5b506104b26104ad36600461227e565b610b2b565b604080516001600160a01b039093168352602083019190915201610330565b6103596104df3660046121e3565b610bd7565b3480156104f057600080fd5b506103eb600d5481565b34801561050657600080fd5b506103eb60115481565b34801561051c57600080fd5b50610359610ce7565b34801561053157600080fd5b50600f546103249060ff1681565b34801561054b57600080fd5b5061035961055a36600461223d565b610d1e565b34801561056b57600080fd5b5061035961057a3660046121e3565b610d39565b34801561058b57600080fd5b5061035961059a36600461233d565b610dda565b3480156105ab57600080fd5b50466103eb565b3480156105be57600080fd5b50600a5461032490600160a01b900460ff1681565b3480156105df57600080fd5b5061037b6105ee3660046121e3565b610dee565b6103596106013660046121e3565b610e00565b34801561061257600080fd5b506103eb610621366004612385565b610eed565b34801561063257600080fd5b50610359610f3b565b34801561064757600080fd5b506103596106563660046121e3565b610f4f565b34801561066757600080fd5b506103596106763660046121e3565b61106f565b34801561068757600080fd5b50600a546001600160a01b031661037b565b3480156106a557600080fd5b506103a861107c565b3480156106ba57600080fd5b506103596106c93660046123a2565b61108b565b3480156106da57600080fd5b506103eb60105481565b3480156106f057600080fd5b5060135461032490600160a01b900460ff1681565b34801561071157600080fd5b506103596107203660046123e7565b61109d565b34801561073157600080fd5b50610359610740366004612385565b611132565b34801561075157600080fd5b5061035961076036600461241c565b61115c565b34801561077157600080fd5b506103596107803660046121e3565b6111ad565b34801561079157600080fd5b506103596107a0366004612165565b6111ba565b3480156107b157600080fd5b506103eb600e5481565b3480156107c757600080fd5b506103a86107d63660046121e3565b6111e0565b3480156107e757600080fd5b506103596107f6366004612211565b611264565b34801561080757600080fd5b5061035961081636600461249b565b6112b3565b34801561082757600080fd5b50610324610836366004612385565b60166020526000908152604090205460ff1681565b34801561085757600080fd5b5061032461086636600461255e565b611322565b34801561087757600080fd5b50600a5461032490600160a81b900460ff1681565b34801561089857600080fd5b506103596108a7366004612385565b611350565b3480156108b857600080fd5b506103596108c7366004612165565b61137a565b3480156108d857600080fd5b506103596108e73660046121e3565b6113a0565b3480156108f857600080fd5b50610359610907366004612385565b6113ad565b34801561091857600080fd5b506103eb610927366004612385565b60156020526000908152604090205481565b34801561094557600080fd5b506103596109543660046121e3565b611423565b34801561096557600080fd5b50610359610974366004612165565b611430565b60006109848261144b565b92915050565b610992611456565b600a8054911515600160a81b0260ff60a81b19909216919091179055565b6060600480546109bf9061258c565b80601f01602080910402602001604051908101604052809291908181526020018280546109eb9061258c565b8015610a385780601f10610a0d57610100808354040283529160200191610a38565b820191906000526020600020905b815481529060010190602001808311610a1b57829003601f168201915b5050505050905090565b6000610a4d826114b0565b610a6a576040516333d1c03960e21b815260040160405180910390fd5b506000908152600860205260409020546001600160a01b031690565b6000610a9182610dee565b9050806001600160a01b0316836001600160a01b031603610ac55760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610ae55750610ae38133611322565b155b15610b03576040516367d9dca160e11b815260040160405180910390fd5b610b0e8383836114dc565b505050565b610b1b611456565b601055565b610b0e838383611538565b60008281526001602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610ba05750604080518082019091526000546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610bbf906001600160601b0316876125dc565b610bc991906125f3565b915196919550909350505050565b6000610be66003546002540390565b600a54909150600160a81b900460ff16610c525760405162461bcd60e51b815260206004820152602260248201527f53616c65206d7573742062652061637469766520746f206d696e7420746f6b656044820152616e7360f01b60648201526084015b60405180910390fd5b600d54610c5f8383612615565b1115610c7d5760405162461bcd60e51b8152600401610c4990612628565b3482601054610c8c91906125dc565b14610cd95760405162461bcd60e51b815260206004820152601960248201527f53656e742076616c7565206973206e6f7420636f7272656374000000000000006044820152606401610c49565b610ce38282611714565b5050565b610cef611456565b6040514790339082156108fc029083906000818181858888f19350505050158015610ce3573d6000803e3d6000fd5b610b0e8383836040518060200160405280600081525061115c565b610d42816114b0565b610d7c5760405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642049642160a81b6044820152606401610c49565b33610d8682610dee565b6001600160a01b031614610dce5760405162461bcd60e51b815260206004820152600f60248201526e2737ba10309027232a1027bbb732b960891b6044820152606401610c49565b610dd781611847565b50565b610de2611456565b600c610ce382826126ab565b6000610df982611852565b5192915050565b6000610e0f6003546002540390565b600f5490915060ff16610e5b5760405162461bcd60e51b81526020600482015260146024820152732ba61036b4b73a1034b9903234b9b0b13632b21760611b6044820152606401610c49565b3360009081526016602052604090205460ff16610eb35760405162461bcd60e51b81526020600482015260166024820152751059191c995cdcc8084f481dda1a5d195b1a5cdd195960521b6044820152606401610c49565b600d54610ec08383612615565b1115610ede5760405162461bcd60e51b8152600401610c4990612628565b3482600e54610c8c91906125dc565b60006001600160a01b038216610f16576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600760205260409020546001600160401b031690565b610f43611456565b610f4d600061196c565b565b6000610f5e6003546002540390565b601354909150600160a01b900460ff16610fb25760405162461bcd60e51b8152602060048201526015602482015274233932b29036b4b73a1034b9903234b0b13632b21760591b6044820152606401610c49565b60145433600090815260156020526040902054610fcf9084612615565b11156110125760405162461bcd60e51b8152602060048201526012602482015271115e18d959591cc8199c9959481b1a5b5a5d60721b6044820152606401610c49565b600d5461101f8383612615565b111561103d5760405162461bcd60e51b8152600401610c4990612628565b6110478282611714565b3360009081526015602052604081208054849290611066908490612615565b90915550505050565b611077611456565b600b55565b6060600580546109bf9061258c565b611093611456565b610ce382826119be565b336001600160a01b038316036110c65760405163b06307db60e01b815260040160405180910390fd5b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61113a611456565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b611167848484611538565b6001600160a01b0383163b15158015611189575061118784848484611abb565b155b156111a7576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6111b5611456565b601455565b6111c2611456565b600a8054911515600160a01b0260ff60a01b19909216919091179055565b60606111eb826114b0565b61120857604051630a14c4b560e41b815260040160405180910390fd5b6000611212611ba7565b90508051600003611232576040518060200160405280600081525061125d565b8061123c84611bb6565b60405160200161124d92919061276a565b6040516020818303038152906040525b9392505050565b61126c611456565b600061127b6003546002540390565b600d5490915061128b8383612615565b11156112a95760405162461bcd60e51b8152600401610c4990612628565b610b0e8383611c48565b6112bb611456565b60005b8251811015610b0e5781601660008584815181106112de576112de612799565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061131a816127af565b9150506112be565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b611358611456565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b611382611456565b60138054911515600160a01b0260ff60a01b19909216919091179055565b6113a8611456565b601155565b6113b5611456565b6001600160a01b03811661141a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c49565b610dd78161196c565b61142b611456565b600e55565b611438611456565b600f805460ff1916911515919091179055565b600061098482611c62565b600a546001600160a01b03163314610f4d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c49565b600060025482108015610984575050600090815260066020526040902054600160e01b900460ff161590565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061154382611852565b9050836001600160a01b031681600001516001600160a01b03161461157a5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061159857506115988533611322565b806115b35750336115a884610a42565b6001600160a01b0316145b9050806115d357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0384166115fa57604051633a954ecd60e21b815260040160405180910390fd5b611606600084876114dc565b6001600160a01b038581166000908152600760209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600690945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166116da5760025482146116da57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b031660008051602061284083398151915260405160405180910390a45b5050505050565b600a54600160a01b900460ff16156117615760405162461bcd60e51b815260206004820152601060248201526f4d494e54494e473a205061757365642160801b6044820152606401610c49565b61176b3383611c48565b60005b82811015610b0e576012546013546001600160a01b039182169163da7323b39116463061179b8688612615565b600b546040516001600160e01b031960e088901b1681526001600160a01b03958616600482015260248101949094529390911660448301526064820152608481019190915260c060a4820152600060c482015260e4016020604051808303816000875af1158015611810573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183491906127c8565b508061183f816127af565b91505061176e565b610dd7816000611ca2565b60408051606081018252600080825260208201819052918101919091528160025481101561195357600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906119515780516001600160a01b0316156118e8579392505050565b5060001901600081815260066020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521561194c579392505050565b6118e8565b505b604051636f96cda160e11b815260040160405180910390fd5b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b0382161115611a2c5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610c49565b6001600160a01b038216611a825760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610c49565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600055565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611af09033908990889088906004016127e5565b6020604051808303816000875af1925050508015611b2b575060408051601f3d908101601f19168201909252611b2891810190612822565b60015b611b89573d808015611b59576040519150601f19603f3d011682016040523d82523d6000602084013e611b5e565b606091505b508051600003611b81576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600c80546109bf9061258c565b60606000611bc383611e56565b60010190506000816001600160401b03811115611be257611be26122a0565b6040519080825280601f01601f191660200182016040528015611c0c576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611c1657509392505050565b610ce3828260405180602001604052806000815250611f2e565b60006001600160e01b031982166380ac58cd60e01b1480611c9357506001600160e01b03198216635b5e139f60e01b145b80610984575061098482611f3b565b6000611cad83611852565b80519091508215611d13576000336001600160a01b0383161480611cd65750611cd68233611322565b80611cf1575033611ce686610a42565b6001600160a01b0316145b905080611d1157604051632ce44b5f60e11b815260040160405180910390fd5b505b611d1f600085836114dc565b6001600160a01b0380821660008181526007602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526006909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b178555918901808452922080549194909116611e1d576002548214611e1d57805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b03841690600080516020612840833981519152908390a450506003805460010190555050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611e955772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611ec1576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611edf57662386f26fc10000830492506010015b6305f5e1008310611ef7576305f5e100830492506008015b6127108310611f0b57612710830492506004015b60648310611f1d576064830492506002015b600a83106109845760010192915050565b610b0e8383836001611f70565b60006001600160e01b0319821663152a902d60e11b148061098457506301ffc9a760e01b6001600160e01b0319831614610984565b6002546001600160a01b038516611f9957604051622e076360e81b815260040160405180910390fd5b83600003611fba5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260076020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600690925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561206b57506001600160a01b0387163b15155b156120e1575b60405182906001600160a01b03891690600090600080516020612840833981519152908290a46120aa6000888480600101955088611abb565b6120c7576040516368d2bf6b60e11b815260040160405180910390fd5b8082036120715782600254146120dc57600080fd5b612114565b5b6040516001830192906001600160a01b03891690600090600080516020612840833981519152908290a48082036120e2575b5060025561170d565b6001600160e01b031981168114610dd757600080fd5b60006020828403121561214557600080fd5b813561125d8161211d565b8035801515811461216057600080fd5b919050565b60006020828403121561217757600080fd5b61125d82612150565b60005b8381101561219b578181015183820152602001612183565b50506000910152565b600081518084526121bc816020860160208601612180565b601f01601f19169290920160200192915050565b60208152600061125d60208301846121a4565b6000602082840312156121f557600080fd5b5035919050565b6001600160a01b0381168114610dd757600080fd5b6000806040838503121561222457600080fd5b823561222f816121fc565b946020939093013593505050565b60008060006060848603121561225257600080fd5b833561225d816121fc565b9250602084013561226d816121fc565b929592945050506040919091013590565b6000806040838503121561229157600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156122de576122de6122a0565b604052919050565b60006001600160401b038311156122ff576122ff6122a0565b612312601f8401601f19166020016122b6565b905082815283838301111561232657600080fd5b828260208301376000602084830101529392505050565b60006020828403121561234f57600080fd5b81356001600160401b0381111561236557600080fd5b8201601f8101841361237657600080fd5b611b9f848235602084016122e6565b60006020828403121561239757600080fd5b813561125d816121fc565b600080604083850312156123b557600080fd5b82356123c0816121fc565b915060208301356001600160601b03811681146123dc57600080fd5b809150509250929050565b600080604083850312156123fa57600080fd5b8235612405816121fc565b915061241360208401612150565b90509250929050565b6000806000806080858703121561243257600080fd5b843561243d816121fc565b9350602085013561244d816121fc565b92506040850135915060608501356001600160401b0381111561246f57600080fd5b8501601f8101871361248057600080fd5b61248f878235602084016122e6565b91505092959194509250565b600080604083850312156124ae57600080fd5b82356001600160401b03808211156124c557600080fd5b818501915085601f8301126124d957600080fd5b81356020828211156124ed576124ed6122a0565b8160051b92506124fe8184016122b6565b828152928401810192818101908985111561251857600080fd5b948201945b848610156125425785359350612532846121fc565b838252948201949082019061251d565b96506125519050878201612150565b9450505050509250929050565b6000806040838503121561257157600080fd5b823561257c816121fc565b915060208301356123dc816121fc565b600181811c908216806125a057607f821691505b6020821081036125c057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610984576109846125c6565b60008261261057634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610984576109846125c6565b6020808252818101527f507572636861736520776f756c6420657863656564206d617820746f6b656e73604082015260600190565b601f821115610b0e57600081815260208120601f850160051c810160208610156126845750805b601f850160051c820191505b818110156126a357828155600101612690565b505050505050565b81516001600160401b038111156126c4576126c46122a0565b6126d8816126d2845461258c565b8461265d565b602080601f83116001811461270d57600084156126f55750858301515b600019600386901b1c1916600185901b1785556126a3565b600085815260208120601f198616915b8281101561273c5788860151825594840194600190910190840161271d565b508582101561275a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000835161277c818460208801612180565b835190830190612790818360208801612180565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b6000600182016127c1576127c16125c6565b5060010190565b6000602082840312156127da57600080fd5b815161125d816121fc565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612818908301846121a4565b9695505050505050565b60006020828403121561283457600080fd5b815161125d8161211d56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220b09e2d3d9e5b223d4ea8ae29487c8f0cb845fc463a66cd10400e1f8bb301b17e64736f6c63430008120033000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011040000000000000000000000000d9b59d8f9620318bb05f7bf300d8121634491d7000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000000c5045504520456d6272796f73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045045504500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f6d696e742e6c6966656f66706570652e636f6d2f706570652d6e66742d6170692f0000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102ff5760003560e01c80637c928fe911610190578063c87b56dd116100dc578063ecade2f011610095578063f2fde38b1161006f578063f2fde38b146108ec578063f34e4bdc1461090c578063f6a5b8e614610939578063fa02b8671461095957600080fd5b8063ecade2f01461088c578063f07b92cd146108ac578063f1d5f517146108cc57600080fd5b8063c87b56dd146107bb578063cc47a40b146107db578063d46e0aab146107fb578063d88c271e1461081b578063e985e9c51461084b578063eb8d24441461086b57600080fd5b8063a1ca2a5711610149578063b88d4fde11610123578063b88d4fde14610745578063bd2f6eb814610765578063c38bb53714610785578063c7f8d01a146107a557600080fd5b8063a1ca2a57146106e4578063a22cb46514610705578063ab7b49931461072557600080fd5b80637c928fe91461063b57806385faec0f1461065b5780638da5cb5b1461067b57806395d89b411461069957806399b2b20a146106ae5780639d1b464a146106ce57600080fd5b806332cb6b0c1161024f57806355f804b3116102085780636352211e116101e25780636352211e146105d35780636aabb947146105f357806370a0823114610606578063715018a61461062657600080fd5b806355f804b31461057f578063564b81ef1461059f5780635c975abb146105b257600080fd5b806332cb6b0c146104e45780633c8463a1146104fa5780633ccfd60b146105105780633dc7fdd61461052557806342842e0e1461053f57806342966c681461055f57600080fd5b8063095ea7b3116102bc57806318b200711161029657806318b200711461045257806323b872dd146104725780632a55205a146104925780632db11544146104d157600080fd5b8063095ea7b3146103f957806311464fbe1461041957806318160ddd1461043957600080fd5b806301ffc9a71461030457806302c8898914610339578063056d5afe1461035b57806306fdde0314610393578063081812fc146103b557806308346d85146103d5575b600080fd5b34801561031057600080fd5b5061032461031f366004612133565b610979565b60405190151581526020015b60405180910390f35b34801561034557600080fd5b50610359610354366004612165565b61098a565b005b34801561036757600080fd5b5060125461037b906001600160a01b031681565b6040516001600160a01b039091168152602001610330565b34801561039f57600080fd5b506103a86109b0565b60405161033091906121d0565b3480156103c157600080fd5b5061037b6103d03660046121e3565b610a42565b3480156103e157600080fd5b506103eb60145481565b604051908152602001610330565b34801561040557600080fd5b50610359610414366004612211565b610a86565b34801561042557600080fd5b5060135461037b906001600160a01b031681565b34801561044557600080fd5b50600354600254036103eb565b34801561045e57600080fd5b5061035961046d3660046121e3565b610b13565b34801561047e57600080fd5b5061035961048d36600461223d565b610b20565b34801561049e57600080fd5b506104b26104ad36600461227e565b610b2b565b604080516001600160a01b039093168352602083019190915201610330565b6103596104df3660046121e3565b610bd7565b3480156104f057600080fd5b506103eb600d5481565b34801561050657600080fd5b506103eb60115481565b34801561051c57600080fd5b50610359610ce7565b34801561053157600080fd5b50600f546103249060ff1681565b34801561054b57600080fd5b5061035961055a36600461223d565b610d1e565b34801561056b57600080fd5b5061035961057a3660046121e3565b610d39565b34801561058b57600080fd5b5061035961059a36600461233d565b610dda565b3480156105ab57600080fd5b50466103eb565b3480156105be57600080fd5b50600a5461032490600160a01b900460ff1681565b3480156105df57600080fd5b5061037b6105ee3660046121e3565b610dee565b6103596106013660046121e3565b610e00565b34801561061257600080fd5b506103eb610621366004612385565b610eed565b34801561063257600080fd5b50610359610f3b565b34801561064757600080fd5b506103596106563660046121e3565b610f4f565b34801561066757600080fd5b506103596106763660046121e3565b61106f565b34801561068757600080fd5b50600a546001600160a01b031661037b565b3480156106a557600080fd5b506103a861107c565b3480156106ba57600080fd5b506103596106c93660046123a2565b61108b565b3480156106da57600080fd5b506103eb60105481565b3480156106f057600080fd5b5060135461032490600160a01b900460ff1681565b34801561071157600080fd5b506103596107203660046123e7565b61109d565b34801561073157600080fd5b50610359610740366004612385565b611132565b34801561075157600080fd5b5061035961076036600461241c565b61115c565b34801561077157600080fd5b506103596107803660046121e3565b6111ad565b34801561079157600080fd5b506103596107a0366004612165565b6111ba565b3480156107b157600080fd5b506103eb600e5481565b3480156107c757600080fd5b506103a86107d63660046121e3565b6111e0565b3480156107e757600080fd5b506103596107f6366004612211565b611264565b34801561080757600080fd5b5061035961081636600461249b565b6112b3565b34801561082757600080fd5b50610324610836366004612385565b60166020526000908152604090205460ff1681565b34801561085757600080fd5b5061032461086636600461255e565b611322565b34801561087757600080fd5b50600a5461032490600160a81b900460ff1681565b34801561089857600080fd5b506103596108a7366004612385565b611350565b3480156108b857600080fd5b506103596108c7366004612165565b61137a565b3480156108d857600080fd5b506103596108e73660046121e3565b6113a0565b3480156108f857600080fd5b50610359610907366004612385565b6113ad565b34801561091857600080fd5b506103eb610927366004612385565b60156020526000908152604090205481565b34801561094557600080fd5b506103596109543660046121e3565b611423565b34801561096557600080fd5b50610359610974366004612165565b611430565b60006109848261144b565b92915050565b610992611456565b600a8054911515600160a81b0260ff60a81b19909216919091179055565b6060600480546109bf9061258c565b80601f01602080910402602001604051908101604052809291908181526020018280546109eb9061258c565b8015610a385780601f10610a0d57610100808354040283529160200191610a38565b820191906000526020600020905b815481529060010190602001808311610a1b57829003601f168201915b5050505050905090565b6000610a4d826114b0565b610a6a576040516333d1c03960e21b815260040160405180910390fd5b506000908152600860205260409020546001600160a01b031690565b6000610a9182610dee565b9050806001600160a01b0316836001600160a01b031603610ac55760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610ae55750610ae38133611322565b155b15610b03576040516367d9dca160e11b815260040160405180910390fd5b610b0e8383836114dc565b505050565b610b1b611456565b601055565b610b0e838383611538565b60008281526001602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610ba05750604080518082019091526000546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610bbf906001600160601b0316876125dc565b610bc991906125f3565b915196919550909350505050565b6000610be66003546002540390565b600a54909150600160a81b900460ff16610c525760405162461bcd60e51b815260206004820152602260248201527f53616c65206d7573742062652061637469766520746f206d696e7420746f6b656044820152616e7360f01b60648201526084015b60405180910390fd5b600d54610c5f8383612615565b1115610c7d5760405162461bcd60e51b8152600401610c4990612628565b3482601054610c8c91906125dc565b14610cd95760405162461bcd60e51b815260206004820152601960248201527f53656e742076616c7565206973206e6f7420636f7272656374000000000000006044820152606401610c49565b610ce38282611714565b5050565b610cef611456565b6040514790339082156108fc029083906000818181858888f19350505050158015610ce3573d6000803e3d6000fd5b610b0e8383836040518060200160405280600081525061115c565b610d42816114b0565b610d7c5760405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642049642160a81b6044820152606401610c49565b33610d8682610dee565b6001600160a01b031614610dce5760405162461bcd60e51b815260206004820152600f60248201526e2737ba10309027232a1027bbb732b960891b6044820152606401610c49565b610dd781611847565b50565b610de2611456565b600c610ce382826126ab565b6000610df982611852565b5192915050565b6000610e0f6003546002540390565b600f5490915060ff16610e5b5760405162461bcd60e51b81526020600482015260146024820152732ba61036b4b73a1034b9903234b9b0b13632b21760611b6044820152606401610c49565b3360009081526016602052604090205460ff16610eb35760405162461bcd60e51b81526020600482015260166024820152751059191c995cdcc8084f481dda1a5d195b1a5cdd195960521b6044820152606401610c49565b600d54610ec08383612615565b1115610ede5760405162461bcd60e51b8152600401610c4990612628565b3482600e54610c8c91906125dc565b60006001600160a01b038216610f16576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600760205260409020546001600160401b031690565b610f43611456565b610f4d600061196c565b565b6000610f5e6003546002540390565b601354909150600160a01b900460ff16610fb25760405162461bcd60e51b8152602060048201526015602482015274233932b29036b4b73a1034b9903234b0b13632b21760591b6044820152606401610c49565b60145433600090815260156020526040902054610fcf9084612615565b11156110125760405162461bcd60e51b8152602060048201526012602482015271115e18d959591cc8199c9959481b1a5b5a5d60721b6044820152606401610c49565b600d5461101f8383612615565b111561103d5760405162461bcd60e51b8152600401610c4990612628565b6110478282611714565b3360009081526015602052604081208054849290611066908490612615565b90915550505050565b611077611456565b600b55565b6060600580546109bf9061258c565b611093611456565b610ce382826119be565b336001600160a01b038316036110c65760405163b06307db60e01b815260040160405180910390fd5b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61113a611456565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b611167848484611538565b6001600160a01b0383163b15158015611189575061118784848484611abb565b155b156111a7576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6111b5611456565b601455565b6111c2611456565b600a8054911515600160a01b0260ff60a01b19909216919091179055565b60606111eb826114b0565b61120857604051630a14c4b560e41b815260040160405180910390fd5b6000611212611ba7565b90508051600003611232576040518060200160405280600081525061125d565b8061123c84611bb6565b60405160200161124d92919061276a565b6040516020818303038152906040525b9392505050565b61126c611456565b600061127b6003546002540390565b600d5490915061128b8383612615565b11156112a95760405162461bcd60e51b8152600401610c4990612628565b610b0e8383611c48565b6112bb611456565b60005b8251811015610b0e5781601660008584815181106112de576112de612799565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061131a816127af565b9150506112be565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b611358611456565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b611382611456565b60138054911515600160a01b0260ff60a01b19909216919091179055565b6113a8611456565b601155565b6113b5611456565b6001600160a01b03811661141a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c49565b610dd78161196c565b61142b611456565b600e55565b611438611456565b600f805460ff1916911515919091179055565b600061098482611c62565b600a546001600160a01b03163314610f4d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c49565b600060025482108015610984575050600090815260066020526040902054600160e01b900460ff161590565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061154382611852565b9050836001600160a01b031681600001516001600160a01b03161461157a5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061159857506115988533611322565b806115b35750336115a884610a42565b6001600160a01b0316145b9050806115d357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0384166115fa57604051633a954ecd60e21b815260040160405180910390fd5b611606600084876114dc565b6001600160a01b038581166000908152600760209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600690945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166116da5760025482146116da57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b031660008051602061284083398151915260405160405180910390a45b5050505050565b600a54600160a01b900460ff16156117615760405162461bcd60e51b815260206004820152601060248201526f4d494e54494e473a205061757365642160801b6044820152606401610c49565b61176b3383611c48565b60005b82811015610b0e576012546013546001600160a01b039182169163da7323b39116463061179b8688612615565b600b546040516001600160e01b031960e088901b1681526001600160a01b03958616600482015260248101949094529390911660448301526064820152608481019190915260c060a4820152600060c482015260e4016020604051808303816000875af1158015611810573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183491906127c8565b508061183f816127af565b91505061176e565b610dd7816000611ca2565b60408051606081018252600080825260208201819052918101919091528160025481101561195357600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906119515780516001600160a01b0316156118e8579392505050565b5060001901600081815260066020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521561194c579392505050565b6118e8565b505b604051636f96cda160e11b815260040160405180910390fd5b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b0382161115611a2c5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610c49565b6001600160a01b038216611a825760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610c49565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600055565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611af09033908990889088906004016127e5565b6020604051808303816000875af1925050508015611b2b575060408051601f3d908101601f19168201909252611b2891810190612822565b60015b611b89573d808015611b59576040519150601f19603f3d011682016040523d82523d6000602084013e611b5e565b606091505b508051600003611b81576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600c80546109bf9061258c565b60606000611bc383611e56565b60010190506000816001600160401b03811115611be257611be26122a0565b6040519080825280601f01601f191660200182016040528015611c0c576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611c1657509392505050565b610ce3828260405180602001604052806000815250611f2e565b60006001600160e01b031982166380ac58cd60e01b1480611c9357506001600160e01b03198216635b5e139f60e01b145b80610984575061098482611f3b565b6000611cad83611852565b80519091508215611d13576000336001600160a01b0383161480611cd65750611cd68233611322565b80611cf1575033611ce686610a42565b6001600160a01b0316145b905080611d1157604051632ce44b5f60e11b815260040160405180910390fd5b505b611d1f600085836114dc565b6001600160a01b0380821660008181526007602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526006909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b178555918901808452922080549194909116611e1d576002548214611e1d57805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b03841690600080516020612840833981519152908390a450506003805460010190555050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611e955772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611ec1576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611edf57662386f26fc10000830492506010015b6305f5e1008310611ef7576305f5e100830492506008015b6127108310611f0b57612710830492506004015b60648310611f1d576064830492506002015b600a83106109845760010192915050565b610b0e8383836001611f70565b60006001600160e01b0319821663152a902d60e11b148061098457506301ffc9a760e01b6001600160e01b0319831614610984565b6002546001600160a01b038516611f9957604051622e076360e81b815260040160405180910390fd5b83600003611fba5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260076020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600690925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561206b57506001600160a01b0387163b15155b156120e1575b60405182906001600160a01b03891690600090600080516020612840833981519152908290a46120aa6000888480600101955088611abb565b6120c7576040516368d2bf6b60e11b815260040160405180910390fd5b8082036120715782600254146120dc57600080fd5b612114565b5b6040516001830192906001600160a01b03891690600090600080516020612840833981519152908290a48082036120e2575b5060025561170d565b6001600160e01b031981168114610dd757600080fd5b60006020828403121561214557600080fd5b813561125d8161211d565b8035801515811461216057600080fd5b919050565b60006020828403121561217757600080fd5b61125d82612150565b60005b8381101561219b578181015183820152602001612183565b50506000910152565b600081518084526121bc816020860160208601612180565b601f01601f19169290920160200192915050565b60208152600061125d60208301846121a4565b6000602082840312156121f557600080fd5b5035919050565b6001600160a01b0381168114610dd757600080fd5b6000806040838503121561222457600080fd5b823561222f816121fc565b946020939093013593505050565b60008060006060848603121561225257600080fd5b833561225d816121fc565b9250602084013561226d816121fc565b929592945050506040919091013590565b6000806040838503121561229157600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156122de576122de6122a0565b604052919050565b60006001600160401b038311156122ff576122ff6122a0565b612312601f8401601f19166020016122b6565b905082815283838301111561232657600080fd5b828260208301376000602084830101529392505050565b60006020828403121561234f57600080fd5b81356001600160401b0381111561236557600080fd5b8201601f8101841361237657600080fd5b611b9f848235602084016122e6565b60006020828403121561239757600080fd5b813561125d816121fc565b600080604083850312156123b557600080fd5b82356123c0816121fc565b915060208301356001600160601b03811681146123dc57600080fd5b809150509250929050565b600080604083850312156123fa57600080fd5b8235612405816121fc565b915061241360208401612150565b90509250929050565b6000806000806080858703121561243257600080fd5b843561243d816121fc565b9350602085013561244d816121fc565b92506040850135915060608501356001600160401b0381111561246f57600080fd5b8501601f8101871361248057600080fd5b61248f878235602084016122e6565b91505092959194509250565b600080604083850312156124ae57600080fd5b82356001600160401b03808211156124c557600080fd5b818501915085601f8301126124d957600080fd5b81356020828211156124ed576124ed6122a0565b8160051b92506124fe8184016122b6565b828152928401810192818101908985111561251857600080fd5b948201945b848610156125425785359350612532846121fc565b838252948201949082019061251d565b96506125519050878201612150565b9450505050509250929050565b6000806040838503121561257157600080fd5b823561257c816121fc565b915060208301356123dc816121fc565b600181811c908216806125a057607f821691505b6020821081036125c057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610984576109846125c6565b60008261261057634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610984576109846125c6565b6020808252818101527f507572636861736520776f756c6420657863656564206d617820746f6b656e73604082015260600190565b601f821115610b0e57600081815260208120601f850160051c810160208610156126845750805b601f850160051c820191505b818110156126a357828155600101612690565b505050505050565b81516001600160401b038111156126c4576126c46122a0565b6126d8816126d2845461258c565b8461265d565b602080601f83116001811461270d57600084156126f55750858301515b600019600386901b1c1916600185901b1785556126a3565b600085815260208120601f198616915b8281101561273c5788860151825594840194600190910190840161271d565b508582101561275a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000835161277c818460208801612180565b835190830190612790818360208801612180565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b6000600182016127c1576127c16125c6565b5060010190565b6000602082840312156127da57600080fd5b815161125d816121fc565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612818908301846121a4565b9695505050505050565b60006020828403121561283457600080fd5b815161125d8161211d56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220b09e2d3d9e5b223d4ea8ae29487c8f0cb845fc463a66cd10400e1f8bb301b17e64736f6c63430008120033

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

000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011040000000000000000000000000d9b59d8f9620318bb05f7bf300d8121634491d7000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000000c5045504520456d6272796f73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045045504500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f6d696e742e6c6966656f66706570652e636f6d2f706570652d6e66742d6170692f0000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): PEPE Embryos
Arg [1] : _symbol (string): PEPE
Arg [2] : _uri (string): https://mint.lifeofpepe.com/pepe-nft-api/
Arg [3] : limit (uint256): 10
Arg [4] : price (uint256): 0
Arg [5] : maxSupply (uint256): 69696
Arg [6] : _receiver (address): 0xd9b59D8F9620318BB05f7Bf300D8121634491d70
Arg [7] : feeNumerator (uint96): 960

-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000011040
Arg [6] : 000000000000000000000000d9b59d8f9620318bb05f7bf300d8121634491d70
Arg [7] : 00000000000000000000000000000000000000000000000000000000000003c0
Arg [8] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [9] : 5045504520456d6272796f730000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [11] : 5045504500000000000000000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000029
Arg [13] : 68747470733a2f2f6d696e742e6c6966656f66706570652e636f6d2f70657065
Arg [14] : 2d6e66742d6170692f0000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

362:7868:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7886:181;;;;;;;;;;-1:-1:-1;7886:181:14;;;;;:::i;:::-;;:::i;:::-;;;565:14:20;;558:22;540:41;;528:2;513:18;7886:181:14;;;;;;;;5081:99;;;;;;;;;;-1:-1:-1;5081:99:14;;;;;:::i;:::-;;:::i;:::-;;732:30;;;;;;;;;;-1:-1:-1;732:30:14;;;;-1:-1:-1;;;;;732:30:14;;;;;;-1:-1:-1;;;;;1106:32:20;;;1088:51;;1076:2;1061:18;732:30:14;942:203:20;7584:98:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;9098:214::-;;;;;;;;;;-1:-1:-1;9098:214:18;;;;;:::i;:::-;;:::i;841:28:14:-;;;;;;;;;;;;;;;;;;;2237:25:20;;;2225:2;2210:18;841:28:14;2091:177:20;8675:362:18;;;;;;;;;;-1:-1:-1;8675:362:18;;;;;:::i;:::-;;:::i;768:36:14:-;;;;;;;;;;-1:-1:-1;768:36:14;;;;-1:-1:-1;;;;;768:36:14;;;3799:297:18;;;;;;;;;;-1:-1:-1;4049:12:18;;4033:13;;:28;3799:297;;5787:96:14;;;;;;;;;;-1:-1:-1;5787:96:14;;;;;:::i;:::-;;:::i;9995:164:18:-;;;;;;;;;;-1:-1:-1;9995:164:18;;;;;:::i;:::-;;:::i;773:462:17:-;;;;;;;;;;-1:-1:-1;773:462:17;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3635:32:20;;;3617:51;;3699:2;3684:18;;3677:34;;;;3590:18;773:462:17;3443:274:20;2034:445:14;;;;;;:::i;:::-;;:::i;549:25::-;;;;;;;;;;;;;;;;699:26;;;;;;;;;;;;;;;;4798:142;;;;;;;;;;;;;:::i;637:22::-;;;;;;;;;;-1:-1:-1;637:22:14;;;;;;;;10225:179:18;;;;;;;;;;-1:-1:-1;10225:179:18;;;;;:::i;:::-;;:::i;4051:189:14:-;;;;;;;;;;-1:-1:-1;4051:189:14;;;;;:::i;:::-;;:::i;7349:107::-;;;;;;;;;;-1:-1:-1;7349:107:14;;;;;:::i;:::-;;:::i;8073:155::-;;;;;;;;;;-1:-1:-1;8184:9:14;8073:155;;424:18;;;;;;;;;;-1:-1:-1;424:18:14;;;;-1:-1:-1;;;424:18:14;;;;;;7399:123:18;;;;;;;;;;-1:-1:-1;7399:123:18;;;;;:::i;:::-;;:::i;3185:405:14:-;;;;;;:::i;:::-;;:::i;4901:203:18:-;;;;;;;;;;-1:-1:-1;4901:203:18;;;;;:::i;:::-;;:::i;1824:101:0:-;;;;;;;;;;;;;:::i;2619:428:14:-;;;;;;;;;;-1:-1:-1;2619:428:14;;;;;:::i;:::-;;:::i;7670:89::-;;;;;;;;;;-1:-1:-1;7670:89:14;;;;;:::i;:::-;;:::i;1201:85:0:-;;;;;;;;;;-1:-1:-1;1273:6:0;;-1:-1:-1;;;;;1273:6:0;1201:85;;7746:102:18;;;;;;;;;;;;;:::i;7043:161:14:-;;;;;;;;;;-1:-1:-1;7043:161:14;;;;;:::i;:::-;;:::i;666:27::-;;;;;;;;;;;;;;;;811:24;;;;;;;;;;-1:-1:-1;811:24:14;;;;-1:-1:-1;;;811:24:14;;;;;;9379:304:18;;;;;;;;;;-1:-1:-1;9379:304:18;;;;;:::i;:::-;;:::i;6249:102:14:-;;;;;;;;;;-1:-1:-1;6249:102:14;;;;;:::i;:::-;;:::i;10470:393:18:-;;;;;;;;;;-1:-1:-1;10470:393:18;;;;;:::i;:::-;;:::i;5186:100:14:-;;;;;;;;;;-1:-1:-1;5186:100:14;;;;;:::i;:::-;;:::i;5292:90::-;;;;;;;;;;-1:-1:-1;5292:90:14;;;;;:::i;:::-;;:::i;609:22::-;;;;;;;;;;;;;;;;7914:371:18;;;;;;;;;;-1:-1:-1;7914:371:18;;;;;:::i;:::-;;:::i;4486:218:14:-;;;;;;;;;;-1:-1:-1;4486:218:14;;;;;:::i;:::-;;:::i;5388:232::-;;;;;;;;;;-1:-1:-1;5388:232:14;;;;;:::i;:::-;;:::i;932:49::-;;;;;;;;;;-1:-1:-1;932:49:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;9749:184:18;;;;;;;;;;-1:-1:-1;9749:184:18;;;;;:::i;:::-;;:::i;448:24:14:-;;;;;;;;;;-1:-1:-1;448:24:14;;;;-1:-1:-1;;;448:24:14;;;;;;6496:114;;;;;;;;;;-1:-1:-1;6496:114:14;;;;;:::i;:::-;;:::i;7462:100::-;;;;;;;;;;-1:-1:-1;7462:100:14;;;;;:::i;:::-;;:::i;6791:94::-;;;;;;;;;;-1:-1:-1;6791:94:14;;;;;:::i;:::-;;:::i;2074:198:0:-;;;;;;;;;;-1:-1:-1;2074:198:0;;;;;:::i;:::-;;:::i;875:51:14:-;;;;;;;;;;-1:-1:-1;875:51:14;;;;;:::i;:::-;;;;;;;;;;;;;;6022:86;;;;;;;;;;-1:-1:-1;6022:86:14;;;;;:::i;:::-;;:::i;7568:96::-;;;;;;;;;;-1:-1:-1;7568:96:14;;;;;:::i;:::-;;:::i;7886:181::-;8001:4;8024:36;8048:11;8024:23;:36::i;:::-;8017:43;7886:181;-1:-1:-1;;7886:181:14:o;5081:99::-;1094:13:0;:11;:13::i;:::-;5150:12:14::1;:23:::0;;;::::1;;-1:-1:-1::0;;;5150:23:14::1;-1:-1:-1::0;;;;5150:23:14;;::::1;::::0;;;::::1;::::0;;5081:99::o;7584:98:18:-;7638:13;7670:5;7663:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7584:98;:::o;9098:214::-;9180:7;9204:16;9212:7;9204;:16::i;:::-;9199:64;;9229:34;;-1:-1:-1;;;9229:34:18;;;;;;;;;;;9199:64;-1:-1:-1;9281:24:18;;;;:15;:24;;;;;;-1:-1:-1;;;;;9281:24:18;;9098:214::o;8675:362::-;8747:13;8763:24;8779:7;8763:15;:24::i;:::-;8747:40;;8807:5;-1:-1:-1;;;;;8801:11:18;:2;-1:-1:-1;;;;;8801:11:18;;8797:48;;8821:24;;-1:-1:-1;;;8821:24:18;;;;;;;;;;;8797:48;719:10:8;-1:-1:-1;;;;;8860:21:18;;;;;;:63;;-1:-1:-1;8886:37:18;8903:5;719:10:8;9749:184:18;:::i;8886:37::-;8885:38;8860:63;8856:136;;;8946:35;;-1:-1:-1;;;8946:35:18;;;;;;;;;;;8856:136;9002:28;9011:2;9015:7;9024:5;9002:8;:28::i;:::-;8737:300;8675:362;;:::o;5787:96:14:-;1094:13:0;:11;:13::i;:::-;5856:12:14::1;:20:::0;5787:96::o;9995:164:18:-;10124:28;10134:4;10140:2;10144:7;10124:9;:28::i;773:462:17:-;890:7;947:26;;;:17;:26;;;;;;;;918:55;;;;;;;;;-1:-1:-1;;;;;918:55:17;;;;;-1:-1:-1;;;918:55:17;;;-1:-1:-1;;;;;918:55:17;;;;;;;;890:7;;984:90;;-1:-1:-1;1034:29:17;;;;;;;;;-1:-1:-1;1034:29:17;-1:-1:-1;;;;;1034:29:17;;;;-1:-1:-1;;;1034:29:17;;-1:-1:-1;;;;;1034:29:17;;;;;984:90;1121:23;;;;1084:21;;1593:5;;1109:35;;-1:-1:-1;;;;;1109:35:17;:9;:35;:::i;:::-;1108:69;;;;:::i;:::-;1196:16;;;;;-1:-1:-1;773:462:17;;-1:-1:-1;;;;773:462:17:o;2034:445:14:-;2097:10;2110:13;4049:12:18;;4033:13;;:28;;3799:297;2110:13:14;2197:12;;2097:26;;-1:-1:-1;;;;2197:12:14;;;;2189:59;;;;-1:-1:-1;;;2189:59:14;;9549:2:20;2189:59:14;;;9531:21:20;9588:2;9568:18;;;9561:30;9627:34;9607:18;;;9600:62;-1:-1:-1;;;9678:18:20;;;9671:32;9720:19;;2189:59:14;;;;;;;;;2281:10;;2266:11;2271:6;2266:2;:11;:::i;:::-;:25;;2258:70;;;;-1:-1:-1;;;2258:70:14;;;;;;;:::i;:::-;2384:9;2374:6;2359:12;;:21;;;;:::i;:::-;:34;2338:106;;;;-1:-1:-1;;;2338:106:14;;10443:2:20;2338:106:14;;;10425:21:20;10482:2;10462:18;;;10455:30;10521:27;10501:18;;;10494:55;10566:18;;2338:106:14;10241:349:20;2338:106:14;2455:17;2461:6;2469:2;2455:5;:17::i;:::-;2087:392;2034:445;:::o;4798:142::-;1094:13:0;:11;:13::i;:::-;4896:37:14::1;::::0;4865:21:::1;::::0;4904:10:::1;::::0;4896:37;::::1;;;::::0;4865:21;;4847:15:::1;4896:37:::0;4847:15;4896:37;4865:21;4904:10;4896:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;10225:179:18::0;10358:39;10375:4;10381:2;10385:7;10358:39;;;;;;;;;;;;:16;:39::i;4051:189:14:-;4109:16;4117:7;4109;:16::i;:::-;4101:40;;;;-1:-1:-1;;;4101:40:14;;10797:2:20;4101:40:14;;;10779:21:20;10836:2;10816:18;;;10809:30;-1:-1:-1;;;10855:18:20;;;10848:41;10906:18;;4101:40:14;10595:335:20;4101:40:14;4179:10;4159:16;4167:7;4159;:16::i;:::-;-1:-1:-1;;;;;4159:30:14;;4151:58;;;;-1:-1:-1;;;4151:58:14;;11137:2:20;4151:58:14;;;11119:21:20;11176:2;11156:18;;;11149:30;-1:-1:-1;;;11195:18:20;;;11188:45;11250:18;;4151:58:14;10935:339:20;4151:58:14;4219:14;4225:7;4219:5;:14::i;:::-;4051:189;:::o;7349:107::-;1094:13:0;:11;:13::i;:::-;7422:16:14::1;:27;7441:8:::0;7422:16;:27:::1;:::i;7399:123:18:-:0;7463:7;7489:21;7502:7;7489:12;:21::i;:::-;:26;;7399:123;-1:-1:-1;;7399:123:18:o;3185:405:14:-;3244:10;3257:13;4049:12:18;;4033:13;;:28;;3799:297;3257:13:14;3289:10;;3244:26;;-1:-1:-1;3289:10:14;;3281:43;;;;-1:-1:-1;;;3281:43:14;;13685:2:20;3281:43:14;;;13667:21:20;13724:2;13704:18;;;13697:30;-1:-1:-1;;;13743:18:20;;;13736:50;13803:18;;3281:43:14;13483:344:20;3281:43:14;3360:10;3342:29;;;;:17;:29;;;;;;;;3334:64;;;;-1:-1:-1;;;3334:64:14;;14034:2:20;3334:64:14;;;14016:21:20;14073:2;14053:18;;;14046:30;-1:-1:-1;;;14092:18:20;;;14085:52;14154:18;;3334:64:14;13832:346:20;3334:64:14;3431:10;;3416:11;3421:6;3416:2;:11;:::i;:::-;:25;;3408:70;;;;-1:-1:-1;;;3408:70:14;;;;;;;:::i;:::-;3516:9;3506:6;3496:7;;:16;;;;:::i;4901:203:18:-;4965:7;-1:-1:-1;;;;;4988:19:18;;4984:60;;5016:28;;-1:-1:-1;;;5016:28:18;;;;;;;;;;;4984:60;-1:-1:-1;;;;;;5069:19:18;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;5069:27:18;;4901:203::o;1824:101:0:-;1094:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;2619:428:14:-;2672:10;2685:13;4049:12:18;;4033:13;;:28;;3799:297;2685:13:14;2717:12;;2672:26;;-1:-1:-1;;;;2717:12:14;;;;2709:46;;;;-1:-1:-1;;;2709:46:14;;14385:2:20;2709:46:14;;;14367:21:20;14424:2;14404:18;;;14397:30;-1:-1:-1;;;14443:18:20;;;14436:51;14504:18;;2709:46:14;14183:345:20;2709:46:14;2827:13;;2812:10;2795:28;;;;:16;:28;;;;;;2786:37;;:6;:37;:::i;:::-;:54;;2765:119;;;;-1:-1:-1;;;2765:119:14;;14735:2:20;2765:119:14;;;14717:21:20;14774:2;14754:18;;;14747:30;-1:-1:-1;;;14793:18:20;;;14786:48;14851:18;;2765:119:14;14533:342:20;2765:119:14;2917:10;;2902:11;2907:6;2902:2;:11;:::i;:::-;:25;;2894:70;;;;-1:-1:-1;;;2894:70:14;;;;;;;:::i;:::-;2975:17;2981:6;2989:2;2975:5;:17::i;:::-;3019:10;3002:28;;;;:16;:28;;;;;:38;;3034:6;;3002:28;:38;;3034:6;;3002:38;:::i;:::-;;;;-1:-1:-1;;;;2619:428:14:o;7670:89::-;1094:13:0;:11;:13::i;:::-;7740:5:14::1;:12:::0;7670:89::o;7746:102:18:-;7802:13;7834:7;7827:14;;;;;:::i;7043:161:14:-;1094:13:0;:11;:13::i;:::-;7154:43:14::1;7173:9;7184:12;7154:18;:43::i;9379:304:18:-:0;719:10:8;-1:-1:-1;;;;;9499:24:18;;;9495:54;;9532:17;;-1:-1:-1;;;9532:17:18;;;;;;;;;;;9495:54;719:10:8;9560:32:18;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;9560:42:18;;;;;;;;;;;;:53;;-1:-1:-1;;9560:53:18;;;;;;;;;;9628:48;;540:41:20;;;9560:42:18;;719:10:8;9628:48:18;;513:18:20;9628:48:18;;;;;;;9379:304;;:::o;6249:102:14:-;1094:13:0;:11;:13::i;:::-;6321:15:14::1;:23:::0;;-1:-1:-1;;;;;;6321:23:14::1;-1:-1:-1::0;;;;;6321:23:14;;;::::1;::::0;;;::::1;::::0;;6249:102::o;10470:393:18:-;10631:28;10641:4;10647:2;10651:7;10631:9;:28::i;:::-;-1:-1:-1;;;;;10686:13:18;;1702:19:7;:23;;10686:88:18;;;;;10718:56;10749:4;10755:2;10759:7;10768:5;10718:30;:56::i;:::-;10717:57;10686:88;10669:188;;;10806:40;;-1:-1:-1;;;10806:40:18;;;;;;;;;;;10669:188;10470:393;;;;:::o;5186:100:14:-;1094:13:0;:11;:13::i;:::-;5257::14::1;:22:::0;5186:100::o;5292:90::-;1094:13:0;:11;:13::i;:::-;5359:6:14::1;:16:::0;;;::::1;;-1:-1:-1::0;;;5359:16:14::1;-1:-1:-1::0;;;;5359:16:14;;::::1;::::0;;;::::1;::::0;;5292:90::o;7914:371:18:-;8001:13;8031:16;8039:7;8031;:16::i;:::-;8026:59;;8056:29;;-1:-1:-1;;;8056:29:18;;;;;;;;;;;8026:59;8096:21;8120:10;:8;:10::i;:::-;8096:34;;8165:7;8159:21;8184:1;8159:26;:119;;;;;;;;;;;;;;;;;8228:7;8237:18;:7;:16;:18::i;:::-;8211:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8159:119;8140:138;7914:371;-1:-1:-1;;;7914:371:18:o;4486:218:14:-;1094:13:0;:11;:13::i;:::-;4560:10:14::1;4573:13;4049:12:18::0;;4033:13;;:28;;3799:297;4573:13:14::1;4619:10;::::0;4560:26;;-1:-1:-1;4604:11:14::1;4609:6:::0;4560:26;4604:11:::1;:::i;:::-;:25;;4596:70;;;;-1:-1:-1::0;;;4596:70:14::1;;;;;;;:::i;:::-;4676:21;4686:2;4690:6;4676:9;:21::i;5388:232::-:0;1094:13:0;:11;:13::i;:::-;5516:9:14::1;5511:103;5531:6;:13;5527:1;:17;5511:103;;;5596:7;5565:17;:28;5583:6;5590:1;5583:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;5565:28:14::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;5565:28:14;:38;;-1:-1:-1;;5565:38:14::1;::::0;::::1;;::::0;;;::::1;::::0;;5546:3;::::1;::::0;::::1;:::i;:::-;;;;5511:103;;9749:184:18::0;-1:-1:-1;;;;;9891:25:18;;;9868:4;9891:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;9749:184::o;6496:114:14:-;1094:13:0;:11;:13::i;:::-;6574:21:14::1;:29:::0;;-1:-1:-1;;;;;;6574:29:14::1;-1:-1:-1::0;;;;;6574:29:14;;;::::1;::::0;;;::::1;::::0;;6496:114::o;7462:100::-;1094:13:0;:11;:13::i;:::-;7534:12:14::1;:21:::0;;;::::1;;-1:-1:-1::0;;;7534:21:14::1;-1:-1:-1::0;;;;7534:21:14;;::::1;::::0;;;::::1;::::0;;7462:100::o;6791:94::-;1094:13:0;:11;:13::i;:::-;6859:11:14::1;:19:::0;6791:94::o;2074:198:0:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2162:22:0;::::1;2154:73;;;::::0;-1:-1:-1;;;2154:73:0;;15855:2:20;2154:73:0::1;::::0;::::1;15837:21:20::0;15894:2;15874:18;;;15867:30;15933:34;15913:18;;;15906:62;-1:-1:-1;;;15984:18:20;;;15977:36;16030:19;;2154:73:0::1;15653:402:20::0;2154:73:0::1;2237:28;2256:8;2237:18;:28::i;6022:86:14:-:0;1094:13:0;:11;:13::i;:::-;6086:7:14::1;:15:::0;6022:86::o;7568:96::-;1094:13:0;:11;:13::i;:::-;7638:10:14::1;:19:::0;;-1:-1:-1;;7638:19:14::1;::::0;::::1;;::::0;;;::::1;::::0;;7568:96::o;225:183:19:-;342:4;365:36;389:11;365:23;:36::i;1359:130:0:-;1273:6;;-1:-1:-1;;;;;1273:6:0;719:10:8;1422:23:0;1414:68;;;;-1:-1:-1;;;1414:68:0;;16262:2:20;1414:68:0;;;16244:21:20;;;16281:18;;;16274:30;16340:34;16320:18;;;16313:62;16392:18;;1414:68:0;16060:356:20;11109:208:18;11166:4;11253:13;;11243:7;:23;11201:109;;;;-1:-1:-1;;11283:20:18;;;;:11;:20;;;;;:27;-1:-1:-1;;;11283:27:18;;;;11282:28;;11109:208::o;19239:159::-;19319:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;19319:29:18;-1:-1:-1;;;;;19319:29:18;;;;;;;;;19363:28;;19319:24;;19363:28;;;;;;;19239:159;;;:::o;14339:2052::-;14419:35;14457:21;14470:7;14457:12;:21::i;:::-;14419:59;;14515:4;-1:-1:-1;;;;;14493:26:18;:13;:18;;;-1:-1:-1;;;;;14493:26:18;;14489:67;;14528:28;;-1:-1:-1;;;14528:28:18;;;;;;;;;;;14489:67;14567:22;719:10:8;-1:-1:-1;;;;;14593:20:18;;;;:72;;-1:-1:-1;14629:36:18;14646:4;719:10:8;9749:184:18;:::i;14629:36::-;14593:124;;;-1:-1:-1;719:10:8;14681:20:18;14693:7;14681:11;:20::i;:::-;-1:-1:-1;;;;;14681:36:18;;14593:124;14567:151;;14734:17;14729:66;;14760:35;;-1:-1:-1;;;14760:35:18;;;;;;;;;;;14729:66;-1:-1:-1;;;;;14809:16:18;;14805:52;;14834:23;;-1:-1:-1;;;14834:23:18;;;;;;;;;;;14805:52;14973:35;14990:1;14994:7;15003:4;14973:8;:35::i;:::-;-1:-1:-1;;;;;15298:18:18;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;15298:31:18;;;-1:-1:-1;;;;;15298:31:18;;;-1:-1:-1;;15298:31:18;;;;;;;15343:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;15343:29:18;;;;;;;;;;;15421:20;;;:11;:20;;;;;;15455:18;;-1:-1:-1;;;;;;15487:49:18;;;;-1:-1:-1;;;15520:15:18;15487:49;;;;;;;;;;15806:11;;15865:24;;;;;15907:13;;15421:20;;15865:24;;15907:13;15903:377;;16114:13;;16099:11;:28;16095:171;;16151:20;;16219:28;;;;-1:-1:-1;;;;;16193:54:18;-1:-1:-1;;;16193:54:18;-1:-1:-1;;;;;;16193:54:18;;;-1:-1:-1;;;;;16151:20:18;;16193:54;;;;16095:171;15274:1016;;;16324:7;16320:2;-1:-1:-1;;;;;16305:27:18;16314:4;-1:-1:-1;;;;;16305:27:18;-1:-1:-1;;;;;;;;;;;16305:27:18;;;;;;;;;16342:42;14409:1982;;14339:2052;;;:::o;3596:449:14:-;3669:6;;-1:-1:-1;;;3669:6:14;;;;3668:7;3660:36;;;;-1:-1:-1;;;3660:36:14;;16623:2:20;3660:36:14;;;16605:21:20;16662:2;16642:18;;;16635:30;-1:-1:-1;;;16681:18:20;;;16674:46;16737:18;;3660:36:14;16421:340:20;3660:36:14;3706:30;3716:10;3728:7;3706:9;:30::i;:::-;3752:9;3747:292;3771:7;3767:1;:11;3747:292;;;3816:15;;3864:21;;-1:-1:-1;;;;;3816:15:14;;;;3799:47;;3864:21;8184:9;3941:4;3964:7;3970:1;3964:3;:7;:::i;:::-;3989:5;;3799:229;;-1:-1:-1;;;;;;3799:229:14;;;;;;;-1:-1:-1;;;;;17145:15:20;;;3799:229:14;;;17127:34:20;17177:18;;;17170:34;;;;17240:15;;;;17220:18;;;17213:43;17272:18;;;17265:34;17315:19;;;17308:35;;;;17380:3;17359:19;;;17352:32;-1:-1:-1;17400:19:20;;;17393:30;17440:19;;3799:229:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;3780:3:14;;;;:::i;:::-;;;;3747:292;;16469:87:18;16528:21;16534:7;16543:5;16528;:21::i;6244:1098::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;6368:7:18;6448:13;;6441:4;:20;6410:868;;;6481:31;6515:17;;;:11;:17;;;;;;;;;6481:51;;;;;;;;;-1:-1:-1;;;;;6481:51:18;;;;-1:-1:-1;;;6481:51:18;;-1:-1:-1;;;;;6481:51:18;;;;;;;;-1:-1:-1;;;6481:51:18;;;;;;;;;;;;;;6550:714;;6599:14;;-1:-1:-1;;;;;6599:28:18;;6595:99;;6662:9;6244:1098;-1:-1:-1;;;6244:1098:18:o;6595:99::-;-1:-1:-1;;;7030:6:18;7074:17;;;;:11;:17;;;;;;;;;7062:29;;;;;;;;;-1:-1:-1;;;;;7062:29:18;;;;;-1:-1:-1;;;7062:29:18;;-1:-1:-1;;;;;7062:29:18;;;;;;;;-1:-1:-1;;;7062:29:18;;;;;;;;;;;;;7121:28;7117:107;;7188:9;6244:1098;-1:-1:-1;;;6244:1098:18:o;7117:107::-;6991:255;;;6463:815;6410:868;7304:31;;-1:-1:-1;;;7304:31:18;;;;;;;;;;;2426:187:0;2518:6;;;-1:-1:-1;;;;;2534:17:0;;;-1:-1:-1;;;;;;2534:17:0;;;;;;;2566:40;;2518:6;;;2534:17;2518:6;;2566:40;;2499:16;;2566:40;2489:124;2426:187;:::o;1866:383:17:-;1593:5;-1:-1:-1;;;;;2003:33:17;;;;1982:122;;;;-1:-1:-1;;;1982:122:17;;17928:2:20;1982:122:17;;;17910:21:20;17967:2;17947:18;;;17940:30;18006:34;17986:18;;;17979:62;-1:-1:-1;;;18057:18:20;;;18050:40;18107:19;;1982:122:17;17726:406:20;1982:122:17;-1:-1:-1;;;;;2122:22:17;;2114:60;;;;-1:-1:-1;;;2114:60:17;;18339:2:20;2114:60:17;;;18321:21:20;18378:2;18358:18;;;18351:30;18417:27;18397:18;;;18390:55;18462:18;;2114:60:17;18137:349:20;2114:60:17;2207:35;;;;;;;;;-1:-1:-1;;;;;2207:35:17;;;;;;-1:-1:-1;;;;;2207:35:17;;;;;;;;;;-1:-1:-1;;;2185:57:17;;;;-1:-1:-1;2185:57:17;1866:383::o;19879:748:18:-;20069:150;;-1:-1:-1;;;20069:150:18;;20037:4;;-1:-1:-1;;;;;20069:36:18;;;;;:150;;719:10:8;;20153:4:18;;20175:7;;20200:5;;20069:150;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20069:150:18;;;;;;;;-1:-1:-1;;20069:150:18;;;;;;;;;;;;:::i;:::-;;;20053:568;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20386:6;:13;20403:1;20386:18;20382:229;;20431:40;;-1:-1:-1;;;20431:40:18;;;;;;;;;;;20382:229;20571:6;20565:13;20556:6;20552:2;20548:15;20541:38;20053:568;-1:-1:-1;;;;;;20273:55:18;-1:-1:-1;;;20273:55:18;;-1:-1:-1;20053:568:18;19879:748;;;;;;:::o;7765:115:14:-;7825:13;7857:16;7850:23;;;;;:::i;447:696:9:-;503:13;552:14;569:17;580:5;569:10;:17::i;:::-;589:1;569:21;552:38;;604:20;638:6;-1:-1:-1;;;;;627:18:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;627:18:9;-1:-1:-1;604:41:9;-1:-1:-1;765:28:9;;;781:2;765:28;820:280;-1:-1:-1;;851:5:9;-1:-1:-1;;;985:2:9;974:14;;969:30;851:5;956:44;1044:2;1035:11;;;-1:-1:-1;1064:21:9;820:280;1064:21;-1:-1:-1;1120:6:9;447:696;-1:-1:-1;;;447:696:9:o;11323:102:18:-;11391:27;11401:2;11405:8;11391:27;;;;;;;;;;;;:9;:27::i;4528:314::-;4644:4;-1:-1:-1;;;;;;4679:40:18;;-1:-1:-1;;;4679:40:18;;:104;;-1:-1:-1;;;;;;;4735:48:18;;-1:-1:-1;;;4735:48:18;4679:104;:156;;;;4799:36;4823:11;4799:23;:36::i;16773:2355::-;16852:35;16890:21;16903:7;16890:12;:21::i;:::-;16937:18;;16852:59;;-1:-1:-1;16966:284:18;;;;16999:22;719:10:8;-1:-1:-1;;;;;17025:20:18;;;;:76;;-1:-1:-1;17065:36:18;17082:4;719:10:8;9749:184:18;:::i;17065:36::-;17025:132;;;-1:-1:-1;719:10:8;17121:20:18;17133:7;17121:11;:20::i;:::-;-1:-1:-1;;;;;17121:36:18;;17025:132;16999:159;;17178:17;17173:66;;17204:35;;-1:-1:-1;;;17204:35:18;;;;;;;;;;;17173:66;16985:265;16966:284;17373:35;17390:1;17394:7;17403:4;17373:8;:35::i;:::-;-1:-1:-1;;;;;17732:18:18;;;17698:31;17732:18;;;:12;:18;;;;;;;;17764:24;;-1:-1:-1;;;;;;;;;;17764:24:18;;;;;;;;;-1:-1:-1;;17764:24:18;;;;17802:29;;;;;17787:1;17802:29;;;;;;;;-1:-1:-1;;17802:29:18;;;;;;;;;;17961:20;;;:11;:20;;;;;;17995;;-1:-1:-1;;;;18062:15:18;18029:49;;;-1:-1:-1;;;18029:49:18;-1:-1:-1;;;;;;18029:49:18;;;;;;;;;;18092:22;-1:-1:-1;;;18092:22:18;;;18380:11;;;18439:24;;;;;18481:13;;17732:18;;18439:24;;18481:13;18477:377;;18688:13;;18673:11;:28;18669:171;;18725:20;;18793:28;;;;-1:-1:-1;;;;;18767:54:18;-1:-1:-1;;;18767:54:18;-1:-1:-1;;;;;;18767:54:18;;;-1:-1:-1;;;;;18725:20:18;;18767:54;;;;18669:171;-1:-1:-1;;18879:35:18;;18906:7;;-1:-1:-1;18902:1:18;;-1:-1:-1;;;;;;18879:35:18;;;-1:-1:-1;;;;;;;;;;;18879:35:18;18902:1;;18879:35;-1:-1:-1;;19097:12:18;:14;;;;;;-1:-1:-1;;16773:2355:18:o;10139:916:12:-;10192:7;;-1:-1:-1;;;10267:17:12;;10263:103;;-1:-1:-1;;;10304:17:12;;;-1:-1:-1;10349:2:12;10339:12;10263:103;10392:8;10383:5;:17;10379:103;;10429:8;10420:17;;;-1:-1:-1;10465:2:12;10455:12;10379:103;10508:8;10499:5;:17;10495:103;;10545:8;10536:17;;;-1:-1:-1;10581:2:12;10571:12;10495:103;10624:7;10615:5;:16;10611:100;;10660:7;10651:16;;;-1:-1:-1;10695:1:12;10685:11;10611:100;10737:7;10728:5;:16;10724:100;;10773:7;10764:16;;;-1:-1:-1;10808:1:12;10798:11;10724:100;10850:7;10841:5;:16;10837:100;;10886:7;10877:16;;;-1:-1:-1;10921:1:12;10911:11;10837:100;10963:7;10954:5;:16;10950:66;;11000:1;10990:11;11042:6;10139:916;-1:-1:-1;;10139:916:12:o;11776:157:18:-;11894:32;11900:2;11904:8;11914:5;11921:4;11894:5;:32::i;472:251:17:-;588:4;-1:-1:-1;;;;;;623:41:17;;-1:-1:-1;;;623:41:17;;:93;;-1:-1:-1;;;;;;;;;;937:40:10;;;680:36:17;829:155:10;12180:1917:18;12336:13;;-1:-1:-1;;;;;12363:16:18;;12359:48;;12388:19;;-1:-1:-1;;;12388:19:18;;;;;;;;;;;12359:48;12421:8;12433:1;12421:13;12417:44;;12443:18;;-1:-1:-1;;;12443:18:18;;;;;;;;;;;12417:44;-1:-1:-1;;;;;12804:16:18;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;12862:49:18;;-1:-1:-1;;;;;12804:44:18;;;;;;;12862:49;;;;-1:-1:-1;;12804:44:18;;;;;;12862:49;;;;;;;;;;;;;;;;12926:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;12975:66:18;;;;-1:-1:-1;;;13025:15:18;12975:66;;;;;;;;;;12926:25;13119:23;;;13161:4;:23;;;;-1:-1:-1;;;;;;13169:13:18;;1702:19:7;:23;;13169:15:18;13157:812;;;13204:493;13234:38;;13259:12;;-1:-1:-1;;;;;13234:38:18;;;13251:1;;-1:-1:-1;;;;;;;;;;;13234:38:18;13251:1;;13234:38;13324:207;13392:1;13424:2;13456:14;;;;;;13500:5;13324:30;:207::i;:::-;13294:356;;13587:40;;-1:-1:-1;;;13587:40:18;;;;;;;;;;;13294:356;13692:3;13676:12;:19;13204:493;;13776:12;13759:13;;:29;13755:43;;13790:8;;;13755:43;13157:812;;;13837:118;13867:40;;13892:14;;;;;-1:-1:-1;;;;;13867:40:18;;;13884:1;;-1:-1:-1;;;;;;;;;;;13867:40:18;13884:1;;13867:40;13950:3;13934:12;:19;13837:118;;13157:812;-1:-1:-1;13982:13:18;:28;14030:60;10470:393;14:131:20;-1:-1:-1;;;;;;88:32:20;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:160::-;657:20;;713:13;;706:21;696:32;;686:60;;742:1;739;732:12;686:60;592:160;;;:::o;757:180::-;813:6;866:2;854:9;845:7;841:23;837:32;834:52;;;882:1;879;872:12;834:52;905:26;921:9;905:26;:::i;1150:250::-;1235:1;1245:113;1259:6;1256:1;1253:13;1245:113;;;1335:11;;;1329:18;1316:11;;;1309:39;1281:2;1274:10;1245:113;;;-1:-1:-1;;1392:1:20;1374:16;;1367:27;1150:250::o;1405:271::-;1447:3;1485:5;1479:12;1512:6;1507:3;1500:19;1528:76;1597:6;1590:4;1585:3;1581:14;1574:4;1567:5;1563:16;1528:76;:::i;:::-;1658:2;1637:15;-1:-1:-1;;1633:29:20;1624:39;;;;1665:4;1620:50;;1405:271;-1:-1:-1;;1405:271:20:o;1681:220::-;1830:2;1819:9;1812:21;1793:4;1850:45;1891:2;1880:9;1876:18;1868:6;1850:45;:::i;1906:180::-;1965:6;2018:2;2006:9;1997:7;1993:23;1989:32;1986:52;;;2034:1;2031;2024:12;1986:52;-1:-1:-1;2057:23:20;;1906:180;-1:-1:-1;1906:180:20:o;2273:131::-;-1:-1:-1;;;;;2348:31:20;;2338:42;;2328:70;;2394:1;2391;2384:12;2409:315;2477:6;2485;2538:2;2526:9;2517:7;2513:23;2509:32;2506:52;;;2554:1;2551;2544:12;2506:52;2593:9;2580:23;2612:31;2637:5;2612:31;:::i;:::-;2662:5;2714:2;2699:18;;;;2686:32;;-1:-1:-1;;;2409:315:20:o;2729:456::-;2806:6;2814;2822;2875:2;2863:9;2854:7;2850:23;2846:32;2843:52;;;2891:1;2888;2881:12;2843:52;2930:9;2917:23;2949:31;2974:5;2949:31;:::i;:::-;2999:5;-1:-1:-1;3056:2:20;3041:18;;3028:32;3069:33;3028:32;3069:33;:::i;:::-;2729:456;;3121:7;;-1:-1:-1;;;3175:2:20;3160:18;;;;3147:32;;2729:456::o;3190:248::-;3258:6;3266;3319:2;3307:9;3298:7;3294:23;3290:32;3287:52;;;3335:1;3332;3325:12;3287:52;-1:-1:-1;;3358:23:20;;;3428:2;3413:18;;;3400:32;;-1:-1:-1;3190:248:20:o;3722:127::-;3783:10;3778:3;3774:20;3771:1;3764:31;3814:4;3811:1;3804:15;3838:4;3835:1;3828:15;3854:275;3925:2;3919:9;3990:2;3971:13;;-1:-1:-1;;3967:27:20;3955:40;;-1:-1:-1;;;;;4010:34:20;;4046:22;;;4007:62;4004:88;;;4072:18;;:::i;:::-;4108:2;4101:22;3854:275;;-1:-1:-1;3854:275:20:o;4134:407::-;4199:5;-1:-1:-1;;;;;4225:6:20;4222:30;4219:56;;;4255:18;;:::i;:::-;4293:57;4338:2;4317:15;;-1:-1:-1;;4313:29:20;4344:4;4309:40;4293:57;:::i;:::-;4284:66;;4373:6;4366:5;4359:21;4413:3;4404:6;4399:3;4395:16;4392:25;4389:45;;;4430:1;4427;4420:12;4389:45;4479:6;4474:3;4467:4;4460:5;4456:16;4443:43;4533:1;4526:4;4517:6;4510:5;4506:18;4502:29;4495:40;4134:407;;;;;:::o;4546:451::-;4615:6;4668:2;4656:9;4647:7;4643:23;4639:32;4636:52;;;4684:1;4681;4674:12;4636:52;4724:9;4711:23;-1:-1:-1;;;;;4749:6:20;4746:30;4743:50;;;4789:1;4786;4779:12;4743:50;4812:22;;4865:4;4857:13;;4853:27;-1:-1:-1;4843:55:20;;4894:1;4891;4884:12;4843:55;4917:74;4983:7;4978:2;4965:16;4960:2;4956;4952:11;4917:74;:::i;5002:247::-;5061:6;5114:2;5102:9;5093:7;5089:23;5085:32;5082:52;;;5130:1;5127;5120:12;5082:52;5169:9;5156:23;5188:31;5213:5;5188:31;:::i;5254:435::-;5321:6;5329;5382:2;5370:9;5361:7;5357:23;5353:32;5350:52;;;5398:1;5395;5388:12;5350:52;5437:9;5424:23;5456:31;5481:5;5456:31;:::i;:::-;5506:5;-1:-1:-1;5563:2:20;5548:18;;5535:32;-1:-1:-1;;;;;5598:40:20;;5586:53;;5576:81;;5653:1;5650;5643:12;5576:81;5676:7;5666:17;;;5254:435;;;;;:::o;5694:315::-;5759:6;5767;5820:2;5808:9;5799:7;5795:23;5791:32;5788:52;;;5836:1;5833;5826:12;5788:52;5875:9;5862:23;5894:31;5919:5;5894:31;:::i;:::-;5944:5;-1:-1:-1;5968:35:20;5999:2;5984:18;;5968:35;:::i;:::-;5958:45;;5694:315;;;;;:::o;6014:795::-;6109:6;6117;6125;6133;6186:3;6174:9;6165:7;6161:23;6157:33;6154:53;;;6203:1;6200;6193:12;6154:53;6242:9;6229:23;6261:31;6286:5;6261:31;:::i;:::-;6311:5;-1:-1:-1;6368:2:20;6353:18;;6340:32;6381:33;6340:32;6381:33;:::i;:::-;6433:7;-1:-1:-1;6487:2:20;6472:18;;6459:32;;-1:-1:-1;6542:2:20;6527:18;;6514:32;-1:-1:-1;;;;;6558:30:20;;6555:50;;;6601:1;6598;6591:12;6555:50;6624:22;;6677:4;6669:13;;6665:27;-1:-1:-1;6655:55:20;;6706:1;6703;6696:12;6655:55;6729:74;6795:7;6790:2;6777:16;6772:2;6768;6764:11;6729:74;:::i;:::-;6719:84;;;6014:795;;;;;;;:::o;6814:1091::-;6904:6;6912;6965:2;6953:9;6944:7;6940:23;6936:32;6933:52;;;6981:1;6978;6971:12;6933:52;7021:9;7008:23;-1:-1:-1;;;;;7091:2:20;7083:6;7080:14;7077:34;;;7107:1;7104;7097:12;7077:34;7145:6;7134:9;7130:22;7120:32;;7190:7;7183:4;7179:2;7175:13;7171:27;7161:55;;7212:1;7209;7202:12;7161:55;7248:2;7235:16;7270:4;7293:2;7289;7286:10;7283:36;;;7299:18;;:::i;:::-;7345:2;7342:1;7338:10;7328:20;;7368:28;7392:2;7388;7384:11;7368:28;:::i;:::-;7430:15;;;7500:11;;;7496:20;;;7461:12;;;;7528:19;;;7525:39;;;7560:1;7557;7550:12;7525:39;7584:11;;;;7604:217;7620:6;7615:3;7612:15;7604:217;;;7700:3;7687:17;7674:30;;7717:31;7742:5;7717:31;:::i;:::-;7761:18;;;7637:12;;;;7799;;;;7604:217;;;7840:5;-1:-1:-1;7864:35:20;;-1:-1:-1;7880:18:20;;;7864:35;:::i;:::-;7854:45;;;;;;6814:1091;;;;;:::o;7910:388::-;7978:6;7986;8039:2;8027:9;8018:7;8014:23;8010:32;8007:52;;;8055:1;8052;8045:12;8007:52;8094:9;8081:23;8113:31;8138:5;8113:31;:::i;:::-;8163:5;-1:-1:-1;8220:2:20;8205:18;;8192:32;8233:33;8192:32;8233:33;:::i;8303:380::-;8382:1;8378:12;;;;8425;;;8446:61;;8500:4;8492:6;8488:17;8478:27;;8446:61;8553:2;8545:6;8542:14;8522:18;8519:38;8516:161;;8599:10;8594:3;8590:20;8587:1;8580:31;8634:4;8631:1;8624:15;8662:4;8659:1;8652:15;8516:161;;8303:380;;;:::o;8688:127::-;8749:10;8744:3;8740:20;8737:1;8730:31;8780:4;8777:1;8770:15;8804:4;8801:1;8794:15;8820:168;8893:9;;;8924;;8941:15;;;8935:22;;8921:37;8911:71;;8962:18;;:::i;9125:217::-;9165:1;9191;9181:132;;9235:10;9230:3;9226:20;9223:1;9216:31;9270:4;9267:1;9260:15;9298:4;9295:1;9288:15;9181:132;-1:-1:-1;9327:9:20;;9125:217::o;9750:125::-;9815:9;;;9836:10;;;9833:36;;;9849:18;;:::i;9880:356::-;10082:2;10064:21;;;10101:18;;;10094:30;10160:34;10155:2;10140:18;;10133:62;10227:2;10212:18;;9880:356::o;11405:545::-;11507:2;11502:3;11499:11;11496:448;;;11543:1;11568:5;11564:2;11557:17;11613:4;11609:2;11599:19;11683:2;11671:10;11667:19;11664:1;11660:27;11654:4;11650:38;11719:4;11707:10;11704:20;11701:47;;;-1:-1:-1;11742:4:20;11701:47;11797:2;11792:3;11788:12;11785:1;11781:20;11775:4;11771:31;11761:41;;11852:82;11870:2;11863:5;11860:13;11852:82;;;11915:17;;;11896:1;11885:13;11852:82;;;11856:3;;;11405:545;;;:::o;12126:1352::-;12252:3;12246:10;-1:-1:-1;;;;;12271:6:20;12268:30;12265:56;;;12301:18;;:::i;:::-;12330:97;12420:6;12380:38;12412:4;12406:11;12380:38;:::i;:::-;12374:4;12330:97;:::i;:::-;12482:4;;12546:2;12535:14;;12563:1;12558:663;;;;13265:1;13282:6;13279:89;;;-1:-1:-1;13334:19:20;;;13328:26;13279:89;-1:-1:-1;;12083:1:20;12079:11;;;12075:24;12071:29;12061:40;12107:1;12103:11;;;12058:57;13381:81;;12528:944;;12558:663;11352:1;11345:14;;;11389:4;11376:18;;-1:-1:-1;;12594:20:20;;;12712:236;12726:7;12723:1;12720:14;12712:236;;;12815:19;;;12809:26;12794:42;;12907:27;;;;12875:1;12863:14;;;;12742:19;;12712:236;;;12716:3;12976:6;12967:7;12964:19;12961:201;;;13037:19;;;13031:26;-1:-1:-1;;13120:1:20;13116:14;;;13132:3;13112:24;13108:37;13104:42;13089:58;13074:74;;12961:201;-1:-1:-1;;;;;13208:1:20;13192:14;;;13188:22;13175:36;;-1:-1:-1;12126:1352:20:o;14880:496::-;15059:3;15097:6;15091:13;15113:66;15172:6;15167:3;15160:4;15152:6;15148:17;15113:66;:::i;:::-;15242:13;;15201:16;;;;15264:70;15242:13;15201:16;15311:4;15299:17;;15264:70;:::i;:::-;15350:20;;14880:496;-1:-1:-1;;;;14880:496:20:o;15381:127::-;15442:10;15437:3;15433:20;15430:1;15423:31;15473:4;15470:1;15463:15;15497:4;15494:1;15487:15;15513:135;15552:3;15573:17;;;15570:43;;15593:18;;:::i;:::-;-1:-1:-1;15640:1:20;15629:13;;15513:135::o;17470:251::-;17540:6;17593:2;17581:9;17572:7;17568:23;17564:32;17561:52;;;17609:1;17606;17599:12;17561:52;17641:9;17635:16;17660:31;17685:5;17660:31;:::i;18491:489::-;-1:-1:-1;;;;;18760:15:20;;;18742:34;;18812:15;;18807:2;18792:18;;18785:43;18859:2;18844:18;;18837:34;;;18907:3;18902:2;18887:18;;18880:31;;;18685:4;;18928:46;;18954:19;;18946:6;18928:46;:::i;:::-;18920:54;18491:489;-1:-1:-1;;;;;;18491:489:20:o;18985:249::-;19054:6;19107:2;19095:9;19086:7;19082:23;19078:32;19075:52;;;19123:1;19120;19113:12;19075:52;19155:9;19149:16;19174:30;19198:5;19174:30;:::i

Swarm Source

ipfs://b09e2d3d9e5b223d4ea8ae29487c8f0cb845fc463a66cd10400e1f8bb301b17e
Loading...
Loading
Loading...
Loading
[ 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.