ETH Price: $3,473.04 (+1.58%)
Gas: 10 Gwei

Token

GentlemanBullsClub (GBC)
 

Overview

Max Total Supply

249 GBC

Holders

64

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 GBC
0x2d07cd174a5041bac0735cc55e49124fe86c4bf7
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:
GentlemanBullsClub

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-09-12
*/

// File: contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`,
     * as defined in the ERC2309 standard. See `_mintERC2309` for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}
// File: contracts/ERC721A_royalty.sol


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

pragma solidity ^0.8.4;


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

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

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

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

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

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

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

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

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

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

    // The 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 tokenId of the next token to be minted.
    uint256 private _currentIndex;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [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 => address) private _tokenApprovals;

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

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

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

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

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

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

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

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

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

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

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

    /**
     * Returns the 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 {
        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;
    }

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

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

    /**
     * @dev 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 See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

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

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

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

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

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ownerOf(tokenId);
        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

        // Overflows are incredibly unrealistic.
        // `balance` 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 tokenId = startTokenId;
            uint256 end = startTokenId + quantity;
            do {
                emit Transfer(address(0), to, tokenId++);
            } while (tokenId < end);

            _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 {
        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 Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals;
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            // Compute the slot.
            mstore(0x00, tokenId)
            mstore(0x20, tokenApprovalsPtr.slot)
            approvedAddressSlot := keccak256(0x00, 0x40)
            // Load the slot's value from storage.
            approvedAddress := sload(approvedAddressSlot)
        }
    }

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

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

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

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

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isOwnerOrApproved(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 `_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) = _getApprovedAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isOwnerOrApproved(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++;
        }
    }

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

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal {
        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 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;
    }

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

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

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

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

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

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

            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}
// File: @openzeppelin/contracts/utils/Strings.sol


// 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: @openzeppelin/contracts/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;




/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/finance/PaymentSplitter.sol


// OpenZeppelin Contracts (last updated v4.7.0) (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;




/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned. The distribution of shares is set at the
 * time of contract deployment and can't be updated thereafter.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account) public view returns (uint256) {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Getter for the amount of payee's releasable Ether.
     */
    function releasable(address account) public view returns (uint256) {
        uint256 totalReceived = address(this).balance + totalReleased();
        return _pendingPayment(account, totalReceived, released(account));
    }

    /**
     * @dev Getter for the amount of payee's releasable `token` tokens. `token` should be the address of an
     * IERC20 contract.
     */
    function releasable(IERC20 token, address account) public view returns (uint256) {
        uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token);
        return _pendingPayment(account, totalReceived, released(token, account));
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 payment = releasable(account);

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 payment = releasable(token, account);

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: contracts/GentlemanBullsClub.sol


pragma solidity ^0.8.18;





