ETH Price: $3,682.43 (+1.76%)

Token

Jimmy Clubhouse (JCH)
 

Overview

Max Total Supply

4,771 JCH

Holders

2,571

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
nianqingren.eth
Balance
2 JCH
0xd8cf3e31820ceec940c69f462fc047d306bcb984
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:
JimmyClubhouse

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license
File 1 of 10 : JimmyClubhouse.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import { IERC721A } from "erc721a/contracts/IERC721A.sol";
import { ERC721A } from "erc721a/contracts/ERC721A.sol";
import { ERC721AQueryable } from "erc721a/contracts/extensions/ERC721AQueryable.sol";
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import { Strings } from "@openzeppelin/contracts/utils/Strings.sol";
import { OperatorFilterer } from "./OperatorFilterer.sol";

contract JimmyClubhouse is ERC721A, ERC721AQueryable,OperatorFilterer(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6, true), Ownable {
    
    bool public Minting  = false;
    uint256 public MintPrice = 0.004 ether;
    string public baseURI;  
    uint256 public maxPerTx = 20;  
    uint256 public maxSupply = 7777;
    uint256[] public FreeClaim = [2,1,0];
    uint256[] public FreeSupply = [3500,6500,7777];
    mapping (address => uint256) public minted;
    bool public operatorFilteringEnabled = true;

    constructor() ERC721A("Jimmy Clubhouse", "JCH"){}

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

    function mint(uint256 qty) external payable
    {
        require(Minting , "JCH Minting Close !");
        require(qty <= maxPerTx, "JCH Max Per Tx !");
        require(totalSupply() + qty <= maxSupply,"JCH Soldout !");
        sendMint(qty);
    }

    function sendMint(uint256 qty) internal  {
        uint freeMint = CalculateClaim(totalSupply());
        if(minted[msg.sender] < freeMint) 
        {
            if(qty < freeMint) qty = freeMint;
           require(msg.value >= (qty - freeMint) * MintPrice,"JCH Insufficient Funds !");
            minted[msg.sender] += qty;
           _safeMint(msg.sender, qty);
        }
        else
        {
           require(msg.value >= qty * MintPrice,"JCH Insufficient Funds !");
            minted[msg.sender] += qty;
           _safeMint(msg.sender, qty);
        }
    }

    function CalculateClaim(uint qty) public view returns (uint256) {
        if(qty < FreeSupply[0])
        {
            return FreeClaim[0];
        }
        else if (qty < FreeSupply[1])
        {
            return FreeClaim[1];
        }
        else if (qty < FreeSupply[2])
        {
            return FreeClaim[2];
        }
        else
        {
            return 0;
        }
    }

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

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

    function airdrop(address[] calldata listedAirdrop ,uint256 qty) external onlyOwner {
        for (uint256 i = 0; i < listedAirdrop.length; i++) {
           _safeMint(listedAirdrop[i], qty);
        }
    }

    function OwnerBatchMint(uint256 qty) external onlyOwner
    {
        _safeMint(msg.sender, qty);
    }

    function setMintingIsLive() external onlyOwner {
        Minting  = !Minting ;
    }
    
    function setBaseURI(string calldata baseURI_) external onlyOwner {
        baseURI = baseURI_;
    }

    function setPrice(uint256 price_) external onlyOwner {
        MintPrice = price_;
    }

    function setmaxPerTx(uint256 maxPerTx_) external onlyOwner {
        maxPerTx = maxPerTx_;
    }

    function setFreeSupply(uint256[] calldata FreeSupply_) external onlyOwner {
        FreeSupply = FreeSupply_;
    }
    
    function setFreeClaim(uint256[] calldata FreeClaim_) external onlyOwner {
        FreeClaim = FreeClaim_;
    }

    function setMaxSupply(uint256 maxMint_) external onlyOwner {
        maxSupply = maxMint_;
    }

    function withdraw() public onlyOwner {
        payable(msg.sender).transfer(payable(address(this)).balance);
    }

    function approve(address to, uint256 tokenId) public payable virtual override(ERC721A, IERC721A) onlyAllowedOperatorApproval(to, operatorFilteringEnabled) {
        super.approve(to, tokenId);
    }

    function setApprovalForAll(address operator, bool approved) public virtual override(ERC721A, IERC721A) onlyAllowedOperatorApproval(operator, operatorFilteringEnabled) {
        super.setApprovalForAll(operator, approved);
    }

    function transferFrom(address from, address to, uint256 tokenId) public payable override(ERC721A, IERC721A) onlyAllowedOperator(from, operatorFilteringEnabled) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public payable override(ERC721A, IERC721A) onlyAllowedOperator(from, operatorFilteringEnabled) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public payable override(ERC721A, IERC721A) onlyAllowedOperator(from, operatorFilteringEnabled) {
        super.safeTransferFrom(from, to, tokenId, _data);
    }
}

File 2 of 10 : OperatorFilterer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol";

/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from, bool enabled) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (enabled && address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator, bool enabled) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (enabled && address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }
}

File 3 of 10 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_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) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

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

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

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

File 4 of 10 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.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 anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

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

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

File 5 of 10 : ERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721AQueryable.sol';
import '../ERC721A.sol';

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

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

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

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

