ETH Price: $3,426.83 (-0.80%)
Gas: 13 Gwei

Token

MIB19Queen (MIBQ)
 

Overview

Max Total Supply

2,046 MIBQ

Holders

426

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 MIBQ
0x3aD34BBC50351b1fDE3e32aA10d26de592A2A1c1
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:
QueenOfLust

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-15
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @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 virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view virtual 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 virtual returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

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

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

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

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

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

    /**
     * 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 virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view virtual 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 virtual {
        _safeMint(to, quantity, '');
    }

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

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

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

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

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

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

            uint256 tokenId = startTokenId;
            uint256 end = startTokenId + quantity;
            do {
                emit Transfer(address(0), to, tokenId++);
            } while (tokenId < end);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

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

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

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure virtual 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/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/security/Pausable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

// File: contracts/QOL.sol


pragma solidity 0.8.7;





contract QueenOfLust is Ownable, ERC721A, Pausable {
    using Strings for uint256;

    struct SaleInfo {
        uint8 step;
        uint16 amount;
        uint256 price;
        uint256 mintStartTime;
    }

    uint8 private constant MINT_LIST_STEP = 0;
    uint8 private constant WHITE_LIST_STEP = 1;
    uint8 private constant PUBLIC_STEP = 2;
    uint8 private constant STEP_COUNT = 3;

    string private metadataUri;
    string private metadataSuffix = ".json";
    uint256 public constant maxSupply = 5000;

    mapping(address => uint8) public mintListAddress;
    mapping(address => uint8) public whiteListAddress;

    SaleInfo[] public saleInfoList;
    uint256[] private accumulatedSaleAmount;

    bool private isRevealed = false;

    constructor(
        uint16[] memory _amounts,
        uint256[] memory _prices,
        uint256[] memory _mintStartTimes,
        string memory _metadataUri
    ) ERC721A("MIB19Queen", "MIBQ") {
        require(
            _amounts.length + _prices.length + _mintStartTimes.length == (STEP_COUNT) * 3,
            "Invalid Argument : param length"
        );
        require(_amounts[0] + _amounts[1] + _amounts[2] <= maxSupply, "Invalid Argument : maxSupply");

        for (uint8 i = 0; i < STEP_COUNT; i++) {
            saleInfoList.push(SaleInfo(i, _amounts[i], _prices[i], _mintStartTimes[i]));

            if (i > 0) {
                accumulatedSaleAmount.push(accumulatedSaleAmount[i - 1] + _amounts[i]);
            } else {
                accumulatedSaleAmount.push(_amounts[i]);
            }
        }

        metadataUri = _metadataUri;
    }

    function tokenURI(uint256 _tokenId) public view override returns (string memory) {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
        if (!isRevealed) {
            return string(abi.encodePacked(metadataUri, "prereveal", metadataSuffix));
        }
        return string(abi.encodePacked(metadataUri, Strings.toString(_tokenId), metadataSuffix));
    }

    function contractURI() public view returns (string memory) {
        return string(abi.encodePacked(metadataUri, "contract", metadataSuffix));
    }

    function mint(uint8 amount, uint8 step) external payable whenNotPaused {
        require(_checkMintStepValid(step), "Not exist mint step");

        uint8 _currStep = getCurrentStep();
        if (_currStep != step) {
            revert("Steps that have not started or are finished");
        }

        uint256 _price = saleInfoList[step].price * amount;
        require(msg.value == _price, "Invalid ETH balance");

        require(_totalMinted() + amount <= accumulatedSaleAmount[step], "Sold out in this step");
        if (step == MINT_LIST_STEP) {
            _mintForEachStep(amount, mintListAddress);
        } else if (step == WHITE_LIST_STEP) {
            _mintForEachStep(amount, whiteListAddress);
        } else if (step == PUBLIC_STEP) {
            _safeMint(msg.sender, amount);
        }
        
    }

    function getCurrentStep() public view returns (uint8) {
        uint8 _step;
        for (_step = STEP_COUNT - 1; _step >= 0; _step--) {
            if (block.timestamp >= saleInfoList[_step].mintStartTime) {
                return _step;
            }
        }
        revert("Minting hasn't started yet");
    }

    function isSoldout(uint8 step) public view returns (bool) {
        require(_checkMintStepValid(step), "Not exist mint step");
        return _totalMinted() == accumulatedSaleAmount[step];
    }

    function getMintableAmount(uint8 step) public view returns (uint256) {
        require(_checkMintStepValid(step), "Not exist mint step");
        return accumulatedSaleAmount[step] - _totalMinted();
    }

    function _mintForEachStep(uint8 amount, mapping(address => uint8) storage allowList) private {
        require(allowList[msg.sender] - amount >= 0, "Don't have mint authority");
        allowList[msg.sender] -= amount;
        _safeMint(msg.sender, amount);
    }

    function _checkMintStepValid(uint8 step) internal pure returns (bool) {
        return step < STEP_COUNT;
    }

    function burn(uint256 tokenId) external onlyOwner {
        _burn(tokenId);
    }

    function withdraw() external onlyOwner {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        if (!success) {
            revert("Ether transfer failed");
        }
    }

    function pause() external onlyOwner {
        _pause();
    }

    function unpause() external onlyOwner {
        _unpause();
    }

    function _setMintAuthority(
        address _address,
        uint8 step,
        uint8 _amount
    ) private {
        require(_address != address(0), "address can't be 0");
        require(_checkMintStepValid(step), "Not exist mint step");

        if (step == MINT_LIST_STEP) {
            mintListAddress[_address] = _amount;
        } else if (step == WHITE_LIST_STEP) {
            whiteListAddress[_address] = _amount;
        } else {
            revert("Not exist mint step");
        }
    }

    function setBulkMintAuthority(
        address[] calldata _addressList,
        uint8 step,
        uint8[] calldata _amountList
    ) external onlyOwner {
        require(_addressList.length == _amountList.length, "Invalid argument : different argument size");

        for (uint256 i = 0; i < _addressList.length; i++) {
            _setMintAuthority(_addressList[i], step, _amountList[i]);
        }
    }

    function setSaleAmount(uint16[] memory _amounts) external onlyOwner {
        require(_amounts.length == STEP_COUNT, "Invalid argument");
        for (uint8 i = 0; i < STEP_COUNT; i++) {
            saleInfoList[i].amount = _amounts[i];
            if (i > 0) {
                accumulatedSaleAmount[i] = accumulatedSaleAmount[i - 1] + _amounts[i];
            } else {
                accumulatedSaleAmount[i] = _amounts[i];
            }
        }

        require(maxSupply >= accumulatedSaleAmount[STEP_COUNT - 1], "Invalid argument : exceed maxSupply");
    }

    function setSalePrice(uint256[] memory _prices) external onlyOwner {
        require(_prices.length == STEP_COUNT, "Invalid argument");
        for (uint8 i = 0; i < STEP_COUNT; i++) {
            if (i > 0) {
                require(saleInfoList[i - 1].price <= _prices[i], "Invalid argument");
            }
            saleInfoList[i].price = _prices[i];
        }
    }

    function setMintStartTime(uint256[] memory _mintStartTimes) external onlyOwner {
        require(_mintStartTimes.length == STEP_COUNT, "Invalid argument");
        for (uint8 i = 0; i < STEP_COUNT; i++) {
            if (i > 0) {
                require(saleInfoList[i - 1].mintStartTime <= _mintStartTimes[i], "Invalid argument");
            }
            saleInfoList[i].mintStartTime = _mintStartTimes[i];
        }
    }

    function setMetadataUri(string calldata _metadataUri, string calldata _metadataSuffix) external onlyOwner {
        metadataUri = _metadataUri;
        metadataSuffix = _metadataSuffix;
    }

    function setIsReveal(bool _isReveal) external onlyOwner {
        isRevealed = _isReveal;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint16[]","name":"_amounts","type":"uint16[]"},{"internalType":"uint256[]","name":"_prices","type":"uint256[]"},{"internalType":"uint256[]","name":"_mintStartTimes","type":"uint256[]"},{"internalType":"string","name":"_metadataUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentStep","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"step","type":"uint8"}],"name":"getMintableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint8","name":"step","type":"uint8"}],"name":"isSoldout","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"amount","type":"uint8"},{"internalType":"uint8","name":"step","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintListAddress","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":"uint256","name":"","type":"uint256"}],"name":"saleInfoList","outputs":[{"internalType":"uint8","name":"step","type":"uint8"},{"internalType":"uint16","name":"amount","type":"uint16"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"mintStartTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressList","type":"address[]"},{"internalType":"uint8","name":"step","type":"uint8"},{"internalType":"uint8[]","name":"_amountList","type":"uint8[]"}],"name":"setBulkMintAuthority","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isReveal","type":"bool"}],"name":"setIsReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_metadataUri","type":"string"},{"internalType":"string","name":"_metadataSuffix","type":"string"}],"name":"setMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_mintStartTimes","type":"uint256[]"}],"name":"setMintStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_amounts","type":"uint16[]"}],"name":"setSaleAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_prices","type":"uint256[]"}],"name":"setSalePrice","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"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteListAddress","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600b908051906020019062000051929190620005dc565b506000601060006101000a81548160ff0219169083151502179055503480156200007a57600080fd5b50604051620057ce380380620057ce8339818101604052810190620000a0919062000894565b6040518060400160405280600a81526020017f4d49423139517565656e000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4d494251000000000000000000000000000000000000000000000000000000008152506200012c620001206200050b60201b60201c565b6200051360201b60201c565b816003908051906020019062000144929190620005dc565b5080600490805190602001906200015d929190620005dc565b506200016e620005d760201b60201c565b60018190555050506000600960006101000a81548160ff021916908315150217905550600380620001a0919062000b7e565b60ff16825184518651620001b5919062000b21565b620001c1919062000b21565b1462000204576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001fb90620009f2565b60405180910390fd5b611388846002815181106200021e576200021d62000d4f565b5b6020026020010151856001815181106200023d576200023c62000d4f565b5b6020026020010151866000815181106200025c576200025b62000d4f565b5b602002602001015162000270919062000ae2565b6200027c919062000ae2565b61ffff161115620002c4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002bb90620009d0565b60405180910390fd5b60005b600360ff168160ff161015620004e757600e60405180608001604052808360ff168152602001878460ff168151811062000306576200030562000d4f565b5b602002602001015161ffff168152602001868460ff168151811062000330576200032f62000d4f565b5b60200260200101518152602001858460ff168151811062000356576200035562000d4f565b5b6020026020010151815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548161ffff021916908361ffff1602179055506040820151816001015560608201518160020155505060008160ff1611156200048357600f858260ff16815181106200040c576200040b62000d4f565b5b602002602001015161ffff16600f60018462000429919062000bc0565b60ff168154811062000440576200043f62000d4f565b5b906000526020600020015462000457919062000b21565b9080600181540180825580915050600190039060005260206000200160009091909190915055620004d1565b600f858260ff16815181106200049e576200049d62000d4f565b5b6020026020010151908060018154018082558091505060019003906000526020600020016000909161ffff169091909150555b8080620004de9062000cc2565b915050620002c7565b5080600a908051906020019062000500929190620005dc565b505050505062000e5d565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b828054620005ea9062000c56565b90600052602060002090601f0160209004810192826200060e57600085556200065a565b82601f106200062957805160ff19168380011785556200065a565b828001600101855582156200065a579182015b82811115620006595782518255916020019190600101906200063c565b5b5090506200066991906200066d565b5090565b5b80821115620006885760008160009055506001016200066e565b5090565b6000620006a36200069d8462000a3d565b62000a14565b90508083825260208201905082856020860282011115620006c957620006c862000db2565b5b60005b85811015620006fd5781620006e2888262000866565b845260208401935060208301925050600181019050620006cc565b5050509392505050565b60006200071e620007188462000a6c565b62000a14565b9050808382526020820190508285602086028201111562000744576200074362000db2565b5b60005b858110156200077857816200075d88826200087d565b84526020840193506020830192505060018101905062000747565b5050509392505050565b600062000799620007938462000a9b565b62000a14565b905082815260208101848484011115620007b857620007b762000db7565b5b620007c584828562000c20565b509392505050565b600082601f830112620007e557620007e462000dad565b5b8151620007f78482602086016200068c565b91505092915050565b600082601f83011262000818576200081762000dad565b5b81516200082a84826020860162000707565b91505092915050565b600082601f8301126200084b576200084a62000dad565b5b81516200085d84826020860162000782565b91505092915050565b600081519050620008778162000e29565b92915050565b6000815190506200088e8162000e43565b92915050565b60008060008060808587031215620008b157620008b062000dc1565b5b600085015167ffffffffffffffff811115620008d257620008d162000dbc565b5b620008e087828801620007cd565b945050602085015167ffffffffffffffff81111562000904576200090362000dbc565b5b620009128782880162000800565b935050604085015167ffffffffffffffff81111562000936576200093562000dbc565b5b620009448782880162000800565b925050606085015167ffffffffffffffff81111562000968576200096762000dbc565b5b620009768782880162000833565b91505092959194509250565b600062000991601c8362000ad1565b91506200099e8262000dd7565b602082019050919050565b6000620009b8601f8362000ad1565b9150620009c58262000e00565b602082019050919050565b60006020820190508181036000830152620009eb8162000982565b9050919050565b6000602082019050818103600083015262000a0d81620009a9565b9050919050565b600062000a2062000a33565b905062000a2e828262000c8c565b919050565b6000604051905090565b600067ffffffffffffffff82111562000a5b5762000a5a62000d7e565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000a8a5762000a8962000d7e565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000ab95762000ab862000d7e565b5b62000ac48262000dc6565b9050602081019050919050565b600082825260208201905092915050565b600062000aef8262000bfb565b915062000afc8362000bfb565b92508261ffff0382111562000b165762000b1562000cf1565b5b828201905092915050565b600062000b2e8262000c09565b915062000b3b8362000c09565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000b735762000b7262000cf1565b5b828201905092915050565b600062000b8b8262000c13565b915062000b988362000c13565b92508160ff048311821515161562000bb55762000bb462000cf1565b5b828202905092915050565b600062000bcd8262000c13565b915062000bda8362000c13565b92508282101562000bf05762000bef62000cf1565b5b828203905092915050565b600061ffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b8381101562000c4057808201518184015260208101905062000c23565b8381111562000c50576000848401525b50505050565b6000600282049050600182168062000c6f57607f821691505b6020821081141562000c865762000c8562000d20565b5b50919050565b62000c978262000dc6565b810181811067ffffffffffffffff8211171562000cb95762000cb862000d7e565b5b80604052505050565b600062000ccf8262000c13565b915060ff82141562000ce65762000ce562000cf1565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f496e76616c696420417267756d656e74203a206d6178537570706c7900000000600082015250565b7f496e76616c696420417267756d656e74203a20706172616d206c656e67746800600082015250565b62000e348162000bfb565b811462000e4057600080fd5b50565b62000e4e8162000c09565b811462000e5a57600080fd5b50565b6149618062000e6d6000396000f3fe60806040526004361061021a5760003560e01c80636352211e11610123578063a22cb465116100ab578063d5abeb011161006f578063d5abeb01146107ad578063da403074146107d8578063e8a3d48514610815578063e985e9c514610840578063f2fde38b1461087d5761021a565b8063a22cb465146106b8578063b88d4fde146106e1578063bb1db4f71461070a578063c87b56dd14610733578063cf52a7b2146107705761021a565b80638456cb59116100f25780638456cb59146105e55780638da5cb5b146105fc57806395d89b41146106275780639809ddb3146106525780639ee78a691461068f5761021a565b80636352211e1461052b57806370a0823114610568578063715018a6146105a557806378f7c2a0146105bc5761021a565b80632df9a69b116101a657806342842e0e1161017557806342842e0e1461045c57806342966c68146104855780634eee1fc5146104ae57806352349f52146104d75780635c975abb146105005761021a565b80632df9a69b146103c857806334cf27d6146104055780633ccfd60b1461042e5780633f4ba83a146104455761021a565b80630ce0aea0116101ed5780630ce0aea0146102ed57806318160ddd1461032d5780631d3824ea1461035857806323b872dd1461038357806329a0eee8146103ac5761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b506102466004803603810190610241919061364a565b6108a6565b6040516102539190613cd0565b60405180910390f35b34801561026857600080fd5b50610271610938565b60405161027e9190613ceb565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190613725565b6109ca565b6040516102bb9190613c69565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e691906134b6565b610a46565b005b3480156102f957600080fd5b50610314600480360381019061030f9190613725565b610b87565b6040516103249493929190613f43565b60405180910390f35b34801561033957600080fd5b50610342610be2565b60405161034f9190613f0d565b60405180910390f35b34801561036457600080fd5b5061036d610bf9565b60405161037a9190613f28565b60405180910390f35b34801561038f57600080fd5b506103aa60048036038101906103a591906133a0565b610ca1565b005b6103c660048036038101906103c1919061377f565b610fc6565b005b3480156103d457600080fd5b506103ef60048036038101906103ea9190613752565b6111c3565b6040516103fc9190613cd0565b60405180910390f35b34801561041157600080fd5b5061042c6004803603810190610427919061358b565b61123f565b005b34801561043a57600080fd5b50610443611462565b005b34801561045157600080fd5b5061045a611519565b005b34801561046857600080fd5b50610483600480360381019061047e91906133a0565b61152b565b005b34801561049157600080fd5b506104ac60048036038101906104a79190613725565b61154b565b005b3480156104ba57600080fd5b506104d560048036038101906104d091906136a4565b61155f565b005b3480156104e357600080fd5b506104fe60048036038101906104f9919061361d565b611591565b005b34801561050c57600080fd5b506105156115b6565b6040516105229190613cd0565b60405180910390f35b34801561053757600080fd5b50610552600480360381019061054d9190613725565b6115cd565b60405161055f9190613c69565b60405180910390f35b34801561057457600080fd5b5061058f600480360381019061058a9190613333565b6115df565b60405161059c9190613f0d565b60405180910390f35b3480156105b157600080fd5b506105ba611698565b005b3480156105c857600080fd5b506105e360048036038101906105de91906135d4565b6116ac565b005b3480156105f157600080fd5b506105fa61180f565b005b34801561060857600080fd5b50610611611821565b60405161061e9190613c69565b60405180910390f35b34801561063357600080fd5b5061063c61184a565b6040516106499190613ceb565b60405180910390f35b34801561065e57600080fd5b5061067960048036038101906106749190613333565b6118dc565b6040516106869190613f28565b60405180910390f35b34801561069b57600080fd5b506106b660048036038101906106b191906134f6565b6118fc565b005b3480156106c457600080fd5b506106df60048036038101906106da9190613476565b6119ce565b005b3480156106ed57600080fd5b50610708600480360381019061070391906133f3565b611b46565b005b34801561071657600080fd5b50610731600480360381019061072c91906135d4565b611bb9565b005b34801561073f57600080fd5b5061075a60048036038101906107559190613725565b611d1c565b6040516107679190613ceb565b60405180910390f35b34801561077c57600080fd5b5061079760048036038101906107929190613333565b611ddb565b6040516107a49190613f28565b60405180910390f35b3480156107b957600080fd5b506107c2611dfb565b6040516107cf9190613f0d565b60405180910390f35b3480156107e457600080fd5b506107ff60048036038101906107fa9190613752565b611e01565b60405161080c9190613f0d565b60405180910390f35b34801561082157600080fd5b5061082a611e86565b6040516108379190613ceb565b60405180910390f35b34801561084c57600080fd5b5061086760048036038101906108629190613360565b611eb1565b6040516108749190613cd0565b60405180910390f35b34801561088957600080fd5b506108a4600480360381019061089f9190613333565b611f45565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109315750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610947906142dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610973906142dd565b80156109c05780601f10610995576101008083540402835291602001916109c0565b820191906000526020600020905b8154815290600101906020018083116109a357829003601f168201915b5050505050905090565b60006109d582611fc9565b610a0b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a51826115cd565b90508073ffffffffffffffffffffffffffffffffffffffff16610a72612028565b73ffffffffffffffffffffffffffffffffffffffff1614610ad557610a9e81610a99612028565b611eb1565b610ad4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600e8181548110610b9757600080fd5b90600052602060002090600302016000915090508060000160009054906101000a900460ff16908060000160019054906101000a900461ffff16908060010154908060020154905084565b6000610bec612030565b6002546001540303905090565b60008060016003610c0a91906141ae565b90505b60008160ff1610610c6357600e8160ff1681548110610c2f57610c2e614471565b5b9060005260206000209060030201600201544210610c505780915050610c9e565b8080610c5b906142b3565b915050610c0d565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9590613d8d565b60405180910390fd5b90565b6000610cac82612035565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d13576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d1f84612103565b91509150610d358187610d30612028565b612125565b610d8157610d4a86610d45612028565b611eb1565b610d80576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610de8576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610df58686866001612169565b8015610e0057600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ece85610eaa88888761216f565b7c020000000000000000000000000000000000000000000000000000000017612197565b600560008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610f56576000600185019050600060056000838152602001908152602001600020541415610f54576001548114610f53578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fbe86868660016121c2565b505050505050565b610fce6121c8565b610fd781612212565b611016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100d90613e2d565b60405180910390fd5b6000611020610bf9565b90508160ff168160ff161461106a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106190613dcd565b60405180910390fd5b60008360ff16600e8460ff168154811061108757611086614471565b5b9060005260206000209060030201600101546110a39190614120565b90508034146110e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110de90613d2d565b60405180910390fd5b600f8360ff16815481106110fe576110fd614471565b5b90600052602060002001548460ff16611115612225565b61111f9190614099565b1115611160576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115790613ead565b60405180910390fd5b600060ff168360ff16141561117f5761117a84600c612238565b6111bd565b600160ff168360ff16141561119e5761119984600d612238565b6111bc565b600260ff168360ff1614156111bb576111ba338560ff16612358565b5b5b5b50505050565b60006111ce82612212565b61120d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120490613e2d565b60405180910390fd5b600f8260ff168154811061122457611223614471565b5b9060005260206000200154611237612225565b149050919050565b611247612376565b600360ff1681511461128e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128590613e6d565b60405180910390fd5b60005b600360ff168160ff1610156113eb57818160ff16815181106112b6576112b5614471565b5b6020026020010151600e8260ff16815481106112d5576112d4614471565b5b906000526020600020906003020160000160016101000a81548161ffff021916908361ffff16021790555060008160ff16111561139057818160ff168151811061132257611321614471565b5b602002602001015161ffff16600f60018361133d91906141ae565b60ff168154811061135157611350614471565b5b90600052602060002001546113669190614099565b600f8260ff168154811061137d5761137c614471565b5b90600052602060002001819055506113d8565b818160ff16815181106113a6576113a5614471565b5b602002602001015161ffff16600f8260ff16815481106113c9576113c8614471565b5b90600052602060002001819055505b80806113e390614389565b915050611291565b50600f600160036113fc91906141ae565b60ff16815481106114105761140f614471565b5b9060005260206000200154611388101561145f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145690613e4d565b60405180910390fd5b50565b61146a612376565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161149090613c54565b60006040518083038185875af1925050503d80600081146114cd576040519150601f19603f3d011682016040523d82523d6000602084013e6114d2565b606091505b5050905080611516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150d90613d6d565b60405180910390fd5b50565b611521612376565b6115296123f4565b565b61154683838360405180602001604052806000815250611b46565b505050565b611553612376565b61155c81612457565b50565b611567612376565b8383600a9190611578929190612f4f565b508181600b919061158a929190612f4f565b5050505050565b611599612376565b80601060006101000a81548160ff02191690831515021790555050565b6000600960009054906101000a900460ff16905090565b60006115d882612035565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611647576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6116a0612376565b6116aa6000612465565b565b6116b4612376565b600360ff168151146116fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f290613e6d565b60405180910390fd5b60005b600360ff168160ff16101561180b5760008160ff1611156117ae57818160ff168151811061172f5761172e614471565b5b6020026020010151600e60018361174691906141ae565b60ff168154811061175a57611759614471565b5b90600052602060002090600302016001015411156117ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a490613e6d565b60405180910390fd5b5b818160ff16815181106117c4576117c3614471565b5b6020026020010151600e8260ff16815481106117e3576117e2614471565b5b906000526020600020906003020160010181905550808061180390614389565b9150506116fe565b5050565b611817612376565b61181f612529565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611859906142dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611885906142dd565b80156118d25780601f106118a7576101008083540402835291602001916118d2565b820191906000526020600020905b8154815290600101906020018083116118b557829003601f168201915b5050505050905090565b600c6020528060005260406000206000915054906101000a900460ff1681565b611904612376565b81819050858590501461194c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194390613ded565b60405180910390fd5b60005b858590508110156119c6576119b38686838181106119705761196f614471565b5b90506020020160208101906119859190613333565b8585858581811061199957611998614471565b5b90506020020160208101906119ae9190613752565b61258c565b80806119be90614340565b91505061194f565b505050505050565b6119d6612028565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a3b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611a48612028565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611af5612028565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b3a9190613cd0565b60405180910390a35050565b611b51848484610ca1565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611bb357611b7c8484848461275d565b611bb2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611bc1612376565b600360ff16815114611c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bff90613e6d565b60405180910390fd5b60005b600360ff168160ff161015611d185760008160ff161115611cbb57818160ff1681518110611c3c57611c3b614471565b5b6020026020010151600e600183611c5391906141ae565b60ff1681548110611c6757611c66614471565b5b9060005260206000209060030201600201541115611cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb190613e6d565b60405180910390fd5b5b818160ff1681518110611cd157611cd0614471565b5b6020026020010151600e8260ff1681548110611cf057611cef614471565b5b9060005260206000209060030201600201819055508080611d1090614389565b915050611c0b565b5050565b6060611d2782611fc9565b611d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5d90613e8d565b60405180910390fd5b601060009054906101000a900460ff16611da557600a600b604051602001611d8f929190613c25565b6040516020818303038152906040529050611dd6565b600a611db0836128bd565b600b604051602001611dc493929190613bc5565b60405160208183030381529060405290505b919050565b600d6020528060005260406000206000915054906101000a900460ff1681565b61138881565b6000611e0c82612212565b611e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4290613e2d565b60405180910390fd5b611e53612225565b600f8360ff1681548110611e6a57611e69614471565b5b9060005260206000200154611e7f919061417a565b9050919050565b6060600a600b604051602001611e9d929190613bf6565b604051602081830303815290604052905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f4d612376565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb490613d4d565b60405180910390fd5b611fc681612465565b50565b600081611fd4612030565b11158015611fe3575060015482105b8015612021575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080612044612030565b116120cc576001548110156120cb5760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156120c9575b60008114156120bf576005600083600190039350838152602001908152602001600020549050612094565b80925050506120fe565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600790508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612186868684612a1e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6121d06115b6565b15612210576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220790613dad565b60405180910390fd5b565b6000600360ff168260ff16109050919050565b600061222f612030565b60015403905090565b6000828260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661229191906141ae565b60ff1610156122d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122cc90613eed565b60405180910390fd5b818160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff1661232f91906141ae565b92506101000a81548160ff021916908360ff160217905550612354338360ff16612358565b5050565b612372828260405180602001604052806000815250612a27565b5050565b61237e612ac5565b73ffffffffffffffffffffffffffffffffffffffff1661239c611821565b73ffffffffffffffffffffffffffffffffffffffff16146123f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e990613e0d565b60405180910390fd5b565b6123fc612acd565b6000600960006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612440612ac5565b60405161244d9190613c69565b60405180910390a1565b612462816000612b16565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125316121c8565b6001600960006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612575612ac5565b6040516125829190613c69565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f390613ecd565b60405180910390fd5b61260582612212565b612644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263b90613e2d565b60405180910390fd5b600060ff168260ff1614156126b05780600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550612758565b600160ff168260ff16141561271c5780600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550612757565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274e90613e2d565b60405180910390fd5b5b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612783612028565b8786866040518563ffffffff1660e01b81526004016127a59493929190613c84565b602060405180830381600087803b1580156127bf57600080fd5b505af19250505080156127f057506040513d601f19601f820116820180604052508101906127ed9190613677565b60015b61286a573d8060008114612820576040519150601f19603f3d011682016040523d82523d6000602084013e612825565b606091505b50600081511415612862576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612905576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a19565b600082905060005b6000821461293757808061292090614340565b915050600a8261293091906140ef565b915061290d565b60008167ffffffffffffffff811115612953576129526144a0565b5b6040519080825280601f01601f1916602001820160405280156129855781602001600182028036833780820191505090505b5090505b60008514612a125760018261299e919061417a565b9150600a856129ad91906143b3565b60306129b99190614099565b60f81b8183815181106129cf576129ce614471565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a0b91906140ef565b9450612989565b8093505050505b919050565b60009392505050565b612a318383612d6a565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ac05760006001549050600083820390505b612a72600086838060010194508661275d565b612aa8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612a5f578160015414612abd57600080fd5b50505b505050565b600033905090565b612ad56115b6565b612b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0b90613d0d565b60405180910390fd5b565b6000612b2183612035565b90506000819050600080612b3486612103565b915091508415612b9d57612b508184612b4b612028565b612125565b612b9c57612b6583612b60612028565b611eb1565b612b9b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b612bab836000886001612169565b8015612bb657600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612c5e83612c1b8560008861216f565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612197565b600560008881526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000085161415612ce6576000600187019050600060056000838152602001908152602001600020541415612ce4576001548114612ce3578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d508360008860016121c2565b600260008154809291906001019190505550505050505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612dd8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612e13576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e206000848385612169565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612e9783612e88600086600061216f565b612e9185612f3f565b17612197565b60056000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612ebb57806001819055505050612f3a60008483856121c2565b505050565b60006001821460e11b9050919050565b828054612f5b906142dd565b90600052602060002090601f016020900481019282612f7d5760008555612fc4565b82601f10612f9657803560ff1916838001178555612fc4565b82800160010185558215612fc4579182015b82811115612fc3578235825591602001919060010190612fa8565b5b509050612fd19190612fd5565b5090565b5b80821115612fee576000816000905550600101612fd6565b5090565b600061300561300084613fad565b613f88565b90508083825260208201905082856020860282011115613028576130276144d9565b5b60005b85811015613058578161303e88826132f4565b84526020840193506020830192505060018101905061302b565b5050509392505050565b600061307561307084613fd9565b613f88565b90508083825260208201905082856020860282011115613098576130976144d9565b5b60005b858110156130c857816130ae8882613309565b84526020840193506020830192505060018101905061309b565b5050509392505050565b60006130e56130e084614005565b613f88565b905082815260208101848484011115613101576131006144de565b5b61310c848285614271565b509392505050565b600081359050613123816148a1565b92915050565b60008083601f84011261313f5761313e6144d4565b5b8235905067ffffffffffffffff81111561315c5761315b6144cf565b5b602083019150836020820283011115613178576131776144d9565b5b9250929050565b600082601f830112613194576131936144d4565b5b81356131a4848260208601612ff2565b91505092915050565b600082601f8301126131c2576131c16144d4565b5b81356131d2848260208601613062565b91505092915050565b60008083601f8401126131f1576131f06144d4565b5b8235905067ffffffffffffffff81111561320e5761320d6144cf565b5b60208301915083602082028301111561322a576132296144d9565b5b9250929050565b600081359050613240816148b8565b92915050565b600081359050613255816148cf565b92915050565b60008151905061326a816148cf565b92915050565b600082601f830112613285576132846144d4565b5b81356132958482602086016130d2565b91505092915050565b60008083601f8401126132b4576132b36144d4565b5b8235905067ffffffffffffffff8111156132d1576132d06144cf565b5b6020830191508360018202830111156132ed576132ec6144d9565b5b9250929050565b600081359050613303816148e6565b92915050565b600081359050613318816148fd565b92915050565b60008135905061332d81614914565b92915050565b600060208284031215613349576133486144e8565b5b600061335784828501613114565b91505092915050565b60008060408385031215613377576133766144e8565b5b600061338585828601613114565b925050602061339685828601613114565b9150509250929050565b6000806000606084860312156133b9576133b86144e8565b5b60006133c786828701613114565b93505060206133d886828701613114565b92505060406133e986828701613309565b9150509250925092565b6000806000806080858703121561340d5761340c6144e8565b5b600061341b87828801613114565b945050602061342c87828801613114565b935050604061343d87828801613309565b925050606085013567ffffffffffffffff81111561345e5761345d6144e3565b5b61346a87828801613270565b91505092959194509250565b6000806040838503121561348d5761348c6144e8565b5b600061349b85828601613114565b92505060206134ac85828601613231565b9150509250929050565b600080604083850312156134cd576134cc6144e8565b5b60006134db85828601613114565b92505060206134ec85828601613309565b9150509250929050565b600080600080600060608688031215613512576135116144e8565b5b600086013567ffffffffffffffff8111156135305761352f6144e3565b5b61353c88828901613129565b9550955050602061354f8882890161331e565b935050604086013567ffffffffffffffff8111156135705761356f6144e3565b5b61357c888289016131db565b92509250509295509295909350565b6000602082840312156135a1576135a06144e8565b5b600082013567ffffffffffffffff8111156135bf576135be6144e3565b5b6135cb8482850161317f565b91505092915050565b6000602082840312156135ea576135e96144e8565b5b600082013567ffffffffffffffff811115613608576136076144e3565b5b613614848285016131ad565b91505092915050565b600060208284031215613633576136326144e8565b5b600061364184828501613231565b91505092915050565b6000602082840312156136605761365f6144e8565b5b600061366e84828501613246565b91505092915050565b60006020828403121561368d5761368c6144e8565b5b600061369b8482850161325b565b91505092915050565b600080600080604085870312156136be576136bd6144e8565b5b600085013567ffffffffffffffff8111156136dc576136db6144e3565b5b6136e88782880161329e565b9450945050602085013567ffffffffffffffff81111561370b5761370a6144e3565b5b6137178782880161329e565b925092505092959194509250565b60006020828403121561373b5761373a6144e8565b5b600061374984828501613309565b91505092915050565b600060208284031215613768576137676144e8565b5b60006137768482850161331e565b91505092915050565b60008060408385031215613796576137956144e8565b5b60006137a48582860161331e565b92505060206137b58582860161331e565b9150509250929050565b6137c8816141e2565b82525050565b6137d7816141f4565b82525050565b60006137e88261404b565b6137f28185614061565b9350613802818560208601614280565b61380b816144ed565b840191505092915050565b600061382182614056565b61382b818561407d565b935061383b818560208601614280565b613844816144ed565b840191505092915050565b600061385a82614056565b613864818561408e565b9350613874818560208601614280565b80840191505092915050565b6000815461388d816142dd565b613897818661408e565b945060018216600081146138b257600181146138c3576138f6565b60ff198316865281860193506138f6565b6138cc85614036565b60005b838110156138ee578154818901526001820191506020810190506138cf565b838801955050505b50505092915050565b600061390c60148361407d565b9150613917826144fe565b602082019050919050565b600061392f60138361407d565b915061393a82614527565b602082019050919050565b600061395260268361407d565b915061395d82614550565b604082019050919050565b600061397560158361407d565b91506139808261459f565b602082019050919050565b6000613998601a8361407d565b91506139a3826145c8565b602082019050919050565b60006139bb60108361407d565b91506139c6826145f1565b602082019050919050565b60006139de60088361408e565b91506139e98261461a565b600882019050919050565b6000613a01602b8361407d565b9150613a0c82614643565b604082019050919050565b6000613a24602a8361407d565b9150613a2f82614692565b604082019050919050565b6000613a4760208361407d565b9150613a52826146e1565b602082019050919050565b6000613a6a60138361407d565b9150613a758261470a565b602082019050919050565b6000613a8d60238361407d565b9150613a9882614733565b604082019050919050565b6000613ab060108361407d565b9150613abb82614782565b602082019050919050565b6000613ad3602f8361407d565b9150613ade826147ab565b604082019050919050565b6000613af660158361407d565b9150613b01826147fa565b602082019050919050565b6000613b1960128361407d565b9150613b2482614823565b602082019050919050565b6000613b3c60198361407d565b9150613b478261484c565b602082019050919050565b6000613b5f600083614072565b9150613b6a82614875565b600082019050919050565b6000613b8260098361408e565b9150613b8d82614878565b600982019050919050565b613ba18161422c565b82525050565b613bb08161425a565b82525050565b613bbf81614264565b82525050565b6000613bd18286613880565b9150613bdd828561384f565b9150613be98284613880565b9150819050949350505050565b6000613c028285613880565b9150613c0d826139d1565b9150613c198284613880565b91508190509392505050565b6000613c318285613880565b9150613c3c82613b75565b9150613c488284613880565b91508190509392505050565b6000613c5f82613b52565b9150819050919050565b6000602082019050613c7e60008301846137bf565b92915050565b6000608082019050613c9960008301876137bf565b613ca660208301866137bf565b613cb36040830185613ba7565b8181036060830152613cc581846137dd565b905095945050505050565b6000602082019050613ce560008301846137ce565b92915050565b60006020820190508181036000830152613d058184613816565b905092915050565b60006020820190508181036000830152613d26816138ff565b9050919050565b60006020820190508181036000830152613d4681613922565b9050919050565b60006020820190508181036000830152613d6681613945565b9050919050565b60006020820190508181036000830152613d8681613968565b9050919050565b60006020820190508181036000830152613da68161398b565b9050919050565b60006020820190508181036000830152613dc6816139ae565b9050919050565b60006020820190508181036000830152613de6816139f4565b9050919050565b60006020820190508181036000830152613e0681613a17565b9050919050565b60006020820190508181036000830152613e2681613a3a565b9050919050565b60006020820190508181036000830152613e4681613a5d565b9050919050565b60006020820190508181036000830152613e6681613a80565b9050919050565b60006020820190508181036000830152613e8681613aa3565b9050919050565b60006020820190508181036000830152613ea681613ac6565b9050919050565b60006020820190508181036000830152613ec681613ae9565b9050919050565b60006020820190508181036000830152613ee681613b0c565b9050919050565b60006020820190508181036000830152613f0681613b2f565b9050919050565b6000602082019050613f226000830184613ba7565b92915050565b6000602082019050613f3d6000830184613bb6565b92915050565b6000608082019050613f586000830187613bb6565b613f656020830186613b98565b613f726040830185613ba7565b613f7f6060830184613ba7565b95945050505050565b6000613f92613fa3565b9050613f9e828261430f565b919050565b6000604051905090565b600067ffffffffffffffff821115613fc857613fc76144a0565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613ff457613ff36144a0565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156140205761401f6144a0565b5b614029826144ed565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006140a48261425a565b91506140af8361425a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140e4576140e36143e4565b5b828201905092915050565b60006140fa8261425a565b91506141058361425a565b92508261411557614114614413565b5b828204905092915050565b600061412b8261425a565b91506141368361425a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561416f5761416e6143e4565b5b828202905092915050565b60006141858261425a565b91506141908361425a565b9250828210156141a3576141a26143e4565b5b828203905092915050565b60006141b982614264565b91506141c483614264565b9250828210156141d7576141d66143e4565b5b828203905092915050565b60006141ed8261423a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561429e578082015181840152602081019050614283565b838111156142ad576000848401525b50505050565b60006142be82614264565b915060008214156142d2576142d16143e4565b5b600182039050919050565b600060028204905060018216806142f557607f821691505b6020821081141561430957614308614442565b5b50919050565b614318826144ed565b810181811067ffffffffffffffff82111715614337576143366144a0565b5b80604052505050565b600061434b8261425a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561437e5761437d6143e4565b5b600182019050919050565b600061439482614264565b915060ff8214156143a8576143a76143e4565b5b600182019050919050565b60006143be8261425a565b91506143c98361425a565b9250826143d9576143d8614413565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f496e76616c6964204554482062616c616e636500000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4574686572207472616e73666572206661696c65640000000000000000000000600082015250565b7f4d696e74696e67206861736e2774207374617274656420796574000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f636f6e7472616374000000000000000000000000000000000000000000000000600082015250565b7f537465707320746861742068617665206e6f742073746172746564206f72206160008201527f72652066696e6973686564000000000000000000000000000000000000000000602082015250565b7f496e76616c696420617267756d656e74203a20646966666572656e742061726760008201527f756d656e742073697a6500000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f74206578697374206d696e74207374657000000000000000000000000000600082015250565b7f496e76616c696420617267756d656e74203a20657863656564206d617853757060008201527f706c790000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420617267756d656e7400000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f536f6c64206f757420696e207468697320737465700000000000000000000000600082015250565b7f616464726573732063616e277420626520300000000000000000000000000000600082015250565b7f446f6e27742068617665206d696e7420617574686f7269747900000000000000600082015250565b50565b7f70726572657665616c0000000000000000000000000000000000000000000000600082015250565b6148aa816141e2565b81146148b557600080fd5b50565b6148c1816141f4565b81146148cc57600080fd5b50565b6148d881614200565b81146148e357600080fd5b50565b6148ef8161422c565b81146148fa57600080fd5b50565b6149068161425a565b811461491157600080fd5b50565b61491d81614264565b811461492857600080fd5b5056fea264697066735822122001d550af6dfd5bab78591d8b6d5790704e0f8f910ab78bf59d31864725d09c6c64736f6c634300080700330000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000002bc00000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000008fc000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000d529ae9e8600000000000000000000000000000000000000000000000000000106e69ba161000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000062d15dc80000000000000000000000000000000000000000000000000000000062d16bd80000000000000000000000000000000000000000000000000000000062d179e8000000000000000000000000000000000000000000000000000000000000002168747470733a2f2f61737365742e6d696231396d65746173706163652e636f6d2f00000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061021a5760003560e01c80636352211e11610123578063a22cb465116100ab578063d5abeb011161006f578063d5abeb01146107ad578063da403074146107d8578063e8a3d48514610815578063e985e9c514610840578063f2fde38b1461087d5761021a565b8063a22cb465146106b8578063b88d4fde146106e1578063bb1db4f71461070a578063c87b56dd14610733578063cf52a7b2146107705761021a565b80638456cb59116100f25780638456cb59146105e55780638da5cb5b146105fc57806395d89b41146106275780639809ddb3146106525780639ee78a691461068f5761021a565b80636352211e1461052b57806370a0823114610568578063715018a6146105a557806378f7c2a0146105bc5761021a565b80632df9a69b116101a657806342842e0e1161017557806342842e0e1461045c57806342966c68146104855780634eee1fc5146104ae57806352349f52146104d75780635c975abb146105005761021a565b80632df9a69b146103c857806334cf27d6146104055780633ccfd60b1461042e5780633f4ba83a146104455761021a565b80630ce0aea0116101ed5780630ce0aea0146102ed57806318160ddd1461032d5780631d3824ea1461035857806323b872dd1461038357806329a0eee8146103ac5761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b506102466004803603810190610241919061364a565b6108a6565b6040516102539190613cd0565b60405180910390f35b34801561026857600080fd5b50610271610938565b60405161027e9190613ceb565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190613725565b6109ca565b6040516102bb9190613c69565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e691906134b6565b610a46565b005b3480156102f957600080fd5b50610314600480360381019061030f9190613725565b610b87565b6040516103249493929190613f43565b60405180910390f35b34801561033957600080fd5b50610342610be2565b60405161034f9190613f0d565b60405180910390f35b34801561036457600080fd5b5061036d610bf9565b60405161037a9190613f28565b60405180910390f35b34801561038f57600080fd5b506103aa60048036038101906103a591906133a0565b610ca1565b005b6103c660048036038101906103c1919061377f565b610fc6565b005b3480156103d457600080fd5b506103ef60048036038101906103ea9190613752565b6111c3565b6040516103fc9190613cd0565b60405180910390f35b34801561041157600080fd5b5061042c6004803603810190610427919061358b565b61123f565b005b34801561043a57600080fd5b50610443611462565b005b34801561045157600080fd5b5061045a611519565b005b34801561046857600080fd5b50610483600480360381019061047e91906133a0565b61152b565b005b34801561049157600080fd5b506104ac60048036038101906104a79190613725565b61154b565b005b3480156104ba57600080fd5b506104d560048036038101906104d091906136a4565b61155f565b005b3480156104e357600080fd5b506104fe60048036038101906104f9919061361d565b611591565b005b34801561050c57600080fd5b506105156115b6565b6040516105229190613cd0565b60405180910390f35b34801561053757600080fd5b50610552600480360381019061054d9190613725565b6115cd565b60405161055f9190613c69565b60405180910390f35b34801561057457600080fd5b5061058f600480360381019061058a9190613333565b6115df565b60405161059c9190613f0d565b60405180910390f35b3480156105b157600080fd5b506105ba611698565b005b3480156105c857600080fd5b506105e360048036038101906105de91906135d4565b6116ac565b005b3480156105f157600080fd5b506105fa61180f565b005b34801561060857600080fd5b50610611611821565b60405161061e9190613c69565b60405180910390f35b34801561063357600080fd5b5061063c61184a565b6040516106499190613ceb565b60405180910390f35b34801561065e57600080fd5b5061067960048036038101906106749190613333565b6118dc565b6040516106869190613f28565b60405180910390f35b34801561069b57600080fd5b506106b660048036038101906106b191906134f6565b6118fc565b005b3480156106c457600080fd5b506106df60048036038101906106da9190613476565b6119ce565b005b3480156106ed57600080fd5b50610708600480360381019061070391906133f3565b611b46565b005b34801561071657600080fd5b50610731600480360381019061072c91906135d4565b611bb9565b005b34801561073f57600080fd5b5061075a60048036038101906107559190613725565b611d1c565b6040516107679190613ceb565b60405180910390f35b34801561077c57600080fd5b5061079760048036038101906107929190613333565b611ddb565b6040516107a49190613f28565b60405180910390f35b3480156107b957600080fd5b506107c2611dfb565b6040516107cf9190613f0d565b60405180910390f35b3480156107e457600080fd5b506107ff60048036038101906107fa9190613752565b611e01565b60405161080c9190613f0d565b60405180910390f35b34801561082157600080fd5b5061082a611e86565b6040516108379190613ceb565b60405180910390f35b34801561084c57600080fd5b5061086760048036038101906108629190613360565b611eb1565b6040516108749190613cd0565b60405180910390f35b34801561088957600080fd5b506108a4600480360381019061089f9190613333565b611f45565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109315750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610947906142dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610973906142dd565b80156109c05780601f10610995576101008083540402835291602001916109c0565b820191906000526020600020905b8154815290600101906020018083116109a357829003601f168201915b5050505050905090565b60006109d582611fc9565b610a0b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a51826115cd565b90508073ffffffffffffffffffffffffffffffffffffffff16610a72612028565b73ffffffffffffffffffffffffffffffffffffffff1614610ad557610a9e81610a99612028565b611eb1565b610ad4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600e8181548110610b9757600080fd5b90600052602060002090600302016000915090508060000160009054906101000a900460ff16908060000160019054906101000a900461ffff16908060010154908060020154905084565b6000610bec612030565b6002546001540303905090565b60008060016003610c0a91906141ae565b90505b60008160ff1610610c6357600e8160ff1681548110610c2f57610c2e614471565b5b9060005260206000209060030201600201544210610c505780915050610c9e565b8080610c5b906142b3565b915050610c0d565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9590613d8d565b60405180910390fd5b90565b6000610cac82612035565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d13576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d1f84612103565b91509150610d358187610d30612028565b612125565b610d8157610d4a86610d45612028565b611eb1565b610d80576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610de8576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610df58686866001612169565b8015610e0057600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ece85610eaa88888761216f565b7c020000000000000000000000000000000000000000000000000000000017612197565b600560008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610f56576000600185019050600060056000838152602001908152602001600020541415610f54576001548114610f53578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fbe86868660016121c2565b505050505050565b610fce6121c8565b610fd781612212565b611016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100d90613e2d565b60405180910390fd5b6000611020610bf9565b90508160ff168160ff161461106a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106190613dcd565b60405180910390fd5b60008360ff16600e8460ff168154811061108757611086614471565b5b9060005260206000209060030201600101546110a39190614120565b90508034146110e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110de90613d2d565b60405180910390fd5b600f8360ff16815481106110fe576110fd614471565b5b90600052602060002001548460ff16611115612225565b61111f9190614099565b1115611160576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115790613ead565b60405180910390fd5b600060ff168360ff16141561117f5761117a84600c612238565b6111bd565b600160ff168360ff16141561119e5761119984600d612238565b6111bc565b600260ff168360ff1614156111bb576111ba338560ff16612358565b5b5b5b50505050565b60006111ce82612212565b61120d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120490613e2d565b60405180910390fd5b600f8260ff168154811061122457611223614471565b5b9060005260206000200154611237612225565b149050919050565b611247612376565b600360ff1681511461128e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128590613e6d565b60405180910390fd5b60005b600360ff168160ff1610156113eb57818160ff16815181106112b6576112b5614471565b5b6020026020010151600e8260ff16815481106112d5576112d4614471565b5b906000526020600020906003020160000160016101000a81548161ffff021916908361ffff16021790555060008160ff16111561139057818160ff168151811061132257611321614471565b5b602002602001015161ffff16600f60018361133d91906141ae565b60ff168154811061135157611350614471565b5b90600052602060002001546113669190614099565b600f8260ff168154811061137d5761137c614471565b5b90600052602060002001819055506113d8565b818160ff16815181106113a6576113a5614471565b5b602002602001015161ffff16600f8260ff16815481106113c9576113c8614471565b5b90600052602060002001819055505b80806113e390614389565b915050611291565b50600f600160036113fc91906141ae565b60ff16815481106114105761140f614471565b5b9060005260206000200154611388101561145f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145690613e4d565b60405180910390fd5b50565b61146a612376565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161149090613c54565b60006040518083038185875af1925050503d80600081146114cd576040519150601f19603f3d011682016040523d82523d6000602084013e6114d2565b606091505b5050905080611516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150d90613d6d565b60405180910390fd5b50565b611521612376565b6115296123f4565b565b61154683838360405180602001604052806000815250611b46565b505050565b611553612376565b61155c81612457565b50565b611567612376565b8383600a9190611578929190612f4f565b508181600b919061158a929190612f4f565b5050505050565b611599612376565b80601060006101000a81548160ff02191690831515021790555050565b6000600960009054906101000a900460ff16905090565b60006115d882612035565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611647576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6116a0612376565b6116aa6000612465565b565b6116b4612376565b600360ff168151146116fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f290613e6d565b60405180910390fd5b60005b600360ff168160ff16101561180b5760008160ff1611156117ae57818160ff168151811061172f5761172e614471565b5b6020026020010151600e60018361174691906141ae565b60ff168154811061175a57611759614471565b5b90600052602060002090600302016001015411156117ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a490613e6d565b60405180910390fd5b5b818160ff16815181106117c4576117c3614471565b5b6020026020010151600e8260ff16815481106117e3576117e2614471565b5b906000526020600020906003020160010181905550808061180390614389565b9150506116fe565b5050565b611817612376565b61181f612529565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611859906142dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611885906142dd565b80156118d25780601f106118a7576101008083540402835291602001916118d2565b820191906000526020600020905b8154815290600101906020018083116118b557829003601f168201915b5050505050905090565b600c6020528060005260406000206000915054906101000a900460ff1681565b611904612376565b81819050858590501461194c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194390613ded565b60405180910390fd5b60005b858590508110156119c6576119b38686838181106119705761196f614471565b5b90506020020160208101906119859190613333565b8585858581811061199957611998614471565b5b90506020020160208101906119ae9190613752565b61258c565b80806119be90614340565b91505061194f565b505050505050565b6119d6612028565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a3b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611a48612028565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611af5612028565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b3a9190613cd0565b60405180910390a35050565b611b51848484610ca1565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611bb357611b7c8484848461275d565b611bb2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611bc1612376565b600360ff16815114611c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bff90613e6d565b60405180910390fd5b60005b600360ff168160ff161015611d185760008160ff161115611cbb57818160ff1681518110611c3c57611c3b614471565b5b6020026020010151600e600183611c5391906141ae565b60ff1681548110611c6757611c66614471565b5b9060005260206000209060030201600201541115611cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb190613e6d565b60405180910390fd5b5b818160ff1681518110611cd157611cd0614471565b5b6020026020010151600e8260ff1681548110611cf057611cef614471565b5b9060005260206000209060030201600201819055508080611d1090614389565b915050611c0b565b5050565b6060611d2782611fc9565b611d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5d90613e8d565b60405180910390fd5b601060009054906101000a900460ff16611da557600a600b604051602001611d8f929190613c25565b6040516020818303038152906040529050611dd6565b600a611db0836128bd565b600b604051602001611dc493929190613bc5565b60405160208183030381529060405290505b919050565b600d6020528060005260406000206000915054906101000a900460ff1681565b61138881565b6000611e0c82612212565b611e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4290613e2d565b60405180910390fd5b611e53612225565b600f8360ff1681548110611e6a57611e69614471565b5b9060005260206000200154611e7f919061417a565b9050919050565b6060600a600b604051602001611e9d929190613bf6565b604051602081830303815290604052905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f4d612376565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb490613d4d565b60405180910390fd5b611fc681612465565b50565b600081611fd4612030565b11158015611fe3575060015482105b8015612021575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080612044612030565b116120cc576001548110156120cb5760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156120c9575b60008114156120bf576005600083600190039350838152602001908152602001600020549050612094565b80925050506120fe565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600790508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612186868684612a1e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6121d06115b6565b15612210576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220790613dad565b60405180910390fd5b565b6000600360ff168260ff16109050919050565b600061222f612030565b60015403905090565b6000828260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661229191906141ae565b60ff1610156122d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122cc90613eed565b60405180910390fd5b818160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900460ff1661232f91906141ae565b92506101000a81548160ff021916908360ff160217905550612354338360ff16612358565b5050565b612372828260405180602001604052806000815250612a27565b5050565b61237e612ac5565b73ffffffffffffffffffffffffffffffffffffffff1661239c611821565b73ffffffffffffffffffffffffffffffffffffffff16146123f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e990613e0d565b60405180910390fd5b565b6123fc612acd565b6000600960006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612440612ac5565b60405161244d9190613c69565b60405180910390a1565b612462816000612b16565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125316121c8565b6001600960006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612575612ac5565b6040516125829190613c69565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f390613ecd565b60405180910390fd5b61260582612212565b612644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263b90613e2d565b60405180910390fd5b600060ff168260ff1614156126b05780600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550612758565b600160ff168260ff16141561271c5780600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550612757565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274e90613e2d565b60405180910390fd5b5b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612783612028565b8786866040518563ffffffff1660e01b81526004016127a59493929190613c84565b602060405180830381600087803b1580156127bf57600080fd5b505af19250505080156127f057506040513d601f19601f820116820180604052508101906127ed9190613677565b60015b61286a573d8060008114612820576040519150601f19603f3d011682016040523d82523d6000602084013e612825565b606091505b50600081511415612862576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612905576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a19565b600082905060005b6000821461293757808061292090614340565b915050600a8261293091906140ef565b915061290d565b60008167ffffffffffffffff811115612953576129526144a0565b5b6040519080825280601f01601f1916602001820160405280156129855781602001600182028036833780820191505090505b5090505b60008514612a125760018261299e919061417a565b9150600a856129ad91906143b3565b60306129b99190614099565b60f81b8183815181106129cf576129ce614471565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a0b91906140ef565b9450612989565b8093505050505b919050565b60009392505050565b612a318383612d6a565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ac05760006001549050600083820390505b612a72600086838060010194508661275d565b612aa8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612a5f578160015414612abd57600080fd5b50505b505050565b600033905090565b612ad56115b6565b612b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0b90613d0d565b60405180910390fd5b565b6000612b2183612035565b90506000819050600080612b3486612103565b915091508415612b9d57612b508184612b4b612028565b612125565b612b9c57612b6583612b60612028565b611eb1565b612b9b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b612bab836000886001612169565b8015612bb657600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612c5e83612c1b8560008861216f565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612197565b600560008881526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000085161415612ce6576000600187019050600060056000838152602001908152602001600020541415612ce4576001548114612ce3578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d508360008860016121c2565b600260008154809291906001019190505550505050505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612dd8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612e13576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e206000848385612169565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612e9783612e88600086600061216f565b612e9185612f3f565b17612197565b60056000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612ebb57806001819055505050612f3a60008483856121c2565b505050565b60006001821460e11b9050919050565b828054612f5b906142dd565b90600052602060002090601f016020900481019282612f7d5760008555612fc4565b82601f10612f9657803560ff1916838001178555612fc4565b82800160010185558215612fc4579182015b82811115612fc3578235825591602001919060010190612fa8565b5b509050612fd19190612fd5565b5090565b5b80821115612fee576000816000905550600101612fd6565b5090565b600061300561300084613fad565b613f88565b90508083825260208201905082856020860282011115613028576130276144d9565b5b60005b85811015613058578161303e88826132f4565b84526020840193506020830192505060018101905061302b565b5050509392505050565b600061307561307084613fd9565b613f88565b90508083825260208201905082856020860282011115613098576130976144d9565b5b60005b858110156130c857816130ae8882613309565b84526020840193506020830192505060018101905061309b565b5050509392505050565b60006130e56130e084614005565b613f88565b905082815260208101848484011115613101576131006144de565b5b61310c848285614271565b509392505050565b600081359050613123816148a1565b92915050565b60008083601f84011261313f5761313e6144d4565b5b8235905067ffffffffffffffff81111561315c5761315b6144cf565b5b602083019150836020820283011115613178576131776144d9565b5b9250929050565b600082601f830112613194576131936144d4565b5b81356131a4848260208601612ff2565b91505092915050565b600082601f8301126131c2576131c16144d4565b5b81356131d2848260208601613062565b91505092915050565b60008083601f8401126131f1576131f06144d4565b5b8235905067ffffffffffffffff81111561320e5761320d6144cf565b5b60208301915083602082028301111561322a576132296144d9565b5b9250929050565b600081359050613240816148b8565b92915050565b600081359050613255816148cf565b92915050565b60008151905061326a816148cf565b92915050565b600082601f830112613285576132846144d4565b5b81356132958482602086016130d2565b91505092915050565b60008083601f8401126132b4576132b36144d4565b5b8235905067ffffffffffffffff8111156132d1576132d06144cf565b5b6020830191508360018202830111156132ed576132ec6144d9565b5b9250929050565b600081359050613303816148e6565b92915050565b600081359050613318816148fd565b92915050565b60008135905061332d81614914565b92915050565b600060208284031215613349576133486144e8565b5b600061335784828501613114565b91505092915050565b60008060408385031215613377576133766144e8565b5b600061338585828601613114565b925050602061339685828601613114565b9150509250929050565b6000806000606084860312156133b9576133b86144e8565b5b60006133c786828701613114565b93505060206133d886828701613114565b92505060406133e986828701613309565b9150509250925092565b6000806000806080858703121561340d5761340c6144e8565b5b600061341b87828801613114565b945050602061342c87828801613114565b935050604061343d87828801613309565b925050606085013567ffffffffffffffff81111561345e5761345d6144e3565b5b61346a87828801613270565b91505092959194509250565b6000806040838503121561348d5761348c6144e8565b5b600061349b85828601613114565b92505060206134ac85828601613231565b9150509250929050565b600080604083850312156134cd576134cc6144e8565b5b60006134db85828601613114565b92505060206134ec85828601613309565b9150509250929050565b600080600080600060608688031215613512576135116144e8565b5b600086013567ffffffffffffffff8111156135305761352f6144e3565b5b61353c88828901613129565b9550955050602061354f8882890161331e565b935050604086013567ffffffffffffffff8111156135705761356f6144e3565b5b61357c888289016131db565b92509250509295509295909350565b6000602082840312156135a1576135a06144e8565b5b600082013567ffffffffffffffff8111156135bf576135be6144e3565b5b6135cb8482850161317f565b91505092915050565b6000602082840312156135ea576135e96144e8565b5b600082013567ffffffffffffffff811115613608576136076144e3565b5b613614848285016131ad565b91505092915050565b600060208284031215613633576136326144e8565b5b600061364184828501613231565b91505092915050565b6000602082840312156136605761365f6144e8565b5b600061366e84828501613246565b91505092915050565b60006020828403121561368d5761368c6144e8565b5b600061369b8482850161325b565b91505092915050565b600080600080604085870312156136be576136bd6144e8565b5b600085013567ffffffffffffffff8111156136dc576136db6144e3565b5b6136e88782880161329e565b9450945050602085013567ffffffffffffffff81111561370b5761370a6144e3565b5b6137178782880161329e565b925092505092959194509250565b60006020828403121561373b5761373a6144e8565b5b600061374984828501613309565b91505092915050565b600060208284031215613768576137676144e8565b5b60006137768482850161331e565b91505092915050565b60008060408385031215613796576137956144e8565b5b60006137a48582860161331e565b92505060206137b58582860161331e565b9150509250929050565b6137c8816141e2565b82525050565b6137d7816141f4565b82525050565b60006137e88261404b565b6137f28185614061565b9350613802818560208601614280565b61380b816144ed565b840191505092915050565b600061382182614056565b61382b818561407d565b935061383b818560208601614280565b613844816144ed565b840191505092915050565b600061385a82614056565b613864818561408e565b9350613874818560208601614280565b80840191505092915050565b6000815461388d816142dd565b613897818661408e565b945060018216600081146138b257600181146138c3576138f6565b60ff198316865281860193506138f6565b6138cc85614036565b60005b838110156138ee578154818901526001820191506020810190506138cf565b838801955050505b50505092915050565b600061390c60148361407d565b9150613917826144fe565b602082019050919050565b600061392f60138361407d565b915061393a82614527565b602082019050919050565b600061395260268361407d565b915061395d82614550565b604082019050919050565b600061397560158361407d565b91506139808261459f565b602082019050919050565b6000613998601a8361407d565b91506139a3826145c8565b602082019050919050565b60006139bb60108361407d565b91506139c6826145f1565b602082019050919050565b60006139de60088361408e565b91506139e98261461a565b600882019050919050565b6000613a01602b8361407d565b9150613a0c82614643565b604082019050919050565b6000613a24602a8361407d565b9150613a2f82614692565b604082019050919050565b6000613a4760208361407d565b9150613a52826146e1565b602082019050919050565b6000613a6a60138361407d565b9150613a758261470a565b602082019050919050565b6000613a8d60238361407d565b9150613a9882614733565b604082019050919050565b6000613ab060108361407d565b9150613abb82614782565b602082019050919050565b6000613ad3602f8361407d565b9150613ade826147ab565b604082019050919050565b6000613af660158361407d565b9150613b01826147fa565b602082019050919050565b6000613b1960128361407d565b9150613b2482614823565b602082019050919050565b6000613b3c60198361407d565b9150613b478261484c565b602082019050919050565b6000613b5f600083614072565b9150613b6a82614875565b600082019050919050565b6000613b8260098361408e565b9150613b8d82614878565b600982019050919050565b613ba18161422c565b82525050565b613bb08161425a565b82525050565b613bbf81614264565b82525050565b6000613bd18286613880565b9150613bdd828561384f565b9150613be98284613880565b9150819050949350505050565b6000613c028285613880565b9150613c0d826139d1565b9150613c198284613880565b91508190509392505050565b6000613c318285613880565b9150613c3c82613b75565b9150613c488284613880565b91508190509392505050565b6000613c5f82613b52565b9150819050919050565b6000602082019050613c7e60008301846137bf565b92915050565b6000608082019050613c9960008301876137bf565b613ca660208301866137bf565b613cb36040830185613ba7565b8181036060830152613cc581846137dd565b905095945050505050565b6000602082019050613ce560008301846137ce565b92915050565b60006020820190508181036000830152613d058184613816565b905092915050565b60006020820190508181036000830152613d26816138ff565b9050919050565b60006020820190508181036000830152613d4681613922565b9050919050565b60006020820190508181036000830152613d6681613945565b9050919050565b60006020820190508181036000830152613d8681613968565b9050919050565b60006020820190508181036000830152613da68161398b565b9050919050565b60006020820190508181036000830152613dc6816139ae565b9050919050565b60006020820190508181036000830152613de6816139f4565b9050919050565b60006020820190508181036000830152613e0681613a17565b9050919050565b60006020820190508181036000830152613e2681613a3a565b9050919050565b60006020820190508181036000830152613e4681613a5d565b9050919050565b60006020820190508181036000830152613e6681613a80565b9050919050565b60006020820190508181036000830152613e8681613aa3565b9050919050565b60006020820190508181036000830152613ea681613ac6565b9050919050565b60006020820190508181036000830152613ec681613ae9565b9050919050565b60006020820190508181036000830152613ee681613b0c565b9050919050565b60006020820190508181036000830152613f0681613b2f565b9050919050565b6000602082019050613f226000830184613ba7565b92915050565b6000602082019050613f3d6000830184613bb6565b92915050565b6000608082019050613f586000830187613bb6565b613f656020830186613b98565b613f726040830185613ba7565b613f7f6060830184613ba7565b95945050505050565b6000613f92613fa3565b9050613f9e828261430f565b919050565b6000604051905090565b600067ffffffffffffffff821115613fc857613fc76144a0565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613ff457613ff36144a0565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156140205761401f6144a0565b5b614029826144ed565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006140a48261425a565b91506140af8361425a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140e4576140e36143e4565b5b828201905092915050565b60006140fa8261425a565b91506141058361425a565b92508261411557614114614413565b5b828204905092915050565b600061412b8261425a565b91506141368361425a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561416f5761416e6143e4565b5b828202905092915050565b60006141858261425a565b91506141908361425a565b9250828210156141a3576141a26143e4565b5b828203905092915050565b60006141b982614264565b91506141c483614264565b9250828210156141d7576141d66143e4565b5b828203905092915050565b60006141ed8261423a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561429e578082015181840152602081019050614283565b838111156142ad576000848401525b50505050565b60006142be82614264565b915060008214156142d2576142d16143e4565b5b600182039050919050565b600060028204905060018216806142f557607f821691505b6020821081141561430957614308614442565b5b50919050565b614318826144ed565b810181811067ffffffffffffffff82111715614337576143366144a0565b5b80604052505050565b600061434b8261425a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561437e5761437d6143e4565b5b600182019050919050565b600061439482614264565b915060ff8214156143a8576143a76143e4565b5b600182019050919050565b60006143be8261425a565b91506143c98361425a565b9250826143d9576143d8614413565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f496e76616c6964204554482062616c616e636500000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4574686572207472616e73666572206661696c65640000000000000000000000600082015250565b7f4d696e74696e67206861736e2774207374617274656420796574000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f636f6e7472616374000000000000000000000000000000000000000000000000600082015250565b7f537465707320746861742068617665206e6f742073746172746564206f72206160008201527f72652066696e6973686564000000000000000000000000000000000000000000602082015250565b7f496e76616c696420617267756d656e74203a20646966666572656e742061726760008201527f756d656e742073697a6500000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f74206578697374206d696e74207374657000000000000000000000000000600082015250565b7f496e76616c696420617267756d656e74203a20657863656564206d617853757060008201527f706c790000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420617267756d656e7400000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f536f6c64206f757420696e207468697320737465700000000000000000000000600082015250565b7f616464726573732063616e277420626520300000000000000000000000000000600082015250565b7f446f6e27742068617665206d696e7420617574686f7269747900000000000000600082015250565b50565b7f70726572657665616c0000000000000000000000000000000000000000000000600082015250565b6148aa816141e2565b81146148b557600080fd5b50565b6148c1816141f4565b81146148cc57600080fd5b50565b6148d881614200565b81146148e357600080fd5b50565b6148ef8161422c565b81146148fa57600080fd5b50565b6149068161425a565b811461491157600080fd5b50565b61491d81614264565b811461492857600080fd5b5056fea264697066735822122001d550af6dfd5bab78591d8b6d5790704e0f8f910ab78bf59d31864725d09c6c64736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000002bc00000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000008fc000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000d529ae9e8600000000000000000000000000000000000000000000000000000106e69ba161000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000062d15dc80000000000000000000000000000000000000000000000000000000062d16bd80000000000000000000000000000000000000000000000000000000062d179e8000000000000000000000000000000000000000000000000000000000000002168747470733a2f2f61737365742e6d696231396d65746173706163652e636f6d2f00000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _amounts (uint16[]): 700,2000,2300
Arg [1] : _prices (uint256[]): 50000000000000000,60000000000000000,74000000000000000
Arg [2] : _mintStartTimes (uint256[]): 1657888200,1657891800,1657895400
Arg [3] : _metadataUri (string): https://asset.mib19metaspace.com/

-----Encoded View---------------
19 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 00000000000000000000000000000000000000000000000000000000000002bc
Arg [6] : 00000000000000000000000000000000000000000000000000000000000007d0
Arg [7] : 00000000000000000000000000000000000000000000000000000000000008fc
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [9] : 00000000000000000000000000000000000000000000000000b1a2bc2ec50000
Arg [10] : 00000000000000000000000000000000000000000000000000d529ae9e860000
Arg [11] : 0000000000000000000000000000000000000000000000000106e69ba1610000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [13] : 0000000000000000000000000000000000000000000000000000000062d15dc8
Arg [14] : 0000000000000000000000000000000000000000000000000000000062d16bd8
Arg [15] : 0000000000000000000000000000000000000000000000000000000062d179e8
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000021
Arg [17] : 68747470733a2f2f61737365742e6d696231396d65746173706163652e636f6d
Arg [18] : 2f00000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

53695:7353:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17105:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22824:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24778:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24318:394;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54349:30;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;16135:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56783:322;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34091:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55935:840;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57113:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59332:576;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58020:208;;;;;;;;;;;;;:::i;:::-;;58307:67;;;;;;;;;;;;;:::i;:::-;;25676:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57929:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60746:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60948:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49947:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22605:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17784:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52812:103;;;;;;;;;;;;;:::i;:::-;;59916:381;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58236:63;;;;;;;;;;;;;:::i;:::-;;52164:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22993:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54236:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58906:418;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25062:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25932:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60305:433;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55366:403;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54291:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54187:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57318:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55777:150;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25441:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53070:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17105:615;17190:4;17505:10;17490:25;;:11;:25;;;;:102;;;;17582:10;17567:25;;:11;:25;;;;17490:102;:179;;;;17659:10;17644:25;;:11;:25;;;;17490:179;17470:199;;17105:615;;;:::o;22824:100::-;22878:13;22911:5;22904:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22824:100;:::o;24778:212::-;24854:7;24879:16;24887:7;24879;:16::i;:::-;24874:64;;24904:34;;;;;;;;;;;;;;24874:64;24958:15;:24;24974:7;24958:24;;;;;;;;;;;;;;;;;;;;;24951:31;;24778:212;;;:::o;24318:394::-;24399:13;24415:16;24423:7;24415;:16::i;:::-;24399:32;;24471:5;24448:28;;:19;:17;:19::i;:::-;:28;;;24444:175;;24496:44;24513:5;24520:19;:17;:19::i;:::-;24496:16;:44::i;:::-;24491:128;;24568:35;;;;;;;;;;;;;;24491:128;24444:175;24658:2;24631:15;:24;24647:7;24631:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;24696:7;24692:2;24676:28;;24685:5;24676:28;;;;;;;;;;;;24388:324;24318:394;;:::o;54349:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16135:323::-;16196:7;16424:15;:13;:15::i;:::-;16409:12;;16393:13;;:28;:46;16386:53;;16135:323;:::o;56783:322::-;56830:5;56848:11;56896:1;54098;56883:14;;;;:::i;:::-;56875:22;;56870:181;56908:1;56899:5;:10;;;56870:181;;56958:12;56971:5;56958:19;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:33;;;56939:15;:52;56935:105;;57019:5;57012:12;;;;;56935:105;56911:7;;;;;:::i;:::-;;;;56870:181;;;57061:36;;;;;;;;;;:::i;:::-;;;;;;;;56783:322;;:::o;34091:2800::-;34225:27;34255;34274:7;34255:18;:27::i;:::-;34225:57;;34340:4;34299:45;;34315:19;34299:45;;;34295:86;;34353:28;;;;;;;;;;;;;;34295:86;34395:27;34424:23;34451:28;34471:7;34451:19;:28::i;:::-;34394:85;;;;34579:62;34598:15;34615:4;34621:19;:17;:19::i;:::-;34579:18;:62::i;:::-;34574:174;;34661:43;34678:4;34684:19;:17;:19::i;:::-;34661:16;:43::i;:::-;34656:92;;34713:35;;;;;;;;;;;;;;34656:92;34574:174;34779:1;34765:16;;:2;:16;;;34761:52;;;34790:23;;;;;;;;;;;;;;34761:52;34826:43;34848:4;34854:2;34858:7;34867:1;34826:21;:43::i;:::-;34962:15;34959:160;;;35102:1;35081:19;35074:30;34959:160;35497:18;:24;35516:4;35497:24;;;;;;;;;;;;;;;;35495:26;;;;;;;;;;;;35566:18;:22;35585:2;35566:22;;;;;;;;;;;;;;;;35564:24;;;;;;;;;;;35888:145;35925:2;35973:45;35988:4;35994:2;35998:19;35973:14;:45::i;:::-;13355:8;35946:72;35888:18;:145::i;:::-;35859:17;:26;35877:7;35859:26;;;;;;;;;;;:174;;;;36203:1;13355:8;36153:19;:46;:51;36149:626;;;36225:19;36257:1;36247:7;:11;36225:33;;36414:1;36380:17;:30;36398:11;36380:30;;;;;;;;;;;;:35;36376:384;;;36518:13;;36503:11;:28;36499:242;;36698:19;36665:17;:30;36683:11;36665:30;;;;;;;;;;;:52;;;;36499:242;36376:384;36206:569;36149:626;36822:7;36818:2;36803:27;;36812:4;36803:27;;;;;;;;;;;;36841:42;36862:4;36868:2;36872:7;36881:1;36841:20;:42::i;:::-;34214:2677;;;34091:2800;;;:::o;55935:840::-;49552:19;:17;:19::i;:::-;56025:25:::1;56045:4;56025:19;:25::i;:::-;56017:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;56087:15;56105:16;:14;:16::i;:::-;56087:34;;56149:4;56136:17;;:9;:17;;;56132:103;;56170:53;;;;;;;;;;:::i;:::-;;;;;;;;56132:103;56247:14;56291:6;56264:33;;:12;56277:4;56264:18;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:24;;;:33;;;;:::i;:::-;56247:50;;56329:6;56316:9;:19;56308:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;56407:21;56429:4;56407:27;;;;;;;;;;:::i;:::-;;;;;;;;;;56397:6;56380:23;;:14;:12;:14::i;:::-;:23;;;;:::i;:::-;:54;;56372:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;53960:1;56475:22;;:4;:22;;;56471:287;;;56514:41;56531:6;56539:15;56514:16;:41::i;:::-;56471:287;;;54009:1;56577:23;;:4;:23;;;56573:185;;;56617:42;56634:6;56642:16;56617;:42::i;:::-;56573:185;;;54054:1;56681:19;;:4;:19;;;56677:81;;;56717:29;56727:10;56739:6;56717:29;;:9;:29::i;:::-;56677:81;56573:185;56471:287;56006:769;;55935:840:::0;;:::o;57113:197::-;57165:4;57190:25;57210:4;57190:19;:25::i;:::-;57182:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;57275:21;57297:4;57275:27;;;;;;;;;;:::i;:::-;;;;;;;;;;57257:14;:12;:14::i;:::-;:45;57250:52;;57113:197;;;:::o;59332:576::-;52050:13;:11;:13::i;:::-;54098:1:::1;59419:29;;:8;:15;:29;59411:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;59485:7;59480:310;54098:1;59498:14;;:1;:14;;;59480:310;;;59559:8;59568:1;59559:11;;;;;;;;;;:::i;:::-;;;;;;;;59534:12;59547:1;59534:15;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:22;;;:36;;;;;;;;;;;;;;;;;;59593:1;59589;:5;;;59585:194;;;59673:8;59682:1;59673:11;;;;;;;;;;:::i;:::-;;;;;;;;59642:42;;:21;59668:1;59664;:5;;;;:::i;:::-;59642:28;;;;;;;;;;:::i;:::-;;;;;;;;;;:42;;;;:::i;:::-;59615:21;59637:1;59615:24;;;;;;;;;;:::i;:::-;;;;;;;;;:69;;;;59585:194;;;59752:8;59761:1;59752:11;;;;;;;;;;:::i;:::-;;;;;;;;59725:38;;:21;59747:1;59725:24;;;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;59585:194;59514:3;;;;;:::i;:::-;;;;59480:310;;;;59823:21;59858:1;54098;59845:14;;;;:::i;:::-;59823:37;;;;;;;;;;:::i;:::-;;;;;;;;;;54223:4;59810:50;;59802:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;59332:576:::0;:::o;58020:208::-;52050:13;:11;:13::i;:::-;58071:12:::1;58089:10;:15;;58112:21;58089:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58070:68;;;58154:7;58149:72;;58178:31;;;;;;;;;;:::i;:::-;;;;;;;;58149:72;58059:169;58020:208::o:0;58307:67::-;52050:13;:11;:13::i;:::-;58356:10:::1;:8;:10::i;:::-;58307:67::o:0;25676:185::-;25814:39;25831:4;25837:2;25841:7;25814:39;;;;;;;;;;;;:16;:39::i;:::-;25676:185;;;:::o;57929:83::-;52050:13;:11;:13::i;:::-;57990:14:::1;57996:7;57990:5;:14::i;:::-;57929:83:::0;:::o;60746:194::-;52050:13;:11;:13::i;:::-;60877:12:::1;;60863:11;:26;;;;;;;:::i;:::-;;60917:15;;60900:14;:32;;;;;;;:::i;:::-;;60746:194:::0;;;;:::o;60948:97::-;52050:13;:11;:13::i;:::-;61028:9:::1;61015:10;;:22;;;;;;;;;;;;;;;;;;60948:97:::0;:::o;49947:86::-;49994:4;50018:7;;;;;;;;;;;50011:14;;49947:86;:::o;22605:152::-;22677:7;22720:27;22739:7;22720:18;:27::i;:::-;22697:52;;22605:152;;;:::o;17784:232::-;17856:7;17897:1;17880:19;;:5;:19;;;17876:60;;;17908:28;;;;;;;;;;;;;;17876:60;12307:13;17954:18;:25;17973:5;17954:25;;;;;;;;;;;;;;;;:54;17947:61;;17784:232;;;:::o;52812:103::-;52050:13;:11;:13::i;:::-;52877:30:::1;52904:1;52877:18;:30::i;:::-;52812:103::o:0;59916:381::-;52050:13;:11;:13::i;:::-;54098:1:::1;60002:28;;:7;:14;:28;59994:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;60067:7;60062:228;54098:1;60080:14;;:1;:14;;;60062:228;;;60124:1;60120;:5;;;60116:114;;;60183:7;60191:1;60183:10;;;;;;;;;;:::i;:::-;;;;;;;;60154:12;60171:1;60167;:5;;;;:::i;:::-;60154:19;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:25;;;:39;;60146:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60116:114;60268:7;60276:1;60268:10;;;;;;;;;;:::i;:::-;;;;;;;;60244:12;60257:1;60244:15;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:21;;:34;;;;60096:3;;;;;:::i;:::-;;;;60062:228;;;;59916:381:::0;:::o;58236:63::-;52050:13;:11;:13::i;:::-;58283:8:::1;:6;:8::i;:::-;58236:63::o:0;52164:87::-;52210:7;52237:6;;;;;;;;;;;52230:13;;52164:87;:::o;22993:104::-;23049:13;23082:7;23075:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22993:104;:::o;54236:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;58906:418::-;52050:13;:11;:13::i;:::-;59106:11:::1;;:18;;59083:12;;:19;;:41;59075:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;59189:9;59184:133;59208:12;;:19;;59204:1;:23;59184:133;;;59249:56;59267:12;;59280:1;59267:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;59284:4;59290:11;;59302:1;59290:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;59249:17;:56::i;:::-;59229:3;;;;;:::i;:::-;;;;59184:133;;;;58906:418:::0;;;;;:::o;25062:308::-;25173:19;:17;:19::i;:::-;25161:31;;:8;:31;;;25157:61;;;25201:17;;;;;;;;;;;;;;25157:61;25283:8;25231:18;:39;25250:19;:17;:19::i;:::-;25231:39;;;;;;;;;;;;;;;:49;25271:8;25231:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;25343:8;25307:55;;25322:19;:17;:19::i;:::-;25307:55;;;25353:8;25307:55;;;;;;:::i;:::-;;;;;;;;25062:308;;:::o;25932:399::-;26099:31;26112:4;26118:2;26122:7;26099:12;:31::i;:::-;26163:1;26145:2;:14;;;:19;26141:183;;26184:56;26215:4;26221:2;26225:7;26234:5;26184:30;:56::i;:::-;26179:145;;26268:40;;;;;;;;;;;;;;26179:145;26141:183;25932:399;;;;:::o;60305:433::-;52050:13;:11;:13::i;:::-;54098:1:::1;60403:36;;:15;:22;:36;60395:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;60476:7;60471:260;54098:1;60489:14;;:1;:14;;;60471:260;;;60533:1;60529;:5;;;60525:130;;;60600:15;60616:1;60600:18;;;;;;;;;;:::i;:::-;;;;;;;;60563:12;60580:1;60576;:5;;;;:::i;:::-;60563:19;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:33;;;:55;;60555:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;60525:130;60701:15;60717:1;60701:18;;;;;;;;;;:::i;:::-;;;;;;;;60669:12;60682:1;60669:15;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:29;;:50;;;;60505:3;;;;;:::i;:::-;;;;60471:260;;;;60305:433:::0;:::o;55366:403::-;55432:13;55466:17;55474:8;55466:7;:17::i;:::-;55458:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;55551:10;;;;;;;;;;;55546:117;;55609:11;55635:14;55592:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55578:73;;;;55546:117;55704:11;55717:26;55734:8;55717:16;:26::i;:::-;55745:14;55687:73;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55673:88;;55366:403;;;;:::o;54291:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;54187:40::-;54223:4;54187:40;:::o;57318:207::-;57378:7;57406:25;57426:4;57406:19;:25::i;:::-;57398:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;57503:14;:12;:14::i;:::-;57473:21;57495:4;57473:27;;;;;;;;;;:::i;:::-;;;;;;;;;;:44;;;;:::i;:::-;57466:51;;57318:207;;;:::o;55777:150::-;55821:13;55878:11;55903:14;55861:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55847:72;;55777:150;:::o;25441:164::-;25538:4;25562:18;:25;25581:5;25562:25;;;;;;;;;;;;;;;:35;25588:8;25562:35;;;;;;;;;;;;;;;;;;;;;;;;;25555:42;;25441:164;;;;:::o;53070:201::-;52050:13;:11;:13::i;:::-;53179:1:::1;53159:22;;:8;:22;;;;53151:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53235:28;53254:8;53235:18;:28::i;:::-;53070:201:::0;:::o;26586:281::-;26651:4;26707:7;26688:15;:13;:15::i;:::-;:26;;:66;;;;;26741:13;;26731:7;:23;26688:66;:152;;;;;26839:1;13077:8;26792:17;:26;26810:7;26792:26;;;;;;;;;;;;:43;:48;26688:152;26668:172;;26586:281;;;:::o;45195:105::-;45255:7;45282:10;45275:17;;45195:105;:::o;15651:92::-;15707:7;15651:92;:::o;19498:1129::-;19565:7;19585:12;19600:7;19585:22;;19668:4;19649:15;:13;:15::i;:::-;:23;19645:915;;19702:13;;19695:4;:20;19691:869;;;19740:14;19757:17;:23;19775:4;19757:23;;;;;;;;;;;;19740:40;;19873:1;13077:8;19846:6;:23;:28;19842:699;;;20365:113;20382:1;20372:6;:11;20365:113;;;20425:17;:25;20443:6;;;;;;;20425:25;;;;;;;;;;;;20416:34;;20365:113;;;20511:6;20504:13;;;;;;19842:699;19717:843;19691:869;19645:915;20588:31;;;;;;;;;;;;;;19498:1129;;;;:::o;32427:652::-;32522:27;32551:23;32592:53;32648:15;32592:71;;32834:7;32828:4;32821:21;32869:22;32863:4;32856:36;32945:4;32939;32929:21;32906:44;;33041:19;33035:26;33016:45;;32772:300;32427:652;;;:::o;33192:645::-;33334:11;33496:15;33490:4;33486:26;33478:34;;33655:15;33644:9;33640:31;33627:44;;33802:15;33791:9;33788:30;33781:4;33770:9;33767:19;33764:55;33754:65;;33192:645;;;;;:::o;44028:159::-;;;;;:::o;42340:309::-;42475:7;42495:16;13478:3;42521:19;:40;;42495:67;;13478:3;42588:31;42599:4;42605:2;42609:9;42588:10;:31::i;:::-;42580:40;;:61;;42573:68;;;42340:309;;;;;:::o;22096:447::-;22176:14;22344:15;22337:5;22333:27;22324:36;;22518:5;22504:11;22480:22;22476:40;22473:51;22466:5;22463:62;22453:72;;22096:447;;;;:::o;44846:158::-;;;;;:::o;50106:108::-;50177:8;:6;:8::i;:::-;50176:9;50168:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;50106:108::o;57808:113::-;57872:4;54098:1;57896:17;;:4;:17;;;57889:24;;57808:113;;;:::o;16556:293::-;16611:7;16815:15;:13;:15::i;:::-;16799:13;;:31;16792:38;;16556:293;:::o;57533:267::-;57679:1;57669:6;57645:9;:21;57655:10;57645:21;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;;:::i;:::-;:35;;;;57637:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;57746:6;57721:9;:21;57731:10;57721:21;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;57763:29;57773:10;57785:6;57763:29;;:9;:29::i;:::-;57533:267;;:::o;26951:112::-;27028:27;27038:2;27042:8;27028:27;;;;;;;;;;;;:9;:27::i;:::-;26951:112;;:::o;52329:132::-;52404:12;:10;:12::i;:::-;52393:23;;:7;:5;:7::i;:::-;:23;;;52385:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52329:132::o;50802:120::-;49811:16;:14;:16::i;:::-;50871:5:::1;50861:7;;:15;;;;;;;;;;;;;;;;;;50892:22;50901:12;:10;:12::i;:::-;50892:22;;;;;;:::i;:::-;;;;;;;;50802:120::o:0;36969:89::-;37029:21;37035:7;37044:5;37029;:21::i;:::-;36969:89;:::o;53431:191::-;53505:16;53524:6;;;;;;;;;;;53505:25;;53550:8;53541:6;;:17;;;;;;;;;;;;;;;;;;53605:8;53574:40;;53595:8;53574:40;;;;;;;;;;;;53494:128;53431:191;:::o;50543:118::-;49552:19;:17;:19::i;:::-;50613:4:::1;50603:7;;:14;;;;;;;;;;;;;;;;;;50633:20;50640:12;:10;:12::i;:::-;50633:20;;;;;;:::i;:::-;;;;;;;;50543:118::o:0;58382:516::-;58535:1;58515:22;;:8;:22;;;;58507:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;58579:25;58599:4;58579:19;:25::i;:::-;58571:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;53960:1;58645:22;;:4;:22;;;58641:250;;;58712:7;58684:15;:25;58700:8;58684:25;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;58641:250;;;54009:1;58741:23;;:4;:23;;;58737:154;;;58810:7;58781:16;:26;58798:8;58781:26;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;58737:154;;;58850:29;;;;;;;;;;:::i;:::-;;;;;;;;58737:154;58641:250;58382:516;;;:::o;40842:716::-;41005:4;41051:2;41026:45;;;41072:19;:17;:19::i;:::-;41093:4;41099:7;41108:5;41026:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41022:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41326:1;41309:6;:13;:18;41305:235;;;41355:40;;;;;;;;;;;;;;41305:235;41498:6;41492:13;41483:6;41479:2;41475:15;41468:38;41022:529;41195:54;;;41185:64;;;:6;:64;;;;41178:71;;;40842:716;;;;;;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;43225:147::-;43362:6;43225:147;;;;;:::o;27479:689::-;27610:19;27616:2;27620:8;27610:5;:19::i;:::-;27689:1;27671:2;:14;;;:19;27667:483;;27711:11;27725:13;;27711:27;;27757:13;27779:8;27773:3;:14;27757:30;;27806:233;27837:62;27876:1;27880:2;27884:7;;;;;;27893:5;27837:30;:62::i;:::-;27832:167;;27935:40;;;;;;;;;;;;;;27832:167;28034:3;28026:5;:11;27806:233;;28121:3;28104:13;;:20;28100:34;;28126:8;;;28100:34;27692:458;;27667:483;27479:689;;;:::o;48060:98::-;48113:7;48140:10;48133:17;;48060:98;:::o;50291:108::-;50358:8;:6;:8::i;:::-;50350:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;50291:108::o;37287:3063::-;37367:27;37397;37416:7;37397:18;:27::i;:::-;37367:57;;37437:12;37468:19;37437:52;;37503:27;37532:23;37559:28;37579:7;37559:19;:28::i;:::-;37502:85;;;;37604:13;37600:310;;;37725:62;37744:15;37761:4;37767:19;:17;:19::i;:::-;37725:18;:62::i;:::-;37720:178;;37811:43;37828:4;37834:19;:17;:19::i;:::-;37811:16;:43::i;:::-;37806:92;;37863:35;;;;;;;;;;;;;;37806:92;37720:178;37600:310;37922:51;37944:4;37958:1;37962:7;37971:1;37922:21;:51::i;:::-;38066:15;38063:160;;;38206:1;38185:19;38178:30;38063:160;38882:1;12570:3;38853:1;:25;;38852:31;38824:18;:24;38843:4;38824:24;;;;;;;;;;;;;;;;:59;;;;;;;;;;;39150:174;39187:4;39256:53;39271:4;39285:1;39289:19;39256:14;:53::i;:::-;13355:8;13077;39211:41;39210:99;39150:18;:174::i;:::-;39121:17;:26;39139:7;39121:26;;;;;;;;;;;:203;;;;39494:1;13355:8;39444:19;:46;:51;39440:626;;;39516:19;39548:1;39538:7;:11;39516:33;;39705:1;39671:17;:30;39689:11;39671:30;;;;;;;;;;;;:35;39667:384;;;39809:13;;39794:11;:28;39790:242;;39989:19;39956:17;:30;39974:11;39956:30;;;;;;;;;;;:52;;;;39790:242;39667:384;39497:569;39440:626;40121:7;40117:1;40094:35;;40103:4;40094:35;;;;;;;;;;;;40140:50;40161:4;40175:1;40179:7;40188:1;40140:20;:50::i;:::-;40317:12;;:14;;;;;;;;;;;;;37356:2994;;;;37287:3063;;:::o;28441:1537::-;28514:20;28537:13;;28514:36;;28579:1;28565:16;;:2;:16;;;28561:48;;;28590:19;;;;;;;;;;;;;;28561:48;28636:1;28624:8;:13;28620:44;;;28646:18;;;;;;;;;;;;;;28620:44;28677:61;28707:1;28711:2;28715:12;28729:8;28677:21;:61::i;:::-;29220:1;12444:2;29191:1;:25;;29190:31;29178:8;:44;29152:18;:22;29171:2;29152:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;29499:139;29536:2;29590:33;29613:1;29617:2;29621:1;29590:14;:33::i;:::-;29557:30;29578:8;29557:20;:30::i;:::-;:66;29499:18;:139::i;:::-;29465:17;:31;29483:12;29465:31;;;;;;;;;;;:173;;;;29655:15;29673:12;29655:30;;29700:11;29729:8;29714:12;:23;29700:37;;29752:101;29804:9;;;;;;29800:2;29779:35;;29796:1;29779:35;;;;;;;;;;;;29848:3;29838:7;:13;29752:101;;29885:3;29869:13;:19;;;;28926:974;;29910:60;29939:1;29943:2;29947:12;29961:8;29910:20;:60::i;:::-;28503:1475;28441:1537;;:::o;23934:322::-;24004:14;24235:1;24225:8;24222:15;24197:23;24193:45;24183:55;;23934:322;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;23:719:1:-;118:5;143:80;159:63;215:6;159:63;:::i;:::-;143:80;:::i;:::-;134:89;;243:5;272:6;265:5;258:21;306:4;299:5;295:16;288:23;;332:6;382:3;374:4;366:6;362:17;357:3;353:27;350:36;347:143;;;401:79;;:::i;:::-;347:143;514:1;499:237;524:6;521:1;518:13;499:237;;;592:3;621:36;653:3;641:10;621:36;:::i;:::-;616:3;609:49;687:4;682:3;678:14;671:21;;721:4;716:3;712:14;705:21;;559:177;546:1;543;539:9;534:14;;499:237;;;503:14;124:618;;23:719;;;;;:::o;765:722::-;861:5;886:81;902:64;959:6;902:64;:::i;:::-;886:81;:::i;:::-;877:90;;987:5;1016:6;1009:5;1002:21;1050:4;1043:5;1039:16;1032:23;;1076:6;1126:3;1118:4;1110:6;1106:17;1101:3;1097:27;1094:36;1091:143;;;1145:79;;:::i;:::-;1091:143;1258:1;1243:238;1268:6;1265:1;1262:13;1243:238;;;1336:3;1365:37;1398:3;1386:10;1365:37;:::i;:::-;1360:3;1353:50;1432:4;1427:3;1423:14;1416:21;;1466:4;1461:3;1457:14;1450:21;;1303:178;1290:1;1287;1283:9;1278:14;;1243:238;;;1247:14;867:620;;765:722;;;;;:::o;1493:410::-;1570:5;1595:65;1611:48;1652:6;1611:48;:::i;:::-;1595:65;:::i;:::-;1586:74;;1683:6;1676:5;1669:21;1721:4;1714:5;1710:16;1759:3;1750:6;1745:3;1741:16;1738:25;1735:112;;;1766:79;;:::i;:::-;1735:112;1856:41;1890:6;1885:3;1880;1856:41;:::i;:::-;1576:327;1493:410;;;;;:::o;1909:139::-;1955:5;1993:6;1980:20;1971:29;;2009:33;2036:5;2009:33;:::i;:::-;1909:139;;;;:::o;2071:568::-;2144:8;2154:6;2204:3;2197:4;2189:6;2185:17;2181:27;2171:122;;2212:79;;:::i;:::-;2171:122;2325:6;2312:20;2302:30;;2355:18;2347:6;2344:30;2341:117;;;2377:79;;:::i;:::-;2341:117;2491:4;2483:6;2479:17;2467:29;;2545:3;2537:4;2529:6;2525:17;2515:8;2511:32;2508:41;2505:128;;;2552:79;;:::i;:::-;2505:128;2071:568;;;;;:::o;2661:368::-;2731:5;2780:3;2773:4;2765:6;2761:17;2757:27;2747:122;;2788:79;;:::i;:::-;2747:122;2905:6;2892:20;2930:93;3019:3;3011:6;3004:4;2996:6;2992:17;2930:93;:::i;:::-;2921:102;;2737:292;2661:368;;;;:::o;3052:370::-;3123:5;3172:3;3165:4;3157:6;3153:17;3149:27;3139:122;;3180:79;;:::i;:::-;3139:122;3297:6;3284:20;3322:94;3412:3;3404:6;3397:4;3389:6;3385:17;3322:94;:::i;:::-;3313:103;;3129:293;3052:370;;;;:::o;3443:566::-;3514:8;3524:6;3574:3;3567:4;3559:6;3555:17;3551:27;3541:122;;3582:79;;:::i;:::-;3541:122;3695:6;3682:20;3672:30;;3725:18;3717:6;3714:30;3711:117;;;3747:79;;:::i;:::-;3711:117;3861:4;3853:6;3849:17;3837:29;;3915:3;3907:4;3899:6;3895:17;3885:8;3881:32;3878:41;3875:128;;;3922:79;;:::i;:::-;3875:128;3443:566;;;;;:::o;4015:133::-;4058:5;4096:6;4083:20;4074:29;;4112:30;4136:5;4112:30;:::i;:::-;4015:133;;;;:::o;4154:137::-;4199:5;4237:6;4224:20;4215:29;;4253:32;4279:5;4253:32;:::i;:::-;4154:137;;;;:::o;4297:141::-;4353:5;4384:6;4378:13;4369:22;;4400:32;4426:5;4400:32;:::i;:::-;4297:141;;;;:::o;4457:338::-;4512:5;4561:3;4554:4;4546:6;4542:17;4538:27;4528:122;;4569:79;;:::i;:::-;4528:122;4686:6;4673:20;4711:78;4785:3;4777:6;4770:4;4762:6;4758:17;4711:78;:::i;:::-;4702:87;;4518:277;4457:338;;;;:::o;4815:553::-;4873:8;4883:6;4933:3;4926:4;4918:6;4914:17;4910:27;4900:122;;4941:79;;:::i;:::-;4900:122;5054:6;5041:20;5031:30;;5084:18;5076:6;5073:30;5070:117;;;5106:79;;:::i;:::-;5070:117;5220:4;5212:6;5208:17;5196:29;;5274:3;5266:4;5258:6;5254:17;5244:8;5240:32;5237:41;5234:128;;;5281:79;;:::i;:::-;5234:128;4815:553;;;;;:::o;5374:137::-;5419:5;5457:6;5444:20;5435:29;;5473:32;5499:5;5473:32;:::i;:::-;5374:137;;;;:::o;5517:139::-;5563:5;5601:6;5588:20;5579:29;;5617:33;5644:5;5617:33;:::i;:::-;5517:139;;;;:::o;5662:135::-;5706:5;5744:6;5731:20;5722:29;;5760:31;5785:5;5760:31;:::i;:::-;5662:135;;;;:::o;5803:329::-;5862:6;5911:2;5899:9;5890:7;5886:23;5882:32;5879:119;;;5917:79;;:::i;:::-;5879:119;6037:1;6062:53;6107:7;6098:6;6087:9;6083:22;6062:53;:::i;:::-;6052:63;;6008:117;5803:329;;;;:::o;6138:474::-;6206:6;6214;6263:2;6251:9;6242:7;6238:23;6234:32;6231:119;;;6269:79;;:::i;:::-;6231:119;6389:1;6414:53;6459:7;6450:6;6439:9;6435:22;6414:53;:::i;:::-;6404:63;;6360:117;6516:2;6542:53;6587:7;6578:6;6567:9;6563:22;6542:53;:::i;:::-;6532:63;;6487:118;6138:474;;;;;:::o;6618:619::-;6695:6;6703;6711;6760:2;6748:9;6739:7;6735:23;6731:32;6728:119;;;6766:79;;:::i;:::-;6728:119;6886:1;6911:53;6956:7;6947:6;6936:9;6932:22;6911:53;:::i;:::-;6901:63;;6857:117;7013:2;7039:53;7084:7;7075:6;7064:9;7060:22;7039:53;:::i;:::-;7029:63;;6984:118;7141:2;7167:53;7212:7;7203:6;7192:9;7188:22;7167:53;:::i;:::-;7157:63;;7112:118;6618:619;;;;;:::o;7243:943::-;7338:6;7346;7354;7362;7411:3;7399:9;7390:7;7386:23;7382:33;7379:120;;;7418:79;;:::i;:::-;7379:120;7538:1;7563:53;7608:7;7599:6;7588:9;7584:22;7563:53;:::i;:::-;7553:63;;7509:117;7665:2;7691:53;7736:7;7727:6;7716:9;7712:22;7691:53;:::i;:::-;7681:63;;7636:118;7793:2;7819:53;7864:7;7855:6;7844:9;7840:22;7819:53;:::i;:::-;7809:63;;7764:118;7949:2;7938:9;7934:18;7921:32;7980:18;7972:6;7969:30;7966:117;;;8002:79;;:::i;:::-;7966:117;8107:62;8161:7;8152:6;8141:9;8137:22;8107:62;:::i;:::-;8097:72;;7892:287;7243:943;;;;;;;:::o;8192:468::-;8257:6;8265;8314:2;8302:9;8293:7;8289:23;8285:32;8282:119;;;8320:79;;:::i;:::-;8282:119;8440:1;8465:53;8510:7;8501:6;8490:9;8486:22;8465:53;:::i;:::-;8455:63;;8411:117;8567:2;8593:50;8635:7;8626:6;8615:9;8611:22;8593:50;:::i;:::-;8583:60;;8538:115;8192:468;;;;;:::o;8666:474::-;8734:6;8742;8791:2;8779:9;8770:7;8766:23;8762:32;8759:119;;;8797:79;;:::i;:::-;8759:119;8917:1;8942:53;8987:7;8978:6;8967:9;8963:22;8942:53;:::i;:::-;8932:63;;8888:117;9044:2;9070:53;9115:7;9106:6;9095:9;9091:22;9070:53;:::i;:::-;9060:63;;9015:118;8666:474;;;;;:::o;9146:1071::-;9273:6;9281;9289;9297;9305;9354:2;9342:9;9333:7;9329:23;9325:32;9322:119;;;9360:79;;:::i;:::-;9322:119;9508:1;9497:9;9493:17;9480:31;9538:18;9530:6;9527:30;9524:117;;;9560:79;;:::i;:::-;9524:117;9673:80;9745:7;9736:6;9725:9;9721:22;9673:80;:::i;:::-;9655:98;;;;9451:312;9802:2;9828:51;9871:7;9862:6;9851:9;9847:22;9828:51;:::i;:::-;9818:61;;9773:116;9956:2;9945:9;9941:18;9928:32;9987:18;9979:6;9976:30;9973:117;;;10009:79;;:::i;:::-;9973:117;10122:78;10192:7;10183:6;10172:9;10168:22;10122:78;:::i;:::-;10104:96;;;;9899:311;9146:1071;;;;;;;;:::o;10223:537::-;10306:6;10355:2;10343:9;10334:7;10330:23;10326:32;10323:119;;;10361:79;;:::i;:::-;10323:119;10509:1;10498:9;10494:17;10481:31;10539:18;10531:6;10528:30;10525:117;;;10561:79;;:::i;:::-;10525:117;10666:77;10735:7;10726:6;10715:9;10711:22;10666:77;:::i;:::-;10656:87;;10452:301;10223:537;;;;:::o;10766:539::-;10850:6;10899:2;10887:9;10878:7;10874:23;10870:32;10867:119;;;10905:79;;:::i;:::-;10867:119;11053:1;11042:9;11038:17;11025:31;11083:18;11075:6;11072:30;11069:117;;;11105:79;;:::i;:::-;11069:117;11210:78;11280:7;11271:6;11260:9;11256:22;11210:78;:::i;:::-;11200:88;;10996:302;10766:539;;;;:::o;11311:323::-;11367:6;11416:2;11404:9;11395:7;11391:23;11387:32;11384:119;;;11422:79;;:::i;:::-;11384:119;11542:1;11567:50;11609:7;11600:6;11589:9;11585:22;11567:50;:::i;:::-;11557:60;;11513:114;11311:323;;;;:::o;11640:327::-;11698:6;11747:2;11735:9;11726:7;11722:23;11718:32;11715:119;;;11753:79;;:::i;:::-;11715:119;11873:1;11898:52;11942:7;11933:6;11922:9;11918:22;11898:52;:::i;:::-;11888:62;;11844:116;11640:327;;;;:::o;11973:349::-;12042:6;12091:2;12079:9;12070:7;12066:23;12062:32;12059:119;;;12097:79;;:::i;:::-;12059:119;12217:1;12242:63;12297:7;12288:6;12277:9;12273:22;12242:63;:::i;:::-;12232:73;;12188:127;11973:349;;;;:::o;12328:874::-;12420:6;12428;12436;12444;12493:2;12481:9;12472:7;12468:23;12464:32;12461:119;;;12499:79;;:::i;:::-;12461:119;12647:1;12636:9;12632:17;12619:31;12677:18;12669:6;12666:30;12663:117;;;12699:79;;:::i;:::-;12663:117;12812:65;12869:7;12860:6;12849:9;12845:22;12812:65;:::i;:::-;12794:83;;;;12590:297;12954:2;12943:9;12939:18;12926:32;12985:18;12977:6;12974:30;12971:117;;;13007:79;;:::i;:::-;12971:117;13120:65;13177:7;13168:6;13157:9;13153:22;13120:65;:::i;:::-;13102:83;;;;12897:298;12328:874;;;;;;;:::o;13208:329::-;13267:6;13316:2;13304:9;13295:7;13291:23;13287:32;13284:119;;;13322:79;;:::i;:::-;13284:119;13442:1;13467:53;13512:7;13503:6;13492:9;13488:22;13467:53;:::i;:::-;13457:63;;13413:117;13208:329;;;;:::o;13543:325::-;13600:6;13649:2;13637:9;13628:7;13624:23;13620:32;13617:119;;;13655:79;;:::i;:::-;13617:119;13775:1;13800:51;13843:7;13834:6;13823:9;13819:22;13800:51;:::i;:::-;13790:61;;13746:115;13543:325;;;;:::o;13874:466::-;13938:6;13946;13995:2;13983:9;13974:7;13970:23;13966:32;13963:119;;;14001:79;;:::i;:::-;13963:119;14121:1;14146:51;14189:7;14180:6;14169:9;14165:22;14146:51;:::i;:::-;14136:61;;14092:115;14246:2;14272:51;14315:7;14306:6;14295:9;14291:22;14272:51;:::i;:::-;14262:61;;14217:116;13874:466;;;;;:::o;14346:118::-;14433:24;14451:5;14433:24;:::i;:::-;14428:3;14421:37;14346:118;;:::o;14470:109::-;14551:21;14566:5;14551:21;:::i;:::-;14546:3;14539:34;14470:109;;:::o;14585:360::-;14671:3;14699:38;14731:5;14699:38;:::i;:::-;14753:70;14816:6;14811:3;14753:70;:::i;:::-;14746:77;;14832:52;14877:6;14872:3;14865:4;14858:5;14854:16;14832:52;:::i;:::-;14909:29;14931:6;14909:29;:::i;:::-;14904:3;14900:39;14893:46;;14675:270;14585:360;;;;:::o;14951:364::-;15039:3;15067:39;15100:5;15067:39;:::i;:::-;15122:71;15186:6;15181:3;15122:71;:::i;:::-;15115:78;;15202:52;15247:6;15242:3;15235:4;15228:5;15224:16;15202:52;:::i;:::-;15279:29;15301:6;15279:29;:::i;:::-;15274:3;15270:39;15263:46;;15043:272;14951:364;;;;:::o;15321:377::-;15427:3;15455:39;15488:5;15455:39;:::i;:::-;15510:89;15592:6;15587:3;15510:89;:::i;:::-;15503:96;;15608:52;15653:6;15648:3;15641:4;15634:5;15630:16;15608:52;:::i;:::-;15685:6;15680:3;15676:16;15669:23;;15431:267;15321:377;;;;:::o;15728:845::-;15831:3;15868:5;15862:12;15897:36;15923:9;15897:36;:::i;:::-;15949:89;16031:6;16026:3;15949:89;:::i;:::-;15942:96;;16069:1;16058:9;16054:17;16085:1;16080:137;;;;16231:1;16226:341;;;;16047:520;;16080:137;16164:4;16160:9;16149;16145:25;16140:3;16133:38;16200:6;16195:3;16191:16;16184:23;;16080:137;;16226:341;16293:38;16325:5;16293:38;:::i;:::-;16353:1;16367:154;16381:6;16378:1;16375:13;16367:154;;;16455:7;16449:14;16445:1;16440:3;16436:11;16429:35;16505:1;16496:7;16492:15;16481:26;;16403:4;16400:1;16396:12;16391:17;;16367:154;;;16550:6;16545:3;16541:16;16534:23;;16233:334;;16047:520;;15835:738;;15728:845;;;;:::o;16579:366::-;16721:3;16742:67;16806:2;16801:3;16742:67;:::i;:::-;16735:74;;16818:93;16907:3;16818:93;:::i;:::-;16936:2;16931:3;16927:12;16920:19;;16579:366;;;:::o;16951:::-;17093:3;17114:67;17178:2;17173:3;17114:67;:::i;:::-;17107:74;;17190:93;17279:3;17190:93;:::i;:::-;17308:2;17303:3;17299:12;17292:19;;16951:366;;;:::o;17323:::-;17465:3;17486:67;17550:2;17545:3;17486:67;:::i;:::-;17479:74;;17562:93;17651:3;17562:93;:::i;:::-;17680:2;17675:3;17671:12;17664:19;;17323:366;;;:::o;17695:::-;17837:3;17858:67;17922:2;17917:3;17858:67;:::i;:::-;17851:74;;17934:93;18023:3;17934:93;:::i;:::-;18052:2;18047:3;18043:12;18036:19;;17695:366;;;:::o;18067:::-;18209:3;18230:67;18294:2;18289:3;18230:67;:::i;:::-;18223:74;;18306:93;18395:3;18306:93;:::i;:::-;18424:2;18419:3;18415:12;18408:19;;18067:366;;;:::o;18439:::-;18581:3;18602:67;18666:2;18661:3;18602:67;:::i;:::-;18595:74;;18678:93;18767:3;18678:93;:::i;:::-;18796:2;18791:3;18787:12;18780:19;;18439:366;;;:::o;18811:400::-;18971:3;18992:84;19074:1;19069:3;18992:84;:::i;:::-;18985:91;;19085:93;19174:3;19085:93;:::i;:::-;19203:1;19198:3;19194:11;19187:18;;18811:400;;;:::o;19217:366::-;19359:3;19380:67;19444:2;19439:3;19380:67;:::i;:::-;19373:74;;19456:93;19545:3;19456:93;:::i;:::-;19574:2;19569:3;19565:12;19558:19;;19217:366;;;:::o;19589:::-;19731:3;19752:67;19816:2;19811:3;19752:67;:::i;:::-;19745:74;;19828:93;19917:3;19828:93;:::i;:::-;19946:2;19941:3;19937:12;19930:19;;19589:366;;;:::o;19961:::-;20103:3;20124:67;20188:2;20183:3;20124:67;:::i;:::-;20117:74;;20200:93;20289:3;20200:93;:::i;:::-;20318:2;20313:3;20309:12;20302:19;;19961:366;;;:::o;20333:::-;20475:3;20496:67;20560:2;20555:3;20496:67;:::i;:::-;20489:74;;20572:93;20661:3;20572:93;:::i;:::-;20690:2;20685:3;20681:12;20674:19;;20333:366;;;:::o;20705:::-;20847:3;20868:67;20932:2;20927:3;20868:67;:::i;:::-;20861:74;;20944:93;21033:3;20944:93;:::i;:::-;21062:2;21057:3;21053:12;21046:19;;20705:366;;;:::o;21077:::-;21219:3;21240:67;21304:2;21299:3;21240:67;:::i;:::-;21233:74;;21316:93;21405:3;21316:93;:::i;:::-;21434:2;21429:3;21425:12;21418:19;;21077:366;;;:::o;21449:::-;21591:3;21612:67;21676:2;21671:3;21612:67;:::i;:::-;21605:74;;21688:93;21777:3;21688:93;:::i;:::-;21806:2;21801:3;21797:12;21790:19;;21449:366;;;:::o;21821:::-;21963:3;21984:67;22048:2;22043:3;21984:67;:::i;:::-;21977:74;;22060:93;22149:3;22060:93;:::i;:::-;22178:2;22173:3;22169:12;22162:19;;21821:366;;;:::o;22193:::-;22335:3;22356:67;22420:2;22415:3;22356:67;:::i;:::-;22349:74;;22432:93;22521:3;22432:93;:::i;:::-;22550:2;22545:3;22541:12;22534:19;;22193:366;;;:::o;22565:::-;22707:3;22728:67;22792:2;22787:3;22728:67;:::i;:::-;22721:74;;22804:93;22893:3;22804:93;:::i;:::-;22922:2;22917:3;22913:12;22906:19;;22565:366;;;:::o;22937:398::-;23096:3;23117:83;23198:1;23193:3;23117:83;:::i;:::-;23110:90;;23209:93;23298:3;23209:93;:::i;:::-;23327:1;23322:3;23318:11;23311:18;;22937:398;;;:::o;23341:400::-;23501:3;23522:84;23604:1;23599:3;23522:84;:::i;:::-;23515:91;;23615:93;23704:3;23615:93;:::i;:::-;23733:1;23728:3;23724:11;23717:18;;23341:400;;;:::o;23747:115::-;23832:23;23849:5;23832:23;:::i;:::-;23827:3;23820:36;23747:115;;:::o;23868:118::-;23955:24;23973:5;23955:24;:::i;:::-;23950:3;23943:37;23868:118;;:::o;23992:112::-;24075:22;24091:5;24075:22;:::i;:::-;24070:3;24063:35;23992:112;;:::o;24110:583::-;24332:3;24354:92;24442:3;24433:6;24354:92;:::i;:::-;24347:99;;24463:95;24554:3;24545:6;24463:95;:::i;:::-;24456:102;;24575:92;24663:3;24654:6;24575:92;:::i;:::-;24568:99;;24684:3;24677:10;;24110:583;;;;;;:::o;24699:689::-;24974:3;24996:92;25084:3;25075:6;24996:92;:::i;:::-;24989:99;;25105:148;25249:3;25105:148;:::i;:::-;25098:155;;25270:92;25358:3;25349:6;25270:92;:::i;:::-;25263:99;;25379:3;25372:10;;24699:689;;;;;:::o;25394:::-;25669:3;25691:92;25779:3;25770:6;25691:92;:::i;:::-;25684:99;;25800:148;25944:3;25800:148;:::i;:::-;25793:155;;25965:92;26053:3;26044:6;25965:92;:::i;:::-;25958:99;;26074:3;26067:10;;25394:689;;;;;:::o;26089:379::-;26273:3;26295:147;26438:3;26295:147;:::i;:::-;26288:154;;26459:3;26452:10;;26089:379;;;:::o;26474:222::-;26567:4;26605:2;26594:9;26590:18;26582:26;;26618:71;26686:1;26675:9;26671:17;26662:6;26618:71;:::i;:::-;26474:222;;;;:::o;26702:640::-;26897:4;26935:3;26924:9;26920:19;26912:27;;26949:71;27017:1;27006:9;27002:17;26993:6;26949:71;:::i;:::-;27030:72;27098:2;27087:9;27083:18;27074:6;27030:72;:::i;:::-;27112;27180:2;27169:9;27165:18;27156:6;27112:72;:::i;:::-;27231:9;27225:4;27221:20;27216:2;27205:9;27201:18;27194:48;27259:76;27330:4;27321:6;27259:76;:::i;:::-;27251:84;;26702:640;;;;;;;:::o;27348:210::-;27435:4;27473:2;27462:9;27458:18;27450:26;;27486:65;27548:1;27537:9;27533:17;27524:6;27486:65;:::i;:::-;27348:210;;;;:::o;27564:313::-;27677:4;27715:2;27704:9;27700:18;27692:26;;27764:9;27758:4;27754:20;27750:1;27739:9;27735:17;27728:47;27792:78;27865:4;27856:6;27792:78;:::i;:::-;27784:86;;27564:313;;;;:::o;27883:419::-;28049:4;28087:2;28076:9;28072:18;28064:26;;28136:9;28130:4;28126:20;28122:1;28111:9;28107:17;28100:47;28164:131;28290:4;28164:131;:::i;:::-;28156:139;;27883:419;;;:::o;28308:::-;28474:4;28512:2;28501:9;28497:18;28489:26;;28561:9;28555:4;28551:20;28547:1;28536:9;28532:17;28525:47;28589:131;28715:4;28589:131;:::i;:::-;28581:139;;28308:419;;;:::o;28733:::-;28899:4;28937:2;28926:9;28922:18;28914:26;;28986:9;28980:4;28976:20;28972:1;28961:9;28957:17;28950:47;29014:131;29140:4;29014:131;:::i;:::-;29006:139;;28733:419;;;:::o;29158:::-;29324:4;29362:2;29351:9;29347:18;29339:26;;29411:9;29405:4;29401:20;29397:1;29386:9;29382:17;29375:47;29439:131;29565:4;29439:131;:::i;:::-;29431:139;;29158:419;;;:::o;29583:::-;29749:4;29787:2;29776:9;29772:18;29764:26;;29836:9;29830:4;29826:20;29822:1;29811:9;29807:17;29800:47;29864:131;29990:4;29864:131;:::i;:::-;29856:139;;29583:419;;;:::o;30008:::-;30174:4;30212:2;30201:9;30197:18;30189:26;;30261:9;30255:4;30251:20;30247:1;30236:9;30232:17;30225:47;30289:131;30415:4;30289:131;:::i;:::-;30281:139;;30008:419;;;:::o;30433:::-;30599:4;30637:2;30626:9;30622:18;30614:26;;30686:9;30680:4;30676:20;30672:1;30661:9;30657:17;30650:47;30714:131;30840:4;30714:131;:::i;:::-;30706:139;;30433:419;;;:::o;30858:::-;31024:4;31062:2;31051:9;31047:18;31039:26;;31111:9;31105:4;31101:20;31097:1;31086:9;31082:17;31075:47;31139:131;31265:4;31139:131;:::i;:::-;31131:139;;30858:419;;;:::o;31283:::-;31449:4;31487:2;31476:9;31472:18;31464:26;;31536:9;31530:4;31526:20;31522:1;31511:9;31507:17;31500:47;31564:131;31690:4;31564:131;:::i;:::-;31556:139;;31283:419;;;:::o;31708:::-;31874:4;31912:2;31901:9;31897:18;31889:26;;31961:9;31955:4;31951:20;31947:1;31936:9;31932:17;31925:47;31989:131;32115:4;31989:131;:::i;:::-;31981:139;;31708:419;;;:::o;32133:::-;32299:4;32337:2;32326:9;32322:18;32314:26;;32386:9;32380:4;32376:20;32372:1;32361:9;32357:17;32350:47;32414:131;32540:4;32414:131;:::i;:::-;32406:139;;32133:419;;;:::o;32558:::-;32724:4;32762:2;32751:9;32747:18;32739:26;;32811:9;32805:4;32801:20;32797:1;32786:9;32782:17;32775:47;32839:131;32965:4;32839:131;:::i;:::-;32831:139;;32558:419;;;:::o;32983:::-;33149:4;33187:2;33176:9;33172:18;33164:26;;33236:9;33230:4;33226:20;33222:1;33211:9;33207:17;33200:47;33264:131;33390:4;33264:131;:::i;:::-;33256:139;;32983:419;;;:::o;33408:::-;33574:4;33612:2;33601:9;33597:18;33589:26;;33661:9;33655:4;33651:20;33647:1;33636:9;33632:17;33625:47;33689:131;33815:4;33689:131;:::i;:::-;33681:139;;33408:419;;;:::o;33833:::-;33999:4;34037:2;34026:9;34022:18;34014:26;;34086:9;34080:4;34076:20;34072:1;34061:9;34057:17;34050:47;34114:131;34240:4;34114:131;:::i;:::-;34106:139;;33833:419;;;:::o;34258:::-;34424:4;34462:2;34451:9;34447:18;34439:26;;34511:9;34505:4;34501:20;34497:1;34486:9;34482:17;34475:47;34539:131;34665:4;34539:131;:::i;:::-;34531:139;;34258:419;;;:::o;34683:222::-;34776:4;34814:2;34803:9;34799:18;34791:26;;34827:71;34895:1;34884:9;34880:17;34871:6;34827:71;:::i;:::-;34683:222;;;;:::o;34911:214::-;35000:4;35038:2;35027:9;35023:18;35015:26;;35051:67;35115:1;35104:9;35100:17;35091:6;35051:67;:::i;:::-;34911:214;;;;:::o;35131:541::-;35302:4;35340:3;35329:9;35325:19;35317:27;;35354:67;35418:1;35407:9;35403:17;35394:6;35354:67;:::i;:::-;35431:70;35497:2;35486:9;35482:18;35473:6;35431:70;:::i;:::-;35511:72;35579:2;35568:9;35564:18;35555:6;35511:72;:::i;:::-;35593;35661:2;35650:9;35646:18;35637:6;35593:72;:::i;:::-;35131:541;;;;;;;:::o;35678:129::-;35712:6;35739:20;;:::i;:::-;35729:30;;35768:33;35796:4;35788:6;35768:33;:::i;:::-;35678:129;;;:::o;35813:75::-;35846:6;35879:2;35873:9;35863:19;;35813:75;:::o;35894:310::-;35970:4;36060:18;36052:6;36049:30;36046:56;;;36082:18;;:::i;:::-;36046:56;36132:4;36124:6;36120:17;36112:25;;36192:4;36186;36182:15;36174:23;;35894:310;;;:::o;36210:311::-;36287:4;36377:18;36369:6;36366:30;36363:56;;;36399:18;;:::i;:::-;36363:56;36449:4;36441:6;36437:17;36429:25;;36509:4;36503;36499:15;36491:23;;36210:311;;;:::o;36527:307::-;36588:4;36678:18;36670:6;36667:30;36664:56;;;36700:18;;:::i;:::-;36664:56;36738:29;36760:6;36738:29;:::i;:::-;36730:37;;36822:4;36816;36812:15;36804:23;;36527:307;;;:::o;36840:141::-;36889:4;36912:3;36904:11;;36935:3;36932:1;36925:14;36969:4;36966:1;36956:18;36948:26;;36840:141;;;:::o;36987:98::-;37038:6;37072:5;37066:12;37056:22;;36987:98;;;:::o;37091:99::-;37143:6;37177:5;37171:12;37161:22;;37091:99;;;:::o;37196:168::-;37279:11;37313:6;37308:3;37301:19;37353:4;37348:3;37344:14;37329:29;;37196:168;;;;:::o;37370:147::-;37471:11;37508:3;37493:18;;37370:147;;;;:::o;37523:169::-;37607:11;37641:6;37636:3;37629:19;37681:4;37676:3;37672:14;37657:29;;37523:169;;;;:::o;37698:148::-;37800:11;37837:3;37822:18;;37698:148;;;;:::o;37852:305::-;37892:3;37911:20;37929:1;37911:20;:::i;:::-;37906:25;;37945:20;37963:1;37945:20;:::i;:::-;37940:25;;38099:1;38031:66;38027:74;38024:1;38021:81;38018:107;;;38105:18;;:::i;:::-;38018:107;38149:1;38146;38142:9;38135:16;;37852:305;;;;:::o;38163:185::-;38203:1;38220:20;38238:1;38220:20;:::i;:::-;38215:25;;38254:20;38272:1;38254:20;:::i;:::-;38249:25;;38293:1;38283:35;;38298:18;;:::i;:::-;38283:35;38340:1;38337;38333:9;38328:14;;38163:185;;;;:::o;38354:348::-;38394:7;38417:20;38435:1;38417:20;:::i;:::-;38412:25;;38451:20;38469:1;38451:20;:::i;:::-;38446:25;;38639:1;38571:66;38567:74;38564:1;38561:81;38556:1;38549:9;38542:17;38538:105;38535:131;;;38646:18;;:::i;:::-;38535:131;38694:1;38691;38687:9;38676:20;;38354:348;;;;:::o;38708:191::-;38748:4;38768:20;38786:1;38768:20;:::i;:::-;38763:25;;38802:20;38820:1;38802:20;:::i;:::-;38797:25;;38841:1;38838;38835:8;38832:34;;;38846:18;;:::i;:::-;38832:34;38891:1;38888;38884:9;38876:17;;38708:191;;;;:::o;38905:185::-;38943:4;38963:18;38979:1;38963:18;:::i;:::-;38958:23;;38995:18;39011:1;38995:18;:::i;:::-;38990:23;;39032:1;39029;39026:8;39023:34;;;39037:18;;:::i;:::-;39023:34;39082:1;39079;39075:9;39067:17;;38905:185;;;;:::o;39096:96::-;39133:7;39162:24;39180:5;39162:24;:::i;:::-;39151:35;;39096:96;;;:::o;39198:90::-;39232:7;39275:5;39268:13;39261:21;39250:32;;39198:90;;;:::o;39294:149::-;39330:7;39370:66;39363:5;39359:78;39348:89;;39294:149;;;:::o;39449:89::-;39485:7;39525:6;39518:5;39514:18;39503:29;;39449:89;;;:::o;39544:126::-;39581:7;39621:42;39614:5;39610:54;39599:65;;39544:126;;;:::o;39676:77::-;39713:7;39742:5;39731:16;;39676:77;;;:::o;39759:86::-;39794:7;39834:4;39827:5;39823:16;39812:27;;39759:86;;;:::o;39851:154::-;39935:6;39930:3;39925;39912:30;39997:1;39988:6;39983:3;39979:16;39972:27;39851:154;;;:::o;40011:307::-;40079:1;40089:113;40103:6;40100:1;40097:13;40089:113;;;40188:1;40183:3;40179:11;40173:18;40169:1;40164:3;40160:11;40153:39;40125:2;40122:1;40118:10;40113:15;;40089:113;;;40220:6;40217:1;40214:13;40211:101;;;40300:1;40291:6;40286:3;40282:16;40275:27;40211:101;40060:258;40011:307;;;:::o;40324:167::-;40361:3;40384:22;40400:5;40384:22;:::i;:::-;40375:31;;40428:4;40421:5;40418:15;40415:41;;;40436:18;;:::i;:::-;40415:41;40483:1;40476:5;40472:13;40465:20;;40324:167;;;:::o;40497:320::-;40541:6;40578:1;40572:4;40568:12;40558:22;;40625:1;40619:4;40615:12;40646:18;40636:81;;40702:4;40694:6;40690:17;40680:27;;40636:81;40764:2;40756:6;40753:14;40733:18;40730:38;40727:84;;;40783:18;;:::i;:::-;40727:84;40548:269;40497:320;;;:::o;40823:281::-;40906:27;40928:4;40906:27;:::i;:::-;40898:6;40894:40;41036:6;41024:10;41021:22;41000:18;40988:10;40985:34;40982:62;40979:88;;;41047:18;;:::i;:::-;40979:88;41087:10;41083:2;41076:22;40866:238;40823:281;;:::o;41110:233::-;41149:3;41172:24;41190:5;41172:24;:::i;:::-;41163:33;;41218:66;41211:5;41208:77;41205:103;;;41288:18;;:::i;:::-;41205:103;41335:1;41328:5;41324:13;41317:20;;41110:233;;;:::o;41349:167::-;41386:3;41409:22;41425:5;41409:22;:::i;:::-;41400:31;;41453:4;41446:5;41443:15;41440:41;;;41461:18;;:::i;:::-;41440:41;41508:1;41501:5;41497:13;41490:20;;41349:167;;;:::o;41522:176::-;41554:1;41571:20;41589:1;41571:20;:::i;:::-;41566:25;;41605:20;41623:1;41605:20;:::i;:::-;41600:25;;41644:1;41634:35;;41649:18;;:::i;:::-;41634:35;41690:1;41687;41683:9;41678:14;;41522:176;;;;:::o;41704:180::-;41752:77;41749:1;41742:88;41849:4;41846:1;41839:15;41873:4;41870:1;41863:15;41890:180;41938:77;41935:1;41928:88;42035:4;42032:1;42025:15;42059:4;42056:1;42049:15;42076:180;42124:77;42121:1;42114:88;42221:4;42218:1;42211:15;42245:4;42242:1;42235:15;42262:180;42310:77;42307:1;42300:88;42407:4;42404:1;42397:15;42431:4;42428:1;42421:15;42448:180;42496:77;42493:1;42486:88;42593:4;42590:1;42583:15;42617:4;42614:1;42607:15;42634:117;42743:1;42740;42733:12;42757:117;42866:1;42863;42856:12;42880:117;42989:1;42986;42979:12;43003:117;43112:1;43109;43102:12;43126:117;43235:1;43232;43225:12;43249:117;43358:1;43355;43348:12;43372:102;43413:6;43464:2;43460:7;43455:2;43448:5;43444:14;43440:28;43430:38;;43372:102;;;:::o;43480:170::-;43620:22;43616:1;43608:6;43604:14;43597:46;43480:170;:::o;43656:169::-;43796:21;43792:1;43784:6;43780:14;43773:45;43656:169;:::o;43831:225::-;43971:34;43967:1;43959:6;43955:14;43948:58;44040:8;44035:2;44027:6;44023:15;44016:33;43831:225;:::o;44062:171::-;44202:23;44198:1;44190:6;44186:14;44179:47;44062:171;:::o;44239:176::-;44379:28;44375:1;44367:6;44363:14;44356:52;44239:176;:::o;44421:166::-;44561:18;44557:1;44549:6;44545:14;44538:42;44421:166;:::o;44593:158::-;44733:10;44729:1;44721:6;44717:14;44710:34;44593:158;:::o;44757:230::-;44897:34;44893:1;44885:6;44881:14;44874:58;44966:13;44961:2;44953:6;44949:15;44942:38;44757:230;:::o;44993:229::-;45133:34;45129:1;45121:6;45117:14;45110:58;45202:12;45197:2;45189:6;45185:15;45178:37;44993:229;:::o;45228:182::-;45368:34;45364:1;45356:6;45352:14;45345:58;45228:182;:::o;45416:169::-;45556:21;45552:1;45544:6;45540:14;45533:45;45416:169;:::o;45591:222::-;45731:34;45727:1;45719:6;45715:14;45708:58;45800:5;45795:2;45787:6;45783:15;45776:30;45591:222;:::o;45819:166::-;45959:18;45955:1;45947:6;45943:14;45936:42;45819:166;:::o;45991:234::-;46131:34;46127:1;46119:6;46115:14;46108:58;46200:17;46195:2;46187:6;46183:15;46176:42;45991:234;:::o;46231:171::-;46371:23;46367:1;46359:6;46355:14;46348:47;46231:171;:::o;46408:168::-;46548:20;46544:1;46536:6;46532:14;46525:44;46408:168;:::o;46582:175::-;46722:27;46718:1;46710:6;46706:14;46699:51;46582:175;:::o;46763:114::-;;:::o;46883:159::-;47023:11;47019:1;47011:6;47007:14;47000:35;46883:159;:::o;47048:122::-;47121:24;47139:5;47121:24;:::i;:::-;47114:5;47111:35;47101:63;;47160:1;47157;47150:12;47101:63;47048:122;:::o;47176:116::-;47246:21;47261:5;47246:21;:::i;:::-;47239:5;47236:32;47226:60;;47282:1;47279;47272:12;47226:60;47176:116;:::o;47298:120::-;47370:23;47387:5;47370:23;:::i;:::-;47363:5;47360:34;47350:62;;47408:1;47405;47398:12;47350:62;47298:120;:::o;47424:::-;47496:23;47513:5;47496:23;:::i;:::-;47489:5;47486:34;47476:62;;47534:1;47531;47524:12;47476:62;47424:120;:::o;47550:122::-;47623:24;47641:5;47623:24;:::i;:::-;47616:5;47613:35;47603:63;;47662:1;47659;47652:12;47603:63;47550:122;:::o;47678:118::-;47749:22;47765:5;47749:22;:::i;:::-;47742:5;47739:33;47729:61;;47786:1;47783;47776:12;47729:61;47678:118;:::o

Swarm Source

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