ETH Price: $3,305.34 (-3.75%)
Gas: 19 Gwei

Token

LUFFY OFFICIAL NFT (LUFFYNFT)
 

Overview

Max Total Supply

776 LUFFYNFT

Holders

183

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
18 LUFFYNFT
0xd877282f5A1a22D7f96A4d3C984EDceacCE44689
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:
LuffyContract

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

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

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

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

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

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

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

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

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

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

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

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

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

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

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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


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

contract ERC721A is IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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


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



contract LuffyContract is ERC721AQueryable, Ownable {

  uint256 public MAX_Supply = 10000; // maximum supply is 10K.
  uint256 public publicMintFee = 0.04 ether; // public minting fees in ether.

  bool public revealed = false; // All Nfts revealed or not?

  string private baseUri; 
  string private unrevealedUri; // uri for unrevealed nfts.
  string private baseExtension = ".json";

  address public feeReceiver; // address for the fee receiver for the public mint.

  mapping(uint256 => bool) public revealedByTokenId; // to reveal some amount of nfts.
  mapping(address => uint256) public freeMintAllowed; // free Mint allowed for airdrops and all.


  // To check minting supply before Every mint. 
  modifier checkMintSupply(uint256 amount){
    require(totalSupply() + amount <= MAX_Supply, "Amount Exceeds Supply");
    _;
  }

  constructor(string memory baseUri_, string memory unrevealedUri_, address feeReceiver_) ERC721A("LUFFY OFFICIAL NFT", "LUFFYNFT") {
    baseUri = baseUri_;
    unrevealedUri = unrevealedUri_;
    feeReceiver = feeReceiver_;
  }

  function remainingSupply() public view returns(uint256) {
    return MAX_Supply - totalSupply();
  }

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

  function setBaseUri(string memory _baseUri) public onlyOwner {
    baseUri = _baseUri;
  }

  // Don't have to worry about it it is mandatory for the baseUri string to make tokenUri
  function _baseURI() internal view virtual override returns (string memory) {
      return baseUri;
  }
  
  // Function is to reveal all the nfts at one function call. No nfts can be unrevealed after calling this function.
  function revealAll() public onlyOwner {
    revealed = true;
  }

  // This is to reveal some nfts for some special cases if necessary.
  function revealByTokenId(uint256[] memory _tokenIds) public onlyOwner {
    for(uint i; i < _tokenIds.length; i++){
      revealedByTokenId[_tokenIds[i]] = true;
    }
  }

  // function to change public mint fee.
  function changePublicMintFee(uint256 _newFee) public onlyOwner {
    publicMintFee = _newFee;
  }

  //  function to give token uri this is an standard function which is modified to give the needed uri.
  function tokenURI(uint256 tokenId) public view virtual override(ERC721A, IERC721A) returns (string memory) {
    if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

    string memory baseURI = _baseURI();
    return revealed || revealedByTokenId[tokenId] ? string(abi.encodePacked(baseURI, _toString(tokenId), baseExtension)) : unrevealedUri;
  }

  // This is for the owner mint.
  function adminMint(uint256 amount) public onlyOwner {
    require(totalSupply() + amount <= MAX_Supply, "Amount Exceed supply");
    _safeMint(msg.sender, amount);
  }

  // this is to free mint allowed by the owner for the airdrops and rewards.
  function freeMint(uint256 amount) public checkMintSupply(amount) {
    require(freeMintAllowed[msg.sender] >= amount, "Free allowed is less than amount");
    freeMintAllowed[msg.sender] -= amount;
    _safeMint(msg.sender, amount);
  }

  // This is to mint payed nfts.
  function publicMint(uint256 amount) public payable checkMintSupply(amount) {
    require((amount*publicMintFee) <= msg.value, "Insufficient Fee value");
    _safeMint(msg.sender, amount);
    payable(feeReceiver).transfer(msg.value);
  }

  // function to allow free Mints for airdrops and rewards.
  function allowFreeMint(address[] memory _addresses, uint256[] memory _amounts) public onlyOwner {
    require(_addresses.length== _amounts.length, "Length should be same");
    for(uint i; i < _addresses.length; i++){
      freeMintAllowed[_addresses[i]] = _amounts[i];
    }
  }

  // function to allow free Mints for airdrops and rewards.
  // Difference between this and the above function is.
  // This will add mint with the existing allowed mints.
  function addFreeMintAllowance(address[] memory _addresses, uint256[] memory _amounts) public onlyOwner {
    require(_addresses.length == _amounts.length, "Length should be same");
    for(uint i; i < _addresses.length; i++){
      freeMintAllowed[_addresses[i]] += _amounts[i];
    }
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseUri_","type":"string"},{"internalType":"string","name":"unrevealedUri_","type":"string"},{"internalType":"address","name":"feeReceiver_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_Supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"addFreeMintAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"allowFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"changePublicMintFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMintAllowed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remainingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"revealByTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"revealedByTokenId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052612710600955668e1bc9bf040000600a556000600b60006101000a81548160ff0219169083151502179055506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600e90805190602001906200007d929190620002da565b503480156200008b57600080fd5b5060405162004739380380620047398339818101604052810190620000b191906200058c565b6040518060400160405280601281526020017f4c55464659204f4646494349414c204e465400000000000000000000000000008152506040518060400160405280600881526020017f4c554646594e4654000000000000000000000000000000000000000000000000815250816002908051906020019062000135929190620002da565b5080600390805190602001906200014e929190620002da565b506200015f6200020360201b60201c565b6000819055505050620001876200017b6200020c60201b60201c565b6200021460201b60201c565b82600c90805190602001906200019f929190620002da565b5081600d9080519060200190620001b8929190620002da565b5080600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050506200068a565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002e89062000655565b90600052602060002090601f0160209004810192826200030c576000855562000358565b82601f106200032757805160ff191683800117855562000358565b8280016001018555821562000358579182015b82811115620003575782518255916020019190600101906200033a565b5b5090506200036791906200036b565b5090565b5b80821115620003865760008160009055506001016200036c565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003f382620003a8565b810181811067ffffffffffffffff82111715620004155762000414620003b9565b5b80604052505050565b60006200042a6200038a565b9050620004388282620003e8565b919050565b600067ffffffffffffffff8211156200045b576200045a620003b9565b5b6200046682620003a8565b9050602081019050919050565b60005b838110156200049357808201518184015260208101905062000476565b83811115620004a3576000848401525b50505050565b6000620004c0620004ba846200043d565b6200041e565b905082815260208101848484011115620004df57620004de620003a3565b5b620004ec84828562000473565b509392505050565b600082601f8301126200050c576200050b6200039e565b5b81516200051e848260208601620004a9565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005548262000527565b9050919050565b620005668162000547565b81146200057257600080fd5b50565b60008151905062000586816200055b565b92915050565b600080600060608486031215620005a857620005a762000394565b5b600084015167ffffffffffffffff811115620005c957620005c862000399565b5b620005d786828701620004f4565b935050602084015167ffffffffffffffff811115620005fb57620005fa62000399565b5b6200060986828701620004f4565b92505060406200061c8682870162000575565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200066e57607f821691505b60208210810362000684576200068362000626565b5b50919050565b61409f806200069a6000396000f3fe60806040526004361061021a5760003560e01c80637c928fe911610123578063b88d4fde116100ab578063d4612ed81161006f578063d4612ed8146107e6578063da0239a61461080f578063dcb7b4231461083a578063e985e9c514610877578063f2fde38b146108b45761021a565b8063b88d4fde146106f1578063c1f261231461071a578063c23dc68f14610743578063c63ad47e14610780578063c87b56dd146107a95761021a565b806395d89b41116100f257806395d89b411461060c57806399a2557a14610637578063a0bcfc7f14610674578063a22cb4651461069d578063b3f00674146106c65761021a565b80637c928fe91461053e578063837e0777146105675780638462151c146105a45780638da5cb5b146105e15761021a565b80633a05728d116101a65780635bbb2177116101755780635bbb2177146104475780636352211e146104845780636bcb4a24146104c157806370a08231146104ea578063715018a6146105275761021a565b80633a05728d146103b357806342842e0e146103dc57806342d0e74e14610405578063518302271461041c5761021a565b80630b191314116101ed5780630b191314146102ed578063145f3c271461031857806318160ddd1461034357806323b872dd1461036e5780632db11544146103975761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190612e10565b6108dd565b6040516102539190612e58565b60405180910390f35b34801561026857600080fd5b5061027161096f565b60405161027e9190612f0c565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190612f64565b610a01565b6040516102bb9190612fd2565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190613019565b610a7d565b005b3480156102f957600080fd5b50610302610c23565b60405161030f9190613068565b60405180910390f35b34801561032457600080fd5b5061032d610c29565b60405161033a9190613068565b60405180910390f35b34801561034f57600080fd5b50610358610c2f565b6040516103659190613068565b60405180910390f35b34801561037a57600080fd5b5061039560048036038101906103909190613083565b610c46565b005b6103b160048036038101906103ac9190612f64565b610c56565b005b3480156103bf57600080fd5b506103da60048036038101906103d591906132e1565b610d75565b005b3480156103e857600080fd5b5061040360048036038101906103fe9190613083565b610ee3565b005b34801561041157600080fd5b5061041a610f03565b005b34801561042857600080fd5b50610431610f9c565b60405161043e9190612e58565b60405180910390f35b34801561045357600080fd5b5061046e60048036038101906104699190613359565b610faf565b60405161047b91906134d4565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a69190612f64565b611070565b6040516104b89190612fd2565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e39190613359565b611082565b005b3480156104f657600080fd5b50610511600480360381019061050c91906134f6565b611167565b60405161051e9190613068565b60405180910390f35b34801561053357600080fd5b5061053c61121f565b005b34801561054a57600080fd5b5061056560048036038101906105609190612f64565b6112a7565b005b34801561057357600080fd5b5061058e600480360381019061058991906134f6565b6113e5565b60405161059b9190613068565b60405180910390f35b3480156105b057600080fd5b506105cb60048036038101906105c691906134f6565b6113fd565b6040516105d891906135e1565b60405180910390f35b3480156105ed57600080fd5b506105f6611540565b6040516106039190612fd2565b60405180910390f35b34801561061857600080fd5b5061062161156a565b60405161062e9190612f0c565b60405180910390f35b34801561064357600080fd5b5061065e60048036038101906106599190613603565b6115fc565b60405161066b91906135e1565b60405180910390f35b34801561068057600080fd5b5061069b6004803603810190610696919061370b565b611808565b005b3480156106a957600080fd5b506106c460048036038101906106bf9190613780565b61189e565b005b3480156106d257600080fd5b506106db611a15565b6040516106e89190612fd2565b60405180910390f35b3480156106fd57600080fd5b5061071860048036038101906107139190613861565b611a3b565b005b34801561072657600080fd5b50610741600480360381019061073c9190612f64565b611aae565b005b34801561074f57600080fd5b5061076a60048036038101906107659190612f64565b611b8e565b6040516107779190613926565b60405180910390f35b34801561078c57600080fd5b506107a760048036038101906107a29190612f64565b611bf8565b005b3480156107b557600080fd5b506107d060048036038101906107cb9190612f64565b611c7e565b6040516107dd9190612f0c565b60405180910390f35b3480156107f257600080fd5b5061080d600480360381019061080891906132e1565b611dcd565b005b34801561081b57600080fd5b50610824611f29565b6040516108319190613068565b60405180910390f35b34801561084657600080fd5b50610861600480360381019061085c9190612f64565b611f45565b60405161086e9190612e58565b60405180910390f35b34801561088357600080fd5b5061089e60048036038101906108999190613941565b611f65565b6040516108ab9190612e58565b60405180910390f35b3480156108c057600080fd5b506108db60048036038101906108d691906134f6565b611ff9565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061093857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109685750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461097e906139b0565b80601f01602080910402602001604051908101604052809291908181526020018280546109aa906139b0565b80156109f75780601f106109cc576101008083540402835291602001916109f7565b820191906000526020600020905b8154815290600101906020018083116109da57829003601f168201915b5050505050905090565b6000610a0c826120f0565b610a42576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a888261214f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610aef576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b0e61221b565b73ffffffffffffffffffffffffffffffffffffffff1614610b7157610b3a81610b3561221b565b611f65565b610b70576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60095481565b600a5481565b6000610c39612223565b6001546000540303905090565b610c5183838361222c565b505050565b8060095481610c63610c2f565b610c6d9190613a10565b1115610cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca590613ab2565b60405180910390fd5b34600a5483610cbd9190613ad2565b1115610cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf590613b78565b60405180910390fd5b610d0833836125d3565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015610d70573d6000803e3d6000fd5b505050565b610d7d6125f1565b73ffffffffffffffffffffffffffffffffffffffff16610d9b611540565b73ffffffffffffffffffffffffffffffffffffffff1614610df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de890613be4565b60405180910390fd5b8051825114610e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2c90613c50565b60405180910390fd5b60005b8251811015610ede57818181518110610e5457610e53613c70565b5b602002602001015160116000858481518110610e7357610e72613c70565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610ec49190613a10565b925050819055508080610ed690613c9f565b915050610e38565b505050565b610efe83838360405180602001604052806000815250611a3b565b505050565b610f0b6125f1565b73ffffffffffffffffffffffffffffffffffffffff16610f29611540565b73ffffffffffffffffffffffffffffffffffffffff1614610f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7690613be4565b60405180910390fd5b6001600b60006101000a81548160ff021916908315150217905550565b600b60009054906101000a900460ff1681565b606060008251905060008167ffffffffffffffff811115610fd357610fd26130db565b5b60405190808252806020026020018201604052801561100c57816020015b610ff9612cbe565b815260200190600190039081610ff15790505b50905060005b8281146110655761103c85828151811061102f5761102e613c70565b5b6020026020010151611b8e565b82828151811061104f5761104e613c70565b5b6020026020010181905250806001019050611012565b508092505050919050565b600061107b8261214f565b9050919050565b61108a6125f1565b73ffffffffffffffffffffffffffffffffffffffff166110a8611540565b73ffffffffffffffffffffffffffffffffffffffff16146110fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f590613be4565b60405180910390fd5b60005b81518110156111635760016010600084848151811061112357611122613c70565b5b6020026020010151815260200190815260200160002060006101000a81548160ff021916908315150217905550808061115b90613c9f565b915050611101565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111ce576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6112276125f1565b73ffffffffffffffffffffffffffffffffffffffff16611245611540565b73ffffffffffffffffffffffffffffffffffffffff161461129b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129290613be4565b60405180910390fd5b6112a560006125f9565b565b80600954816112b4610c2f565b6112be9190613a10565b11156112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f690613ab2565b60405180910390fd5b81601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137890613d33565b60405180910390fd5b81601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113d09190613d53565b925050819055506113e133836125d3565b5050565b60116020528060005260406000206000915090505481565b6060600080600061140d85611167565b905060008167ffffffffffffffff81111561142b5761142a6130db565b5b6040519080825280602002602001820160405280156114595781602001602082028036833780820191505090505b509050611464612cbe565b600061146e612223565b90505b83861461153257611481816126bf565b9150816040015161152757600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146114cc57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611526578083878060010198508151811061151957611518613c70565b5b6020026020010181815250505b5b806001019050611471565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611579906139b0565b80601f01602080910402602001604051908101604052809291908181526020018280546115a5906139b0565b80156115f25780601f106115c7576101008083540402835291602001916115f2565b820191906000526020600020905b8154815290600101906020018083116115d557829003601f168201915b5050505050905090565b6060818310611637576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806116426126ea565b905061164c612223565b85101561165e5761165b612223565b94505b8084111561166a578093505b600061167587611167565b905084861015611698576000868603905081811015611692578091505b5061169d565b600090505b60008167ffffffffffffffff8111156116b9576116b86130db565b5b6040519080825280602002602001820160405280156116e75781602001602082028036833780820191505090505b509050600082036116fe5780945050505050611801565b600061170988611b8e565b90506000816040015161171e57816000015190505b60008990505b8881141580156117345750848714155b156117f357611742816126bf565b925082604001516117e857600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461178d57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117e757808488806001019950815181106117da576117d9613c70565b5b6020026020010181815250505b5b806001019050611724565b508583528296505050505050505b9392505050565b6118106125f1565b73ffffffffffffffffffffffffffffffffffffffff1661182e611540565b73ffffffffffffffffffffffffffffffffffffffff1614611884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187b90613be4565b60405180910390fd5b80600c908051906020019061189a929190612d01565b5050565b6118a661221b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361190a576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061191761221b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119c461221b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a099190612e58565b60405180910390a35050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611a4684848461222c565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611aa857611a71848484846126f3565b611aa7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611ab66125f1565b73ffffffffffffffffffffffffffffffffffffffff16611ad4611540565b73ffffffffffffffffffffffffffffffffffffffff1614611b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2190613be4565b60405180910390fd5b60095481611b36610c2f565b611b409190613a10565b1115611b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7890613dd3565b60405180910390fd5b611b8b33826125d3565b50565b611b96612cbe565b611b9e612cbe565b611ba6612223565b831080611bba5750611bb66126ea565b8310155b15611bc85780915050611bf3565b611bd1836126bf565b9050806040015115611be65780915050611bf3565b611bef83612843565b9150505b919050565b611c006125f1565b73ffffffffffffffffffffffffffffffffffffffff16611c1e611540565b73ffffffffffffffffffffffffffffffffffffffff1614611c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6b90613be4565b60405180910390fd5b80600a8190555050565b6060611c89826120f0565b611cbf576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611cc9612863565b9050600b60009054906101000a900460ff1680611d0357506010600084815260200190815260200160002060009054906101000a900460ff165b611d9757600d8054611d14906139b0565b80601f0160208091040260200160405190810160405280929190818152602001828054611d40906139b0565b8015611d8d5780601f10611d6257610100808354040283529160200191611d8d565b820191906000526020600020905b815481529060010190602001808311611d7057829003601f168201915b5050505050611dc5565b80611da1846128f5565b600e604051602001611db593929190613ec3565b6040516020818303038152906040525b915050919050565b611dd56125f1565b73ffffffffffffffffffffffffffffffffffffffff16611df3611540565b73ffffffffffffffffffffffffffffffffffffffff1614611e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4090613be4565b60405180910390fd5b8051825114611e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8490613c50565b60405180910390fd5b60005b8251811015611f2457818181518110611eac57611eab613c70565b5b602002602001015160116000858481518110611ecb57611eca613c70565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080611f1c90613c9f565b915050611e90565b505050565b6000611f33610c2f565b600954611f409190613d53565b905090565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120016125f1565b73ffffffffffffffffffffffffffffffffffffffff1661201f611540565b73ffffffffffffffffffffffffffffffffffffffff1614612075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206c90613be4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120db90613f66565b60405180910390fd5b6120ed816125f9565b50565b6000816120fb612223565b1115801561210a575060005482105b8015612148575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000808290508061215e612223565b116121e4576000548110156121e35760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036121e1575b600081036121d75760046000836001900393508381526020019081526020016000205490506121ad565b8092505050612216565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b60006122378261214f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461229e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166122bf61221b565b73ffffffffffffffffffffffffffffffffffffffff1614806122ee57506122ed856122e861221b565b611f65565b5b8061233357506122fc61221b565b73ffffffffffffffffffffffffffffffffffffffff1661231b84610a01565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061236c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036123d2576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123df858585600161294f565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6124dc86612955565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316036125645760006001840190506000600460008381526020019081526020016000205403612562576000548114612561578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125cc858585600161295f565b5050505050565b6125ed828260405180602001604052806000815250612965565b5050565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126c7612cbe565b6126e36004600084815260200190815260200160002054612c18565b9050919050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261271961221b565b8786866040518563ffffffff1660e01b815260040161273b9493929190613fdb565b6020604051808303816000875af192505050801561277757506040513d601f19601f82011682018060405250810190612774919061403c565b60015b6127f0573d80600081146127a7576040519150601f19603f3d011682016040523d82523d6000602084013e6127ac565b606091505b5060008151036127e8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b61284b612cbe565b61285c6128578361214f565b612c18565b9050919050565b6060600c8054612872906139b0565b80601f016020809104026020016040519081016040528092919081815260200182805461289e906139b0565b80156128eb5780601f106128c0576101008083540402835291602001916128eb565b820191906000526020600020905b8154815290600101906020018083116128ce57829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561293b57600183039250600a81066030018353600a8104905061291b565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036129d1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612a0b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a18600085838661294f565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612a7d60018514612cb4565b901b60a042901b612a8d86612955565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612b91575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b4160008784806001019550876126f3565b612b77576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612ad2578260005414612b8c57600080fd5b612bfc565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612b92575b816000819055505050612c12600085838661295f565b50505050565b612c20612cbe565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c010000000000000000000000000000000000000000000000000000000083161415816040019015159081151581525050919050565b6000819050919050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b828054612d0d906139b0565b90600052602060002090601f016020900481019282612d2f5760008555612d76565b82601f10612d4857805160ff1916838001178555612d76565b82800160010185558215612d76579182015b82811115612d75578251825591602001919060010190612d5a565b5b509050612d839190612d87565b5090565b5b80821115612da0576000816000905550600101612d88565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ded81612db8565b8114612df857600080fd5b50565b600081359050612e0a81612de4565b92915050565b600060208284031215612e2657612e25612dae565b5b6000612e3484828501612dfb565b91505092915050565b60008115159050919050565b612e5281612e3d565b82525050565b6000602082019050612e6d6000830184612e49565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ead578082015181840152602081019050612e92565b83811115612ebc576000848401525b50505050565b6000601f19601f8301169050919050565b6000612ede82612e73565b612ee88185612e7e565b9350612ef8818560208601612e8f565b612f0181612ec2565b840191505092915050565b60006020820190508181036000830152612f268184612ed3565b905092915050565b6000819050919050565b612f4181612f2e565b8114612f4c57600080fd5b50565b600081359050612f5e81612f38565b92915050565b600060208284031215612f7a57612f79612dae565b5b6000612f8884828501612f4f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612fbc82612f91565b9050919050565b612fcc81612fb1565b82525050565b6000602082019050612fe76000830184612fc3565b92915050565b612ff681612fb1565b811461300157600080fd5b50565b60008135905061301381612fed565b92915050565b600080604083850312156130305761302f612dae565b5b600061303e85828601613004565b925050602061304f85828601612f4f565b9150509250929050565b61306281612f2e565b82525050565b600060208201905061307d6000830184613059565b92915050565b60008060006060848603121561309c5761309b612dae565b5b60006130aa86828701613004565b93505060206130bb86828701613004565b92505060406130cc86828701612f4f565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61311382612ec2565b810181811067ffffffffffffffff82111715613132576131316130db565b5b80604052505050565b6000613145612da4565b9050613151828261310a565b919050565b600067ffffffffffffffff821115613171576131706130db565b5b602082029050602081019050919050565b600080fd5b600061319a61319584613156565b61313b565b905080838252602082019050602084028301858111156131bd576131bc613182565b5b835b818110156131e657806131d28882613004565b8452602084019350506020810190506131bf565b5050509392505050565b600082601f830112613205576132046130d6565b5b8135613215848260208601613187565b91505092915050565b600067ffffffffffffffff821115613239576132386130db565b5b602082029050602081019050919050565b600061325d6132588461321e565b61313b565b905080838252602082019050602084028301858111156132805761327f613182565b5b835b818110156132a957806132958882612f4f565b845260208401935050602081019050613282565b5050509392505050565b600082601f8301126132c8576132c76130d6565b5b81356132d884826020860161324a565b91505092915050565b600080604083850312156132f8576132f7612dae565b5b600083013567ffffffffffffffff81111561331657613315612db3565b5b613322858286016131f0565b925050602083013567ffffffffffffffff81111561334357613342612db3565b5b61334f858286016132b3565b9150509250929050565b60006020828403121561336f5761336e612dae565b5b600082013567ffffffffffffffff81111561338d5761338c612db3565b5b613399848285016132b3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6133d781612fb1565b82525050565b600067ffffffffffffffff82169050919050565b6133fa816133dd565b82525050565b61340981612e3d565b82525050565b60608201600082015161342560008501826133ce565b50602082015161343860208501826133f1565b50604082015161344b6040850182613400565b50505050565b600061345d838361340f565b60608301905092915050565b6000602082019050919050565b6000613481826133a2565b61348b81856133ad565b9350613496836133be565b8060005b838110156134c75781516134ae8882613451565b97506134b983613469565b92505060018101905061349a565b5085935050505092915050565b600060208201905081810360008301526134ee8184613476565b905092915050565b60006020828403121561350c5761350b612dae565b5b600061351a84828501613004565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61355881612f2e565b82525050565b600061356a838361354f565b60208301905092915050565b6000602082019050919050565b600061358e82613523565b613598818561352e565b93506135a38361353f565b8060005b838110156135d45781516135bb888261355e565b97506135c683613576565b9250506001810190506135a7565b5085935050505092915050565b600060208201905081810360008301526135fb8184613583565b905092915050565b60008060006060848603121561361c5761361b612dae565b5b600061362a86828701613004565b935050602061363b86828701612f4f565b925050604061364c86828701612f4f565b9150509250925092565b600080fd5b600067ffffffffffffffff821115613676576136756130db565b5b61367f82612ec2565b9050602081019050919050565b82818337600083830152505050565b60006136ae6136a98461365b565b61313b565b9050828152602081018484840111156136ca576136c9613656565b5b6136d584828561368c565b509392505050565b600082601f8301126136f2576136f16130d6565b5b813561370284826020860161369b565b91505092915050565b60006020828403121561372157613720612dae565b5b600082013567ffffffffffffffff81111561373f5761373e612db3565b5b61374b848285016136dd565b91505092915050565b61375d81612e3d565b811461376857600080fd5b50565b60008135905061377a81613754565b92915050565b6000806040838503121561379757613796612dae565b5b60006137a585828601613004565b92505060206137b68582860161376b565b9150509250929050565b600067ffffffffffffffff8211156137db576137da6130db565b5b6137e482612ec2565b9050602081019050919050565b60006138046137ff846137c0565b61313b565b9050828152602081018484840111156138205761381f613656565b5b61382b84828561368c565b509392505050565b600082601f830112613848576138476130d6565b5b81356138588482602086016137f1565b91505092915050565b6000806000806080858703121561387b5761387a612dae565b5b600061388987828801613004565b945050602061389a87828801613004565b93505060406138ab87828801612f4f565b925050606085013567ffffffffffffffff8111156138cc576138cb612db3565b5b6138d887828801613833565b91505092959194509250565b6060820160008201516138fa60008501826133ce565b50602082015161390d60208501826133f1565b5060408201516139206040850182613400565b50505050565b600060608201905061393b60008301846138e4565b92915050565b6000806040838503121561395857613957612dae565b5b600061396685828601613004565b925050602061397785828601613004565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806139c857607f821691505b6020821081036139db576139da613981565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a1b82612f2e565b9150613a2683612f2e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a5b57613a5a6139e1565b5b828201905092915050565b7f416d6f756e74204578636565647320537570706c790000000000000000000000600082015250565b6000613a9c601583612e7e565b9150613aa782613a66565b602082019050919050565b60006020820190508181036000830152613acb81613a8f565b9050919050565b6000613add82612f2e565b9150613ae883612f2e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b2157613b206139e1565b5b828202905092915050565b7f496e73756666696369656e74204665652076616c756500000000000000000000600082015250565b6000613b62601683612e7e565b9150613b6d82613b2c565b602082019050919050565b60006020820190508181036000830152613b9181613b55565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613bce602083612e7e565b9150613bd982613b98565b602082019050919050565b60006020820190508181036000830152613bfd81613bc1565b9050919050565b7f4c656e6774682073686f756c642062652073616d650000000000000000000000600082015250565b6000613c3a601583612e7e565b9150613c4582613c04565b602082019050919050565b60006020820190508181036000830152613c6981613c2d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613caa82612f2e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613cdc57613cdb6139e1565b5b600182019050919050565b7f4672656520616c6c6f776564206973206c657373207468616e20616d6f756e74600082015250565b6000613d1d602083612e7e565b9150613d2882613ce7565b602082019050919050565b60006020820190508181036000830152613d4c81613d10565b9050919050565b6000613d5e82612f2e565b9150613d6983612f2e565b925082821015613d7c57613d7b6139e1565b5b828203905092915050565b7f416d6f756e742045786365656420737570706c79000000000000000000000000600082015250565b6000613dbd601483612e7e565b9150613dc882613d87565b602082019050919050565b60006020820190508181036000830152613dec81613db0565b9050919050565b600081905092915050565b6000613e0982612e73565b613e138185613df3565b9350613e23818560208601612e8f565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613e51816139b0565b613e5b8186613df3565b94506001821660008114613e765760018114613e8757613eba565b60ff19831686528186019350613eba565b613e9085613e2f565b60005b83811015613eb257815481890152600182019150602081019050613e93565b838801955050505b50505092915050565b6000613ecf8286613dfe565b9150613edb8285613dfe565b9150613ee78284613e44565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613f50602683612e7e565b9150613f5b82613ef4565b604082019050919050565b60006020820190508181036000830152613f7f81613f43565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613fad82613f86565b613fb78185613f91565b9350613fc7818560208601612e8f565b613fd081612ec2565b840191505092915050565b6000608082019050613ff06000830187612fc3565b613ffd6020830186612fc3565b61400a6040830185613059565b818103606083015261401c8184613fa2565b905095945050505050565b60008151905061403681612de4565b92915050565b60006020828403121561405257614051612dae565b5b600061406084828501614027565b9150509291505056fea2646970667358221220644bcfda0e4599fdcf4a5afd773e95033485a4243fc26b7d3759e5f2eb66961864736f6c634300080d0033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000008e1703e600f3a667482c4cedf9c5042c4f9e1fa50000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d577346473741386137646a38726e4e64375859344453367a514a6a704b3569716162324166547941784d6f642f000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d56317369397159427663656b71414e506146675635544b4448364773467558756958336f713933737a4531632f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061021a5760003560e01c80637c928fe911610123578063b88d4fde116100ab578063d4612ed81161006f578063d4612ed8146107e6578063da0239a61461080f578063dcb7b4231461083a578063e985e9c514610877578063f2fde38b146108b45761021a565b8063b88d4fde146106f1578063c1f261231461071a578063c23dc68f14610743578063c63ad47e14610780578063c87b56dd146107a95761021a565b806395d89b41116100f257806395d89b411461060c57806399a2557a14610637578063a0bcfc7f14610674578063a22cb4651461069d578063b3f00674146106c65761021a565b80637c928fe91461053e578063837e0777146105675780638462151c146105a45780638da5cb5b146105e15761021a565b80633a05728d116101a65780635bbb2177116101755780635bbb2177146104475780636352211e146104845780636bcb4a24146104c157806370a08231146104ea578063715018a6146105275761021a565b80633a05728d146103b357806342842e0e146103dc57806342d0e74e14610405578063518302271461041c5761021a565b80630b191314116101ed5780630b191314146102ed578063145f3c271461031857806318160ddd1461034357806323b872dd1461036e5780632db11544146103975761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190612e10565b6108dd565b6040516102539190612e58565b60405180910390f35b34801561026857600080fd5b5061027161096f565b60405161027e9190612f0c565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190612f64565b610a01565b6040516102bb9190612fd2565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190613019565b610a7d565b005b3480156102f957600080fd5b50610302610c23565b60405161030f9190613068565b60405180910390f35b34801561032457600080fd5b5061032d610c29565b60405161033a9190613068565b60405180910390f35b34801561034f57600080fd5b50610358610c2f565b6040516103659190613068565b60405180910390f35b34801561037a57600080fd5b5061039560048036038101906103909190613083565b610c46565b005b6103b160048036038101906103ac9190612f64565b610c56565b005b3480156103bf57600080fd5b506103da60048036038101906103d591906132e1565b610d75565b005b3480156103e857600080fd5b5061040360048036038101906103fe9190613083565b610ee3565b005b34801561041157600080fd5b5061041a610f03565b005b34801561042857600080fd5b50610431610f9c565b60405161043e9190612e58565b60405180910390f35b34801561045357600080fd5b5061046e60048036038101906104699190613359565b610faf565b60405161047b91906134d4565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a69190612f64565b611070565b6040516104b89190612fd2565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e39190613359565b611082565b005b3480156104f657600080fd5b50610511600480360381019061050c91906134f6565b611167565b60405161051e9190613068565b60405180910390f35b34801561053357600080fd5b5061053c61121f565b005b34801561054a57600080fd5b5061056560048036038101906105609190612f64565b6112a7565b005b34801561057357600080fd5b5061058e600480360381019061058991906134f6565b6113e5565b60405161059b9190613068565b60405180910390f35b3480156105b057600080fd5b506105cb60048036038101906105c691906134f6565b6113fd565b6040516105d891906135e1565b60405180910390f35b3480156105ed57600080fd5b506105f6611540565b6040516106039190612fd2565b60405180910390f35b34801561061857600080fd5b5061062161156a565b60405161062e9190612f0c565b60405180910390f35b34801561064357600080fd5b5061065e60048036038101906106599190613603565b6115fc565b60405161066b91906135e1565b60405180910390f35b34801561068057600080fd5b5061069b6004803603810190610696919061370b565b611808565b005b3480156106a957600080fd5b506106c460048036038101906106bf9190613780565b61189e565b005b3480156106d257600080fd5b506106db611a15565b6040516106e89190612fd2565b60405180910390f35b3480156106fd57600080fd5b5061071860048036038101906107139190613861565b611a3b565b005b34801561072657600080fd5b50610741600480360381019061073c9190612f64565b611aae565b005b34801561074f57600080fd5b5061076a60048036038101906107659190612f64565b611b8e565b6040516107779190613926565b60405180910390f35b34801561078c57600080fd5b506107a760048036038101906107a29190612f64565b611bf8565b005b3480156107b557600080fd5b506107d060048036038101906107cb9190612f64565b611c7e565b6040516107dd9190612f0c565b60405180910390f35b3480156107f257600080fd5b5061080d600480360381019061080891906132e1565b611dcd565b005b34801561081b57600080fd5b50610824611f29565b6040516108319190613068565b60405180910390f35b34801561084657600080fd5b50610861600480360381019061085c9190612f64565b611f45565b60405161086e9190612e58565b60405180910390f35b34801561088357600080fd5b5061089e60048036038101906108999190613941565b611f65565b6040516108ab9190612e58565b60405180910390f35b3480156108c057600080fd5b506108db60048036038101906108d691906134f6565b611ff9565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061093857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109685750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461097e906139b0565b80601f01602080910402602001604051908101604052809291908181526020018280546109aa906139b0565b80156109f75780601f106109cc576101008083540402835291602001916109f7565b820191906000526020600020905b8154815290600101906020018083116109da57829003601f168201915b5050505050905090565b6000610a0c826120f0565b610a42576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a888261214f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610aef576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b0e61221b565b73ffffffffffffffffffffffffffffffffffffffff1614610b7157610b3a81610b3561221b565b611f65565b610b70576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60095481565b600a5481565b6000610c39612223565b6001546000540303905090565b610c5183838361222c565b505050565b8060095481610c63610c2f565b610c6d9190613a10565b1115610cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca590613ab2565b60405180910390fd5b34600a5483610cbd9190613ad2565b1115610cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf590613b78565b60405180910390fd5b610d0833836125d3565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015610d70573d6000803e3d6000fd5b505050565b610d7d6125f1565b73ffffffffffffffffffffffffffffffffffffffff16610d9b611540565b73ffffffffffffffffffffffffffffffffffffffff1614610df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de890613be4565b60405180910390fd5b8051825114610e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2c90613c50565b60405180910390fd5b60005b8251811015610ede57818181518110610e5457610e53613c70565b5b602002602001015160116000858481518110610e7357610e72613c70565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610ec49190613a10565b925050819055508080610ed690613c9f565b915050610e38565b505050565b610efe83838360405180602001604052806000815250611a3b565b505050565b610f0b6125f1565b73ffffffffffffffffffffffffffffffffffffffff16610f29611540565b73ffffffffffffffffffffffffffffffffffffffff1614610f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7690613be4565b60405180910390fd5b6001600b60006101000a81548160ff021916908315150217905550565b600b60009054906101000a900460ff1681565b606060008251905060008167ffffffffffffffff811115610fd357610fd26130db565b5b60405190808252806020026020018201604052801561100c57816020015b610ff9612cbe565b815260200190600190039081610ff15790505b50905060005b8281146110655761103c85828151811061102f5761102e613c70565b5b6020026020010151611b8e565b82828151811061104f5761104e613c70565b5b6020026020010181905250806001019050611012565b508092505050919050565b600061107b8261214f565b9050919050565b61108a6125f1565b73ffffffffffffffffffffffffffffffffffffffff166110a8611540565b73ffffffffffffffffffffffffffffffffffffffff16146110fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f590613be4565b60405180910390fd5b60005b81518110156111635760016010600084848151811061112357611122613c70565b5b6020026020010151815260200190815260200160002060006101000a81548160ff021916908315150217905550808061115b90613c9f565b915050611101565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111ce576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6112276125f1565b73ffffffffffffffffffffffffffffffffffffffff16611245611540565b73ffffffffffffffffffffffffffffffffffffffff161461129b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129290613be4565b60405180910390fd5b6112a560006125f9565b565b80600954816112b4610c2f565b6112be9190613a10565b11156112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f690613ab2565b60405180910390fd5b81601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137890613d33565b60405180910390fd5b81601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113d09190613d53565b925050819055506113e133836125d3565b5050565b60116020528060005260406000206000915090505481565b6060600080600061140d85611167565b905060008167ffffffffffffffff81111561142b5761142a6130db565b5b6040519080825280602002602001820160405280156114595781602001602082028036833780820191505090505b509050611464612cbe565b600061146e612223565b90505b83861461153257611481816126bf565b9150816040015161152757600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146114cc57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611526578083878060010198508151811061151957611518613c70565b5b6020026020010181815250505b5b806001019050611471565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611579906139b0565b80601f01602080910402602001604051908101604052809291908181526020018280546115a5906139b0565b80156115f25780601f106115c7576101008083540402835291602001916115f2565b820191906000526020600020905b8154815290600101906020018083116115d557829003601f168201915b5050505050905090565b6060818310611637576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806116426126ea565b905061164c612223565b85101561165e5761165b612223565b94505b8084111561166a578093505b600061167587611167565b905084861015611698576000868603905081811015611692578091505b5061169d565b600090505b60008167ffffffffffffffff8111156116b9576116b86130db565b5b6040519080825280602002602001820160405280156116e75781602001602082028036833780820191505090505b509050600082036116fe5780945050505050611801565b600061170988611b8e565b90506000816040015161171e57816000015190505b60008990505b8881141580156117345750848714155b156117f357611742816126bf565b925082604001516117e857600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461178d57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117e757808488806001019950815181106117da576117d9613c70565b5b6020026020010181815250505b5b806001019050611724565b508583528296505050505050505b9392505050565b6118106125f1565b73ffffffffffffffffffffffffffffffffffffffff1661182e611540565b73ffffffffffffffffffffffffffffffffffffffff1614611884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187b90613be4565b60405180910390fd5b80600c908051906020019061189a929190612d01565b5050565b6118a661221b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361190a576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061191761221b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119c461221b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a099190612e58565b60405180910390a35050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611a4684848461222c565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611aa857611a71848484846126f3565b611aa7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611ab66125f1565b73ffffffffffffffffffffffffffffffffffffffff16611ad4611540565b73ffffffffffffffffffffffffffffffffffffffff1614611b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2190613be4565b60405180910390fd5b60095481611b36610c2f565b611b409190613a10565b1115611b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7890613dd3565b60405180910390fd5b611b8b33826125d3565b50565b611b96612cbe565b611b9e612cbe565b611ba6612223565b831080611bba5750611bb66126ea565b8310155b15611bc85780915050611bf3565b611bd1836126bf565b9050806040015115611be65780915050611bf3565b611bef83612843565b9150505b919050565b611c006125f1565b73ffffffffffffffffffffffffffffffffffffffff16611c1e611540565b73ffffffffffffffffffffffffffffffffffffffff1614611c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6b90613be4565b60405180910390fd5b80600a8190555050565b6060611c89826120f0565b611cbf576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611cc9612863565b9050600b60009054906101000a900460ff1680611d0357506010600084815260200190815260200160002060009054906101000a900460ff165b611d9757600d8054611d14906139b0565b80601f0160208091040260200160405190810160405280929190818152602001828054611d40906139b0565b8015611d8d5780601f10611d6257610100808354040283529160200191611d8d565b820191906000526020600020905b815481529060010190602001808311611d7057829003601f168201915b5050505050611dc5565b80611da1846128f5565b600e604051602001611db593929190613ec3565b6040516020818303038152906040525b915050919050565b611dd56125f1565b73ffffffffffffffffffffffffffffffffffffffff16611df3611540565b73ffffffffffffffffffffffffffffffffffffffff1614611e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4090613be4565b60405180910390fd5b8051825114611e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8490613c50565b60405180910390fd5b60005b8251811015611f2457818181518110611eac57611eab613c70565b5b602002602001015160116000858481518110611ecb57611eca613c70565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080611f1c90613c9f565b915050611e90565b505050565b6000611f33610c2f565b600954611f409190613d53565b905090565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120016125f1565b73ffffffffffffffffffffffffffffffffffffffff1661201f611540565b73ffffffffffffffffffffffffffffffffffffffff1614612075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206c90613be4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120db90613f66565b60405180910390fd5b6120ed816125f9565b50565b6000816120fb612223565b1115801561210a575060005482105b8015612148575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000808290508061215e612223565b116121e4576000548110156121e35760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036121e1575b600081036121d75760046000836001900393508381526020019081526020016000205490506121ad565b8092505050612216565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b60006122378261214f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461229e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166122bf61221b565b73ffffffffffffffffffffffffffffffffffffffff1614806122ee57506122ed856122e861221b565b611f65565b5b8061233357506122fc61221b565b73ffffffffffffffffffffffffffffffffffffffff1661231b84610a01565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061236c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036123d2576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123df858585600161294f565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6124dc86612955565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316036125645760006001840190506000600460008381526020019081526020016000205403612562576000548114612561578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125cc858585600161295f565b5050505050565b6125ed828260405180602001604052806000815250612965565b5050565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126c7612cbe565b6126e36004600084815260200190815260200160002054612c18565b9050919050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261271961221b565b8786866040518563ffffffff1660e01b815260040161273b9493929190613fdb565b6020604051808303816000875af192505050801561277757506040513d601f19601f82011682018060405250810190612774919061403c565b60015b6127f0573d80600081146127a7576040519150601f19603f3d011682016040523d82523d6000602084013e6127ac565b606091505b5060008151036127e8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b61284b612cbe565b61285c6128578361214f565b612c18565b9050919050565b6060600c8054612872906139b0565b80601f016020809104026020016040519081016040528092919081815260200182805461289e906139b0565b80156128eb5780601f106128c0576101008083540402835291602001916128eb565b820191906000526020600020905b8154815290600101906020018083116128ce57829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561293b57600183039250600a81066030018353600a8104905061291b565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036129d1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612a0b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a18600085838661294f565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612a7d60018514612cb4565b901b60a042901b612a8d86612955565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612b91575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b4160008784806001019550876126f3565b612b77576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612ad2578260005414612b8c57600080fd5b612bfc565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612b92575b816000819055505050612c12600085838661295f565b50505050565b612c20612cbe565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c010000000000000000000000000000000000000000000000000000000083161415816040019015159081151581525050919050565b6000819050919050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b828054612d0d906139b0565b90600052602060002090601f016020900481019282612d2f5760008555612d76565b82601f10612d4857805160ff1916838001178555612d76565b82800160010185558215612d76579182015b82811115612d75578251825591602001919060010190612d5a565b5b509050612d839190612d87565b5090565b5b80821115612da0576000816000905550600101612d88565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ded81612db8565b8114612df857600080fd5b50565b600081359050612e0a81612de4565b92915050565b600060208284031215612e2657612e25612dae565b5b6000612e3484828501612dfb565b91505092915050565b60008115159050919050565b612e5281612e3d565b82525050565b6000602082019050612e6d6000830184612e49565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ead578082015181840152602081019050612e92565b83811115612ebc576000848401525b50505050565b6000601f19601f8301169050919050565b6000612ede82612e73565b612ee88185612e7e565b9350612ef8818560208601612e8f565b612f0181612ec2565b840191505092915050565b60006020820190508181036000830152612f268184612ed3565b905092915050565b6000819050919050565b612f4181612f2e565b8114612f4c57600080fd5b50565b600081359050612f5e81612f38565b92915050565b600060208284031215612f7a57612f79612dae565b5b6000612f8884828501612f4f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612fbc82612f91565b9050919050565b612fcc81612fb1565b82525050565b6000602082019050612fe76000830184612fc3565b92915050565b612ff681612fb1565b811461300157600080fd5b50565b60008135905061301381612fed565b92915050565b600080604083850312156130305761302f612dae565b5b600061303e85828601613004565b925050602061304f85828601612f4f565b9150509250929050565b61306281612f2e565b82525050565b600060208201905061307d6000830184613059565b92915050565b60008060006060848603121561309c5761309b612dae565b5b60006130aa86828701613004565b93505060206130bb86828701613004565b92505060406130cc86828701612f4f565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61311382612ec2565b810181811067ffffffffffffffff82111715613132576131316130db565b5b80604052505050565b6000613145612da4565b9050613151828261310a565b919050565b600067ffffffffffffffff821115613171576131706130db565b5b602082029050602081019050919050565b600080fd5b600061319a61319584613156565b61313b565b905080838252602082019050602084028301858111156131bd576131bc613182565b5b835b818110156131e657806131d28882613004565b8452602084019350506020810190506131bf565b5050509392505050565b600082601f830112613205576132046130d6565b5b8135613215848260208601613187565b91505092915050565b600067ffffffffffffffff821115613239576132386130db565b5b602082029050602081019050919050565b600061325d6132588461321e565b61313b565b905080838252602082019050602084028301858111156132805761327f613182565b5b835b818110156132a957806132958882612f4f565b845260208401935050602081019050613282565b5050509392505050565b600082601f8301126132c8576132c76130d6565b5b81356132d884826020860161324a565b91505092915050565b600080604083850312156132f8576132f7612dae565b5b600083013567ffffffffffffffff81111561331657613315612db3565b5b613322858286016131f0565b925050602083013567ffffffffffffffff81111561334357613342612db3565b5b61334f858286016132b3565b9150509250929050565b60006020828403121561336f5761336e612dae565b5b600082013567ffffffffffffffff81111561338d5761338c612db3565b5b613399848285016132b3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6133d781612fb1565b82525050565b600067ffffffffffffffff82169050919050565b6133fa816133dd565b82525050565b61340981612e3d565b82525050565b60608201600082015161342560008501826133ce565b50602082015161343860208501826133f1565b50604082015161344b6040850182613400565b50505050565b600061345d838361340f565b60608301905092915050565b6000602082019050919050565b6000613481826133a2565b61348b81856133ad565b9350613496836133be565b8060005b838110156134c75781516134ae8882613451565b97506134b983613469565b92505060018101905061349a565b5085935050505092915050565b600060208201905081810360008301526134ee8184613476565b905092915050565b60006020828403121561350c5761350b612dae565b5b600061351a84828501613004565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61355881612f2e565b82525050565b600061356a838361354f565b60208301905092915050565b6000602082019050919050565b600061358e82613523565b613598818561352e565b93506135a38361353f565b8060005b838110156135d45781516135bb888261355e565b97506135c683613576565b9250506001810190506135a7565b5085935050505092915050565b600060208201905081810360008301526135fb8184613583565b905092915050565b60008060006060848603121561361c5761361b612dae565b5b600061362a86828701613004565b935050602061363b86828701612f4f565b925050604061364c86828701612f4f565b9150509250925092565b600080fd5b600067ffffffffffffffff821115613676576136756130db565b5b61367f82612ec2565b9050602081019050919050565b82818337600083830152505050565b60006136ae6136a98461365b565b61313b565b9050828152602081018484840111156136ca576136c9613656565b5b6136d584828561368c565b509392505050565b600082601f8301126136f2576136f16130d6565b5b813561370284826020860161369b565b91505092915050565b60006020828403121561372157613720612dae565b5b600082013567ffffffffffffffff81111561373f5761373e612db3565b5b61374b848285016136dd565b91505092915050565b61375d81612e3d565b811461376857600080fd5b50565b60008135905061377a81613754565b92915050565b6000806040838503121561379757613796612dae565b5b60006137a585828601613004565b92505060206137b68582860161376b565b9150509250929050565b600067ffffffffffffffff8211156137db576137da6130db565b5b6137e482612ec2565b9050602081019050919050565b60006138046137ff846137c0565b61313b565b9050828152602081018484840111156138205761381f613656565b5b61382b84828561368c565b509392505050565b600082601f830112613848576138476130d6565b5b81356138588482602086016137f1565b91505092915050565b6000806000806080858703121561387b5761387a612dae565b5b600061388987828801613004565b945050602061389a87828801613004565b93505060406138ab87828801612f4f565b925050606085013567ffffffffffffffff8111156138cc576138cb612db3565b5b6138d887828801613833565b91505092959194509250565b6060820160008201516138fa60008501826133ce565b50602082015161390d60208501826133f1565b5060408201516139206040850182613400565b50505050565b600060608201905061393b60008301846138e4565b92915050565b6000806040838503121561395857613957612dae565b5b600061396685828601613004565b925050602061397785828601613004565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806139c857607f821691505b6020821081036139db576139da613981565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a1b82612f2e565b9150613a2683612f2e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a5b57613a5a6139e1565b5b828201905092915050565b7f416d6f756e74204578636565647320537570706c790000000000000000000000600082015250565b6000613a9c601583612e7e565b9150613aa782613a66565b602082019050919050565b60006020820190508181036000830152613acb81613a8f565b9050919050565b6000613add82612f2e565b9150613ae883612f2e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b2157613b206139e1565b5b828202905092915050565b7f496e73756666696369656e74204665652076616c756500000000000000000000600082015250565b6000613b62601683612e7e565b9150613b6d82613b2c565b602082019050919050565b60006020820190508181036000830152613b9181613b55565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613bce602083612e7e565b9150613bd982613b98565b602082019050919050565b60006020820190508181036000830152613bfd81613bc1565b9050919050565b7f4c656e6774682073686f756c642062652073616d650000000000000000000000600082015250565b6000613c3a601583612e7e565b9150613c4582613c04565b602082019050919050565b60006020820190508181036000830152613c6981613c2d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613caa82612f2e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613cdc57613cdb6139e1565b5b600182019050919050565b7f4672656520616c6c6f776564206973206c657373207468616e20616d6f756e74600082015250565b6000613d1d602083612e7e565b9150613d2882613ce7565b602082019050919050565b60006020820190508181036000830152613d4c81613d10565b9050919050565b6000613d5e82612f2e565b9150613d6983612f2e565b925082821015613d7c57613d7b6139e1565b5b828203905092915050565b7f416d6f756e742045786365656420737570706c79000000000000000000000000600082015250565b6000613dbd601483612e7e565b9150613dc882613d87565b602082019050919050565b60006020820190508181036000830152613dec81613db0565b9050919050565b600081905092915050565b6000613e0982612e73565b613e138185613df3565b9350613e23818560208601612e8f565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613e51816139b0565b613e5b8186613df3565b94506001821660008114613e765760018114613e8757613eba565b60ff19831686528186019350613eba565b613e9085613e2f565b60005b83811015613eb257815481890152600182019150602081019050613e93565b838801955050505b50505092915050565b6000613ecf8286613dfe565b9150613edb8285613dfe565b9150613ee78284613e44565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613f50602683612e7e565b9150613f5b82613ef4565b604082019050919050565b60006020820190508181036000830152613f7f81613f43565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613fad82613f86565b613fb78185613f91565b9350613fc7818560208601612e8f565b613fd081612ec2565b840191505092915050565b6000608082019050613ff06000830187612fc3565b613ffd6020830186612fc3565b61400a6040830185613059565b818103606083015261401c8184613fa2565b905095945050505050565b60008151905061403681612de4565b92915050565b60006020828403121561405257614051612dae565b5b600061406084828501614027565b9150509291505056fea2646970667358221220644bcfda0e4599fdcf4a5afd773e95033485a4243fc26b7d3759e5f2eb66961864736f6c634300080d0033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000008e1703e600f3a667482c4cedf9c5042c4f9e1fa50000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d577346473741386137646a38726e4e64375859344453367a514a6a704b3569716162324166547941784d6f642f000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d56317369397159427663656b71414e506146675635544b4448364773467558756958336f713933737a4531632f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseUri_ (string): ipfs://QmWsFG7A8a7dj8rnNd7XY4DS6zQJjpK5iqab2AfTyAxMod/
Arg [1] : unrevealedUri_ (string): ipfs://QmV1si9qYBvcekqANPaFgV5TKDH6GsFuXuiX3oq93szE1c/hidden.json
Arg [2] : feeReceiver_ (address): 0x8E1703E600f3A667482C4cedF9c5042c4F9E1fA5

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000008e1703e600f3a667482c4cedf9c5042c4f9e1fa5
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [4] : 697066733a2f2f516d577346473741386137646a38726e4e6437585934445336
Arg [5] : 7a514a6a704b3569716162324166547941784d6f642f00000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000041
Arg [7] : 697066733a2f2f516d56317369397159427663656b71414e506146675635544b
Arg [8] : 4448364773467558756958336f713933737a4531632f68696464656e2e6a736f
Arg [9] : 6e00000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

49156:4305:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14650:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19663:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21731:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21191:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49215:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49279:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13704:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22617:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52389:241;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53163:293;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22858:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50878:66;;;;;;;;;;;;;:::i;:::-;;49360:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41298:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19452:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51021:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15329:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48335:103;;;;;;;;;;;;;:::i;:::-;;52109:240;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49732:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45110:892;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47684:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19832:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42156:2505;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50459:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22007:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49558:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23114:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51855:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40719:420;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51244:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51454:361;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52697:284;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50258:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49644:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22386:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48593:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14650:615;14735:4;15050:10;15035:25;;:11;:25;;;;:102;;;;15127:10;15112:25;;:11;:25;;;;15035:102;:179;;;;15204:10;15189:25;;:11;:25;;;;15035:179;15015:199;;14650:615;;;:::o;19663:100::-;19717:13;19750:5;19743:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19663:100;:::o;21731:204::-;21799:7;21824:16;21832:7;21824;:16::i;:::-;21819:64;;21849:34;;;;;;;;;;;;;;21819:64;21903:15;:24;21919:7;21903:24;;;;;;;;;;;;;;;;;;;;;21896:31;;21731:204;;;:::o;21191:474::-;21264:13;21296:27;21315:7;21296:18;:27::i;:::-;21264:61;;21346:5;21340:11;;:2;:11;;;21336:48;;21360:24;;;;;;;;;;;;;;21336:48;21424:5;21401:28;;:19;:17;:19::i;:::-;:28;;;21397:175;;21449:44;21466:5;21473:19;:17;:19::i;:::-;21449:16;:44::i;:::-;21444:128;;21521:35;;;;;;;;;;;;;;21444:128;21397:175;21611:2;21584:15;:24;21600:7;21584:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;21649:7;21645:2;21629:28;;21638:5;21629:28;;;;;;;;;;;;21253:412;21191:474;;:::o;49215:33::-;;;;:::o;49279:41::-;;;;:::o;13704:315::-;13757:7;13985:15;:13;:15::i;:::-;13970:12;;13954:13;;:28;:46;13947:53;;13704:315;:::o;22617:170::-;22751:28;22761:4;22767:2;22771:7;22751:9;:28::i;:::-;22617:170;;;:::o;52389:241::-;52456:6;49965:10;;49955:6;49939:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;49931:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;52505:9:::1;52487:13;;52480:6;:20;;;;:::i;:::-;52479:35;;52471:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;52548:29;52558:10;52570:6;52548:9;:29::i;:::-;52592:11;;;;;;;;;;;52584:29;;:40;52614:9;52584:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;52389:241:::0;;:::o;53163:293::-;47915:12;:10;:12::i;:::-;47904:23;;:7;:5;:7::i;:::-;:23;;;47896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53302:8:::1;:15;53281:10;:17;:36;53273:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;53354:6;53350:101;53366:10;:17;53362:1;:21;53350:101;;;53432:8;53441:1;53432:11;;;;;;;;:::i;:::-;;;;;;;;53398:15;:30;53414:10;53425:1;53414:13;;;;;;;;:::i;:::-;;;;;;;;53398:30;;;;;;;;;;;;;;;;:45;;;;;;;:::i;:::-;;;;;;;;53385:3;;;;;:::i;:::-;;;;53350:101;;;;53163:293:::0;;:::o;22858:185::-;22996:39;23013:4;23019:2;23023:7;22996:39;;;;;;;;;;;;:16;:39::i;:::-;22858:185;;;:::o;50878:66::-;47915:12;:10;:12::i;:::-;47904:23;;:7;:5;:7::i;:::-;:23;;;47896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50934:4:::1;50923:8;;:15;;;;;;;;;;;;;;;;;;50878:66::o:0;49360:28::-;;;;;;;;;;;;;:::o;41298:468::-;41387:23;41448:22;41473:8;:15;41448:40;;41503:34;41561:14;41540:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;41503:73;;41596:9;41591:125;41612:14;41607:1;:19;41591:125;;41668:32;41688:8;41697:1;41688:11;;;;;;;;:::i;:::-;;;;;;;;41668:19;:32::i;:::-;41652:10;41663:1;41652:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;41628:3;;;;;41591:125;;;;41737:10;41730:17;;;;41298:468;;;:::o;19452:144::-;19516:7;19559:27;19578:7;19559:18;:27::i;:::-;19536:52;;19452:144;;;:::o;51021:175::-;47915:12;:10;:12::i;:::-;47904:23;;:7;:5;:7::i;:::-;:23;;;47896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51102:6:::1;51098:93;51114:9;:16;51110:1;:20;51098:93;;;51179:4;51145:17;:31;51163:9;51173:1;51163:12;;;;;;;;:::i;:::-;;;;;;;;51145:31;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;51132:3;;;;;:::i;:::-;;;;51098:93;;;;51021:175:::0;:::o;15329:224::-;15393:7;15434:1;15417:19;;:5;:19;;;15413:60;;15445:28;;;;;;;;;;;;;;15413:60;10668:13;15491:18;:25;15510:5;15491:25;;;;;;;;;;;;;;;;:54;15484:61;;15329:224;;;:::o;48335:103::-;47915:12;:10;:12::i;:::-;47904:23;;:7;:5;:7::i;:::-;:23;;;47896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48400:30:::1;48427:1;48400:18;:30::i;:::-;48335:103::o:0;52109:240::-;52166:6;49965:10;;49955:6;49939:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;49931:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;52220:6:::1;52189:15;:27;52205:10;52189:27;;;;;;;;;;;;;;;;:37;;52181:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;52301:6;52270:15;:27;52286:10;52270:27;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;52314:29;52324:10;52336:6;52314:9;:29::i;:::-;52109:240:::0;;:::o;49732:50::-;;;;;;;;;;;;;;;;;:::o;45110:892::-;45180:16;45234:19;45268:25;45308:22;45333:16;45343:5;45333:9;:16::i;:::-;45308:41;;45364:25;45406:14;45392:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45364:57;;45436:31;;:::i;:::-;45487:9;45499:15;:13;:15::i;:::-;45487:27;;45482:472;45531:14;45516:11;:29;45482:472;;45583:15;45596:1;45583:12;:15::i;:::-;45571:27;;45621:9;:16;;;45662:8;45617:73;45738:1;45712:28;;:9;:14;;;:28;;;45708:111;;45785:9;:14;;;45765:34;;45708:111;45862:5;45841:26;;:17;:26;;;45837:102;;45918:1;45892:8;45901:13;;;;;;45892:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;45837:102;45482:472;45547:3;;;;;45482:472;;;;45975:8;45968:15;;;;;;;45110:892;;;:::o;47684:87::-;47730:7;47757:6;;;;;;;;;;;47750:13;;47684:87;:::o;19832:104::-;19888:13;19921:7;19914:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19832:104;:::o;42156:2505::-;42291:16;42358:4;42349:5;:13;42345:45;;42371:19;;;;;;;;;;;;;;42345:45;42405:19;42439:17;42459:14;:12;:14::i;:::-;42439:34;;42559:15;:13;:15::i;:::-;42551:5;:23;42547:87;;;42603:15;:13;:15::i;:::-;42595:23;;42547:87;42710:9;42703:4;:16;42699:73;;;42747:9;42740:16;;42699:73;42786:25;42814:16;42824:5;42814:9;:16::i;:::-;42786:44;;43008:4;43000:5;:12;42996:278;;;43033:19;43062:5;43055:4;:12;43033:34;;43104:17;43090:11;:31;43086:111;;;43166:11;43146:31;;43086:111;43014:198;42996:278;;;43257:1;43237:21;;42996:278;43288:25;43330:17;43316:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43288:60;;43388:1;43367:17;:22;43363:78;;43417:8;43410:15;;;;;;;;43363:78;43585:31;43619:26;43639:5;43619:19;:26::i;:::-;43585:60;;43660:25;43905:9;:16;;;43900:92;;43962:9;:14;;;43942:34;;43900:92;44011:9;44023:5;44011:17;;44006:478;44035:4;44030:1;:9;;:45;;;;;44058:17;44043:11;:32;;44030:45;44006:478;;;44113:15;44126:1;44113:12;:15::i;:::-;44101:27;;44151:9;:16;;;44192:8;44147:73;44268:1;44242:28;;:9;:14;;;:28;;;44238:111;;44315:9;:14;;;44295:34;;44238:111;44392:5;44371:26;;:17;:26;;;44367:102;;44448:1;44422:8;44431:13;;;;;;44422:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;44367:102;44006:478;44077:3;;;;;44006:478;;;;44586:11;44576:8;44569:29;44634:8;44627:15;;;;;;;;42156:2505;;;;;;:::o;50459:92::-;47915:12;:10;:12::i;:::-;47904:23;;:7;:5;:7::i;:::-;:23;;;47896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50537:8:::1;50527:7;:18;;;;;;;;;;;;:::i;:::-;;50459:92:::0;:::o;22007:308::-;22118:19;:17;:19::i;:::-;22106:31;;:8;:31;;;22102:61;;22146:17;;;;;;;;;;;;;;22102:61;22228:8;22176:18;:39;22195:19;:17;:19::i;:::-;22176:39;;;;;;;;;;;;;;;:49;22216:8;22176:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;22288:8;22252:55;;22267:19;:17;:19::i;:::-;22252:55;;;22298:8;22252:55;;;;;;:::i;:::-;;;;;;;;22007:308;;:::o;49558:26::-;;;;;;;;;;;;;:::o;23114:396::-;23281:28;23291:4;23297:2;23301:7;23281:9;:28::i;:::-;23342:1;23324:2;:14;;;:19;23320:183;;23363:56;23394:4;23400:2;23404:7;23413:5;23363:30;:56::i;:::-;23358:145;;23447:40;;;;;;;;;;;;;;23358:145;23320:183;23114:396;;;;:::o;51855:170::-;47915:12;:10;:12::i;:::-;47904:23;;:7;:5;:7::i;:::-;:23;;;47896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51948:10:::1;;51938:6;51922:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;51914:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51990:29;52000:10;52012:6;51990:9;:29::i;:::-;51855:170:::0;:::o;40719:420::-;40795:21;;:::i;:::-;40829:31;;:::i;:::-;40885:15;:13;:15::i;:::-;40875:7;:25;:54;;;;40915:14;:12;:14::i;:::-;40904:7;:25;;40875:54;40871:103;;;40953:9;40946:16;;;;;40871:103;40996:21;41009:7;40996:12;:21::i;:::-;40984:33;;41032:9;:16;;;41028:65;;;41072:9;41065:16;;;;;41028:65;41110:21;41123:7;41110:12;:21::i;:::-;41103:28;;;40719:420;;;;:::o;51244:99::-;47915:12;:10;:12::i;:::-;47904:23;;:7;:5;:7::i;:::-;:23;;;47896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51330:7:::1;51314:13;:23;;;;51244:99:::0;:::o;51454:361::-;51546:13;51573:16;51581:7;51573;:16::i;:::-;51568:59;;51598:29;;;;;;;;;;;;;;51568:59;51636:21;51660:10;:8;:10::i;:::-;51636:34;;51684:8;;;;;;;;;;;:38;;;;51696:17;:26;51714:7;51696:26;;;;;;;;;;;;;;;;;;;;;51684:38;:125;;51796:13;51684:125;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51749:7;51758:18;51768:7;51758:9;:18::i;:::-;51778:13;51732:60;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51684:125;51677:132;;;51454:361;;;:::o;52697:284::-;47915:12;:10;:12::i;:::-;47904:23;;:7;:5;:7::i;:::-;:23;;;47896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52828:8:::1;:15;52808:10;:17;:35;52800:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52880:6;52876:100;52892:10;:17;52888:1;:21;52876:100;;;52957:8;52966:1;52957:11;;;;;;;;:::i;:::-;;;;;;;;52924:15;:30;52940:10;52951:1;52940:13;;;;;;;;:::i;:::-;;;;;;;;52924:30;;;;;;;;;;;;;;;:44;;;;52911:3;;;;;:::i;:::-;;;;52876:100;;;;52697:284:::0;;:::o;50258:102::-;50305:7;50341:13;:11;:13::i;:::-;50328:10;;:26;;;;:::i;:::-;50321:33;;50258:102;:::o;49644:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;22386:164::-;22483:4;22507:18;:25;22526:5;22507:25;;;;;;;;;;;;;;;:35;22533:8;22507:35;;;;;;;;;;;;;;;;;;;;;;;;;22500:42;;22386:164;;;;:::o;48593:201::-;47915:12;:10;:12::i;:::-;47904:23;;:7;:5;:7::i;:::-;:23;;;47896:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48702:1:::1;48682:22;;:8;:22;;::::0;48674:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;48758:28;48777:8;48758:18;:28::i;:::-;48593:201:::0;:::o;23765:273::-;23822:4;23878:7;23859:15;:13;:15::i;:::-;:26;;:66;;;;;23912:13;;23902:7;:23;23859:66;:152;;;;;24010:1;11438:8;23963:17;:26;23981:7;23963:26;;;;;;;;;;;;:43;:48;23859:152;23839:172;;23765:273;;;:::o;16967:1129::-;17034:7;17054:12;17069:7;17054:22;;17137:4;17118:15;:13;:15::i;:::-;:23;17114:915;;17171:13;;17164:4;:20;17160:869;;;17209:14;17226:17;:23;17244:4;17226:23;;;;;;;;;;;;17209:40;;17342:1;11438:8;17315:6;:23;:28;17311:699;;17834:113;17851:1;17841:6;:11;17834:113;;17894:17;:25;17912:6;;;;;;;17894:25;;;;;;;;;;;;17885:34;;17834:113;;;17980:6;17973:13;;;;;;17311:699;17186:843;17160:869;17114:915;18057:31;;;;;;;;;;;;;;16967:1129;;;;:::o;37747:105::-;37807:7;37834:10;37827:17;;37747:105;:::o;50366:87::-;50423:7;50446:1;50439:8;;50366:87;:::o;29004:2515::-;29119:27;29149;29168:7;29149:18;:27::i;:::-;29119:57;;29234:4;29193:45;;29209:19;29193:45;;;29189:86;;29247:28;;;;;;;;;;;;;;29189:86;29288:22;29337:4;29314:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;29358:43;29375:4;29381:19;:17;:19::i;:::-;29358:16;:43::i;:::-;29314:87;:147;;;;29442:19;:17;:19::i;:::-;29418:43;;:20;29430:7;29418:11;:20::i;:::-;:43;;;29314:147;29288:174;;29480:17;29475:66;;29506:35;;;;;;;;;;;;;;29475:66;29570:1;29556:16;;:2;:16;;;29552:52;;29581:23;;;;;;;;;;;;;;29552:52;29617:43;29639:4;29645:2;29649:7;29658:1;29617:21;:43::i;:::-;29733:15;:24;29749:7;29733:24;;;;;;;;;;;;29726:31;;;;;;;;;;;30125:18;:24;30144:4;30125:24;;;;;;;;;;;;;;;;30123:26;;;;;;;;;;;;30194:18;:22;30213:2;30194:22;;;;;;;;;;;;;;;;30192:24;;;;;;;;;;;11720:8;11322:3;30575:15;:41;;30533:21;30551:2;30533:17;:21::i;:::-;:84;:128;30487:17;:26;30505:7;30487:26;;;;;;;;;;;:174;;;;30831:1;11720:8;30781:19;:46;:51;30777:626;;30853:19;30885:1;30875:7;:11;30853:33;;31042:1;31008:17;:30;31026:11;31008:30;;;;;;;;;;;;:35;31004:384;;31146:13;;31131:11;:28;31127:242;;31326:19;31293:17;:30;31311:11;31293:30;;;;;;;;;;;:52;;;;31127:242;31004:384;30834:569;30777:626;31450:7;31446:2;31431:27;;31440:4;31431:27;;;;;;;;;;;;31469:42;31490:4;31496:2;31500:7;31509:1;31469:20;:42::i;:::-;29108:2411;;29004:2515;;;:::o;24122:104::-;24191:27;24201:2;24205:8;24191:27;;;;;;;;;;;;:9;:27::i;:::-;24122:104;;:::o;46549:98::-;46602:7;46629:10;46622:17;;46549:98;:::o;48954:191::-;49028:16;49047:6;;;;;;;;;;;49028:25;;49073:8;49064:6;;:17;;;;;;;;;;;;;;;;;;49128:8;49097:40;;49118:8;49097:40;;;;;;;;;;;;49017:128;48954:191;:::o;18576:153::-;18636:21;;:::i;:::-;18677:44;18696:17;:24;18714:5;18696:24;;;;;;;;;;;;18677:18;:44::i;:::-;18670:51;;18576:153;;;:::o;13398:95::-;13445:7;13472:13;;13465:20;;13398:95;:::o;35216:716::-;35379:4;35425:2;35400:45;;;35446:19;:17;:19::i;:::-;35467:4;35473:7;35482:5;35400:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35396:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35700:1;35683:6;:13;:18;35679:235;;35729:40;;;;;;;;;;;;;;35679:235;35872:6;35866:13;35857:6;35853:2;35849:15;35842:38;35396:529;35569:54;;;35559:64;;;:6;:64;;;;35552:71;;;35216:716;;;;;;:::o;19232:158::-;19294:21;;:::i;:::-;19335:47;19354:27;19373:7;19354:18;:27::i;:::-;19335:18;:47::i;:::-;19328:54;;19232:158;;;:::o;50648:104::-;50708:13;50739:7;50732:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50648:104;:::o;37958:1959::-;38015:17;38436:3;38429:4;38423:11;38419:21;38412:28;;38527:3;38521:4;38514:17;38633:3;39090:5;39220:1;39215:3;39211:11;39204:18;;39357:2;39351:4;39347:13;39343:2;39339:22;39334:3;39326:36;39398:2;39392:4;39388:13;39380:21;;38981:682;39417:4;38981:682;;;39592:1;39587:3;39583:11;39576:18;;39643:2;39637:4;39633:13;39629:2;39625:22;39620:3;39612:36;39513:2;39507:4;39503:13;39495:21;;38981:682;;;38985:431;39714:3;39709;39705:13;39829:2;39824:3;39820:12;39813:19;;39892:6;39887:3;39880:19;38054:1856;;37958:1959;;;:::o;36580:159::-;;;;;:::o;20752:148::-;20816:14;20877:5;20867:15;;20752:148;;;:::o;37398:158::-;;;;;:::o;24599:2236::-;24722:20;24745:13;;24722:36;;24787:1;24773:16;;:2;:16;;;24769:48;;24798:19;;;;;;;;;;;;;;24769:48;24844:1;24832:8;:13;24828:44;;24854:18;;;;;;;;;;;;;;24828:44;24885:61;24915:1;24919:2;24923:12;24937:8;24885:21;:61::i;:::-;25489:1;10805:2;25460:1;:25;;25459:31;25447:8;:44;25421:18;:22;25440:2;25421:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;11585:3;25890:29;25917:1;25905:8;:13;25890:14;:29::i;:::-;:56;;11322:3;25827:15;:41;;25785:21;25803:2;25785:17;:21::i;:::-;:84;:162;25734:17;:31;25752:12;25734:31;;;;;;;;;;;:213;;;;25964:20;25987:12;25964:35;;26014:11;26043:8;26028:12;:23;26014:37;;26090:1;26072:2;:14;;;:19;26068:635;;26112:313;26168:12;26164:2;26143:38;;26160:1;26143:38;;;;;;;;;;;;26209:69;26248:1;26252:2;26256:14;;;;;;26272:5;26209:30;:69::i;:::-;26204:174;;26314:40;;;;;;;;;;;;;;26204:174;26420:3;26405:12;:18;26112:313;;26506:12;26489:13;;:29;26485:43;;26520:8;;;26485:43;26068:635;;;26569:119;26625:14;;;;;;26621:2;26600:40;;26617:1;26600:40;;;;;;;;;;;;26683:3;26668:12;:18;26569:119;;26068:635;26733:12;26717:13;:28;;;;25198:1559;;26767:60;26796:1;26800:2;26804:12;26818:8;26767:20;:60::i;:::-;24711:2124;24599:2236;;;:::o;18190:295::-;18256:31;;:::i;:::-;18333:6;18300:9;:14;;:41;;;;;;;;;;;11322:3;18386:6;:32;;18352:9;:24;;:67;;;;;;;;;;;18476:1;11438:8;18449:6;:23;:28;;18430:9;:16;;:47;;;;;;;;;;;18190:295;;;:::o;20987:142::-;21045:14;21106:5;21096:15;;20987:142;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:180;6086:77;6083:1;6076:88;6183:4;6180:1;6173:15;6207:4;6204:1;6197:15;6224:281;6307:27;6329:4;6307:27;:::i;:::-;6299:6;6295:40;6437:6;6425:10;6422:22;6401:18;6389:10;6386:34;6383:62;6380:88;;;6448:18;;:::i;:::-;6380:88;6488:10;6484:2;6477:22;6267:238;6224:281;;:::o;6511:129::-;6545:6;6572:20;;:::i;:::-;6562:30;;6601:33;6629:4;6621:6;6601:33;:::i;:::-;6511:129;;;:::o;6646:311::-;6723:4;6813:18;6805:6;6802:30;6799:56;;;6835:18;;:::i;:::-;6799:56;6885:4;6877:6;6873:17;6865:25;;6945:4;6939;6935:15;6927:23;;6646:311;;;:::o;6963:117::-;7072:1;7069;7062:12;7103:710;7199:5;7224:81;7240:64;7297:6;7240:64;:::i;:::-;7224:81;:::i;:::-;7215:90;;7325:5;7354:6;7347:5;7340:21;7388:4;7381:5;7377:16;7370:23;;7441:4;7433:6;7429:17;7421:6;7417:30;7470:3;7462:6;7459:15;7456:122;;;7489:79;;:::i;:::-;7456:122;7604:6;7587:220;7621:6;7616:3;7613:15;7587:220;;;7696:3;7725:37;7758:3;7746:10;7725:37;:::i;:::-;7720:3;7713:50;7792:4;7787:3;7783:14;7776:21;;7663:144;7647:4;7642:3;7638:14;7631:21;;7587:220;;;7591:21;7205:608;;7103:710;;;;;:::o;7836:370::-;7907:5;7956:3;7949:4;7941:6;7937:17;7933:27;7923:122;;7964:79;;:::i;:::-;7923:122;8081:6;8068:20;8106:94;8196:3;8188:6;8181:4;8173:6;8169:17;8106:94;:::i;:::-;8097:103;;7913:293;7836:370;;;;:::o;8212:311::-;8289:4;8379:18;8371:6;8368:30;8365:56;;;8401:18;;:::i;:::-;8365:56;8451:4;8443:6;8439:17;8431:25;;8511:4;8505;8501:15;8493:23;;8212:311;;;:::o;8546:710::-;8642:5;8667:81;8683:64;8740:6;8683:64;:::i;:::-;8667:81;:::i;:::-;8658:90;;8768:5;8797:6;8790:5;8783:21;8831:4;8824:5;8820:16;8813:23;;8884:4;8876:6;8872:17;8864:6;8860:30;8913:3;8905:6;8902:15;8899:122;;;8932:79;;:::i;:::-;8899:122;9047:6;9030:220;9064:6;9059:3;9056:15;9030:220;;;9139:3;9168:37;9201:3;9189:10;9168:37;:::i;:::-;9163:3;9156:50;9235:4;9230:3;9226:14;9219:21;;9106:144;9090:4;9085:3;9081:14;9074:21;;9030:220;;;9034:21;8648:608;;8546:710;;;;;:::o;9279:370::-;9350:5;9399:3;9392:4;9384:6;9380:17;9376:27;9366:122;;9407:79;;:::i;:::-;9366:122;9524:6;9511:20;9549:94;9639:3;9631:6;9624:4;9616:6;9612:17;9549:94;:::i;:::-;9540:103;;9356:293;9279:370;;;;:::o;9655:894::-;9773:6;9781;9830:2;9818:9;9809:7;9805:23;9801:32;9798:119;;;9836:79;;:::i;:::-;9798:119;9984:1;9973:9;9969:17;9956:31;10014:18;10006:6;10003:30;10000:117;;;10036:79;;:::i;:::-;10000:117;10141:78;10211:7;10202:6;10191:9;10187:22;10141:78;:::i;:::-;10131:88;;9927:302;10296:2;10285:9;10281:18;10268:32;10327:18;10319:6;10316:30;10313:117;;;10349:79;;:::i;:::-;10313:117;10454:78;10524:7;10515:6;10504:9;10500:22;10454:78;:::i;:::-;10444:88;;10239:303;9655:894;;;;;:::o;10555:539::-;10639:6;10688:2;10676:9;10667:7;10663:23;10659:32;10656:119;;;10694:79;;:::i;:::-;10656:119;10842:1;10831:9;10827:17;10814:31;10872:18;10864:6;10861:30;10858:117;;;10894:79;;:::i;:::-;10858:117;10999:78;11069:7;11060:6;11049:9;11045:22;10999:78;:::i;:::-;10989:88;;10785:302;10555:539;;;;:::o;11100:144::-;11197:6;11231:5;11225:12;11215:22;;11100:144;;;:::o;11250:214::-;11379:11;11413:6;11408:3;11401:19;11453:4;11448:3;11444:14;11429:29;;11250:214;;;;:::o;11470:162::-;11567:4;11590:3;11582:11;;11620:4;11615:3;11611:14;11603:22;;11470:162;;;:::o;11638:108::-;11715:24;11733:5;11715:24;:::i;:::-;11710:3;11703:37;11638:108;;:::o;11752:101::-;11788:7;11828:18;11821:5;11817:30;11806:41;;11752:101;;;:::o;11859:105::-;11934:23;11951:5;11934:23;:::i;:::-;11929:3;11922:36;11859:105;;:::o;11970:99::-;12041:21;12056:5;12041:21;:::i;:::-;12036:3;12029:34;11970:99;;:::o;12147:685::-;12294:4;12289:3;12285:14;12381:4;12374:5;12370:16;12364:23;12400:63;12457:4;12452:3;12448:14;12434:12;12400:63;:::i;:::-;12309:164;12565:4;12558:5;12554:16;12548:23;12584:61;12639:4;12634:3;12630:14;12616:12;12584:61;:::i;:::-;12483:172;12739:4;12732:5;12728:16;12722:23;12758:57;12809:4;12804:3;12800:14;12786:12;12758:57;:::i;:::-;12665:160;12263:569;12147:685;;:::o;12838:299::-;12967:10;12988:106;13090:3;13082:6;12988:106;:::i;:::-;13126:4;13121:3;13117:14;13103:28;;12838:299;;;;:::o;13143:143::-;13243:4;13275;13270:3;13266:14;13258:22;;13143:143;;;:::o;13368:972::-;13547:3;13576:84;13654:5;13576:84;:::i;:::-;13676:116;13785:6;13780:3;13676:116;:::i;:::-;13669:123;;13816:86;13896:5;13816:86;:::i;:::-;13925:7;13956:1;13941:374;13966:6;13963:1;13960:13;13941:374;;;14042:6;14036:13;14069:123;14188:3;14173:13;14069:123;:::i;:::-;14062:130;;14215:90;14298:6;14215:90;:::i;:::-;14205:100;;14001:314;13988:1;13985;13981:9;13976:14;;13941:374;;;13945:14;14331:3;14324:10;;13552:788;;;13368:972;;;;:::o;14346:493::-;14549:4;14587:2;14576:9;14572:18;14564:26;;14636:9;14630:4;14626:20;14622:1;14611:9;14607:17;14600:47;14664:168;14827:4;14818:6;14664:168;:::i;:::-;14656:176;;14346:493;;;;:::o;14845:329::-;14904:6;14953:2;14941:9;14932:7;14928:23;14924:32;14921:119;;;14959:79;;:::i;:::-;14921:119;15079:1;15104:53;15149:7;15140:6;15129:9;15125:22;15104:53;:::i;:::-;15094:63;;15050:117;14845:329;;;;:::o;15180:114::-;15247:6;15281:5;15275:12;15265:22;;15180:114;;;:::o;15300:184::-;15399:11;15433:6;15428:3;15421:19;15473:4;15468:3;15464:14;15449:29;;15300:184;;;;:::o;15490:132::-;15557:4;15580:3;15572:11;;15610:4;15605:3;15601:14;15593:22;;15490:132;;;:::o;15628:108::-;15705:24;15723:5;15705:24;:::i;:::-;15700:3;15693:37;15628:108;;:::o;15742:179::-;15811:10;15832:46;15874:3;15866:6;15832:46;:::i;:::-;15910:4;15905:3;15901:14;15887:28;;15742:179;;;;:::o;15927:113::-;15997:4;16029;16024:3;16020:14;16012:22;;15927:113;;;:::o;16076:732::-;16195:3;16224:54;16272:5;16224:54;:::i;:::-;16294:86;16373:6;16368:3;16294:86;:::i;:::-;16287:93;;16404:56;16454:5;16404:56;:::i;:::-;16483:7;16514:1;16499:284;16524:6;16521:1;16518:13;16499:284;;;16600:6;16594:13;16627:63;16686:3;16671:13;16627:63;:::i;:::-;16620:70;;16713:60;16766:6;16713:60;:::i;:::-;16703:70;;16559:224;16546:1;16543;16539:9;16534:14;;16499:284;;;16503:14;16799:3;16792:10;;16200:608;;;16076:732;;;;:::o;16814:373::-;16957:4;16995:2;16984:9;16980:18;16972:26;;17044:9;17038:4;17034:20;17030:1;17019:9;17015:17;17008:47;17072:108;17175:4;17166:6;17072:108;:::i;:::-;17064:116;;16814:373;;;;:::o;17193:619::-;17270:6;17278;17286;17335:2;17323:9;17314:7;17310:23;17306:32;17303:119;;;17341:79;;:::i;:::-;17303:119;17461:1;17486:53;17531:7;17522:6;17511:9;17507:22;17486:53;:::i;:::-;17476:63;;17432:117;17588:2;17614:53;17659:7;17650:6;17639:9;17635:22;17614:53;:::i;:::-;17604:63;;17559:118;17716:2;17742:53;17787:7;17778:6;17767:9;17763:22;17742:53;:::i;:::-;17732:63;;17687:118;17193:619;;;;;:::o;17818:117::-;17927:1;17924;17917:12;17941:308;18003:4;18093:18;18085:6;18082:30;18079:56;;;18115:18;;:::i;:::-;18079:56;18153:29;18175:6;18153:29;:::i;:::-;18145:37;;18237:4;18231;18227:15;18219:23;;17941:308;;;:::o;18255:154::-;18339:6;18334:3;18329;18316:30;18401:1;18392:6;18387:3;18383:16;18376:27;18255:154;;;:::o;18415:412::-;18493:5;18518:66;18534:49;18576:6;18534:49;:::i;:::-;18518:66;:::i;:::-;18509:75;;18607:6;18600:5;18593:21;18645:4;18638:5;18634:16;18683:3;18674:6;18669:3;18665:16;18662:25;18659:112;;;18690:79;;:::i;:::-;18659:112;18780:41;18814:6;18809:3;18804;18780:41;:::i;:::-;18499:328;18415:412;;;;;:::o;18847:340::-;18903:5;18952:3;18945:4;18937:6;18933:17;18929:27;18919:122;;18960:79;;:::i;:::-;18919:122;19077:6;19064:20;19102:79;19177:3;19169:6;19162:4;19154:6;19150:17;19102:79;:::i;:::-;19093:88;;18909:278;18847:340;;;;:::o;19193:509::-;19262:6;19311:2;19299:9;19290:7;19286:23;19282:32;19279:119;;;19317:79;;:::i;:::-;19279:119;19465:1;19454:9;19450:17;19437:31;19495:18;19487:6;19484:30;19481:117;;;19517:79;;:::i;:::-;19481:117;19622:63;19677:7;19668:6;19657:9;19653:22;19622:63;:::i;:::-;19612:73;;19408:287;19193:509;;;;:::o;19708:116::-;19778:21;19793:5;19778:21;:::i;:::-;19771:5;19768:32;19758:60;;19814:1;19811;19804:12;19758:60;19708:116;:::o;19830:133::-;19873:5;19911:6;19898:20;19889:29;;19927:30;19951:5;19927:30;:::i;:::-;19830:133;;;;:::o;19969:468::-;20034:6;20042;20091:2;20079:9;20070:7;20066:23;20062:32;20059:119;;;20097:79;;:::i;:::-;20059:119;20217:1;20242:53;20287:7;20278:6;20267:9;20263:22;20242:53;:::i;:::-;20232:63;;20188:117;20344:2;20370:50;20412:7;20403:6;20392:9;20388:22;20370:50;:::i;:::-;20360:60;;20315:115;19969:468;;;;;:::o;20443:307::-;20504:4;20594:18;20586:6;20583:30;20580:56;;;20616:18;;:::i;:::-;20580:56;20654:29;20676:6;20654:29;:::i;:::-;20646:37;;20738:4;20732;20728:15;20720:23;;20443:307;;;:::o;20756:410::-;20833:5;20858:65;20874:48;20915:6;20874:48;:::i;:::-;20858:65;:::i;:::-;20849:74;;20946:6;20939:5;20932:21;20984:4;20977:5;20973:16;21022:3;21013:6;21008:3;21004:16;21001:25;20998:112;;;21029:79;;:::i;:::-;20998:112;21119:41;21153:6;21148:3;21143;21119:41;:::i;:::-;20839:327;20756:410;;;;;:::o;21185:338::-;21240:5;21289:3;21282:4;21274:6;21270:17;21266:27;21256:122;;21297:79;;:::i;:::-;21256:122;21414:6;21401:20;21439:78;21513:3;21505:6;21498:4;21490:6;21486:17;21439:78;:::i;:::-;21430:87;;21246:277;21185:338;;;;:::o;21529:943::-;21624:6;21632;21640;21648;21697:3;21685:9;21676:7;21672:23;21668:33;21665:120;;;21704:79;;:::i;:::-;21665:120;21824:1;21849:53;21894:7;21885:6;21874:9;21870:22;21849:53;:::i;:::-;21839:63;;21795:117;21951:2;21977:53;22022:7;22013:6;22002:9;21998:22;21977:53;:::i;:::-;21967:63;;21922:118;22079:2;22105:53;22150:7;22141:6;22130:9;22126:22;22105:53;:::i;:::-;22095:63;;22050:118;22235:2;22224:9;22220:18;22207:32;22266:18;22258:6;22255:30;22252:117;;;22288:79;;:::i;:::-;22252:117;22393:62;22447:7;22438:6;22427:9;22423:22;22393:62;:::i;:::-;22383:72;;22178:287;21529:943;;;;;;;:::o;22550:695::-;22707:4;22702:3;22698:14;22794:4;22787:5;22783:16;22777:23;22813:63;22870:4;22865:3;22861:14;22847:12;22813:63;:::i;:::-;22722:164;22978:4;22971:5;22967:16;22961:23;22997:61;23052:4;23047:3;23043:14;23029:12;22997:61;:::i;:::-;22896:172;23152:4;23145:5;23141:16;23135:23;23171:57;23222:4;23217:3;23213:14;23199:12;23171:57;:::i;:::-;23078:160;22676:569;22550:695;;:::o;23251:342::-;23404:4;23442:2;23431:9;23427:18;23419:26;;23455:131;23583:1;23572:9;23568:17;23559:6;23455:131;:::i;:::-;23251:342;;;;:::o;23599:474::-;23667:6;23675;23724:2;23712:9;23703:7;23699:23;23695:32;23692:119;;;23730:79;;:::i;:::-;23692:119;23850:1;23875:53;23920:7;23911:6;23900:9;23896:22;23875:53;:::i;:::-;23865:63;;23821:117;23977:2;24003:53;24048:7;24039:6;24028:9;24024:22;24003:53;:::i;:::-;23993:63;;23948:118;23599:474;;;;;:::o;24079:180::-;24127:77;24124:1;24117:88;24224:4;24221:1;24214:15;24248:4;24245:1;24238:15;24265:320;24309:6;24346:1;24340:4;24336:12;24326:22;;24393:1;24387:4;24383:12;24414:18;24404:81;;24470:4;24462:6;24458:17;24448:27;;24404:81;24532:2;24524:6;24521:14;24501:18;24498:38;24495:84;;24551:18;;:::i;:::-;24495:84;24316:269;24265:320;;;:::o;24591:180::-;24639:77;24636:1;24629:88;24736:4;24733:1;24726:15;24760:4;24757:1;24750:15;24777:305;24817:3;24836:20;24854:1;24836:20;:::i;:::-;24831:25;;24870:20;24888:1;24870:20;:::i;:::-;24865:25;;25024:1;24956:66;24952:74;24949:1;24946:81;24943:107;;;25030:18;;:::i;:::-;24943:107;25074:1;25071;25067:9;25060:16;;24777:305;;;;:::o;25088:171::-;25228:23;25224:1;25216:6;25212:14;25205:47;25088:171;:::o;25265:366::-;25407:3;25428:67;25492:2;25487:3;25428:67;:::i;:::-;25421:74;;25504:93;25593:3;25504:93;:::i;:::-;25622:2;25617:3;25613:12;25606:19;;25265:366;;;:::o;25637:419::-;25803:4;25841:2;25830:9;25826:18;25818:26;;25890:9;25884:4;25880:20;25876:1;25865:9;25861:17;25854:47;25918:131;26044:4;25918:131;:::i;:::-;25910:139;;25637:419;;;:::o;26062:348::-;26102:7;26125:20;26143:1;26125:20;:::i;:::-;26120:25;;26159:20;26177:1;26159:20;:::i;:::-;26154:25;;26347:1;26279:66;26275:74;26272:1;26269:81;26264:1;26257:9;26250:17;26246:105;26243:131;;;26354:18;;:::i;:::-;26243:131;26402:1;26399;26395:9;26384:20;;26062:348;;;;:::o;26416:172::-;26556:24;26552:1;26544:6;26540:14;26533:48;26416:172;:::o;26594:366::-;26736:3;26757:67;26821:2;26816:3;26757:67;:::i;:::-;26750:74;;26833:93;26922:3;26833:93;:::i;:::-;26951:2;26946:3;26942:12;26935:19;;26594:366;;;:::o;26966:419::-;27132:4;27170:2;27159:9;27155:18;27147:26;;27219:9;27213:4;27209:20;27205:1;27194:9;27190:17;27183:47;27247:131;27373:4;27247:131;:::i;:::-;27239:139;;26966:419;;;:::o;27391:182::-;27531:34;27527:1;27519:6;27515:14;27508:58;27391:182;:::o;27579:366::-;27721:3;27742:67;27806:2;27801:3;27742:67;:::i;:::-;27735:74;;27818:93;27907:3;27818:93;:::i;:::-;27936:2;27931:3;27927:12;27920:19;;27579:366;;;:::o;27951:419::-;28117:4;28155:2;28144:9;28140:18;28132:26;;28204:9;28198:4;28194:20;28190:1;28179:9;28175:17;28168:47;28232:131;28358:4;28232:131;:::i;:::-;28224:139;;27951:419;;;:::o;28376:171::-;28516:23;28512:1;28504:6;28500:14;28493:47;28376:171;:::o;28553:366::-;28695:3;28716:67;28780:2;28775:3;28716:67;:::i;:::-;28709:74;;28792:93;28881:3;28792:93;:::i;:::-;28910:2;28905:3;28901:12;28894:19;;28553:366;;;:::o;28925:419::-;29091:4;29129:2;29118:9;29114:18;29106:26;;29178:9;29172:4;29168:20;29164:1;29153:9;29149:17;29142:47;29206:131;29332:4;29206:131;:::i;:::-;29198:139;;28925:419;;;:::o;29350:180::-;29398:77;29395:1;29388:88;29495:4;29492:1;29485:15;29519:4;29516:1;29509:15;29536:233;29575:3;29598:24;29616:5;29598:24;:::i;:::-;29589:33;;29644:66;29637:5;29634:77;29631:103;;29714:18;;:::i;:::-;29631:103;29761:1;29754:5;29750:13;29743:20;;29536:233;;;:::o;29775:182::-;29915:34;29911:1;29903:6;29899:14;29892:58;29775:182;:::o;29963:366::-;30105:3;30126:67;30190:2;30185:3;30126:67;:::i;:::-;30119:74;;30202:93;30291:3;30202:93;:::i;:::-;30320:2;30315:3;30311:12;30304:19;;29963:366;;;:::o;30335:419::-;30501:4;30539:2;30528:9;30524:18;30516:26;;30588:9;30582:4;30578:20;30574:1;30563:9;30559:17;30552:47;30616:131;30742:4;30616:131;:::i;:::-;30608:139;;30335:419;;;:::o;30760:191::-;30800:4;30820:20;30838:1;30820:20;:::i;:::-;30815:25;;30854:20;30872:1;30854:20;:::i;:::-;30849:25;;30893:1;30890;30887:8;30884:34;;;30898:18;;:::i;:::-;30884:34;30943:1;30940;30936:9;30928:17;;30760:191;;;;:::o;30957:170::-;31097:22;31093:1;31085:6;31081:14;31074:46;30957:170;:::o;31133:366::-;31275:3;31296:67;31360:2;31355:3;31296:67;:::i;:::-;31289:74;;31372:93;31461:3;31372:93;:::i;:::-;31490:2;31485:3;31481:12;31474:19;;31133:366;;;:::o;31505:419::-;31671:4;31709:2;31698:9;31694:18;31686:26;;31758:9;31752:4;31748:20;31744:1;31733:9;31729:17;31722:47;31786:131;31912:4;31786:131;:::i;:::-;31778:139;;31505:419;;;:::o;31930:148::-;32032:11;32069:3;32054:18;;31930:148;;;;:::o;32084:377::-;32190:3;32218:39;32251:5;32218:39;:::i;:::-;32273:89;32355:6;32350:3;32273:89;:::i;:::-;32266:96;;32371:52;32416:6;32411:3;32404:4;32397:5;32393:16;32371:52;:::i;:::-;32448:6;32443:3;32439:16;32432:23;;32194:267;32084:377;;;;:::o;32467:141::-;32516:4;32539:3;32531:11;;32562:3;32559:1;32552:14;32596:4;32593:1;32583:18;32575:26;;32467:141;;;:::o;32638:845::-;32741:3;32778:5;32772:12;32807:36;32833:9;32807:36;:::i;:::-;32859:89;32941:6;32936:3;32859:89;:::i;:::-;32852:96;;32979:1;32968:9;32964:17;32995:1;32990:137;;;;33141:1;33136:341;;;;32957:520;;32990:137;33074:4;33070:9;33059;33055:25;33050:3;33043:38;33110:6;33105:3;33101:16;33094:23;;32990:137;;33136:341;33203:38;33235:5;33203:38;:::i;:::-;33263:1;33277:154;33291:6;33288:1;33285:13;33277:154;;;33365:7;33359:14;33355:1;33350:3;33346:11;33339:35;33415:1;33406:7;33402:15;33391:26;;33313:4;33310:1;33306:12;33301:17;;33277:154;;;33460:6;33455:3;33451:16;33444:23;;33143:334;;32957:520;;32745:738;;32638:845;;;;:::o;33489:589::-;33714:3;33736:95;33827:3;33818:6;33736:95;:::i;:::-;33729:102;;33848:95;33939:3;33930:6;33848:95;:::i;:::-;33841:102;;33960:92;34048:3;34039:6;33960:92;:::i;:::-;33953:99;;34069:3;34062:10;;33489:589;;;;;;:::o;34084:225::-;34224:34;34220:1;34212:6;34208:14;34201:58;34293:8;34288:2;34280:6;34276:15;34269:33;34084:225;:::o;34315:366::-;34457:3;34478:67;34542:2;34537:3;34478:67;:::i;:::-;34471:74;;34554:93;34643:3;34554:93;:::i;:::-;34672:2;34667:3;34663:12;34656:19;;34315:366;;;:::o;34687:419::-;34853:4;34891:2;34880:9;34876:18;34868:26;;34940:9;34934:4;34930:20;34926:1;34915:9;34911:17;34904:47;34968:131;35094:4;34968:131;:::i;:::-;34960:139;;34687:419;;;:::o;35112:98::-;35163:6;35197:5;35191:12;35181:22;;35112:98;;;:::o;35216:168::-;35299:11;35333:6;35328:3;35321:19;35373:4;35368:3;35364:14;35349:29;;35216:168;;;;:::o;35390:360::-;35476:3;35504:38;35536:5;35504:38;:::i;:::-;35558:70;35621:6;35616:3;35558:70;:::i;:::-;35551:77;;35637:52;35682:6;35677:3;35670:4;35663:5;35659:16;35637:52;:::i;:::-;35714:29;35736:6;35714:29;:::i;:::-;35709:3;35705:39;35698:46;;35480:270;35390:360;;;;:::o;35756:640::-;35951:4;35989:3;35978:9;35974:19;35966:27;;36003:71;36071:1;36060:9;36056:17;36047:6;36003:71;:::i;:::-;36084:72;36152:2;36141:9;36137:18;36128:6;36084:72;:::i;:::-;36166;36234:2;36223:9;36219:18;36210:6;36166:72;:::i;:::-;36285:9;36279:4;36275:20;36270:2;36259:9;36255:18;36248:48;36313:76;36384:4;36375:6;36313:76;:::i;:::-;36305:84;;35756:640;;;;;;;:::o;36402:141::-;36458:5;36489:6;36483:13;36474:22;;36505:32;36531:5;36505:32;:::i;:::-;36402:141;;;;:::o;36549:349::-;36618:6;36667:2;36655:9;36646:7;36642:23;36638:32;36635:119;;;36673:79;;:::i;:::-;36635:119;36793:1;36818:63;36873:7;36864:6;36853:9;36849:22;36818:63;:::i;:::-;36808:73;;36764:127;36549:349;;;;:::o

Swarm Source

ipfs://644bcfda0e4599fdcf4a5afd773e95033485a4243fc26b7d3759e5f2eb669618
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.