contract GentlemanBullsClub is Ownable, ERC721A, PaymentSplitter {

    using Strings for uint;

    string public baseURI;

    uint256 public startTime = 1704067200;

    uint public  MAX_SUPPLY = 10000;
    uint public  MAX_TOTAL_WL = 1500;


    uint public MAX_PER_WALLET = 10000;


    uint public wlSalePrice = 0.05 ether;
    uint public publicSalePrice = 0.1 ether;

    mapping(address => uint) public amountNFTsperWallet;


    uint private teamLength;

    uint96 royaltyFeesInBips;
    address royaltyReceiver;

    constructor(uint96 _royaltyFeesInBips, address[] memory _team, uint[] memory _teamShares, address _royaltyReceiver, string memory _baseURI) ERC721A("GentlemanBullsClub", "GBC")
    PaymentSplitter(_team, _teamShares) {
        baseURI = _baseURI;
        teamLength = _team.length;
        royaltyFeesInBips = _royaltyFeesInBips;
        royaltyReceiver = _royaltyReceiver;
    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }

    function priceView() external view returns(uint256){
        uint256 price;
        if(totalSupply() <= MAX_TOTAL_WL){
            price = wlSalePrice;
        } else {
            price = publicSalePrice;
        }
        return price;
    }

    function mint(uint _quantity) external payable callerIsUser {
        uint256 price;
        if(totalSupply() + _quantity <= MAX_TOTAL_WL){
            price = wlSalePrice;
        } else {
            price = publicSalePrice;
        }
        require(block.timestamp > startTime, "Public sale is not activated");
        require(totalSupply() + _quantity <= MAX_SUPPLY, "Max supply exceeded");
        require(amountNFTsperWallet[msg.sender] + _quantity <= MAX_PER_WALLET, "Max per wallet limit reached");
        require(msg.value >= price * _quantity, "Not enought funds");
        amountNFTsperWallet[msg.sender] += _quantity;
        _safeMint(msg.sender, _quantity);
    }

    function gift(address _to, uint _quantity) external onlyOwner {
        require(totalSupply() + _quantity <= MAX_SUPPLY, "Reached max Supply");
        _safeMint(_to, _quantity);
    }

    function lowerSupply (uint _MAX_SUPPLY) external onlyOwner{
        require(_MAX_SUPPLY < MAX_SUPPLY, "Cannot increase supply!");
        MAX_SUPPLY = _MAX_SUPPLY;
    }

    function setMaxTotalWL(uint _MAX_TOTAL_WL) external onlyOwner {
        MAX_TOTAL_WL = _MAX_TOTAL_WL;
    }

    function setMaxPerWallet(uint _MAX_PER_WALLET) external onlyOwner {
        MAX_PER_WALLET = _MAX_PER_WALLET;
    }

    function setWLSalePrice(uint _wlSalePrice) external onlyOwner {
        wlSalePrice = _wlSalePrice;
    }

    function setPublicSalePrice(uint _publicSalePrice) external onlyOwner {
        publicSalePrice = _publicSalePrice;
    }

    function setBaseUri(string memory _baseURI) external onlyOwner {
        baseURI = _baseURI;
    }

    function setSaleStartTime(uint256 _startTime) external onlyOwner {
        startTime = _startTime;
    }

    function tokenURI(uint _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), "URI query for nonexistent token");
        return string(abi.encodePacked(baseURI, _tokenId.toString(), ".json"));
    }

    function royaltyInfo (
    uint256 _tokenId,
    uint256 _salePrice
     ) external view returns (
        address receiver,
        uint256 royaltyAmount
     ){
         return (royaltyReceiver, calculateRoyalty(_salePrice));
     }

    function calculateRoyalty(uint256 _salePrice) view public returns (uint256){
        return(_salePrice / 10000) * royaltyFeesInBips;
    }

    function setRoyaltyInfo (address _receiver, uint96 _royaltyFeesInBips) public onlyOwner {
        royaltyReceiver = _receiver;
        royaltyFeesInBips = _royaltyFeesInBips;
    }

    //ReleaseALL
    function releaseAll() external onlyOwner {
        for(uint i = 0 ; i < teamLength ; i++) {
            release(payable(payee(i)));
        }
    }

    receive() override external payable {
        revert('Only if you mint');
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint96","name":"_royaltyFeesInBips","type":"uint96"},{"internalType":"address[]","name":"_team","type":"address[]"},{"internalType":"uint256[]","name":"_teamShares","type":"uint256[]"},{"internalType":"address","name":"_royaltyReceiver","type":"address"},{"internalType":"string","name":"_baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","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":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","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":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOTAL_WL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"amountNFTsperWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"calculateRoyalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"_MAX_SUPPLY","type":"uint256"}],"name":"lowerSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceView","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"releasable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"releasable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"_MAX_PER_WALLET","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MAX_TOTAL_WL","type":"uint256"}],"name":"setMaxTotalWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicSalePrice","type":"uint256"}],"name":"setPublicSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_royaltyFeesInBips","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"setSaleStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wlSalePrice","type":"uint256"}],"name":"setWLSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405263659200806011556127106012556105dc60135561271060145566b1a2bc2ec5000060155567016345785d8a00006016553480156200004257600080fd5b506040516200326638038062003266833981016040819052620000659162000633565b83836040518060400160405280601281526020017123b2b73a3632b6b0b7213ab63639a1b63ab160711b8152506040518060400160405280600381526020016247424360e81b815250620000c8620000c26200026560201b60201c565b62000269565b6003620000d68382620007ee565b506004620000e58282620007ee565b5060018055505080518251146200015e5760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620001b15760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604482015260640162000155565b60005b82518110156200021d5762000208838281518110620001d757620001d7620008ba565b6020026020010151838381518110620001f457620001f4620008ba565b6020026020010151620002b960201b60201c565b806200021481620008e6565b915050620001b4565b50601091506200023090508282620007ee565b50509151601855506001600160a01b03166c01000000000000000000000000026001600160601b03909116176019556200091e565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216620003265760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b606482015260840162000155565b60008111620003785760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604482015260640162000155565b6001600160a01b0382166000908152600b602052604090205415620003f45760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b606482015260840162000155565b600d8054600181019091557fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319166001600160a01b0384169081179091556000908152600b602052604090208190556009546200045e90829062000902565b600955604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620004e857620004e8620004a7565b604052919050565b60006001600160401b038211156200050c576200050c620004a7565b5060051b60200190565b80516001600160a01b03811681146200052e57600080fd5b919050565b600082601f8301126200054557600080fd5b815160206200055e6200055883620004f0565b620004bd565b82815260059290921b840181019181810190868411156200057e57600080fd5b8286015b848110156200059b578051835291830191830162000582565b509695505050505050565b600082601f830112620005b857600080fd5b81516001600160401b03811115620005d457620005d4620004a7565b6020620005ea601f8301601f19168201620004bd565b8281528582848701011115620005ff57600080fd5b60005b838110156200061f57858101830151828201840152820162000602565b506000928101909101919091529392505050565b600080600080600060a086880312156200064c57600080fd5b85516001600160601b03811681146200066457600080fd5b602087810151919650906001600160401b03808211156200068457600080fd5b818901915089601f8301126200069957600080fd5b8151620006aa6200055882620004f0565b81815260059190911b8301840190848101908c831115620006ca57600080fd5b938501935b82851015620006f357620006e38562000516565b82529385019390850190620006cf565b60408c015190995094505050808311156200070d57600080fd5b6200071b8a848b0162000533565b95506200072b60608a0162000516565b945060808901519250808311156200074257600080fd5b50506200075288828901620005a6565b9150509295509295909350565b600181811c908216806200077457607f821691505b6020821081036200079557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620007e957600081815260208120601f850160051c81016020861015620007c45750805b601f850160051c820191505b81811015620007e557828155600101620007d0565b5050505b505050565b81516001600160401b038111156200080a576200080a620004a7565b62000822816200081b84546200075f565b846200079b565b602080601f8311600181146200085a5760008415620008415750858301515b600019600386901b1c1916600185901b178555620007e5565b600085815260208120601f198616915b828110156200088b578886015182559484019460019091019084016200086a565b5085821015620008aa5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201620008fb57620008fb620008d0565b5060010190565b80820180821115620009185762000918620008d0565b92915050565b612938806200092e6000396000f3fe6080604052600436106102cd5760003560e01c8063734c66bd11610175578063a3f8eace116100dc578063cbce4c9711610095578063e268e4d31161006f578063e268e4d314610912578063e33b7de314610932578063e985e9c514610947578063f2fde38b1461099057600080fd5b8063cbce4c9714610886578063ce7c2ac2146108a6578063d79779b2146108dc57600080fd5b8063a3f8eace146107c6578063aac0d2f6146107e6578063b88d4fde14610806578063c45ac05014610826578063c715381614610846578063c87b56dd1461086657600080fd5b80639852595c1161012e5780639852595c146107075780639b6860c81461073d578063a0712d6814610753578063a0bcfc7f14610766578063a22cb46514610786578063a2e69613146107a657600080fd5b8063734c66bd1461066857806378e979251461067e578063791a2519146106945780638b83209b146106b45780638da5cb5b146106d457806395d89b41146106f257600080fd5b80632a55205a11610234578063499a4687116101ed5780636352211e116101c75780636352211e146105fe5780636c0360eb1461061e57806370a0823114610633578063715018a61461065357600080fd5b8063499a46871461059c578063525f8a5c146105c95780635be7fde8146105e957600080fd5b80632a55205a146104ac57806332cb6b0c146104eb5780633a98ef3914610501578063406072a91461051657806342842e0e1461055c57806348b750441461057c57600080fd5b8063095ea7b311610286578063095ea7b31461040c5780630f2cdd6c1461042c578063172e1e521461044257806318160ddd14610457578063191655871461046c57806323b872dd1461048c57600080fd5b806301ffc9a71461031757806302fa7c471461034c57806306fdde031461036e5780630805943914610390578063081812fc146103b057806308ab701c146103e857600080fd5b366103125760405162461bcd60e51b815260206004820152601060248201526f13db9b1e481a59881e5bdd481b5a5b9d60821b60448201526064015b60405180910390fd5b600080fd5b34801561032357600080fd5b5061033761033236600461219b565b6109b0565b60405190151581526020015b60405180910390f35b34801561035857600080fd5b5061036c6103673660046121cd565b610a1d565b005b34801561037a57600080fd5b50610383610a76565b6040516103439190612262565b34801561039c57600080fd5b5061036c6103ab366004612275565b610b08565b3480156103bc57600080fd5b506103d06103cb366004612275565b610b37565b6040516001600160a01b039091168152602001610343565b3480156103f457600080fd5b506103fe60135481565b604051908152602001610343565b34801561041857600080fd5b5061036c61042736600461228e565b610b7b565b34801561043857600080fd5b506103fe60145481565b34801561044e57600080fd5b506103fe610c1b565b34801561046357600080fd5b506103fe610c3e565b34801561047857600080fd5b5061036c6104873660046122ba565b610c4c565b34801561049857600080fd5b5061036c6104a73660046122d7565b610d45565b3480156104b857600080fd5b506104cc6104c7366004612318565b610ede565b604080516001600160a01b039093168352602083019190915201610343565b3480156104f757600080fd5b506103fe60125481565b34801561050d57600080fd5b506009546103fe565b34801561052257600080fd5b506103fe61053136600461233a565b6001600160a01b039182166000908152600f6020908152604080832093909416825291909152205490565b34801561056857600080fd5b5061036c6105773660046122d7565b610f0a565b34801561058857600080fd5b5061036c61059736600461233a565b610f2a565b3480156105a857600080fd5b506103fe6105b73660046122ba565b60176020526000908152604090205481565b3480156105d557600080fd5b5061036c6105e4366004612275565b61104d565b3480156105f557600080fd5b5061036c61107c565b34801561060a57600080fd5b506103d0610619366004612275565b6110d4565b34801561062a57600080fd5b506103836110df565b34801561063f57600080fd5b506103fe61064e3660046122ba565b61116d565b34801561065f57600080fd5b5061036c6111bc565b34801561067457600080fd5b506103fe60155481565b34801561068a57600080fd5b506103fe60115481565b3480156106a057600080fd5b5061036c6106af366004612275565b6111f2565b3480156106c057600080fd5b506103d06106cf366004612275565b611221565b3480156106e057600080fd5b506000546001600160a01b03166103d0565b3480156106fe57600080fd5b50610383611251565b34801561071357600080fd5b506103fe6107223660046122ba565b6001600160a01b03166000908152600c602052604090205490565b34801561074957600080fd5b506103fe60165481565b61036c610761366004612275565b611260565b34801561077257600080fd5b5061036c6107813660046123f4565b611471565b34801561079257600080fd5b5061036c6107a136600461244b565b6114a7565b3480156107b257600080fd5b506103fe6107c1366004612275565b61153c565b3480156107d257600080fd5b506103fe6107e13660046122ba565b611561565b3480156107f257600080fd5b5061036c610801366004612275565b6115a9565b34801561081257600080fd5b5061036c610821366004612479565b6115d8565b34801561083257600080fd5b506103fe61084136600461233a565b611622565b34801561085257600080fd5b5061036c610861366004612275565b6116ed565b34801561087257600080fd5b50610383610881366004612275565b61176d565b34801561089257600080fd5b5061036c6108a136600461228e565b6117f6565b3480156108b257600080fd5b506103fe6108c13660046122ba565b6001600160a01b03166000908152600b602052604090205490565b3480156108e857600080fd5b506103fe6108f73660046122ba565b6001600160a01b03166000908152600e602052604090205490565b34801561091e57600080fd5b5061036c61092d366004612275565b611883565b34801561093e57600080fd5b50600a546103fe565b34801561095357600080fd5b5061033761096236600461233a565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561099c57600080fd5b5061036c6109ab3660046122ba565b6118b2565b60006301ffc9a760e01b6001600160e01b0319831614806109e157506380ac58cd60e01b6001600160e01b03198316145b806109fc575063152a902d60e11b6001600160e01b03198316145b80610a175750635b5e139f60e01b6001600160e01b03198316145b92915050565b6000546001600160a01b03163314610a475760405162461bcd60e51b8152600401610309906124f9565b6001600160601b03166001600160a01b03909116600160601b026bffffffffffffffffffffffff191617601955565b606060038054610a859061252e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab19061252e565b8015610afe5780601f10610ad357610100808354040283529160200191610afe565b820191906000526020600020905b815481529060010190602001808311610ae157829003601f168201915b5050505050905090565b6000546001600160a01b03163314610b325760405162461bcd60e51b8152600401610309906124f9565b601555565b6000610b428261194a565b610b5f576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610b86826110d4565b9050336001600160a01b03821614610bbf57610ba28133610962565b610bbf576040516367d9dca160e11b815260040160405180910390fd5b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600080601354610c29610c3e565b11610c3657505060155490565b505060165490565b600254600154036000190190565b6001600160a01b0381166000908152600b6020526040902054610c815760405162461bcd60e51b815260040161030990612568565b6000610c8c82611561565b905080600003610cae5760405162461bcd60e51b8152600401610309906125ae565b6001600160a01b0382166000908152600c602052604081208054839290610cd690849061260f565b9250508190555080600a6000828254610cef919061260f565b90915550610cff9050828261197f565b604080516001600160a01b0384168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a15050565b6000610d5082611a98565b9050836001600160a01b0316816001600160a01b031614610d835760405162a1148160e81b815260040160405180910390fd5b60008281526007602052604090208054338082146001600160a01b03881690911417610dd057610db38633610962565b610dd057604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610df757604051633a954ecd60e21b815260040160405180910390fd5b8015610e0257600082555b6001600160a01b038681166000908152600660205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260056020526040812091909155600160e11b84169003610e9457600184016000818152600560205260408120549003610e92576001548114610e925760008181526005602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6019546000908190600160601b90046001600160a01b0316610eff8461153c565b915091509250929050565b610f25838383604051806020016040528060008152506115d8565b505050565b6001600160a01b0381166000908152600b6020526040902054610f5f5760405162461bcd60e51b815260040161030990612568565b6000610f6b8383611622565b905080600003610f8d5760405162461bcd60e51b8152600401610309906125ae565b6001600160a01b038084166000908152600f6020908152604080832093861683529290529081208054839290610fc490849061260f565b90915550506001600160a01b0383166000908152600e602052604081208054839290610ff190849061260f565b909155506110029050838383611b07565b604080516001600160a01b038481168252602082018490528516917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a2505050565b6000546001600160a01b031633146110775760405162461bcd60e51b8152600401610309906124f9565b601155565b6000546001600160a01b031633146110a65760405162461bcd60e51b8152600401610309906124f9565b60005b6018548110156110d1576110bf61048782611221565b806110c981612622565b9150506110a9565b50565b6000610a1782611a98565b601080546110ec9061252e565b80601f01602080910402602001604051908101604052809291908181526020018280546111189061252e565b80156111655780601f1061113a57610100808354040283529160200191611165565b820191906000526020600020905b81548152906001019060200180831161114857829003601f168201915b505050505081565b60006001600160a01b038216611196576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b6000546001600160a01b031633146111e65760405162461bcd60e51b8152600401610309906124f9565b6111f06000611b59565b565b6000546001600160a01b0316331461121c5760405162461bcd60e51b8152600401610309906124f9565b601655565b6000600d82815481106112365761123661263b565b6000918252602090912001546001600160a01b031692915050565b606060048054610a859061252e565b3233146112af5760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610309565b6000601354826112bd610c3e565b6112c7919061260f565b116112d557506015546112da565b506016545b601154421161132b5760405162461bcd60e51b815260206004820152601c60248201527f5075626c69632073616c65206973206e6f7420616374697661746564000000006044820152606401610309565b60125482611337610c3e565b611341919061260f565b11156113855760405162461bcd60e51b815260206004820152601360248201527213585e081cdd5c1c1b1e48195e18d959591959606a1b6044820152606401610309565b601454336000908152601760205260409020546113a390849061260f565b11156113f15760405162461bcd60e51b815260206004820152601c60248201527f4d6178207065722077616c6c6574206c696d69742072656163686564000000006044820152606401610309565b6113fb8282612651565b34101561143e5760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f756768742066756e647360781b6044820152606401610309565b336000908152601760205260408120805484929061145d90849061260f565b9091555061146d90503383611ba9565b5050565b6000546001600160a01b0316331461149b5760405162461bcd60e51b8152600401610309906124f9565b601061146d82826126ae565b336001600160a01b038316036114d05760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6019546000906001600160601b031661155761271084612784565b610a179190612651565b60008061156d600a5490565b611577904761260f565b90506115a2838261159d866001600160a01b03166000908152600c602052604090205490565b611bc3565b9392505050565b6000546001600160a01b031633146115d35760405162461bcd60e51b8152600401610309906124f9565b601355565b6115e3848484610d45565b6001600160a01b0383163b1561161c576115ff84848484611c01565b61161c576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6001600160a01b0382166000908152600e602052604081205481906040516370a0823160e01b81523060048201526001600160a01b038616906370a0823190602401602060405180830381865afa158015611681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a59190612798565b6116af919061260f565b6001600160a01b038086166000908152600f60209081526040808320938816835292905220549091506116e59084908390611bc3565b949350505050565b6000546001600160a01b031633146117175760405162461bcd60e51b8152600401610309906124f9565b60125481106117685760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f7420696e63726561736520737570706c79210000000000000000006044820152606401610309565b601255565b60606117788261194a565b6117c45760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152606401610309565b60106117cf83611cec565b6040516020016117e09291906127b1565b6040516020818303038152906040529050919050565b6000546001600160a01b031633146118205760405162461bcd60e51b8152600401610309906124f9565b6012548161182c610c3e565b611836919061260f565b11156118795760405162461bcd60e51b815260206004820152601260248201527152656163686564206d617820537570706c7960701b6044820152606401610309565b61146d8282611ba9565b6000546001600160a01b031633146118ad5760405162461bcd60e51b8152600401610309906124f9565b601455565b6000546001600160a01b031633146118dc5760405162461bcd60e51b8152600401610309906124f9565b6001600160a01b0381166119415760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610309565b6110d181611b59565b60008160011115801561195e575060015482105b8015610a17575050600090815260056020526040902054600160e01b161590565b804710156119cf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610309565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611a1c576040519150601f19603f3d011682016040523d82523d6000602084013e611a21565b606091505b5050905080610f255760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610309565b60008180600111611aee57600154811015611aee5760008181526005602052604081205490600160e01b82169003611aec575b806000036115a2575060001901600081815260056020526040902054611acb565b505b604051636f96cda160e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610f25908490611ded565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61146d828260405180602001604052806000815250611ebf565b6009546001600160a01b0384166000908152600b602052604081205490918391611bed9086612651565b611bf79190612784565b6116e59190612848565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611c3690339089908890889060040161285b565b6020604051808303816000875af1925050508015611c71575060408051601f3d908101601f19168201909252611c6e91810190612898565b60015b611ccf573d808015611c9f576040519150601f19603f3d011682016040523d82523d6000602084013e611ca4565b606091505b508051600003611cc7576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b606081600003611d135750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611d3d5780611d2781612622565b9150611d369050600a83612784565b9150611d17565b60008167ffffffffffffffff811115611d5857611d58612368565b6040519080825280601f01601f191660200182016040528015611d82576020820181803683370190505b5090505b84156116e557611d97600183612848565b9150611da4600a866128b5565b611daf90603061260f565b60f81b818381518110611dc457611dc461263b565b60200101906001600160f81b031916908160001a905350611de6600a86612784565b9450611d86565b6000611e42826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611f2c9092919063ffffffff16565b805190915015610f255780806020019051810190611e6091906128c9565b610f255760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610309565b611ec98383611f3b565b6001600160a01b0383163b15610f25576001548281035b611ef36000868380600101945086611c01565b611f10576040516368d2bf6b60e11b815260040160405180910390fd5b818110611ee0578160015414611f2557600080fd5b5050505050565b60606116e5848460008561201b565b6001546001600160a01b038316611f6457604051622e076360e81b815260040160405180910390fd5b81600003611f855760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038316600081815260066020526040902080546801000000000000000185020190554260a01b6001841460e11b1717600082815260056020526040902055808281015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611fcf5760015550505050565b60608247101561207c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610309565b6001600160a01b0385163b6120d35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610309565b600080866001600160a01b031685876040516120ef91906128e6565b60006040518083038185875af1925050503d806000811461212c576040519150601f19603f3d011682016040523d82523d6000602084013e612131565b606091505b509150915061214182828661214c565b979650505050505050565b6060831561215b5750816115a2565b82511561216b5782518084602001fd5b8160405162461bcd60e51b81526004016103099190612262565b6001600160e01b0319811681146110d157600080fd5b6000602082840312156121ad57600080fd5b81356115a281612185565b6001600160a01b03811681146110d157600080fd5b600080604083850312156121e057600080fd5b82356121eb816121b8565b915060208301356001600160601b038116811461220757600080fd5b809150509250929050565b60005b8381101561222d578181015183820152602001612215565b50506000910152565b6000815180845261224e816020860160208601612212565b601f01601f19169290920160200192915050565b6020815260006115a26020830184612236565b60006020828403121561228757600080fd5b5035919050565b600080604083850312156122a157600080fd5b82356122ac816121b8565b946020939093013593505050565b6000602082840312156122cc57600080fd5b81356115a2816121b8565b6000806000606084860312156122ec57600080fd5b83356122f7816121b8565b92506020840135612307816121b8565b929592945050506040919091013590565b6000806040838503121561232b57600080fd5b50508035926020909101359150565b6000806040838503121561234d57600080fd5b8235612358816121b8565b91506020830135612207816121b8565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561239957612399612368565b604051601f8501601f19908116603f011681019082821181831017156123c1576123c1612368565b816040528093508581528686860111156123da57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561240657600080fd5b813567ffffffffffffffff81111561241d57600080fd5b8201601f8101841361242e57600080fd5b6116e58482356020840161237e565b80151581146110d157600080fd5b6000806040838503121561245e57600080fd5b8235612469816121b8565b915060208301356122078161243d565b6000806000806080858703121561248f57600080fd5b843561249a816121b8565b935060208501356124aa816121b8565b925060408501359150606085013567ffffffffffffffff8111156124cd57600080fd5b8501601f810187136124de57600080fd5b6124ed8782356020840161237e565b91505092959194509250565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061254257607f821691505b60208210810361256257634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610a1757610a176125f9565b600060018201612634576126346125f9565b5060010190565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610a1757610a176125f9565b601f821115610f2557600081815260208120601f850160051c8101602086101561268f5750805b601f850160051c820191505b81811015610ed65782815560010161269b565b815167ffffffffffffffff8111156126c8576126c8612368565b6126dc816126d6845461252e565b84612668565b602080601f83116001811461271157600084156126f95750858301515b600019600386901b1c1916600185901b178555610ed6565b600085815260208120601f198616915b8281101561274057888601518255948401946001909101908401612721565b508582101561275e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601260045260246000fd5b6000826127935761279361276e565b500490565b6000602082840312156127aa57600080fd5b5051919050565b60008084546127bf8161252e565b600182811680156127d757600181146127ec5761281b565b60ff198416875282151583028701945061281b565b8860005260208060002060005b858110156128125781548a8201529084019082016127f9565b50505082870194505b50505050835161282f818360208801612212565b64173539b7b760d91b9101908152600501949350505050565b81810381811115610a1757610a176125f9565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061288e90830184612236565b9695505050505050565b6000602082840312156128aa57600080fd5b81516115a281612185565b6000826128c4576128c461276e565b500690565b6000602082840312156128db57600080fd5b81516115a28161243d565b600082516128f8818460208701612212565b919091019291505056fea26469706673582212209c819d1f83e73846552e03287a9552cc263741b9a3286bec136c1cf8d792f37764736f6c6343000812003300000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000004404d4f7f0b97e77c00ad8738a22f40fc2d90e47000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000010000000000000000000000004404d4f7f0b97e77c00ad8738a22f40fc2d90e47000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000043697066733a2f2f6261667962656963377a667167776e71666366726b6764376c34677a3361686768786635626770347074616a35747578333334667a6f33633470692f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102cd5760003560e01c8063734c66bd11610175578063a3f8eace116100dc578063cbce4c9711610095578063e268e4d31161006f578063e268e4d314610912578063e33b7de314610932578063e985e9c514610947578063f2fde38b1461099057600080fd5b8063cbce4c9714610886578063ce7c2ac2146108a6578063d79779b2146108dc57600080fd5b8063a3f8eace146107c6578063aac0d2f6146107e6578063b88d4fde14610806578063c45ac05014610826578063c715381614610846578063c87b56dd1461086657600080fd5b80639852595c1161012e5780639852595c146107075780639b6860c81461073d578063a0712d6814610753578063a0bcfc7f14610766578063a22cb46514610786578063a2e69613146107a657600080fd5b8063734c66bd1461066857806378e979251461067e578063791a2519146106945780638b83209b146106b45780638da5cb5b146106d457806395d89b41146106f257600080fd5b80632a55205a11610234578063499a4687116101ed5780636352211e116101c75780636352211e146105fe5780636c0360eb1461061e57806370a0823114610633578063715018a61461065357600080fd5b8063499a46871461059c578063525f8a5c146105c95780635be7fde8146105e957600080fd5b80632a55205a146104ac57806332cb6b0c146104eb5780633a98ef3914610501578063406072a91461051657806342842e0e1461055c57806348b750441461057c57600080fd5b8063095ea7b311610286578063095ea7b31461040c5780630f2cdd6c1461042c578063172e1e521461044257806318160ddd14610457578063191655871461046c57806323b872dd1461048c57600080fd5b806301ffc9a71461031757806302fa7c471461034c57806306fdde031461036e5780630805943914610390578063081812fc146103b057806308ab701c146103e857600080fd5b366103125760405162461bcd60e51b815260206004820152601060248201526f13db9b1e481a59881e5bdd481b5a5b9d60821b60448201526064015b60405180910390fd5b600080fd5b34801561032357600080fd5b5061033761033236600461219b565b6109b0565b60405190151581526020015b60405180910390f35b34801561035857600080fd5b5061036c6103673660046121cd565b610a1d565b005b34801561037a57600080fd5b50610383610a76565b6040516103439190612262565b34801561039c57600080fd5b5061036c6103ab366004612275565b610b08565b3480156103bc57600080fd5b506103d06103cb366004612275565b610b37565b6040516001600160a01b039091168152602001610343565b3480156103f457600080fd5b506103fe60135481565b604051908152602001610343565b34801561041857600080fd5b5061036c61042736600461228e565b610b7b565b34801561043857600080fd5b506103fe60145481565b34801561044e57600080fd5b506103fe610c1b565b34801561046357600080fd5b506103fe610c3e565b34801561047857600080fd5b5061036c6104873660046122ba565b610c4c565b34801561049857600080fd5b5061036c6104a73660046122d7565b610d45565b3480156104b857600080fd5b506104cc6104c7366004612318565b610ede565b604080516001600160a01b039093168352602083019190915201610343565b3480156104f757600080fd5b506103fe60125481565b34801561050d57600080fd5b506009546103fe565b34801561052257600080fd5b506103fe61053136600461233a565b6001600160a01b039182166000908152600f6020908152604080832093909416825291909152205490565b34801561056857600080fd5b5061036c6105773660046122d7565b610f0a565b34801561058857600080fd5b5061036c61059736600461233a565b610f2a565b3480156105a857600080fd5b506103fe6105b73660046122ba565b60176020526000908152604090205481565b3480156105d557600080fd5b5061036c6105e4366004612275565b61104d565b3480156105f557600080fd5b5061036c61107c565b34801561060a57600080fd5b506103d0610619366004612275565b6110d4565b34801561062a57600080fd5b506103836110df565b34801561063f57600080fd5b506103fe61064e3660046122ba565b61116d565b34801561065f57600080fd5b5061036c6111bc565b34801561067457600080fd5b506103fe60155481565b34801561068a57600080fd5b506103fe60115481565b3480156106a057600080fd5b5061036c6106af366004612275565b6111f2565b3480156106c057600080fd5b506103d06106cf366004612275565b611221565b3480156106e057600080fd5b506000546001600160a01b03166103d0565b3480156106fe57600080fd5b50610383611251565b34801561071357600080fd5b506103fe6107223660046122ba565b6001600160a01b03166000908152600c602052604090205490565b34801561074957600080fd5b506103fe60165481565b61036c610761366004612275565b611260565b34801561077257600080fd5b5061036c6107813660046123f4565b611471565b34801561079257600080fd5b5061036c6107a136600461244b565b6114a7565b3480156107b257600080fd5b506103fe6107c1366004612275565b61153c565b3480156107d257600080fd5b506103fe6107e13660046122ba565b611561565b3480156107f257600080fd5b5061036c610801366004612275565b6115a9565b34801561081257600080fd5b5061036c610821366004612479565b6115d8565b34801561083257600080fd5b506103fe61084136600461233a565b611622565b34801561085257600080fd5b5061036c610861366004612275565b6116ed565b34801561087257600080fd5b50610383610881366004612275565b61176d565b34801561089257600080fd5b5061036c6108a136600461228e565b6117f6565b3480156108b257600080fd5b506103fe6108c13660046122ba565b6001600160a01b03166000908152600b602052604090205490565b3480156108e857600080fd5b506103fe6108f73660046122ba565b6001600160a01b03166000908152600e602052604090205490565b34801561091e57600080fd5b5061036c61092d366004612275565b611883565b34801561093e57600080fd5b50600a546103fe565b34801561095357600080fd5b5061033761096236600461233a565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561099c57600080fd5b5061036c6109ab3660046122ba565b6118b2565b60006301ffc9a760e01b6001600160e01b0319831614806109e157506380ac58cd60e01b6001600160e01b03198316145b806109fc575063152a902d60e11b6001600160e01b03198316145b80610a175750635b5e139f60e01b6001600160e01b03198316145b92915050565b6000546001600160a01b03163314610a475760405162461bcd60e51b8152600401610309906124f9565b6001600160601b03166001600160a01b03909116600160601b026bffffffffffffffffffffffff191617601955565b606060038054610a859061252e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab19061252e565b8015610afe5780601f10610ad357610100808354040283529160200191610afe565b820191906000526020600020905b815481529060010190602001808311610ae157829003601f168201915b5050505050905090565b6000546001600160a01b03163314610b325760405162461bcd60e51b8152600401610309906124f9565b601555565b6000610b428261194a565b610b5f576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610b86826110d4565b9050336001600160a01b03821614610bbf57610ba28133610962565b610bbf576040516367d9dca160e11b815260040160405180910390fd5b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600080601354610c29610c3e565b11610c3657505060155490565b505060165490565b600254600154036000190190565b6001600160a01b0381166000908152600b6020526040902054610c815760405162461bcd60e51b815260040161030990612568565b6000610c8c82611561565b905080600003610cae5760405162461bcd60e51b8152600401610309906125ae565b6001600160a01b0382166000908152600c602052604081208054839290610cd690849061260f565b9250508190555080600a6000828254610cef919061260f565b90915550610cff9050828261197f565b604080516001600160a01b0384168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a15050565b6000610d5082611a98565b9050836001600160a01b0316816001600160a01b031614610d835760405162a1148160e81b815260040160405180910390fd5b60008281526007602052604090208054338082146001600160a01b03881690911417610dd057610db38633610962565b610dd057604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610df757604051633a954ecd60e21b815260040160405180910390fd5b8015610e0257600082555b6001600160a01b038681166000908152600660205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260056020526040812091909155600160e11b84169003610e9457600184016000818152600560205260408120549003610e92576001548114610e925760008181526005602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6019546000908190600160601b90046001600160a01b0316610eff8461153c565b915091509250929050565b610f25838383604051806020016040528060008152506115d8565b505050565b6001600160a01b0381166000908152600b6020526040902054610f5f5760405162461bcd60e51b815260040161030990612568565b6000610f6b8383611622565b905080600003610f8d5760405162461bcd60e51b8152600401610309906125ae565b6001600160a01b038084166000908152600f6020908152604080832093861683529290529081208054839290610fc490849061260f565b90915550506001600160a01b0383166000908152600e602052604081208054839290610ff190849061260f565b909155506110029050838383611b07565b604080516001600160a01b038481168252602082018490528516917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a2505050565b6000546001600160a01b031633146110775760405162461bcd60e51b8152600401610309906124f9565b601155565b6000546001600160a01b031633146110a65760405162461bcd60e51b8152600401610309906124f9565b60005b6018548110156110d1576110bf61048782611221565b806110c981612622565b9150506110a9565b50565b6000610a1782611a98565b601080546110ec9061252e565b80601f01602080910402602001604051908101604052809291908181526020018280546111189061252e565b80156111655780601f1061113a57610100808354040283529160200191611165565b820191906000526020600020905b81548152906001019060200180831161114857829003601f168201915b505050505081565b60006001600160a01b038216611196576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b6000546001600160a01b031633146111e65760405162461bcd60e51b8152600401610309906124f9565b6111f06000611b59565b565b6000546001600160a01b0316331461121c5760405162461bcd60e51b8152600401610309906124f9565b601655565b6000600d82815481106112365761123661263b565b6000918252602090912001546001600160a01b031692915050565b606060048054610a859061252e565b3233146112af5760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610309565b6000601354826112bd610c3e565b6112c7919061260f565b116112d557506015546112da565b506016545b601154421161132b5760405162461bcd60e51b815260206004820152601c60248201527f5075626c69632073616c65206973206e6f7420616374697661746564000000006044820152606401610309565b60125482611337610c3e565b611341919061260f565b11156113855760405162461bcd60e51b815260206004820152601360248201527213585e081cdd5c1c1b1e48195e18d959591959606a1b6044820152606401610309565b601454336000908152601760205260409020546113a390849061260f565b11156113f15760405162461bcd60e51b815260206004820152601c60248201527f4d6178207065722077616c6c6574206c696d69742072656163686564000000006044820152606401610309565b6113fb8282612651565b34101561143e5760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f756768742066756e647360781b6044820152606401610309565b336000908152601760205260408120805484929061145d90849061260f565b9091555061146d90503383611ba9565b5050565b6000546001600160a01b0316331461149b5760405162461bcd60e51b8152600401610309906124f9565b601061146d82826126ae565b336001600160a01b038316036114d05760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6019546000906001600160601b031661155761271084612784565b610a179190612651565b60008061156d600a5490565b611577904761260f565b90506115a2838261159d866001600160a01b03166000908152600c602052604090205490565b611bc3565b9392505050565b6000546001600160a01b031633146115d35760405162461bcd60e51b8152600401610309906124f9565b601355565b6115e3848484610d45565b6001600160a01b0383163b1561161c576115ff84848484611c01565b61161c576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6001600160a01b0382166000908152600e602052604081205481906040516370a0823160e01b81523060048201526001600160a01b038616906370a0823190602401602060405180830381865afa158015611681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a59190612798565b6116af919061260f565b6001600160a01b038086166000908152600f60209081526040808320938816835292905220549091506116e59084908390611bc3565b949350505050565b6000546001600160a01b031633146117175760405162461bcd60e51b8152600401610309906124f9565b60125481106117685760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f7420696e63726561736520737570706c79210000000000000000006044820152606401610309565b601255565b60606117788261194a565b6117c45760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152606401610309565b60106117cf83611cec565b6040516020016117e09291906127b1565b6040516020818303038152906040529050919050565b6000546001600160a01b031633146118205760405162461bcd60e51b8152600401610309906124f9565b6012548161182c610c3e565b611836919061260f565b11156118795760405162461bcd60e51b815260206004820152601260248201527152656163686564206d617820537570706c7960701b6044820152606401610309565b61146d8282611ba9565b6000546001600160a01b031633146118ad5760405162461bcd60e51b8152600401610309906124f9565b601455565b6000546001600160a01b031633146118dc5760405162461bcd60e51b8152600401610309906124f9565b6001600160a01b0381166119415760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610309565b6110d181611b59565b60008160011115801561195e575060015482105b8015610a17575050600090815260056020526040902054600160e01b161590565b804710156119cf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610309565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611a1c576040519150601f19603f3d011682016040523d82523d6000602084013e611a21565b606091505b5050905080610f255760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610309565b60008180600111611aee57600154811015611aee5760008181526005602052604081205490600160e01b82169003611aec575b806000036115a2575060001901600081815260056020526040902054611acb565b505b604051636f96cda160e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610f25908490611ded565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61146d828260405180602001604052806000815250611ebf565b6009546001600160a01b0384166000908152600b602052604081205490918391611bed9086612651565b611bf79190612784565b6116e59190612848565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611c3690339089908890889060040161285b565b6020604051808303816000875af1925050508015611c71575060408051601f3d908101601f19168201909252611c6e91810190612898565b60015b611ccf573d808015611c9f576040519150601f19603f3d011682016040523d82523d6000602084013e611ca4565b606091505b508051600003611cc7576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b606081600003611d135750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611d3d5780611d2781612622565b9150611d369050600a83612784565b9150611d17565b60008167ffffffffffffffff811115611d5857611d58612368565b6040519080825280601f01601f191660200182016040528015611d82576020820181803683370190505b5090505b84156116e557611d97600183612848565b9150611da4600a866128b5565b611daf90603061260f565b60f81b818381518110611dc457611dc461263b565b60200101906001600160f81b031916908160001a905350611de6600a86612784565b9450611d86565b6000611e42826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611f2c9092919063ffffffff16565b805190915015610f255780806020019051810190611e6091906128c9565b610f255760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610309565b611ec98383611f3b565b6001600160a01b0383163b15610f25576001548281035b611ef36000868380600101945086611c01565b611f10576040516368d2bf6b60e11b815260040160405180910390fd5b818110611ee0578160015414611f2557600080fd5b5050505050565b60606116e5848460008561201b565b6001546001600160a01b038316611f6457604051622e076360e81b815260040160405180910390fd5b81600003611f855760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038316600081815260066020526040902080546801000000000000000185020190554260a01b6001841460e11b1717600082815260056020526040902055808281015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611fcf5760015550505050565b60608247101561207c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610309565b6001600160a01b0385163b6120d35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610309565b600080866001600160a01b031685876040516120ef91906128e6565b60006040518083038185875af1925050503d806000811461212c576040519150601f19603f3d011682016040523d82523d6000602084013e612131565b606091505b509150915061214182828661214c565b979650505050505050565b6060831561215b5750816115a2565b82511561216b5782518084602001fd5b8160405162461bcd60e51b81526004016103099190612262565b6001600160e01b0319811681146110d157600080fd5b6000602082840312156121ad57600080fd5b81356115a281612185565b6001600160a01b03811681146110d157600080fd5b600080604083850312156121e057600080fd5b82356121eb816121b8565b915060208301356001600160601b038116811461220757600080fd5b809150509250929050565b60005b8381101561222d578181015183820152602001612215565b50506000910152565b6000815180845261224e816020860160208601612212565b601f01601f19169290920160200192915050565b6020815260006115a26020830184612236565b60006020828403121561228757600080fd5b5035919050565b600080604083850312156122a157600080fd5b82356122ac816121b8565b946020939093013593505050565b6000602082840312156122cc57600080fd5b81356115a2816121b8565b6000806000606084860312156122ec57600080fd5b83356122f7816121b8565b92506020840135612307816121b8565b929592945050506040919091013590565b6000806040838503121561232b57600080fd5b50508035926020909101359150565b6000806040838503121561234d57600080fd5b8235612358816121b8565b91506020830135612207816121b8565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561239957612399612368565b604051601f8501601f19908116603f011681019082821181831017156123c1576123c1612368565b816040528093508581528686860111156123da57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561240657600080fd5b813567ffffffffffffffff81111561241d57600080fd5b8201601f8101841361242e57600080fd5b6116e58482356020840161237e565b80151581146110d157600080fd5b6000806040838503121561245e57600080fd5b8235612469816121b8565b915060208301356122078161243d565b6000806000806080858703121561248f57600080fd5b843561249a816121b8565b935060208501356124aa816121b8565b925060408501359150606085013567ffffffffffffffff8111156124cd57600080fd5b8501601f810187136124de57600080fd5b6124ed8782356020840161237e565b91505092959194509250565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061254257607f821691505b60208210810361256257634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610a1757610a176125f9565b600060018201612634576126346125f9565b5060010190565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610a1757610a176125f9565b601f821115610f2557600081815260208120601f850160051c8101602086101561268f5750805b601f850160051c820191505b81811015610ed65782815560010161269b565b815167ffffffffffffffff8111156126c8576126c8612368565b6126dc816126d6845461252e565b84612668565b602080601f83116001811461271157600084156126f95750858301515b600019600386901b1c1916600185901b178555610ed6565b600085815260208120601f198616915b8281101561274057888601518255948401946001909101908401612721565b508582101561275e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601260045260246000fd5b6000826127935761279361276e565b500490565b6000602082840312156127aa57600080fd5b5051919050565b60008084546127bf8161252e565b600182811680156127d757600181146127ec5761281b565b60ff198416875282151583028701945061281b565b8860005260208060002060005b858110156128125781548a8201529084019082016127f9565b50505082870194505b50505050835161282f818360208801612212565b64173539b7b760d91b9101908152600501949350505050565b81810381811115610a1757610a176125f9565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061288e90830184612236565b9695505050505050565b6000602082840312156128aa57600080fd5b81516115a281612185565b6000826128c4576128c461276e565b500690565b6000602082840312156128db57600080fd5b81516115a28161243d565b600082516128f8818460208701612212565b919091019291505056fea26469706673582212209c819d1f83e73846552e03287a9552cc263741b9a3286bec136c1cf8d792f37764736f6c63430008120033

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

