ETH Price: $3,046.48 (+4.50%)

Token

AIlldoitwtftown (AILLDIWTFTOWN)
 

Overview

Max Total Supply

1,111 AILLDIWTFTOWN

Holders

297

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 AILLDIWTFTOWN
0x60c2604CA03823aC9AAccb2317e111FBB9186504
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:
ailldoitwtftown

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

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

// File: erc721a/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();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

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

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

// 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/aidoitwtftown.sol






pragma solidity ^0.8.7;

//     _____  .___/\.__  .__        .___       .__  __   
//    /  _  \ |   )/|  | |  |     __| _/____   |__|/  |_ 
//   /  /_\  \|   | |  | |  |    / __ |/  _ \  |  \   __\
//  /    |    \   | |  |_|  |__ / /_/ (  <_> ) |  ||  |  
//  \____|__  /___| |____/____/ \____ |\____/  |__||__|  
//          \/                       \/                

contract ailldoitwtftown is ERC721A, Ownable {
    using SafeMath for uint256;
    using Strings for uint256;

    uint256 public maxPerTx = 10;
    uint256 public maxSupply = 1000;
    uint256 public freeMintMax = 1000; // Free supply
    uint256 public price = 0.002 ether;
    uint256 public maxFreePerWallet = 3; 

    string private baseURI = "";
    string public constant baseExtension = ".json";

    mapping(address => uint256) private _mintedFreeAmount; 

    bool public paused = true;
    bool public revealed = true;
    error freeMintIsOver();

    constructor() ERC721A("AIlldoitwtftown", "AILLDIWTFTOWN") {}

    function mint(uint256 count) external payable {
        uint256 cost = price;
        bool isFree = ((totalSupply() + count < freeMintMax + 1) &&
            (_mintedFreeAmount[msg.sender] + count <= maxFreePerWallet));

        if (isFree) {
            cost = 0;
        }

        require(!paused, "Contract Paused.");
        require(msg.value >= count * cost, "Please send the exact amount.");
        require(totalSupply() + count < maxSupply + 1, "No more");
        require(count < maxPerTx + 1, "Max per TX reached.");

        if (isFree) {
            _mintedFreeAmount[msg.sender] += count;
        }

        _safeMint(msg.sender, count);
    } 

    function devMint(uint256 _number) external onlyOwner {
        require(totalSupply() + _number <= maxSupply, "Minting would exceed maxSupply");
        _safeMint(_msgSender(), _number);
    }

    function setMaxFreeMintSupply(uint256 _max) public onlyOwner {
        freeMintMax = _max;
    }

    function setMaxPaidPerTx(uint256 _max) public onlyOwner {
        maxPerTx = _max;
    }

    function setMaxSupply(uint256 _max) public onlyOwner {
        maxSupply = _max;
    }

    function setMaxFreePerWallet(uint256 _max) external onlyOwner {
        maxFreePerWallet = _max;
    } 

    function reveal() public onlyOwner {
        revealed = true;
    }  

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

    function minted(address _owner) public view returns (uint256) {
        return _numberMinted(_owner);
    }

    function _withdraw(address _address, uint256 _amount) external onlyOwner {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "Failed to withdraw Ether");
    }

    function setPrice(uint256 _price) external onlyOwner {
        price = _price;
    }

    function setPause(bool _state) external onlyOwner {
        paused = _state;
    }

    function _baseURI() internal view virtual override returns (string memory) {
      return baseURI;
    }
    
    function setBaseURI(string memory baseURI_) external onlyOwner {
        baseURI = baseURI_;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory)
    {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");


        string memory _tokenURI = super.tokenURI(tokenId);
        return bytes(_tokenURI).length > 0 ? string(abi.encodePacked(_tokenURI, ".json")) : "";
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"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"},{"inputs":[],"name":"freeMintIsOver","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"_withdraw","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":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_number","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMintMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreePerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxFreeMintSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxFreePerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxPaidPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600a6009556103e8600a556103e8600b5566071afd498d0000600c556003600d5560405180602001604052806000815250600e90805190602001906200004c92919062000244565b506001601060006101000a81548160ff0219169083151502179055506001601060016101000a81548160ff0219169083151502179055503480156200009057600080fd5b506040518060400160405280600f81526020017f41496c6c646f6974777466746f776e00000000000000000000000000000000008152506040518060400160405280600d81526020017f41494c4c4449575446544f574e0000000000000000000000000000000000000081525081600290805190602001906200011592919062000244565b5080600390805190602001906200012e92919062000244565b506200013f6200016d60201b60201c565b6000819055505050620001676200015b6200017660201b60201c565b6200017e60201b60201c565b62000359565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200025290620002f4565b90600052602060002090601f016020900481019282620002765760008555620002c2565b82601f106200029157805160ff1916838001178555620002c2565b82800160010185558215620002c2579182015b82811115620002c1578251825591602001919060010190620002a4565b5b509050620002d19190620002d5565b5090565b5b80821115620002f0576000816000905550600101620002d6565b5090565b600060028204905060018216806200030d57607f821691505b602082108114156200032457620003236200032a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61367480620003696000396000f3fe60806040526004361061021a5760003560e01c806370a0823111610123578063a7027357116100ab578063c87b56dd1161006f578063c87b56dd14610786578063d5abeb01146107c3578063e985e9c5146107ee578063f2fde38b1461082b578063f968adbe146108545761021a565b8063a7027357146106b5578063b790a77b146106e0578063b88d4fde14610709578063bedb86fb14610732578063c66828621461075b5761021a565b806395d89b41116100f257806395d89b4114610603578063a035b1fe1461062e578063a0712d6814610659578063a22cb46514610675578063a475b5dd1461069e5761021a565b806370a082311461055b578063715018a6146105985780638da5cb5b146105af57806391b7f5ed146105da5761021a565b8063375a069a116101a657806355f804b31161017557806355f804b3146104785780635c975abb146104a15780636352211e146104cc5780636d7c4a4b146105095780636f8b44b0146105325761021a565b8063375a069a146103d057806342842e0e146103f95780634a91d1b814610422578063518302271461044d5761021a565b8063095ea7b3116101ed578063095ea7b3146102ed57806318160ddd146103165780631c3e88f6146103415780631e7269c51461036a57806323b872dd146103a75761021a565b806301ffc9a71461021f57806306fdde031461025c57806307d3636714610287578063081812fc146102b0575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190612b4e565b61087f565b6040516102539190612f31565b60405180910390f35b34801561026857600080fd5b50610271610911565b60405161027e9190612f4c565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190612bf1565b6109a3565b005b3480156102bc57600080fd5b506102d760048036038101906102d29190612bf1565b610a29565b6040516102e49190612eca565b60405180910390f35b3480156102f957600080fd5b50610314600480360381019061030f9190612ae1565b610aa5565b005b34801561032257600080fd5b5061032b610c4c565b604051610338919061308e565b60405180910390f35b34801561034d57600080fd5b5061036860048036038101906103639190612bf1565b610c63565b005b34801561037657600080fd5b50610391600480360381019061038c919061295e565b610ce9565b60405161039e919061308e565b60405180910390f35b3480156103b357600080fd5b506103ce60048036038101906103c991906129cb565b610cfb565b005b3480156103dc57600080fd5b506103f760048036038101906103f29190612bf1565b610d0b565b005b34801561040557600080fd5b50610420600480360381019061041b91906129cb565b610df2565b005b34801561042e57600080fd5b50610437610e12565b604051610444919061308e565b60405180910390f35b34801561045957600080fd5b50610462610e18565b60405161046f9190612f31565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a9190612ba8565b610e2b565b005b3480156104ad57600080fd5b506104b6610ec1565b6040516104c39190612f31565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee9190612bf1565b610ed4565b6040516105009190612eca565b60405180910390f35b34801561051557600080fd5b50610530600480360381019061052b9190612bf1565b610ee6565b005b34801561053e57600080fd5b5061055960048036038101906105549190612bf1565b610f6c565b005b34801561056757600080fd5b50610582600480360381019061057d919061295e565b610ff2565b60405161058f919061308e565b60405180910390f35b3480156105a457600080fd5b506105ad6110ab565b005b3480156105bb57600080fd5b506105c4611133565b6040516105d19190612eca565b60405180910390f35b3480156105e657600080fd5b5061060160048036038101906105fc9190612bf1565b61115d565b005b34801561060f57600080fd5b506106186111e3565b6040516106259190612f4c565b60405180910390f35b34801561063a57600080fd5b50610643611275565b604051610650919061308e565b60405180910390f35b610673600480360381019061066e9190612bf1565b61127b565b005b34801561068157600080fd5b5061069c60048036038101906106979190612aa1565b6114c8565b005b3480156106aa57600080fd5b506106b3611640565b005b3480156106c157600080fd5b506106ca6116d9565b6040516106d7919061308e565b60405180910390f35b3480156106ec57600080fd5b5061070760048036038101906107029190612ae1565b6116df565b005b34801561071557600080fd5b50610730600480360381019061072b9190612a1e565b61180c565b005b34801561073e57600080fd5b5061075960048036038101906107549190612b21565b61187f565b005b34801561076757600080fd5b50610770611918565b60405161077d9190612f4c565b60405180910390f35b34801561079257600080fd5b506107ad60048036038101906107a89190612bf1565b611951565b6040516107ba9190612f4c565b60405180910390f35b3480156107cf57600080fd5b506107d86119ef565b6040516107e5919061308e565b60405180910390f35b3480156107fa57600080fd5b506108156004803603810190610810919061298b565b6119f5565b6040516108229190612f31565b60405180910390f35b34801561083757600080fd5b50610852600480360381019061084d919061295e565b611a89565b005b34801561086057600080fd5b50610869611b81565b604051610876919061308e565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108da57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061090a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610920906132e4565b80601f016020809104026020016040519081016040528092919081815260200182805461094c906132e4565b80156109995780601f1061096e57610100808354040283529160200191610999565b820191906000526020600020905b81548152906001019060200180831161097c57829003601f168201915b5050505050905090565b6109ab611b87565b73ffffffffffffffffffffffffffffffffffffffff166109c9611133565b73ffffffffffffffffffffffffffffffffffffffff1614610a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1690612fee565b60405180910390fd5b8060098190555050565b6000610a3482611b8f565b610a6a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ab082611bee565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b18576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b37611cbc565b73ffffffffffffffffffffffffffffffffffffffff1614610b9a57610b6381610b5e611cbc565b6119f5565b610b99576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610c56611cc4565b6001546000540303905090565b610c6b611b87565b73ffffffffffffffffffffffffffffffffffffffff16610c89611133565b73ffffffffffffffffffffffffffffffffffffffff1614610cdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd690612fee565b60405180910390fd5b80600b8190555050565b6000610cf482611ccd565b9050919050565b610d06838383611d24565b505050565b610d13611b87565b73ffffffffffffffffffffffffffffffffffffffff16610d31611133565b73ffffffffffffffffffffffffffffffffffffffff1614610d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7e90612fee565b60405180910390fd5b600a5481610d93610c4c565b610d9d919061317e565b1115610dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd590612fae565b60405180910390fd5b610def610de9611b87565b826120ce565b50565b610e0d8383836040518060200160405280600081525061180c565b505050565b600b5481565b601060019054906101000a900460ff1681565b610e33611b87565b73ffffffffffffffffffffffffffffffffffffffff16610e51611133565b73ffffffffffffffffffffffffffffffffffffffff1614610ea7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9e90612fee565b60405180910390fd5b80600e9080519060200190610ebd929190612772565b5050565b601060009054906101000a900460ff1681565b6000610edf82611bee565b9050919050565b610eee611b87565b73ffffffffffffffffffffffffffffffffffffffff16610f0c611133565b73ffffffffffffffffffffffffffffffffffffffff1614610f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5990612fee565b60405180910390fd5b80600d8190555050565b610f74611b87565b73ffffffffffffffffffffffffffffffffffffffff16610f92611133565b73ffffffffffffffffffffffffffffffffffffffff1614610fe8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdf90612fee565b60405180910390fd5b80600a8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561105a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6110b3611b87565b73ffffffffffffffffffffffffffffffffffffffff166110d1611133565b73ffffffffffffffffffffffffffffffffffffffff1614611127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111e90612fee565b60405180910390fd5b61113160006120ec565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611165611b87565b73ffffffffffffffffffffffffffffffffffffffff16611183611133565b73ffffffffffffffffffffffffffffffffffffffff16146111d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d090612fee565b60405180910390fd5b80600c8190555050565b6060600380546111f2906132e4565b80601f016020809104026020016040519081016040528092919081815260200182805461121e906132e4565b801561126b5780601f106112405761010080835404028352916020019161126b565b820191906000526020600020905b81548152906001019060200180831161124e57829003601f168201915b5050505050905090565b600c5481565b6000600c54905060006001600b54611293919061317e565b8361129c610c4c565b6112a6919061317e565b1080156112ff5750600d5483600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112fc919061317e565b11155b9050801561130c57600091505b601060009054906101000a900460ff161561135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390612fce565b60405180910390fd5b818361136891906131d4565b3410156113aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a19061304e565b60405180910390fd5b6001600a546113b9919061317e565b836113c2610c4c565b6113cc919061317e565b1061140c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140390612f6e565b60405180910390fd5b600160095461141b919061317e565b831061145c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114539061306e565b60405180910390fd5b80156114b95782600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114b1919061317e565b925050819055505b6114c333846120ce565b505050565b6114d0611cbc565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611535576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611542611cbc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115ef611cbc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116349190612f31565b60405180910390a35050565b611648611b87565b73ffffffffffffffffffffffffffffffffffffffff16611666611133565b73ffffffffffffffffffffffffffffffffffffffff16146116bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b390612fee565b60405180910390fd5b6001601060016101000a81548160ff021916908315150217905550565b600d5481565b6116e7611b87565b73ffffffffffffffffffffffffffffffffffffffff16611705611133565b73ffffffffffffffffffffffffffffffffffffffff161461175b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175290612fee565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161178190612eb5565b60006040518083038185875af1925050503d80600081146117be576040519150601f19603f3d011682016040523d82523d6000602084013e6117c3565b606091505b5050905080611807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fe9061302e565b60405180910390fd5b505050565b611817848484611d24565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461187957611842848484846121b2565b611878576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611887611b87565b73ffffffffffffffffffffffffffffffffffffffff166118a5611133565b73ffffffffffffffffffffffffffffffffffffffff16146118fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f290612fee565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525081565b606061195c82611b8f565b61199b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119929061300e565b60405180910390fd5b60006119a683612312565b905060008151116119c657604051806020016040528060008152506119e7565b806040516020016119d79190612e93565b6040516020818303038152906040525b915050919050565b600a5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a91611b87565b73ffffffffffffffffffffffffffffffffffffffff16611aaf611133565b73ffffffffffffffffffffffffffffffffffffffff1614611b05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afc90612fee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6c90612f8e565b60405180910390fd5b611b7e816120ec565b50565b60095481565b600033905090565b600081611b9a611cc4565b11158015611ba9575060005482105b8015611be7575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611bfd611cc4565b11611c8557600054811015611c845760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611c82575b6000811415611c78576004600083600190039350838152602001908152602001600020549050611c4d565b8092505050611cb7565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b6000611d2f82611bee565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d96576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611db7611cbc565b73ffffffffffffffffffffffffffffffffffffffff161480611de65750611de585611de0611cbc565b6119f5565b5b80611e2b5750611df4611cbc565b73ffffffffffffffffffffffffffffffffffffffff16611e1384610a29565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611e64576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ecb576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ed885858560016123b1565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611fd5866123b7565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316141561205f57600060018401905060006004600083815260200190815260200160002054141561205d57600054811461205c578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120c785858560016123c1565b5050505050565b6120e88282604051806020016040528060008152506123c7565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121d8611cbc565b8786866040518563ffffffff1660e01b81526004016121fa9493929190612ee5565b602060405180830381600087803b15801561221457600080fd5b505af192505050801561224557506040513d601f19601f820116820180604052508101906122429190612b7b565b60015b6122bf573d8060008114612275576040519150601f19603f3d011682016040523d82523d6000602084013e61227a565b606091505b506000815114156122b7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606061231d82611b8f565b612353576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061235d61267c565b905060008151141561237e57604051806020016040528060008152506123a9565b806123888461270e565b604051602001612399929190612e6f565b6040516020818303038152906040525b915050919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612434576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083141561246f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61247c60008583866123b1565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16124e160018514612768565b901b60a042901b6124f1866123b7565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146125f5575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125a560008784806001019550876121b2565b6125db576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106125365782600054146125f057600080fd5b612660565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106125f6575b81600081905550505061267660008583866123c1565b50505050565b6060600e805461268b906132e4565b80601f01602080910402602001604051908101604052809291908181526020018280546126b7906132e4565b80156127045780601f106126d957610100808354040283529160200191612704565b820191906000526020600020905b8154815290600101906020018083116126e757829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561275457600183039250600a81066030018353600a81049050612734565b508181036020830392508083525050919050565b6000819050919050565b82805461277e906132e4565b90600052602060002090601f0160209004810192826127a057600085556127e7565b82601f106127b957805160ff19168380011785556127e7565b828001600101855582156127e7579182015b828111156127e65782518255916020019190600101906127cb565b5b5090506127f491906127f8565b5090565b5b808211156128115760008160009055506001016127f9565b5090565b6000612828612823846130ce565b6130a9565b905082815260208101848484011115612844576128436133d9565b5b61284f8482856132a2565b509392505050565b600061286a612865846130ff565b6130a9565b905082815260208101848484011115612886576128856133d9565b5b6128918482856132a2565b509392505050565b6000813590506128a8816135e2565b92915050565b6000813590506128bd816135f9565b92915050565b6000813590506128d281613610565b92915050565b6000815190506128e781613610565b92915050565b600082601f830112612902576129016133d4565b5b8135612912848260208601612815565b91505092915050565b600082601f8301126129305761292f6133d4565b5b8135612940848260208601612857565b91505092915050565b60008135905061295881613627565b92915050565b600060208284031215612974576129736133e3565b5b600061298284828501612899565b91505092915050565b600080604083850312156129a2576129a16133e3565b5b60006129b085828601612899565b92505060206129c185828601612899565b9150509250929050565b6000806000606084860312156129e4576129e36133e3565b5b60006129f286828701612899565b9350506020612a0386828701612899565b9250506040612a1486828701612949565b9150509250925092565b60008060008060808587031215612a3857612a376133e3565b5b6000612a4687828801612899565b9450506020612a5787828801612899565b9350506040612a6887828801612949565b925050606085013567ffffffffffffffff811115612a8957612a886133de565b5b612a95878288016128ed565b91505092959194509250565b60008060408385031215612ab857612ab76133e3565b5b6000612ac685828601612899565b9250506020612ad7858286016128ae565b9150509250929050565b60008060408385031215612af857612af76133e3565b5b6000612b0685828601612899565b9250506020612b1785828601612949565b9150509250929050565b600060208284031215612b3757612b366133e3565b5b6000612b45848285016128ae565b91505092915050565b600060208284031215612b6457612b636133e3565b5b6000612b72848285016128c3565b91505092915050565b600060208284031215612b9157612b906133e3565b5b6000612b9f848285016128d8565b91505092915050565b600060208284031215612bbe57612bbd6133e3565b5b600082013567ffffffffffffffff811115612bdc57612bdb6133de565b5b612be88482850161291b565b91505092915050565b600060208284031215612c0757612c066133e3565b5b6000612c1584828501612949565b91505092915050565b612c278161322e565b82525050565b612c3681613240565b82525050565b6000612c4782613130565b612c518185613146565b9350612c618185602086016132b1565b612c6a816133e8565b840191505092915050565b6000612c808261313b565b612c8a8185613162565b9350612c9a8185602086016132b1565b612ca3816133e8565b840191505092915050565b6000612cb98261313b565b612cc38185613173565b9350612cd38185602086016132b1565b80840191505092915050565b6000612cec600783613162565b9150612cf7826133f9565b602082019050919050565b6000612d0f602683613162565b9150612d1a82613422565b604082019050919050565b6000612d32601e83613162565b9150612d3d82613471565b602082019050919050565b6000612d55601083613162565b9150612d608261349a565b602082019050919050565b6000612d78600583613173565b9150612d83826134c3565b600582019050919050565b6000612d9b602083613162565b9150612da6826134ec565b602082019050919050565b6000612dbe602f83613162565b9150612dc982613515565b604082019050919050565b6000612de1601883613162565b9150612dec82613564565b602082019050919050565b6000612e04601d83613162565b9150612e0f8261358d565b602082019050919050565b6000612e27600083613157565b9150612e32826135b6565b600082019050919050565b6000612e4a601383613162565b9150612e55826135b9565b602082019050919050565b612e6981613298565b82525050565b6000612e7b8285612cae565b9150612e878284612cae565b91508190509392505050565b6000612e9f8284612cae565b9150612eaa82612d6b565b915081905092915050565b6000612ec082612e1a565b9150819050919050565b6000602082019050612edf6000830184612c1e565b92915050565b6000608082019050612efa6000830187612c1e565b612f076020830186612c1e565b612f146040830185612e60565b8181036060830152612f268184612c3c565b905095945050505050565b6000602082019050612f466000830184612c2d565b92915050565b60006020820190508181036000830152612f668184612c75565b905092915050565b60006020820190508181036000830152612f8781612cdf565b9050919050565b60006020820190508181036000830152612fa781612d02565b9050919050565b60006020820190508181036000830152612fc781612d25565b9050919050565b60006020820190508181036000830152612fe781612d48565b9050919050565b6000602082019050818103600083015261300781612d8e565b9050919050565b6000602082019050818103600083015261302781612db1565b9050919050565b6000602082019050818103600083015261304781612dd4565b9050919050565b6000602082019050818103600083015261306781612df7565b9050919050565b6000602082019050818103600083015261308781612e3d565b9050919050565b60006020820190506130a36000830184612e60565b92915050565b60006130b36130c4565b90506130bf8282613316565b919050565b6000604051905090565b600067ffffffffffffffff8211156130e9576130e86133a5565b5b6130f2826133e8565b9050602081019050919050565b600067ffffffffffffffff82111561311a576131196133a5565b5b613123826133e8565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061318982613298565b915061319483613298565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131c9576131c8613347565b5b828201905092915050565b60006131df82613298565b91506131ea83613298565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561322357613222613347565b5b828202905092915050565b600061323982613278565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156132cf5780820151818401526020810190506132b4565b838111156132de576000848401525b50505050565b600060028204905060018216806132fc57607f821691505b602082108114156133105761330f613376565b5b50919050565b61331f826133e8565b810181811067ffffffffffffffff8211171561333e5761333d6133a5565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e6f206d6f726500000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e6720776f756c6420657863656564206d6178537570706c790000600082015250565b7f436f6e7472616374205061757365642e00000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4661696c656420746f2077697468647261772045746865720000000000000000600082015250565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b50565b7f4d61782070657220545820726561636865642e00000000000000000000000000600082015250565b6135eb8161322e565b81146135f657600080fd5b50565b61360281613240565b811461360d57600080fd5b50565b6136198161324c565b811461362457600080fd5b50565b61363081613298565b811461363b57600080fd5b5056fea2646970667358221220af21dc002bc3f7d0593593bdeeef963a4bc14f62f595ad3f3c91bf9568c80e1564736f6c63430008070033

Deployed Bytecode

0x60806040526004361061021a5760003560e01c806370a0823111610123578063a7027357116100ab578063c87b56dd1161006f578063c87b56dd14610786578063d5abeb01146107c3578063e985e9c5146107ee578063f2fde38b1461082b578063f968adbe146108545761021a565b8063a7027357146106b5578063b790a77b146106e0578063b88d4fde14610709578063bedb86fb14610732578063c66828621461075b5761021a565b806395d89b41116100f257806395d89b4114610603578063a035b1fe1461062e578063a0712d6814610659578063a22cb46514610675578063a475b5dd1461069e5761021a565b806370a082311461055b578063715018a6146105985780638da5cb5b146105af57806391b7f5ed146105da5761021a565b8063375a069a116101a657806355f804b31161017557806355f804b3146104785780635c975abb146104a15780636352211e146104cc5780636d7c4a4b146105095780636f8b44b0146105325761021a565b8063375a069a146103d057806342842e0e146103f95780634a91d1b814610422578063518302271461044d5761021a565b8063095ea7b3116101ed578063095ea7b3146102ed57806318160ddd146103165780631c3e88f6146103415780631e7269c51461036a57806323b872dd146103a75761021a565b806301ffc9a71461021f57806306fdde031461025c57806307d3636714610287578063081812fc146102b0575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190612b4e565b61087f565b6040516102539190612f31565b60405180910390f35b34801561026857600080fd5b50610271610911565b60405161027e9190612f4c565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190612bf1565b6109a3565b005b3480156102bc57600080fd5b506102d760048036038101906102d29190612bf1565b610a29565b6040516102e49190612eca565b60405180910390f35b3480156102f957600080fd5b50610314600480360381019061030f9190612ae1565b610aa5565b005b34801561032257600080fd5b5061032b610c4c565b604051610338919061308e565b60405180910390f35b34801561034d57600080fd5b5061036860048036038101906103639190612bf1565b610c63565b005b34801561037657600080fd5b50610391600480360381019061038c919061295e565b610ce9565b60405161039e919061308e565b60405180910390f35b3480156103b357600080fd5b506103ce60048036038101906103c991906129cb565b610cfb565b005b3480156103dc57600080fd5b506103f760048036038101906103f29190612bf1565b610d0b565b005b34801561040557600080fd5b50610420600480360381019061041b91906129cb565b610df2565b005b34801561042e57600080fd5b50610437610e12565b604051610444919061308e565b60405180910390f35b34801561045957600080fd5b50610462610e18565b60405161046f9190612f31565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a9190612ba8565b610e2b565b005b3480156104ad57600080fd5b506104b6610ec1565b6040516104c39190612f31565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee9190612bf1565b610ed4565b6040516105009190612eca565b60405180910390f35b34801561051557600080fd5b50610530600480360381019061052b9190612bf1565b610ee6565b005b34801561053e57600080fd5b5061055960048036038101906105549190612bf1565b610f6c565b005b34801561056757600080fd5b50610582600480360381019061057d919061295e565b610ff2565b60405161058f919061308e565b60405180910390f35b3480156105a457600080fd5b506105ad6110ab565b005b3480156105bb57600080fd5b506105c4611133565b6040516105d19190612eca565b60405180910390f35b3480156105e657600080fd5b5061060160048036038101906105fc9190612bf1565b61115d565b005b34801561060f57600080fd5b506106186111e3565b6040516106259190612f4c565b60405180910390f35b34801561063a57600080fd5b50610643611275565b604051610650919061308e565b60405180910390f35b610673600480360381019061066e9190612bf1565b61127b565b005b34801561068157600080fd5b5061069c60048036038101906106979190612aa1565b6114c8565b005b3480156106aa57600080fd5b506106b3611640565b005b3480156106c157600080fd5b506106ca6116d9565b6040516106d7919061308e565b60405180910390f35b3480156106ec57600080fd5b5061070760048036038101906107029190612ae1565b6116df565b005b34801561071557600080fd5b50610730600480360381019061072b9190612a1e565b61180c565b005b34801561073e57600080fd5b5061075960048036038101906107549190612b21565b61187f565b005b34801561076757600080fd5b50610770611918565b60405161077d9190612f4c565b60405180910390f35b34801561079257600080fd5b506107ad60048036038101906107a89190612bf1565b611951565b6040516107ba9190612f4c565b60405180910390f35b3480156107cf57600080fd5b506107d86119ef565b6040516107e5919061308e565b60405180910390f35b3480156107fa57600080fd5b506108156004803603810190610810919061298b565b6119f5565b6040516108229190612f31565b60405180910390f35b34801561083757600080fd5b50610852600480360381019061084d919061295e565b611a89565b005b34801561086057600080fd5b50610869611b81565b604051610876919061308e565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108da57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061090a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610920906132e4565b80601f016020809104026020016040519081016040528092919081815260200182805461094c906132e4565b80156109995780601f1061096e57610100808354040283529160200191610999565b820191906000526020600020905b81548152906001019060200180831161097c57829003601f168201915b5050505050905090565b6109ab611b87565b73ffffffffffffffffffffffffffffffffffffffff166109c9611133565b73ffffffffffffffffffffffffffffffffffffffff1614610a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1690612fee565b60405180910390fd5b8060098190555050565b6000610a3482611b8f565b610a6a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ab082611bee565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b18576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b37611cbc565b73ffffffffffffffffffffffffffffffffffffffff1614610b9a57610b6381610b5e611cbc565b6119f5565b610b99576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610c56611cc4565b6001546000540303905090565b610c6b611b87565b73ffffffffffffffffffffffffffffffffffffffff16610c89611133565b73ffffffffffffffffffffffffffffffffffffffff1614610cdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd690612fee565b60405180910390fd5b80600b8190555050565b6000610cf482611ccd565b9050919050565b610d06838383611d24565b505050565b610d13611b87565b73ffffffffffffffffffffffffffffffffffffffff16610d31611133565b73ffffffffffffffffffffffffffffffffffffffff1614610d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7e90612fee565b60405180910390fd5b600a5481610d93610c4c565b610d9d919061317e565b1115610dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd590612fae565b60405180910390fd5b610def610de9611b87565b826120ce565b50565b610e0d8383836040518060200160405280600081525061180c565b505050565b600b5481565b601060019054906101000a900460ff1681565b610e33611b87565b73ffffffffffffffffffffffffffffffffffffffff16610e51611133565b73ffffffffffffffffffffffffffffffffffffffff1614610ea7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9e90612fee565b60405180910390fd5b80600e9080519060200190610ebd929190612772565b5050565b601060009054906101000a900460ff1681565b6000610edf82611bee565b9050919050565b610eee611b87565b73ffffffffffffffffffffffffffffffffffffffff16610f0c611133565b73ffffffffffffffffffffffffffffffffffffffff1614610f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5990612fee565b60405180910390fd5b80600d8190555050565b610f74611b87565b73ffffffffffffffffffffffffffffffffffffffff16610f92611133565b73ffffffffffffffffffffffffffffffffffffffff1614610fe8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdf90612fee565b60405180910390fd5b80600a8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561105a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6110b3611b87565b73ffffffffffffffffffffffffffffffffffffffff166110d1611133565b73ffffffffffffffffffffffffffffffffffffffff1614611127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111e90612fee565b60405180910390fd5b61113160006120ec565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611165611b87565b73ffffffffffffffffffffffffffffffffffffffff16611183611133565b73ffffffffffffffffffffffffffffffffffffffff16146111d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d090612fee565b60405180910390fd5b80600c8190555050565b6060600380546111f2906132e4565b80601f016020809104026020016040519081016040528092919081815260200182805461121e906132e4565b801561126b5780601f106112405761010080835404028352916020019161126b565b820191906000526020600020905b81548152906001019060200180831161124e57829003601f168201915b5050505050905090565b600c5481565b6000600c54905060006001600b54611293919061317e565b8361129c610c4c565b6112a6919061317e565b1080156112ff5750600d5483600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112fc919061317e565b11155b9050801561130c57600091505b601060009054906101000a900460ff161561135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390612fce565b60405180910390fd5b818361136891906131d4565b3410156113aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a19061304e565b60405180910390fd5b6001600a546113b9919061317e565b836113c2610c4c565b6113cc919061317e565b1061140c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140390612f6e565b60405180910390fd5b600160095461141b919061317e565b831061145c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114539061306e565b60405180910390fd5b80156114b95782600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114b1919061317e565b925050819055505b6114c333846120ce565b505050565b6114d0611cbc565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611535576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611542611cbc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115ef611cbc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116349190612f31565b60405180910390a35050565b611648611b87565b73ffffffffffffffffffffffffffffffffffffffff16611666611133565b73ffffffffffffffffffffffffffffffffffffffff16146116bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b390612fee565b60405180910390fd5b6001601060016101000a81548160ff021916908315150217905550565b600d5481565b6116e7611b87565b73ffffffffffffffffffffffffffffffffffffffff16611705611133565b73ffffffffffffffffffffffffffffffffffffffff161461175b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175290612fee565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161178190612eb5565b60006040518083038185875af1925050503d80600081146117be576040519150601f19603f3d011682016040523d82523d6000602084013e6117c3565b606091505b5050905080611807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fe9061302e565b60405180910390fd5b505050565b611817848484611d24565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461187957611842848484846121b2565b611878576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611887611b87565b73ffffffffffffffffffffffffffffffffffffffff166118a5611133565b73ffffffffffffffffffffffffffffffffffffffff16146118fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f290612fee565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525081565b606061195c82611b8f565b61199b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119929061300e565b60405180910390fd5b60006119a683612312565b905060008151116119c657604051806020016040528060008152506119e7565b806040516020016119d79190612e93565b6040516020818303038152906040525b915050919050565b600a5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a91611b87565b73ffffffffffffffffffffffffffffffffffffffff16611aaf611133565b73ffffffffffffffffffffffffffffffffffffffff1614611b05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afc90612fee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6c90612f8e565b60405180910390fd5b611b7e816120ec565b50565b60095481565b600033905090565b600081611b9a611cc4565b11158015611ba9575060005482105b8015611be7575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611bfd611cc4565b11611c8557600054811015611c845760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611c82575b6000811415611c78576004600083600190039350838152602001908152602001600020549050611c4d565b8092505050611cb7565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b6000611d2f82611bee565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d96576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611db7611cbc565b73ffffffffffffffffffffffffffffffffffffffff161480611de65750611de585611de0611cbc565b6119f5565b5b80611e2b5750611df4611cbc565b73ffffffffffffffffffffffffffffffffffffffff16611e1384610a29565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611e64576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ecb576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ed885858560016123b1565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611fd5866123b7565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316141561205f57600060018401905060006004600083815260200190815260200160002054141561205d57600054811461205c578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120c785858560016123c1565b5050505050565b6120e88282604051806020016040528060008152506123c7565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121d8611cbc565b8786866040518563ffffffff1660e01b81526004016121fa9493929190612ee5565b602060405180830381600087803b15801561221457600080fd5b505af192505050801561224557506040513d601f19601f820116820180604052508101906122429190612b7b565b60015b6122bf573d8060008114612275576040519150601f19603f3d011682016040523d82523d6000602084013e61227a565b606091505b506000815114156122b7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606061231d82611b8f565b612353576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061235d61267c565b905060008151141561237e57604051806020016040528060008152506123a9565b806123888461270e565b604051602001612399929190612e6f565b6040516020818303038152906040525b915050919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612434576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083141561246f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61247c60008583866123b1565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16124e160018514612768565b901b60a042901b6124f1866123b7565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146125f5575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125a560008784806001019550876121b2565b6125db576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106125365782600054146125f057600080fd5b612660565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106125f6575b81600081905550505061267660008583866123c1565b50505050565b6060600e805461268b906132e4565b80601f01602080910402602001604051908101604052809291908181526020018280546126b7906132e4565b80156127045780601f106126d957610100808354040283529160200191612704565b820191906000526020600020905b8154815290600101906020018083116126e757829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561275457600183039250600a81066030018353600a81049050612734565b508181036020830392508083525050919050565b6000819050919050565b82805461277e906132e4565b90600052602060002090601f0160209004810192826127a057600085556127e7565b82601f106127b957805160ff19168380011785556127e7565b828001600101855582156127e7579182015b828111156127e65782518255916020019190600101906127cb565b5b5090506127f491906127f8565b5090565b5b808211156128115760008160009055506001016127f9565b5090565b6000612828612823846130ce565b6130a9565b905082815260208101848484011115612844576128436133d9565b5b61284f8482856132a2565b509392505050565b600061286a612865846130ff565b6130a9565b905082815260208101848484011115612886576128856133d9565b5b6128918482856132a2565b509392505050565b6000813590506128a8816135e2565b92915050565b6000813590506128bd816135f9565b92915050565b6000813590506128d281613610565b92915050565b6000815190506128e781613610565b92915050565b600082601f830112612902576129016133d4565b5b8135612912848260208601612815565b91505092915050565b600082601f8301126129305761292f6133d4565b5b8135612940848260208601612857565b91505092915050565b60008135905061295881613627565b92915050565b600060208284031215612974576129736133e3565b5b600061298284828501612899565b91505092915050565b600080604083850312156129a2576129a16133e3565b5b60006129b085828601612899565b92505060206129c185828601612899565b9150509250929050565b6000806000606084860312156129e4576129e36133e3565b5b60006129f286828701612899565b9350506020612a0386828701612899565b9250506040612a1486828701612949565b9150509250925092565b60008060008060808587031215612a3857612a376133e3565b5b6000612a4687828801612899565b9450506020612a5787828801612899565b9350506040612a6887828801612949565b925050606085013567ffffffffffffffff811115612a8957612a886133de565b5b612a95878288016128ed565b91505092959194509250565b60008060408385031215612ab857612ab76133e3565b5b6000612ac685828601612899565b9250506020612ad7858286016128ae565b9150509250929050565b60008060408385031215612af857612af76133e3565b5b6000612b0685828601612899565b9250506020612b1785828601612949565b9150509250929050565b600060208284031215612b3757612b366133e3565b5b6000612b45848285016128ae565b91505092915050565b600060208284031215612b6457612b636133e3565b5b6000612b72848285016128c3565b91505092915050565b600060208284031215612b9157612b906133e3565b5b6000612b9f848285016128d8565b91505092915050565b600060208284031215612bbe57612bbd6133e3565b5b600082013567ffffffffffffffff811115612bdc57612bdb6133de565b5b612be88482850161291b565b91505092915050565b600060208284031215612c0757612c066133e3565b5b6000612c1584828501612949565b91505092915050565b612c278161322e565b82525050565b612c3681613240565b82525050565b6000612c4782613130565b612c518185613146565b9350612c618185602086016132b1565b612c6a816133e8565b840191505092915050565b6000612c808261313b565b612c8a8185613162565b9350612c9a8185602086016132b1565b612ca3816133e8565b840191505092915050565b6000612cb98261313b565b612cc38185613173565b9350612cd38185602086016132b1565b80840191505092915050565b6000612cec600783613162565b9150612cf7826133f9565b602082019050919050565b6000612d0f602683613162565b9150612d1a82613422565b604082019050919050565b6000612d32601e83613162565b9150612d3d82613471565b602082019050919050565b6000612d55601083613162565b9150612d608261349a565b602082019050919050565b6000612d78600583613173565b9150612d83826134c3565b600582019050919050565b6000612d9b602083613162565b9150612da6826134ec565b602082019050919050565b6000612dbe602f83613162565b9150612dc982613515565b604082019050919050565b6000612de1601883613162565b9150612dec82613564565b602082019050919050565b6000612e04601d83613162565b9150612e0f8261358d565b602082019050919050565b6000612e27600083613157565b9150612e32826135b6565b600082019050919050565b6000612e4a601383613162565b9150612e55826135b9565b602082019050919050565b612e6981613298565b82525050565b6000612e7b8285612cae565b9150612e878284612cae565b91508190509392505050565b6000612e9f8284612cae565b9150612eaa82612d6b565b915081905092915050565b6000612ec082612e1a565b9150819050919050565b6000602082019050612edf6000830184612c1e565b92915050565b6000608082019050612efa6000830187612c1e565b612f076020830186612c1e565b612f146040830185612e60565b8181036060830152612f268184612c3c565b905095945050505050565b6000602082019050612f466000830184612c2d565b92915050565b60006020820190508181036000830152612f668184612c75565b905092915050565b60006020820190508181036000830152612f8781612cdf565b9050919050565b60006020820190508181036000830152612fa781612d02565b9050919050565b60006020820190508181036000830152612fc781612d25565b9050919050565b60006020820190508181036000830152612fe781612d48565b9050919050565b6000602082019050818103600083015261300781612d8e565b9050919050565b6000602082019050818103600083015261302781612db1565b9050919050565b6000602082019050818103600083015261304781612dd4565b9050919050565b6000602082019050818103600083015261306781612df7565b9050919050565b6000602082019050818103600083015261308781612e3d565b9050919050565b60006020820190506130a36000830184612e60565b92915050565b60006130b36130c4565b90506130bf8282613316565b919050565b6000604051905090565b600067ffffffffffffffff8211156130e9576130e86133a5565b5b6130f2826133e8565b9050602081019050919050565b600067ffffffffffffffff82111561311a576131196133a5565b5b613123826133e8565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061318982613298565b915061319483613298565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131c9576131c8613347565b5b828201905092915050565b60006131df82613298565b91506131ea83613298565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561322357613222613347565b5b828202905092915050565b600061323982613278565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156132cf5780820151818401526020810190506132b4565b838111156132de576000848401525b50505050565b600060028204905060018216806132fc57607f821691505b602082108114156133105761330f613376565b5b50919050565b61331f826133e8565b810181811067ffffffffffffffff8211171561333e5761333d6133a5565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e6f206d6f726500000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e6720776f756c6420657863656564206d6178537570706c790000600082015250565b7f436f6e7472616374205061757365642e00000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4661696c656420746f2077697468647261772045746865720000000000000000600082015250565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b50565b7f4d61782070657220545820726561636865642e00000000000000000000000000600082015250565b6135eb8161322e565b81146135f657600080fd5b50565b61360281613240565b811461360d57600080fd5b50565b6136198161324c565b811461362457600080fd5b50565b61363081613298565b811461363b57600080fd5b5056fea2646970667358221220af21dc002bc3f7d0593593bdeeef963a4bc14f62f595ad3f3c91bf9568c80e1564736f6c63430008070033

Deployed Bytecode Sourcemap

51437:3226:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13144:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18157:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53080:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20225:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19685:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12198:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52974:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53575:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21111:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52772:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21352:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51629:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51954:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54203:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51922:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17946:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53274:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53178:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13823:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50189:103;;;;;;;;;;;;;:::i;:::-;;49538:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53899:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18326:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51684:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52087:676;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20501:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53387:69;;;;;;;;;;;;;:::i;:::-;;51725:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53692:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21608:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53993:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51804:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54311:349;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51591:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20880:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50447:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51556:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13144:615;13229:4;13544:10;13529:25;;:11;:25;;;;:102;;;;13621:10;13606:25;;:11;:25;;;;13529:102;:179;;;;13698:10;13683:25;;:11;:25;;;;13529:179;13509:199;;13144:615;;;:::o;18157:100::-;18211:13;18244:5;18237:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18157:100;:::o;53080:90::-;49769:12;:10;:12::i;:::-;49758:23;;:7;:5;:7::i;:::-;:23;;;49750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53158:4:::1;53147:8;:15;;;;53080:90:::0;:::o;20225:204::-;20293:7;20318:16;20326:7;20318;:16::i;:::-;20313:64;;20343:34;;;;;;;;;;;;;;20313:64;20397:15;:24;20413:7;20397:24;;;;;;;;;;;;;;;;;;;;;20390:31;;20225:204;;;:::o;19685:474::-;19758:13;19790:27;19809:7;19790:18;:27::i;:::-;19758:61;;19840:5;19834:11;;:2;:11;;;19830:48;;;19854:24;;;;;;;;;;;;;;19830:48;19918:5;19895:28;;:19;:17;:19::i;:::-;:28;;;19891:175;;19943:44;19960:5;19967:19;:17;:19::i;:::-;19943:16;:44::i;:::-;19938:128;;20015:35;;;;;;;;;;;;;;19938:128;19891:175;20105:2;20078:15;:24;20094:7;20078:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;20143:7;20139:2;20123:28;;20132:5;20123:28;;;;;;;;;;;;19747:412;19685:474;;:::o;12198:315::-;12251:7;12479:15;:13;:15::i;:::-;12464:12;;12448:13;;:28;:46;12441:53;;12198:315;:::o;52974:98::-;49769:12;:10;:12::i;:::-;49758:23;;:7;:5;:7::i;:::-;:23;;;49750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53060:4:::1;53046:11;:18;;;;52974:98:::0;:::o;53575:109::-;53628:7;53655:21;53669:6;53655:13;:21::i;:::-;53648:28;;53575:109;;;:::o;21111:170::-;21245:28;21255:4;21261:2;21265:7;21245:9;:28::i;:::-;21111:170;;;:::o;52772:194::-;49769:12;:10;:12::i;:::-;49758:23;;:7;:5;:7::i;:::-;:23;;;49750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52871:9:::1;;52860:7;52844:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:36;;52836:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;52926:32;52936:12;:10;:12::i;:::-;52950:7;52926:9;:32::i;:::-;52772:194:::0;:::o;21352:185::-;21490:39;21507:4;21513:2;21517:7;21490:39;;;;;;;;;;;;:16;:39::i;:::-;21352:185;;;:::o;51629:33::-;;;;:::o;51954:27::-;;;;;;;;;;;;;:::o;54203:100::-;49769:12;:10;:12::i;:::-;49758:23;;:7;:5;:7::i;:::-;:23;;;49750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54287:8:::1;54277:7;:18;;;;;;;;;;;;:::i;:::-;;54203:100:::0;:::o;51922:25::-;;;;;;;;;;;;;:::o;17946:144::-;18010:7;18053:27;18072:7;18053:18;:27::i;:::-;18030:52;;17946:144;;;:::o;53274:104::-;49769:12;:10;:12::i;:::-;49758:23;;:7;:5;:7::i;:::-;:23;;;49750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53366:4:::1;53347:16;:23;;;;53274:104:::0;:::o;53178:88::-;49769:12;:10;:12::i;:::-;49758:23;;:7;:5;:7::i;:::-;:23;;;49750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53254:4:::1;53242:9;:16;;;;53178:88:::0;:::o;13823:224::-;13887:7;13928:1;13911:19;;:5;:19;;;13907:60;;;13939:28;;;;;;;;;;;;;;13907:60;9162:13;13985:18;:25;14004:5;13985:25;;;;;;;;;;;;;;;;:54;13978:61;;13823:224;;;:::o;50189:103::-;49769:12;:10;:12::i;:::-;49758:23;;:7;:5;:7::i;:::-;:23;;;49750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50254:30:::1;50281:1;50254:18;:30::i;:::-;50189:103::o:0;49538:87::-;49584:7;49611:6;;;;;;;;;;;49604:13;;49538:87;:::o;53899:86::-;49769:12;:10;:12::i;:::-;49758:23;;:7;:5;:7::i;:::-;:23;;;49750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53971:6:::1;53963:5;:14;;;;53899:86:::0;:::o;18326:104::-;18382:13;18415:7;18408:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18326:104;:::o;51684:34::-;;;;:::o;52087:676::-;52144:12;52159:5;;52144:20;;52175:11;52229:1;52215:11;;:15;;;;:::i;:::-;52207:5;52191:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:39;52190:117;;;;;52290:16;;52281:5;52249:17;:29;52267:10;52249:29;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;:57;;52190:117;52175:133;;52325:6;52321:47;;;52355:1;52348:8;;52321:47;52389:6;;;;;;;;;;;52388:7;52380:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;52456:4;52448:5;:12;;;;:::i;:::-;52435:9;:25;;52427:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;52549:1;52537:9;;:13;;;;:::i;:::-;52529:5;52513:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:37;52505:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;52600:1;52589:8;;:12;;;;:::i;:::-;52581:5;:20;52573:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;52642:6;52638:77;;;52698:5;52665:17;:29;52683:10;52665:29;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;52638:77;52727:28;52737:10;52749:5;52727:9;:28::i;:::-;52133:630;;52087:676;:::o;20501:308::-;20612:19;:17;:19::i;:::-;20600:31;;:8;:31;;;20596:61;;;20640:17;;;;;;;;;;;;;;20596:61;20722:8;20670:18;:39;20689:19;:17;:19::i;:::-;20670:39;;;;;;;;;;;;;;;:49;20710:8;20670:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;20782:8;20746:55;;20761:19;:17;:19::i;:::-;20746:55;;;20792:8;20746:55;;;;;;:::i;:::-;;;;;;;;20501:308;;:::o;53387:69::-;49769:12;:10;:12::i;:::-;49758:23;;:7;:5;:7::i;:::-;:23;;;49750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53444:4:::1;53433:8;;:15;;;;;;;;;;;;;;;;;;53387:69::o:0;51725:35::-;;;;:::o;53692:199::-;49769:12;:10;:12::i;:::-;49758:23;;:7;:5;:7::i;:::-;:23;;;49750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53777:12:::1;53795:8;:13;;53816:7;53795:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53776:52;;;53847:7;53839:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;53765:126;53692:199:::0;;:::o;21608:396::-;21775:28;21785:4;21791:2;21795:7;21775:9;:28::i;:::-;21836:1;21818:2;:14;;;:19;21814:183;;21857:56;21888:4;21894:2;21898:7;21907:5;21857:30;:56::i;:::-;21852:145;;21941:40;;;;;;;;;;;;;;21852:145;21814:183;21608:396;;;;:::o;53993:84::-;49769:12;:10;:12::i;:::-;49758:23;;:7;:5;:7::i;:::-;:23;;;49750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54063:6:::1;54054;;:15;;;;;;;;;;;;;;;;;;53993:84:::0;:::o;51804:46::-;;;;;;;;;;;;;;;;;;;:::o;54311:349::-;54384:13;54423:16;54431:7;54423;:16::i;:::-;54415:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;54506:23;54532;54547:7;54532:14;:23::i;:::-;54506:49;;54599:1;54579:9;54573:23;:27;:79;;;;;;;;;;;;;;;;;54627:9;54610:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;54573:79;54566:86;;;54311:349;;;:::o;51591:31::-;;;;:::o;20880:164::-;20977:4;21001:18;:25;21020:5;21001:25;;;;;;;;;;;;;;;:35;21027:8;21001:35;;;;;;;;;;;;;;;;;;;;;;;;;20994:42;;20880:164;;;;:::o;50447:201::-;49769:12;:10;:12::i;:::-;49758:23;;:7;:5;:7::i;:::-;:23;;;49750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50556:1:::1;50536:22;;:8;:22;;;;50528:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;50612:28;50631:8;50612:18;:28::i;:::-;50447:201:::0;:::o;51556:28::-;;;;:::o;48262:98::-;48315:7;48342:10;48335:17;;48262:98;:::o;22259:273::-;22316:4;22372:7;22353:15;:13;:15::i;:::-;:26;;:66;;;;;22406:13;;22396:7;:23;22353:66;:152;;;;;22504:1;9932:8;22457:17;:26;22475:7;22457:26;;;;;;;;;;;;:43;:48;22353:152;22333:172;;22259:273;;;:::o;15461:1129::-;15528:7;15548:12;15563:7;15548:22;;15631:4;15612:15;:13;:15::i;:::-;:23;15608:915;;15665:13;;15658:4;:20;15654:869;;;15703:14;15720:17;:23;15738:4;15720:23;;;;;;;;;;;;15703:40;;15836:1;9932:8;15809:6;:23;:28;15805:699;;;16328:113;16345:1;16335:6;:11;16328:113;;;16388:17;:25;16406:6;;;;;;;16388:25;;;;;;;;;;;;16379:34;;16328:113;;;16474:6;16467:13;;;;;;15805:699;15680:843;15654:869;15608:915;16551:31;;;;;;;;;;;;;;15461:1129;;;;:::o;36241:105::-;36301:7;36328:10;36321:17;;36241:105;:::o;53466:101::-;53531:7;53558:1;53551:8;;53466:101;:::o;14129:176::-;14190:7;9162:13;9299:2;14218:18;:25;14237:5;14218:25;;;;;;;;;;;;;;;;:49;;14217:80;14210:87;;14129:176;;;:::o;27498:2515::-;27613:27;27643;27662:7;27643:18;:27::i;:::-;27613:57;;27728:4;27687:45;;27703:19;27687:45;;;27683:86;;27741:28;;;;;;;;;;;;;;27683:86;27782:22;27831:4;27808:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;27852:43;27869:4;27875:19;:17;:19::i;:::-;27852:16;:43::i;:::-;27808:87;:147;;;;27936:19;:17;:19::i;:::-;27912:43;;:20;27924:7;27912:11;:20::i;:::-;:43;;;27808:147;27782:174;;27974:17;27969:66;;28000:35;;;;;;;;;;;;;;27969:66;28064:1;28050:16;;:2;:16;;;28046:52;;;28075:23;;;;;;;;;;;;;;28046:52;28111:43;28133:4;28139:2;28143:7;28152:1;28111:21;:43::i;:::-;28227:15;:24;28243:7;28227:24;;;;;;;;;;;;28220:31;;;;;;;;;;;28619:18;:24;28638:4;28619:24;;;;;;;;;;;;;;;;28617:26;;;;;;;;;;;;28688:18;:22;28707:2;28688:22;;;;;;;;;;;;;;;;28686:24;;;;;;;;;;;10214:8;9816:3;29069:15;:41;;29027:21;29045:2;29027:17;:21::i;:::-;:84;:128;28981:17;:26;28999:7;28981:26;;;;;;;;;;;:174;;;;29325:1;10214:8;29275:19;:46;:51;29271:626;;;29347:19;29379:1;29369:7;:11;29347:33;;29536:1;29502:17;:30;29520:11;29502:30;;;;;;;;;;;;:35;29498:384;;;29640:13;;29625:11;:28;29621:242;;29820:19;29787:17;:30;29805:11;29787:30;;;;;;;;;;;:52;;;;29621:242;29498:384;29328:569;29271:626;29944:7;29940:2;29925:27;;29934:4;29925:27;;;;;;;;;;;;29963:42;29984:4;29990:2;29994:7;30003:1;29963:20;:42::i;:::-;27602:2411;;27498:2515;;;:::o;22616:104::-;22685:27;22695:2;22699:8;22685:27;;;;;;;;;;;;:9;:27::i;:::-;22616:104;;:::o;50808:191::-;50882:16;50901:6;;;;;;;;;;;50882:25;;50927:8;50918:6;;:17;;;;;;;;;;;;;;;;;;50982:8;50951:40;;50972:8;50951:40;;;;;;;;;;;;50871:128;50808:191;:::o;33710:716::-;33873:4;33919:2;33894:45;;;33940:19;:17;:19::i;:::-;33961:4;33967:7;33976:5;33894:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33890:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34194:1;34177:6;:13;:18;34173:235;;;34223:40;;;;;;;;;;;;;;34173:235;34366:6;34360:13;34351:6;34347:2;34343:15;34336:38;33890:529;34063:54;;;34053:64;;;:6;:64;;;;34046:71;;;33710:716;;;;;;:::o;18501:318::-;18574:13;18605:16;18613:7;18605;:16::i;:::-;18600:59;;18630:29;;;;;;;;;;;;;;18600:59;18672:21;18696:10;:8;:10::i;:::-;18672:34;;18749:1;18730:7;18724:21;:26;;:87;;;;;;;;;;;;;;;;;18777:7;18786:18;18796:7;18786:9;:18::i;:::-;18760:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18724:87;18717:94;;;18501:318;;;:::o;35074:159::-;;;;;:::o;19246:148::-;19310:14;19371:5;19361:15;;19246:148;;;:::o;35892:158::-;;;;;:::o;23093:2236::-;23216:20;23239:13;;23216:36;;23281:1;23267:16;;:2;:16;;;23263:48;;;23292:19;;;;;;;;;;;;;;23263:48;23338:1;23326:8;:13;23322:44;;;23348:18;;;;;;;;;;;;;;23322:44;23379:61;23409:1;23413:2;23417:12;23431:8;23379:21;:61::i;:::-;23983:1;9299:2;23954:1;:25;;23953:31;23941:8;:44;23915:18;:22;23934:2;23915:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;10079:3;24384:29;24411:1;24399:8;:13;24384:14;:29::i;:::-;:56;;9816:3;24321:15;:41;;24279:21;24297:2;24279:17;:21::i;:::-;:84;:162;24228:17;:31;24246:12;24228:31;;;;;;;;;;;:213;;;;24458:20;24481:12;24458:35;;24508:11;24537:8;24522:12;:23;24508:37;;24584:1;24566:2;:14;;;:19;24562:635;;24606:313;24662:12;24658:2;24637:38;;24654:1;24637:38;;;;;;;;;;;;24703:69;24742:1;24746:2;24750:14;;;;;;24766:5;24703:30;:69::i;:::-;24698:174;;24808:40;;;;;;;;;;;;;;24698:174;24914:3;24899:12;:18;24606:313;;25000:12;24983:13;;:29;24979:43;;25014:8;;;24979:43;24562:635;;;25063:119;25119:14;;;;;;25115:2;25094:40;;25111:1;25094:40;;;;;;;;;;;;25177:3;25162:12;:18;25063:119;;24562:635;25227:12;25211:13;:28;;;;23692:1559;;25261:60;25290:1;25294:2;25298:12;25312:8;25261:20;:60::i;:::-;23205:2124;23093:2236;;;:::o;54085:106::-;54145:13;54176:7;54169:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54085:106;:::o;36452:1959::-;36509:17;36930:3;36923:4;36917:11;36913:21;36906:28;;37021:3;37015:4;37008:17;37127:3;37584:5;37714:1;37709:3;37705:11;37698:18;;37851:2;37845:4;37841:13;37837:2;37833:22;37828:3;37820:36;37892:2;37886:4;37882:13;37874:21;;37475:682;37911:4;37475:682;;;38086:1;38081:3;38077:11;38070:18;;38137:2;38131:4;38127:13;38123:2;38119:22;38114:3;38106:36;38007:2;38001:4;37997:13;37989:21;;37475:682;;;37479:431;38208:3;38203;38199:13;38323:2;38318:3;38314:12;38307:19;;38386:6;38381:3;38374:19;36548:1856;;36452:1959;;;:::o;19481:142::-;19539:14;19600:5;19590:15;;19481: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:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:118::-;7574:24;7592:5;7574:24;:::i;:::-;7569:3;7562:37;7487:118;;:::o;7611:109::-;7692:21;7707:5;7692:21;:::i;:::-;7687:3;7680:34;7611:109;;:::o;7726:360::-;7812:3;7840:38;7872:5;7840:38;:::i;:::-;7894:70;7957:6;7952:3;7894:70;:::i;:::-;7887:77;;7973:52;8018:6;8013:3;8006:4;7999:5;7995:16;7973:52;:::i;:::-;8050:29;8072:6;8050:29;:::i;:::-;8045:3;8041:39;8034:46;;7816:270;7726:360;;;;:::o;8092:364::-;8180:3;8208:39;8241:5;8208:39;:::i;:::-;8263:71;8327:6;8322:3;8263:71;:::i;:::-;8256:78;;8343:52;8388:6;8383:3;8376:4;8369:5;8365:16;8343:52;:::i;:::-;8420:29;8442:6;8420:29;:::i;:::-;8415:3;8411:39;8404:46;;8184:272;8092:364;;;;:::o;8462:377::-;8568:3;8596:39;8629:5;8596:39;:::i;:::-;8651:89;8733:6;8728:3;8651:89;:::i;:::-;8644:96;;8749:52;8794:6;8789:3;8782:4;8775:5;8771:16;8749:52;:::i;:::-;8826:6;8821:3;8817:16;8810:23;;8572:267;8462:377;;;;:::o;8845:365::-;8987:3;9008:66;9072:1;9067:3;9008:66;:::i;:::-;9001:73;;9083:93;9172:3;9083:93;:::i;:::-;9201:2;9196:3;9192:12;9185:19;;8845:365;;;:::o;9216:366::-;9358:3;9379:67;9443:2;9438:3;9379:67;:::i;:::-;9372:74;;9455:93;9544:3;9455:93;:::i;:::-;9573:2;9568:3;9564:12;9557:19;;9216:366;;;:::o;9588:::-;9730:3;9751:67;9815:2;9810:3;9751:67;:::i;:::-;9744:74;;9827:93;9916:3;9827:93;:::i;:::-;9945:2;9940:3;9936:12;9929:19;;9588:366;;;:::o;9960:::-;10102:3;10123:67;10187:2;10182:3;10123:67;:::i;:::-;10116:74;;10199:93;10288:3;10199:93;:::i;:::-;10317:2;10312:3;10308:12;10301:19;;9960:366;;;:::o;10332:400::-;10492:3;10513:84;10595:1;10590:3;10513:84;:::i;:::-;10506:91;;10606:93;10695:3;10606:93;:::i;:::-;10724:1;10719:3;10715:11;10708:18;;10332:400;;;:::o;10738:366::-;10880:3;10901:67;10965:2;10960:3;10901:67;:::i;:::-;10894:74;;10977:93;11066:3;10977:93;:::i;:::-;11095:2;11090:3;11086:12;11079:19;;10738:366;;;:::o;11110:::-;11252:3;11273:67;11337:2;11332:3;11273:67;:::i;:::-;11266:74;;11349:93;11438:3;11349:93;:::i;:::-;11467:2;11462:3;11458:12;11451:19;;11110:366;;;:::o;11482:::-;11624:3;11645:67;11709:2;11704:3;11645:67;:::i;:::-;11638:74;;11721:93;11810:3;11721:93;:::i;:::-;11839:2;11834:3;11830:12;11823:19;;11482:366;;;:::o;11854:::-;11996:3;12017:67;12081:2;12076:3;12017:67;:::i;:::-;12010:74;;12093:93;12182:3;12093:93;:::i;:::-;12211:2;12206:3;12202:12;12195:19;;11854:366;;;:::o;12226:398::-;12385:3;12406:83;12487:1;12482:3;12406:83;:::i;:::-;12399:90;;12498:93;12587:3;12498:93;:::i;:::-;12616:1;12611:3;12607:11;12600:18;;12226:398;;;:::o;12630:366::-;12772:3;12793:67;12857:2;12852:3;12793:67;:::i;:::-;12786:74;;12869:93;12958:3;12869:93;:::i;:::-;12987:2;12982:3;12978:12;12971:19;;12630:366;;;:::o;13002:118::-;13089:24;13107:5;13089:24;:::i;:::-;13084:3;13077:37;13002:118;;:::o;13126:435::-;13306:3;13328:95;13419:3;13410:6;13328:95;:::i;:::-;13321:102;;13440:95;13531:3;13522:6;13440:95;:::i;:::-;13433:102;;13552:3;13545:10;;13126:435;;;;;:::o;13567:541::-;13800:3;13822:95;13913:3;13904:6;13822:95;:::i;:::-;13815:102;;13934:148;14078:3;13934:148;:::i;:::-;13927:155;;14099:3;14092:10;;13567:541;;;;:::o;14114:379::-;14298:3;14320:147;14463:3;14320:147;:::i;:::-;14313:154;;14484:3;14477:10;;14114:379;;;:::o;14499:222::-;14592:4;14630:2;14619:9;14615:18;14607:26;;14643:71;14711:1;14700:9;14696:17;14687:6;14643:71;:::i;:::-;14499:222;;;;:::o;14727:640::-;14922:4;14960:3;14949:9;14945:19;14937:27;;14974:71;15042:1;15031:9;15027:17;15018:6;14974:71;:::i;:::-;15055:72;15123:2;15112:9;15108:18;15099:6;15055:72;:::i;:::-;15137;15205:2;15194:9;15190:18;15181:6;15137:72;:::i;:::-;15256:9;15250:4;15246:20;15241:2;15230:9;15226:18;15219:48;15284:76;15355:4;15346:6;15284:76;:::i;:::-;15276:84;;14727:640;;;;;;;:::o;15373:210::-;15460:4;15498:2;15487:9;15483:18;15475:26;;15511:65;15573:1;15562:9;15558:17;15549:6;15511:65;:::i;:::-;15373:210;;;;:::o;15589:313::-;15702:4;15740:2;15729:9;15725:18;15717:26;;15789:9;15783:4;15779:20;15775:1;15764:9;15760:17;15753:47;15817:78;15890:4;15881:6;15817:78;:::i;:::-;15809:86;;15589:313;;;;:::o;15908:419::-;16074:4;16112:2;16101:9;16097:18;16089:26;;16161:9;16155:4;16151:20;16147:1;16136:9;16132:17;16125:47;16189:131;16315:4;16189:131;:::i;:::-;16181:139;;15908:419;;;:::o;16333:::-;16499:4;16537:2;16526:9;16522:18;16514:26;;16586:9;16580:4;16576:20;16572:1;16561:9;16557:17;16550:47;16614:131;16740:4;16614:131;:::i;:::-;16606:139;;16333:419;;;:::o;16758:::-;16924:4;16962:2;16951:9;16947:18;16939:26;;17011:9;17005:4;17001:20;16997:1;16986:9;16982:17;16975:47;17039:131;17165:4;17039:131;:::i;:::-;17031:139;;16758:419;;;:::o;17183:::-;17349:4;17387:2;17376:9;17372:18;17364:26;;17436:9;17430:4;17426:20;17422:1;17411:9;17407:17;17400:47;17464:131;17590:4;17464:131;:::i;:::-;17456:139;;17183:419;;;:::o;17608:::-;17774:4;17812:2;17801:9;17797:18;17789:26;;17861:9;17855:4;17851:20;17847:1;17836:9;17832:17;17825:47;17889:131;18015:4;17889:131;:::i;:::-;17881:139;;17608:419;;;:::o;18033:::-;18199:4;18237:2;18226:9;18222:18;18214:26;;18286:9;18280:4;18276:20;18272:1;18261:9;18257:17;18250:47;18314:131;18440:4;18314:131;:::i;:::-;18306:139;;18033:419;;;:::o;18458:::-;18624:4;18662:2;18651:9;18647:18;18639:26;;18711:9;18705:4;18701:20;18697:1;18686:9;18682:17;18675:47;18739:131;18865:4;18739:131;:::i;:::-;18731:139;;18458:419;;;:::o;18883:::-;19049:4;19087:2;19076:9;19072:18;19064:26;;19136:9;19130:4;19126:20;19122:1;19111:9;19107:17;19100:47;19164:131;19290:4;19164:131;:::i;:::-;19156:139;;18883:419;;;:::o;19308:::-;19474:4;19512:2;19501:9;19497:18;19489:26;;19561:9;19555:4;19551:20;19547:1;19536:9;19532:17;19525:47;19589:131;19715:4;19589:131;:::i;:::-;19581:139;;19308:419;;;:::o;19733:222::-;19826:4;19864:2;19853:9;19849:18;19841:26;;19877:71;19945:1;19934:9;19930:17;19921:6;19877:71;:::i;:::-;19733:222;;;;:::o;19961:129::-;19995:6;20022:20;;:::i;:::-;20012:30;;20051:33;20079:4;20071:6;20051:33;:::i;:::-;19961:129;;;:::o;20096:75::-;20129:6;20162:2;20156:9;20146:19;;20096:75;:::o;20177:307::-;20238:4;20328:18;20320:6;20317:30;20314:56;;;20350:18;;:::i;:::-;20314:56;20388:29;20410:6;20388:29;:::i;:::-;20380:37;;20472:4;20466;20462:15;20454:23;;20177:307;;;:::o;20490:308::-;20552:4;20642:18;20634:6;20631:30;20628:56;;;20664:18;;:::i;:::-;20628:56;20702:29;20724:6;20702:29;:::i;:::-;20694:37;;20786:4;20780;20776:15;20768:23;;20490:308;;;:::o;20804:98::-;20855:6;20889:5;20883:12;20873:22;;20804:98;;;:::o;20908:99::-;20960:6;20994:5;20988:12;20978:22;;20908:99;;;:::o;21013:168::-;21096:11;21130:6;21125:3;21118:19;21170:4;21165:3;21161:14;21146:29;;21013:168;;;;:::o;21187:147::-;21288:11;21325:3;21310:18;;21187:147;;;;:::o;21340:169::-;21424:11;21458:6;21453:3;21446:19;21498:4;21493:3;21489:14;21474:29;;21340:169;;;;:::o;21515:148::-;21617:11;21654:3;21639:18;;21515:148;;;;:::o;21669:305::-;21709:3;21728:20;21746:1;21728:20;:::i;:::-;21723:25;;21762:20;21780:1;21762:20;:::i;:::-;21757:25;;21916:1;21848:66;21844:74;21841:1;21838:81;21835:107;;;21922:18;;:::i;:::-;21835:107;21966:1;21963;21959:9;21952:16;;21669:305;;;;:::o;21980:348::-;22020:7;22043:20;22061:1;22043:20;:::i;:::-;22038:25;;22077:20;22095:1;22077:20;:::i;:::-;22072:25;;22265:1;22197:66;22193:74;22190:1;22187:81;22182:1;22175:9;22168:17;22164:105;22161:131;;;22272:18;;:::i;:::-;22161:131;22320:1;22317;22313:9;22302:20;;21980:348;;;;:::o;22334:96::-;22371:7;22400:24;22418:5;22400:24;:::i;:::-;22389:35;;22334:96;;;:::o;22436:90::-;22470:7;22513:5;22506:13;22499:21;22488:32;;22436:90;;;:::o;22532:149::-;22568:7;22608:66;22601:5;22597:78;22586:89;;22532:149;;;:::o;22687:126::-;22724:7;22764:42;22757:5;22753:54;22742:65;;22687:126;;;:::o;22819:77::-;22856:7;22885:5;22874:16;;22819:77;;;:::o;22902:154::-;22986:6;22981:3;22976;22963:30;23048:1;23039:6;23034:3;23030:16;23023:27;22902:154;;;:::o;23062:307::-;23130:1;23140:113;23154:6;23151:1;23148:13;23140:113;;;23239:1;23234:3;23230:11;23224:18;23220:1;23215:3;23211:11;23204:39;23176:2;23173:1;23169:10;23164:15;;23140:113;;;23271:6;23268:1;23265:13;23262:101;;;23351:1;23342:6;23337:3;23333:16;23326:27;23262:101;23111:258;23062:307;;;:::o;23375:320::-;23419:6;23456:1;23450:4;23446:12;23436:22;;23503:1;23497:4;23493:12;23524:18;23514:81;;23580:4;23572:6;23568:17;23558:27;;23514:81;23642:2;23634:6;23631:14;23611:18;23608:38;23605:84;;;23661:18;;:::i;:::-;23605:84;23426:269;23375:320;;;:::o;23701:281::-;23784:27;23806:4;23784:27;:::i;:::-;23776:6;23772:40;23914:6;23902:10;23899:22;23878:18;23866:10;23863:34;23860:62;23857:88;;;23925:18;;:::i;:::-;23857:88;23965:10;23961:2;23954:22;23744:238;23701:281;;:::o;23988:180::-;24036:77;24033:1;24026:88;24133:4;24130:1;24123:15;24157:4;24154:1;24147:15;24174:180;24222:77;24219:1;24212:88;24319:4;24316:1;24309:15;24343:4;24340:1;24333:15;24360:180;24408:77;24405:1;24398:88;24505:4;24502:1;24495:15;24529:4;24526:1;24519:15;24546:117;24655:1;24652;24645:12;24669:117;24778:1;24775;24768:12;24792:117;24901:1;24898;24891:12;24915:117;25024:1;25021;25014:12;25038:102;25079:6;25130:2;25126:7;25121:2;25114:5;25110:14;25106:28;25096:38;;25038:102;;;:::o;25146:157::-;25286:9;25282:1;25274:6;25270:14;25263:33;25146:157;:::o;25309:225::-;25449:34;25445:1;25437:6;25433:14;25426:58;25518:8;25513:2;25505:6;25501:15;25494:33;25309:225;:::o;25540:180::-;25680:32;25676:1;25668:6;25664:14;25657:56;25540:180;:::o;25726:166::-;25866:18;25862:1;25854:6;25850:14;25843:42;25726:166;:::o;25898:155::-;26038:7;26034:1;26026:6;26022:14;26015:31;25898:155;:::o;26059:182::-;26199:34;26195:1;26187:6;26183:14;26176:58;26059:182;:::o;26247:234::-;26387:34;26383:1;26375:6;26371:14;26364:58;26456:17;26451:2;26443:6;26439:15;26432:42;26247:234;:::o;26487:174::-;26627:26;26623:1;26615:6;26611:14;26604:50;26487:174;:::o;26667:179::-;26807:31;26803:1;26795:6;26791:14;26784:55;26667:179;:::o;26852:114::-;;:::o;26972:169::-;27112:21;27108:1;27100:6;27096:14;27089:45;26972:169;:::o;27147:122::-;27220:24;27238:5;27220:24;:::i;:::-;27213:5;27210:35;27200:63;;27259:1;27256;27249:12;27200:63;27147:122;:::o;27275:116::-;27345:21;27360:5;27345:21;:::i;:::-;27338:5;27335:32;27325:60;;27381:1;27378;27371:12;27325:60;27275:116;:::o;27397:120::-;27469:23;27486:5;27469:23;:::i;:::-;27462:5;27459:34;27449:62;;27507:1;27504;27497:12;27449:62;27397:120;:::o;27523:122::-;27596:24;27614:5;27596:24;:::i;:::-;27589:5;27586:35;27576:63;;27635:1;27632;27625:12;27576:63;27523:122;:::o

Swarm Source

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