ETH Price: $3,622.72 (-1.68%)

Token

ERC-20: Pridetown (PT)
 

Overview

Max Total Supply

1,046 PT

Holders

28

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 PT
0x99945616ecb8e3a00e3b66159afd979bdf02da18
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:
Pridetown

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-16
*/

// File: contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

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

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

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

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

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

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

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

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

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

    // The 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 (_addressToUint256(owner) == 0) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

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

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        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 (_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 for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity);

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (_addressToUint256(to) == 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 offset;
            do {
                emit Transfer(address(0), to, startTokenId + offset++);
            } while (offset < quantity);

            _currentIndex = startTokenId + quantity;
        }
        _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();

        address approvedAddress = _tokenApprovals[tokenId];

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            approvedAddress == _msgSenderERC721A());

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        if (_addressToUint256(approvedAddress) != 0) {
            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));
        address approvedAddress = _tokenApprovals[tokenId];

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        if (_addressToUint256(approvedAddress) != 0) {
            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)
        }
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: contracts/pridetown.sol


pragma solidity ^0.8.4;




contract Pridetown is ERC721A, Ownable, ReentrancyGuard {
    uint256 public constant MAXIMUM_SUPPLY = 10000;
    uint256 public constant MAXIMUM_HOLDINGS_PER_HOLDER = 2;
    bool private saleActive = false;
    bool private revealed = false;
    string private revealedBaseURI = "";
    string private notRevealedBaseURI = "ipfs://QmStR3pWgDM55nEwSnv6iwydL6yJDhSChCLTb7yuX42tuk/";
    uint256 private memberReservedTotal = 1000;
    mapping(address => uint256) private memberReserved;
    mapping(address => uint256) private mintQuantityPerHolder;

    event MemberReservedTotal(uint256 amount);

    constructor() ERC721A("Pridetown", "PT") {
        // Team        0x42e5918e16c8925E27e2c94B96Ff50205794D2A9    100    10%
        memberReserved[0x42e5918e16c8925E27e2c94B96Ff50205794D2A9] = 100;

        // Simon       0x2551F8e190f036855715C467DBA27eD79db1646f    250    25%
        memberReserved[0x2551F8e190f036855715C467DBA27eD79db1646f] = 250;

        // George      0xfe233C21E1DA749CE0c7Bd0248e63c3F7455756C    100    10%
        memberReserved[0xfe233C21E1DA749CE0c7Bd0248e63c3F7455756C] = 100;

        // Carrie      0xCb7B8975bDE79FecE995417FC397e18A3c8b5A41    100    10%
        memberReserved[0xCb7B8975bDE79FecE995417FC397e18A3c8b5A41] = 100;

        // Jacob       0x85D8e2a134aEd266B807792FE196970855Aa4bBB    200    20%
        memberReserved[0x85D8e2a134aEd266B807792FE196970855Aa4bBB] = 200;

        // Jim         0x030d17b632C762d9fd5Fe70DaeF8050C5e6dD1e3    200    20%
        memberReserved[0x030d17b632C762d9fd5Fe70DaeF8050C5e6dD1e3] = 200;

        // May         0xE2F887f4F2e776aE207b3000585911A877316538    50      5%
        memberReserved[0xE2F887f4F2e776aE207b3000585911A877316538] = 50;
    }

    function getMemberReserved(address add) public view onlyOwner returns (uint256) {
        return memberReserved[add];
    }

    function getMemberReservedTotal() public view onlyOwner returns (uint256) {
        return memberReservedTotal;
    }

    function mint(uint256 quantity) public nonReentrant {
        require(saleActive, "Not yet on sale");

        require((mintQuantityPerHolder[msg.sender] + quantity) <= MAXIMUM_HOLDINGS_PER_HOLDER, "The mint quantity exceeds the holding quantity limit");

        require((quantity + totalSupply()) <= (MAXIMUM_SUPPLY - memberReservedTotal), "The mint quantity has exceeded the maximum supply quantity");

        mintQuantityPerHolder[msg.sender] += quantity;

        _mint(msg.sender, quantity);
    }

    function airdrop(address to, uint256 quantity) public onlyOwner {
        require(memberReserved[to] > 0, "The number of reservations has been exhausted");

        memberReservedTotal -= quantity;
        memberReserved[to] -= quantity;

        emit MemberReservedTotal(memberReservedTotal);

        _mint(to, quantity);
    }

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

        string memory baseURI = revealed ? revealedBaseURI : notRevealedBaseURI;
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId), ".json")) : '';
    }

    function toggleSaleActive() public onlyOwner {
        saleActive = !saleActive;
    }

    function toggleRevealed() public onlyOwner {
        revealed = !revealed;
    }

    function getRevealedBaseURI() public view returns (string memory) {
        return revealedBaseURI;
    }

    function setRevealedBaseURI(string memory _revealedBaseURI) public onlyOwner {
        revealedBaseURI = _revealedBaseURI;
    }

    function getNotRevealedBaseURI() public view returns (string memory) {
        return notRevealedBaseURI;
    }

    function setNotRevealedBaseURI(string memory _notRevealedBaseURI) public onlyOwner {
        notRevealedBaseURI = _notRevealedBaseURI;
    }

    function isSaleActive() public view returns (bool) {
        return saleActive;
    }

    function isRevealed() public view returns (bool) {
        return revealed;
    }

    function getMintQuantityPerHolder(address add) public view returns (uint256) {
        return mintQuantityPerHolder[add];
    }

    function reservedSupply() public view returns (uint256) {
        return MAXIMUM_SUPPLY - totalSupply();
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"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":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MemberReservedTotal","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":"MAXIMUM_HOLDINGS_PER_HOLDER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"add","type":"address"}],"name":"getMemberReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMemberReservedTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"add","type":"address"}],"name":"getMintQuantityPerHolder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNotRevealedBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRevealedBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedSupply","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":"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":"_notRevealedBaseURI","type":"string"}],"name":"setNotRevealedBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_revealedBaseURI","type":"string"}],"name":"setRevealedBaseURI","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":[],"name":"toggleRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600a60006101000a81548160ff0219169083151502179055506000600a60016101000a81548160ff02191690831515021790555060405180602001604052806000815250600b908051906020019062000061929190620004ce565b506040518060600160405280603681526020016200370a60369139600c908051906020019062000093929190620004ce565b506103e8600d55348015620000a757600080fd5b506040518060400160405280600981526020017f5072696465746f776e00000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f505400000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200012c929190620004ce565b50806003908051906020019062000145929190620004ce565b5062000156620003fb60201b60201c565b60008190555050506200017e620001726200040060201b60201c565b6200040860201b60201c565b60016009819055506064600e60007342e5918e16c8925e27e2c94b96ff50205794d2a973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060fa600e6000732551f8e190f036855715c467dba27ed79db1646f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506064600e600073fe233c21e1da749ce0c7bd0248e63c3f7455756c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506064600e600073cb7b8975bde79fece995417fc397e18a3c8b5a4173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060c8600e60007385d8e2a134aed266b807792fe196970855aa4bbb73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060c8600e600073030d17b632c762d9fd5fe70daef8050c5e6dd1e373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506032600e600073e2f887f4f2e776ae207b3000585911a87731653873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620005e3565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620004dc906200057e565b90600052602060002090601f0160209004810192826200050057600085556200054c565b82601f106200051b57805160ff19168380011785556200054c565b828001600101855582156200054c579182015b828111156200054b5782518255916020019190600101906200052e565b5b5090506200055b91906200055f565b5090565b5b808211156200057a57600081600090555060010162000560565b5090565b600060028204905060018216806200059757607f821691505b60208210811415620005ae57620005ad620005b4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61311780620005f36000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80635bc020bc1161011a5780638da5cb5b116100ad578063b88d4fde1161007c578063b88d4fde1461056b578063c87b56dd14610587578063e7b6d019146105b7578063e985e9c5146105e7578063f2fde38b1461061757610206565b80638da5cb5b146104f757806395d89b4114610515578063a0712d6814610533578063a22cb4651461054f57610206565b806370a08231116100e957806370a0823114610483578063715018a6146104b357806377ac7d01146104bd5780638ba4cc3c146104db57610206565b80635bc020bc1461040f5780636090eb8f146104195780636352211e146104375780636e83843a1461046757610206565b80633100a5351161019d5780633d0c49241161016c5780633d0c49241461037b57806342842e0e1461039957806344d19d2b146103b557806354214f69146103d3578063564566a8146103f157610206565b80633100a5351461032b5780633101bd931461033557806339366412146103535780633ccfd60b1461037157610206565b806318160ddd116101d957806318160ddd146102a5578063194c2936146102c357806323b872dd146102df578063246278d7146102fb57610206565b806301ffc9a71461020b57806306fdde031461023b578063081812fc14610259578063095ea7b314610289575b600080fd5b61022560048036038101906102209190612700565b610633565b6040516102329190612a4e565b60405180910390f35b6102436106c5565b6040516102509190612a69565b60405180910390f35b610273600480360381019061026e91906127a3565b610757565b60405161028091906129e7565b60405180910390f35b6102a3600480360381019061029e91906126c0565b6107d3565b005b6102ad610914565b6040516102ba9190612b6b565b60405180910390f35b6102dd60048036038101906102d8919061275a565b61092b565b005b6102f960048036038101906102f491906125aa565b6109c1565b005b6103156004803603810190610310919061253d565b6109d1565b6040516103229190612b6b565b60405180910390f35b610333610a96565b005b61033d610b3e565b60405161034a9190612a69565b60405180910390f35b61035b610bd0565b6040516103689190612b6b565b60405180910390f35b610379610c56565b005b610383610d22565b6040516103909190612b6b565b60405180910390f35b6103b360048036038101906103ae91906125aa565b610d28565b005b6103bd610d48565b6040516103ca9190612b6b565b60405180910390f35b6103db610d64565b6040516103e89190612a4e565b60405180910390f35b6103f9610d7b565b6040516104069190612a4e565b60405180910390f35b610417610d92565b005b610421610e3a565b60405161042e9190612a69565b60405180910390f35b610451600480360381019061044c91906127a3565b610ecc565b60405161045e91906129e7565b60405180910390f35b610481600480360381019061047c919061275a565b610ede565b005b61049d6004803603810190610498919061253d565b610f74565b6040516104aa9190612b6b565b60405180910390f35b6104bb611009565b005b6104c5611091565b6040516104d29190612b6b565b60405180910390f35b6104f560048036038101906104f091906126c0565b611096565b005b6104ff61124a565b60405161050c91906129e7565b60405180910390f35b61051d611274565b60405161052a9190612a69565b60405180910390f35b61054d600480360381019061054891906127a3565b611306565b005b61056960048036038101906105649190612680565b611500565b005b610585600480360381019061058091906125fd565b611678565b005b6105a1600480360381019061059c91906127a3565b6116eb565b6040516105ae9190612a69565b60405180910390f35b6105d160048036038101906105cc919061253d565b611829565b6040516105de9190612b6b565b60405180910390f35b61060160048036038101906105fc919061256a565b611872565b60405161060e9190612a4e565b60405180910390f35b610631600480360381019061062c919061253d565b611906565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061068e57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106be5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546106d490612d90565b80601f016020809104026020016040519081016040528092919081815260200182805461070090612d90565b801561074d5780601f106107225761010080835404028352916020019161074d565b820191906000526020600020905b81548152906001019060200180831161073057829003601f168201915b5050505050905090565b6000610762826119fe565b610798576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107de82611a5d565b90508073ffffffffffffffffffffffffffffffffffffffff166107ff611b2b565b73ffffffffffffffffffffffffffffffffffffffff16146108625761082b81610826611b2b565b611872565b610861576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061091e611b33565b6001546000540303905090565b610933611b38565b73ffffffffffffffffffffffffffffffffffffffff1661095161124a565b73ffffffffffffffffffffffffffffffffffffffff16146109a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099e90612b0b565b60405180910390fd5b80600c90805190602001906109bd929190612351565b5050565b6109cc838383611b40565b505050565b60006109db611b38565b73ffffffffffffffffffffffffffffffffffffffff166109f961124a565b73ffffffffffffffffffffffffffffffffffffffff1614610a4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4690612b0b565b60405180910390fd5b600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a9e611b38565b73ffffffffffffffffffffffffffffffffffffffff16610abc61124a565b73ffffffffffffffffffffffffffffffffffffffff1614610b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0990612b0b565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b6060600b8054610b4d90612d90565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7990612d90565b8015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b5050505050905090565b6000610bda611b38565b73ffffffffffffffffffffffffffffffffffffffff16610bf861124a565b73ffffffffffffffffffffffffffffffffffffffff1614610c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4590612b0b565b60405180910390fd5b600d54905090565b610c5e611b38565b73ffffffffffffffffffffffffffffffffffffffff16610c7c61124a565b73ffffffffffffffffffffffffffffffffffffffff1614610cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc990612b0b565b60405180910390fd5b610cda61124a565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d1f573d6000803e3d6000fd5b50565b61271081565b610d4383838360405180602001604052806000815250611678565b505050565b6000610d52610914565b612710610d5f9190612ca6565b905090565b6000600a60019054906101000a900460ff16905090565b6000600a60009054906101000a900460ff16905090565b610d9a611b38565b73ffffffffffffffffffffffffffffffffffffffff16610db861124a565b73ffffffffffffffffffffffffffffffffffffffff1614610e0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0590612b0b565b60405180910390fd5b600a60019054906101000a900460ff1615600a60016101000a81548160ff021916908315150217905550565b6060600c8054610e4990612d90565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7590612d90565b8015610ec25780601f10610e9757610100808354040283529160200191610ec2565b820191906000526020600020905b815481529060010190602001808311610ea557829003601f168201915b5050505050905090565b6000610ed782611a5d565b9050919050565b610ee6611b38565b73ffffffffffffffffffffffffffffffffffffffff16610f0461124a565b73ffffffffffffffffffffffffffffffffffffffff1614610f5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5190612b0b565b60405180910390fd5b80600b9080519060200190610f70929190612351565b5050565b600080610f8083611f08565b1415610fb8576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611011611b38565b73ffffffffffffffffffffffffffffffffffffffff1661102f61124a565b73ffffffffffffffffffffffffffffffffffffffff1614611085576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107c90612b0b565b60405180910390fd5b61108f6000611f12565b565b600281565b61109e611b38565b73ffffffffffffffffffffffffffffffffffffffff166110bc61124a565b73ffffffffffffffffffffffffffffffffffffffff1614611112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110990612b0b565b60405180910390fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118b90612aab565b60405180910390fd5b80600d60008282546111a69190612ca6565b9250508190555080600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111fc9190612ca6565b925050819055507fe367416bf617323eaaa36c517baa7007895ccc02f560445f066633b57732d62c600d546040516112349190612b6b565b60405180910390a16112468282611fd8565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461128390612d90565b80601f01602080910402602001604051908101604052809291908181526020018280546112af90612d90565b80156112fc5780601f106112d1576101008083540402835291602001916112fc565b820191906000526020600020905b8154815290600101906020018083116112df57829003601f168201915b5050505050905090565b6002600954141561134c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134390612b4b565b60405180910390fd5b6002600981905550600a60009054906101000a900460ff166113a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139a90612aeb565b60405180910390fd5b600281600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113f09190612c50565b1115611431576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142890612acb565b60405180910390fd5b600d546127106114419190612ca6565b611449610914565b826114549190612c50565b1115611495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148c90612b2b565b60405180910390fd5b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114e49190612c50565b925050819055506114f53382611fd8565b600160098190555050565b611508611b2b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561156d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061157a611b2b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611627611b2b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161166c9190612a4e565b60405180910390a35050565b611683848484611b40565b60008373ffffffffffffffffffffffffffffffffffffffff163b146116e5576116ae84848484612181565b6116e4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606116f6826119fe565b61172c576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600a60019054906101000a900460ff1661174957600c61174c565b600b5b805461175790612d90565b80601f016020809104026020016040519081016040528092919081815260200182805461178390612d90565b80156117d05780601f106117a5576101008083540402835291602001916117d0565b820191906000526020600020905b8154815290600101906020018083116117b357829003601f168201915b505050505090506000815114156117f65760405180602001604052806000815250611821565b80611800846122e1565b6040516020016118119291906129b8565b6040516020818303038152906040525b915050919050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61190e611b38565b73ffffffffffffffffffffffffffffffffffffffff1661192c61124a565b73ffffffffffffffffffffffffffffffffffffffff1614611982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197990612b0b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e990612a8b565b60405180910390fd5b6119fb81611f12565b50565b600081611a09611b33565b11158015611a18575060005482105b8015611a56575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611a6c611b33565b11611af457600054811015611af35760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611af1575b6000811415611ae7576004600083600190039350838152602001908152602001600020549050611abc565b8092505050611b26565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b600033905090565b6000611b4b82611a5d565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611bb2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff16611c0b611b2b565b73ffffffffffffffffffffffffffffffffffffffff161480611c3a5750611c3986611c34611b2b565b611872565b5b80611c775750611c48611b2b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b905080611cb0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611cbb86611f08565b1415611cf3576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d00868686600161233b565b6000611d0b83611f08565b14611d47576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611e0e87611f08565b1717600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611e98576000600185019050600060046000838152602001908152602001600020541415611e96576000548114611e95578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f008686866001612341565b505050505050565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000805490506000611fe984611f08565b1415612021576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082141561205c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612069600084838561233b565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16120ce60018414612347565b901b60a042901b6120de85611f08565b1717600460008381526020019081526020016000208190555060005b8080600101915082018473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48281106120fa578282016000819055505061217c6000848385612341565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121a7611b2b565b8786866040518563ffffffff1660e01b81526004016121c99493929190612a02565b602060405180830381600087803b1580156121e357600080fd5b505af192505050801561221457506040513d601f19601f82011682018060405250810190612211919061272d565b60015b61228e573d8060008114612244576040519150601f19603f3d011682016040523d82523d6000602084013e612249565b606091505b50600081511415612286576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561232757600183039250600a81066030018353600a81049050612307565b508181036020830392508083525050919050565b50505050565b50505050565b6000819050919050565b82805461235d90612d90565b90600052602060002090601f01602090048101928261237f57600085556123c6565b82601f1061239857805160ff19168380011785556123c6565b828001600101855582156123c6579182015b828111156123c55782518255916020019190600101906123aa565b5b5090506123d391906123d7565b5090565b5b808211156123f05760008160009055506001016123d8565b5090565b600061240761240284612bab565b612b86565b90508281526020810184848401111561242357612422612e85565b5b61242e848285612d4e565b509392505050565b600061244961244484612bdc565b612b86565b90508281526020810184848401111561246557612464612e85565b5b612470848285612d4e565b509392505050565b60008135905061248781613085565b92915050565b60008135905061249c8161309c565b92915050565b6000813590506124b1816130b3565b92915050565b6000815190506124c6816130b3565b92915050565b600082601f8301126124e1576124e0612e80565b5b81356124f18482602086016123f4565b91505092915050565b600082601f83011261250f5761250e612e80565b5b813561251f848260208601612436565b91505092915050565b600081359050612537816130ca565b92915050565b60006020828403121561255357612552612e8f565b5b600061256184828501612478565b91505092915050565b6000806040838503121561258157612580612e8f565b5b600061258f85828601612478565b92505060206125a085828601612478565b9150509250929050565b6000806000606084860312156125c3576125c2612e8f565b5b60006125d186828701612478565b93505060206125e286828701612478565b92505060406125f386828701612528565b9150509250925092565b6000806000806080858703121561261757612616612e8f565b5b600061262587828801612478565b945050602061263687828801612478565b935050604061264787828801612528565b925050606085013567ffffffffffffffff81111561266857612667612e8a565b5b612674878288016124cc565b91505092959194509250565b6000806040838503121561269757612696612e8f565b5b60006126a585828601612478565b92505060206126b68582860161248d565b9150509250929050565b600080604083850312156126d7576126d6612e8f565b5b60006126e585828601612478565b92505060206126f685828601612528565b9150509250929050565b60006020828403121561271657612715612e8f565b5b6000612724848285016124a2565b91505092915050565b60006020828403121561274357612742612e8f565b5b6000612751848285016124b7565b91505092915050565b6000602082840312156127705761276f612e8f565b5b600082013567ffffffffffffffff81111561278e5761278d612e8a565b5b61279a848285016124fa565b91505092915050565b6000602082840312156127b9576127b8612e8f565b5b60006127c784828501612528565b91505092915050565b6127d981612cda565b82525050565b6127e881612cec565b82525050565b60006127f982612c0d565b6128038185612c23565b9350612813818560208601612d5d565b61281c81612e94565b840191505092915050565b600061283282612c18565b61283c8185612c34565b935061284c818560208601612d5d565b61285581612e94565b840191505092915050565b600061286b82612c18565b6128758185612c45565b9350612885818560208601612d5d565b80840191505092915050565b600061289e602683612c34565b91506128a982612ea5565b604082019050919050565b60006128c1602d83612c34565b91506128cc82612ef4565b604082019050919050565b60006128e4603483612c34565b91506128ef82612f43565b604082019050919050565b6000612907600f83612c34565b915061291282612f92565b602082019050919050565b600061292a600583612c45565b915061293582612fbb565b600582019050919050565b600061294d602083612c34565b915061295882612fe4565b602082019050919050565b6000612970603a83612c34565b915061297b8261300d565b604082019050919050565b6000612993601f83612c34565b915061299e8261305c565b602082019050919050565b6129b281612d44565b82525050565b60006129c48285612860565b91506129d08284612860565b91506129db8261291d565b91508190509392505050565b60006020820190506129fc60008301846127d0565b92915050565b6000608082019050612a1760008301876127d0565b612a2460208301866127d0565b612a3160408301856129a9565b8181036060830152612a4381846127ee565b905095945050505050565b6000602082019050612a6360008301846127df565b92915050565b60006020820190508181036000830152612a838184612827565b905092915050565b60006020820190508181036000830152612aa481612891565b9050919050565b60006020820190508181036000830152612ac4816128b4565b9050919050565b60006020820190508181036000830152612ae4816128d7565b9050919050565b60006020820190508181036000830152612b04816128fa565b9050919050565b60006020820190508181036000830152612b2481612940565b9050919050565b60006020820190508181036000830152612b4481612963565b9050919050565b60006020820190508181036000830152612b6481612986565b9050919050565b6000602082019050612b8060008301846129a9565b92915050565b6000612b90612ba1565b9050612b9c8282612dc2565b919050565b6000604051905090565b600067ffffffffffffffff821115612bc657612bc5612e51565b5b612bcf82612e94565b9050602081019050919050565b600067ffffffffffffffff821115612bf757612bf6612e51565b5b612c0082612e94565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612c5b82612d44565b9150612c6683612d44565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c9b57612c9a612df3565b5b828201905092915050565b6000612cb182612d44565b9150612cbc83612d44565b925082821015612ccf57612cce612df3565b5b828203905092915050565b6000612ce582612d24565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612d7b578082015181840152602081019050612d60565b83811115612d8a576000848401525b50505050565b60006002820490506001821680612da857607f821691505b60208210811415612dbc57612dbb612e22565b5b50919050565b612dcb82612e94565b810181811067ffffffffffffffff82111715612dea57612de9612e51565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f546865206e756d626572206f66207265736572766174696f6e7320686173206260008201527f65656e2065786861757374656400000000000000000000000000000000000000602082015250565b7f546865206d696e74207175616e7469747920657863656564732074686520686f60008201527f6c64696e67207175616e74697479206c696d6974000000000000000000000000602082015250565b7f4e6f7420796574206f6e2073616c650000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546865206d696e74207175616e7469747920686173206578636565646564207460008201527f6865206d6178696d756d20737570706c79207175616e74697479000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b61308e81612cda565b811461309957600080fd5b50565b6130a581612cec565b81146130b057600080fd5b50565b6130bc81612cf8565b81146130c757600080fd5b50565b6130d381612d44565b81146130de57600080fd5b5056fea26469706673582212202866aea5c80cf22c313fe7236e1b068cb0062c9405e2b41d54359f17658eed9e64736f6c63430008070033697066733a2f2f516d53745233705767444d35356e4577536e7636697779644c36794a4468534368434c546237797558343274756b2f

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102065760003560e01c80635bc020bc1161011a5780638da5cb5b116100ad578063b88d4fde1161007c578063b88d4fde1461056b578063c87b56dd14610587578063e7b6d019146105b7578063e985e9c5146105e7578063f2fde38b1461061757610206565b80638da5cb5b146104f757806395d89b4114610515578063a0712d6814610533578063a22cb4651461054f57610206565b806370a08231116100e957806370a0823114610483578063715018a6146104b357806377ac7d01146104bd5780638ba4cc3c146104db57610206565b80635bc020bc1461040f5780636090eb8f146104195780636352211e146104375780636e83843a1461046757610206565b80633100a5351161019d5780633d0c49241161016c5780633d0c49241461037b57806342842e0e1461039957806344d19d2b146103b557806354214f69146103d3578063564566a8146103f157610206565b80633100a5351461032b5780633101bd931461033557806339366412146103535780633ccfd60b1461037157610206565b806318160ddd116101d957806318160ddd146102a5578063194c2936146102c357806323b872dd146102df578063246278d7146102fb57610206565b806301ffc9a71461020b57806306fdde031461023b578063081812fc14610259578063095ea7b314610289575b600080fd5b61022560048036038101906102209190612700565b610633565b6040516102329190612a4e565b60405180910390f35b6102436106c5565b6040516102509190612a69565b60405180910390f35b610273600480360381019061026e91906127a3565b610757565b60405161028091906129e7565b60405180910390f35b6102a3600480360381019061029e91906126c0565b6107d3565b005b6102ad610914565b6040516102ba9190612b6b565b60405180910390f35b6102dd60048036038101906102d8919061275a565b61092b565b005b6102f960048036038101906102f491906125aa565b6109c1565b005b6103156004803603810190610310919061253d565b6109d1565b6040516103229190612b6b565b60405180910390f35b610333610a96565b005b61033d610b3e565b60405161034a9190612a69565b60405180910390f35b61035b610bd0565b6040516103689190612b6b565b60405180910390f35b610379610c56565b005b610383610d22565b6040516103909190612b6b565b60405180910390f35b6103b360048036038101906103ae91906125aa565b610d28565b005b6103bd610d48565b6040516103ca9190612b6b565b60405180910390f35b6103db610d64565b6040516103e89190612a4e565b60405180910390f35b6103f9610d7b565b6040516104069190612a4e565b60405180910390f35b610417610d92565b005b610421610e3a565b60405161042e9190612a69565b60405180910390f35b610451600480360381019061044c91906127a3565b610ecc565b60405161045e91906129e7565b60405180910390f35b610481600480360381019061047c919061275a565b610ede565b005b61049d6004803603810190610498919061253d565b610f74565b6040516104aa9190612b6b565b60405180910390f35b6104bb611009565b005b6104c5611091565b6040516104d29190612b6b565b60405180910390f35b6104f560048036038101906104f091906126c0565b611096565b005b6104ff61124a565b60405161050c91906129e7565b60405180910390f35b61051d611274565b60405161052a9190612a69565b60405180910390f35b61054d600480360381019061054891906127a3565b611306565b005b61056960048036038101906105649190612680565b611500565b005b610585600480360381019061058091906125fd565b611678565b005b6105a1600480360381019061059c91906127a3565b6116eb565b6040516105ae9190612a69565b60405180910390f35b6105d160048036038101906105cc919061253d565b611829565b6040516105de9190612b6b565b60405180910390f35b61060160048036038101906105fc919061256a565b611872565b60405161060e9190612a4e565b60405180910390f35b610631600480360381019061062c919061253d565b611906565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061068e57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106be5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546106d490612d90565b80601f016020809104026020016040519081016040528092919081815260200182805461070090612d90565b801561074d5780601f106107225761010080835404028352916020019161074d565b820191906000526020600020905b81548152906001019060200180831161073057829003601f168201915b5050505050905090565b6000610762826119fe565b610798576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107de82611a5d565b90508073ffffffffffffffffffffffffffffffffffffffff166107ff611b2b565b73ffffffffffffffffffffffffffffffffffffffff16146108625761082b81610826611b2b565b611872565b610861576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061091e611b33565b6001546000540303905090565b610933611b38565b73ffffffffffffffffffffffffffffffffffffffff1661095161124a565b73ffffffffffffffffffffffffffffffffffffffff16146109a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099e90612b0b565b60405180910390fd5b80600c90805190602001906109bd929190612351565b5050565b6109cc838383611b40565b505050565b60006109db611b38565b73ffffffffffffffffffffffffffffffffffffffff166109f961124a565b73ffffffffffffffffffffffffffffffffffffffff1614610a4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4690612b0b565b60405180910390fd5b600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a9e611b38565b73ffffffffffffffffffffffffffffffffffffffff16610abc61124a565b73ffffffffffffffffffffffffffffffffffffffff1614610b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0990612b0b565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b6060600b8054610b4d90612d90565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7990612d90565b8015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b5050505050905090565b6000610bda611b38565b73ffffffffffffffffffffffffffffffffffffffff16610bf861124a565b73ffffffffffffffffffffffffffffffffffffffff1614610c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4590612b0b565b60405180910390fd5b600d54905090565b610c5e611b38565b73ffffffffffffffffffffffffffffffffffffffff16610c7c61124a565b73ffffffffffffffffffffffffffffffffffffffff1614610cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc990612b0b565b60405180910390fd5b610cda61124a565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d1f573d6000803e3d6000fd5b50565b61271081565b610d4383838360405180602001604052806000815250611678565b505050565b6000610d52610914565b612710610d5f9190612ca6565b905090565b6000600a60019054906101000a900460ff16905090565b6000600a60009054906101000a900460ff16905090565b610d9a611b38565b73ffffffffffffffffffffffffffffffffffffffff16610db861124a565b73ffffffffffffffffffffffffffffffffffffffff1614610e0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0590612b0b565b60405180910390fd5b600a60019054906101000a900460ff1615600a60016101000a81548160ff021916908315150217905550565b6060600c8054610e4990612d90565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7590612d90565b8015610ec25780601f10610e9757610100808354040283529160200191610ec2565b820191906000526020600020905b815481529060010190602001808311610ea557829003601f168201915b5050505050905090565b6000610ed782611a5d565b9050919050565b610ee6611b38565b73ffffffffffffffffffffffffffffffffffffffff16610f0461124a565b73ffffffffffffffffffffffffffffffffffffffff1614610f5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5190612b0b565b60405180910390fd5b80600b9080519060200190610f70929190612351565b5050565b600080610f8083611f08565b1415610fb8576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611011611b38565b73ffffffffffffffffffffffffffffffffffffffff1661102f61124a565b73ffffffffffffffffffffffffffffffffffffffff1614611085576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107c90612b0b565b60405180910390fd5b61108f6000611f12565b565b600281565b61109e611b38565b73ffffffffffffffffffffffffffffffffffffffff166110bc61124a565b73ffffffffffffffffffffffffffffffffffffffff1614611112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110990612b0b565b60405180910390fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118b90612aab565b60405180910390fd5b80600d60008282546111a69190612ca6565b9250508190555080600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111fc9190612ca6565b925050819055507fe367416bf617323eaaa36c517baa7007895ccc02f560445f066633b57732d62c600d546040516112349190612b6b565b60405180910390a16112468282611fd8565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461128390612d90565b80601f01602080910402602001604051908101604052809291908181526020018280546112af90612d90565b80156112fc5780601f106112d1576101008083540402835291602001916112fc565b820191906000526020600020905b8154815290600101906020018083116112df57829003601f168201915b5050505050905090565b6002600954141561134c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134390612b4b565b60405180910390fd5b6002600981905550600a60009054906101000a900460ff166113a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139a90612aeb565b60405180910390fd5b600281600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113f09190612c50565b1115611431576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142890612acb565b60405180910390fd5b600d546127106114419190612ca6565b611449610914565b826114549190612c50565b1115611495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148c90612b2b565b60405180910390fd5b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114e49190612c50565b925050819055506114f53382611fd8565b600160098190555050565b611508611b2b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561156d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061157a611b2b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611627611b2b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161166c9190612a4e565b60405180910390a35050565b611683848484611b40565b60008373ffffffffffffffffffffffffffffffffffffffff163b146116e5576116ae84848484612181565b6116e4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606116f6826119fe565b61172c576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600a60019054906101000a900460ff1661174957600c61174c565b600b5b805461175790612d90565b80601f016020809104026020016040519081016040528092919081815260200182805461178390612d90565b80156117d05780601f106117a5576101008083540402835291602001916117d0565b820191906000526020600020905b8154815290600101906020018083116117b357829003601f168201915b505050505090506000815114156117f65760405180602001604052806000815250611821565b80611800846122e1565b6040516020016118119291906129b8565b6040516020818303038152906040525b915050919050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61190e611b38565b73ffffffffffffffffffffffffffffffffffffffff1661192c61124a565b73ffffffffffffffffffffffffffffffffffffffff1614611982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197990612b0b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e990612a8b565b60405180910390fd5b6119fb81611f12565b50565b600081611a09611b33565b11158015611a18575060005482105b8015611a56575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611a6c611b33565b11611af457600054811015611af35760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611af1575b6000811415611ae7576004600083600190039350838152602001908152602001600020549050611abc565b8092505050611b26565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b600033905090565b6000611b4b82611a5d565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611bb2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff16611c0b611b2b565b73ffffffffffffffffffffffffffffffffffffffff161480611c3a5750611c3986611c34611b2b565b611872565b5b80611c775750611c48611b2b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b905080611cb0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611cbb86611f08565b1415611cf3576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d00868686600161233b565b6000611d0b83611f08565b14611d47576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611e0e87611f08565b1717600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611e98576000600185019050600060046000838152602001908152602001600020541415611e96576000548114611e95578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f008686866001612341565b505050505050565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000805490506000611fe984611f08565b1415612021576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082141561205c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612069600084838561233b565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16120ce60018414612347565b901b60a042901b6120de85611f08565b1717600460008381526020019081526020016000208190555060005b8080600101915082018473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48281106120fa578282016000819055505061217c6000848385612341565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121a7611b2b565b8786866040518563ffffffff1660e01b81526004016121c99493929190612a02565b602060405180830381600087803b1580156121e357600080fd5b505af192505050801561221457506040513d601f19601f82011682018060405250810190612211919061272d565b60015b61228e573d8060008114612244576040519150601f19603f3d011682016040523d82523d6000602084013e612249565b606091505b50600081511415612286576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561232757600183039250600a81066030018353600a81049050612307565b508181036020830392508083525050919050565b50505050565b50505050565b6000819050919050565b82805461235d90612d90565b90600052602060002090601f01602090048101928261237f57600085556123c6565b82601f1061239857805160ff19168380011785556123c6565b828001600101855582156123c6579182015b828111156123c55782518255916020019190600101906123aa565b5b5090506123d391906123d7565b5090565b5b808211156123f05760008160009055506001016123d8565b5090565b600061240761240284612bab565b612b86565b90508281526020810184848401111561242357612422612e85565b5b61242e848285612d4e565b509392505050565b600061244961244484612bdc565b612b86565b90508281526020810184848401111561246557612464612e85565b5b612470848285612d4e565b509392505050565b60008135905061248781613085565b92915050565b60008135905061249c8161309c565b92915050565b6000813590506124b1816130b3565b92915050565b6000815190506124c6816130b3565b92915050565b600082601f8301126124e1576124e0612e80565b5b81356124f18482602086016123f4565b91505092915050565b600082601f83011261250f5761250e612e80565b5b813561251f848260208601612436565b91505092915050565b600081359050612537816130ca565b92915050565b60006020828403121561255357612552612e8f565b5b600061256184828501612478565b91505092915050565b6000806040838503121561258157612580612e8f565b5b600061258f85828601612478565b92505060206125a085828601612478565b9150509250929050565b6000806000606084860312156125c3576125c2612e8f565b5b60006125d186828701612478565b93505060206125e286828701612478565b92505060406125f386828701612528565b9150509250925092565b6000806000806080858703121561261757612616612e8f565b5b600061262587828801612478565b945050602061263687828801612478565b935050604061264787828801612528565b925050606085013567ffffffffffffffff81111561266857612667612e8a565b5b612674878288016124cc565b91505092959194509250565b6000806040838503121561269757612696612e8f565b5b60006126a585828601612478565b92505060206126b68582860161248d565b9150509250929050565b600080604083850312156126d7576126d6612e8f565b5b60006126e585828601612478565b92505060206126f685828601612528565b9150509250929050565b60006020828403121561271657612715612e8f565b5b6000612724848285016124a2565b91505092915050565b60006020828403121561274357612742612e8f565b5b6000612751848285016124b7565b91505092915050565b6000602082840312156127705761276f612e8f565b5b600082013567ffffffffffffffff81111561278e5761278d612e8a565b5b61279a848285016124fa565b91505092915050565b6000602082840312156127b9576127b8612e8f565b5b60006127c784828501612528565b91505092915050565b6127d981612cda565b82525050565b6127e881612cec565b82525050565b60006127f982612c0d565b6128038185612c23565b9350612813818560208601612d5d565b61281c81612e94565b840191505092915050565b600061283282612c18565b61283c8185612c34565b935061284c818560208601612d5d565b61285581612e94565b840191505092915050565b600061286b82612c18565b6128758185612c45565b9350612885818560208601612d5d565b80840191505092915050565b600061289e602683612c34565b91506128a982612ea5565b604082019050919050565b60006128c1602d83612c34565b91506128cc82612ef4565b604082019050919050565b60006128e4603483612c34565b91506128ef82612f43565b604082019050919050565b6000612907600f83612c34565b915061291282612f92565b602082019050919050565b600061292a600583612c45565b915061293582612fbb565b600582019050919050565b600061294d602083612c34565b915061295882612fe4565b602082019050919050565b6000612970603a83612c34565b915061297b8261300d565b604082019050919050565b6000612993601f83612c34565b915061299e8261305c565b602082019050919050565b6129b281612d44565b82525050565b60006129c48285612860565b91506129d08284612860565b91506129db8261291d565b91508190509392505050565b60006020820190506129fc60008301846127d0565b92915050565b6000608082019050612a1760008301876127d0565b612a2460208301866127d0565b612a3160408301856129a9565b8181036060830152612a4381846127ee565b905095945050505050565b6000602082019050612a6360008301846127df565b92915050565b60006020820190508181036000830152612a838184612827565b905092915050565b60006020820190508181036000830152612aa481612891565b9050919050565b60006020820190508181036000830152612ac4816128b4565b9050919050565b60006020820190508181036000830152612ae4816128d7565b9050919050565b60006020820190508181036000830152612b04816128fa565b9050919050565b60006020820190508181036000830152612b2481612940565b9050919050565b60006020820190508181036000830152612b4481612963565b9050919050565b60006020820190508181036000830152612b6481612986565b9050919050565b6000602082019050612b8060008301846129a9565b92915050565b6000612b90612ba1565b9050612b9c8282612dc2565b919050565b6000604051905090565b600067ffffffffffffffff821115612bc657612bc5612e51565b5b612bcf82612e94565b9050602081019050919050565b600067ffffffffffffffff821115612bf757612bf6612e51565b5b612c0082612e94565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612c5b82612d44565b9150612c6683612d44565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c9b57612c9a612df3565b5b828201905092915050565b6000612cb182612d44565b9150612cbc83612d44565b925082821015612ccf57612cce612df3565b5b828203905092915050565b6000612ce582612d24565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612d7b578082015181840152602081019050612d60565b83811115612d8a576000848401525b50505050565b60006002820490506001821680612da857607f821691505b60208210811415612dbc57612dbb612e22565b5b50919050565b612dcb82612e94565b810181811067ffffffffffffffff82111715612dea57612de9612e51565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f546865206e756d626572206f66207265736572766174696f6e7320686173206260008201527f65656e2065786861757374656400000000000000000000000000000000000000602082015250565b7f546865206d696e74207175616e7469747920657863656564732074686520686f60008201527f6c64696e67207175616e74697479206c696d6974000000000000000000000000602082015250565b7f4e6f7420796574206f6e2073616c650000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546865206d696e74207175616e7469747920686173206578636565646564207460008201527f6865206d6178696d756d20737570706c79207175616e74697479000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b61308e81612cda565b811461309957600080fd5b50565b6130a581612cec565b81146130b057600080fd5b50565b6130bc81612cf8565b81146130c757600080fd5b50565b6130d381612d44565b81146130de57600080fd5b5056fea26469706673582212202866aea5c80cf22c313fe7236e1b068cb0062c9405e2b41d54359f17658eed9e64736f6c63430008070033