00000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000004404d4f7f0b97e77c00ad8738a22f40fc2d90e47000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000010000000000000000000000004404d4f7f0b97e77c00ad8738a22f40fc2d90e47000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000043697066733a2f2f6261667962656963377a667167776e71666366726b6764376c34677a3361686768786635626770347074616a35747578333334667a6f33633470692f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _royaltyFeesInBips (uint96): 750
Arg [1] : _team (address[]): 0x4404d4F7F0B97E77c00AD8738a22F40Fc2d90e47
Arg [2] : _teamShares (uint256[]): 100
Arg [3] : _royaltyReceiver (address): 0x4404d4F7F0B97E77c00AD8738a22F40Fc2d90e47
Arg [4] : _baseURI (string): ipfs://bafybeic7zfqgwnqfcfrkgd7l4gz3ahghxf5bgp4ptaj5tux334fzo3c4pi/

-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000002ee
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000004404d4f7f0b97e77c00ad8738a22f40fc2d90e47
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [6] : 0000000000000000000000004404d4f7f0b97e77c00ad8738a22f40fc2d90e47
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [10] : 697066733a2f2f6261667962656963377a667167776e71666366726b6764376c
Arg [11] : 34677a3361686768786635626770347074616a35747578333334667a6f336334
Arg [12] : 70692f0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