File 6 of 10 : ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';

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

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

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

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

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

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

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

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

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

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

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

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

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

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

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

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

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

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

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

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

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

    /**
     * Sets the auxiliary 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 virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

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

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

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

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

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

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @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) public payable virtual override {
        address owner = ownerOf(tokenId);

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

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

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

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

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

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

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @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 memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

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

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

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @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 for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, 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.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

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

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

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

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

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

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

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

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

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * 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 _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

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

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

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

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}

File 7 of 10 : IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

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

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

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

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

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

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

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

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

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

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

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

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

File 8 of 10 : IERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import '../IERC721A.sol';

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

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

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

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

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

File 9 of 10 : IOperatorFilterRegistry.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

File 10 of 10 : 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;
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"CalculateClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"FreeClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"FreeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Minting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"OwnerBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"listedAirdrop","type":"address[]"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilteringEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","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":"FreeClaim_","type":"uint256[]"}],"name":"setFreeClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"FreeSupply_","type":"uint256[]"}],"name":"setFreeSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMint_","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setMintingIsLive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxPerTx_","type":"uint256"}],"name":"setmaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6008805460ff60a01b19169055660e35fa931a00006009556014600b55611e61600c5560e060405260026080908152600160a052600060c0526200004890600d906003620002c4565b5060408051606081018252610dac81526119646020820152611e61918101919091526200007a90600e90600362000319565b506010805460ff191660011790553480156200009557600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600f81526020016e4a696d6d7920436c7562686f75736560881b8152506040518060400160405280600381526020016209486960eb1b815250816002908162000102919062000419565b50600362000111828262000419565b50600160005550506daaeb6d7670e522a718067333cd4e3b156200025e578015620001ac57604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200018d57600080fd5b505af1158015620001a2573d6000803e3d6000fd5b505050506200025e565b6001600160a01b03821615620001fd5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440162000172565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200024457600080fd5b505af115801562000259573d6000803e3d6000fd5b505050505b506200026c90503362000272565b620004e5565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805482825590600052602060002090810192821562000307579160200282015b8281111562000307578251829060ff16905591602001919060010190620002e5565b50620003159291506200035d565b5090565b82805482825590600052602060002090810192821562000307579160200282015b8281111562000307578251829061ffff169055916020019190600101906200033a565b5b808211156200031557600081556001016200035e565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200039f57607f821691505b602082108103620003c057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200041457600081815260208120601f850160051c81016020861015620003ef5750805b601f850160051c820191505b818110156200041057828155600101620003fb565b5050505b505050565b81516001600160401b0381111562000435576200043562000374565b6200044d816200044684546200038a565b84620003c6565b602080601f8311600181146200048557600084156200046c5750858301515b600019600386901b1c1916600185901b17855562000410565b600085815260208120601f198616915b82811015620004b65788860151825594840194600190910190840162000495565b5085821015620004d55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61274a80620004f56000396000f3fe6080604052600436106102675760003560e01c8063805dcae511610144578063c204642c116100b6578063e985e9c51161007a578063e985e9c514610717578063f18d866914610760578063f2fde38b14610780578063f968adbe146107a0578063fb796e6c146107b6578063fdbf9ef2146107d057600080fd5b8063c204642c14610674578063c23dc68f14610694578063c87b56dd146106c1578063d5abeb01146106e1578063dc33e681146106f757600080fd5b806391b7f5ed1161010857806391b7f5ed146105d957806395d89b41146105f957806399a2557a1461060e578063a0712d681461062e578063a22cb46514610641578063b88d4fde1461066157600080fd5b8063805dcae51461052d57806380c90d301461054d5780638171609b1461056e5780638462151c1461058e5780638da5cb5b146105bb57600080fd5b80633ccfd60b116101dd5780636352211e116101a15780636352211e146104835780636a8531fb146104a35780636c0360eb146104c35780636f8b44b0146104d857806370a08231146104f8578063715018a61461051857600080fd5b80633ccfd60b146103ec57806341f434341461040157806342842e0e1461042357806355f804b3146104365780635bbb21771461045657600080fd5b806318160ddd1161022f57806318160ddd146103305780631e7269c5146103575780631fbdbfa71461038457806322f181d51461039957806323b872dd146103b9578063320047ca146103cc57600080fd5b806301ffc9a71461026c578063069952db146102a157806306fdde03146102c3578063081812fc146102e5578063095ea7b31461031d575b600080fd5b34801561027857600080fd5b5061028c610287366004611fd4565b6107e6565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102c16102bc36600461203c565b610838565b005b3480156102cf57600080fd5b506102d8610851565b60405161029891906120cd565b3480156102f157600080fd5b506103056103003660046120e0565b6108e3565b6040516001600160a01b039091168152602001610298565b6102c161032b366004612110565b610927565b34801561033c57600080fd5b5060015460005403600019015b604051908152602001610298565b34801561036357600080fd5b5061034961037236600461213a565b600f6020526000908152604090205481565b34801561039057600080fd5b506102c1610a08565b3480156103a557600080fd5b506103496103b43660046120e0565b610a31565b6102c16103c7366004612155565b610a52565b3480156103d857600080fd5b506103496103e73660046120e0565b610b3e565b3480156103f857600080fd5b506102c1610b4e565b34801561040d57600080fd5b506103056daaeb6d7670e522a718067333cd4e81565b6102c1610431366004612155565b610b86565b34801561044257600080fd5b506102c1610451366004612191565b610c66565b34801561046257600080fd5b5061047661047136600461203c565b610c7b565b604051610298919061223e565b34801561048f57600080fd5b5061030561049e3660046120e0565b610d46565b3480156104af57600080fd5b506102c16104be36600461203c565b610d51565b3480156104cf57600080fd5b506102d8610d65565b3480156104e457600080fd5b506102c16104f33660046120e0565b610df3565b34801561050457600080fd5b5061034961051336600461213a565b610e00565b34801561052457600080fd5b506102c1610e4e565b34801561053957600080fd5b506102c16105483660046120e0565b610e62565b34801561055957600080fd5b5060085461028c90600160a01b900460ff1681565b34801561057a57600080fd5b506102c16105893660046120e0565b610e6f565b34801561059a57600080fd5b506105ae6105a936600461213a565b610e81565b6040516102989190612280565b3480156105c757600080fd5b506008546001600160a01b0316610305565b3480156105e557600080fd5b506102c16105f43660046120e0565b610f89565b34801561060557600080fd5b506102d8610f96565b34801561061a57600080fd5b506105ae6106293660046122b8565b610fa5565b6102c161063c3660046120e0565b61112c565b34801561064d57600080fd5b506102c161065c3660046122f9565b611222565b6102c161066f366004612346565b6112f8565b34801561068057600080fd5b506102c161068f366004612421565b6113e7565b3480156106a057600080fd5b506106b46106af3660046120e0565b61143c565b604051610298919061246c565b3480156106cd57600080fd5b506102d86106dc3660046120e0565b6114c4565b3480156106ed57600080fd5b50610349600c5481565b34801561070357600080fd5b5061034961071236600461213a565b611547565b34801561072357600080fd5b5061028c61073236600461247a565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561076c57600080fd5b5061034961077b3660046120e0565b611571565b34801561078c57600080fd5b506102c161079b36600461213a565b611640565b3480156107ac57600080fd5b50610349600b5481565b3480156107c257600080fd5b5060105461028c9060ff1681565b3480156107dc57600080fd5b5061034960095481565b60006301ffc9a760e01b6001600160e01b03198316148061081757506380ac58cd60e01b6001600160e01b03198316145b806108325750635b5e139f60e01b6001600160e01b03198316145b92915050565b6108406116b6565b61084c600e8383611f5e565b505050565b606060028054610860906124ad565b80601f016020809104026020016040519081016040528092919081815260200182805461088c906124ad565b80156108d95780601f106108ae576101008083540402835291602001916108d9565b820191906000526020600020905b8154815290600101906020018083116108bc57829003601f168201915b5050505050905090565b60006108ee82611710565b61090b576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b601054829060ff1680801561094a57506daaeb6d7670e522a718067333cd4e3b15155b156109f857604051633185c44d60e21b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156109a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109cb91906124e7565b6109f857604051633b79c77360e21b81526001600160a01b03831660048201526024015b60405180910390fd5b610a028484611745565b50505050565b610a106116b6565b6008805460ff60a01b198116600160a01b9182900460ff1615909102179055565b600e8181548110610a4157600080fd5b600091825260209091200154905081565b601054839060ff16808015610a7557506daaeb6d7670e522a718067333cd4e3b15155b15610b2c57336001600160a01b03831603610a9a57610a958585856117e5565b610b37565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0d91906124e7565b610b2c57604051633b79c77360e21b81523360048201526024016109ef565b610b378585856117e5565b5050505050565b600d8181548110610a4157600080fd5b610b566116b6565b6040513390303180156108fc02916000818181858888f19350505050158015610b83573d6000803e3d6000fd5b50565b601054839060ff16808015610ba957506daaeb6d7670e522a718067333cd4e3b15155b15610c5b57336001600160a01b03831603610bc957610a9585858561197a565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610c18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3c91906124e7565b610c5b57604051633b79c77360e21b81523360048201526024016109ef565b610b3785858561197a565b610c6e6116b6565b600a61084c82848361254a565b6060816000816001600160401b03811115610c9857610c98612330565b604051908082528060200260200182016040528015610cea57816020015b604080516080810182526000808252602080830182905292820181905260608201528252600019909201910181610cb65790505b50905060005b828114610d3d57610d18868683818110610d0c57610d0c612609565b9050602002013561143c565b828281518110610d2a57610d2a612609565b6020908102919091010152600101610cf0565b50949350505050565b600061083282611995565b610d596116b6565b61084c600d8383611f5e565b600a8054610d72906124ad565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9e906124ad565b8015610deb5780601f10610dc057610100808354040283529160200191610deb565b820191906000526020600020905b815481529060010190602001808311610dce57829003601f168201915b505050505081565b610dfb6116b6565b600c55565b60006001600160a01b038216610e29576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b610e566116b6565b610e606000611a04565b565b610e6a6116b6565b600b55565b610e776116b6565b610b833382611a56565b60606000806000610e9185610e00565b90506000816001600160401b03811115610ead57610ead612330565b604051908082528060200260200182016040528015610ed6578160200160208202803683370190505b509050610f0360408051608081018252600080825260208201819052918101829052606081019190915290565b60015b838614610f7d57610f1681611a74565b91508160400151610f755781516001600160a01b031615610f3657815194505b876001600160a01b0316856001600160a01b031603610f755780838780600101985081518110610f6857610f68612609565b6020026020010181815250505b600101610f06565b50909695505050505050565b610f916116b6565b600955565b606060038054610860906124ad565b6060818310610fc757604051631960ccad60e11b815260040160405180910390fd5b600080610fd360005490565b90506001851015610fe357600194505b80841115610fef578093505b6000610ffa87610e00565b9050848610156110195785850381811015611013578091505b5061101d565b5060005b6000816001600160401b0381111561103757611037612330565b604051908082528060200260200182016040528015611060578160200160208202803683370190505b5090508160000361107657935061112592505050565b60006110818861143c565b905060008160400151611092575080515b885b8881141580156110a45750848714155b15611119576110b281611a74565b925082604001516111115782516001600160a01b0316156110d257825191505b8a6001600160a01b0316826001600160a01b031603611111578084888060010199508151811061110457611104612609565b6020026020010181815250505b600101611094565b50505092835250909150505b9392505050565b600854600160a01b900460ff1661117b5760405162461bcd60e51b81526020600482015260136024820152724a4348204d696e74696e6720436c6f7365202160681b60448201526064016109ef565b600b548111156111c05760405162461bcd60e51b815260206004820152601060248201526f4a4348204d617820506572205478202160801b60448201526064016109ef565b600c5460015460005483919003600019016111db9190612635565b11156112195760405162461bcd60e51b815260206004820152600d60248201526c4a434820536f6c646f7574202160981b60448201526064016109ef565b610b8381611ab0565b601054829060ff1680801561124557506daaeb6d7670e522a718067333cd4e3b15155b156112ee57604051633185c44d60e21b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156112a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c691906124e7565b6112ee57604051633b79c77360e21b81526001600160a01b03831660048201526024016109ef565b610a028484611b90565b601054849060ff1680801561131b57506daaeb6d7670e522a718067333cd4e3b15155b156113d357336001600160a01b038316036113415761133c86868686611bfc565b6113df565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611390573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b491906124e7565b6113d357604051633b79c77360e21b81523360048201526024016109ef565b6113df86868686611bfc565b505050505050565b6113ef6116b6565b60005b82811015610a025761142a84848381811061140f5761140f612609565b9050602002016020810190611424919061213a565b83611a56565b8061143481612648565b9150506113f2565b604080516080810182526000808252602082018190529181018290526060810191909152604080516080810182526000808252602082018190529181018290526060810191909152600183108061149557506000548310155b156114a05792915050565b6114a983611a74565b90508060400151156114bb5792915050565b61112583611c40565b60606114cf82611710565b6114ec57604051630a14c4b560e41b815260040160405180910390fd5b60006114f6611c75565b905080516000036115165760405180602001604052806000815250611125565b8061152084611c84565b604051602001611531929190612661565b6040516020818303038152906040529392505050565b6001600160a01b038116600090815260056020526040808220546001600160401b03911c16610832565b6000600e60008154811061158757611587612609565b90600052602060002001548210156115bf57600d6000815481106115ad576115ad612609565b90600052602060002001549050919050565b600e6001815481106115d3576115d3612609565b90600052602060002001548210156115f957600d6001815481106115ad576115ad612609565b600e60028154811061160d5761160d612609565b906000526020600020015482101561163357600d6002815481106115ad576115ad612609565b506000919050565b919050565b6116486116b6565b6001600160a01b0381166116ad5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109ef565b610b8381611a04565b6008546001600160a01b03163314610e605760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ef565b600081600111158015611724575060005482105b8015610832575050600090815260046020526040902054600160e01b161590565b600061175082610d46565b9050336001600160a01b038216146117895761176c8133610732565b611789576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006117f082611995565b9050836001600160a01b0316816001600160a01b0316146118235760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417611870576118538633610732565b61187057604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661189757604051633a954ecd60e21b815260040160405180910390fd5b80156118a257600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003611934576001840160008181526004602052604081205490036119325760005481146119325760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113df565b61084c838383604051806020016040528060008152506112f8565b600081806001116119eb576000548110156119eb5760008181526004602052604081205490600160e01b821690036119e9575b806000036111255750600019016000818152600460205260409020546119c8565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611a70828260405180602001604052806000815250611cc8565b5050565b60408051608081018252600080825260208201819052918101829052606081019190915260008281526004602052604090205461083290611d2e565b6000611ac861077b6001546000546000199190030190565b336000908152600f6020526040902054909150811115611b835780821015611aee578091505b600954611afb8284612690565b611b0591906126a3565b341015611b545760405162461bcd60e51b815260206004820152601860248201527f4a434820496e73756666696369656e742046756e64732021000000000000000060448201526064016109ef565b336000908152600f602052604081208054849290611b73908490612635565b90915550611a7090503383611a56565b600954611b0590836126a3565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611c07848484610a52565b6001600160a01b0383163b15610a0257611c2384848484611d75565b610a02576040516368d2bf6b60e11b815260040160405180910390fd5b604080516080810182526000808252602082018190529181018290526060810191909152610832611c7083611995565b611d2e565b6060600a8054610860906124ad565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480611c9e5750819003601f19909101908152919050565b611cd28383611e60565b6001600160a01b0383163b1561084c576000548281035b611cfc6000868380600101945086611d75565b611d19576040516368d2bf6b60e11b815260040160405180910390fd5b818110611ce9578160005414610b3757600080fd5b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611daa9033908990889088906004016126ba565b6020604051808303816000875af1925050508015611de5575060408051601f3d908101601f19168201909252611de2918101906126f7565b60015b611e43573d808015611e13576040519150601f19603f3d011682016040523d82523d6000602084013e611e18565b606091505b508051600003611e3b576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000805490829003611e855760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114611f3457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611efc565b5081600003611f5557604051622e076360e81b815260040160405180910390fd5b60005550505050565b828054828255906000526020600020908101928215611f99579160200282015b82811115611f99578235825591602001919060010190611f7e565b50611fa5929150611fa9565b5090565b5b80821115611fa55760008155600101611faa565b6001600160e01b031981168114610b8357600080fd5b600060208284031215611fe657600080fd5b813561112581611fbe565b60008083601f84011261200357600080fd5b5081356001600160401b0381111561201a57600080fd5b6020830191508360208260051b850101111561203557600080fd5b9250929050565b6000806020838503121561204f57600080fd5b82356001600160401b0381111561206557600080fd5b61207185828601611ff1565b90969095509350505050565b60005b83811015612098578181015183820152602001612080565b50506000910152565b600081518084526120b981602086016020860161207d565b601f01601f19169290920160200192915050565b60208152600061112560208301846120a1565b6000602082840312156120f257600080fd5b5035919050565b80356001600160a01b038116811461163b57600080fd5b6000806040838503121561212357600080fd5b61212c836120f9565b946020939093013593505050565b60006020828403121561214c57600080fd5b611125826120f9565b60008060006060848603121561216a57600080fd5b612173846120f9565b9250612181602085016120f9565b9150604084013590509250925092565b600080602083850312156121a457600080fd5b82356001600160401b03808211156121bb57600080fd5b818501915085601f8301126121cf57600080fd5b8135818111156121de57600080fd5b8660208285010111156121f057600080fd5b60209290920196919550909350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b81811015610f7d5761226d838551612202565b928401926080929092019160010161225a565b6020808252825182820181905260009190848201906040850190845b81811015610f7d5783518352928401929184019160010161229c565b6000806000606084860312156122cd57600080fd5b6122d6846120f9565b95602085013595506040909401359392505050565b8015158114610b8357600080fd5b6000806040838503121561230c57600080fd5b612315836120f9565b91506020830135612325816122eb565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561235c57600080fd5b612365856120f9565b9350612373602086016120f9565b92506040850135915060608501356001600160401b038082111561239657600080fd5b818701915087601f8301126123aa57600080fd5b8135818111156123bc576123bc612330565b604051601f8201601f19908116603f011681019083821181831017156123e4576123e4612330565b816040528281528a60208487010111156123fd57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060006040848603121561243657600080fd5b83356001600160401b0381111561244c57600080fd5b61245886828701611ff1565b909790965060209590950135949350505050565b608081016108328284612202565b6000806040838503121561248d57600080fd5b612496836120f9565b91506124a4602084016120f9565b90509250929050565b600181811c908216806124c157607f821691505b6020821081036124e157634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156124f957600080fd5b8151611125816122eb565b601f82111561084c57600081815260208120601f850160051c8101602086101561252b5750805b601f850160051c820191505b818110156113df57828155600101612537565b6001600160401b0383111561256157612561612330565b6125758361256f83546124ad565b83612504565b6000601f8411600181146125a957600085156125915750838201355b600019600387901b1c1916600186901b178355610b37565b600083815260209020601f19861690835b828110156125da57868501358255602094850194600190920191016125ba565b50868210156125f75760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808201808211156108325761083261261f565b60006001820161265a5761265a61261f565b5060010190565b6000835161267381846020880161207d565b83519083019061268781836020880161207d565b01949350505050565b818103818111156108325761083261261f565b80820281158282048414176108325761083261261f565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906126ed908301846120a1565b9695505050505050565b60006020828403121561270957600080fd5b815161112581611fbe56fea2646970667358221220dca9d7752b9817aa355d525914c5bc53cbb1af11d45c5bab4c025b22284f22dc64736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102675760003560e01c8063805dcae511610144578063c204642c116100b6578063e985e9c51161007a578063e985e9c514610717578063f18d866914610760578063f2fde38b14610780578063f968adbe146107a0578063fb796e6c146107b6578063fdbf9ef2146107d057600080fd5b8063c204642c14610674578063c23dc68f14610694578063c87b56dd146106c1578063d5abeb01146106e1578063dc33e681146106f757600080fd5b806391b7f5ed1161010857806391b7f5ed146105d957806395d89b41146105f957806399a2557a1461060e578063a0712d681461062e578063a22cb46514610641578063b88d4fde1461066157600080fd5b8063805dcae51461052d57806380c90d301461054d5780638171609b1461056e5780638462151c1461058e5780638da5cb5b146105bb57600080fd5b80633ccfd60b116101dd5780636352211e116101a15780636352211e146104835780636a8531fb146104a35780636c0360eb146104c35780636f8b44b0146104d857806370a08231146104f8578063715018a61461051857600080fd5b80633ccfd60b146103ec57806341f434341461040157806342842e0e1461042357806355f804b3146104365780635bbb21771461045657600080fd5b806318160ddd1161022f57806318160ddd146103305780631e7269c5146103575780631fbdbfa71461038457806322f181d51461039957806323b872dd146103b9578063320047ca146103cc57600080fd5b806301ffc9a71461026c578063069952db146102a157806306fdde03146102c3578063081812fc146102e5578063095ea7b31461031d575b600080fd5b34801561027857600080fd5b5061028c610287366004611fd4565b6107e6565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102c16102bc36600461203c565b610838565b005b3480156102cf57600080fd5b506102d8610851565b60405161029891906120cd565b3480156102f157600080fd5b506103056103003660046120e0565b6108e3565b6040516001600160a01b039091168152602001610298565b6102c161032b366004612110565b610927565b34801561033c57600080fd5b5060015460005403600019015b604051908152602001610298565b34801561036357600080fd5b5061034961037236600461213a565b600f6020526000908152604090205481565b34801561039057600080fd5b506102c1610a08565b3480156103a557600080fd5b506103496103b43660046120e0565b610a31565b6102c16103c7366004612155565b610a52565b3480156103d857600080fd5b506103496103e73660046120e0565b610b3e565b3480156103f857600080fd5b506102c1610b4e565b34801561040d57600080fd5b506103056daaeb6d7670e522a718067333cd4e81565b6102c1610431366004612155565b610b86565b34801561044257600080fd5b506102c1610451366004612191565b610c66565b34801561046257600080fd5b5061047661047136600461203c565b610c7b565b604051610298919061223e565b34801561048f57600080fd5b5061030561049e3660046120e0565b610d46565b3480156104af57600080fd5b506102c16104be36600461203c565b610d51565b3480156104cf57600080fd5b506102d8610d65565b3480156104e457600080fd5b506102c16104f33660046120e0565b610df3565b34801561050457600080fd5b5061034961051336600461213a565b610e00565b34801561052457600080fd5b506102c1610e4e565b34801561053957600080fd5b506102c16105483660046120e0565b610e62565b34801561055957600080fd5b5060085461028c90600160a01b900460ff1681565b34801561057a57600080fd5b506102c16105893660046120e0565b610e6f565b34801561059a57600080fd5b506105ae6105a936600461213a565b610e81565b6040516102989190612280565b3480156105c757600080fd5b506008546001600160a01b0316610305565b3480156105e557600080fd5b506102c16105f43660046120e0565b610f89565b34801561060557600080fd5b506102d8610f96565b34801561061a57600080fd5b506105ae6106293660046122b8565b610fa5565b6102c161063c3660046120e0565b61112c565b34801561064d57600080fd5b506102c161065c3660046122f9565b611222565b6102c161066f366004612346565b6112f8565b34801561068057600080fd5b506102c161068f366004612421565b6113e7565b3480156106a057600080fd5b506106b46106af3660046120e0565b61143c565b604051610298919061246c565b3480156106cd57600080fd5b506102d86106dc3660046120e0565b6114c4565b3480156106ed57600080fd5b50610349600c5481565b34801561070357600080fd5b5061034961071236600461213a565b611547565b34801561072357600080fd5b5061028c61073236600461247a565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561076c57600080fd5b5061034961077b3660046120e0565b611571565b34801561078c57600080fd5b506102c161079b36600461213a565b611640565b3480156107ac57600080fd5b50610349600b5481565b3480156107c257600080fd5b5060105461028c9060ff1681565b3480156107dc57600080fd5b5061034960095481565b60006301ffc9a760e01b6001600160e01b03198316148061081757506380ac58cd60e01b6001600160e01b03198316145b806108325750635b5e139f60e01b6001600160e01b03198316145b92915050565b6108406116b6565b61084c600e8383611f5e565b505050565b606060028054610860906124ad565b80601f016020809104026020016040519081016040528092919081815260200182805461088c906124ad565b80156108d95780601f106108ae576101008083540402835291602001916108d9565b820191906000526020600020905b8154815290600101906020018083116108bc57829003601f168201915b5050505050905090565b60006108ee82611710565b61090b576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b601054829060ff1680801561094a57506daaeb6d7670e522a718067333cd4e3b15155b156109f857604051633185c44d60e21b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156109a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109cb91906124e7565b6109f857604051633b79c77360e21b81526001600160a01b03831660048201526024015b60405180910390fd5b610a028484611745565b50505050565b610a106116b6565b6008805460ff60a01b198116600160a01b9182900460ff1615909102179055565b600e8181548110610a4157600080fd5b600091825260209091200154905081565b601054839060ff16808015610a7557506daaeb6d7670e522a718067333cd4e3b15155b15610b2c57336001600160a01b03831603610a9a57610a958585856117e5565b610b37565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0d91906124e7565b610b2c57604051633b79c77360e21b81523360048201526024016109ef565b610b378585856117e5565b5050505050565b600d8181548110610a4157600080fd5b610b566116b6565b6040513390303180156108fc02916000818181858888f19350505050158015610b83573d6000803e3d6000fd5b50565b601054839060ff16808015610ba957506daaeb6d7670e522a718067333cd4e3b15155b15610c5b57336001600160a01b03831603610bc957610a9585858561197a565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610c18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3c91906124e7565b610c5b57604051633b79c77360e21b81523360048201526024016109ef565b610b3785858561197a565b610c6e6116b6565b600a61084c82848361254a565b6060816000816001600160401b03811115610c9857610c98612330565b604051908082528060200260200182016040528015610cea57816020015b604080516080810182526000808252602080830182905292820181905260608201528252600019909201910181610cb65790505b50905060005b828114610d3d57610d18868683818110610d0c57610d0c612609565b9050602002013561143c565b828281518110610d2a57610d2a612609565b6020908102919091010152600101610cf0565b50949350505050565b600061083282611995565b610d596116b6565b61084c600d8383611f5e565b600a8054610d72906124ad565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9e906124ad565b8015610deb5780601f10610dc057610100808354040283529160200191610deb565b820191906000526020600020905b815481529060010190602001808311610dce57829003601f168201915b505050505081565b610dfb6116b6565b600c55565b60006001600160a01b038216610e29576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b610e566116b6565b610e606000611a04565b565b610e6a6116b6565b600b55565b610e776116b6565b610b833382611a56565b60606000806000610e9185610e00565b90506000816001600160401b03811115610ead57610ead612330565b604051908082528060200260200182016040528015610ed6578160200160208202803683370190505b509050610f0360408051608081018252600080825260208201819052918101829052606081019190915290565b60015b838614610f7d57610f1681611a74565b91508160400151610f755781516001600160a01b031615610f3657815194505b876001600160a01b0316856001600160a01b031603610f755780838780600101985081518110610f6857610f68612609565b6020026020010181815250505b600101610f06565b50909695505050505050565b610f916116b6565b600955565b606060038054610860906124ad565b6060818310610fc757604051631960ccad60e11b815260040160405180910390fd5b600080610fd360005490565b90506001851015610fe357600194505b80841115610fef578093505b6000610ffa87610e00565b9050848610156110195785850381811015611013578091505b5061101d565b5060005b6000816001600160401b0381111561103757611037612330565b604051908082528060200260200182016040528015611060578160200160208202803683370190505b5090508160000361107657935061112592505050565b60006110818861143c565b905060008160400151611092575080515b885b8881141580156110a45750848714155b15611119576110b281611a74565b925082604001516111115782516001600160a01b0316156110d257825191505b8a6001600160a01b0316826001600160a01b031603611111578084888060010199508151811061110457611104612609565b6020026020010181815250505b600101611094565b50505092835250909150505b9392505050565b600854600160a01b900460ff1661117b5760405162461bcd60e51b81526020600482015260136024820152724a4348204d696e74696e6720436c6f7365202160681b60448201526064016109ef565b600b548111156111c05760405162461bcd60e51b815260206004820152601060248201526f4a4348204d617820506572205478202160801b60448201526064016109ef565b600c5460015460005483919003600019016111db9190612635565b11156112195760405162461bcd60e51b815260206004820152600d60248201526c4a434820536f6c646f7574202160981b60448201526064016109ef565b610b8381611ab0565b601054829060ff1680801561124557506daaeb6d7670e522a718067333cd4e3b15155b156112ee57604051633185c44d60e21b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156112a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c691906124e7565b6112ee57604051633b79c77360e21b81526001600160a01b03831660048201526024016109ef565b610a028484611b90565b601054849060ff1680801561131b57506daaeb6d7670e522a718067333cd4e3b15155b156113d357336001600160a01b038316036113415761133c86868686611bfc565b6113df565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611390573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b491906124e7565b6113d357604051633b79c77360e21b81523360048201526024016109ef565b6113df86868686611bfc565b505050505050565b6113ef6116b6565b60005b82811015610a025761142a84848381811061140f5761140f612609565b9050602002016020810190611424919061213a565b83611a56565b8061143481612648565b9150506113f2565b604080516080810182526000808252602082018190529181018290526060810191909152604080516080810182526000808252602082018190529181018290526060810191909152600183108061149557506000548310155b156114a05792915050565b6114a983611a74565b90508060400151156114bb5792915050565b61112583611c40565b60606114cf82611710565b6114ec57604051630a14c4b560e41b815260040160405180910390fd5b60006114f6611c75565b905080516000036115165760405180602001604052806000815250611125565b8061152084611c84565b604051602001611531929190612661565b6040516020818303038152906040529392505050565b6001600160a01b038116600090815260056020526040808220546001600160401b03911c16610832565b6000600e60008154811061158757611587612609565b90600052602060002001548210156115bf57600d6000815481106115ad576115ad612609565b90600052602060002001549050919050565b600e6001815481106115d3576115d3612609565b90600052602060002001548210156115f957600d6001815481106115ad576115ad612609565b600e60028154811061160d5761160d612609565b906000526020600020015482101561163357600d6002815481106115ad576115ad612609565b506000919050565b919050565b6116486116b6565b6001600160a01b0381166116ad5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109ef565b610b8381611a04565b6008546001600160a01b03163314610e605760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ef565b600081600111158015611724575060005482105b8015610832575050600090815260046020526040902054600160e01b161590565b600061175082610d46565b9050336001600160a01b038216146117895761176c8133610732565b611789576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006117f082611995565b9050836001600160a01b0316816001600160a01b0316146118235760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417611870576118538633610732565b61187057604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661189757604051633a954ecd60e21b815260040160405180910390fd5b80156118a257600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003611934576001840160008181526004602052604081205490036119325760005481146119325760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113df565b61084c838383604051806020016040528060008152506112f8565b600081806001116119eb576000548110156119eb5760008181526004602052604081205490600160e01b821690036119e9575b806000036111255750600019016000818152600460205260409020546119c8565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611a70828260405180602001604052806000815250611cc8565b5050565b60408051608081018252600080825260208201819052918101829052606081019190915260008281526004602052604090205461083290611d2e565b6000611ac861077b6001546000546000199190030190565b336000908152600f6020526040902054909150811115611b835780821015611aee578091505b600954611afb8284612690565b611b0591906126a3565b341015611b545760405162461bcd60e51b815260206004820152601860248201527f4a434820496e73756666696369656e742046756e64732021000000000000000060448201526064016109ef565b336000908152600f602052604081208054849290611b73908490612635565b90915550611a7090503383611a56565b600954611b0590836126a3565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611c07848484610a52565b6001600160a01b0383163b15610a0257611c2384848484611d75565b610a02576040516368d2bf6b60e11b815260040160405180910390fd5b604080516080810182526000808252602082018190529181018290526060810191909152610832611c7083611995565b611d2e565b6060600a8054610860906124ad565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480611c9e5750819003601f19909101908152919050565b611cd28383611e60565b6001600160a01b0383163b1561084c576000548281035b611cfc6000868380600101945086611d75565b611d19576040516368d2bf6b60e11b815260040160405180910390fd5b818110611ce9578160005414610b3757600080fd5b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611daa9033908990889088906004016126ba565b6020604051808303816000875af1925050508015611de5575060408051601f3d908101601f19168201909252611de2918101906126f7565b60015b611e43573d808015611e13576040519150601f19603f3d011682016040523d82523d6000602084013e611e18565b606091505b508051600003611e3b576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000805490829003611e855760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114611f3457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611efc565b5081600003611f5557604051622e076360e81b815260040160405180910390fd5b60005550505050565b828054828255906000526020600020908101928215611f99579160200282015b82811115611f99578235825591602001919060010190611f7e565b50611fa5929150611fa9565b5090565b5b80821115611fa55760008155600101611faa565b6001600160e01b031981168114610b8357600080fd5b600060208284031215611fe657600080fd5b813561112581611fbe565b60008083601f84011261200357600080fd5b5081356001600160401b0381111561201a57600080fd5b6020830191508360208260051b850101111561203557600080fd5b9250929050565b6000806020838503121561204f57600080fd5b82356001600160401b0381111561206557600080fd5b61207185828601611ff1565b90969095509350505050565b60005b83811015612098578181015183820152602001612080565b50506000910152565b600081518084526120b981602086016020860161207d565b601f01601f19169290920160200192915050565b60208152600061112560208301846120a1565b6000602082840312156120f257600080fd5b5035919050565b80356001600160a01b038116811461163b57600080fd5b6000806040838503121561212357600080fd5b61212c836120f9565b946020939093013593505050565b60006020828403121561214c57600080fd5b611125826120f9565b60008060006060848603121561216a57600080fd5b612173846120f9565b9250612181602085016120f9565b9150604084013590509250925092565b600080602083850312156121a457600080fd5b82356001600160401b03808211156121bb57600080fd5b818501915085601f8301126121cf57600080fd5b8135818111156121de57600080fd5b8660208285010111156121f057600080fd5b60209290920196919550909350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b81811015610f7d5761226d838551612202565b928401926080929092019160010161225a565b6020808252825182820181905260009190848201906040850190845b81811015610f7d5783518352928401929184019160010161229c565b6000806000606084860312156122cd57600080fd5b6122d6846120f9565b95602085013595506040909401359392505050565b8015158114610b8357600080fd5b6000806040838503121561230c57600080fd5b612315836120f9565b91506020830135612325816122eb565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561235c57600080fd5b612365856120f9565b9350612373602086016120f9565b92506040850135915060608501356001600160401b038082111561239657600080fd5b818701915087601f8301126123aa57600080fd5b8135818111156123bc576123bc612330565b604051601f8201601f19908116603f011681019083821181831017156123e4576123e4612330565b816040528281528a60208487010111156123fd57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060006040848603121561243657600080fd5b83356001600160401b0381111561244c57600080fd5b61245886828701611ff1565b909790965060209590950135949350505050565b608081016108328284612202565b6000806040838503121561248d57600080fd5b612496836120f9565b91506124a4602084016120f9565b90509250929050565b600181811c908216806124c157607f821691505b6020821081036124e157634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156124f957600080fd5b8151611125816122eb565b601f82111561084c57600081815260208120601f850160051c8101602086101561252b5750805b601f850160051c820191505b818110156113df57828155600101612537565b6001600160401b0383111561256157612561612330565b6125758361256f83546124ad565b83612504565b6000601f8411600181146125a957600085156125915750838201355b600019600387901b1c1916600186901b178355610b37565b600083815260209020601f19861690835b828110156125da57868501358255602094850194600190920191016125ba565b50868210156125f75760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808201808211156108325761083261261f565b60006001820161265a5761265a61261f565b5060010190565b6000835161267381846020880161207d565b83519083019061268781836020880161207d565b01949350505050565b818103818111156108325761083261261f565b80820281158282048414176108325761083261261f565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906126ed908301846120a1565b9695505050505050565b60006020828403121561270957600080fd5b815161112581611fbe56fea2646970667358221220dca9d7752b9817aa355d525914c5bc53cbb1af11d45c5bab4c025b22284f22dc64736f6c63430008110033

Deployed Bytecode Sourcemap

469:4579:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9155:630:6;;;;;;;;;;-1:-1:-1;9155:630:6;;;;;:::i;:::-;;:::i;:::-;;;565:14:10;;558:22;540:41;;528:2;513:18;9155:630:6;;;;;;;;3413:117:4;;;;;;;;;;-1:-1:-1;3413:117:4;;;;;:::i;:::-;;:::i;:::-;;10039:98:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;16360:214::-;;;;;;;;;;-1:-1:-1;16360:214:6;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2511:32:10;;;2493:51;;2481:2;2466:18;16360:214:6;2347:203:10;3893:200:4;;;;;;:::i;:::-;;:::i;5894:317:6:-;;;;;;;;;;-1:-1:-1;1142:1:4;6164:12:6;5955:7;6148:13;:28;-1:-1:-1;;6148:46:6;5894:317;;;3138:25:10;;;3126:2;3111:18;5894:317:6;2992:177:10;892:42:4;;;;;;;;;;-1:-1:-1;892:42:4;;;;;:::i;:::-;;;;;;;;;;;;;;3001:86;;;;;;;;;;;;;:::i;839:46::-;;;;;;;;;;-1:-1:-1;839:46:4;;;;;:::i;:::-;;:::i;4338:216::-;;;;;;:::i;:::-;;:::i;796:36::-;;;;;;;;;;-1:-1:-1;796:36:4;;;;;:::i;:::-;;:::i;3769:116::-;;;;;;;;;;;;;:::i;753:143:5:-;;;;;;;;;;;;853:42;753:143;;4562:224:4;;;;;;:::i;:::-;;:::i;3099:102::-;;;;;;;;;;-1:-1:-1;3099:102:4;;;;;:::i;:::-;;:::i;1641:513:8:-;;;;;;;;;;-1:-1:-1;1641:513:8;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;11391:150:6:-;;;;;;;;;;-1:-1:-1;11391:150:6;;;;;:::i;:::-;;:::i;3542:113:4:-;;;;;;;;;;-1:-1:-1;3542:113:4;;;;;:::i;:::-;;:::i;691:21::-;;;;;;;;;;;;;:::i;3663:98::-;;;;;;;;;;-1:-1:-1;3663:98:4;;;;;:::i;:::-;;:::i;7045:230:6:-;;;;;;;;;;-1:-1:-1;7045:230:6;;;;;:::i;:::-;;:::i;1831:101:0:-;;;;;;;;;;;;;:::i;3307:98:4:-;;;;;;;;;;-1:-1:-1;3307:98:4;;;;;:::i;:::-;;:::i;611:28::-;;;;;;;;;;-1:-1:-1;611:28:4;;;;-1:-1:-1;;;611:28:4;;;;;;2887:106;;;;;;;;;;-1:-1:-1;2887:106:4;;;;;:::i;:::-;;:::i;5417:879:8:-;;;;;;;;;;-1:-1:-1;5417:879:8;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1201:85:0:-;;;;;;;;;;-1:-1:-1;1273:6:0;;-1:-1:-1;;;;;1273:6:0;1201:85;;3209:90:4;;;;;;;;;;-1:-1:-1;3209:90:4;;;;;:::i;:::-;;:::i;10208:102:6:-;;;;;;;;;;;;;:::i;2528:2454:8:-;;;;;;;;;;-1:-1:-1;2528:2454:8;;;;;:::i;:::-;;:::i;1159:255:4:-;;;;;;:::i;:::-;;:::i;4101:229::-;;;;;;;;;;-1:-1:-1;4101:229:4;;;;;:::i;:::-;;:::i;4794:251::-;;;;;;:::i;:::-;;:::i;2669:210::-;;;;;;;;;;-1:-1:-1;2669:210:4;;;;;:::i;:::-;;:::i;1070:418:8:-;;;;;;;;;;-1:-1:-1;1070:418:8;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;10411:313:6:-;;;;;;;;;;-1:-1:-1;10411:313:6;;;;;:::i;:::-;;:::i;758:31:4:-;;;;;;;;;;;;;;;;2432:113;;;;;;;;;;-1:-1:-1;2432:113:4;;;;;:::i;:::-;;:::i;17282:162:6:-;;;;;;;;;;-1:-1:-1;17282:162:6;;;;;:::i;:::-;-1:-1:-1;;;;;17402:25:6;;;17379:4;17402:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;17282:162;2014:410:4;;;;;;;;;;-1:-1:-1;2014:410:4;;;;;:::i;:::-;;:::i;2081:198:0:-;;;;;;;;;;-1:-1:-1;2081:198:0;;;;;:::i;:::-;;:::i;721:28:4:-;;;;;;;;;;;;;;;;941:43;;;;;;;;;;-1:-1:-1;941:43:4;;;;;;;;646:38;;;;;;;;;;;;;;;;9155:630:6;9240:4;-1:-1:-1;;;;;;;;;9558:25:6;;;;:101;;-1:-1:-1;;;;;;;;;;9634:25:6;;;9558:101;:177;;;-1:-1:-1;;;;;;;;;;9710:25:6;;;9558:177;9539:196;9155:630;-1:-1:-1;;9155:630:6:o;3413:117:4:-;1094:13:0;:11;:13::i;:::-;3498:24:4::1;:10;3511:11:::0;;3498:24:::1;:::i;:::-;;3413:117:::0;;:::o;10039:98:6:-;10093:13;10125:5;10118:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10039:98;:::o;16360:214::-;16436:7;16460:16;16468:7;16460;:16::i;:::-;16455:64;;16485:34;;-1:-1:-1;;;16485:34:6;;;;;;;;;;;16455:64;-1:-1:-1;16537:24:6;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;16537:30:6;;16360:214::o;3893:200:4:-;4022:24;;4018:2;;4022:24;;;2786:60:5;;;;-1:-1:-1;853:42:5;2797:45;:49;;2786:60;2782:236;;;2868:67;;-1:-1:-1;;;2868:67:5;;2919:4;2868:67;;;9944:34:10;-1:-1:-1;;;;;10014:15:10;;9994:18;;;9987:43;853:42:5;;2868;;9879:18:10;;2868:67:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2863:144;;2963:28;;-1:-1:-1;;;2963:28:5;;-1:-1:-1;;;;;2511:32:10;;2963:28:5;;;2493:51:10;2466:18;;2963:28:5;;;;;;;;2863:144;4059:26:4::1;4073:2;4077:7;4059:13;:26::i;:::-;3893:200:::0;;;;:::o;3001:86::-;1094:13:0;:11;:13::i;:::-;3071:7:4::1;::::0;;-1:-1:-1;;;;3059:19:4;::::1;-1:-1:-1::0;;;3071:7:4;;;::::1;;;3070:8;3059:19:::0;;::::1;;::::0;;3001:86::o;839:46::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;839:46:4;:::o;4338:216::-;4472:24;;4466:4;;4472:24;;;2015:60:5;;;;-1:-1:-1;853:42:5;2026:45;:49;;2015:60;2011:550;;;2315:10;-1:-1:-1;;;;;2307:18:5;;;2303:85;;4509:37:4::1;4528:4;4534:2;4538:7;4509:18;:37::i;:::-;2366:7:5::0;;2303:85;2407:69;;-1:-1:-1;;;2407:69:5;;2458:4;2407:69;;;9944:34:10;2465:10:5;9994:18:10;;;9987:43;853:42:5;;2407;;9879:18:10;;2407:69:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2402:148;;2504:30;;-1:-1:-1;;;2504:30:5;;2523:10;2504:30;;;2493:51:10;2466:18;;2504:30:5;2347:203:10;2402:148:5;4509:37:4::1;4528:4;4534:2;4538:7;4509:18;:37::i;:::-;4338:216:::0;;;;;:::o;796:36::-;;;;;;;;;;;;3769:116;1094:13:0;:11;:13::i;:::-;3817:60:4::1;::::0;3825:10:::1;::::0;3862:4:::1;3846:30;3817:60:::0;::::1;;;::::0;::::1;::::0;;;3846:30;3825:10;3817:60;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;3769:116::o:0;4562:224::-;4700:24;;4694:4;;4700:24;;;2015:60:5;;;;-1:-1:-1;853:42:5;2026:45;:49;;2015:60;2011:550;;;2315:10;-1:-1:-1;;;;;2307:18:5;;;2303:85;;4737:41:4::1;4760:4;4766:2;4770:7;4737:22;:41::i;2303:85:5:-:0;2407:69;;-1:-1:-1;;;2407:69:5;;2458:4;2407:69;;;9944:34:10;2465:10:5;9994:18:10;;;9987:43;853:42:5;;2407;;9879:18:10;;2407:69:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2402:148;;2504:30;;-1:-1:-1;;;2504:30:5;;2523:10;2504:30;;;2493:51:10;2466:18;;2504:30:5;2347:203:10;2402:148:5;4737:41:4::1;4760:4;4766:2;4770:7;4737:22;:41::i;3099:102::-:0;1094:13:0;:11;:13::i;:::-;3175:7:4::1;:18;3185:8:::0;;3175:7;:18:::1;:::i;1641:513:8:-:0;1780:23;1868:8;1843:22;1868:8;-1:-1:-1;;;;;1934:36:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1934:36:8;;-1:-1:-1;;1934:36:8;;;;;;;;;;;;1897:73;;1989:9;1984:123;2005:14;2000:1;:19;1984:123;;2060:32;2080:8;;2089:1;2080:11;;;;;;;:::i;:::-;;;;;;;2060:19;:32::i;:::-;2044:10;2055:1;2044:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;2021:3;;1984:123;;;-1:-1:-1;2127:10:8;1641:513;-1:-1:-1;;;;1641:513:8:o;11391:150:6:-;11463:7;11505:27;11524:7;11505:18;:27::i;3542:113:4:-;1094:13:0;:11;:13::i;:::-;3625:22:4::1;:9;3637:10:::0;;3625:22:::1;:::i;691:21::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3663:98::-;1094:13:0;:11;:13::i;:::-;3733:9:4::1;:20:::0;3663:98::o;7045:230:6:-;7117:7;-1:-1:-1;;;;;7140:19:6;;7136:60;;7168:28;;-1:-1:-1;;;7168:28:6;;;;;;;;;;;7136:60;-1:-1:-1;;;;;;7213:25:6;;;;;:18;:25;;;;;;-1:-1:-1;;;;;7213:55:6;;7045:230::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;3307:98:4:-;1094:13:0;:11;:13::i;:::-;3377:8:4::1;:20:::0;3307:98::o;2887:106::-;1094:13:0;:11;:13::i;:::-;2959:26:4::1;2969:10;2981:3;2959:9;:26::i;5417:879:8:-:0;5495:16;5547:19;5580:25;5619:22;5644:16;5654:5;5644:9;:16::i;:::-;5619:41;;5674:25;5716:14;-1:-1:-1;;;;;5702:29:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5702:29:8;;5674:57;;5745:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5745:31:8;1142:1:4;5790:461:8;5839:14;5824:11;:29;5790:461;;5890:15;5903:1;5890:12;:15::i;:::-;5878:27;;5927:9;:16;;;5967:8;5923:71;6015:14;;-1:-1:-1;;;;;6015:28:8;;6011:109;;6087:14;;;-1:-1:-1;6011:109:8;6162:5;-1:-1:-1;;;;;6141:26:8;:17;-1:-1:-1;;;;;6141:26:8;;6137:100;;6217:1;6191:8;6200:13;;;;;;6191:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;6137:100;5855:3;;5790:461;;;-1:-1:-1;6271:8:8;;5417:879;-1:-1:-1;;;;;;5417:879:8:o;3209:90:4:-;1094:13:0;:11;:13::i;:::-;3273:9:4::1;:18:::0;3209:90::o;10208:102:6:-;10264:13;10296:7;10289:14;;;;;:::i;2528:2454:8:-;2667:16;2732:4;2723:5;:13;2719:45;;2745:19;;-1:-1:-1;;;2745:19:8;;;;;;;;;;;2719:45;2778:19;2811:17;2831:14;5645:7:6;5671:13;;5590:101;2831:14:8;2811:34;-1:-1:-1;1142:1:4;2921:5:8;:23;2917:85;;;1142:1:4;2964:23:8;;2917:85;3076:9;3069:4;:16;3065:71;;;3112:9;3105:16;;3065:71;3149:25;3177:16;3187:5;3177:9;:16::i;:::-;3149:44;;3368:4;3360:5;:12;3356:271;;;3414:12;;;3448:31;;;3444:109;;;3523:11;3503:31;;3444:109;3374:193;3356:271;;;-1:-1:-1;3611:1:8;3356:271;3640:25;3682:17;-1:-1:-1;;;;;3668:32:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3668:32:8;;3640:60;;3718:17;3739:1;3718:22;3714:76;;3767:8;-1:-1:-1;3760:15:8;;-1:-1:-1;;;3760:15:8;3714:76;3931:31;3965:26;3985:5;3965:19;:26::i;:::-;3931:60;;4005:25;4247:9;:16;;;4242:90;;-1:-1:-1;4303:14:8;;4242:90;4362:5;4345:467;4374:4;4369:1;:9;;:45;;;;;4397:17;4382:11;:32;;4369:45;4345:467;;;4451:15;4464:1;4451:12;:15::i;:::-;4439:27;;4488:9;:16;;;4528:8;4484:71;4576:14;;-1:-1:-1;;;;;4576:28:8;;4572:109;;4648:14;;;-1:-1:-1;4572:109:8;4723:5;-1:-1:-1;;;;;4702:26:8;:17;-1:-1:-1;;;;;4702:26:8;;4698:100;;4778:1;4752:8;4761:13;;;;;;4752:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;4698:100;4416:3;;4345:467;;;-1:-1:-1;;;4894:29:8;;;-1:-1:-1;4901:8:8;;-1:-1:-1;;2528:2454:8;;;;;;:::o;1159:255:4:-;1227:7;;-1:-1:-1;;;1227:7:4;;;;1219:40;;;;-1:-1:-1;;;1219:40:4;;12683:2:10;1219:40:4;;;12665:21:10;12722:2;12702:18;;;12695:30;-1:-1:-1;;;12741:18:10;;;12734:49;12800:18;;1219:40:4;12481:343:10;1219:40:4;1285:8;;1278:3;:15;;1270:44;;;;-1:-1:-1;;;1270:44:4;;13031:2:10;1270:44:4;;;13013:21:10;13070:2;13050:18;;;13043:30;-1:-1:-1;;;13089:18:10;;;13082:46;13145:18;;1270:44:4;12829:340:10;1270:44:4;1356:9;;1142:1;6164:12:6;5955:7;6148:13;1349:3:4;;6148:28:6;;-1:-1:-1;;6148:46:6;1333:19:4;;;;:::i;:::-;:32;;1325:57;;;;-1:-1:-1;;;1325:57:4;;13638:2:10;1325:57:4;;;13620:21:10;13677:2;13657:18;;;13650:30;-1:-1:-1;;;13696:18:10;;;13689:43;13749:18;;1325:57:4;13436:337:10;1325:57:4;1393:13;1402:3;1393:8;:13::i;4101:229::-;4242:24;;4232:8;;4242:24;;;2786:60:5;;;;-1:-1:-1;853:42:5;2797:45;:49;;2786:60;2782:236;;;2868:67;;-1:-1:-1;;;2868:67:5;;2919:4;2868:67;;;9944:34:10;-1:-1:-1;;;;;10014:15:10;;9994:18;;;9987:43;853:42:5;;2868;;9879:18:10;;2868:67:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2863:144;;2963:28;;-1:-1:-1;;;2963:28:5;;-1:-1:-1;;;;;2511:32:10;;2963:28:5;;;2493:51:10;2466:18;;2963:28:5;2347:203:10;2863:144:5;4279:43:4::1;4303:8;4313;4279:23;:43::i;4794:251::-:0;4952:24;;4946:4;;4952:24;;;2015:60:5;;;;-1:-1:-1;853:42:5;2026:45;:49;;2015:60;2011:550;;;2315:10;-1:-1:-1;;;;;2307:18:5;;;2303:85;;4989:48:4::1;5012:4;5018:2;5022:7;5031:5;4989:22;:48::i;:::-;2366:7:5::0;;2303:85;2407:69;;-1:-1:-1;;;2407:69:5;;2458:4;2407:69;;;9944:34:10;2465:10:5;9994:18:10;;;9987:43;853:42:5;;2407;;9879:18:10;;2407:69:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2402:148;;2504:30;;-1:-1:-1;;;2504:30:5;;2523:10;2504:30;;;2493:51:10;2466:18;;2504:30:5;2347:203:10;2402:148:5;4989:48:4::1;5012:4;5018:2;5022:7;5031:5;4989:22;:48::i;:::-;4794:251:::0;;;;;;:::o;2669:210::-;1094:13:0;:11;:13::i;:::-;2768:9:4::1;2763:109;2783:24:::0;;::::1;2763:109;;;2828:32;2838:13;;2852:1;2838:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2856:3;2828:9;:32::i;:::-;2809:3:::0;::::1;::::0;::::1;:::i;:::-;;;;2763:109;;1070:418:8::0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1142:1:4;1232:7:8;:25;:54;;;-1:-1:-1;5645:7:6;5671:13;1261:7:8;:25;;1232:54;1228:101;;;1309:9;1070:418;-1:-1:-1;;1070:418:8:o;1228:101::-;1350:21;1363:7;1350:12;:21::i;:::-;1338:33;;1385:9;:16;;;1381:63;;;1424:9;1070:418;-1:-1:-1;;1070:418:8:o;1381:63::-;1460:21;1473:7;1460:12;:21::i;10411:313:6:-;10484:13;10514:16;10522:7;10514;:16::i;:::-;10509:59;;10539:29;;-1:-1:-1;;;10539:29:6;;;;;;;;;;;10509:59;10579:21;10603:10;:8;:10::i;:::-;10579:34;;10636:7;10630:21;10655:1;10630:26;:87;;;;;;;;;;;;;;;;;10683:7;10692:18;10702:7;10692:9;:18::i;:::-;10666:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10623:94;10411:313;-1:-1:-1;;;10411:313:6:o;2432:113:4:-;-1:-1:-1;;;;;7440:25:6;;2490:7:4;7440:25:6;;;:18;:25;;1495:2;7440:25;;;;-1:-1:-1;;;;;7440:50:6;;7439:82;2517:20:4;7352:176:6;2014:410:4;2069:7;2098:10;2109:1;2098:13;;;;;;;;:::i;:::-;;;;;;;;;2092:3;:19;2089:328;;;2144:9;2154:1;2144:12;;;;;;;;:::i;:::-;;;;;;;;;2137:19;;2014:410;;;:::o;2089:328::-;2193:10;2204:1;2193:13;;;;;;;;:::i;:::-;;;;;;;;;2187:3;:19;2183:234;;;2239:9;2249:1;2239:12;;;;;;;;:::i;2183:234::-;2288:10;2299:1;2288:13;;;;;;;;:::i;:::-;;;;;;;;;2282:3;:19;2278:139;;;2334:9;2344:1;2334:12;;;;;;;;:::i;2278:139::-;-1:-1:-1;2404:1:4;;2014:410;-1:-1:-1;2014:410:4:o;2278:139::-;2014:410;;;:::o;2081:198:0:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:0;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:0;;14621:2:10;2161:73:0::1;::::0;::::1;14603:21:10::0;14660:2;14640:18;;;14633:30;14699:34;14679:18;;;14672:62;-1:-1:-1;;;14750:18:10;;;14743:36;14796:19;;2161:73:0::1;14419:402:10::0;2161:73:0::1;2244:28;2263:8;2244:18;:28::i;1359:130::-:0;1273:6;;-1:-1:-1;;;;;1273:6:0;719:10:1;1422:23:0;1414:68;;;;-1:-1:-1;;;1414:68:0;;15028:2:10;1414:68:0;;;15010:21:10;;;15047:18;;;15040:30;15106:34;15086:18;;;15079:62;15158:18;;1414:68:0;14826:356:10;17693:277:6;17758:4;17812:7;1142:1:4;17793:26:6;;:65;;;;;17845:13;;17835:7;:23;17793:65;:151;;;;-1:-1:-1;;17895:26:6;;;;:17;:26;;;;;;-1:-1:-1;;;17895:44:6;:49;;17693:277::o;15812:398::-;15900:13;15916:16;15924:7;15916;:16::i;:::-;15900:32;-1:-1:-1;719:10:1;-1:-1:-1;;;;;15947:28:6;;;15943:172;;15994:44;16011:5;719:10:1;17282:162:6;:::i;15994:44::-;15989:126;;16065:35;;-1:-1:-1;;;16065:35:6;;;;;;;;;;;15989:126;16125:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;16125:35:6;-1:-1:-1;;;;;16125:35:6;;;;;;;;;16175:28;;16125:24;;16175:28;;;;;;;15890:320;15812:398;;:::o;19903:2764::-;20040:27;20070;20089:7;20070:18;:27::i;:::-;20040:57;;20153:4;-1:-1:-1;;;;;20112:45:6;20128:19;-1:-1:-1;;;;;20112:45:6;;20108:86;;20166:28;;-1:-1:-1;;;20166:28:6;;;;;;;;;;;20108:86;20206:27;19036:24;;;:15;:24;;;;;19260:26;;719:10:1;18673:30:6;;;-1:-1:-1;;;;;18370:28:6;;18651:20;;;18648:56;20389:179;;20481:43;20498:4;719:10:1;17282:162:6;:::i;20481:43::-;20476:92;;20533:35;;-1:-1:-1;;;20533:35:6;;;;;;;;;;;20476:92;-1:-1:-1;;;;;20583:16:6;;20579:52;;20608:23;;-1:-1:-1;;;20608:23:6;;;;;;;;;;;20579:52;20774:15;20771:157;;;20912:1;20891:19;20884:30;20771:157;-1:-1:-1;;;;;21300:24:6;;;;;;;:18;:24;;;;;;21298:26;;-1:-1:-1;;21298:26:6;;;21368:22;;;;;;;;;21366:24;;-1:-1:-1;21366:24:6;;;14703:11;14678:23;14674:41;14661:63;-1:-1:-1;;;14661:63:6;21654:26;;;;:17;:26;;;;;:172;;;;-1:-1:-1;;;21943:47:6;;:52;;21939:617;;22047:1;22037:11;;22015:19;22168:30;;;:17;:30;;;;;;:35;;22164:378;;22304:13;;22289:11;:28;22285:239;;22449:30;;;;:17;:30;;;;;:52;;;22285:239;21997:559;21939:617;22600:7;22596:2;-1:-1:-1;;;;;22581:27:6;22590:4;-1:-1:-1;;;;;22581:27:6;;;;;;;;;;;22618:42;3893:200:4;22758:187:6;22899:39;22916:4;22922:2;22926:7;22899:39;;;;;;;;;;;;:16;:39::i;12515:1249::-;12582:7;12616;;1142:1:4;12662:23:6;12658:1042;;12714:13;;12707:4;:20;12703:997;;;12751:14;12768:23;;;:17;:23;;;;;;;-1:-1:-1;;;12855:24:6;;:29;;12851:831;;13510:111;13517:6;13527:1;13517:11;13510:111;;-1:-1:-1;;;13587:6:6;13569:25;;;;:17;:25;;;;;;13510:111;;12851:831;12729:971;12703:997;13726:31;;-1:-1:-1;;;13726:31:6;;;;;;;;;;;2433:187:0;2525:6;;;-1:-1:-1;;;;;2541:17:0;;;-1:-1:-1;;;;;;2541:17:0;;;;;;;2573:40;;2525:6;;;2541:17;2525:6;;2573:40;;2506:16;;2573:40;2496:124;2433:187;:::o;33423:110:6:-;33499:27;33509:2;33513:8;33499:27;;;;;;;;;;;;:9;:27::i;:::-;33423:110;;:::o;11979:159::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12106:24:6;;;;:17;:24;;;;;;12087:44;;:18;:44::i;1422:584:4:-;1474:13;1490:29;1505:13;1142:1;6164:12:6;5955:7;6148:13;-1:-1:-1;;6148:28:6;;;:46;;5894:317;1490:29:4;1540:10;1533:18;;;;:6;:18;;;;;;1474:45;;-1:-1:-1;1533:29:4;-1:-1:-1;1530:469:4;;;1598:8;1592:3;:14;1589:33;;;1614:8;1608:14;;1589:33;1676:9;;1658:14;1664:8;1658:3;:14;:::i;:::-;1657:28;;;;:::i;:::-;1644:9;:41;;1636:77;;;;-1:-1:-1;;;1636:77:4;;15695:2:10;1636:77:4;;;15677:21:10;15734:2;15714:18;;;15707:30;15773:26;15753:18;;;15746:54;15817:18;;1636:77:4;15493:348:10;1636:77:4;1735:10;1728:18;;;;:6;:18;;;;;:25;;1750:3;;1728:18;:25;;1750:3;;1728:25;:::i;:::-;;;;-1:-1:-1;1767:26:4;;-1:-1:-1;1777:10:4;1789:3;1767:9;:26::i;1530:469::-;1870:9;;1864:15;;:3;:15;:::i;16901:231:6:-;719:10:1;16995:39:6;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;16995:49:6;;;;;;;;;;;;:60;;-1:-1:-1;;16995:60:6;;;;;;;;;;17070:55;;540:41:10;;;16995:49:6;;719:10:1;17070:55:6;;513:18:10;17070:55:6;;;;;;;16901:231;;:::o;23526:396::-;23695:31;23708:4;23714:2;23718:7;23695:12;:31::i;:::-;-1:-1:-1;;;;;23740:14:6;;;:19;23736:180;;23778:56;23809:4;23815:2;23819:7;23828:5;23778:30;:56::i;:::-;23773:143;;23861:40;;-1:-1:-1;;;23861:40:6;;;;;;;;;;;11724:164;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11834:47:6;11853:27;11872:7;11853:18;:27::i;:::-;11834:18;:47::i;2553:108:4:-;2613:13;2646:7;2639:14;;;;;:::i;39637:1708:6:-;39702:17;40130:4;40123;40117:11;40113:22;40220:1;40214:4;40207:15;40293:4;40290:1;40286:12;40279:19;;;40373:1;40368:3;40361:14;40474:3;40708:5;40690:419;40755:1;40750:3;40746:11;40739:18;;40923:2;40917:4;40913:13;40909:2;40905:22;40900:3;40892:36;41015:2;41005:13;;41070:25;40690:419;41070:25;-1:-1:-1;41137:13:6;;;-1:-1:-1;;41250:14:6;;;41310:19;;;41250:14;39637:1708;-1:-1:-1;39637:1708:6:o;32675:669::-;32801:19;32807:2;32811:8;32801:5;:19::i;:::-;-1:-1:-1;;;;;32859:14:6;;;:19;32855:473;;32898:11;32912:13;32959:14;;;32991:229;33021:62;33060:1;33064:2;33068:7;;;;;;33077:5;33021:30;:62::i;:::-;33016:165;;33118:40;;-1:-1:-1;;;33118:40:6;;;;;;;;;;;33016:165;33215:3;33207:5;:11;32991:229;;33300:3;33283:13;;:20;33279:34;;33305:8;;;13858:361;-1:-1:-1;;;;;;;;;;;;;13967:41:6;;;;2004:3;14052:33;;;-1:-1:-1;;;;;14018:68:6;-1:-1:-1;;;14018:68:6;-1:-1:-1;;;14115:24:6;;:29;;-1:-1:-1;;;14096:48:6;;;;2513:3;14183:28;;;;-1:-1:-1;;;14154:58:6;-1:-1:-1;13858:361:6:o;25948:697::-;26126:88;;-1:-1:-1;;;26126:88:6;;26106:4;;-1:-1:-1;;;;;26126:45:6;;;;;:88;;719:10:1;;26193:4:6;;26199:7;;26208:5;;26126:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26126:88:6;;;;;;;;-1:-1:-1;;26126:88:6;;;;;;;;;;;;:::i;:::-;;;26122:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26404:6;:13;26421:1;26404:18;26400:229;;26449:40;;-1:-1:-1;;;26449:40:6;;;;;;;;;;;26400:229;26589:6;26583:13;26574:6;26570:2;26566:15;26559:38;26122:517;-1:-1:-1;;;;;;26282:64:6;-1:-1:-1;;;26282:64:6;;-1:-1:-1;25948:697:6;;;;;;:::o;27091:2902::-;27163:20;27186:13;;;27213;;;27209:44;;27235:18;;-1:-1:-1;;;27235:18:6;;;;;;;;;;;27209:44;-1:-1:-1;;;;;27728:22:6;;;;;;:18;:22;;;;1495:2;27728:22;;;:71;;27766:32;27754:45;;27728:71;;;28035:31;;;:17;:31;;;;;-1:-1:-1;15123:15:6;;15097:24;15093:46;14703:11;14678:23;14674:41;14671:52;14661:63;;28035:170;;28264:23;;;;28035:31;;27728:22;;29016:25;27728:22;;28872:328;29520:1;29506:12;29502:20;29461:339;29560:3;29551:7;29548:16;29461:339;;29774:7;29764:8;29761:1;29734:25;29731:1;29728;29723:59;29612:1;29599:15;29461:339;;;29465:75;29831:8;29843:1;29831:13;29827:45;;29853:19;;-1:-1:-1;;;29853:19:6;;;;;;;;;;;29827:45;29887:13;:19;-1:-1:-1;3498:24:4::1;3413:117:::0;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:10;-1:-1:-1;;;;;;88:32:10;;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:367::-;655:8;665:6;719:3;712:4;704:6;700:17;696:27;686:55;;737:1;734;727:12;686:55;-1:-1:-1;760:20:10;;-1:-1:-1;;;;;792:30:10;;789:50;;;835:1;832;825:12;789:50;872:4;864:6;860:17;848:29;;932:3;925:4;915:6;912:1;908:14;900:6;896:27;892:38;889:47;886:67;;;949:1;946;939:12;886:67;592:367;;;;;:::o;964:437::-;1050:6;1058;1111:2;1099:9;1090:7;1086:23;1082:32;1079:52;;;1127:1;1124;1117:12;1079:52;1167:9;1154:23;-1:-1:-1;;;;;1192:6:10;1189:30;1186:50;;;1232:1;1229;1222:12;1186:50;1271:70;1333:7;1324:6;1313:9;1309:22;1271:70;:::i;:::-;1360:8;;1245:96;;-1:-1:-1;964:437:10;-1:-1:-1;;;;964:437:10:o;1406:250::-;1491:1;1501:113;1515:6;1512:1;1509:13;1501:113;;;1591:11;;;1585:18;1572:11;;;1565:39;1537:2;1530:10;1501:113;;;-1:-1:-1;;1648:1:10;1630:16;;1623:27;1406:250::o;1661:271::-;1703:3;1741:5;1735:12;1768:6;1763:3;1756:19;1784:76;1853:6;1846:4;1841:3;1837:14;1830:4;1823:5;1819:16;1784:76;:::i;:::-;1914:2;1893:15;-1:-1:-1;;1889:29:10;1880:39;;;;1921:4;1876:50;;1661:271;-1:-1:-1;;1661:271:10:o;1937:220::-;2086:2;2075:9;2068:21;2049:4;2106:45;2147:2;2136:9;2132:18;2124:6;2106:45;:::i;2162:180::-;2221:6;2274:2;2262:9;2253:7;2249:23;2245:32;2242:52;;;2290:1;2287;2280:12;2242:52;-1:-1:-1;2313:23:10;;2162:180;-1:-1:-1;2162:180:10:o;2555:173::-;2623:20;;-1:-1:-1;;;;;2672:31:10;;2662:42;;2652:70;;2718:1;2715;2708:12;2733:254;2801:6;2809;2862:2;2850:9;2841:7;2837:23;2833:32;2830:52;;;2878:1;2875;2868:12;2830:52;2901:29;2920:9;2901:29;:::i;:::-;2891:39;2977:2;2962:18;;;;2949:32;;-1:-1:-1;;;2733:254:10:o;3174:186::-;3233:6;3286:2;3274:9;3265:7;3261:23;3257:32;3254:52;;;3302:1;3299;3292:12;3254:52;3325:29;3344:9;3325:29;:::i;3365:328::-;3442:6;3450;3458;3511:2;3499:9;3490:7;3486:23;3482:32;3479:52;;;3527:1;3524;3517:12;3479:52;3550:29;3569:9;3550:29;:::i;:::-;3540:39;;3598:38;3632:2;3621:9;3617:18;3598:38;:::i;:::-;3588:48;;3683:2;3672:9;3668:18;3655:32;3645:42;;3365:328;;;;;:::o;3937:592::-;4008:6;4016;4069:2;4057:9;4048:7;4044:23;4040:32;4037:52;;;4085:1;4082;4075:12;4037:52;4125:9;4112:23;-1:-1:-1;;;;;4195:2:10;4187:6;4184:14;4181:34;;;4211:1;4208;4201:12;4181:34;4249:6;4238:9;4234:22;4224:32;;4294:7;4287:4;4283:2;4279:13;4275:27;4265:55;;4316:1;4313;4306:12;4265:55;4356:2;4343:16;4382:2;4374:6;4371:14;4368:34;;;4398:1;4395;4388:12;4368:34;4443:7;4438:2;4429:6;4425:2;4421:15;4417:24;4414:37;4411:57;;;4464:1;4461;4454:12;4411:57;4495:2;4487:11;;;;;4517:6;;-1:-1:-1;3937:592:10;;-1:-1:-1;;;;3937:592:10:o;4534:349::-;4618:12;;-1:-1:-1;;;;;4614:38:10;4602:51;;4706:4;4695:16;;;4689:23;-1:-1:-1;;;;;4685:48:10;4669:14;;;4662:72;4797:4;4786:16;;;4780:23;4773:31;4766:39;4750:14;;;4743:63;4859:4;4848:16;;;4842:23;4867:8;4838:38;4822:14;;4815:62;4534:349::o;4888:724::-;5123:2;5175:21;;;5245:13;;5148:18;;;5267:22;;;5094:4;;5123:2;5346:15;;;;5320:2;5305:18;;;5094:4;5389:197;5403:6;5400:1;5397:13;5389:197;;;5452:52;5500:3;5491:6;5485:13;5452:52;:::i;:::-;5561:15;;;;5533:4;5524:14;;;;;5425:1;5418:9;5389:197;;5617:632;5788:2;5840:21;;;5910:13;;5813:18;;;5932:22;;;5759:4;;5788:2;6011:15;;;;5985:2;5970:18;;;5759:4;6054:169;6068:6;6065:1;6062:13;6054:169;;;6129:13;;6117:26;;6198:15;;;;6163:12;;;;6090:1;6083:9;6054:169;;6254:322;6331:6;6339;6347;6400:2;6388:9;6379:7;6375:23;6371:32;6368:52;;;6416:1;6413;6406:12;6368:52;6439:29;6458:9;6439:29;:::i;:::-;6429:39;6515:2;6500:18;;6487:32;;-1:-1:-1;6566:2:10;6551:18;;;6538:32;;6254:322;-1:-1:-1;;;6254:322:10:o;6581:118::-;6667:5;6660:13;6653:21;6646:5;6643:32;6633:60;;6689:1;6686;6679:12;6704:315;6769:6;6777;6830:2;6818:9;6809:7;6805:23;6801:32;6798:52;;;6846:1;6843;6836:12;6798:52;6869:29;6888:9;6869:29;:::i;:::-;6859:39;;6948:2;6937:9;6933:18;6920:32;6961:28;6983:5;6961:28;:::i;:::-;7008:5;6998:15;;;6704:315;;;;;:::o;7024:127::-;7085:10;7080:3;7076:20;7073:1;7066:31;7116:4;7113:1;7106:15;7140:4;7137:1;7130:15;7156:1138;7251:6;7259;7267;7275;7328:3;7316:9;7307:7;7303:23;7299:33;7296:53;;;7345:1;7342;7335:12;7296:53;7368:29;7387:9;7368:29;:::i;:::-;7358:39;;7416:38;7450:2;7439:9;7435:18;7416:38;:::i;:::-;7406:48;;7501:2;7490:9;7486:18;7473:32;7463:42;;7556:2;7545:9;7541:18;7528:32;-1:-1:-1;;;;;7620:2:10;7612:6;7609:14;7606:34;;;7636:1;7633;7626:12;7606:34;7674:6;7663:9;7659:22;7649:32;;7719:7;7712:4;7708:2;7704:13;7700:27;7690:55;;7741:1;7738;7731:12;7690:55;7777:2;7764:16;7799:2;7795;7792:10;7789:36;;;7805:18;;:::i;:::-;7880:2;7874:9;7848:2;7934:13;;-1:-1:-1;;7930:22:10;;;7954:2;7926:31;7922:40;7910:53;;;7978:18;;;7998:22;;;7975:46;7972:72;;;8024:18;;:::i;:::-;8064:10;8060:2;8053:22;8099:2;8091:6;8084:18;8139:7;8134:2;8129;8125;8121:11;8117:20;8114:33;8111:53;;;8160:1;8157;8150:12;8111:53;8216:2;8211;8207;8203:11;8198:2;8190:6;8186:15;8173:46;8261:1;8256:2;8251;8243:6;8239:15;8235:24;8228:35;8282:6;8272:16;;;;;;;7156:1138;;;;;;;:::o;8299:505::-;8394:6;8402;8410;8463:2;8451:9;8442:7;8438:23;8434:32;8431:52;;;8479:1;8476;8469:12;8431:52;8519:9;8506:23;-1:-1:-1;;;;;8544:6:10;8541:30;8538:50;;;8584:1;8581;8574:12;8538:50;8623:70;8685:7;8676:6;8665:9;8661:22;8623:70;:::i;:::-;8712:8;;8597:96;;-1:-1:-1;8794:2:10;8779:18;;;;8766:32;;8299:505;-1:-1:-1;;;;8299:505:10:o;8809:268::-;9007:3;8992:19;;9020:51;8996:9;9053:6;9020:51;:::i;9082:260::-;9150:6;9158;9211:2;9199:9;9190:7;9186:23;9182:32;9179:52;;;9227:1;9224;9217:12;9179:52;9250:29;9269:9;9250:29;:::i;:::-;9240:39;;9298:38;9332:2;9321:9;9317:18;9298:38;:::i;:::-;9288:48;;9082:260;;;;;:::o;9347:380::-;9426:1;9422:12;;;;9469;;;9490:61;;9544:4;9536:6;9532:17;9522:27;;9490:61;9597:2;9589:6;9586:14;9566:18;9563:38;9560:161;;9643:10;9638:3;9634:20;9631:1;9624:31;9678:4;9675:1;9668:15;9706:4;9703:1;9696:15;9560:161;;9347:380;;;:::o;10041:245::-;10108:6;10161:2;10149:9;10140:7;10136:23;10132:32;10129:52;;;10177:1;10174;10167:12;10129:52;10209:9;10203:16;10228:28;10250:5;10228:28;:::i;10417:545::-;10519:2;10514:3;10511:11;10508:448;;;10555:1;10580:5;10576:2;10569:17;10625:4;10621:2;10611:19;10695:2;10683:10;10679:19;10676:1;10672:27;10666:4;10662:38;10731:4;10719:10;10716:20;10713:47;;;-1:-1:-1;10754:4:10;10713:47;10809:2;10804:3;10800:12;10797:1;10793:20;10787:4;10783:31;10773:41;;10864:82;10882:2;10875:5;10872:13;10864:82;;;10927:17;;;10908:1;10897:13;10864:82;;11138:1206;-1:-1:-1;;;;;11257:3:10;11254:27;11251:53;;;11284:18;;:::i;:::-;11313:94;11403:3;11363:38;11395:4;11389:11;11363:38;:::i;:::-;11357:4;11313:94;:::i;:::-;11433:1;11458:2;11453:3;11450:11;11475:1;11470:616;;;;12130:1;12147:3;12144:93;;;-1:-1:-1;12203:19:10;;;12190:33;12144:93;-1:-1:-1;;11095:1:10;11091:11;;;11087:24;11083:29;11073:40;11119:1;11115:11;;;11070:57;12250:78;;11443:895;;11470:616;10364:1;10357:14;;;10401:4;10388:18;;-1:-1:-1;;11506:17:10;;;11607:9;11629:229;11643:7;11640:1;11637:14;11629:229;;;11732:19;;;11719:33;11704:49;;11839:4;11824:20;;;;11792:1;11780:14;;;;11659:12;11629:229;;;11633:3;11886;11877:7;11874:16;11871:159;;;12010:1;12006:6;12000:3;11994;11991:1;11987:11;11983:21;11979:34;11975:39;11962:9;11957:3;11953:19;11940:33;11936:79;11928:6;11921:95;11871:159;;;12073:1;12067:3;12064:1;12060:11;12056:19;12050:4;12043:33;11443:895;;11138:1206;;;:::o;12349:127::-;12410:10;12405:3;12401:20;12398:1;12391:31;12441:4;12438:1;12431:15;12465:4;12462:1;12455:15;13174:127;13235:10;13230:3;13226:20;13223:1;13216:31;13266:4;13263:1;13256:15;13290:4;13287:1;13280:15;13306:125;13371:9;;;13392:10;;;13389:36;;;13405:18;;:::i;13778:135::-;13817:3;13838:17;;;13835:43;;13858:18;;:::i;:::-;-1:-1:-1;13905:1:10;13894:13;;13778:135::o;13918:496::-;14097:3;14135:6;14129:13;14151:66;14210:6;14205:3;14198:4;14190:6;14186:17;14151:66;:::i;:::-;14280:13;;14239:16;;;;14302:70;14280:13;14239:16;14349:4;14337:17;;14302:70;:::i;:::-;14388:20;;13918:496;-1:-1:-1;;;;13918:496:10:o;15187:128::-;15254:9;;;15275:11;;;15272:37;;;15289:18;;:::i;15320:168::-;15393:9;;;15424;;15441:15;;;15435:22;;15421:37;15411:71;;15462:18;;:::i;15846:489::-;-1:-1:-1;;;;;16115:15:10;;;16097:34;;16167:15;;16162:2;16147:18;;16140:43;16214:2;16199:18;;16192:34;;;16262:3;16257:2;16242:18;;16235:31;;;16040:4;;16283:46;;16309:19;;16301:6;16283:46;:::i;:::-;16275:54;15846:489;-1:-1:-1;;;;;;15846:489:10:o;16340:249::-;16409:6;16462:2;16450:9;16441:7;16437:23;16433:32;16430:52;;;16478:1;16475;16468:12;16430:52;16510:9;16504:16;16529:30;16553:5;16529:30;:::i

Swarm Source

ipfs://dca9d7752b9817aa355d525914c5bc53cbb1af11d45c5bab4c025b22284f22dc
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.