Deployed Bytecode Sourcemap

43122:4527:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12938:615;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17974:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19983:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19502:415;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11992:315;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46949:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20869:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44897:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46389:88;;;:::i;:::-;;46575:107;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45030:119;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47542:104;;;:::i;:::-;;43185:46;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21110:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47422:112;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47194:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47099:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46485:82;;;:::i;:::-;;46828:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17763:144;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46690:130;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13617:234;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42234:103;;;:::i;:::-;;43238:55;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45679:338;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41583:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18143:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45157:514;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20259:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21366:396;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46025:356;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47285:129;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20638:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42492:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12938:615;13023:4;13338:10;13323:25;;:11;:25;;;;:102;;;;13415:10;13400:25;;:11;:25;;;;13323:102;:179;;;;13492:10;13477:25;;:11;:25;;;;13323:179;13303:199;;12938:615;;;:::o;17974:100::-;18028:13;18061:5;18054:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17974:100;:::o;19983:204::-;20051:7;20076:16;20084:7;20076;:16::i;:::-;20071:64;;20101:34;;;;;;;;;;;;;;20071:64;20155:15;:24;20171:7;20155:24;;;;;;;;;;;;;;;;;;;;;20148:31;;19983:204;;;:::o;19502:415::-;19575:13;19607:27;19626:7;19607:18;:27::i;:::-;19575:61;;19676:5;19653:28;;:19;:17;:19::i;:::-;:28;;;19649:175;;19701:44;19718:5;19725:19;:17;:19::i;:::-;19701:16;:44::i;:::-;19696:128;;19773:35;;;;;;;;;;;;;;19696:128;19649:175;19863:2;19836:15;:24;19852:7;19836:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;19901:7;19897:2;19881:28;;19890:5;19881:28;;;;;;;;;;;;19564:353;19502:415;;:::o;11992:315::-;12045:7;12273:15;:13;:15::i;:::-;12258:12;;12242:13;;:28;:46;12235:53;;11992:315;:::o;46949:142::-;41814:12;:10;:12::i;:::-;41803:23;;:7;:5;:7::i;:::-;:23;;;41795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47064:19:::1;47043:18;:40;;;;;;;;;;;;:::i;:::-;;46949:142:::0;:::o;20869:170::-;21003:28;21013:4;21019:2;21023:7;21003:9;:28::i;:::-;20869:170;;;:::o;44897:125::-;44968:7;41814:12;:10;:12::i;:::-;41803:23;;:7;:5;:7::i;:::-;:23;;;41795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44995:14:::1;:19;45010:3;44995:19;;;;;;;;;;;;;;;;44988:26;;44897:125:::0;;;:::o;46389:88::-;41814:12;:10;:12::i;:::-;41803:23;;:7;:5;:7::i;:::-;:23;;;41795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46459:10:::1;;;;;;;;;;;46458:11;46445:10;;:24;;;;;;;;;;;;;;;;;;46389:88::o:0;46575:107::-;46626:13;46659:15;46652:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46575:107;:::o;45030:119::-;45095:7;41814:12;:10;:12::i;:::-;41803:23;;:7;:5;:7::i;:::-;:23;;;41795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45122:19:::1;;45115:26;;45030:119:::0;:::o;47542:104::-;41814:12;:10;:12::i;:::-;41803:23;;:7;:5;:7::i;:::-;:23;;;41795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47598:7:::1;:5;:7::i;:::-;47590:25;;:48;47616:21;47590:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;47542:104::o:0;43185:46::-;43226:5;43185:46;:::o;21110:185::-;21248:39;21265:4;21271:2;21275:7;21248:39;;;;;;;;;;;;:16;:39::i;:::-;21110:185;;;:::o;47422:112::-;47469:7;47513:13;:11;:13::i;:::-;43226:5;47496:30;;;;:::i;:::-;47489:37;;47422:112;:::o;47194:83::-;47237:4;47261:8;;;;;;;;;;;47254:15;;47194:83;:::o;47099:87::-;47144:4;47168:10;;;;;;;;;;;47161:17;;47099:87;:::o;46485:82::-;41814:12;:10;:12::i;:::-;41803:23;;:7;:5;:7::i;:::-;:23;;;41795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46551:8:::1;;;;;;;;;;;46550:9;46539:8;;:20;;;;;;;;;;;;;;;;;;46485:82::o:0;46828:113::-;46882:13;46915:18;46908:25;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46828:113;:::o;17763:144::-;17827:7;17870:27;17889:7;17870:18;:27::i;:::-;17847:52;;17763:144;;;:::o;46690:130::-;41814:12;:10;:12::i;:::-;41803:23;;:7;:5;:7::i;:::-;:23;;;41795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46796:16:::1;46778:15;:34;;;;;;;;;;;;:::i;:::-;;46690:130:::0;:::o;13617:234::-;13681:7;13733:1;13705:24;13723:5;13705:17;:24::i;:::-;:29;13701:70;;;13743:28;;;;;;;;;;;;;;13701:70;8962:13;13789:18;:25;13808:5;13789:25;;;;;;;;;;;;;;;;:54;13782:61;;13617:234;;;:::o;42234:103::-;41814:12;:10;:12::i;:::-;41803:23;;:7;:5;:7::i;:::-;:23;;;41795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42299:30:::1;42326:1;42299:18;:30::i;:::-;42234:103::o:0;43238:55::-;43292:1;43238:55;:::o;45679:338::-;41814:12;:10;:12::i;:::-;41803:23;;:7;:5;:7::i;:::-;:23;;;41795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45783:1:::1;45762:14;:18;45777:2;45762:18;;;;;;;;;;;;;;;;:22;45754:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;45870:8;45847:19;;:31;;;;;;;:::i;:::-;;;;;;;;45911:8;45889:14;:18;45904:2;45889:18;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;45937:40;45957:19;;45937:40;;;;;;:::i;:::-;;;;;;;;45990:19;45996:2;46000:8;45990:5;:19::i;:::-;45679:338:::0;;:::o;41583:87::-;41629:7;41656:6;;;;;;;;;;;41649:13;;41583:87;:::o;18143:104::-;18199:13;18232:7;18225:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18143:104;:::o;45157:514::-;38681:1;39279:7;;:19;;39271:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;38681:1;39412:7;:18;;;;45228:10:::1;;;;;;;;;;;45220:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;43292:1;45316:8;45280:21;:33;45302:10;45280:33;;;;;;;;;;;;;;;;:44;;;;:::i;:::-;45279:77;;45271:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;45482:19;;43226:5;45465:36;;;;:::i;:::-;45446:13;:11;:13::i;:::-;45435:8;:24;;;;:::i;:::-;45434:68;;45426:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;45615:8;45578:21;:33;45600:10;45578:33;;;;;;;;;;;;;;;;:45;;;;;;;:::i;:::-;;;;;;;;45636:27;45642:10;45654:8;45636:5;:27::i;:::-;38637:1:::0;39591:7;:22;;;;45157:514;:::o;20259:308::-;20370:19;:17;:19::i;:::-;20358:31;;:8;:31;;;20354:61;;;20398:17;;;;;;;;;;;;;;20354:61;20480:8;20428:18;:39;20447:19;:17;:19::i;:::-;20428:39;;;;;;;;;;;;;;;:49;20468:8;20428:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;20540:8;20504:55;;20519:19;:17;:19::i;:::-;20504:55;;;20550:8;20504:55;;;;;;:::i;:::-;;;;;;;;20259:308;;:::o;21366:396::-;21533:28;21543:4;21549:2;21553:7;21533:9;:28::i;:::-;21594:1;21576:2;:14;;;:19;21572:183;;21615:56;21646:4;21652:2;21656:7;21665:5;21615:30;:56::i;:::-;21610:145;;21699:40;;;;;;;;;;;;;;21610:145;21572:183;21366:396;;;;:::o;46025:356::-;46090:13;46121:16;46129:7;46121;:16::i;:::-;46116:59;;46146:29;;;;;;;;;;;;;;46116:59;46188:21;46212:8;;;;;;;;;;;:47;;46241:18;46212:47;;;46223:15;46212:47;46188:71;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46302:1;46283:7;46277:21;:26;;:96;;;;;;;;;;;;;;;;;46330:7;46339:18;46349:7;46339:9;:18::i;:::-;46313:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46277:96;46270:103;;;46025:356;;;:::o;47285:129::-;47353:7;47380:21;:26;47402:3;47380:26;;;;;;;;;;;;;;;;47373:33;;47285:129;;;:::o;20638:164::-;20735:4;20759:18;:25;20778:5;20759:25;;;;;;;;;;;;;;;:35;20785:8;20759:35;;;;;;;;;;;;;;;;;;;;;;;;;20752:42;;20638:164;;;;:::o;42492:201::-;41814:12;:10;:12::i;:::-;41803:23;;:7;:5;:7::i;:::-;:23;;;41795:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42601:1:::1;42581:22;;:8;:22;;;;42573:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42657:28;42676:8;42657:18;:28::i;:::-;42492:201:::0;:::o;22017:273::-;22074:4;22130:7;22111:15;:13;:15::i;:::-;:26;;:66;;;;;22164:13;;22154:7;:23;22111:66;:152;;;;;22262:1;9732:8;22215:17;:26;22233:7;22215:26;;;;;;;;;;;;:43;:48;22111:152;22091:172;;22017:273;;;:::o;15278:1129::-;15345:7;15365:12;15380:7;15365:22;;15448:4;15429:15;:13;:15::i;:::-;:23;15425:915;;15482:13;;15475:4;:20;15471:869;;;15520:14;15537:17;:23;15555:4;15537:23;;;;;;;;;;;;15520:40;;15653:1;9732:8;15626:6;:23;:28;15622:699;;;16145:113;16162:1;16152:6;:11;16145:113;;;16205:17;:25;16223:6;;;;;;;16205:25;;;;;;;;;;;;16196:34;;16145:113;;;16291:6;16284:13;;;;;;15622:699;15497:843;15471:869;15425:915;16368:31;;;;;;;;;;;;;;15278:1129;;;;:::o;34691:105::-;34751:7;34778:10;34771:17;;34691:105;:::o;11516:92::-;11572:7;11516:92;:::o;40307:98::-;40360:7;40387:10;40380:17;;40307:98;:::o;25683:2654::-;25798:27;25828;25847:7;25828:18;:27::i;:::-;25798:57;;25913:4;25872:45;;25888:19;25872:45;;;25868:86;;25926:28;;;;;;;;;;;;;;25868:86;25967:23;25993:15;:24;26009:7;25993:24;;;;;;;;;;;;;;;;;;;;;25967:50;;26030:22;26079:4;26056:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;26100:43;26117:4;26123:19;:17;:19::i;:::-;26100:16;:43::i;:::-;26056:87;:142;;;;26179:19;:17;:19::i;:::-;26160:38;;:15;:38;;;26056:142;26030:169;;26217:17;26212:66;;26243:35;;;;;;;;;;;;;;26212:66;26318:1;26293:21;26311:2;26293:17;:21::i;:::-;:26;26289:62;;;26328:23;;;;;;;;;;;;;;26289:62;26364:43;26386:4;26392:2;26396:7;26405:1;26364:21;:43::i;:::-;26515:1;26477:34;26495:15;26477:17;:34::i;:::-;:39;26473:103;;26540:15;:24;26556:7;26540:24;;;;;;;;;;;;26533:31;;;;;;;;;;;26473:103;26943:18;:24;26962:4;26943:24;;;;;;;;;;;;;;;;26941:26;;;;;;;;;;;;27012:18;:22;27031:2;27012:22;;;;;;;;;;;;;;;;27010:24;;;;;;;;;;;10010:8;9616:3;27393:15;:41;;27351:21;27369:2;27351:17;:21::i;:::-;:84;:128;27305:17;:26;27323:7;27305:26;;;;;;;;;;;:174;;;;27649:1;10010:8;27599:19;:46;:51;27595:626;;;27671:19;27703:1;27693:7;:11;27671:33;;27860:1;27826:17;:30;27844:11;27826:30;;;;;;;;;;;;:35;27822:384;;;27964:13;;27949:11;:28;27945:242;;28144:19;28111:17;:30;28129:11;28111:30;;;;;;;;;;;:52;;;;27945:242;27822:384;27652:569;27595:626;28268:7;28264:2;28249:27;;28258:4;28249:27;;;;;;;;;;;;28287:42;28308:4;28314:2;28318:7;28327:1;28287:20;:42::i;:::-;25787:2550;;;25683:2654;;;:::o;19063:148::-;19127:14;19188:5;19178:15;;19063:148;;;:::o;42853:191::-;42927:16;42946:6;;;;;;;;;;;42927:25;;42972:8;42963:6;;:17;;;;;;;;;;;;;;;;;;43027:8;42996:40;;43017:8;42996:40;;;;;;;;;;;;42916:128;42853:191;:::o;23819:1610::-;23884:20;23907:13;;23884:36;;23960:1;23935:21;23953:2;23935:17;:21::i;:::-;:26;23931:58;;;23970:19;;;;;;;;;;;;;;23931:58;24016:1;24004:8;:13;24000:44;;;24026:18;;;;;;;;;;;;;;24000:44;24057:61;24087:1;24091:2;24095:12;24109:8;24057:21;:61::i;:::-;24661:1;9099:2;24632:1;:25;;24631:31;24619:8;:44;24593:18;:22;24612:2;24593:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;9875:3;25062:29;25089:1;25077:8;:13;25062:14;:29::i;:::-;:56;;9616:3;24999:15;:41;;24957:21;24975:2;24957:17;:21::i;:::-;:84;:162;24906:17;:31;24924:12;24906:31;;;;;;;;;;;:213;;;;25136:14;25165:119;25232:8;;;;;;25217:12;:23;25213:2;25192:49;;25209:1;25192:49;;;;;;;;;;;;25274:8;25265:6;:17;25165:119;;25331:8;25316:12;:23;25300:13;:39;;;;24370:981;25361:60;25390:1;25394:2;25398:12;25412:8;25361:20;:60::i;:::-;23873:1556;23819:1610;;:::o;32160:716::-;32323:4;32369:2;32344:45;;;32390:19;:17;:19::i;:::-;32411:4;32417:7;32426:5;32344:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32340:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32644:1;32627:6;:13;:18;32623:235;;;32673:40;;;;;;;;;;;;;;32623:235;32816:6;32810:13;32801:6;32797:2;32793:15;32786:38;32340:529;32513:54;;;32503:64;;;:6;:64;;;;32496:71;;;32160:716;;;;;;:::o;34902:1960::-;34959:17;35378:3;35371:4;35365:11;35361:21;35354:28;;35469:3;35463:4;35456:17;35575:3;36031:5;36161:1;36156:3;36152:11;36145:18;;36298:2;36292:4;36288:13;36284:2;36280:22;36275:3;36267:36;36339:2;36333:4;36329:13;36321:21;;35923:697;36358:4;35923:697;;;36549:1;36544:3;36540:11;36533:18;;36600:2;36594:4;36590:13;36586:2;36582:22;36577:3;36569:36;36453:2;36447:4;36443:13;36435:21;;35923:697;;;35927:430;36659:3;36654;36650:13;36774:2;36769:3;36765:12;36758:19;;36837:6;36832:3;36825:19;34998:1857;;34902:1960;;;:::o;33524:159::-;;;;;:::o;34342:158::-;;;;;:::o;19298:142::-;19356:14;19417:5;19407:15;;19298:142;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:364::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:71;7998:6;7993:3;7934:71;:::i;:::-;7927:78;;8014:52;8059:6;8054:3;8047:4;8040:5;8036:16;8014:52;:::i;:::-;8091:29;8113:6;8091:29;:::i;:::-;8086:3;8082:39;8075:46;;7855:272;7763:364;;;;:::o;8133:377::-;8239:3;8267:39;8300:5;8267:39;:::i;:::-;8322:89;8404:6;8399:3;8322:89;:::i;:::-;8315:96;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:6;8492:3;8488:16;8481:23;;8243:267;8133:377;;;;:::o;8516:366::-;8658:3;8679:67;8743:2;8738:3;8679:67;:::i;:::-;8672:74;;8755:93;8844:3;8755:93;:::i;:::-;8873:2;8868:3;8864:12;8857:19;;8516:366;;;:::o;8888:::-;9030:3;9051:67;9115:2;9110:3;9051:67;:::i;:::-;9044:74;;9127:93;9216:3;9127:93;:::i;:::-;9245:2;9240:3;9236:12;9229:19;;8888:366;;;:::o;9260:::-;9402:3;9423:67;9487:2;9482:3;9423:67;:::i;:::-;9416:74;;9499:93;9588:3;9499:93;:::i;:::-;9617:2;9612:3;9608:12;9601:19;;9260:366;;;:::o;9632:::-;9774:3;9795:67;9859:2;9854:3;9795:67;:::i;:::-;9788:74;;9871:93;9960:3;9871:93;:::i;:::-;9989:2;9984:3;9980:12;9973:19;;9632:366;;;:::o;10004:400::-;10164:3;10185:84;10267:1;10262:3;10185:84;:::i;:::-;10178:91;;10278:93;10367:3;10278:93;:::i;:::-;10396:1;10391:3;10387:11;10380:18;;10004:400;;;:::o;10410:366::-;10552:3;10573:67;10637:2;10632:3;10573:67;:::i;:::-;10566:74;;10649:93;10738:3;10649:93;:::i;:::-;10767:2;10762:3;10758:12;10751:19;;10410:366;;;:::o;10782:::-;10924:3;10945:67;11009:2;11004:3;10945:67;:::i;:::-;10938:74;;11021:93;11110:3;11021:93;:::i;:::-;11139:2;11134:3;11130:12;11123:19;;10782:366;;;:::o;11154:::-;11296:3;11317:67;11381:2;11376:3;11317:67;:::i;:::-;11310:74;;11393:93;11482:3;11393:93;:::i;:::-;11511:2;11506:3;11502:12;11495:19;;11154:366;;;:::o;11526:118::-;11613:24;11631:5;11613:24;:::i;:::-;11608:3;11601:37;11526:118;;:::o;11650:701::-;11931:3;11953:95;12044:3;12035:6;11953:95;:::i;:::-;11946:102;;12065:95;12156:3;12147:6;12065:95;:::i;:::-;12058:102;;12177:148;12321:3;12177:148;:::i;:::-;12170:155;;12342:3;12335:10;;11650:701;;;;;:::o;12357:222::-;12450:4;12488:2;12477:9;12473:18;12465:26;;12501:71;12569:1;12558:9;12554:17;12545:6;12501:71;:::i;:::-;12357:222;;;;:::o;12585:640::-;12780:4;12818:3;12807:9;12803:19;12795:27;;12832:71;12900:1;12889:9;12885:17;12876:6;12832:71;:::i;:::-;12913:72;12981:2;12970:9;12966:18;12957:6;12913:72;:::i;:::-;12995;13063:2;13052:9;13048:18;13039:6;12995:72;:::i;:::-;13114:9;13108:4;13104:20;13099:2;13088:9;13084:18;13077:48;13142:76;13213:4;13204:6;13142:76;:::i;:::-;13134:84;;12585:640;;;;;;;:::o;13231:210::-;13318:4;13356:2;13345:9;13341:18;13333:26;;13369:65;13431:1;13420:9;13416:17;13407:6;13369:65;:::i;:::-;13231:210;;;;:::o;13447:313::-;13560:4;13598:2;13587:9;13583:18;13575:26;;13647:9;13641:4;13637:20;13633:1;13622:9;13618:17;13611:47;13675:78;13748:4;13739:6;13675:78;:::i;:::-;13667:86;;13447:313;;;;:::o;13766:419::-;13932:4;13970:2;13959:9;13955:18;13947:26;;14019:9;14013:4;14009:20;14005:1;13994:9;13990:17;13983:47;14047:131;14173:4;14047:131;:::i;:::-;14039:139;;13766:419;;;:::o;14191:::-;14357:4;14395:2;14384:9;14380:18;14372:26;;14444:9;14438:4;14434:20;14430:1;14419:9;14415:17;14408:47;14472:131;14598:4;14472:131;:::i;:::-;14464:139;;14191:419;;;:::o;14616:::-;14782:4;14820:2;14809:9;14805:18;14797:26;;14869:9;14863:4;14859:20;14855:1;14844:9;14840:17;14833:47;14897:131;15023:4;14897:131;:::i;:::-;14889:139;;14616:419;;;:::o;15041:::-;15207:4;15245:2;15234:9;15230:18;15222:26;;15294:9;15288:4;15284:20;15280:1;15269:9;15265:17;15258:47;15322:131;15448:4;15322:131;:::i;:::-;15314:139;;15041:419;;;:::o;15466:::-;15632:4;15670:2;15659:9;15655:18;15647:26;;15719:9;15713:4;15709:20;15705:1;15694:9;15690:17;15683:47;15747:131;15873:4;15747:131;:::i;:::-;15739:139;;15466:419;;;:::o;15891:::-;16057:4;16095:2;16084:9;16080:18;16072:26;;16144:9;16138:4;16134:20;16130:1;16119:9;16115:17;16108:47;16172:131;16298:4;16172:131;:::i;:::-;16164:139;;15891:419;;;:::o;16316:::-;16482:4;16520:2;16509:9;16505:18;16497:26;;16569:9;16563:4;16559:20;16555:1;16544:9;16540:17;16533:47;16597:131;16723:4;16597:131;:::i;:::-;16589:139;;16316:419;;;:::o;16741:222::-;16834:4;16872:2;16861:9;16857:18;16849:26;;16885:71;16953:1;16942:9;16938:17;16929:6;16885:71;:::i;:::-;16741:222;;;;:::o;16969:129::-;17003:6;17030:20;;:::i;:::-;17020:30;;17059:33;17087:4;17079:6;17059:33;:::i;:::-;16969:129;;;:::o;17104:75::-;17137:6;17170:2;17164:9;17154:19;;17104:75;:::o;17185:307::-;17246:4;17336:18;17328:6;17325:30;17322:56;;;17358:18;;:::i;:::-;17322:56;17396:29;17418:6;17396:29;:::i;:::-;17388:37;;17480:4;17474;17470:15;17462:23;;17185:307;;;:::o;17498:308::-;17560:4;17650:18;17642:6;17639:30;17636:56;;;17672:18;;:::i;:::-;17636:56;17710:29;17732:6;17710:29;:::i;:::-;17702:37;;17794:4;17788;17784:15;17776:23;;17498:308;;;:::o;17812:98::-;17863:6;17897:5;17891:12;17881:22;;17812:98;;;:::o;17916:99::-;17968:6;18002:5;17996:12;17986:22;;17916:99;;;:::o;18021:168::-;18104:11;18138:6;18133:3;18126:19;18178:4;18173:3;18169:14;18154:29;;18021:168;;;;:::o;18195:169::-;18279:11;18313:6;18308:3;18301:19;18353:4;18348:3;18344:14;18329:29;;18195:169;;;;:::o;18370:148::-;18472:11;18509:3;18494:18;;18370:148;;;;:::o;18524:305::-;18564:3;18583:20;18601:1;18583:20;:::i;:::-;18578:25;;18617:20;18635:1;18617:20;:::i;:::-;18612:25;;18771:1;18703:66;18699:74;18696:1;18693:81;18690:107;;;18777:18;;:::i;:::-;18690:107;18821:1;18818;18814:9;18807:16;;18524:305;;;;:::o;18835:191::-;18875:4;18895:20;18913:1;18895:20;:::i;:::-;18890:25;;18929:20;18947:1;18929:20;:::i;:::-;18924:25;;18968:1;18965;18962:8;18959:34;;;18973:18;;:::i;:::-;18959:34;19018:1;19015;19011:9;19003:17;;18835:191;;;;:::o;19032:96::-;19069:7;19098:24;19116:5;19098:24;:::i;:::-;19087:35;;19032:96;;;:::o;19134:90::-;19168:7;19211:5;19204:13;19197:21;19186:32;;19134:90;;;:::o;19230:149::-;19266:7;19306:66;19299:5;19295:78;19284:89;;19230:149;;;:::o;19385:126::-;19422:7;19462:42;19455:5;19451:54;19440:65;;19385:126;;;:::o;19517:77::-;19554:7;19583:5;19572:16;;19517:77;;;:::o;19600:154::-;19684:6;19679:3;19674;19661:30;19746:1;19737:6;19732:3;19728:16;19721:27;19600:154;;;:::o;19760:307::-;19828:1;19838:113;19852:6;19849:1;19846:13;19838:113;;;19937:1;19932:3;19928:11;19922:18;19918:1;19913:3;19909:11;19902:39;19874:2;19871:1;19867:10;19862:15;;19838:113;;;19969:6;19966:1;19963:13;19960:101;;;20049:1;20040:6;20035:3;20031:16;20024:27;19960:101;19809:258;19760:307;;;:::o;20073:320::-;20117:6;20154:1;20148:4;20144:12;20134:22;;20201:1;20195:4;20191:12;20222:18;20212:81;;20278:4;20270:6;20266:17;20256:27;;20212:81;20340:2;20332:6;20329:14;20309:18;20306:38;20303:84;;;20359:18;;:::i;:::-;20303:84;20124:269;20073:320;;;:::o;20399:281::-;20482:27;20504:4;20482:27;:::i;:::-;20474:6;20470:40;20612:6;20600:10;20597:22;20576:18;20564:10;20561:34;20558:62;20555:88;;;20623:18;;:::i;:::-;20555:88;20663:10;20659:2;20652:22;20442:238;20399:281;;:::o;20686:180::-;20734:77;20731:1;20724:88;20831:4;20828:1;20821:15;20855:4;20852:1;20845:15;20872:180;20920:77;20917:1;20910:88;21017:4;21014:1;21007:15;21041:4;21038:1;21031:15;21058:180;21106:77;21103:1;21096:88;21203:4;21200:1;21193:15;21227:4;21224:1;21217:15;21244:117;21353:1;21350;21343:12;21367:117;21476:1;21473;21466:12;21490:117;21599:1;21596;21589:12;21613:117;21722:1;21719;21712:12;21736:102;21777:6;21828:2;21824:7;21819:2;21812:5;21808:14;21804:28;21794:38;;21736:102;;;:::o;21844:225::-;21984:34;21980:1;21972:6;21968:14;21961:58;22053:8;22048:2;22040:6;22036:15;22029:33;21844:225;:::o;22075:232::-;22215:34;22211:1;22203:6;22199:14;22192:58;22284:15;22279:2;22271:6;22267:15;22260:40;22075:232;:::o;22313:239::-;22453:34;22449:1;22441:6;22437:14;22430:58;22522:22;22517:2;22509:6;22505:15;22498:47;22313:239;:::o;22558:165::-;22698:17;22694:1;22686:6;22682:14;22675:41;22558:165;:::o;22729:155::-;22869:7;22865:1;22857:6;22853:14;22846:31;22729:155;:::o;22890:182::-;23030:34;23026:1;23018:6;23014:14;23007:58;22890:182;:::o;23078:245::-;23218:34;23214:1;23206:6;23202:14;23195:58;23287:28;23282:2;23274:6;23270:15;23263:53;23078:245;:::o;23329:181::-;23469:33;23465:1;23457:6;23453:14;23446:57;23329:181;:::o;23516:122::-;23589:24;23607:5;23589:24;:::i;:::-;23582:5;23579:35;23569:63;;23628:1;23625;23618:12;23569:63;23516:122;:::o;23644:116::-;23714:21;23729:5;23714:21;:::i;:::-;23707:5;23704:32;23694:60;;23750:1;23747;23740:12;23694:60;23644:116;:::o;23766:120::-;23838:23;23855:5;23838:23;:::i;:::-;23831:5;23828:34;23818:62;;23876:1;23873;23866:12;23818:62;23766:120;:::o;23892:122::-;23965:24;23983:5;23965:24;:::i;:::-;23958:5;23955:35;23945:63;;24004:1;24001;23994:12;23945:63;23892:122;:::o

Swarm Source

ipfs://2866aea5c80cf22c313fe7236e1b068cb0062c9405e2b41d54359f17658eed9e
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.