77312:4228:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81501:26;;-1:-1:-1;;;81501:26:0;;216:2:1;81501:26:0;;;198:21:1;255:2;235:18;;;228:30;-1:-1:-1;;;274:18:1;;;267:46;330:18;;81501:26:0;;;;;;;;77312:4228;;;;14586:678;;;;;;;;;;-1:-1:-1;14586:678:0;;;;;:::i;:::-;;:::i;:::-;;;910:14:1;;903:22;885:41;;873:2;858:18;14586:678:0;;;;;;;;81086:183;;;;;;;;;;-1:-1:-1;81086:183:0;;;;;:::i;:::-;;:::i;:::-;;20296:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;79965:107::-;;;;;;;;;;-1:-1:-1;79965:107:0;;;;;:::i;:::-;;:::i;22248:204::-;;;;;;;;;;-1:-1:-1;22248:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2618:32:1;;;2600:51;;2588:2;2573:18;22248:204:0;2454:203:1;77531:32:0;;;;;;;;;;;;;;;;;;;2808:25:1;;;2796:2;2781:18;77531:32:0;2662:177:1;21790:392:0;;;;;;;;;;-1:-1:-1;21790:392:0;;;;;:::i;:::-;;:::i;77574:34::-;;;;;;;;;;;;;;;;78389:251;;;;;;;;;;;;;:::i;13640:315::-;;;;;;;;;;;;;:::i;72366:453::-;;;;;;;;;;-1:-1:-1;72366:453:0;;;;;:::i;:::-;;:::i;31517:2800::-;;;;;;;;;;-1:-1:-1;31517:2800:0;;;;;:::i;:::-;;:::i;80688:242::-;;;;;;;;;;-1:-1:-1;80688:242:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4330:32:1;;;4312:51;;4394:2;4379:18;;4372:34;;;;4285:18;80688:242:0;4138:274:1;77493:31:0;;;;;;;;;;;;;;;;69976:91;;;;;;;;;;-1:-1:-1;70047:12:0;;69976:91;;71105:135;;;;;;;;;;-1:-1:-1;71105:135:0;;;;;:::i;:::-;-1:-1:-1;;;;;71202:21:0;;;71175:7;71202:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;71105:135;23142:185;;;;;;;;;;-1:-1:-1;23142:185:0;;;;;:::i;:::-;;:::i;73087:514::-;;;;;;;;;;-1:-1:-1;73087:514:0;;;;;:::i;:::-;;:::i;77710:51::-;;;;;;;;;;-1:-1:-1;77710:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;80319:106;;;;;;;;;;-1:-1:-1;80319:106:0;;;;;:::i;:::-;;:::i;81295:151::-;;;;;;;;;;;;;:::i;20085:144::-;;;;;;;;;;-1:-1:-1;20085:144:0;;;;;:::i;:::-;;:::i;77417:21::-;;;;;;;;;;;;;:::i;15328:224::-;;;;;;;;;;-1:-1:-1;15328:224:0;;;;;:::i;:::-;;:::i;76412:103::-;;;;;;;;;;;;;:::i;77619:36::-;;;;;;;;;;;;;;;;77447:37;;;;;;;;;;;;;;;;80080:123;;;;;;;;;;-1:-1:-1;80080:123:0;;;;;:::i;:::-;;:::i;71331:100::-;;;;;;;;;;-1:-1:-1;71331:100:0;;;;;:::i;:::-;;:::i;75761:87::-;;;;;;;;;;-1:-1:-1;75807:7:0;75834:6;-1:-1:-1;;;;;75834:6:0;75761:87;;20465:104;;;;;;;;;;;;;:::i;70827:109::-;;;;;;;;;;-1:-1:-1;70827:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;70910:18:0;70883:7;70910:18;;;:9;:18;;;;;;;70827:109;77662:39;;;;;;;;;;;;;;;;78648:692;;;;;;:::i;:::-;;:::i;80211:100::-;;;;;;;;;;-1:-1:-1;80211:100:0;;;;;:::i;:::-;;:::i;22524:306::-;;;;;;;;;;-1:-1:-1;22524:306:0;;;;;:::i;:::-;;:::i;80938:140::-;;;;;;;;;;-1:-1:-1;80938:140:0;;;;;:::i;:::-;;:::i;71521:225::-;;;;;;;;;;-1:-1:-1;71521:225:0;;;;;:::i;:::-;;:::i;79723:109::-;;;;;;;;;;-1:-1:-1;79723:109:0;;;;;:::i;:::-;;:::i;23398:399::-;;;;;;;;;;-1:-1:-1;23398:399:0;;;;;:::i;:::-;;:::i;71906:260::-;;;;;;;;;;-1:-1:-1;71906:260:0;;;;;:::i;:::-;;:::i;79543:172::-;;;;;;;;;;-1:-1:-1;79543:172:0;;;;;:::i;:::-;;:::i;80433:247::-;;;;;;;;;;-1:-1:-1;80433:247:0;;;;;:::i;:::-;;:::i;79348:187::-;;;;;;;;;;-1:-1:-1;79348:187:0;;;;;:::i;:::-;;:::i;70623:105::-;;;;;;;;;;-1:-1:-1;70623:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;70704:16:0;70677:7;70704:16;;;:7;:16;;;;;;;70623:105;70413:119;;;;;;;;;;-1:-1:-1;70413:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;70498:26:0;70471:7;70498:26;;;:19;:26;;;;;;;70413:119;79840:117;;;;;;;;;;-1:-1:-1;79840:117:0;;;;;:::i;:::-;;:::i;70161:95::-;;;;;;;;;;-1:-1:-1;70234:14:0;;70161:95;;22907:164;;;;;;;;;;-1:-1:-1;22907:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;23028:25:0;;;23004:4;23028:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;22907:164;76670:201;;;;;;;;;;-1:-1:-1;76670:201:0;;;;;:::i;:::-;;:::i;14586:678::-;14671:4;-1:-1:-1;;;;;;;;;14971:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;15048:25:0;;;14971:102;:179;;;-1:-1:-1;;;;;;;;;;15125:25:0;;;14971:179;:242;;;-1:-1:-1;;;;;;;;;;15188:25:0;;;14971:242;14951:262;14586:678;-1:-1:-1;;14586:678:0:o;81086:183::-;75807:7;75834:6;-1:-1:-1;;;;;75834:6:0;66346:10;75981:23;75973:68;;;;-1:-1:-1;;;75973:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;81223:38:0::1;-1:-1:-1::0;;;;;81185:27:0;;::::1;-1:-1:-1::0;;;81185:27:0::1;-1:-1:-1::0;;81223:38:0;::::1;81185:15;81223:38:::0;81086:183::o;20296:100::-;20350:13;20383:5;20376:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20296:100;:::o;79965:107::-;75807:7;75834:6;-1:-1:-1;;;;;75834:6:0;66346:10;75981:23;75973:68;;;;-1:-1:-1;;;75973:68:0;;;;;;;:::i;:::-;80038:11:::1;:26:::0;79965:107::o;22248:204::-;22316:7;22341:16;22349:7;22341;:16::i;:::-;22336:64;;22366:34;;-1:-1:-1;;;22366:34:0;;;;;;;;;;;22336:64;-1:-1:-1;22420:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;22420:24:0;;22248:204::o;21790:392::-;21871:13;21887:16;21895:7;21887;:16::i;:::-;21871:32;-1:-1:-1;66346:10:0;-1:-1:-1;;;;;21918:28:0;;;21914:175;;21966:44;21983:5;66346:10;22907:164;:::i;21966:44::-;21961:128;;22038:35;;-1:-1:-1;;;22038:35:0;;;;;;;;;;;21961:128;22101:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;22101:29:0;-1:-1:-1;;;;;22101:29:0;;;;;;;;;22146:28;;22101:24;;22146:28;;;;;;;21860:322;21790:392;;:::o;78389:251::-;78432:7;78451:13;78495:12;;78478:13;:11;:13::i;:::-;:29;78475:135;;-1:-1:-1;;78531:11:0;;;78389:251::o;78475:135::-;-1:-1:-1;;78583:15:0;;;78389:251::o;13640:315::-;13906:12;;13247:1;13890:13;:28;-1:-1:-1;;13890:46:0;;13640:315::o;72366:453::-;-1:-1:-1;;;;;72442:16:0;;72461:1;72442:16;;;:7;:16;;;;;;72434:71;;;;-1:-1:-1;;;72434:71:0;;;;;;;:::i;:::-;72518:15;72536:19;72547:7;72536:10;:19::i;:::-;72518:37;;72576:7;72587:1;72576:12;72568:68;;;;-1:-1:-1;;;72568:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;72649:18:0;;;;;;:9;:18;;;;;:29;;72671:7;;72649:18;:29;;72671:7;;72649:29;:::i;:::-;;;;;;;;72707:7;72689:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;72727:35:0;;-1:-1:-1;72745:7:0;72754;72727:17;:35::i;:::-;72778:33;;;-1:-1:-1;;;;;4330:32:1;;4312:51;;4394:2;4379:18;;4372:34;;;72778:33:0;;4285:18:1;72778:33:0;;;;;;;72423:396;72366:453;:::o;31517:2800::-;31651:27;31681;31700:7;31681:18;:27::i;:::-;31651:57;;31766:4;-1:-1:-1;;;;;31725:45:0;31741:19;-1:-1:-1;;;;;31725:45:0;;31721:86;;31779:28;;-1:-1:-1;;;31779:28:0;;;;;;;;;;;31721:86;31821:27;30247:21;;;30074:15;30289:4;30282:36;30371:4;30355:21;;30461:26;;66346:10;31214:30;;;-1:-1:-1;;;;;30912:26:0;;31193:19;;;31190:55;32000:174;;32087:43;32104:4;66346:10;22907:164;:::i;32087:43::-;32082:92;;32139:35;;-1:-1:-1;;;32139:35:0;;;;;;;;;;;32082:92;-1:-1:-1;;;;;32191:16:0;;32187:52;;32216:23;;-1:-1:-1;;;32216:23:0;;;;;;;;;;;32187:52;32388:15;32385:160;;;32528:1;32507:19;32500:30;32385:160;-1:-1:-1;;;;;32923:24:0;;;;;;;:18;:24;;;;;;32921:26;;-1:-1:-1;;32921:26:0;;;32992:22;;;;;;;;;32990:24;;-1:-1:-1;32990:24:0;;;19984:11;19960:22;19956:40;19943:62;-1:-1:-1;;;19943:62:0;33285:26;;;;:17;:26;;;;;:174;;;;-1:-1:-1;;;33579:46:0;;:51;;33575:626;;33683:1;33673:11;;33651:19;33806:30;;;:17;:30;;;;;;:35;;33802:384;;33944:13;;33929:11;:28;33925:242;;34091:30;;;;:17;:30;;;;;:52;;;33925:242;33632:569;33575:626;34248:7;34244:2;-1:-1:-1;;;;;34229:27:0;34238:4;-1:-1:-1;;;;;34229:27:0;;;;;;;;;;;34267:42;31640:2677;;;31517:2800;;;:::o;80688:242::-;80875:15;;80799:16;;;;-1:-1:-1;;;80875:15:0;;-1:-1:-1;;;;;80875:15:0;80892:28;80909:10;80892:16;:28::i;:::-;80867:54;;;;80688:242;;;;;:::o;23142:185::-;23280:39;23297:4;23303:2;23307:7;23280:39;;;;;;;;;;;;:16;:39::i;:::-;23142:185;;;:::o;73087:514::-;-1:-1:-1;;;;;73169:16:0;;73188:1;73169:16;;;:7;:16;;;;;;73161:71;;;;-1:-1:-1;;;73161:71:0;;;;;;;:::i;:::-;73245:15;73263:26;73274:5;73281:7;73263:10;:26::i;:::-;73245:44;;73310:7;73321:1;73310:12;73302:68;;;;-1:-1:-1;;;73302:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;73383:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;73417:7;;73383:21;:41;;73417:7;;73383:41;:::i;:::-;;;;-1:-1:-1;;;;;;;73435:26:0;;;;;;:19;:26;;;;;:37;;73465:7;;73435:26;:37;;73465:7;;73435:37;:::i;:::-;;;;-1:-1:-1;73485:47:0;;-1:-1:-1;73508:5:0;73515:7;73524;73485:22;:47::i;:::-;73548:45;;;-1:-1:-1;;;;;4330:32:1;;;4312:51;;4394:2;4379:18;;4372:34;;;73548:45:0;;;;;4285:18:1;73548:45:0;;;;;;;73150:451;73087:514;;:::o;80319:106::-;75807:7;75834:6;-1:-1:-1;;;;;75834:6:0;66346:10;75981:23;75973:68;;;;-1:-1:-1;;;75973:68:0;;;;;;;:::i;:::-;80395:9:::1;:22:::0;80319:106::o;81295:151::-;75807:7;75834:6;-1:-1:-1;;;;;75834:6:0;66346:10;75981:23;75973:68;;;;-1:-1:-1;;;75973:68:0;;;;;;;:::i;:::-;81351:6:::1;81347:92;81368:10;;81364:1;:14;81347:92;;;81401:26;81417:8;81423:1;81417:5;:8::i;81401:26::-;81381:3:::0;::::1;::::0;::::1;:::i;:::-;;;;81347:92;;;;81295:151::o:0;20085:144::-;20149:7;20192:27;20211:7;20192:18;:27::i;77417:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15328:224::-;15392:7;-1:-1:-1;;;;;15416:19:0;;15412:60;;15444:28;;-1:-1:-1;;;15444:28:0;;;;;;;;;;;15412:60;-1:-1:-1;;;;;;15490:25:0;;;;;:18;:25;;;;;;9820:13;15490:54;;15328:224::o;76412:103::-;75807:7;75834:6;-1:-1:-1;;;;;75834:6:0;66346:10;75981:23;75973:68;;;;-1:-1:-1;;;75973:68:0;;;;;;;:::i;:::-;76477:30:::1;76504:1;76477:18;:30::i;:::-;76412:103::o:0;80080:123::-;75807:7;75834:6;-1:-1:-1;;;;;75834:6:0;66346:10;75981:23;75973:68;;;;-1:-1:-1;;;75973:68:0;;;;;;;:::i;:::-;80161:15:::1;:34:::0;80080:123::o;71331:100::-;71382:7;71409;71417:5;71409:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;71409:14:0;;71331:100;-1:-1:-1;;71331:100:0:o;20465:104::-;20521:13;20554:7;20547:14;;;;;:::i;78648:692::-;78303:9;78316:10;78303:23;78295:66;;;;-1:-1:-1;;;78295:66:0;;10860:2:1;78295:66:0;;;10842:21:1;10899:2;10879:18;;;10872:30;10938:32;10918:18;;;10911:60;10988:18;;78295:66:0;10658:354:1;78295:66:0;78719:13:::1;78775:12;;78762:9;78746:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:41;78743:147;;-1:-1:-1::0;78811:11:0::1;::::0;78743:147:::1;;;-1:-1:-1::0;78863:15:0::1;::::0;78743:147:::1;78926:9;;78908:15;:27;78900:68;;;::::0;-1:-1:-1;;;78900:68:0;;11219:2:1;78900:68:0::1;::::0;::::1;11201:21:1::0;11258:2;11238:18;;;11231:30;11297;11277:18;;;11270:58;11345:18;;78900:68:0::1;11017:352:1::0;78900:68:0::1;79016:10;;79003:9;78987:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;78979:71;;;::::0;-1:-1:-1;;;78979:71:0;;11576:2:1;78979:71:0::1;::::0;::::1;11558:21:1::0;11615:2;11595:18;;;11588:30;-1:-1:-1;;;11634:18:1;;;11627:49;11693:18;;78979:71:0::1;11374:343:1::0;78979:71:0::1;79116:14;::::0;79089:10:::1;79069:31;::::0;;;:19:::1;:31;::::0;;;;;:43:::1;::::0;79103:9;;79069:43:::1;:::i;:::-;:61;;79061:102;;;::::0;-1:-1:-1;;;79061:102:0;;11924:2:1;79061:102:0::1;::::0;::::1;11906:21:1::0;11963:2;11943:18;;;11936:30;12002;11982:18;;;11975:58;12050:18;;79061:102:0::1;11722:352:1::0;79061:102:0::1;79195:17;79203:9:::0;79195:5;:17:::1;:::i;:::-;79182:9;:30;;79174:60;;;::::0;-1:-1:-1;;;79174:60:0;;12454:2:1;79174:60:0::1;::::0;::::1;12436:21:1::0;12493:2;12473:18;;;12466:30;-1:-1:-1;;;12512:18:1;;;12505:47;12569:18;;79174:60:0::1;12252:341:1::0;79174:60:0::1;79265:10;79245:31;::::0;;;:19:::1;:31;::::0;;;;:44;;79280:9;;79245:31;:44:::1;::::0;79280:9;;79245:44:::1;:::i;:::-;::::0;;;-1:-1:-1;79300:32:0::1;::::0;-1:-1:-1;79310:10:0::1;79322:9:::0;79300::::1;:32::i;:::-;78708:632;78648:692:::0;:::o;80211:100::-;75807:7;75834:6;-1:-1:-1;;;;;75834:6:0;66346:10;75981:23;75973:68;;;;-1:-1:-1;;;75973:68:0;;;;;;;:::i;:::-;80285:7:::1;:18;80295:8:::0;80285:7;:18:::1;:::i;22524:306::-:0;66346:10;-1:-1:-1;;;;;22623:31:0;;;22619:61;;22663:17;;-1:-1:-1;;;22663:17:0;;;;;;;;;;;22619:61;66346:10;22691:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;22691:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;22691:60:0;;;;;;;;;;22767:55;;885:41:1;;;22691:49:0;;66346:10;22767:55;;858:18:1;22767:55:0;;;;;;;22524:306;;:::o;80938:140::-;81053:17;;81005:7;;-1:-1:-1;;;;;81053:17:0;81031:18;81044:5;81031:10;:18;:::i;:::-;81030:40;;;;:::i;71521:225::-;71579:7;71599:21;71647:15;70234:14;;;70161:95;71647:15;71623:39;;:21;:39;:::i;:::-;71599:63;;71680:58;71696:7;71705:13;71720:17;71729:7;-1:-1:-1;;;;;70910:18:0;70883:7;70910:18;;;:9;:18;;;;;;;70827:109;71720:17;71680:15;:58::i;:::-;71673:65;71521:225;-1:-1:-1;;;71521:225:0:o;79723:109::-;75807:7;75834:6;-1:-1:-1;;;;;75834:6:0;66346:10;75981:23;75973:68;;;;-1:-1:-1;;;75973:68:0;;;;;;;:::i;:::-;79796:12:::1;:28:::0;79723:109::o;23398:399::-;23565:31;23578:4;23584:2;23588:7;23565:12;:31::i;:::-;-1:-1:-1;;;;;23611:14:0;;;:19;23607:183;;23650:56;23681:4;23687:2;23691:7;23700:5;23650:30;:56::i;:::-;23645:145;;23734:40;;-1:-1:-1;;;23734:40:0;;;;;;;;;;;23645:145;23398:399;;;;:::o;71906:260::-;-1:-1:-1;;;;;70498:26:0;;71978:7;70498:26;;;:19;:26;;;;;;71978:7;;72022:30;;-1:-1:-1;;;72022:30:0;;72046:4;72022:30;;;2600:51:1;-1:-1:-1;;;;;72022:15:0;;;;;2573:18:1;;72022:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;-1:-1:-1;;;;;71202:21:0;;;71175:7;71202:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;71998:77;;-1:-1:-1;72093:65:0;;72109:7;;71998:77;;71680:15;:58::i;72093:65::-;72086:72;71906:260;-1:-1:-1;;;;71906:260:0:o;79543:172::-;75807:7;75834:6;-1:-1:-1;;;;;75834:6:0;66346:10;75981:23;75973:68;;;;-1:-1:-1;;;75973:68:0;;;;;;;:::i;:::-;79634:10:::1;;79620:11;:24;79612:60;;;::::0;-1:-1:-1;;;79612:60:0;;15450:2:1;79612:60:0::1;::::0;::::1;15432:21:1::0;15489:2;15469:18;;;15462:30;15528:25;15508:18;;;15501:53;15571:18;;79612:60:0::1;15248:347:1::0;79612:60:0::1;79683:10;:24:::0;79543:172::o;80433:247::-;80504:13;80538:17;80546:8;80538:7;:17::i;:::-;80530:61;;;;-1:-1:-1;;;80530:61:0;;15802:2:1;80530:61:0;;;15784:21:1;15841:2;15821:18;;;15814:30;15880:33;15860:18;;;15853:61;15931:18;;80530:61:0;15600:355:1;80530:61:0;80633:7;80642:19;:8;:17;:19::i;:::-;80616:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;80602:70;;80433:247;;;:::o;79348:187::-;75807:7;75834:6;-1:-1:-1;;;;;75834:6:0;66346:10;75981:23;75973:68;;;;-1:-1:-1;;;75973:68:0;;;;;;;:::i;:::-;79458:10:::1;;79445:9;79429:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;79421:70;;;::::0;-1:-1:-1;;;79421:70:0;;17354:2:1;79421:70:0::1;::::0;::::1;17336:21:1::0;17393:2;17373:18;;;17366:30;-1:-1:-1;;;17412:18:1;;;17405:48;17470:18;;79421:70:0::1;17152:342:1::0;79421:70:0::1;79502:25;79512:3;79517:9;79502;:25::i;79840:117::-:0;75807:7;75834:6;-1:-1:-1;;;;;75834:6:0;66346:10;75981:23;75973:68;;;;-1:-1:-1;;;75973:68:0;;;;;;;:::i;:::-;79917:14:::1;:32:::0;79840:117::o;76670:201::-;75807:7;75834:6;-1:-1:-1;;;;;75834:6:0;66346:10;75981:23;75973:68;;;;-1:-1:-1;;;75973:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;76759:22:0;::::1;76751:73;;;::::0;-1:-1:-1;;;76751:73:0;;17701:2:1;76751:73:0::1;::::0;::::1;17683:21:1::0;17740:2;17720:18;;;17713:30;17779:34;17759:18;;;17752:62;-1:-1:-1;;;17830:18:1;;;17823:36;17876:19;;76751:73:0::1;17499:402:1::0;76751:73:0::1;76835:28;76854:8;76835:18;:28::i;24052:273::-:0;24109:4;24165:7;13247:1;24146:26;;:66;;;;;24199:13;;24189:7;:23;24146:66;:152;;;;-1:-1:-1;;24250:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;24250:43:0;:48;;24052:273::o;49780:317::-;49895:6;49870:21;:31;;49862:73;;;;-1:-1:-1;;;49862:73:0;;18108:2:1;49862:73:0;;;18090:21:1;18147:2;18127:18;;;18120:30;18186:31;18166:18;;;18159:59;18235:18;;49862:73:0;17906:353:1;49862:73:0;49949:12;49967:9;-1:-1:-1;;;;;49967:14:0;49989:6;49967:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49948:52;;;50019:7;50011:78;;;;-1:-1:-1;;;50011:78:0;;18676:2:1;50011:78:0;;;18658:21:1;18715:2;18695:18;;;18688:30;18754:34;18734:18;;;18727:62;18825:28;18805:18;;;18798:56;18871:19;;50011:78:0;18474:422:1;17002:1129:0;17069:7;17104;;13247:1;17153:23;17149:915;;17206:13;;17199:4;:20;17195:869;;;17244:14;17261:23;;;:17;:23;;;;;;;-1:-1:-1;;;17350:23:0;;:28;;17346:699;;17869:113;17876:6;17886:1;17876:11;17869:113;;-1:-1:-1;;;17947:6:0;17929:25;;;;:17;:25;;;;;;17869:113;;17346:699;17221:843;17195:869;18092:31;;-1:-1:-1;;;18092:31:0;;;;;;;;;;;61797:211;61941:58;;;-1:-1:-1;;;;;4330:32:1;;61941:58:0;;;4312:51:1;4379:18;;;;4372:34;;;61941:58:0;;;;;;;;;;4285:18:1;;;;61941:58:0;;;;;;;;-1:-1:-1;;;;;61941:58:0;-1:-1:-1;;;61941:58:0;;;61914:86;;61934:5;;61914:19;:86::i;77031:191::-;77105:16;77124:6;;-1:-1:-1;;;;;77141:17:0;;;-1:-1:-1;;;;;;77141:17:0;;;;;;77174:40;;77124:6;;;;;;;77174:40;;77105:16;77174:40;77094:128;77031:191;:::o;24409:104::-;24478:27;24488:2;24492:8;24478:27;;;;;;;;;;;;:9;:27::i;73779:248::-;73989:12;;-1:-1:-1;;;;;73969:16:0;;73925:7;73969:16;;;:7;:16;;;;;;73925:7;;74004:15;;73953:32;;:13;:32;:::i;:::-;73952:49;;;;:::i;:::-;:67;;;;:::i;38268:716::-;38452:88;;-1:-1:-1;;;38452:88:0;;38431:4;;-1:-1:-1;;;;;38452:45:0;;;;;:88;;66346:10;;38519:4;;38525:7;;38534:5;;38452:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38452:88:0;;;;;;;;-1:-1:-1;;38452:88:0;;;;;;;;;;;;:::i;:::-;;;38448:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38735:6;:13;38752:1;38735:18;38731:235;;38781:40;;-1:-1:-1;;;38781:40:0;;;;;;;;;;;38731:235;38924:6;38918:13;38909:6;38905:2;38901:15;38894:38;38448:529;-1:-1:-1;;;;;;38611:64:0;-1:-1:-1;;;38611:64:0;;-1:-1:-1;38268:716:0;;;;;;:::o;45219:723::-;45275:13;45496:5;45505:1;45496:10;45492:53;;-1:-1:-1;;45523:10:0;;;;;;;;;;;;-1:-1:-1;;;45523:10:0;;;;;45219:723::o;45492:53::-;45570:5;45555:12;45611:78;45618:9;;45611:78;;45644:8;;;;:::i;:::-;;-1:-1:-1;45667:10:0;;-1:-1:-1;45675:2:0;45667:10;;:::i;:::-;;;45611:78;;;45699:19;45731:6;45721:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45721:17:0;;45699:39;;45749:154;45756:10;;45749:154;;45783:11;45793:1;45783:11;;:::i;:::-;;-1:-1:-1;45852:10:0;45860:2;45852:5;:10;:::i;:::-;45839:24;;:2;:24;:::i;:::-;45826:39;;45809:6;45816;45809:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;45809:56:0;;;;;;;;-1:-1:-1;45880:11:0;45889:2;45880:11;;:::i;:::-;;;45749:154;;64864:716;65288:23;65314:69;65342:4;65314:69;;;;;;;;;;;;;;;;;65322:5;-1:-1:-1;;;;;65314:27:0;;;:69;;;;;:::i;:::-;65398:17;;65288:95;;-1:-1:-1;65398:21:0;65394:179;;65495:10;65484:30;;;;;;;;;;;;:::i;:::-;65476:85;;;;-1:-1:-1;;;65476:85:0;;20351:2:1;65476:85:0;;;20333:21:1;20390:2;20370:18;;;20363:30;20429:34;20409:18;;;20402:62;-1:-1:-1;;;20480:18:1;;;20473:40;20530:19;;65476:85:0;20149:406:1;24929:681:0;25052:19;25058:2;25062:8;25052:5;:19::i;:::-;-1:-1:-1;;;;;25113:14:0;;;:19;25109:483;;25167:13;;25215:14;;;25248:233;25279:62;25318:1;25322:2;25326:7;;;;;;25335:5;25279:30;:62::i;:::-;25274:167;;25377:40;;-1:-1:-1;;;25377:40:0;;;;;;;;;;;25274:167;25476:3;25468:5;:11;25248:233;;25563:3;25546:13;;:20;25542:34;;25568:8;;;25542:34;25134:458;;24929:681;;;:::o;51264:229::-;51401:12;51433:52;51455:6;51463:4;51469:1;51472:12;51433:21;:52::i;25883:1529::-;25971:13;;-1:-1:-1;;;;;25999:16:0;;25995:48;;26024:19;;-1:-1:-1;;;26024:19:0;;;;;;;;;;;25995:48;26058:8;26070:1;26058:13;26054:44;;26080:18;;-1:-1:-1;;;26080:18:0;;;;;;;;;;;26054:44;-1:-1:-1;;;;;26586:22:0;;;;;;:18;:22;;9957:2;26586:22;;:70;;26624:31;26612:44;;26586:70;;;19984:11;19960:22;19956:40;-1:-1:-1;21694:15:0;;21669:23;21665:45;19953:51;19943:62;26899:31;;;;:17;:31;;;;;:173;26917:12;27148:23;;;27186:101;27213:35;;27238:9;;;;;-1:-1:-1;;;;;27213:35:0;;;27230:1;;27213:35;;27230:1;;27213:35;27282:3;27272:7;:13;27186:101;;27303:13;:19;-1:-1:-1;23142:185:0;;;:::o;52384:510::-;52554:12;52612:5;52587:21;:30;;52579:81;;;;-1:-1:-1;;;52579:81:0;;20762:2:1;52579:81:0;;;20744:21:1;20801:2;20781:18;;;20774:30;20840:34;20820:18;;;20813:62;-1:-1:-1;;;20891:18:1;;;20884:36;20937:19;;52579:81:0;20560:402:1;52579:81:0;-1:-1:-1;;;;;48814:19:0;;;52671:60;;;;-1:-1:-1;;;52671:60:0;;21169:2:1;52671:60:0;;;21151:21:1;21208:2;21188:18;;;21181:30;21247:31;21227:18;;;21220:59;21296:18;;52671:60:0;20967:353:1;52671:60:0;52745:12;52759:23;52786:6;-1:-1:-1;;;;;52786:11:0;52805:5;52812:4;52786:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52744:73;;;;52835:51;52852:7;52861:10;52873:12;52835:16;:51::i;:::-;52828:58;52384:510;-1:-1:-1;;;;;;;52384:510:0:o;55070:762::-;55220:12;55249:7;55245:580;;;-1:-1:-1;55280:10:0;55273:17;;55245:580;55394:17;;:21;55390:424;;55642:10;55636:17;55703:15;55690:10;55686:2;55682:19;55675:44;55390:424;55785:12;55778:20;;-1:-1:-1;;;55778:20:0;;;;;;;;:::i;359:131:1:-;-1:-1:-1;;;;;;433:32:1;;423:43;;413:71;;480:1;477;470:12;495:245;553:6;606:2;594:9;585:7;581:23;577:32;574:52;;;622:1;619;612:12;574:52;661:9;648:23;680:30;704:5;680:30;:::i;937:131::-;-1:-1:-1;;;;;1012:31:1;;1002:42;;992:70;;1058:1;1055;1048:12;1073:435;1140:6;1148;1201:2;1189:9;1180:7;1176:23;1172:32;1169:52;;;1217:1;1214;1207:12;1169:52;1256:9;1243:23;1275:31;1300:5;1275:31;:::i;:::-;1325:5;-1:-1:-1;1382:2:1;1367:18;;1354:32;-1:-1:-1;;;;;1417:40:1;;1405:53;;1395:81;;1472:1;1469;1462:12;1395:81;1495:7;1485:17;;;1073:435;;;;;:::o;1513:250::-;1598:1;1608:113;1622:6;1619:1;1616:13;1608:113;;;1698:11;;;1692:18;1679:11;;;1672:39;1644:2;1637:10;1608:113;;;-1:-1:-1;;1755:1:1;1737:16;;1730:27;1513:250::o;1768:271::-;1810:3;1848:5;1842:12;1875:6;1870:3;1863:19;1891:76;1960:6;1953:4;1948:3;1944:14;1937:4;1930:5;1926:16;1891:76;:::i;:::-;2021:2;2000:15;-1:-1:-1;;1996:29:1;1987:39;;;;2028:4;1983:50;;1768:271;-1:-1:-1;;1768:271:1:o;2044:220::-;2193:2;2182:9;2175:21;2156:4;2213:45;2254:2;2243:9;2239:18;2231:6;2213:45;:::i;2269:180::-;2328:6;2381:2;2369:9;2360:7;2356:23;2352:32;2349:52;;;2397:1;2394;2387:12;2349:52;-1:-1:-1;2420:23:1;;2269:180;-1:-1:-1;2269:180:1:o;2844:315::-;2912:6;2920;2973:2;2961:9;2952:7;2948:23;2944:32;2941:52;;;2989:1;2986;2979:12;2941:52;3028:9;3015:23;3047:31;3072:5;3047:31;:::i;:::-;3097:5;3149:2;3134:18;;;;3121:32;;-1:-1:-1;;;2844:315:1:o;3164:255::-;3231:6;3284:2;3272:9;3263:7;3259:23;3255:32;3252:52;;;3300:1;3297;3290:12;3252:52;3339:9;3326:23;3358:31;3383:5;3358:31;:::i;3424:456::-;3501:6;3509;3517;3570:2;3558:9;3549:7;3545:23;3541:32;3538:52;;;3586:1;3583;3576:12;3538:52;3625:9;3612:23;3644:31;3669:5;3644:31;:::i;:::-;3694:5;-1:-1:-1;3751:2:1;3736:18;;3723:32;3764:33;3723:32;3764:33;:::i;:::-;3424:456;;3816:7;;-1:-1:-1;;;3870:2:1;3855:18;;;;3842:32;;3424:456::o;3885:248::-;3953:6;3961;4014:2;4002:9;3993:7;3989:23;3985:32;3982:52;;;4030:1;4027;4020:12;3982:52;-1:-1:-1;;4053:23:1;;;4123:2;4108:18;;;4095:32;;-1:-1:-1;3885:248:1:o;4417:403::-;4500:6;4508;4561:2;4549:9;4540:7;4536:23;4532:32;4529:52;;;4577:1;4574;4567:12;4529:52;4616:9;4603:23;4635:31;4660:5;4635:31;:::i;:::-;4685:5;-1:-1:-1;4742:2:1;4727:18;;4714:32;4755:33;4714:32;4755:33;:::i;5077:127::-;5138:10;5133:3;5129:20;5126:1;5119:31;5169:4;5166:1;5159:15;5193:4;5190:1;5183:15;5209:632;5274:5;5304:18;5345:2;5337:6;5334:14;5331:40;;;5351:18;;:::i;:::-;5426:2;5420:9;5394:2;5480:15;;-1:-1:-1;;5476:24:1;;;5502:2;5472:33;5468:42;5456:55;;;5526:18;;;5546:22;;;5523:46;5520:72;;;5572:18;;:::i;:::-;5612:10;5608:2;5601:22;5641:6;5632:15;;5671:6;5663;5656:22;5711:3;5702:6;5697:3;5693:16;5690:25;5687:45;;;5728:1;5725;5718:12;5687:45;5778:6;5773:3;5766:4;5758:6;5754:17;5741:44;5833:1;5826:4;5817:6;5809;5805:19;5801:30;5794:41;;;;5209:632;;;;;:::o;5846:451::-;5915:6;5968:2;5956:9;5947:7;5943:23;5939:32;5936:52;;;5984:1;5981;5974:12;5936:52;6024:9;6011:23;6057:18;6049:6;6046:30;6043:50;;;6089:1;6086;6079:12;6043:50;6112:22;;6165:4;6157:13;;6153:27;-1:-1:-1;6143:55:1;;6194:1;6191;6184:12;6143:55;6217:74;6283:7;6278:2;6265:16;6260:2;6256;6252:11;6217:74;:::i;6302:118::-;6388:5;6381:13;6374:21;6367:5;6364:32;6354:60;;6410:1;6407;6400:12;6425:382;6490:6;6498;6551:2;6539:9;6530:7;6526:23;6522:32;6519:52;;;6567:1;6564;6557:12;6519:52;6606:9;6593:23;6625:31;6650:5;6625:31;:::i;:::-;6675:5;-1:-1:-1;6732:2:1;6717:18;;6704:32;6745:30;6704:32;6745:30;:::i;6812:795::-;6907:6;6915;6923;6931;6984:3;6972:9;6963:7;6959:23;6955:33;6952:53;;;7001:1;6998;6991:12;6952:53;7040:9;7027:23;7059:31;7084:5;7059:31;:::i;:::-;7109:5;-1:-1:-1;7166:2:1;7151:18;;7138:32;7179:33;7138:32;7179:33;:::i;:::-;7231:7;-1:-1:-1;7285:2:1;7270:18;;7257:32;;-1:-1:-1;7340:2:1;7325:18;;7312:32;7367:18;7356:30;;7353:50;;;7399:1;7396;7389:12;7353:50;7422:22;;7475:4;7467:13;;7463:27;-1:-1:-1;7453:55:1;;7504:1;7501;7494:12;7453:55;7527:74;7593:7;7588:2;7575:16;7570:2;7566;7562:11;7527:74;:::i;:::-;7517:84;;;6812:795;;;;;;;:::o;8272:356::-;8474:2;8456:21;;;8493:18;;;8486:30;8552:34;8547:2;8532:18;;8525:62;8619:2;8604:18;;8272:356::o;8633:380::-;8712:1;8708:12;;;;8755;;;8776:61;;8830:4;8822:6;8818:17;8808:27;;8776:61;8883:2;8875:6;8872:14;8852:18;8849:38;8846:161;;8929:10;8924:3;8920:20;8917:1;8910:31;8964:4;8961:1;8954:15;8992:4;8989:1;8982:15;8846:161;;8633:380;;;:::o;9018:402::-;9220:2;9202:21;;;9259:2;9239:18;;;9232:30;9298:34;9293:2;9278:18;;9271:62;-1:-1:-1;;;9364:2:1;9349:18;;9342:36;9410:3;9395:19;;9018:402::o;9425:407::-;9627:2;9609:21;;;9666:2;9646:18;;;9639:30;9705:34;9700:2;9685:18;;9678:62;-1:-1:-1;;;9771:2:1;9756:18;;9749:41;9822:3;9807:19;;9425:407::o;9837:127::-;9898:10;9893:3;9889:20;9886:1;9879:31;9929:4;9926:1;9919:15;9953:4;9950:1;9943:15;9969:125;10034:9;;;10055:10;;;10052:36;;;10068:18;;:::i;10386:135::-;10425:3;10446:17;;;10443:43;;10466:18;;:::i;:::-;-1:-1:-1;10513:1:1;10502:13;;10386:135::o;10526:127::-;10587:10;10582:3;10578:20;10575:1;10568:31;10618:4;10615:1;10608:15;10642:4;10639:1;10632:15;12079:168;12152:9;;;12183;;12200:15;;;12194:22;;12180:37;12170:71;;12221:18;;:::i;12724:545::-;12826:2;12821:3;12818:11;12815:448;;;12862:1;12887:5;12883:2;12876:17;12932:4;12928:2;12918:19;13002:2;12990:10;12986:19;12983:1;12979:27;12973:4;12969:38;13038:4;13026:10;13023:20;13020:47;;;-1:-1:-1;13061:4:1;13020:47;13116:2;13111:3;13107:12;13104:1;13100:20;13094:4;13090:31;13080:41;;13171:82;13189:2;13182:5;13179:13;13171:82;;;13234:17;;;13215:1;13204:13;13171:82;;13445:1352;13571:3;13565:10;13598:18;13590:6;13587:30;13584:56;;;13620:18;;:::i;:::-;13649:97;13739:6;13699:38;13731:4;13725:11;13699:38;:::i;:::-;13693:4;13649:97;:::i;:::-;13801:4;;13865:2;13854:14;;13882:1;13877:663;;;;14584:1;14601:6;14598:89;;;-1:-1:-1;14653:19:1;;;14647:26;14598:89;-1:-1:-1;;13402:1:1;13398:11;;;13394:24;13390:29;13380:40;13426:1;13422:11;;;13377:57;14700:81;;13847:944;;13877:663;12671:1;12664:14;;;12708:4;12695:18;;-1:-1:-1;;13913:20:1;;;14031:236;14045:7;14042:1;14039:14;14031:236;;;14134:19;;;14128:26;14113:42;;14226:27;;;;14194:1;14182:14;;;;14061:19;;14031:236;;;14035:3;14295:6;14286:7;14283:19;14280:201;;;14356:19;;;14350:26;-1:-1:-1;;14439:1:1;14435:14;;;14451:3;14431:24;14427:37;14423:42;14408:58;14393:74;;14280:201;-1:-1:-1;;;;;14527:1:1;14511:14;;;14507:22;14494:36;;-1:-1:-1;13445:1352:1:o;14802:127::-;14863:10;14858:3;14854:20;14851:1;14844:31;14894:4;14891:1;14884:15;14918:4;14915:1;14908:15;14934:120;14974:1;15000;14990:35;;15005:18;;:::i;:::-;-1:-1:-1;15039:9:1;;14934:120::o;15059:184::-;15129:6;15182:2;15170:9;15161:7;15157:23;15153:32;15150:52;;;15198:1;15195;15188:12;15150:52;-1:-1:-1;15221:16:1;;15059:184;-1:-1:-1;15059:184:1:o;15960:1187::-;16237:3;16266:1;16299:6;16293:13;16329:36;16355:9;16329:36;:::i;:::-;16384:1;16401:18;;;16428:133;;;;16575:1;16570:356;;;;16394:532;;16428:133;-1:-1:-1;;16461:24:1;;16449:37;;16534:14;;16527:22;16515:35;;16506:45;;;-1:-1:-1;16428:133:1;;16570:356;16601:6;16598:1;16591:17;16631:4;16676:2;16673:1;16663:16;16701:1;16715:165;16729:6;16726:1;16723:13;16715:165;;;16807:14;;16794:11;;;16787:35;16850:16;;;;16744:10;;16715:165;;;16719:3;;;16909:6;16904:3;16900:16;16893:23;;16394:532;;;;;16957:6;16951:13;16973:68;17032:8;17027:3;17020:4;17012:6;17008:17;16973:68;:::i;:::-;-1:-1:-1;;;17063:18:1;;17090:22;;;17139:1;17128:13;;15960:1187;-1:-1:-1;;;;15960:1187:1:o;18901:128::-;18968:9;;;18989:11;;;18986:37;;;19003:18;;:::i;19034:489::-;-1:-1:-1;;;;;19303:15:1;;;19285:34;;19355:15;;19350:2;19335:18;;19328:43;19402:2;19387:18;;19380:34;;;19450:3;19445:2;19430:18;;19423:31;;;19228:4;;19471:46;;19497:19;;19489:6;19471:46;:::i;:::-;19463:54;19034:489;-1:-1:-1;;;;;;19034:489:1:o;19528:249::-;19597:6;19650:2;19638:9;19629:7;19625:23;19621:32;19618:52;;;19666:1;19663;19656:12;19618:52;19698:9;19692:16;19717:30;19741:5;19717:30;:::i;19782:112::-;19814:1;19840;19830:35;;19845:18;;:::i;:::-;-1:-1:-1;19879:9:1;;19782:112::o;19899:245::-;19966:6;20019:2;20007:9;19998:7;19994:23;19990:32;19987:52;;;20035:1;20032;20025:12;19987:52;20067:9;20061:16;20086:28;20108:5;20086:28;:::i;21325:287::-;21454:3;21492:6;21486:13;21508:66;21567:6;21562:3;21555:4;21547:6;21543:17;21508:66;:::i;:::-;21590:16;;;;;21325:287;-1:-1:-1;;21325:287:1:o

Swarm Source

ipfs://9c819d1f83e73846552e03287a9552cc263741b9a3286bec136c1cf8d792f377
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.