Token World Waifu

Overview CRC721

Total Supply:
2,528 WAIFU

Holders:
128 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ERC721Launchpad

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.8.4 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface 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);
}


// File @openzeppelin/contracts/token/ERC721/[email protected]

// 
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @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`, 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 Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

// 
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// 
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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


// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]

// 
// 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/utils/[email protected]

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

pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]

// 
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}


// File @openzeppelin/contracts/token/ERC721/[email protected]

// 
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;







/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // 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;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @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) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a 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 _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// 
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// 
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}


// File @openzeppelin/contracts/access/[email protected]

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


// File @openzeppelin/contracts/utils/math/[email protected]

// 
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File contracts/ERC721Launcpad.sol

pragma solidity ^0.8.0;
// 





contract ERC721Launchpad is ERC721Enumerable, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _counter;
    using SafeMath for uint256;
    string public baseURI;

    uint public publicFee;
    uint public whiteListFee;
    uint public corgiHolderFee;
    uint public userLimit;

    address public corgiAddress;

    address public corgiPayee = 0x6B7FBb0A0EC0099eED6549eC54d3f79463711DFe;

    mapping(address => bool) public whiteList;
    mapping(address => uint256) public addressToMinted;

    modifier ownerOnly(uint256 _id) {
        require(ownerOf(_id) == msg.sender, "OwnersOnly: ONLY_OWNERS_ALLOWED");
        _;
    }

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _uri,
        uint _publicFee,
        uint _whiteListFee,
        uint _corgiHolderFee,
        address _corgiAddress,
        address[] memory _whiteListAddress,
        uint deployFee,
        uint _userLimit
    ) ERC721(_name, _symbol) payable {
        require(msg.value == deployFee, "Deployment fee is not correct");
        baseURI = _uri;

        setFee(_publicFee, _whiteListFee);
        setWhiteList(_whiteListAddress);
        setCorgiHolderFee(_corgiHolderFee);
        corgiAddress = _corgiAddress;
        userLimit = _userLimit;

        payable(corgiPayee).transfer(msg.value);
    }

    function getFee(address minter) public view returns (uint) {
        if (minter == owner()) {
            return 0;
        }
        if (IERC721(corgiAddress).balanceOf(minter) > 0) {
            return corgiHolderFee;
        }
        if (whiteList[minter]) {
            return whiteListFee;
        }
        return publicFee;
    }

    function setFee(uint _publicFee, uint _whiteListFee) public onlyOwner {
        publicFee = _publicFee;
        whiteListFee = _whiteListFee;
    }

    function setCorgiHolderFee(uint _corgiHolderFee) public onlyOwner {
        corgiHolderFee = _corgiHolderFee;
    }

    function setWhiteList(address[] memory _whiteListAddress) public onlyOwner {
        for (uint i = 0; i < _whiteListAddress.length; i++) {
            whiteList[_whiteListAddress[i]] = true;
        }
    }

    function setBaseURI(string memory _uri) public onlyOwner {
        baseURI = _uri;
    }

    function mintTo(address _initialOwner) public payable returns (uint256) {
        require(msg.value == getFee(msg.sender), "Fee mismatch");
        require(addressToMinted[_initialOwner] < userLimit, 'limit reached');
        addressToMinted[_initialOwner] += 1;

        _counter.increment();

        _safeMint(_initialOwner, _counter.current());
        uint corgiRevenue = msg.value * 2 / 100;
        uint ownerRevenue = msg.value - corgiRevenue;
        payable(corgiPayee).transfer(corgiRevenue);
        payable(owner()).transfer(ownerRevenue);

        return _counter.current();
    }

    function bulkMintTo(
        address _initialOwner,
        uint _quantity
    ) public payable {
        require(addressToMinted[_initialOwner] + _quantity <= userLimit, 'limit reached');
        addressToMinted[_initialOwner] += _quantity;
        require(msg.value == (getFee(msg.sender) * _quantity), "Fee mismatch");
        for (uint256 i = 0; i < _quantity; i++) {
            _counter.increment();
            _safeMint(_initialOwner, _counter.current());
        }

        uint corgiRevenue = msg.value * 2 / 100;
        uint ownerRevenue = msg.value - corgiRevenue;
        payable(corgiPayee).transfer(corgiRevenue);
        payable(owner()).transfer(ownerRevenue);
    }

    function burn(uint256 _id) public ownerOnly(_id) {
        _burn(_id);
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
    internal
    override(ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function _burn(uint256 tokenId) internal override(ERC721) {
        super._burn(tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
    public
    view
    override(ERC721Enumerable)
    returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    function tokenURI(uint256 tokenId)
    public
    view
    override(ERC721)
    returns (string memory)
    {
        return string(abi.encodePacked(
            baseURI,
            Strings.toString(tokenId),
            ".json")
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"uint256","name":"_publicFee","type":"uint256"},{"internalType":"uint256","name":"_whiteListFee","type":"uint256"},{"internalType":"uint256","name":"_corgiHolderFee","type":"uint256"},{"internalType":"address","name":"_corgiAddress","type":"address"},{"internalType":"address[]","name":"_whiteListAddress","type":"address[]"},{"internalType":"uint256","name":"deployFee","type":"uint256"},{"internalType":"uint256","name":"_userLimit","type":"uint256"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressToMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_initialOwner","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"bulkMintTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"corgiAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"corgiHolderFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"corgiPayee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"getFee","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":"address","name":"_initialOwner","type":"address"}],"name":"mintTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_corgiHolderFee","type":"uint256"}],"name":"setCorgiHolderFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicFee","type":"uint256"},{"internalType":"uint256","name":"_whiteListFee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_whiteListAddress","type":"address[]"}],"name":"setWhiteList","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"userLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052736b7fbb0a0ec0099eed6549ec54d3f79463711dfe601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051620054b4380380620054b483398181016040528101906200007e91906200079b565b8989816000908051906020019062000098929190620005a9565b508060019080519060200190620000b1929190620005a9565b505050620000d4620000c86200022860201b60201c565b6200023060201b60201c565b81341462000119576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000110906200093d565b60405180910390fd5b87600c908051906020019062000131929190620005a9565b50620001448787620002f660201b60201c565b62000155836200039760201b60201c565b6200016685620004e660201b60201c565b83601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601081905550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801562000217573d6000803e3d6000fd5b505050505050505050505062000c72565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003066200022860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200032c6200057f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000385576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200037c906200095f565b60405180910390fd5b81600d8190555080600e819055505050565b620003a76200022860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003cd6200057f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000426576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200041d906200095f565b60405180910390fd5b60005b8151811015620004e25760016013600084848151811062000473577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080620004d99062000b00565b91505062000429565b5050565b620004f66200022860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200051c6200057f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000575576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200056c906200095f565b60405180910390fd5b80600f8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620005b79062000a94565b90600052602060002090601f016020900481019282620005db576000855562000627565b82601f10620005f657805160ff191683800117855562000627565b8280016001018555821562000627579182015b828111156200062657825182559160200191906001019062000609565b5b5090506200063691906200063a565b5090565b5b80821115620006555760008160009055506001016200063b565b5090565b6000620006706200066a84620009aa565b62000981565b905080838252602082019050828560208602820111156200069057600080fd5b60005b85811015620006c45781620006a9888262000713565b84526020840193506020830192505060018101905062000693565b5050509392505050565b6000620006e5620006df84620009d9565b62000981565b905082815260208101848484011115620006fe57600080fd5b6200070b84828562000a5e565b509392505050565b600081519050620007248162000c3e565b92915050565b600082601f8301126200073c57600080fd5b81516200074e84826020860162000659565b91505092915050565b600082601f8301126200076957600080fd5b81516200077b848260208601620006ce565b91505092915050565b600081519050620007958162000c58565b92915050565b6000806000806000806000806000806101408b8d031215620007bc57600080fd5b60008b015167ffffffffffffffff811115620007d757600080fd5b620007e58d828e0162000757565b9a505060208b015167ffffffffffffffff8111156200080357600080fd5b620008118d828e0162000757565b99505060408b015167ffffffffffffffff8111156200082f57600080fd5b6200083d8d828e0162000757565b9850506060620008508d828e0162000784565b9750506080620008638d828e0162000784565b96505060a0620008768d828e0162000784565b95505060c0620008898d828e0162000713565b94505060e08b015167ffffffffffffffff811115620008a757600080fd5b620008b58d828e016200072a565b935050610100620008c98d828e0162000784565b925050610120620008dd8d828e0162000784565b9150509295989b9194979a5092959850565b6000620008fe601d8362000a0f565b91506200090b8262000bec565b602082019050919050565b60006200092560208362000a0f565b9150620009328262000c15565b602082019050919050565b600060208201905081810360008301526200095881620008ef565b9050919050565b600060208201905081810360008301526200097a8162000916565b9050919050565b60006200098d620009a0565b90506200099b828262000aca565b919050565b6000604051905090565b600067ffffffffffffffff821115620009c857620009c762000bac565b5b602082029050602081019050919050565b600067ffffffffffffffff821115620009f757620009f662000bac565b5b62000a028262000bdb565b9050602081019050919050565b600082825260208201905092915050565b600062000a2d8262000a34565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000a7e57808201518184015260208101905062000a61565b8381111562000a8e576000848401525b50505050565b6000600282049050600182168062000aad57607f821691505b6020821081141562000ac45762000ac362000b7d565b5b50919050565b62000ad58262000bdb565b810181811067ffffffffffffffff8211171562000af75762000af662000bac565b5b80604052505050565b600062000b0d8262000a54565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000b435762000b4262000b4e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4465706c6f796d656e7420666565206973206e6f7420636f7272656374000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b62000c498162000a20565b811462000c5557600080fd5b50565b62000c638162000a54565b811462000c6f57600080fd5b50565b6148328062000c826000396000f3fe60806040526004361061020f5760003560e01c80636c0360eb11610118578063a22cb465116100a0578063bc25fe4b1161006f578063bc25fe4b146107b9578063c87b56dd146107e4578063e985e9c514610821578063ee1cca461461085e578063f2fde38b146108895761020f565b8063a22cb465146106ff578063a2791f8614610728578063b88c914814610753578063b88d4fde146107905761020f565b8063775b9c13116100e7578063775b9c13146106275780638a2f34ea146106505780638da5cb5b1461066c57806395d89b41146106975780639ec00c95146106c25761020f565b80636c0360eb1461057857806370a08231146105a3578063715018a6146105e0578063755edd17146105f75761020f565b806342842e0e1161019b5780634f6ccce71161016a5780634f6ccce71461048157806352f7c988146104be57806355f804b3146104e757806359646463146105105780636352211e1461053b5761020f565b806342842e0e146103d957806342966c681461040257806343cc72781461042b5780634a7c01ec146104565761020f565b806317f12e5b116101e257806317f12e5b146102e257806318160ddd1461030b57806323b872dd146103365780632f745c591461035f578063372c12b11461039c5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190613518565b6108b2565b6040516102489190613afd565b60405180910390f35b34801561025d57600080fd5b506102666108c4565b6040516102739190613b18565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e91906135ab565b610956565b6040516102b09190613a96565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db919061349b565b6109db565b005b3480156102ee57600080fd5b50610309600480360381019061030491906135ab565b610af3565b005b34801561031757600080fd5b50610320610b79565b60405161032d9190613dba565b60405180910390f35b34801561034257600080fd5b5061035d60048036038101906103589190613395565b610b86565b005b34801561036b57600080fd5b506103866004803603810190610381919061349b565b610be6565b6040516103939190613dba565b60405180910390f35b3480156103a857600080fd5b506103c360048036038101906103be9190613330565b610c8b565b6040516103d09190613afd565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb9190613395565b610cab565b005b34801561040e57600080fd5b50610429600480360381019061042491906135ab565b610ccb565b005b34801561043757600080fd5b50610440610d4f565b60405161044d9190613a96565b60405180910390f35b34801561046257600080fd5b5061046b610d75565b6040516104789190613dba565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a391906135ab565b610d7b565b6040516104b59190613dba565b60405180910390f35b3480156104ca57600080fd5b506104e560048036038101906104e091906135fd565b610e12565b005b3480156104f357600080fd5b5061050e6004803603810190610509919061356a565b610ea0565b005b34801561051c57600080fd5b50610525610f36565b6040516105329190613dba565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d91906135ab565b610f3c565b60405161056f9190613a96565b60405180910390f35b34801561058457600080fd5b5061058d610fee565b60405161059a9190613b18565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c59190613330565b61107c565b6040516105d79190613dba565b60405180910390f35b3480156105ec57600080fd5b506105f5611134565b005b610611600480360381019061060c9190613330565b6111bc565b60405161061e9190613dba565b60405180910390f35b34801561063357600080fd5b5061064e600480360381019061064991906134d7565b6113f6565b005b61066a6004803603810190610665919061349b565b61152d565b005b34801561067857600080fd5b5061068161178d565b60405161068e9190613a96565b60405180910390f35b3480156106a357600080fd5b506106ac6117b7565b6040516106b99190613b18565b60405180910390f35b3480156106ce57600080fd5b506106e960048036038101906106e49190613330565b611849565b6040516106f69190613dba565b60405180910390f35b34801561070b57600080fd5b506107266004803603810190610721919061345f565b611861565b005b34801561073457600080fd5b5061073d611877565b60405161074a9190613a96565b60405180910390f35b34801561075f57600080fd5b5061077a60048036038101906107759190613330565b61189d565b6040516107879190613dba565b60405180910390f35b34801561079c57600080fd5b506107b760048036038101906107b291906133e4565b611a07565b005b3480156107c557600080fd5b506107ce611a69565b6040516107db9190613dba565b60405180910390f35b3480156107f057600080fd5b5061080b600480360381019061080691906135ab565b611a6f565b6040516108189190613b18565b60405180910390f35b34801561082d57600080fd5b5061084860048036038101906108439190613359565b611aa3565b6040516108559190613afd565b60405180910390f35b34801561086a57600080fd5b50610873611b37565b6040516108809190613dba565b60405180910390f35b34801561089557600080fd5b506108b060048036038101906108ab9190613330565b611b3d565b005b60006108bd82611c35565b9050919050565b6060600080546108d3906140ab565b80601f01602080910402602001604051908101604052809291908181526020018280546108ff906140ab565b801561094c5780601f106109215761010080835404028352916020019161094c565b820191906000526020600020905b81548152906001019060200180831161092f57829003601f168201915b5050505050905090565b600061096182611caf565b6109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099790613d1a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109e682610f3c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4e90613d5a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a76611d1b565b73ffffffffffffffffffffffffffffffffffffffff161480610aa55750610aa481610a9f611d1b565b611aa3565b5b610ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adb90613c5a565b60405180910390fd5b610aee8383611d23565b505050565b610afb611d1b565b73ffffffffffffffffffffffffffffffffffffffff16610b1961178d565b73ffffffffffffffffffffffffffffffffffffffff1614610b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6690613d3a565b60405180910390fd5b80600f8190555050565b6000600880549050905090565b610b97610b91611d1b565b82611ddc565b610bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcd90613d7a565b60405180910390fd5b610be1838383611eba565b505050565b6000610bf18361107c565b8210610c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2990613b5a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60136020528060005260406000206000915054906101000a900460ff1681565b610cc683838360405180602001604052806000815250611a07565b505050565b803373ffffffffffffffffffffffffffffffffffffffff16610cec82610f3c565b73ffffffffffffffffffffffffffffffffffffffff1614610d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3990613b3a565b60405180910390fd5b610d4b82612121565b5050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b6000610d85610b79565b8210610dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbd90613d9a565b60405180910390fd5b60088281548110610e00577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610e1a611d1b565b73ffffffffffffffffffffffffffffffffffffffff16610e3861178d565b73ffffffffffffffffffffffffffffffffffffffff1614610e8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8590613d3a565b60405180910390fd5b81600d8190555080600e819055505050565b610ea8611d1b565b73ffffffffffffffffffffffffffffffffffffffff16610ec661178d565b73ffffffffffffffffffffffffffffffffffffffff1614610f1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1390613d3a565b60405180910390fd5b80600c9080519060200190610f329291906130a9565b5050565b600d5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdc90613c9a565b60405180910390fd5b80915050919050565b600c8054610ffb906140ab565b80601f0160208091040260200160405190810160405280929190818152602001828054611027906140ab565b80156110745780601f1061104957610100808354040283529160200191611074565b820191906000526020600020905b81548152906001019060200180831161105757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e490613c7a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61113c611d1b565b73ffffffffffffffffffffffffffffffffffffffff1661115a61178d565b73ffffffffffffffffffffffffffffffffffffffff16146111b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a790613d3a565b60405180910390fd5b6111ba600061212d565b565b60006111c73361189d565b3414611208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ff90613cba565b60405180910390fd5b601054601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061128b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128290613cda565b60405180910390fd5b6001601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112db9190613ee0565b925050819055506112ec600b6121f3565b6112ff826112fa600b612209565b612217565b600060646002346113109190613f67565b61131a9190613f36565b90506000813461132a9190613fc1565b9050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611394573d6000803e3d6000fd5b5061139d61178d565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156113e2573d6000803e3d6000fd5b506113ed600b612209565b92505050919050565b6113fe611d1b565b73ffffffffffffffffffffffffffffffffffffffff1661141c61178d565b73ffffffffffffffffffffffffffffffffffffffff1614611472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146990613d3a565b60405180910390fd5b60005b8151811015611529576001601360008484815181106114bd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806115219061410e565b915050611475565b5050565b60105481601460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461157b9190613ee0565b11156115bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b390613cda565b60405180910390fd5b80601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461160b9190613ee0565b925050819055508061161c3361189d565b6116269190613f67565b3414611667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165e90613cba565b60405180910390fd5b60005b818110156116a25761167c600b6121f3565b61168f8361168a600b612209565b612217565b808061169a9061410e565b91505061166a565b50600060646002346116b49190613f67565b6116be9190613f36565b9050600081346116ce9190613fc1565b9050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611738573d6000803e3d6000fd5b5061174161178d565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611786573d6000803e3d6000fd5b5050505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546117c6906140ab565b80601f01602080910402602001604051908101604052809291908181526020018280546117f2906140ab565b801561183f5780601f106118145761010080835404028352916020019161183f565b820191906000526020600020905b81548152906001019060200180831161182257829003601f168201915b5050505050905090565b60146020528060005260406000206000915090505481565b61187361186c611d1b565b8383612235565b5050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006118a761178d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118e35760009050611a02565b6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016119409190613a96565b60206040518083038186803b15801561195857600080fd5b505afa15801561196c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199091906135d4565b11156119a057600f549050611a02565b601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156119fc57600e549050611a02565b600d5490505b919050565b611a18611a12611d1b565b83611ddc565b611a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4e90613d7a565b60405180910390fd5b611a63848484846123a2565b50505050565b600e5481565b6060600c611a7c836123fe565b604051602001611a8d929190613a67565b6040516020818303038152906040529050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f5481565b611b45611d1b565b73ffffffffffffffffffffffffffffffffffffffff16611b6361178d565b73ffffffffffffffffffffffffffffffffffffffff1614611bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb090613d3a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2090613b9a565b60405180910390fd5b611c328161212d565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ca85750611ca7826125ab565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d9683610f3c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611de782611caf565b611e26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1d90613c3a565b60405180910390fd5b6000611e3183610f3c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ea057508373ffffffffffffffffffffffffffffffffffffffff16611e8884610956565b73ffffffffffffffffffffffffffffffffffffffff16145b80611eb15750611eb08185611aa3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611eda82610f3c565b73ffffffffffffffffffffffffffffffffffffffff1614611f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2790613bba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9790613bfa565b60405180910390fd5b611fab83838361268d565b611fb6600082611d23565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120069190613fc1565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461205d9190613ee0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461211c83838361269d565b505050565b61212a816126a2565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b600081600001549050919050565b6122318282604051806020016040528060008152506127bf565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229b90613c1a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123959190613afd565b60405180910390a3505050565b6123ad848484611eba565b6123b98484848461281a565b6123f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ef90613b7a565b60405180910390fd5b50505050565b60606000821415612446576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125a6565b600082905060005b600082146124785780806124619061410e565b915050600a826124719190613f36565b915061244e565b60008167ffffffffffffffff8111156124ba577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124ec5781602001600182028036833780820191505090505b5090505b6000851461259f576001826125059190613fc1565b9150600a856125149190614157565b60306125209190613ee0565b60f81b81838151811061255c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125989190613f36565b94506124f0565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061267657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126865750612685826129b1565b5b9050919050565b612698838383612a1b565b505050565b505050565b60006126ad82610f3c565b90506126bb8160008461268d565b6126c6600083611d23565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127169190613fc1565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127bb8160008461269d565b5050565b6127c98383612b2f565b6127d6600084848461281a565b612815576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280c90613b7a565b60405180910390fd5b505050565b600061283b8473ffffffffffffffffffffffffffffffffffffffff16612d09565b156129a4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612864611d1b565b8786866040518563ffffffff1660e01b81526004016128869493929190613ab1565b602060405180830381600087803b1580156128a057600080fd5b505af19250505080156128d157506040513d601f19601f820116820180604052508101906128ce9190613541565b60015b612954573d8060008114612901576040519150601f19603f3d011682016040523d82523d6000602084013e612906565b606091505b5060008151141561294c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294390613b7a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129a9565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612a26838383612d2c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a6957612a6481612d31565b612aa8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612aa757612aa68382612d7a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612aeb57612ae681612ee7565b612b2a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b2957612b28828261302a565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9690613cfa565b60405180910390fd5b612ba881611caf565b15612be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bdf90613bda565b60405180910390fd5b612bf46000838361268d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c449190613ee0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d056000838361269d565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d878461107c565b612d919190613fc1565b9050600060076000848152602001908152602001600020549050818114612e76576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612efb9190613fc1565b9050600060096000848152602001908152602001600020549050600060088381548110612f51577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612f99577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061300e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006130358361107c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546130b5906140ab565b90600052602060002090601f0160209004810192826130d7576000855561311e565b82601f106130f057805160ff191683800117855561311e565b8280016001018555821561311e579182015b8281111561311d578251825591602001919060010190613102565b5b50905061312b919061312f565b5090565b5b80821115613148576000816000905550600101613130565b5090565b600061315f61315a84613dfa565b613dd5565b9050808382526020820190508285602086028201111561317e57600080fd5b60005b858110156131ae57816131948882613234565b845260208401935060208301925050600181019050613181565b5050509392505050565b60006131cb6131c684613e26565b613dd5565b9050828152602081018484840111156131e357600080fd5b6131ee848285614069565b509392505050565b600061320961320484613e57565b613dd5565b90508281526020810184848401111561322157600080fd5b61322c848285614069565b509392505050565b600081359050613243816147a0565b92915050565b600082601f83011261325a57600080fd5b813561326a84826020860161314c565b91505092915050565b600081359050613282816147b7565b92915050565b600081359050613297816147ce565b92915050565b6000815190506132ac816147ce565b92915050565b600082601f8301126132c357600080fd5b81356132d38482602086016131b8565b91505092915050565b600082601f8301126132ed57600080fd5b81356132fd8482602086016131f6565b91505092915050565b600081359050613315816147e5565b92915050565b60008151905061332a816147e5565b92915050565b60006020828403121561334257600080fd5b600061335084828501613234565b91505092915050565b6000806040838503121561336c57600080fd5b600061337a85828601613234565b925050602061338b85828601613234565b9150509250929050565b6000806000606084860312156133aa57600080fd5b60006133b886828701613234565b93505060206133c986828701613234565b92505060406133da86828701613306565b9150509250925092565b600080600080608085870312156133fa57600080fd5b600061340887828801613234565b945050602061341987828801613234565b935050604061342a87828801613306565b925050606085013567ffffffffffffffff81111561344757600080fd5b613453878288016132b2565b91505092959194509250565b6000806040838503121561347257600080fd5b600061348085828601613234565b925050602061349185828601613273565b9150509250929050565b600080604083850312156134ae57600080fd5b60006134bc85828601613234565b92505060206134cd85828601613306565b9150509250929050565b6000602082840312156134e957600080fd5b600082013567ffffffffffffffff81111561350357600080fd5b61350f84828501613249565b91505092915050565b60006020828403121561352a57600080fd5b600061353884828501613288565b91505092915050565b60006020828403121561355357600080fd5b60006135618482850161329d565b91505092915050565b60006020828403121561357c57600080fd5b600082013567ffffffffffffffff81111561359657600080fd5b6135a2848285016132dc565b91505092915050565b6000602082840312156135bd57600080fd5b60006135cb84828501613306565b91505092915050565b6000602082840312156135e657600080fd5b60006135f48482850161331b565b91505092915050565b6000806040838503121561361057600080fd5b600061361e85828601613306565b925050602061362f85828601613306565b9150509250929050565b61364281613ff5565b82525050565b61365181614007565b82525050565b600061366282613e9d565b61366c8185613eb3565b935061367c818560208601614078565b61368581614244565b840191505092915050565b600061369b82613ea8565b6136a58185613ec4565b93506136b5818560208601614078565b6136be81614244565b840191505092915050565b60006136d482613ea8565b6136de8185613ed5565b93506136ee818560208601614078565b80840191505092915050565b60008154613707816140ab565b6137118186613ed5565b9450600182166000811461372c576001811461373d57613770565b60ff19831686528186019350613770565b61374685613e88565b60005b8381101561376857815481890152600182019150602081019050613749565b838801955050505b50505092915050565b6000613786601f83613ec4565b915061379182614255565b602082019050919050565b60006137a9602b83613ec4565b91506137b48261427e565b604082019050919050565b60006137cc603283613ec4565b91506137d7826142cd565b604082019050919050565b60006137ef602683613ec4565b91506137fa8261431c565b604082019050919050565b6000613812602583613ec4565b915061381d8261436b565b604082019050919050565b6000613835601c83613ec4565b9150613840826143ba565b602082019050919050565b6000613858602483613ec4565b9150613863826143e3565b604082019050919050565b600061387b601983613ec4565b915061388682614432565b602082019050919050565b600061389e602c83613ec4565b91506138a98261445b565b604082019050919050565b60006138c1603883613ec4565b91506138cc826144aa565b604082019050919050565b60006138e4602a83613ec4565b91506138ef826144f9565b604082019050919050565b6000613907602983613ec4565b915061391282614548565b604082019050919050565b600061392a600c83613ec4565b915061393582614597565b602082019050919050565b600061394d600d83613ec4565b9150613958826145c0565b602082019050919050565b6000613970602083613ec4565b915061397b826145e9565b602082019050919050565b6000613993602c83613ec4565b915061399e82614612565b604082019050919050565b60006139b6600583613ed5565b91506139c182614661565b600582019050919050565b60006139d9602083613ec4565b91506139e48261468a565b602082019050919050565b60006139fc602183613ec4565b9150613a07826146b3565b604082019050919050565b6000613a1f603183613ec4565b9150613a2a82614702565b604082019050919050565b6000613a42602c83613ec4565b9150613a4d82614751565b604082019050919050565b613a618161405f565b82525050565b6000613a7382856136fa565b9150613a7f82846136c9565b9150613a8a826139a9565b91508190509392505050565b6000602082019050613aab6000830184613639565b92915050565b6000608082019050613ac66000830187613639565b613ad36020830186613639565b613ae06040830185613a58565b8181036060830152613af28184613657565b905095945050505050565b6000602082019050613b126000830184613648565b92915050565b60006020820190508181036000830152613b328184613690565b905092915050565b60006020820190508181036000830152613b5381613779565b9050919050565b60006020820190508181036000830152613b738161379c565b9050919050565b60006020820190508181036000830152613b93816137bf565b9050919050565b60006020820190508181036000830152613bb3816137e2565b9050919050565b60006020820190508181036000830152613bd381613805565b9050919050565b60006020820190508181036000830152613bf381613828565b9050919050565b60006020820190508181036000830152613c138161384b565b9050919050565b60006020820190508181036000830152613c338161386e565b9050919050565b60006020820190508181036000830152613c5381613891565b9050919050565b60006020820190508181036000830152613c73816138b4565b9050919050565b60006020820190508181036000830152613c93816138d7565b9050919050565b60006020820190508181036000830152613cb3816138fa565b9050919050565b60006020820190508181036000830152613cd38161391d565b9050919050565b60006020820190508181036000830152613cf381613940565b9050919050565b60006020820190508181036000830152613d1381613963565b9050919050565b60006020820190508181036000830152613d3381613986565b9050919050565b60006020820190508181036000830152613d53816139cc565b9050919050565b60006020820190508181036000830152613d73816139ef565b9050919050565b60006020820190508181036000830152613d9381613a12565b9050919050565b60006020820190508181036000830152613db381613a35565b9050919050565b6000602082019050613dcf6000830184613a58565b92915050565b6000613ddf613df0565b9050613deb82826140dd565b919050565b6000604051905090565b600067ffffffffffffffff821115613e1557613e14614215565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613e4157613e40614215565b5b613e4a82614244565b9050602081019050919050565b600067ffffffffffffffff821115613e7257613e71614215565b5b613e7b82614244565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613eeb8261405f565b9150613ef68361405f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f2b57613f2a614188565b5b828201905092915050565b6000613f418261405f565b9150613f4c8361405f565b925082613f5c57613f5b6141b7565b5b828204905092915050565b6000613f728261405f565b9150613f7d8361405f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613fb657613fb5614188565b5b828202905092915050565b6000613fcc8261405f565b9150613fd78361405f565b925082821015613fea57613fe9614188565b5b828203905092915050565b60006140008261403f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561409657808201518184015260208101905061407b565b838111156140a5576000848401525b50505050565b600060028204905060018216806140c357607f821691505b602082108114156140d7576140d66141e6565b5b50919050565b6140e682614244565b810181811067ffffffffffffffff8211171561410557614104614215565b5b80604052505050565b60006141198261405f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561414c5761414b614188565b5b600182019050919050565b60006141628261405f565b915061416d8361405f565b92508261417d5761417c6141b7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e6572734f6e6c793a204f4e4c595f4f574e4552535f414c4c4f57454400600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f466565206d69736d617463680000000000000000000000000000000000000000600082015250565b7f6c696d6974207265616368656400000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6147a981613ff5565b81146147b457600080fd5b50565b6147c081614007565b81146147cb57600080fd5b50565b6147d781614013565b81146147e257600080fd5b50565b6147ee8161405f565b81146147f957600080fd5b5056fea2646970667358221220802e0ed3763eba6a624250a826a57629541e66e4f754b70f203616eaa96337cc64736f6c634300080400330000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000002b5e3af16b18800000000000000000000000000000000000000000000000000015af1d78b58c400000000000000000000000000000000000000000000000000015af1d78b58c40000000000000000000000000000a506b3938377635fa9c091e9af8748fa1c9a2424000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000ad78ebc5ac620000000000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000000000000000000000000000000000000000000b576f726c6420576169667500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055741494655000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c68747470733a2f2f636f72676973747564696f2e667261312e6469676974616c6f6365616e7370616365732e636f6d2f5741494655313636313034363531323939382f6d657461646174612f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a788d847f4a0a3d7d7a453e6b1d0949a6477853d

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

0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000002b5e3af16b18800000000000000000000000000000000000000000000000000015af1d78b58c400000000000000000000000000000000000000000000000000015af1d78b58c40000000000000000000000000000a506b3938377635fa9c091e9af8748fa1c9a2424000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000ad78ebc5ac620000000000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000000000000000000000000000000000000000000b576f726c6420576169667500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055741494655000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c68747470733a2f2f636f72676973747564696f2e667261312e6469676974616c6f6365616e7370616365732e636f6d2f5741494655313636313034363531323939382f6d657461646174612f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a788d847f4a0a3d7d7a453e6b1d0949a6477853d

-----Decoded View---------------
Arg [0] : _name (string): World Waifu
Arg [1] : _symbol (string): WAIFU
Arg [2] : _uri (string): https://corgistudio.fra1.digitaloceanspaces.com/WAIFU1661046512998/metadata/
Arg [3] : _publicFee (uint256): 50000000000000000000
Arg [4] : _whiteListFee (uint256): 25000000000000000000
Arg [5] : _corgiHolderFee (uint256): 25000000000000000000
Arg [6] : _corgiAddress (address): 0xa506b3938377635fa9c091e9af8748fa1c9a2424
Arg [7] : _whiteListAddress (address[]): 0xa788d847f4a0a3d7d7a453e6b1d0949a6477853d
Arg [8] : deployFee (uint256): 200000000000000000000
Arg [9] : _userLimit (uint256): 250

-----Encoded View---------------
20 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [3] : 000000000000000000000000000000000000000000000002b5e3af16b1880000
Arg [4] : 0000000000000000000000000000000000000000000000015af1d78b58c40000
Arg [5] : 0000000000000000000000000000000000000000000000015af1d78b58c40000
Arg [6] : 000000000000000000000000a506b3938377635fa9c091e9af8748fa1c9a2424
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000240
Arg [8] : 00000000000000000000000000000000000000000000000ad78ebc5ac6200000
Arg [9] : 00000000000000000000000000000000000000000000000000000000000000fa
Arg [10] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [11] : 576f726c64205761696675000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [13] : 5741494655000000000000000000000000000000000000000000000000000000
Arg [14] : 000000000000000000000000000000000000000000000000000000000000004c
Arg [15] : 68747470733a2f2f636f72676973747564696f2e667261312e6469676974616c
Arg [16] : 6f6365616e7370616365732e636f6d2f57414946553136363130343635313239
Arg [17] : 39382f6d657461646174612f0000000000000000000000000000000000000000
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [19] : 000000000000000000000000a788d847f4a0a3d7d7a453e6b1d0949a6477853d


Deployed ByteCode Sourcemap

54264:4542:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58349:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22703:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24262:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23785:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56197:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37621:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25012:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37289:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54707:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25422:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57962:78;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54628:70;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54562:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37811:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56039:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56540:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54470:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22397:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54440:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22127:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44851:103;;;;;;;;;;;;;:::i;:::-;;56638:608;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56322:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57254:700;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44200:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22872:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54755:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24555:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54592:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55683:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25678:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54498:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58545:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24781:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54529:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45109:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58349:188;58464:4;58493:36;58517:11;58493:23;:36::i;:::-;58486:43;;58349:188;;;:::o;22703:100::-;22757:13;22790:5;22783:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22703:100;:::o;24262:221::-;24338:7;24366:16;24374:7;24366;:16::i;:::-;24358:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24451:15;:24;24467:7;24451:24;;;;;;;;;;;;;;;;;;;;;24444:31;;24262:221;;;:::o;23785:411::-;23866:13;23882:23;23897:7;23882:14;:23::i;:::-;23866:39;;23930:5;23924:11;;:2;:11;;;;23916:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24024:5;24008:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24033:37;24050:5;24057:12;:10;:12::i;:::-;24033:16;:37::i;:::-;24008:62;23986:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24167:21;24176:2;24180:7;24167:8;:21::i;:::-;23785:411;;;:::o;56197:117::-;44431:12;:10;:12::i;:::-;44420:23;;:7;:5;:7::i;:::-;:23;;;44412:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56291:15:::1;56274:14;:32;;;;56197:117:::0;:::o;37621:113::-;37682:7;37709:10;:17;;;;37702:24;;37621:113;:::o;25012:339::-;25207:41;25226:12;:10;:12::i;:::-;25240:7;25207:18;:41::i;:::-;25199:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25315:28;25325:4;25331:2;25335:7;25315:9;:28::i;:::-;25012:339;;;:::o;37289:256::-;37386:7;37422:23;37439:5;37422:16;:23::i;:::-;37414:5;:31;37406:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37511:12;:19;37524:5;37511:19;;;;;;;;;;;;;;;:26;37531:5;37511:26;;;;;;;;;;;;37504:33;;37289:256;;;;:::o;54707:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;25422:185::-;25560:39;25577:4;25583:2;25587:7;25560:39;;;;;;;;;;;;:16;:39::i;:::-;25422:185;;;:::o;57962:78::-;58006:3;54881:10;54865:26;;:12;54873:3;54865:7;:12::i;:::-;:26;;;54857:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;58022:10:::1;58028:3;58022:5;:10::i;:::-;57962:78:::0;;:::o;54628:70::-;;;;;;;;;;;;;:::o;54562:21::-;;;;:::o;37811:233::-;37886:7;37922:30;:28;:30::i;:::-;37914:5;:38;37906:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38019:10;38030:5;38019:17;;;;;;;;;;;;;;;;;;;;;;;;38012:24;;37811:233;;;:::o;56039:150::-;44431:12;:10;:12::i;:::-;44420:23;;:7;:5;:7::i;:::-;:23;;;44412:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56132:10:::1;56120:9;:22;;;;56168:13;56153:12;:28;;;;56039:150:::0;;:::o;56540:90::-;44431:12;:10;:12::i;:::-;44420:23;;:7;:5;:7::i;:::-;:23;;;44412:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56618:4:::1;56608:7;:14;;;;;;;;;;;;:::i;:::-;;56540:90:::0;:::o;54470:21::-;;;;:::o;22397:239::-;22469:7;22489:13;22505:7;:16;22513:7;22505:16;;;;;;;;;;;;;;;;;;;;;22489:32;;22557:1;22540:19;;:5;:19;;;;22532:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22623:5;22616:12;;;22397:239;;;:::o;54440:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22127:208::-;22199:7;22244:1;22227:19;;:5;:19;;;;22219:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22311:9;:16;22321:5;22311:16;;;;;;;;;;;;;;;;22304:23;;22127:208;;;:::o;44851:103::-;44431:12;:10;:12::i;:::-;44420:23;;:7;:5;:7::i;:::-;:23;;;44412:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44916:30:::1;44943:1;44916:18;:30::i;:::-;44851:103::o:0;56638:608::-;56701:7;56742:18;56749:10;56742:6;:18::i;:::-;56729:9;:31;56721:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;56829:9;;56796:15;:30;56812:13;56796:30;;;;;;;;;;;;;;;;:42;56788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56901:1;56867:15;:30;56883:13;56867:30;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;56915:20;:8;:18;:20::i;:::-;56948:44;56958:13;56973:18;:8;:16;:18::i;:::-;56948:9;:44::i;:::-;57003:17;57039:3;57035:1;57023:9;:13;;;;:::i;:::-;:19;;;;:::i;:::-;57003:39;;57053:17;57085:12;57073:9;:24;;;;:::i;:::-;57053:44;;57116:10;;;;;;;;;;;57108:28;;:42;57137:12;57108:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57169:7;:5;:7::i;:::-;57161:25;;:39;57187:12;57161:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57220:18;:8;:16;:18::i;:::-;57213:25;;;;56638:608;;;:::o;56322:210::-;44431:12;:10;:12::i;:::-;44420:23;;:7;:5;:7::i;:::-;:23;;;44412:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56413:6:::1;56408:117;56429:17;:24;56425:1;:28;56408:117;;;56509:4;56475:9;:31;56485:17;56503:1;56485:20;;;;;;;;;;;;;;;;;;;;;;56475:31;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;56455:3;;;;;:::i;:::-;;;;56408:117;;;;56322:210:::0;:::o;57254:700::-;57418:9;;57405;57372:15;:30;57388:13;57372:30;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;:55;;57364:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;57490:9;57456:15;:30;57472:13;57456:30;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;57553:9;57532:18;57539:10;57532:6;:18::i;:::-;:30;;;;:::i;:::-;57518:9;:45;57510:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;57596:9;57591:146;57615:9;57611:1;:13;57591:146;;;57646:20;:8;:18;:20::i;:::-;57681:44;57691:13;57706:18;:8;:16;:18::i;:::-;57681:9;:44::i;:::-;57626:3;;;;;:::i;:::-;;;;57591:146;;;;57749:17;57785:3;57781:1;57769:9;:13;;;;:::i;:::-;:19;;;;:::i;:::-;57749:39;;57799:17;57831:12;57819:9;:24;;;;:::i;:::-;57799:44;;57862:10;;;;;;;;;;;57854:28;;:42;57883:12;57854:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57915:7;:5;:7::i;:::-;57907:25;;:39;57933:12;57907:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57254:700;;;;:::o;44200:87::-;44246:7;44273:6;;;;;;;;;;;44266:13;;44200:87;:::o;22872:104::-;22928:13;22961:7;22954:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22872:104;:::o;54755:50::-;;;;;;;;;;;;;;;;;:::o;24555:155::-;24650:52;24669:12;:10;:12::i;:::-;24683:8;24693;24650:18;:52::i;:::-;24555:155;;:::o;54592:27::-;;;;;;;;;;;;;:::o;55683:348::-;55736:4;55767:7;:5;:7::i;:::-;55757:17;;:6;:17;;;55753:58;;;55798:1;55791:8;;;;55753:58;55867:1;55833:12;;;;;;;;;;;55825:31;;;55857:6;55825:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;55821:97;;;55892:14;;55885:21;;;;55821:97;55932:9;:17;55942:6;55932:17;;;;;;;;;;;;;;;;;;;;;;;;;55928:69;;;55973:12;;55966:19;;;;55928:69;56014:9;;56007:16;;55683:348;;;;:::o;25678:328::-;25853:41;25872:12;:10;:12::i;:::-;25886:7;25853:18;:41::i;:::-;25845:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25959:39;25973:4;25979:2;25983:7;25992:5;25959:13;:39::i;:::-;25678:328;;;;:::o;54498:24::-;;;;:::o;58545:258::-;58638:13;58714:7;58736:25;58753:7;58736:16;:25::i;:::-;58683:101;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58669:126;;58545:258;;;:::o;24781:164::-;24878:4;24902:18;:25;24921:5;24902:25;;;;;;;;;;;;;;;:35;24928:8;24902:35;;;;;;;;;;;;;;;;;;;;;;;;;24895:42;;24781:164;;;;:::o;54529:26::-;;;;:::o;45109:201::-;44431:12;:10;:12::i;:::-;44420:23;;:7;:5;:7::i;:::-;:23;;;44412:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45218:1:::1;45198:22;;:8;:22;;;;45190:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45274:28;45293:8;45274:18;:28::i;:::-;45109:201:::0;:::o;36981:224::-;37083:4;37122:35;37107:50;;;:11;:50;;;;:90;;;;37161:36;37185:11;37161:23;:36::i;:::-;37107:90;37100:97;;36981:224;;;:::o;27516:127::-;27581:4;27633:1;27605:30;;:7;:16;27613:7;27605:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27598:37;;27516:127;;;:::o;16955:98::-;17008:7;17035:10;17028:17;;16955:98;:::o;31662:174::-;31764:2;31737:15;:24;31753:7;31737:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31820:7;31816:2;31782:46;;31791:23;31806:7;31791:14;:23::i;:::-;31782:46;;;;;;;;;;;;31662:174;;:::o;27810:348::-;27903:4;27928:16;27936:7;27928;:16::i;:::-;27920:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28004:13;28020:23;28035:7;28020:14;:23::i;:::-;28004:39;;28073:5;28062:16;;:7;:16;;;:51;;;;28106:7;28082:31;;:20;28094:7;28082:11;:20::i;:::-;:31;;;28062:51;:87;;;;28117:32;28134:5;28141:7;28117:16;:32::i;:::-;28062:87;28054:96;;;27810:348;;;;:::o;30919:625::-;31078:4;31051:31;;:23;31066:7;31051:14;:23::i;:::-;:31;;;31043:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31157:1;31143:16;;:2;:16;;;;31135:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31213:39;31234:4;31240:2;31244:7;31213:20;:39::i;:::-;31317:29;31334:1;31338:7;31317:8;:29::i;:::-;31378:1;31359:9;:15;31369:4;31359:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31407:1;31390:9;:13;31400:2;31390:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31438:2;31419:7;:16;31427:7;31419:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31477:7;31473:2;31458:27;;31467:4;31458:27;;;;;;;;;;;;31498:38;31518:4;31524:2;31528:7;31498:19;:38::i;:::-;30919:625;;;:::o;58244:97::-;58313:20;58325:7;58313:11;:20::i;:::-;58244:97;:::o;45470:191::-;45544:16;45563:6;;;;;;;;;;;45544:25;;45589:8;45580:6;;:17;;;;;;;;;;;;;;;;;;45644:8;45613:40;;45634:8;45613:40;;;;;;;;;;;;45470:191;;:::o;46673:127::-;46780:1;46762:7;:14;;;:19;;;;;;;;;;;46673:127;:::o;46551:114::-;46616:7;46643;:14;;;46636:21;;46551:114;;;:::o;28500:110::-;28576:26;28586:2;28590:7;28576:26;;;;;;;;;;;;:9;:26::i;:::-;28500:110;;:::o;31978:315::-;32133:8;32124:17;;:5;:17;;;;32116:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32220:8;32182:18;:25;32201:5;32182:25;;;;;;;;;;;;;;;:35;32208:8;32182:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32266:8;32244:41;;32259:5;32244:41;;;32276:8;32244:41;;;;;;:::i;:::-;;;;;;;;31978:315;;;:::o;26888:::-;27045:28;27055:4;27061:2;27065:7;27045:9;:28::i;:::-;27092:48;27115:4;27121:2;27125:7;27134:5;27092:22;:48::i;:::-;27084:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26888:315;;;;:::o;17545:723::-;17601:13;17831:1;17822:5;:10;17818:53;;;17849:10;;;;;;;;;;;;;;;;;;;;;17818:53;17881:12;17896:5;17881:20;;17912:14;17937:78;17952:1;17944:4;:9;17937:78;;17970:8;;;;;:::i;:::-;;;;18001:2;17993:10;;;;;:::i;:::-;;;17937:78;;;18025:19;18057:6;18047:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18025:39;;18075:154;18091:1;18082:5;:10;18075:154;;18119:1;18109:11;;;;;:::i;:::-;;;18186:2;18178:5;:10;;;;:::i;:::-;18165:2;:24;;;;:::i;:::-;18152:39;;18135:6;18142;18135:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;18215:2;18206:11;;;;;:::i;:::-;;;18075:154;;;18253:6;18239:21;;;;;17545:723;;;;:::o;21758:305::-;21860:4;21912:25;21897:40;;;:11;:40;;;;:105;;;;21969:33;21954:48;;;:11;:48;;;;21897:105;:158;;;;22019:36;22043:11;22019:23;:36::i;:::-;21897:158;21877:178;;21758:305;;;:::o;58048:188::-;58183:45;58210:4;58216:2;58220:7;58183:26;:45::i;:::-;58048:188;;;:::o;34740:125::-;;;;:::o;30162:420::-;30222:13;30238:23;30253:7;30238:14;:23::i;:::-;30222:39;;30274:48;30295:5;30310:1;30314:7;30274:20;:48::i;:::-;30363:29;30380:1;30384:7;30363:8;:29::i;:::-;30425:1;30405:9;:16;30415:5;30405:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;30444:7;:16;30452:7;30444:16;;;;;;;;;;;;30437:23;;;;;;;;;;;30506:7;30502:1;30478:36;;30487:5;30478:36;;;;;;;;;;;;30527:47;30547:5;30562:1;30566:7;30527:19;:47::i;:::-;30162:420;;:::o;28837:321::-;28967:18;28973:2;28977:7;28967:5;:18::i;:::-;29018:54;29049:1;29053:2;29057:7;29066:5;29018:22;:54::i;:::-;28996:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28837:321;;;:::o;32858:799::-;33013:4;33034:15;:2;:13;;;:15::i;:::-;33030:620;;;33086:2;33070:36;;;33107:12;:10;:12::i;:::-;33121:4;33127:7;33136:5;33070:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33066:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33329:1;33312:6;:13;:18;33308:272;;;33355:60;;;;;;;;;;:::i;:::-;;;;;;;;33308:272;33530:6;33524:13;33515:6;33511:2;33507:15;33500:38;33066:529;33203:41;;;33193:51;;;:6;:51;;;;33186:58;;;;;33030:620;33634:4;33627:11;;32858:799;;;;;;;:::o;20178:157::-;20263:4;20302:25;20287:40;;;:11;:40;;;;20280:47;;20178:157;;;:::o;38657:589::-;38801:45;38828:4;38834:2;38838:7;38801:26;:45::i;:::-;38879:1;38863:18;;:4;:18;;;38859:187;;;38898:40;38930:7;38898:31;:40::i;:::-;38859:187;;;38968:2;38960:10;;:4;:10;;;38956:90;;38987:47;39020:4;39026:7;38987:32;:47::i;:::-;38956:90;38859:187;39074:1;39060:16;;:2;:16;;;39056:183;;;39093:45;39130:7;39093:36;:45::i;:::-;39056:183;;;39166:4;39160:10;;:2;:10;;;39156:83;;39187:40;39215:2;39219:7;39187:27;:40::i;:::-;39156:83;39056:183;38657:589;;;:::o;29494:439::-;29588:1;29574:16;;:2;:16;;;;29566:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29647:16;29655:7;29647;:16::i;:::-;29646:17;29638:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29709:45;29738:1;29742:2;29746:7;29709:20;:45::i;:::-;29784:1;29767:9;:13;29777:2;29767:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29815:2;29796:7;:16;29804:7;29796:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29860:7;29856:2;29835:33;;29852:1;29835:33;;;;;;;;;;;;29881:44;29909:1;29913:2;29917:7;29881:19;:44::i;:::-;29494:439;;:::o;8995:326::-;9055:4;9312:1;9290:7;:19;;;:23;9283:30;;8995:326;;;:::o;34229:126::-;;;;:::o;39969:164::-;40073:10;:17;;;;40046:15;:24;40062:7;40046:24;;;;;;;;;;;:44;;;;40101:10;40117:7;40101:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39969:164;:::o;40760:988::-;41026:22;41076:1;41051:22;41068:4;41051:16;:22::i;:::-;:26;;;;:::i;:::-;41026:51;;41088:18;41109:17;:26;41127:7;41109:26;;;;;;;;;;;;41088:47;;41256:14;41242:10;:28;41238:328;;41287:19;41309:12;:18;41322:4;41309:18;;;;;;;;;;;;;;;:34;41328:14;41309:34;;;;;;;;;;;;41287:56;;41393:11;41360:12;:18;41373:4;41360:18;;;;;;;;;;;;;;;:30;41379:10;41360:30;;;;;;;;;;;:44;;;;41510:10;41477:17;:30;41495:11;41477:30;;;;;;;;;;;:43;;;;41238:328;;41662:17;:26;41680:7;41662:26;;;;;;;;;;;41655:33;;;41706:12;:18;41719:4;41706:18;;;;;;;;;;;;;;;:34;41725:14;41706:34;;;;;;;;;;;41699:41;;;40760:988;;;;:::o;42043:1079::-;42296:22;42341:1;42321:10;:17;;;;:21;;;;:::i;:::-;42296:46;;42353:18;42374:15;:24;42390:7;42374:24;;;;;;;;;;;;42353:45;;42725:19;42747:10;42758:14;42747:26;;;;;;;;;;;;;;;;;;;;;;;;42725:48;;42811:11;42786:10;42797;42786:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;42922:10;42891:15;:28;42907:11;42891:28;;;;;;;;;;;:41;;;;43063:15;:24;43079:7;43063:24;;;;;;;;;;;43056:31;;;43098:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42043:1079;;;;:::o;39547:221::-;39632:14;39649:20;39666:2;39649:16;:20::i;:::-;39632:37;;39707:7;39680:12;:16;39693:2;39680:16;;;;;;;;;;;;;;;:24;39697:6;39680:24;;;;;;;;;;;:34;;;;39754:6;39725:17;:26;39743:7;39725:26;;;;;;;;;;;:35;;;;39547:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;685:343::-;762:5;787:65;803:48;844:6;803:48;:::i;:::-;787:65;:::i;:::-;778:74;;875:6;868:5;861:21;913:4;906:5;902:16;951:3;942:6;937:3;933:16;930:25;927:2;;;968:1;965;958:12;927:2;981:41;1015:6;1010:3;1005;981:41;:::i;:::-;768:260;;;;;;:::o;1034:345::-;1112:5;1137:66;1153:49;1195:6;1153:49;:::i;:::-;1137:66;:::i;:::-;1128:75;;1226:6;1219:5;1212:21;1264:4;1257:5;1253:16;1302:3;1293:6;1288:3;1284:16;1281:25;1278:2;;;1319:1;1316;1309:12;1278:2;1332:41;1366:6;1361:3;1356;1332:41;:::i;:::-;1118:261;;;;;;:::o;1385:139::-;1431:5;1469:6;1456:20;1447:29;;1485:33;1512:5;1485:33;:::i;:::-;1437:87;;;;:::o;1547:303::-;1618:5;1667:3;1660:4;1652:6;1648:17;1644:27;1634:2;;1685:1;1682;1675:12;1634:2;1725:6;1712:20;1750:94;1840:3;1832:6;1825:4;1817:6;1813:17;1750:94;:::i;:::-;1741:103;;1624:226;;;;;:::o;1856:133::-;1899:5;1937:6;1924:20;1915:29;;1953:30;1977:5;1953:30;:::i;:::-;1905:84;;;;:::o;1995:137::-;2040:5;2078:6;2065:20;2056:29;;2094:32;2120:5;2094:32;:::i;:::-;2046:86;;;;:::o;2138:141::-;2194:5;2225:6;2219:13;2210:22;;2241:32;2267:5;2241:32;:::i;:::-;2200:79;;;;:::o;2298:271::-;2353:5;2402:3;2395:4;2387:6;2383:17;2379:27;2369:2;;2420:1;2417;2410:12;2369:2;2460:6;2447:20;2485:78;2559:3;2551:6;2544:4;2536:6;2532:17;2485:78;:::i;:::-;2476:87;;2359:210;;;;;:::o;2589:273::-;2645:5;2694:3;2687:4;2679:6;2675:17;2671:27;2661:2;;2712:1;2709;2702:12;2661:2;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2651:211;;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2920:87;;;;:::o;3013:143::-;3070:5;3101:6;3095:13;3086:22;;3117:33;3144:5;3117:33;:::i;:::-;3076:80;;;;:::o;3162:262::-;3221:6;3270:2;3258:9;3249:7;3245:23;3241:32;3238:2;;;3286:1;3283;3276:12;3238:2;3329:1;3354:53;3399:7;3390:6;3379:9;3375:22;3354:53;:::i;:::-;3344:63;;3300:117;3228:196;;;;:::o;3430:407::-;3498:6;3506;3555:2;3543:9;3534:7;3530:23;3526:32;3523:2;;;3571:1;3568;3561:12;3523:2;3614:1;3639:53;3684:7;3675:6;3664:9;3660:22;3639:53;:::i;:::-;3629:63;;3585:117;3741:2;3767:53;3812:7;3803:6;3792:9;3788:22;3767:53;:::i;:::-;3757:63;;3712:118;3513:324;;;;;:::o;3843:552::-;3920:6;3928;3936;3985:2;3973:9;3964:7;3960:23;3956:32;3953:2;;;4001:1;3998;3991:12;3953:2;4044:1;4069:53;4114:7;4105:6;4094:9;4090:22;4069:53;:::i;:::-;4059:63;;4015:117;4171:2;4197:53;4242:7;4233:6;4222:9;4218:22;4197:53;:::i;:::-;4187:63;;4142:118;4299:2;4325:53;4370:7;4361:6;4350:9;4346:22;4325:53;:::i;:::-;4315:63;;4270:118;3943:452;;;;;:::o;4401:809::-;4496:6;4504;4512;4520;4569:3;4557:9;4548:7;4544:23;4540:33;4537:2;;;4586:1;4583;4576:12;4537:2;4629:1;4654:53;4699:7;4690:6;4679:9;4675:22;4654:53;:::i;:::-;4644:63;;4600:117;4756:2;4782:53;4827:7;4818:6;4807:9;4803:22;4782:53;:::i;:::-;4772:63;;4727:118;4884:2;4910:53;4955:7;4946:6;4935:9;4931:22;4910:53;:::i;:::-;4900:63;;4855:118;5040:2;5029:9;5025:18;5012:32;5071:18;5063:6;5060:30;5057:2;;;5103:1;5100;5093:12;5057:2;5131:62;5185:7;5176:6;5165:9;5161:22;5131:62;:::i;:::-;5121:72;;4983:220;4527:683;;;;;;;:::o;5216:401::-;5281:6;5289;5338:2;5326:9;5317:7;5313:23;5309:32;5306:2;;;5354:1;5351;5344:12;5306:2;5397:1;5422:53;5467:7;5458:6;5447:9;5443:22;5422:53;:::i;:::-;5412:63;;5368:117;5524:2;5550:50;5592:7;5583:6;5572:9;5568:22;5550:50;:::i;:::-;5540:60;;5495:115;5296:321;;;;;:::o;5623:407::-;5691:6;5699;5748:2;5736:9;5727:7;5723:23;5719:32;5716:2;;;5764:1;5761;5754:12;5716:2;5807:1;5832:53;5877:7;5868:6;5857:9;5853:22;5832:53;:::i;:::-;5822:63;;5778:117;5934:2;5960:53;6005:7;5996:6;5985:9;5981:22;5960:53;:::i;:::-;5950:63;;5905:118;5706:324;;;;;:::o;6036:405::-;6120:6;6169:2;6157:9;6148:7;6144:23;6140:32;6137:2;;;6185:1;6182;6175:12;6137:2;6256:1;6245:9;6241:17;6228:31;6286:18;6278:6;6275:30;6272:2;;;6318:1;6315;6308:12;6272:2;6346:78;6416:7;6407:6;6396:9;6392:22;6346:78;:::i;:::-;6336:88;;6199:235;6127:314;;;;:::o;6447:260::-;6505:6;6554:2;6542:9;6533:7;6529:23;6525:32;6522:2;;;6570:1;6567;6560:12;6522:2;6613:1;6638:52;6682:7;6673:6;6662:9;6658:22;6638:52;:::i;:::-;6628:62;;6584:116;6512:195;;;;:::o;6713:282::-;6782:6;6831:2;6819:9;6810:7;6806:23;6802:32;6799:2;;;6847:1;6844;6837:12;6799:2;6890:1;6915:63;6970:7;6961:6;6950:9;6946:22;6915:63;:::i;:::-;6905:73;;6861:127;6789:206;;;;:::o;7001:375::-;7070:6;7119:2;7107:9;7098:7;7094:23;7090:32;7087:2;;;7135:1;7132;7125:12;7087:2;7206:1;7195:9;7191:17;7178:31;7236:18;7228:6;7225:30;7222:2;;;7268:1;7265;7258:12;7222:2;7296:63;7351:7;7342:6;7331:9;7327:22;7296:63;:::i;:::-;7286:73;;7149:220;7077:299;;;;:::o;7382:262::-;7441:6;7490:2;7478:9;7469:7;7465:23;7461:32;7458:2;;;7506:1;7503;7496:12;7458:2;7549:1;7574:53;7619:7;7610:6;7599:9;7595:22;7574:53;:::i;:::-;7564:63;;7520:117;7448:196;;;;:::o;7650:284::-;7720:6;7769:2;7757:9;7748:7;7744:23;7740:32;7737:2;;;7785:1;7782;7775:12;7737:2;7828:1;7853:64;7909:7;7900:6;7889:9;7885:22;7853:64;:::i;:::-;7843:74;;7799:128;7727:207;;;;:::o;7940:407::-;8008:6;8016;8065:2;8053:9;8044:7;8040:23;8036:32;8033:2;;;8081:1;8078;8071:12;8033:2;8124:1;8149:53;8194:7;8185:6;8174:9;8170:22;8149:53;:::i;:::-;8139:63;;8095:117;8251:2;8277:53;8322:7;8313:6;8302:9;8298:22;8277:53;:::i;:::-;8267:63;;8222:118;8023:324;;;;;:::o;8353:118::-;8440:24;8458:5;8440:24;:::i;:::-;8435:3;8428:37;8418:53;;:::o;8477:109::-;8558:21;8573:5;8558:21;:::i;:::-;8553:3;8546:34;8536:50;;:::o;8592:360::-;8678:3;8706:38;8738:5;8706:38;:::i;:::-;8760:70;8823:6;8818:3;8760:70;:::i;:::-;8753:77;;8839:52;8884:6;8879:3;8872:4;8865:5;8861:16;8839:52;:::i;:::-;8916:29;8938:6;8916:29;:::i;:::-;8911:3;8907:39;8900:46;;8682:270;;;;;:::o;8958:364::-;9046:3;9074:39;9107:5;9074:39;:::i;:::-;9129:71;9193:6;9188:3;9129:71;:::i;:::-;9122:78;;9209:52;9254:6;9249:3;9242:4;9235:5;9231:16;9209:52;:::i;:::-;9286:29;9308:6;9286:29;:::i;:::-;9281:3;9277:39;9270:46;;9050:272;;;;;:::o;9328:377::-;9434:3;9462:39;9495:5;9462:39;:::i;:::-;9517:89;9599:6;9594:3;9517:89;:::i;:::-;9510:96;;9615:52;9660:6;9655:3;9648:4;9641:5;9637:16;9615:52;:::i;:::-;9692:6;9687:3;9683:16;9676:23;;9438:267;;;;;:::o;9735:845::-;9838:3;9875:5;9869:12;9904:36;9930:9;9904:36;:::i;:::-;9956:89;10038:6;10033:3;9956:89;:::i;:::-;9949:96;;10076:1;10065:9;10061:17;10092:1;10087:137;;;;10238:1;10233:341;;;;10054:520;;10087:137;10171:4;10167:9;10156;10152:25;10147:3;10140:38;10207:6;10202:3;10198:16;10191:23;;10087:137;;10233:341;10300:38;10332:5;10300:38;:::i;:::-;10360:1;10374:154;10388:6;10385:1;10382:13;10374:154;;;10462:7;10456:14;10452:1;10447:3;10443:11;10436:35;10512:1;10503:7;10499:15;10488:26;;10410:4;10407:1;10403:12;10398:17;;10374:154;;;10557:6;10552:3;10548:16;10541:23;;10240:334;;10054:520;;9842:738;;;;;;:::o;10586:366::-;10728:3;10749:67;10813:2;10808:3;10749:67;:::i;:::-;10742:74;;10825:93;10914:3;10825:93;:::i;:::-;10943:2;10938:3;10934:12;10927:19;;10732:220;;;:::o;10958:366::-;11100:3;11121:67;11185:2;11180:3;11121:67;:::i;:::-;11114:74;;11197:93;11286:3;11197:93;:::i;:::-;11315:2;11310:3;11306:12;11299:19;;11104:220;;;:::o;11330:366::-;11472:3;11493:67;11557:2;11552:3;11493:67;:::i;:::-;11486:74;;11569:93;11658:3;11569:93;:::i;:::-;11687:2;11682:3;11678:12;11671:19;;11476:220;;;:::o;11702:366::-;11844:3;11865:67;11929:2;11924:3;11865:67;:::i;:::-;11858:74;;11941:93;12030:3;11941:93;:::i;:::-;12059:2;12054:3;12050:12;12043:19;;11848:220;;;:::o;12074:366::-;12216:3;12237:67;12301:2;12296:3;12237:67;:::i;:::-;12230:74;;12313:93;12402:3;12313:93;:::i;:::-;12431:2;12426:3;12422:12;12415:19;;12220:220;;;:::o;12446:366::-;12588:3;12609:67;12673:2;12668:3;12609:67;:::i;:::-;12602:74;;12685:93;12774:3;12685:93;:::i;:::-;12803:2;12798:3;12794:12;12787:19;;12592:220;;;:::o;12818:366::-;12960:3;12981:67;13045:2;13040:3;12981:67;:::i;:::-;12974:74;;13057:93;13146:3;13057:93;:::i;:::-;13175:2;13170:3;13166:12;13159:19;;12964:220;;;:::o;13190:366::-;13332:3;13353:67;13417:2;13412:3;13353:67;:::i;:::-;13346:74;;13429:93;13518:3;13429:93;:::i;:::-;13547:2;13542:3;13538:12;13531:19;;13336:220;;;:::o;13562:366::-;13704:3;13725:67;13789:2;13784:3;13725:67;:::i;:::-;13718:74;;13801:93;13890:3;13801:93;:::i;:::-;13919:2;13914:3;13910:12;13903:19;;13708:220;;;:::o;13934:366::-;14076:3;14097:67;14161:2;14156:3;14097:67;:::i;:::-;14090:74;;14173:93;14262:3;14173:93;:::i;:::-;14291:2;14286:3;14282:12;14275:19;;14080:220;;;:::o;14306:366::-;14448:3;14469:67;14533:2;14528:3;14469:67;:::i;:::-;14462:74;;14545:93;14634:3;14545:93;:::i;:::-;14663:2;14658:3;14654:12;14647:19;;14452:220;;;:::o;14678:366::-;14820:3;14841:67;14905:2;14900:3;14841:67;:::i;:::-;14834:74;;14917:93;15006:3;14917:93;:::i;:::-;15035:2;15030:3;15026:12;15019:19;;14824:220;;;:::o;15050:366::-;15192:3;15213:67;15277:2;15272:3;15213:67;:::i;:::-;15206:74;;15289:93;15378:3;15289:93;:::i;:::-;15407:2;15402:3;15398:12;15391:19;;15196:220;;;:::o;15422:366::-;15564:3;15585:67;15649:2;15644:3;15585:67;:::i;:::-;15578:74;;15661:93;15750:3;15661:93;:::i;:::-;15779:2;15774:3;15770:12;15763:19;;15568:220;;;:::o;15794:366::-;15936:3;15957:67;16021:2;16016:3;15957:67;:::i;:::-;15950:74;;16033:93;16122:3;16033:93;:::i;:::-;16151:2;16146:3;16142:12;16135:19;;15940:220;;;:::o;16166:366::-;16308:3;16329:67;16393:2;16388:3;16329:67;:::i;:::-;16322:74;;16405:93;16494:3;16405:93;:::i;:::-;16523:2;16518:3;16514:12;16507:19;;16312:220;;;:::o;16538:400::-;16698:3;16719:84;16801:1;16796:3;16719:84;:::i;:::-;16712:91;;16812:93;16901:3;16812:93;:::i;:::-;16930:1;16925:3;16921:11;16914:18;;16702:236;;;:::o;16944:366::-;17086:3;17107:67;17171:2;17166:3;17107:67;:::i;:::-;17100:74;;17183:93;17272:3;17183:93;:::i;:::-;17301:2;17296:3;17292:12;17285:19;;17090:220;;;:::o;17316:366::-;17458:3;17479:67;17543:2;17538:3;17479:67;:::i;:::-;17472:74;;17555:93;17644:3;17555:93;:::i;:::-;17673:2;17668:3;17664:12;17657:19;;17462:220;;;:::o;17688:366::-;17830:3;17851:67;17915:2;17910:3;17851:67;:::i;:::-;17844:74;;17927:93;18016:3;17927:93;:::i;:::-;18045:2;18040:3;18036:12;18029:19;;17834:220;;;:::o;18060:366::-;18202:3;18223:67;18287:2;18282:3;18223:67;:::i;:::-;18216:74;;18299:93;18388:3;18299:93;:::i;:::-;18417:2;18412:3;18408:12;18401:19;;18206:220;;;:::o;18432:118::-;18519:24;18537:5;18519:24;:::i;:::-;18514:3;18507:37;18497:53;;:::o;18556:695::-;18834:3;18856:92;18944:3;18935:6;18856:92;:::i;:::-;18849:99;;18965:95;19056:3;19047:6;18965:95;:::i;:::-;18958:102;;19077:148;19221:3;19077:148;:::i;:::-;19070:155;;19242:3;19235:10;;18838:413;;;;;:::o;19257:222::-;19350:4;19388:2;19377:9;19373:18;19365:26;;19401:71;19469:1;19458:9;19454:17;19445:6;19401:71;:::i;:::-;19355:124;;;;:::o;19485:640::-;19680:4;19718:3;19707:9;19703:19;19695:27;;19732:71;19800:1;19789:9;19785:17;19776:6;19732:71;:::i;:::-;19813:72;19881:2;19870:9;19866:18;19857:6;19813:72;:::i;:::-;19895;19963:2;19952:9;19948:18;19939:6;19895:72;:::i;:::-;20014:9;20008:4;20004:20;19999:2;19988:9;19984:18;19977:48;20042:76;20113:4;20104:6;20042:76;:::i;:::-;20034:84;;19685:440;;;;;;;:::o;20131:210::-;20218:4;20256:2;20245:9;20241:18;20233:26;;20269:65;20331:1;20320:9;20316:17;20307:6;20269:65;:::i;:::-;20223:118;;;;:::o;20347:313::-;20460:4;20498:2;20487:9;20483:18;20475:26;;20547:9;20541:4;20537:20;20533:1;20522:9;20518:17;20511:47;20575:78;20648:4;20639:6;20575:78;:::i;:::-;20567:86;;20465:195;;;;:::o;20666:419::-;20832:4;20870:2;20859:9;20855:18;20847:26;;20919:9;20913:4;20909:20;20905:1;20894:9;20890:17;20883:47;20947:131;21073:4;20947:131;:::i;:::-;20939:139;;20837:248;;;:::o;21091:419::-;21257:4;21295:2;21284:9;21280:18;21272:26;;21344:9;21338:4;21334:20;21330:1;21319:9;21315:17;21308:47;21372:131;21498:4;21372:131;:::i;:::-;21364:139;;21262:248;;;:::o;21516:419::-;21682:4;21720:2;21709:9;21705:18;21697:26;;21769:9;21763:4;21759:20;21755:1;21744:9;21740:17;21733:47;21797:131;21923:4;21797:131;:::i;:::-;21789:139;;21687:248;;;:::o;21941:419::-;22107:4;22145:2;22134:9;22130:18;22122:26;;22194:9;22188:4;22184:20;22180:1;22169:9;22165:17;22158:47;22222:131;22348:4;22222:131;:::i;:::-;22214:139;;22112:248;;;:::o;22366:419::-;22532:4;22570:2;22559:9;22555:18;22547:26;;22619:9;22613:4;22609:20;22605:1;22594:9;22590:17;22583:47;22647:131;22773:4;22647:131;:::i;:::-;22639:139;;22537:248;;;:::o;22791:419::-;22957:4;22995:2;22984:9;22980:18;22972:26;;23044:9;23038:4;23034:20;23030:1;23019:9;23015:17;23008:47;23072:131;23198:4;23072:131;:::i;:::-;23064:139;;22962:248;;;:::o;23216:419::-;23382:4;23420:2;23409:9;23405:18;23397:26;;23469:9;23463:4;23459:20;23455:1;23444:9;23440:17;23433:47;23497:131;23623:4;23497:131;:::i;:::-;23489:139;;23387:248;;;:::o;23641:419::-;23807:4;23845:2;23834:9;23830:18;23822:26;;23894:9;23888:4;23884:20;23880:1;23869:9;23865:17;23858:47;23922:131;24048:4;23922:131;:::i;:::-;23914:139;;23812:248;;;:::o;24066:419::-;24232:4;24270:2;24259:9;24255:18;24247:26;;24319:9;24313:4;24309:20;24305:1;24294:9;24290:17;24283:47;24347:131;24473:4;24347:131;:::i;:::-;24339:139;;24237:248;;;:::o;24491:419::-;24657:4;24695:2;24684:9;24680:18;24672:26;;24744:9;24738:4;24734:20;24730:1;24719:9;24715:17;24708:47;24772:131;24898:4;24772:131;:::i;:::-;24764:139;;24662:248;;;:::o;24916:419::-;25082:4;25120:2;25109:9;25105:18;25097:26;;25169:9;25163:4;25159:20;25155:1;25144:9;25140:17;25133:47;25197:131;25323:4;25197:131;:::i;:::-;25189:139;;25087:248;;;:::o;25341:419::-;25507:4;25545:2;25534:9;25530:18;25522:26;;25594:9;25588:4;25584:20;25580:1;25569:9;25565:17;25558:47;25622:131;25748:4;25622:131;:::i;:::-;25614:139;;25512:248;;;:::o;25766:419::-;25932:4;25970:2;25959:9;25955:18;25947:26;;26019:9;26013:4;26009:20;26005:1;25994:9;25990:17;25983:47;26047:131;26173:4;26047:131;:::i;:::-;26039:139;;25937:248;;;:::o;26191:419::-;26357:4;26395:2;26384:9;26380:18;26372:26;;26444:9;26438:4;26434:20;26430:1;26419:9;26415:17;26408:47;26472:131;26598:4;26472:131;:::i;:::-;26464:139;;26362:248;;;:::o;26616:419::-;26782:4;26820:2;26809:9;26805:18;26797:26;;26869:9;26863:4;26859:20;26855:1;26844:9;26840:17;26833:47;26897:131;27023:4;26897:131;:::i;:::-;26889:139;;26787:248;;;:::o;27041:419::-;27207:4;27245:2;27234:9;27230:18;27222:26;;27294:9;27288:4;27284:20;27280:1;27269:9;27265:17;27258:47;27322:131;27448:4;27322:131;:::i;:::-;27314:139;;27212:248;;;:::o;27466:419::-;27632:4;27670:2;27659:9;27655:18;27647:26;;27719:9;27713:4;27709:20;27705:1;27694:9;27690:17;27683:47;27747:131;27873:4;27747:131;:::i;:::-;27739:139;;27637:248;;;:::o;27891:419::-;28057:4;28095:2;28084:9;28080:18;28072:26;;28144:9;28138:4;28134:20;28130:1;28119:9;28115:17;28108:47;28172:131;28298:4;28172:131;:::i;:::-;28164:139;;28062:248;;;:::o;28316:419::-;28482:4;28520:2;28509:9;28505:18;28497:26;;28569:9;28563:4;28559:20;28555:1;28544:9;28540:17;28533:47;28597:131;28723:4;28597:131;:::i;:::-;28589:139;;28487:248;;;:::o;28741:419::-;28907:4;28945:2;28934:9;28930:18;28922:26;;28994:9;28988:4;28984:20;28980:1;28969:9;28965:17;28958:47;29022:131;29148:4;29022:131;:::i;:::-;29014:139;;28912:248;;;:::o;29166:222::-;29259:4;29297:2;29286:9;29282:18;29274:26;;29310:71;29378:1;29367:9;29363:17;29354:6;29310:71;:::i;:::-;29264:124;;;;:::o;29394:129::-;29428:6;29455:20;;:::i;:::-;29445:30;;29484:33;29512:4;29504:6;29484:33;:::i;:::-;29435:88;;;:::o;29529:75::-;29562:6;29595:2;29589:9;29579:19;;29569:35;:::o;29610:311::-;29687:4;29777:18;29769:6;29766:30;29763:2;;;29799:18;;:::i;:::-;29763:2;29849:4;29841:6;29837:17;29829:25;;29909:4;29903;29899:15;29891:23;;29692:229;;;:::o;29927:307::-;29988:4;30078:18;30070:6;30067:30;30064:2;;;30100:18;;:::i;:::-;30064:2;30138:29;30160:6;30138:29;:::i;:::-;30130:37;;30222:4;30216;30212:15;30204:23;;29993:241;;;:::o;30240:308::-;30302:4;30392:18;30384:6;30381:30;30378:2;;;30414:18;;:::i;:::-;30378:2;30452:29;30474:6;30452:29;:::i;:::-;30444:37;;30536:4;30530;30526:15;30518:23;;30307:241;;;:::o;30554:141::-;30603:4;30626:3;30618:11;;30649:3;30646:1;30639:14;30683:4;30680:1;30670:18;30662:26;;30608:87;;;:::o;30701:98::-;30752:6;30786:5;30780:12;30770:22;;30759:40;;;:::o;30805:99::-;30857:6;30891:5;30885:12;30875:22;;30864:40;;;:::o;30910:168::-;30993:11;31027:6;31022:3;31015:19;31067:4;31062:3;31058:14;31043:29;;31005:73;;;;:::o;31084:169::-;31168:11;31202:6;31197:3;31190:19;31242:4;31237:3;31233:14;31218:29;;31180:73;;;;:::o;31259:148::-;31361:11;31398:3;31383:18;;31373:34;;;;:::o;31413:305::-;31453:3;31472:20;31490:1;31472:20;:::i;:::-;31467:25;;31506:20;31524:1;31506:20;:::i;:::-;31501:25;;31660:1;31592:66;31588:74;31585:1;31582:81;31579:2;;;31666:18;;:::i;:::-;31579:2;31710:1;31707;31703:9;31696:16;;31457:261;;;;:::o;31724:185::-;31764:1;31781:20;31799:1;31781:20;:::i;:::-;31776:25;;31815:20;31833:1;31815:20;:::i;:::-;31810:25;;31854:1;31844:2;;31859:18;;:::i;:::-;31844:2;31901:1;31898;31894:9;31889:14;;31766:143;;;;:::o;31915:348::-;31955:7;31978:20;31996:1;31978:20;:::i;:::-;31973:25;;32012:20;32030:1;32012:20;:::i;:::-;32007:25;;32200:1;32132:66;32128:74;32125:1;32122:81;32117:1;32110:9;32103:17;32099:105;32096:2;;;32207:18;;:::i;:::-;32096:2;32255:1;32252;32248:9;32237:20;;31963:300;;;;:::o;32269:191::-;32309:4;32329:20;32347:1;32329:20;:::i;:::-;32324:25;;32363:20;32381:1;32363:20;:::i;:::-;32358:25;;32402:1;32399;32396:8;32393:2;;;32407:18;;:::i;:::-;32393:2;32452:1;32449;32445:9;32437:17;;32314:146;;;;:::o;32466:96::-;32503:7;32532:24;32550:5;32532:24;:::i;:::-;32521:35;;32511:51;;;:::o;32568:90::-;32602:7;32645:5;32638:13;32631:21;32620:32;;32610:48;;;:::o;32664:149::-;32700:7;32740:66;32733:5;32729:78;32718:89;;32708:105;;;:::o;32819:126::-;32856:7;32896:42;32889:5;32885:54;32874:65;;32864:81;;;:::o;32951:77::-;32988:7;33017:5;33006:16;;32996:32;;;:::o;33034:154::-;33118:6;33113:3;33108;33095:30;33180:1;33171:6;33166:3;33162:16;33155:27;33085:103;;;:::o;33194:307::-;33262:1;33272:113;33286:6;33283:1;33280:13;33272:113;;;33371:1;33366:3;33362:11;33356:18;33352:1;33347:3;33343:11;33336:39;33308:2;33305:1;33301:10;33296:15;;33272:113;;;33403:6;33400:1;33397:13;33394:2;;;33483:1;33474:6;33469:3;33465:16;33458:27;33394:2;33243:258;;;;:::o;33507:320::-;33551:6;33588:1;33582:4;33578:12;33568:22;;33635:1;33629:4;33625:12;33656:18;33646:2;;33712:4;33704:6;33700:17;33690:27;;33646:2;33774;33766:6;33763:14;33743:18;33740:38;33737:2;;;33793:18;;:::i;:::-;33737:2;33558:269;;;;:::o;33833:281::-;33916:27;33938:4;33916:27;:::i;:::-;33908:6;33904:40;34046:6;34034:10;34031:22;34010:18;33998:10;33995:34;33992:62;33989:2;;;34057:18;;:::i;:::-;33989:2;34097:10;34093:2;34086:22;33876:238;;;:::o;34120:233::-;34159:3;34182:24;34200:5;34182:24;:::i;:::-;34173:33;;34228:66;34221:5;34218:77;34215:2;;;34298:18;;:::i;:::-;34215:2;34345:1;34338:5;34334:13;34327:20;;34163:190;;;:::o;34359:176::-;34391:1;34408:20;34426:1;34408:20;:::i;:::-;34403:25;;34442:20;34460:1;34442:20;:::i;:::-;34437:25;;34481:1;34471:2;;34486:18;;:::i;:::-;34471:2;34527:1;34524;34520:9;34515:14;;34393:142;;;;:::o;34541:180::-;34589:77;34586:1;34579:88;34686:4;34683:1;34676:15;34710:4;34707:1;34700:15;34727:180;34775:77;34772:1;34765:88;34872:4;34869:1;34862:15;34896:4;34893:1;34886:15;34913:180;34961:77;34958:1;34951:88;35058:4;35055:1;35048:15;35082:4;35079:1;35072:15;35099:180;35147:77;35144:1;35137:88;35244:4;35241:1;35234:15;35268:4;35265:1;35258:15;35285:102;35326:6;35377:2;35373:7;35368:2;35361:5;35357:14;35353:28;35343:38;;35333:54;;;:::o;35393:181::-;35533:33;35529:1;35521:6;35517:14;35510:57;35499:75;:::o;35580:230::-;35720:34;35716:1;35708:6;35704:14;35697:58;35789:13;35784:2;35776:6;35772:15;35765:38;35686:124;:::o;35816:237::-;35956:34;35952:1;35944:6;35940:14;35933:58;36025:20;36020:2;36012:6;36008:15;36001:45;35922:131;:::o;36059:225::-;36199:34;36195:1;36187:6;36183:14;36176:58;36268:8;36263:2;36255:6;36251:15;36244:33;36165:119;:::o;36290:224::-;36430:34;36426:1;36418:6;36414:14;36407:58;36499:7;36494:2;36486:6;36482:15;36475:32;36396:118;:::o;36520:178::-;36660:30;36656:1;36648:6;36644:14;36637:54;36626:72;:::o;36704:223::-;36844:34;36840:1;36832:6;36828:14;36821:58;36913:6;36908:2;36900:6;36896:15;36889:31;36810:117;:::o;36933:175::-;37073:27;37069:1;37061:6;37057:14;37050:51;37039:69;:::o;37114:231::-;37254:34;37250:1;37242:6;37238:14;37231:58;37323:14;37318:2;37310:6;37306:15;37299:39;37220:125;:::o;37351:243::-;37491:34;37487:1;37479:6;37475:14;37468:58;37560:26;37555:2;37547:6;37543:15;37536:51;37457:137;:::o;37600:229::-;37740:34;37736:1;37728:6;37724:14;37717:58;37809:12;37804:2;37796:6;37792:15;37785:37;37706:123;:::o;37835:228::-;37975:34;37971:1;37963:6;37959:14;37952:58;38044:11;38039:2;38031:6;38027:15;38020:36;37941:122;:::o;38069:162::-;38209:14;38205:1;38197:6;38193:14;38186:38;38175:56;:::o;38237:163::-;38377:15;38373:1;38365:6;38361:14;38354:39;38343:57;:::o;38406:182::-;38546:34;38542:1;38534:6;38530:14;38523:58;38512:76;:::o;38594:231::-;38734:34;38730:1;38722:6;38718:14;38711:58;38803:14;38798:2;38790:6;38786:15;38779:39;38700:125;:::o;38831:155::-;38971:7;38967:1;38959:6;38955:14;38948:31;38937:49;:::o;38992:182::-;39132:34;39128:1;39120:6;39116:14;39109:58;39098:76;:::o;39180:220::-;39320:34;39316:1;39308:6;39304:14;39297:58;39389:3;39384:2;39376:6;39372:15;39365:28;39286:114;:::o;39406:236::-;39546:34;39542:1;39534:6;39530:14;39523:58;39615:19;39610:2;39602:6;39598:15;39591:44;39512:130;:::o;39648:231::-;39788:34;39784:1;39776:6;39772:14;39765:58;39857:14;39852:2;39844:6;39840:15;39833:39;39754:125;:::o;39885:122::-;39958:24;39976:5;39958:24;:::i;:::-;39951:5;39948:35;39938:2;;39997:1;39994;39987:12;39938:2;39928:79;:::o;40013:116::-;40083:21;40098:5;40083:21;:::i;:::-;40076:5;40073:32;40063:2;;40119:1;40116;40109:12;40063:2;40053:76;:::o;40135:120::-;40207:23;40224:5;40207:23;:::i;:::-;40200:5;40197:34;40187:2;;40245:1;40242;40235:12;40187:2;40177:78;:::o;40261:122::-;40334:24;40352:5;40334:24;:::i;:::-;40327:5;40324:35;40314:2;;40373:1;40370;40363:12;40314:2;40304:79;:::o

Swarm Source

ipfs://802e0ed3763eba6a624250a826a57629541e66e4f754b70f203616eaa96337cc
Loading