Token CroFrogs Survivor

Overview CRC721

Total Supply:
600 CRS

Holders:
36 addresses
Balance
2 CRS
0xbb4d8b7948bd7c60698e7b45e410751f0bbf26b9
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xf92e20d70fec34e4056e5f90bc9ebaa100f8f872

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-11-20
*/

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

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

// 
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)
// SPDX-License-Identifier: MIT
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/[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/access/[email protected]

// 
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

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

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

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

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


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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

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

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

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

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

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

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

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


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

// 
// OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


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

// 
// OpenZeppelin Contracts (last updated v4.7.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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// 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.7.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: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 overridden 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 token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token 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: caller is not token 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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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 an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    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/utils/math/[email protected]

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File 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 deployFee = 200 ether;
    uint mintNftFee = 2 ether;

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

    address public payCollectionAddress;
    uint public payCollectionQuantity;

    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 _userLimit,
        address _payCollectionAddress,
        uint _payCollectionQuantity
    ) 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;
        payCollectionAddress = _payCollectionAddress;
        payCollectionQuantity = _payCollectionQuantity;

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

    function getFee(address minter) public view returns (uint) {
        if (minter == owner()) {
            return 0;
        }
        if ((IERC721(corgiAddress).balanceOf(minter) > 0) && whiteList[minter]) {
            if (corgiHolderFee < whiteListFee) {
                return corgiHolderFee;
            } else {
                return whiteListFee;
            }
        }
        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 setUserLimit(uint256 _userLimit) public onlyOwner {
        userLimit = _userLimit;
    }

    function setMintNFT(address _payCollectionAddress, uint _payCollectionQuantity) public onlyOwner {
        payCollectionAddress = _payCollectionAddress;
        payCollectionQuantity = _payCollectionQuantity;
    }

    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 * 3 / 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 * 3 / 100;
        uint ownerRevenue = msg.value - corgiRevenue;
        payable(corgiPayee).transfer(corgiRevenue);
        payable(owner()).transfer(ownerRevenue);
    }

    function bulkMintByNftTo(
        address _initialOwner,
        uint _quantity,
        uint[] memory _nftIds
    ) public payable {
        require(addressToMinted[_initialOwner] + _quantity <= userLimit, 'limit reached');
        require(msg.value == (mintNftFee * _quantity), "Fee mismatch");
        require(_nftIds.length == payCollectionQuantity * _quantity, "NFT quantity mismatch");

        addressToMinted[_initialOwner] += _quantity;
        for (uint256 i = 0; i < _quantity; i++) {
            for (uint256 j = 0; j < payCollectionQuantity; j++) {
                IERC721(payCollectionAddress).transferFrom(msg.sender, owner(), _nftIds[i * payCollectionQuantity + j]);
            }
            _counter.increment();
            _safeMint(_initialOwner, _counter.current());
        }

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

    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":"_userLimit","type":"uint256"},{"internalType":"address","name":"_payCollectionAddress","type":"address"},{"internalType":"uint256","name":"_payCollectionQuantity","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"},{"internalType":"uint256[]","name":"_nftIds","type":"uint256[]"}],"name":"bulkMintByNftTo","outputs":[],"stateMutability":"payable","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":"payCollectionAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payCollectionQuantity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_payCollectionAddress","type":"address"},{"internalType":"uint256","name":"_payCollectionQuantity","type":"uint256"}],"name":"setMintNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_userLimit","type":"uint256"}],"name":"setUserLimit","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"}]

6080604052680ad78ebc5ac6200000600d55671bc16d674ec80000600e55736b7fbb0a0ec0099eed6549ec54d3f79463711dfe601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040516200584238038062005842833981810160405281019062000097919062000713565b8a8a8160009080519060200190620000b192919062000521565b508060019080519060200190620000ca92919062000521565b505050620000ed620000e16200028c60201b60201c565b6200029460201b60201c565b600d54341462000134576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200012b90620008cc565b60405180910390fd5b88600c90805190602001906200014c92919062000521565b506200015f88886200035a60201b60201c565b62000170846200037c60201b60201c565b62000181866200044c60201b60201c565b84601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260128190555081601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601481905550601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156200027a573d6000803e3d6000fd5b50505050505050505050505062000c01565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200036a6200046660201b60201c565b81600f81905550806010819055505050565b6200038c6200046660201b60201c565b60005b81518110156200044857600160176000848481518110620003d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806200043f9062000a8f565b9150506200038f565b5050565b6200045c6200046660201b60201c565b8060118190555050565b620004766200028c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200049c620004f760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620004f5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004ec90620008ee565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200052f9062000a23565b90600052602060002090601f0160209004810192826200055357600085556200059f565b82601f106200056e57805160ff19168380011785556200059f565b828001600101855582156200059f579182015b828111156200059e57825182559160200191906001019062000581565b5b509050620005ae9190620005b2565b5090565b5b80821115620005cd576000816000905550600101620005b3565b5090565b6000620005e8620005e28462000939565b62000910565b905080838252602082019050828560208602820111156200060857600080fd5b60005b858110156200063c57816200062188826200068b565b8452602084019350602083019250506001810190506200060b565b5050509392505050565b60006200065d620006578462000968565b62000910565b9050828152602081018484840111156200067657600080fd5b62000683848285620009ed565b509392505050565b6000815190506200069c8162000bcd565b92915050565b600082601f830112620006b457600080fd5b8151620006c6848260208601620005d1565b91505092915050565b600082601f830112620006e157600080fd5b8151620006f384826020860162000646565b91505092915050565b6000815190506200070d8162000be7565b92915050565b60008060008060008060008060008060006101608c8e0312156200073657600080fd5b60008c015167ffffffffffffffff8111156200075157600080fd5b6200075f8e828f01620006cf565b9b505060208c015167ffffffffffffffff8111156200077d57600080fd5b6200078b8e828f01620006cf565b9a505060408c015167ffffffffffffffff811115620007a957600080fd5b620007b78e828f01620006cf565b9950506060620007ca8e828f01620006fc565b9850506080620007dd8e828f01620006fc565b97505060a0620007f08e828f01620006fc565b96505060c0620008038e828f016200068b565b95505060e08c015167ffffffffffffffff8111156200082157600080fd5b6200082f8e828f01620006a2565b945050610100620008438e828f01620006fc565b935050610120620008578e828f016200068b565b9250506101406200086b8e828f01620006fc565b9150509295989b509295989b9093969950565b60006200088d601d836200099e565b91506200089a8262000b7b565b602082019050919050565b6000620008b46020836200099e565b9150620008c18262000ba4565b602082019050919050565b60006020820190508181036000830152620008e7816200087e565b9050919050565b600060208201905081810360008301526200090981620008a5565b9050919050565b60006200091c6200092f565b90506200092a828262000a59565b919050565b6000604051905090565b600067ffffffffffffffff82111562000957576200095662000b3b565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000986576200098562000b3b565b5b620009918262000b6a565b9050602081019050919050565b600082825260208201905092915050565b6000620009bc82620009c3565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000a0d578082015181840152602081019050620009f0565b8381111562000a1d576000848401525b50505050565b6000600282049050600182168062000a3c57607f821691505b6020821081141562000a535762000a5262000b0c565b5b50919050565b62000a648262000b6a565b810181811067ffffffffffffffff8211171562000a865762000a8562000b3b565b5b80604052505050565b600062000a9c82620009e3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000ad25762000ad162000add565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4465706c6f796d656e7420666565206973206e6f7420636f7272656374000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b62000bd881620009af565b811462000be457600080fd5b50565b62000bf281620009e3565b811462000bfe57600080fd5b50565b614c318062000c116000396000f3fe6080604052600436106102465760003560e01c80636c0360eb11610139578063a22cb465116100b6578063bc25fe4b1161007a578063bc25fe4b1461088b578063c87b56dd146108b6578063e985e9c5146108f3578063ee1cca4614610930578063f2fde38b1461095b578063fb881d381461098457610246565b8063a22cb465146107a6578063a2791f86146107cf578063b88c9148146107fa578063b88d4fde14610837578063baa86f071461086057610246565b8063824eada0116100fd578063824eada0146106db5780638a2f34ea146106f75780638da5cb5b1461071357806395d89b411461073e5780639ec00c951461076957610246565b80636c0360eb1461060357806370a082311461062e578063715018a61461066b578063755edd1714610682578063775b9c13146106b257610246565b806342966c68116101c757806354a7e4661161018b57806354a7e4661461051e57806355f804b314610549578063596464631461057257806360b803311461059d5780636352211e146105c657610246565b806342966c681461043957806343cc7278146104625780634a7c01ec1461048d5780634f6ccce7146104b857806352f7c988146104f557610246565b806318160ddd1161020e57806318160ddd1461034257806323b872dd1461036d5780632f745c5914610396578063372c12b1146103d357806342842e0e1461041057610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f057806317f12e5b14610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613992565b6109ad565b60405161027f9190613f8b565b60405180910390f35b34801561029457600080fd5b5061029d6109bf565b6040516102aa9190613fa6565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613a25565b610a51565b6040516102e79190613eed565b60405180910390f35b3480156102fc57600080fd5b50610317600480360381019061031291906138ae565b610a97565b005b34801561032557600080fd5b50610340600480360381019061033b9190613a25565b610baf565b005b34801561034e57600080fd5b50610357610bc1565b6040516103649190614228565b60405180910390f35b34801561037957600080fd5b50610394600480360381019061038f91906137a8565b610bce565b005b3480156103a257600080fd5b506103bd60048036038101906103b891906138ae565b610c2e565b6040516103ca9190614228565b60405180910390f35b3480156103df57600080fd5b506103fa60048036038101906103f59190613743565b610cd3565b6040516104079190613f8b565b60405180910390f35b34801561041c57600080fd5b50610437600480360381019061043291906137a8565b610cf3565b005b34801561044557600080fd5b50610460600480360381019061045b9190613a25565b610d13565b005b34801561046e57600080fd5b50610477610d97565b6040516104849190613eed565b60405180910390f35b34801561049957600080fd5b506104a2610dbd565b6040516104af9190614228565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da9190613a25565b610dc3565b6040516104ec9190614228565b60405180910390f35b34801561050157600080fd5b5061051c60048036038101906105179190613a77565b610e5a565b005b34801561052a57600080fd5b50610533610e74565b6040516105409190614228565b60405180910390f35b34801561055557600080fd5b50610570600480360381019061056b91906139e4565b610e7a565b005b34801561057e57600080fd5b50610587610e9c565b6040516105949190614228565b60405180910390f35b3480156105a957600080fd5b506105c460048036038101906105bf9190613a25565b610ea2565b005b3480156105d257600080fd5b506105ed60048036038101906105e89190613a25565b610eb4565b6040516105fa9190613eed565b60405180910390f35b34801561060f57600080fd5b50610618610f66565b6040516106259190613fa6565b60405180910390f35b34801561063a57600080fd5b5061065560048036038101906106509190613743565b610ff4565b6040516106629190614228565b60405180910390f35b34801561067757600080fd5b506106806110ac565b005b61069c60048036038101906106979190613743565b6110c0565b6040516106a99190614228565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d49190613951565b6112fa565b005b6106f560048036038101906106f091906138ea565b6113bd565b005b610711600480360381019061070c91906138ae565b6116fc565b005b34801561071f57600080fd5b5061072861195c565b6040516107359190613eed565b60405180910390f35b34801561074a57600080fd5b50610753611986565b6040516107609190613fa6565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b9190613743565b611a18565b60405161079d9190614228565b60405180910390f35b3480156107b257600080fd5b506107cd60048036038101906107c89190613872565b611a30565b005b3480156107db57600080fd5b506107e4611a46565b6040516107f19190613eed565b60405180910390f35b34801561080657600080fd5b50610821600480360381019061081c9190613743565b611a6c565b60405161082e9190614228565b60405180910390f35b34801561084357600080fd5b5061085e600480360381019061085991906137f7565b611cfe565b005b34801561086c57600080fd5b50610875611d60565b6040516108829190613eed565b60405180910390f35b34801561089757600080fd5b506108a0611d86565b6040516108ad9190614228565b60405180910390f35b3480156108c257600080fd5b506108dd60048036038101906108d89190613a25565b611d8c565b6040516108ea9190613fa6565b60405180910390f35b3480156108ff57600080fd5b5061091a6004803603810190610915919061376c565b611dc0565b6040516109279190613f8b565b60405180910390f35b34801561093c57600080fd5b50610945611e54565b6040516109529190614228565b60405180910390f35b34801561096757600080fd5b50610982600480360381019061097d9190613743565b611e5a565b005b34801561099057600080fd5b506109ab60048036038101906109a691906138ae565b611ede565b005b60006109b882611f32565b9050919050565b6060600080546109ce90614545565b80601f01602080910402602001604051908101604052809291908181526020018280546109fa90614545565b8015610a475780601f10610a1c57610100808354040283529160200191610a47565b820191906000526020600020905b815481529060010190602001808311610a2a57829003601f168201915b5050505050905090565b6000610a5c82611fac565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aa282610eb4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0a906141a8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b32611ff7565b73ffffffffffffffffffffffffffffffffffffffff161480610b615750610b6081610b5b611ff7565b611dc0565b5b610ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9790614128565b60405180910390fd5b610baa8383611fff565b505050565b610bb76120b8565b8060118190555050565b6000600880549050905090565b610bdf610bd9611ff7565b82612136565b610c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c15906141e8565b60405180910390fd5b610c298383836121cb565b505050565b6000610c3983610ff4565b8210610c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7190613fe8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60176020528060005260406000206000915054906101000a900460ff1681565b610d0e83838360405180602001604052806000815250611cfe565b505050565b803373ffffffffffffffffffffffffffffffffffffffff16610d3482610eb4565b73ffffffffffffffffffffffffffffffffffffffff1614610d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8190613fc8565b60405180910390fd5b610d9382612432565b5050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60125481565b6000610dcd610bc1565b8210610e0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e05906141c8565b60405180910390fd5b60088281548110610e48577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610e626120b8565b81600f81905550806010819055505050565b60145481565b610e826120b8565b80600c9080519060200190610e98929190613426565b5050565b600f5481565b610eaa6120b8565b8060128190555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5490614188565b60405180910390fd5b80915050919050565b600c8054610f7390614545565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9f90614545565b8015610fec5780601f10610fc157610100808354040283529160200191610fec565b820191906000526020600020905b815481529060010190602001808311610fcf57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105c906140c8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110b46120b8565b6110be600061243e565b565b60006110cb33611a6c565b341461110c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611103906140e8565b60405180910390fd5b601254601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061118f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118690614108565b60405180910390fd5b6001601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111df919061437a565b925050819055506111f0600b612504565b611203826111fe600b61251a565b612528565b600060646003346112149190614401565b61121e91906143d0565b90506000813461122e919061445b565b9050601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611298573d6000803e3d6000fd5b506112a161195c565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156112e6573d6000803e3d6000fd5b506112f1600b61251a565b92505050919050565b6113026120b8565b60005b81518110156113b95760016017600084848151811061134d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806113b1906145a8565b915050611305565b5050565b60125482601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461140b919061437a565b111561144c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144390614108565b60405180910390fd5b81600e5461145a9190614401565b341461149b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611492906140e8565b60405180910390fd5b816014546114a99190614401565b8151146114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e290614208565b60405180910390fd5b81601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461153a919061437a565b9250508190555060005b8281101561168d5760005b60145481101561165c57601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd336115a061195c565b8685601454886115b09190614401565b6115ba919061437a565b815181106115f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b815260040161161793929190613f08565b600060405180830381600087803b15801561163157600080fd5b505af1158015611645573d6000803e3d6000fd5b505050508080611654906145a8565b91505061154f565b50611667600b612504565b61167a84611675600b61251a565b612528565b8080611685906145a8565b915050611544565b50601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156116f6573d6000803e3d6000fd5b50505050565b60125481601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461174a919061437a565b111561178b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178290614108565b60405180910390fd5b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117da919061437a565b92505081905550806117eb33611a6c565b6117f59190614401565b3414611836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182d906140e8565b60405180910390fd5b60005b818110156118715761184b600b612504565b61185e83611859600b61251a565b612528565b8080611869906145a8565b915050611839565b50600060646003346118839190614401565b61188d91906143d0565b90506000813461189d919061445b565b9050601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611907573d6000803e3d6000fd5b5061191061195c565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611955573d6000803e3d6000fd5b5050505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461199590614545565b80601f01602080910402602001604051908101604052809291908181526020018280546119c190614545565b8015611a0e5780601f106119e357610100808354040283529160200191611a0e565b820191906000526020600020905b8154815290600101906020018083116119f157829003601f168201915b5050505050905090565b60186020528060005260406000206000915090505481565b611a42611a3b611ff7565b8383612546565b5050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611a7661195c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ab25760009050611cf9565b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401611b0f9190613eed565b60206040518083038186803b158015611b2757600080fd5b505afa158015611b3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5f9190613a4e565b118015611bb55750601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611bda576010546011541015611bd0576011549050611cf9565b6010549050611cf9565b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401611c379190613eed565b60206040518083038186803b158015611c4f57600080fd5b505afa158015611c63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c879190613a4e565b1115611c97576011549050611cf9565b601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611cf3576010549050611cf9565b600f5490505b919050565b611d0f611d09611ff7565b83612136565b611d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d45906141e8565b60405180910390fd5b611d5a848484846126b3565b50505050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b6060600c611d998361270f565b604051602001611daa929190613ebe565b6040516020818303038152906040529050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60115481565b611e626120b8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec990614028565b60405180910390fd5b611edb8161243e565b50565b611ee66120b8565b81601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806014819055505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fa55750611fa4826128bc565b5b9050919050565b611fb58161299e565b611ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611feb90614188565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661207283610eb4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6120c0611ff7565b73ffffffffffffffffffffffffffffffffffffffff166120de61195c565b73ffffffffffffffffffffffffffffffffffffffff1614612134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212b90614168565b60405180910390fd5b565b60008061214283610eb4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061218457506121838185611dc0565b5b806121c257508373ffffffffffffffffffffffffffffffffffffffff166121aa84610a51565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166121eb82610eb4565b73ffffffffffffffffffffffffffffffffffffffff1614612241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223890614048565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a890614088565b60405180910390fd5b6122bc838383612a0a565b6122c7600082611fff565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612317919061445b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461236e919061437a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461242d838383612a1a565b505050565b61243b81612a1f565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b600081600001549050919050565b612542828260405180602001604052806000815250612b3c565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ac906140a8565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126a69190613f8b565b60405180910390a3505050565b6126be8484846121cb565b6126ca84848484612b97565b612709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270090614008565b60405180910390fd5b50505050565b60606000821415612757576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506128b7565b600082905060005b60008214612789578080612772906145a8565b915050600a8261278291906143d0565b915061275f565b60008167ffffffffffffffff8111156127cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127fd5781602001600182028036833780820191505090505b5090505b600085146128b057600182612816919061445b565b9150600a8561282591906145f1565b6030612831919061437a565b60f81b81838151811061286d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128a991906143d0565b9450612801565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061298757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612997575061299682612d2e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b612a15838383612d98565b505050565b505050565b6000612a2a82610eb4565b9050612a3881600084612a0a565b612a43600083611fff565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a93919061445b565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b3881600084612a1a565b5050565b612b468383612eac565b612b536000848484612b97565b612b92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8990614008565b60405180910390fd5b505050565b6000612bb88473ffffffffffffffffffffffffffffffffffffffff16613086565b15612d21578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612be1611ff7565b8786866040518563ffffffff1660e01b8152600401612c039493929190613f3f565b602060405180830381600087803b158015612c1d57600080fd5b505af1925050508015612c4e57506040513d601f19601f82011682018060405250810190612c4b91906139bb565b60015b612cd1573d8060008114612c7e576040519150601f19603f3d011682016040523d82523d6000602084013e612c83565b606091505b50600081511415612cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc090614008565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d26565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612da38383836130a9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612de657612de1816130ae565b612e25565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e2457612e2383826130f7565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e6857612e6381613264565b612ea7565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ea657612ea582826133a7565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1390614148565b60405180910390fd5b612f258161299e565b15612f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5c90614068565b60405180910390fd5b612f7160008383612a0a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fc1919061437a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461308260008383612a1a565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161310484610ff4565b61310e919061445b565b90506000600760008481526020019081526020016000205490508181146131f3576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613278919061445b565b90506000600960008481526020019081526020016000205490506000600883815481106132ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613316577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061338b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006133b283610ff4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461343290614545565b90600052602060002090601f016020900481019282613454576000855561349b565b82601f1061346d57805160ff191683800117855561349b565b8280016001018555821561349b579182015b8281111561349a57825182559160200191906001019061347f565b5b5090506134a891906134ac565b5090565b5b808211156134c55760008160009055506001016134ad565b5090565b60006134dc6134d784614268565b614243565b905080838252602082019050828560208602820111156134fb57600080fd5b60005b8581101561352b5781613511888261361d565b8452602084019350602083019250506001810190506134fe565b5050509392505050565b600061354861354384614294565b614243565b9050808382526020820190508285602086028201111561356757600080fd5b60005b85811015613597578161357d8882613719565b84526020840193506020830192505060018101905061356a565b5050509392505050565b60006135b46135af846142c0565b614243565b9050828152602081018484840111156135cc57600080fd5b6135d7848285614503565b509392505050565b60006135f26135ed846142f1565b614243565b90508281526020810184848401111561360a57600080fd5b613615848285614503565b509392505050565b60008135905061362c81614b9f565b92915050565b600082601f83011261364357600080fd5b81356136538482602086016134c9565b91505092915050565b600082601f83011261366d57600080fd5b813561367d848260208601613535565b91505092915050565b60008135905061369581614bb6565b92915050565b6000813590506136aa81614bcd565b92915050565b6000815190506136bf81614bcd565b92915050565b600082601f8301126136d657600080fd5b81356136e68482602086016135a1565b91505092915050565b600082601f83011261370057600080fd5b81356137108482602086016135df565b91505092915050565b60008135905061372881614be4565b92915050565b60008151905061373d81614be4565b92915050565b60006020828403121561375557600080fd5b60006137638482850161361d565b91505092915050565b6000806040838503121561377f57600080fd5b600061378d8582860161361d565b925050602061379e8582860161361d565b9150509250929050565b6000806000606084860312156137bd57600080fd5b60006137cb8682870161361d565b93505060206137dc8682870161361d565b92505060406137ed86828701613719565b9150509250925092565b6000806000806080858703121561380d57600080fd5b600061381b8782880161361d565b945050602061382c8782880161361d565b935050604061383d87828801613719565b925050606085013567ffffffffffffffff81111561385a57600080fd5b613866878288016136c5565b91505092959194509250565b6000806040838503121561388557600080fd5b60006138938582860161361d565b92505060206138a485828601613686565b9150509250929050565b600080604083850312156138c157600080fd5b60006138cf8582860161361d565b92505060206138e085828601613719565b9150509250929050565b6000806000606084860312156138ff57600080fd5b600061390d8682870161361d565b935050602061391e86828701613719565b925050604084013567ffffffffffffffff81111561393b57600080fd5b6139478682870161365c565b9150509250925092565b60006020828403121561396357600080fd5b600082013567ffffffffffffffff81111561397d57600080fd5b61398984828501613632565b91505092915050565b6000602082840312156139a457600080fd5b60006139b28482850161369b565b91505092915050565b6000602082840312156139cd57600080fd5b60006139db848285016136b0565b91505092915050565b6000602082840312156139f657600080fd5b600082013567ffffffffffffffff811115613a1057600080fd5b613a1c848285016136ef565b91505092915050565b600060208284031215613a3757600080fd5b6000613a4584828501613719565b91505092915050565b600060208284031215613a6057600080fd5b6000613a6e8482850161372e565b91505092915050565b60008060408385031215613a8a57600080fd5b6000613a9885828601613719565b9250506020613aa985828601613719565b9150509250929050565b613abc8161448f565b82525050565b613acb816144a1565b82525050565b6000613adc82614337565b613ae6818561434d565b9350613af6818560208601614512565b613aff816146de565b840191505092915050565b6000613b1582614342565b613b1f818561435e565b9350613b2f818560208601614512565b613b38816146de565b840191505092915050565b6000613b4e82614342565b613b58818561436f565b9350613b68818560208601614512565b80840191505092915050565b60008154613b8181614545565b613b8b818661436f565b94506001821660008114613ba65760018114613bb757613bea565b60ff19831686528186019350613bea565b613bc085614322565b60005b83811015613be257815481890152600182019150602081019050613bc3565b838801955050505b50505092915050565b6000613c00601f8361435e565b9150613c0b826146ef565b602082019050919050565b6000613c23602b8361435e565b9150613c2e82614718565b604082019050919050565b6000613c4660328361435e565b9150613c5182614767565b604082019050919050565b6000613c6960268361435e565b9150613c74826147b6565b604082019050919050565b6000613c8c60258361435e565b9150613c9782614805565b604082019050919050565b6000613caf601c8361435e565b9150613cba82614854565b602082019050919050565b6000613cd260248361435e565b9150613cdd8261487d565b604082019050919050565b6000613cf560198361435e565b9150613d00826148cc565b602082019050919050565b6000613d1860298361435e565b9150613d23826148f5565b604082019050919050565b6000613d3b600c8361435e565b9150613d4682614944565b602082019050919050565b6000613d5e600d8361435e565b9150613d698261496d565b602082019050919050565b6000613d81603e8361435e565b9150613d8c82614996565b604082019050919050565b6000613da460208361435e565b9150613daf826149e5565b602082019050919050565b6000613dc760058361436f565b9150613dd282614a0e565b600582019050919050565b6000613dea60208361435e565b9150613df582614a37565b602082019050919050565b6000613e0d60188361435e565b9150613e1882614a60565b602082019050919050565b6000613e3060218361435e565b9150613e3b82614a89565b604082019050919050565b6000613e53602c8361435e565b9150613e5e82614ad8565b604082019050919050565b6000613e76602e8361435e565b9150613e8182614b27565b604082019050919050565b6000613e9960158361435e565b9150613ea482614b76565b602082019050919050565b613eb8816144f9565b82525050565b6000613eca8285613b74565b9150613ed68284613b43565b9150613ee182613dba565b91508190509392505050565b6000602082019050613f026000830184613ab3565b92915050565b6000606082019050613f1d6000830186613ab3565b613f2a6020830185613ab3565b613f376040830184613eaf565b949350505050565b6000608082019050613f546000830187613ab3565b613f616020830186613ab3565b613f6e6040830185613eaf565b8181036060830152613f808184613ad1565b905095945050505050565b6000602082019050613fa06000830184613ac2565b92915050565b60006020820190508181036000830152613fc08184613b0a565b905092915050565b60006020820190508181036000830152613fe181613bf3565b9050919050565b6000602082019050818103600083015261400181613c16565b9050919050565b6000602082019050818103600083015261402181613c39565b9050919050565b6000602082019050818103600083015261404181613c5c565b9050919050565b6000602082019050818103600083015261406181613c7f565b9050919050565b6000602082019050818103600083015261408181613ca2565b9050919050565b600060208201905081810360008301526140a181613cc5565b9050919050565b600060208201905081810360008301526140c181613ce8565b9050919050565b600060208201905081810360008301526140e181613d0b565b9050919050565b6000602082019050818103600083015261410181613d2e565b9050919050565b6000602082019050818103600083015261412181613d51565b9050919050565b6000602082019050818103600083015261414181613d74565b9050919050565b6000602082019050818103600083015261416181613d97565b9050919050565b6000602082019050818103600083015261418181613ddd565b9050919050565b600060208201905081810360008301526141a181613e00565b9050919050565b600060208201905081810360008301526141c181613e23565b9050919050565b600060208201905081810360008301526141e181613e46565b9050919050565b6000602082019050818103600083015261420181613e69565b9050919050565b6000602082019050818103600083015261422181613e8c565b9050919050565b600060208201905061423d6000830184613eaf565b92915050565b600061424d61425e565b90506142598282614577565b919050565b6000604051905090565b600067ffffffffffffffff821115614283576142826146af565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156142af576142ae6146af565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156142db576142da6146af565b5b6142e4826146de565b9050602081019050919050565b600067ffffffffffffffff82111561430c5761430b6146af565b5b614315826146de565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614385826144f9565b9150614390836144f9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143c5576143c4614622565b5b828201905092915050565b60006143db826144f9565b91506143e6836144f9565b9250826143f6576143f5614651565b5b828204905092915050565b600061440c826144f9565b9150614417836144f9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144505761444f614622565b5b828202905092915050565b6000614466826144f9565b9150614471836144f9565b92508282101561448457614483614622565b5b828203905092915050565b600061449a826144d9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614530578082015181840152602081019050614515565b8381111561453f576000848401525b50505050565b6000600282049050600182168061455d57607f821691505b6020821081141561457157614570614680565b5b50919050565b614580826146de565b810181811067ffffffffffffffff8211171561459f5761459e6146af565b5b80604052505050565b60006145b3826144f9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145e6576145e5614622565b5b600182019050919050565b60006145fc826144f9565b9150614607836144f9565b92508261461757614616614651565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e6572734f6e6c793a204f4e4c595f4f574e4552535f414c4c4f57454400600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f466565206d69736d617463680000000000000000000000000000000000000000600082015250565b7f6c696d6974207265616368656400000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f4e4654207175616e74697479206d69736d617463680000000000000000000000600082015250565b614ba88161448f565b8114614bb357600080fd5b50565b614bbf816144a1565b8114614bca57600080fd5b50565b614bd6816144ad565b8114614be157600080fd5b50565b614bed816144f9565b8114614bf857600080fd5b5056fea2646970667358221220aaba6def40b21ec5852d0ab73261b61db28ef7f7f3dc365c2afdea66b5d9a34364736f6c63430008040033000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000052663ccab1e1c000000000000000000000000000000000000000000000000000340aad21b3b70000000000000000000000000000000000000000000000000000410d586a20a4c0000000000000000000000000000a506b3938377635fa9c091e9af8748fa1c9a24240000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000001869f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009436c6f776e6669736800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005434c4f574e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006868747470733a2f2f636f72676973747564696f2e667261312e6469676974616c6f6365616e7370616365732e636f6d2f436c6f776e666973685f64343637366234632d313661652d343538332d393462632d3132326264346362366265352f6d657461646174612f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed ByteCode Sourcemap

54980:6329:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60852:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27334:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28847:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28364:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57486:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42338:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29547:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42006:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55572:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29954:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60465:78;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55493:70;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55343:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42528:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57328:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55415:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57829:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55251:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57927:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27045:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55156:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26776:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4366:103;;;;;;;;;;;;;:::i;:::-;;58260:608;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57611:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59584:873;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58876:700;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3718:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27503:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55620:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29090:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55457:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56713:607;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30210:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55373:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55279:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61048:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29316:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55310:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4624:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58035:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60852:188;60967:4;60996:36;61020:11;60996:23;:36::i;:::-;60989:43;;60852:188;;;:::o;27334:100::-;27388:13;27421:5;27414:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27334:100;:::o;28847:171::-;28923:7;28943:23;28958:7;28943:14;:23::i;:::-;28986:15;:24;29002:7;28986:24;;;;;;;;;;;;;;;;;;;;;28979:31;;28847:171;;;:::o;28364:417::-;28445:13;28461:23;28476:7;28461:14;:23::i;:::-;28445:39;;28509:5;28503:11;;:2;:11;;;;28495:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28603:5;28587:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28612:37;28629:5;28636:12;:10;:12::i;:::-;28612:16;:37::i;:::-;28587:62;28565:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;28752:21;28761:2;28765:7;28752:8;:21::i;:::-;28364:417;;;:::o;57486:117::-;3604:13;:11;:13::i;:::-;57580:15:::1;57563:14;:32;;;;57486:117:::0;:::o;42338:113::-;42399:7;42426:10;:17;;;;42419:24;;42338:113;:::o;29547:336::-;29742:41;29761:12;:10;:12::i;:::-;29775:7;29742:18;:41::i;:::-;29734:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;29847:28;29857:4;29863:2;29867:7;29847:9;:28::i;:::-;29547:336;;;:::o;42006:256::-;42103:7;42139:23;42156:5;42139:16;:23::i;:::-;42131:5;:31;42123:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;42228:12;:19;42241:5;42228:19;;;;;;;;;;;;;;;:26;42248:5;42228:26;;;;;;;;;;;;42221:33;;42006:256;;;;:::o;55572:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;29954:185::-;30092:39;30109:4;30115:2;30119:7;30092:39;;;;;;;;;;;;:16;:39::i;:::-;29954:185;;;:::o;60465:78::-;60509:3;55746:10;55730:26;;:12;55738:3;55730:7;:12::i;:::-;:26;;;55722:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;60525:10:::1;60531:3;60525:5;:10::i;:::-;60465:78:::0;;:::o;55493:70::-;;;;;;;;;;;;;:::o;55343:21::-;;;;:::o;42528:233::-;42603:7;42639:30;:28;:30::i;:::-;42631:5;:38;42623:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;42736:10;42747:5;42736:17;;;;;;;;;;;;;;;;;;;;;;;;42729:24;;42528:233;;;:::o;57328:150::-;3604:13;:11;:13::i;:::-;57421:10:::1;57409:9;:22;;;;57457:13;57442:12;:28;;;;57328:150:::0;;:::o;55415:33::-;;;;:::o;57829:90::-;3604:13;:11;:13::i;:::-;57907:4:::1;57897:7;:14;;;;;;;;;;;;:::i;:::-;;57829:90:::0;:::o;55251:21::-;;;;:::o;57927:100::-;3604:13;:11;:13::i;:::-;58009:10:::1;57997:9;:22;;;;57927:100:::0;:::o;27045:222::-;27117:7;27137:13;27153:7;:16;27161:7;27153:16;;;;;;;;;;;;;;;;;;;;;27137:32;;27205:1;27188:19;;:5;:19;;;;27180:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;27254:5;27247:12;;;27045:222;;;:::o;55156:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26776:207::-;26848:7;26893:1;26876:19;;:5;:19;;;;26868:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26959:9;:16;26969:5;26959:16;;;;;;;;;;;;;;;;26952:23;;26776:207;;;:::o;4366:103::-;3604:13;:11;:13::i;:::-;4431:30:::1;4458:1;4431:18;:30::i;:::-;4366:103::o:0;58260:608::-;58323:7;58364:18;58371:10;58364:6;:18::i;:::-;58351:9;:31;58343:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;58451:9;;58418:15;:30;58434:13;58418:30;;;;;;;;;;;;;;;;:42;58410:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58523:1;58489:15;:30;58505:13;58489:30;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;58537:20;:8;:18;:20::i;:::-;58570:44;58580:13;58595:18;:8;:16;:18::i;:::-;58570:9;:44::i;:::-;58625:17;58661:3;58657:1;58645:9;:13;;;;:::i;:::-;:19;;;;:::i;:::-;58625:39;;58675:17;58707:12;58695:9;:24;;;;:::i;:::-;58675:44;;58738:10;;;;;;;;;;;58730:28;;:42;58759:12;58730:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58791:7;:5;:7::i;:::-;58783:25;;:39;58809:12;58783:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58842:18;:8;:16;:18::i;:::-;58835:25;;;;58260:608;;;:::o;57611:210::-;3604:13;:11;:13::i;:::-;57702:6:::1;57697:117;57718:17;:24;57714:1;:28;57697:117;;;57798:4;57764:9;:31;57774:17;57792:1;57774:20;;;;;;;;;;;;;;;;;;;;;;57764:31;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;57744:3;;;;;:::i;:::-;;;;57697:117;;;;57611:210:::0;:::o;59584:873::-;59785:9;;59772;59739:15;:30;59755:13;59739:30;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;:55;;59731:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;59858:9;59845:10;;:22;;;;:::i;:::-;59831:9;:37;59823:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;59946:9;59922:21;;:33;;;;:::i;:::-;59904:7;:14;:51;59896:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;60028:9;59994:15;:30;60010:13;59994:30;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;60053:9;60048:350;60072:9;60068:1;:13;60048:350;;;60108:9;60103:190;60127:21;;60123:1;:25;60103:190;;;60182:20;;;;;;;;;;;60174:42;;;60217:10;60229:7;:5;:7::i;:::-;60238;60274:1;60250:21;;60246:1;:25;;;;:::i;:::-;:29;;;;:::i;:::-;60238:38;;;;;;;;;;;;;;;;;;;;;;60174:103;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60150:3;;;;;:::i;:::-;;;;60103:190;;;;60307:20;:8;:18;:20::i;:::-;60342:44;60352:13;60367:18;:8;:16;:18::i;:::-;60342:9;:44::i;:::-;60083:3;;;;;:::i;:::-;;;;60048:350;;;;60418:10;;;;;;;;;;;60410:28;;:39;60439:9;60410:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59584:873;;;:::o;58876:700::-;59040:9;;59027;58994:15;:30;59010:13;58994:30;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;:55;;58986:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;59112:9;59078:15;:30;59094:13;59078:30;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;59175:9;59154:18;59161:10;59154:6;:18::i;:::-;:30;;;;:::i;:::-;59140:9;:45;59132:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;59218:9;59213:146;59237:9;59233:1;:13;59213:146;;;59268:20;:8;:18;:20::i;:::-;59303:44;59313:13;59328:18;:8;:16;:18::i;:::-;59303:9;:44::i;:::-;59248:3;;;;;:::i;:::-;;;;59213:146;;;;59371:17;59407:3;59403:1;59391:9;:13;;;;:::i;:::-;:19;;;;:::i;:::-;59371:39;;59421:17;59453:12;59441:9;:24;;;;:::i;:::-;59421:44;;59484:10;;;;;;;;;;;59476:28;;:42;59505:12;59476:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59537:7;:5;:7::i;:::-;59529:25;;:39;59555:12;59529:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58876:700;;;;:::o;3718:87::-;3764:7;3791:6;;;;;;;;;;;3784:13;;3718:87;:::o;27503:104::-;27559:13;27592:7;27585:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27503:104;:::o;55620:50::-;;;;;;;;;;;;;;;;;:::o;29090:155::-;29185:52;29204:12;:10;:12::i;:::-;29218:8;29228;29185:18;:52::i;:::-;29090:155;;:::o;55457:27::-;;;;;;;;;;;;;:::o;56713:607::-;56766:4;56797:7;:5;:7::i;:::-;56787:17;;:6;:17;;;56783:58;;;56828:1;56821:8;;;;56783:58;56898:1;56864:12;;;;;;;;;;;56856:31;;;56888:6;56856:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;56855:66;;;;;56904:9;:17;56914:6;56904:17;;;;;;;;;;;;;;;;;;;;;;;;;56855:66;56851:249;;;56959:12;;56942:14;;:29;56938:151;;;56999:14;;56992:21;;;;56938:151;57061:12;;57054:19;;;;56851:249;57156:1;57122:12;;;;;;;;;;;57114:31;;;57146:6;57114:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;57110:97;;;57181:14;;57174:21;;;;57110:97;57221:9;:17;57231:6;57221:17;;;;;;;;;;;;;;;;;;;;;;;;;57217:69;;;57262:12;;57255:19;;;;57217:69;57303:9;;57296:16;;56713:607;;;;:::o;30210:323::-;30384:41;30403:12;:10;:12::i;:::-;30417:7;30384:18;:41::i;:::-;30376:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;30487:38;30501:4;30507:2;30511:7;30520:4;30487:13;:38::i;:::-;30210:323;;;;:::o;55373:35::-;;;;;;;;;;;;;:::o;55279:24::-;;;;:::o;61048:258::-;61141:13;61217:7;61239:25;61256:7;61239:16;:25::i;:::-;61186:101;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61172:126;;61048:258;;;:::o;29316:164::-;29413:4;29437:18;:25;29456:5;29437:25;;;;;;;;;;;;;;;:35;29463:8;29437:35;;;;;;;;;;;;;;;;;;;;;;;;;29430:42;;29316:164;;;;:::o;55310:26::-;;;;:::o;4624:201::-;3604:13;:11;:13::i;:::-;4733:1:::1;4713:22;;:8;:22;;;;4705:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4789:28;4808:8;4789:18;:28::i;:::-;4624:201:::0;:::o;58035:217::-;3604:13;:11;:13::i;:::-;58166:21:::1;58143:20;;:44;;;;;;;;;;;;;;;;;;58222:22;58198:21;:46;;;;58035:217:::0;;:::o;41698:224::-;41800:4;41839:35;41824:50;;;:11;:50;;;;:90;;;;41878:36;41902:11;41878:23;:36::i;:::-;41824:90;41817:97;;41698:224;;;:::o;36822:135::-;36904:16;36912:7;36904;:16::i;:::-;36896:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;36822:135;:::o;2260:98::-;2313:7;2340:10;2333:17;;2260:98;:::o;36101:174::-;36203:2;36176:15;:24;36192:7;36176:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36259:7;36255:2;36221:46;;36230:23;36245:7;36230:14;:23::i;:::-;36221:46;;;;;;;;;;;;36101:174;;:::o;3883:132::-;3958:12;:10;:12::i;:::-;3947:23;;:7;:5;:7::i;:::-;:23;;;3939:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3883:132::o;32334:264::-;32427:4;32444:13;32460:23;32475:7;32460:14;:23::i;:::-;32444:39;;32513:5;32502:16;;:7;:16;;;:52;;;;32522:32;32539:5;32546:7;32522:16;:32::i;:::-;32502:52;:87;;;;32582:7;32558:31;;:20;32570:7;32558:11;:20::i;:::-;:31;;;32502:87;32494:96;;;32334:264;;;;:::o;35357:625::-;35516:4;35489:31;;:23;35504:7;35489:14;:23::i;:::-;:31;;;35481:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;35595:1;35581:16;;:2;:16;;;;35573:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35651:39;35672:4;35678:2;35682:7;35651:20;:39::i;:::-;35755:29;35772:1;35776:7;35755:8;:29::i;:::-;35816:1;35797:9;:15;35807:4;35797:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35845:1;35828:9;:13;35838:2;35828:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35876:2;35857:7;:16;35865:7;35857:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35915:7;35911:2;35896:27;;35905:4;35896:27;;;;;;;;;;;;35936:38;35956:4;35962:2;35966:7;35936:19;:38::i;:::-;35357:625;;;:::o;60747:97::-;60816:20;60828:7;60816:11;:20::i;:::-;60747:97;:::o;4985:191::-;5059:16;5078:6;;;;;;;;;;;5059:25;;5104:8;5095:6;;:17;;;;;;;;;;;;;;;;;;5159:8;5128:40;;5149:8;5128:40;;;;;;;;;;;;4985:191;;:::o;1099:127::-;1206:1;1188:7;:14;;;:19;;;;;;;;;;;1099:127;:::o;977:114::-;1042:7;1069;:14;;;1062:21;;977:114;;;:::o;32940:110::-;33016:26;33026:2;33030:7;33016:26;;;;;;;;;;;;:9;:26::i;:::-;32940:110;;:::o;36418:315::-;36573:8;36564:17;;:5;:17;;;;36556:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36660:8;36622:18;:25;36641:5;36622:25;;;;;;;;;;;;;;;:35;36648:8;36622:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36706:8;36684:41;;36699:5;36684:41;;;36716:8;36684:41;;;;;;:::i;:::-;;;;;;;;36418:315;;;:::o;31414:313::-;31570:28;31580:4;31586:2;31590:7;31570:9;:28::i;:::-;31617:47;31640:4;31646:2;31650:7;31659:4;31617:22;:47::i;:::-;31609:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;31414:313;;;;:::o;5624:723::-;5680:13;5910:1;5901:5;:10;5897:53;;;5928:10;;;;;;;;;;;;;;;;;;;;;5897:53;5960:12;5975:5;5960:20;;5991:14;6016:78;6031:1;6023:4;:9;6016:78;;6049:8;;;;;:::i;:::-;;;;6080:2;6072:10;;;;;:::i;:::-;;;6016:78;;;6104:19;6136:6;6126:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6104:39;;6154:154;6170:1;6161:5;:10;6154:154;;6198:1;6188:11;;;;;:::i;:::-;;;6265:2;6257:5;:10;;;;:::i;:::-;6244:2;:24;;;;:::i;:::-;6231:39;;6214:6;6221;6214:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;6294:2;6285:11;;;;;:::i;:::-;;;6154:154;;;6332:6;6318:21;;;;;5624:723;;;;:::o;26407:305::-;26509:4;26561:25;26546:40;;;:11;:40;;;;:105;;;;26618:33;26603:48;;;:11;:48;;;;26546:105;:158;;;;26668:36;26692:11;26668:23;:36::i;:::-;26546:158;26526:178;;26407:305;;;:::o;32040:127::-;32105:4;32157:1;32129:30;;:7;:16;32137:7;32129:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32122:37;;32040:127;;;:::o;60551:188::-;60686:45;60713:4;60719:2;60723:7;60686:26;:45::i;:::-;60551:188;;;:::o;39457:125::-;;;;:::o;34600:420::-;34660:13;34676:23;34691:7;34676:14;:23::i;:::-;34660:39;;34712:48;34733:5;34748:1;34752:7;34712:20;:48::i;:::-;34801:29;34818:1;34822:7;34801:8;:29::i;:::-;34863:1;34843:9;:16;34853:5;34843:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;34882:7;:16;34890:7;34882:16;;;;;;;;;;;;34875:23;;;;;;;;;;;34944:7;34940:1;34916:36;;34925:5;34916:36;;;;;;;;;;;;34965:47;34985:5;35000:1;35004:7;34965:19;:47::i;:::-;34600:420;;:::o;33277:319::-;33406:18;33412:2;33416:7;33406:5;:18::i;:::-;33457:53;33488:1;33492:2;33496:7;33505:4;33457:22;:53::i;:::-;33435:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;33277:319;;;:::o;37521:853::-;37675:4;37696:15;:2;:13;;;:15::i;:::-;37692:675;;;37748:2;37732:36;;;37769:12;:10;:12::i;:::-;37783:4;37789:7;37798:4;37732:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37728:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37990:1;37973:6;:13;:18;37969:328;;;38016:60;;;;;;;;;;:::i;:::-;;;;;;;;37969:328;38247:6;38241:13;38232:6;38228:2;38224:15;38217:38;37728:584;37864:41;;;37854:51;;;:6;:51;;;;37847:58;;;;;37692:675;38351:4;38344:11;;37521:853;;;;;;;:::o;24827:157::-;24912:4;24951:25;24936:40;;;:11;:40;;;;24929:47;;24827:157;;;:::o;43374:589::-;43518:45;43545:4;43551:2;43555:7;43518:26;:45::i;:::-;43596:1;43580:18;;:4;:18;;;43576:187;;;43615:40;43647:7;43615:31;:40::i;:::-;43576:187;;;43685:2;43677:10;;:4;:10;;;43673:90;;43704:47;43737:4;43743:7;43704:32;:47::i;:::-;43673:90;43576:187;43791:1;43777:16;;:2;:16;;;43773:183;;;43810:45;43847:7;43810:36;:45::i;:::-;43773:183;;;43883:4;43877:10;;:2;:10;;;43873:83;;43904:40;43932:2;43936:7;43904:27;:40::i;:::-;43873:83;43773:183;43374:589;;;:::o;33932:439::-;34026:1;34012:16;;:2;:16;;;;34004:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34085:16;34093:7;34085;:16::i;:::-;34084:17;34076:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34147:45;34176:1;34180:2;34184:7;34147:20;:45::i;:::-;34222:1;34205:9;:13;34215:2;34205:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34253:2;34234:7;:16;34242:7;34234:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34298:7;34294:2;34273:33;;34290:1;34273:33;;;;;;;;;;;;34319:44;34347:1;34351:2;34355:7;34319:19;:44::i;:::-;33932:439;;:::o;16633:326::-;16693:4;16950:1;16928:7;:19;;;:23;16921:30;;16633:326;;;:::o;38946:126::-;;;;:::o;44686:164::-;44790:10;:17;;;;44763:15;:24;44779:7;44763:24;;;;;;;;;;;:44;;;;44818:10;44834:7;44818:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44686:164;:::o;45477:988::-;45743:22;45793:1;45768:22;45785:4;45768:16;:22::i;:::-;:26;;;;:::i;:::-;45743:51;;45805:18;45826:17;:26;45844:7;45826:26;;;;;;;;;;;;45805:47;;45973:14;45959:10;:28;45955:328;;46004:19;46026:12;:18;46039:4;46026:18;;;;;;;;;;;;;;;:34;46045:14;46026:34;;;;;;;;;;;;46004:56;;46110:11;46077:12;:18;46090:4;46077:18;;;;;;;;;;;;;;;:30;46096:10;46077:30;;;;;;;;;;;:44;;;;46227:10;46194:17;:30;46212:11;46194:30;;;;;;;;;;;:43;;;;45955:328;;46379:17;:26;46397:7;46379:26;;;;;;;;;;;46372:33;;;46423:12;:18;46436:4;46423:18;;;;;;;;;;;;;;;:34;46442:14;46423:34;;;;;;;;;;;46416:41;;;45477:988;;;;:::o;46760:1079::-;47013:22;47058:1;47038:10;:17;;;;:21;;;;:::i;:::-;47013:46;;47070:18;47091:15;:24;47107:7;47091:24;;;;;;;;;;;;47070:45;;47442:19;47464:10;47475:14;47464:26;;;;;;;;;;;;;;;;;;;;;;;;47442:48;;47528:11;47503:10;47514;47503:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;47639:10;47608:15;:28;47624:11;47608:28;;;;;;;;;;;:41;;;;47780:15;:24;47796:7;47780:24;;;;;;;;;;;47773:31;;;47815:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46760:1079;;;;:::o;44264:221::-;44349:14;44366:20;44383:2;44366:16;:20::i;:::-;44349:37;;44424:7;44397:12;:16;44410:2;44397:16;;;;;;;;;;;;;;;:24;44414:6;44397:24;;;;;;;;;;;:34;;;;44471:6;44442:17;:26;44460:7;44442:26;;;;;;;;;;;:35;;;;44264: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;702:655::-;798:5;823:81;839:64;896:6;839:64;:::i;:::-;823:81;:::i;:::-;814:90;;924:5;953:6;946:5;939:21;987:4;980:5;976:16;969:23;;1013:6;1063:3;1055:4;1047:6;1043:17;1038:3;1034:27;1031:36;1028:2;;;1092:1;1089;1082:12;1028:2;1128:1;1113:238;1138:6;1135:1;1132:13;1113:238;;;1206:3;1235:37;1268:3;1256:10;1235:37;:::i;:::-;1230:3;1223:50;1302:4;1297:3;1293:14;1286:21;;1336:4;1331:3;1327:14;1320:21;;1173:178;1160:1;1157;1153:9;1148:14;;1113:238;;;1117:14;804:553;;;;;;;:::o;1363:343::-;1440:5;1465:65;1481:48;1522:6;1481:48;:::i;:::-;1465:65;:::i;:::-;1456:74;;1553:6;1546:5;1539:21;1591:4;1584:5;1580:16;1629:3;1620:6;1615:3;1611:16;1608:25;1605:2;;;1646:1;1643;1636:12;1605:2;1659:41;1693:6;1688:3;1683;1659:41;:::i;:::-;1446:260;;;;;;:::o;1712:345::-;1790:5;1815:66;1831:49;1873:6;1831:49;:::i;:::-;1815:66;:::i;:::-;1806:75;;1904:6;1897:5;1890:21;1942:4;1935:5;1931:16;1980:3;1971:6;1966:3;1962:16;1959:25;1956:2;;;1997:1;1994;1987:12;1956:2;2010:41;2044:6;2039:3;2034;2010:41;:::i;:::-;1796:261;;;;;;:::o;2063:139::-;2109:5;2147:6;2134:20;2125:29;;2163:33;2190:5;2163:33;:::i;:::-;2115:87;;;;:::o;2225:303::-;2296:5;2345:3;2338:4;2330:6;2326:17;2322:27;2312:2;;2363:1;2360;2353:12;2312:2;2403:6;2390:20;2428:94;2518:3;2510:6;2503:4;2495:6;2491:17;2428:94;:::i;:::-;2419:103;;2302:226;;;;;:::o;2551:303::-;2622:5;2671:3;2664:4;2656:6;2652:17;2648:27;2638:2;;2689:1;2686;2679:12;2638:2;2729:6;2716:20;2754:94;2844:3;2836:6;2829:4;2821:6;2817:17;2754:94;:::i;:::-;2745:103;;2628:226;;;;;:::o;2860:133::-;2903:5;2941:6;2928:20;2919:29;;2957:30;2981:5;2957:30;:::i;:::-;2909:84;;;;:::o;2999:137::-;3044:5;3082:6;3069:20;3060:29;;3098:32;3124:5;3098:32;:::i;:::-;3050:86;;;;:::o;3142:141::-;3198:5;3229:6;3223:13;3214:22;;3245:32;3271:5;3245:32;:::i;:::-;3204:79;;;;:::o;3302:271::-;3357:5;3406:3;3399:4;3391:6;3387:17;3383:27;3373:2;;3424:1;3421;3414:12;3373:2;3464:6;3451:20;3489:78;3563:3;3555:6;3548:4;3540:6;3536:17;3489:78;:::i;:::-;3480:87;;3363:210;;;;;:::o;3593:273::-;3649:5;3698:3;3691:4;3683:6;3679:17;3675:27;3665:2;;3716:1;3713;3706:12;3665:2;3756:6;3743:20;3781:79;3856:3;3848:6;3841:4;3833:6;3829:17;3781:79;:::i;:::-;3772:88;;3655:211;;;;;:::o;3872:139::-;3918:5;3956:6;3943:20;3934:29;;3972:33;3999:5;3972:33;:::i;:::-;3924:87;;;;:::o;4017:143::-;4074:5;4105:6;4099:13;4090:22;;4121:33;4148:5;4121:33;:::i;:::-;4080:80;;;;:::o;4166:262::-;4225:6;4274:2;4262:9;4253:7;4249:23;4245:32;4242:2;;;4290:1;4287;4280:12;4242:2;4333:1;4358:53;4403:7;4394:6;4383:9;4379:22;4358:53;:::i;:::-;4348:63;;4304:117;4232:196;;;;:::o;4434:407::-;4502:6;4510;4559:2;4547:9;4538:7;4534:23;4530:32;4527:2;;;4575:1;4572;4565:12;4527:2;4618:1;4643:53;4688:7;4679:6;4668:9;4664:22;4643:53;:::i;:::-;4633:63;;4589:117;4745:2;4771:53;4816:7;4807:6;4796:9;4792:22;4771:53;:::i;:::-;4761:63;;4716:118;4517:324;;;;;:::o;4847:552::-;4924:6;4932;4940;4989:2;4977:9;4968:7;4964:23;4960:32;4957:2;;;5005:1;5002;4995:12;4957:2;5048:1;5073:53;5118:7;5109:6;5098:9;5094:22;5073:53;:::i;:::-;5063:63;;5019:117;5175:2;5201:53;5246:7;5237:6;5226:9;5222:22;5201:53;:::i;:::-;5191:63;;5146:118;5303:2;5329:53;5374:7;5365:6;5354:9;5350:22;5329:53;:::i;:::-;5319:63;;5274:118;4947:452;;;;;:::o;5405:809::-;5500:6;5508;5516;5524;5573:3;5561:9;5552:7;5548:23;5544:33;5541:2;;;5590:1;5587;5580:12;5541:2;5633:1;5658:53;5703:7;5694:6;5683:9;5679:22;5658:53;:::i;:::-;5648:63;;5604:117;5760:2;5786:53;5831:7;5822:6;5811:9;5807:22;5786:53;:::i;:::-;5776:63;;5731:118;5888:2;5914:53;5959:7;5950:6;5939:9;5935:22;5914:53;:::i;:::-;5904:63;;5859:118;6044:2;6033:9;6029:18;6016:32;6075:18;6067:6;6064:30;6061:2;;;6107:1;6104;6097:12;6061:2;6135:62;6189:7;6180:6;6169:9;6165:22;6135:62;:::i;:::-;6125:72;;5987:220;5531:683;;;;;;;:::o;6220:401::-;6285:6;6293;6342:2;6330:9;6321:7;6317:23;6313:32;6310:2;;;6358:1;6355;6348:12;6310:2;6401:1;6426:53;6471:7;6462:6;6451:9;6447:22;6426:53;:::i;:::-;6416:63;;6372:117;6528:2;6554:50;6596:7;6587:6;6576:9;6572:22;6554:50;:::i;:::-;6544:60;;6499:115;6300:321;;;;;:::o;6627:407::-;6695:6;6703;6752:2;6740:9;6731:7;6727:23;6723:32;6720:2;;;6768:1;6765;6758:12;6720:2;6811:1;6836:53;6881:7;6872:6;6861:9;6857:22;6836:53;:::i;:::-;6826:63;;6782:117;6938:2;6964:53;7009:7;7000:6;6989:9;6985:22;6964:53;:::i;:::-;6954:63;;6909:118;6710:324;;;;;:::o;7040:695::-;7142:6;7150;7158;7207:2;7195:9;7186:7;7182:23;7178:32;7175:2;;;7223:1;7220;7213:12;7175:2;7266:1;7291:53;7336:7;7327:6;7316:9;7312:22;7291:53;:::i;:::-;7281:63;;7237:117;7393:2;7419:53;7464:7;7455:6;7444:9;7440:22;7419:53;:::i;:::-;7409:63;;7364:118;7549:2;7538:9;7534:18;7521:32;7580:18;7572:6;7569:30;7566:2;;;7612:1;7609;7602:12;7566:2;7640:78;7710:7;7701:6;7690:9;7686:22;7640:78;:::i;:::-;7630:88;;7492:236;7165:570;;;;;:::o;7741:405::-;7825:6;7874:2;7862:9;7853:7;7849:23;7845:32;7842:2;;;7890:1;7887;7880:12;7842:2;7961:1;7950:9;7946:17;7933:31;7991:18;7983:6;7980:30;7977:2;;;8023:1;8020;8013:12;7977:2;8051:78;8121:7;8112:6;8101:9;8097:22;8051:78;:::i;:::-;8041:88;;7904:235;7832:314;;;;:::o;8152:260::-;8210:6;8259:2;8247:9;8238:7;8234:23;8230:32;8227:2;;;8275:1;8272;8265:12;8227:2;8318:1;8343:52;8387:7;8378:6;8367:9;8363:22;8343:52;:::i;:::-;8333:62;;8289:116;8217:195;;;;:::o;8418:282::-;8487:6;8536:2;8524:9;8515:7;8511:23;8507:32;8504:2;;;8552:1;8549;8542:12;8504:2;8595:1;8620:63;8675:7;8666:6;8655:9;8651:22;8620:63;:::i;:::-;8610:73;;8566:127;8494:206;;;;:::o;8706:375::-;8775:6;8824:2;8812:9;8803:7;8799:23;8795:32;8792:2;;;8840:1;8837;8830:12;8792:2;8911:1;8900:9;8896:17;8883:31;8941:18;8933:6;8930:30;8927:2;;;8973:1;8970;8963:12;8927:2;9001:63;9056:7;9047:6;9036:9;9032:22;9001:63;:::i;:::-;8991:73;;8854:220;8782:299;;;;:::o;9087:262::-;9146:6;9195:2;9183:9;9174:7;9170:23;9166:32;9163:2;;;9211:1;9208;9201:12;9163:2;9254:1;9279:53;9324:7;9315:6;9304:9;9300:22;9279:53;:::i;:::-;9269:63;;9225:117;9153:196;;;;:::o;9355:284::-;9425:6;9474:2;9462:9;9453:7;9449:23;9445:32;9442:2;;;9490:1;9487;9480:12;9442:2;9533:1;9558:64;9614:7;9605:6;9594:9;9590:22;9558:64;:::i;:::-;9548:74;;9504:128;9432:207;;;;:::o;9645:407::-;9713:6;9721;9770:2;9758:9;9749:7;9745:23;9741:32;9738:2;;;9786:1;9783;9776:12;9738:2;9829:1;9854:53;9899:7;9890:6;9879:9;9875:22;9854:53;:::i;:::-;9844:63;;9800:117;9956:2;9982:53;10027:7;10018:6;10007:9;10003:22;9982:53;:::i;:::-;9972:63;;9927:118;9728:324;;;;;:::o;10058:118::-;10145:24;10163:5;10145:24;:::i;:::-;10140:3;10133:37;10123:53;;:::o;10182:109::-;10263:21;10278:5;10263:21;:::i;:::-;10258:3;10251:34;10241:50;;:::o;10297:360::-;10383:3;10411:38;10443:5;10411:38;:::i;:::-;10465:70;10528:6;10523:3;10465:70;:::i;:::-;10458:77;;10544:52;10589:6;10584:3;10577:4;10570:5;10566:16;10544:52;:::i;:::-;10621:29;10643:6;10621:29;:::i;:::-;10616:3;10612:39;10605:46;;10387:270;;;;;:::o;10663:364::-;10751:3;10779:39;10812:5;10779:39;:::i;:::-;10834:71;10898:6;10893:3;10834:71;:::i;:::-;10827:78;;10914:52;10959:6;10954:3;10947:4;10940:5;10936:16;10914:52;:::i;:::-;10991:29;11013:6;10991:29;:::i;:::-;10986:3;10982:39;10975:46;;10755:272;;;;;:::o;11033:377::-;11139:3;11167:39;11200:5;11167:39;:::i;:::-;11222:89;11304:6;11299:3;11222:89;:::i;:::-;11215:96;;11320:52;11365:6;11360:3;11353:4;11346:5;11342:16;11320:52;:::i;:::-;11397:6;11392:3;11388:16;11381:23;;11143:267;;;;;:::o;11440:845::-;11543:3;11580:5;11574:12;11609:36;11635:9;11609:36;:::i;:::-;11661:89;11743:6;11738:3;11661:89;:::i;:::-;11654:96;;11781:1;11770:9;11766:17;11797:1;11792:137;;;;11943:1;11938:341;;;;11759:520;;11792:137;11876:4;11872:9;11861;11857:25;11852:3;11845:38;11912:6;11907:3;11903:16;11896:23;;11792:137;;11938:341;12005:38;12037:5;12005:38;:::i;:::-;12065:1;12079:154;12093:6;12090:1;12087:13;12079:154;;;12167:7;12161:14;12157:1;12152:3;12148:11;12141:35;12217:1;12208:7;12204:15;12193:26;;12115:4;12112:1;12108:12;12103:17;;12079:154;;;12262:6;12257:3;12253:16;12246:23;;11945:334;;11759:520;;11547:738;;;;;;:::o;12291:366::-;12433:3;12454:67;12518:2;12513:3;12454:67;:::i;:::-;12447:74;;12530:93;12619:3;12530:93;:::i;:::-;12648:2;12643:3;12639:12;12632:19;;12437:220;;;:::o;12663:366::-;12805:3;12826:67;12890:2;12885:3;12826:67;:::i;:::-;12819:74;;12902:93;12991:3;12902:93;:::i;:::-;13020:2;13015:3;13011:12;13004:19;;12809:220;;;:::o;13035:366::-;13177:3;13198:67;13262:2;13257:3;13198:67;:::i;:::-;13191:74;;13274:93;13363:3;13274:93;:::i;:::-;13392:2;13387:3;13383:12;13376:19;;13181:220;;;:::o;13407:366::-;13549:3;13570:67;13634:2;13629:3;13570:67;:::i;:::-;13563:74;;13646:93;13735:3;13646:93;:::i;:::-;13764:2;13759:3;13755:12;13748:19;;13553:220;;;:::o;13779:366::-;13921:3;13942:67;14006:2;14001:3;13942:67;:::i;:::-;13935:74;;14018:93;14107:3;14018:93;:::i;:::-;14136:2;14131:3;14127:12;14120:19;;13925:220;;;:::o;14151:366::-;14293:3;14314:67;14378:2;14373:3;14314:67;:::i;:::-;14307:74;;14390:93;14479:3;14390:93;:::i;:::-;14508:2;14503:3;14499:12;14492:19;;14297:220;;;:::o;14523:366::-;14665:3;14686:67;14750:2;14745:3;14686:67;:::i;:::-;14679:74;;14762:93;14851:3;14762:93;:::i;:::-;14880:2;14875:3;14871:12;14864:19;;14669:220;;;:::o;14895:366::-;15037:3;15058:67;15122:2;15117:3;15058:67;:::i;:::-;15051:74;;15134:93;15223:3;15134:93;:::i;:::-;15252:2;15247:3;15243:12;15236:19;;15041:220;;;:::o;15267:366::-;15409:3;15430:67;15494:2;15489:3;15430:67;:::i;:::-;15423:74;;15506:93;15595:3;15506:93;:::i;:::-;15624:2;15619:3;15615:12;15608:19;;15413:220;;;:::o;15639:366::-;15781:3;15802:67;15866:2;15861:3;15802:67;:::i;:::-;15795:74;;15878:93;15967:3;15878:93;:::i;:::-;15996:2;15991:3;15987:12;15980:19;;15785:220;;;:::o;16011:366::-;16153:3;16174:67;16238:2;16233:3;16174:67;:::i;:::-;16167:74;;16250:93;16339:3;16250:93;:::i;:::-;16368:2;16363:3;16359:12;16352:19;;16157:220;;;:::o;16383:366::-;16525:3;16546:67;16610:2;16605:3;16546:67;:::i;:::-;16539:74;;16622:93;16711:3;16622:93;:::i;:::-;16740:2;16735:3;16731:12;16724:19;;16529:220;;;:::o;16755:366::-;16897:3;16918:67;16982:2;16977:3;16918:67;:::i;:::-;16911:74;;16994:93;17083:3;16994:93;:::i;:::-;17112:2;17107:3;17103:12;17096:19;;16901:220;;;:::o;17127:400::-;17287:3;17308:84;17390:1;17385:3;17308:84;:::i;:::-;17301:91;;17401:93;17490:3;17401:93;:::i;:::-;17519:1;17514:3;17510:11;17503:18;;17291:236;;;:::o;17533:366::-;17675:3;17696:67;17760:2;17755:3;17696:67;:::i;:::-;17689:74;;17772:93;17861:3;17772:93;:::i;:::-;17890:2;17885:3;17881:12;17874:19;;17679:220;;;:::o;17905:366::-;18047:3;18068:67;18132:2;18127:3;18068:67;:::i;:::-;18061:74;;18144:93;18233:3;18144:93;:::i;:::-;18262:2;18257:3;18253:12;18246:19;;18051:220;;;:::o;18277:366::-;18419:3;18440:67;18504:2;18499:3;18440:67;:::i;:::-;18433:74;;18516:93;18605:3;18516:93;:::i;:::-;18634:2;18629:3;18625:12;18618:19;;18423:220;;;:::o;18649:366::-;18791:3;18812:67;18876:2;18871:3;18812:67;:::i;:::-;18805:74;;18888:93;18977:3;18888:93;:::i;:::-;19006:2;19001:3;18997:12;18990:19;;18795:220;;;:::o;19021:366::-;19163:3;19184:67;19248:2;19243:3;19184:67;:::i;:::-;19177:74;;19260:93;19349:3;19260:93;:::i;:::-;19378:2;19373:3;19369:12;19362:19;;19167:220;;;:::o;19393:366::-;19535:3;19556:67;19620:2;19615:3;19556:67;:::i;:::-;19549:74;;19632:93;19721:3;19632:93;:::i;:::-;19750:2;19745:3;19741:12;19734:19;;19539:220;;;:::o;19765:118::-;19852:24;19870:5;19852:24;:::i;:::-;19847:3;19840:37;19830:53;;:::o;19889:695::-;20167:3;20189:92;20277:3;20268:6;20189:92;:::i;:::-;20182:99;;20298:95;20389:3;20380:6;20298:95;:::i;:::-;20291:102;;20410:148;20554:3;20410:148;:::i;:::-;20403:155;;20575:3;20568:10;;20171:413;;;;;:::o;20590:222::-;20683:4;20721:2;20710:9;20706:18;20698:26;;20734:71;20802:1;20791:9;20787:17;20778:6;20734:71;:::i;:::-;20688:124;;;;:::o;20818:442::-;20967:4;21005:2;20994:9;20990:18;20982:26;;21018:71;21086:1;21075:9;21071:17;21062:6;21018:71;:::i;:::-;21099:72;21167:2;21156:9;21152:18;21143:6;21099:72;:::i;:::-;21181;21249:2;21238:9;21234:18;21225:6;21181:72;:::i;:::-;20972:288;;;;;;:::o;21266:640::-;21461:4;21499:3;21488:9;21484:19;21476:27;;21513:71;21581:1;21570:9;21566:17;21557:6;21513:71;:::i;:::-;21594:72;21662:2;21651:9;21647:18;21638:6;21594:72;:::i;:::-;21676;21744:2;21733:9;21729:18;21720:6;21676:72;:::i;:::-;21795:9;21789:4;21785:20;21780:2;21769:9;21765:18;21758:48;21823:76;21894:4;21885:6;21823:76;:::i;:::-;21815:84;;21466:440;;;;;;;:::o;21912:210::-;21999:4;22037:2;22026:9;22022:18;22014:26;;22050:65;22112:1;22101:9;22097:17;22088:6;22050:65;:::i;:::-;22004:118;;;;:::o;22128:313::-;22241:4;22279:2;22268:9;22264:18;22256:26;;22328:9;22322:4;22318:20;22314:1;22303:9;22299:17;22292:47;22356:78;22429:4;22420:6;22356:78;:::i;:::-;22348:86;;22246:195;;;;:::o;22447:419::-;22613:4;22651:2;22640:9;22636:18;22628:26;;22700:9;22694:4;22690:20;22686:1;22675:9;22671:17;22664:47;22728:131;22854:4;22728:131;:::i;:::-;22720:139;;22618:248;;;:::o;22872:419::-;23038:4;23076:2;23065:9;23061:18;23053:26;;23125:9;23119:4;23115:20;23111:1;23100:9;23096:17;23089:47;23153:131;23279:4;23153:131;:::i;:::-;23145:139;;23043:248;;;:::o;23297:419::-;23463:4;23501:2;23490:9;23486:18;23478:26;;23550:9;23544:4;23540:20;23536:1;23525:9;23521:17;23514:47;23578:131;23704:4;23578:131;:::i;:::-;23570:139;;23468:248;;;:::o;23722:419::-;23888:4;23926:2;23915:9;23911:18;23903:26;;23975:9;23969:4;23965:20;23961:1;23950:9;23946:17;23939:47;24003:131;24129:4;24003:131;:::i;:::-;23995:139;;23893:248;;;:::o;24147:419::-;24313:4;24351:2;24340:9;24336:18;24328:26;;24400:9;24394:4;24390:20;24386:1;24375:9;24371:17;24364:47;24428:131;24554:4;24428:131;:::i;:::-;24420:139;;24318:248;;;:::o;24572:419::-;24738:4;24776:2;24765:9;24761:18;24753:26;;24825:9;24819:4;24815:20;24811:1;24800:9;24796:17;24789:47;24853:131;24979:4;24853:131;:::i;:::-;24845:139;;24743:248;;;:::o;24997:419::-;25163:4;25201:2;25190:9;25186:18;25178:26;;25250:9;25244:4;25240:20;25236:1;25225:9;25221:17;25214:47;25278:131;25404:4;25278:131;:::i;:::-;25270:139;;25168:248;;;:::o;25422:419::-;25588:4;25626:2;25615:9;25611:18;25603:26;;25675:9;25669:4;25665:20;25661:1;25650:9;25646:17;25639:47;25703:131;25829:4;25703:131;:::i;:::-;25695:139;;25593:248;;;:::o;25847:419::-;26013:4;26051:2;26040:9;26036:18;26028:26;;26100:9;26094:4;26090:20;26086:1;26075:9;26071:17;26064:47;26128:131;26254:4;26128:131;:::i;:::-;26120:139;;26018:248;;;:::o;26272:419::-;26438:4;26476:2;26465:9;26461:18;26453:26;;26525:9;26519:4;26515:20;26511:1;26500:9;26496:17;26489:47;26553:131;26679:4;26553:131;:::i;:::-;26545:139;;26443:248;;;:::o;26697:419::-;26863:4;26901:2;26890:9;26886:18;26878:26;;26950:9;26944:4;26940:20;26936:1;26925:9;26921:17;26914:47;26978:131;27104:4;26978:131;:::i;:::-;26970:139;;26868:248;;;:::o;27122:419::-;27288:4;27326:2;27315:9;27311:18;27303:26;;27375:9;27369:4;27365:20;27361:1;27350:9;27346:17;27339:47;27403:131;27529:4;27403:131;:::i;:::-;27395:139;;27293:248;;;:::o;27547:419::-;27713:4;27751:2;27740:9;27736:18;27728:26;;27800:9;27794:4;27790:20;27786:1;27775:9;27771:17;27764:47;27828:131;27954:4;27828:131;:::i;:::-;27820:139;;27718:248;;;:::o;27972:419::-;28138:4;28176:2;28165:9;28161:18;28153:26;;28225:9;28219:4;28215:20;28211:1;28200:9;28196:17;28189:47;28253:131;28379:4;28253:131;:::i;:::-;28245:139;;28143:248;;;:::o;28397:419::-;28563:4;28601:2;28590:9;28586:18;28578:26;;28650:9;28644:4;28640:20;28636:1;28625:9;28621:17;28614:47;28678:131;28804:4;28678:131;:::i;:::-;28670:139;;28568:248;;;:::o;28822:419::-;28988:4;29026:2;29015:9;29011:18;29003:26;;29075:9;29069:4;29065:20;29061:1;29050:9;29046:17;29039:47;29103:131;29229:4;29103:131;:::i;:::-;29095:139;;28993:248;;;:::o;29247:419::-;29413:4;29451:2;29440:9;29436:18;29428:26;;29500:9;29494:4;29490:20;29486:1;29475:9;29471:17;29464:47;29528:131;29654:4;29528:131;:::i;:::-;29520:139;;29418:248;;;:::o;29672:419::-;29838:4;29876:2;29865:9;29861:18;29853:26;;29925:9;29919:4;29915:20;29911:1;29900:9;29896:17;29889:47;29953:131;30079:4;29953:131;:::i;:::-;29945:139;;29843:248;;;:::o;30097:419::-;30263:4;30301:2;30290:9;30286:18;30278:26;;30350:9;30344:4;30340:20;30336:1;30325:9;30321:17;30314:47;30378:131;30504:4;30378:131;:::i;:::-;30370:139;;30268:248;;;:::o;30522:222::-;30615:4;30653:2;30642:9;30638:18;30630:26;;30666:71;30734:1;30723:9;30719:17;30710:6;30666:71;:::i;:::-;30620:124;;;;:::o;30750:129::-;30784:6;30811:20;;:::i;:::-;30801:30;;30840:33;30868:4;30860:6;30840:33;:::i;:::-;30791:88;;;:::o;30885:75::-;30918:6;30951:2;30945:9;30935:19;;30925:35;:::o;30966:311::-;31043:4;31133:18;31125:6;31122:30;31119:2;;;31155:18;;:::i;:::-;31119:2;31205:4;31197:6;31193:17;31185:25;;31265:4;31259;31255:15;31247:23;;31048:229;;;:::o;31283:311::-;31360:4;31450:18;31442:6;31439:30;31436:2;;;31472:18;;:::i;:::-;31436:2;31522:4;31514:6;31510:17;31502:25;;31582:4;31576;31572:15;31564:23;;31365:229;;;:::o;31600:307::-;31661:4;31751:18;31743:6;31740:30;31737:2;;;31773:18;;:::i;:::-;31737:2;31811:29;31833:6;31811:29;:::i;:::-;31803:37;;31895:4;31889;31885:15;31877:23;;31666:241;;;:::o;31913:308::-;31975:4;32065:18;32057:6;32054:30;32051:2;;;32087:18;;:::i;:::-;32051:2;32125:29;32147:6;32125:29;:::i;:::-;32117:37;;32209:4;32203;32199:15;32191:23;;31980:241;;;:::o;32227:141::-;32276:4;32299:3;32291:11;;32322:3;32319:1;32312:14;32356:4;32353:1;32343:18;32335:26;;32281:87;;;:::o;32374:98::-;32425:6;32459:5;32453:12;32443:22;;32432:40;;;:::o;32478:99::-;32530:6;32564:5;32558:12;32548:22;;32537:40;;;:::o;32583:168::-;32666:11;32700:6;32695:3;32688:19;32740:4;32735:3;32731:14;32716:29;;32678:73;;;;:::o;32757:169::-;32841:11;32875:6;32870:3;32863:19;32915:4;32910:3;32906:14;32891:29;;32853:73;;;;:::o;32932:148::-;33034:11;33071:3;33056:18;;33046:34;;;;:::o;33086:305::-;33126:3;33145:20;33163:1;33145:20;:::i;:::-;33140:25;;33179:20;33197:1;33179:20;:::i;:::-;33174:25;;33333:1;33265:66;33261:74;33258:1;33255:81;33252:2;;;33339:18;;:::i;:::-;33252:2;33383:1;33380;33376:9;33369:16;;33130:261;;;;:::o;33397:185::-;33437:1;33454:20;33472:1;33454:20;:::i;:::-;33449:25;;33488:20;33506:1;33488:20;:::i;:::-;33483:25;;33527:1;33517:2;;33532:18;;:::i;:::-;33517:2;33574:1;33571;33567:9;33562:14;;33439:143;;;;:::o;33588:348::-;33628:7;33651:20;33669:1;33651:20;:::i;:::-;33646:25;;33685:20;33703:1;33685:20;:::i;:::-;33680:25;;33873:1;33805:66;33801:74;33798:1;33795:81;33790:1;33783:9;33776:17;33772:105;33769:2;;;33880:18;;:::i;:::-;33769:2;33928:1;33925;33921:9;33910:20;;33636:300;;;;:::o;33942:191::-;33982:4;34002:20;34020:1;34002:20;:::i;:::-;33997:25;;34036:20;34054:1;34036:20;:::i;:::-;34031:25;;34075:1;34072;34069:8;34066:2;;;34080:18;;:::i;:::-;34066:2;34125:1;34122;34118:9;34110:17;;33987:146;;;;:::o;34139:96::-;34176:7;34205:24;34223:5;34205:24;:::i;:::-;34194:35;;34184:51;;;:::o;34241:90::-;34275:7;34318:5;34311:13;34304:21;34293:32;;34283:48;;;:::o;34337:149::-;34373:7;34413:66;34406:5;34402:78;34391:89;;34381:105;;;:::o;34492:126::-;34529:7;34569:42;34562:5;34558:54;34547:65;;34537:81;;;:::o;34624:77::-;34661:7;34690:5;34679:16;;34669:32;;;:::o;34707:154::-;34791:6;34786:3;34781;34768:30;34853:1;34844:6;34839:3;34835:16;34828:27;34758:103;;;:::o;34867:307::-;34935:1;34945:113;34959:6;34956:1;34953:13;34945:113;;;35044:1;35039:3;35035:11;35029:18;35025:1;35020:3;35016:11;35009:39;34981:2;34978:1;34974:10;34969:15;;34945:113;;;35076:6;35073:1;35070:13;35067:2;;;35156:1;35147:6;35142:3;35138:16;35131:27;35067:2;34916:258;;;;:::o;35180:320::-;35224:6;35261:1;35255:4;35251:12;35241:22;;35308:1;35302:4;35298:12;35329:18;35319:2;;35385:4;35377:6;35373:17;35363:27;;35319:2;35447;35439:6;35436:14;35416:18;35413:38;35410:2;;;35466:18;;:::i;:::-;35410:2;35231:269;;;;:::o;35506:281::-;35589:27;35611:4;35589:27;:::i;:::-;35581:6;35577:40;35719:6;35707:10;35704:22;35683:18;35671:10;35668:34;35665:62;35662:2;;;35730:18;;:::i;:::-;35662:2;35770:10;35766:2;35759:22;35549:238;;;:::o;35793:233::-;35832:3;35855:24;35873:5;35855:24;:::i;:::-;35846:33;;35901:66;35894:5;35891:77;35888:2;;;35971:18;;:::i;:::-;35888:2;36018:1;36011:5;36007:13;36000:20;;35836:190;;;:::o;36032:176::-;36064:1;36081:20;36099:1;36081:20;:::i;:::-;36076:25;;36115:20;36133:1;36115:20;:::i;:::-;36110:25;;36154:1;36144:2;;36159:18;;:::i;:::-;36144:2;36200:1;36197;36193:9;36188:14;;36066:142;;;;:::o;36214:180::-;36262:77;36259:1;36252:88;36359:4;36356:1;36349:15;36383:4;36380:1;36373:15;36400:180;36448:77;36445:1;36438:88;36545:4;36542:1;36535:15;36569:4;36566:1;36559:15;36586:180;36634:77;36631:1;36624:88;36731:4;36728:1;36721:15;36755:4;36752:1;36745:15;36772:180;36820:77;36817:1;36810:88;36917:4;36914:1;36907:15;36941:4;36938:1;36931:15;36958:102;36999:6;37050:2;37046:7;37041:2;37034:5;37030:14;37026:28;37016:38;;37006:54;;;:::o;37066:181::-;37206:33;37202:1;37194:6;37190:14;37183:57;37172:75;:::o;37253:230::-;37393:34;37389:1;37381:6;37377:14;37370:58;37462:13;37457:2;37449:6;37445:15;37438:38;37359:124;:::o;37489:237::-;37629:34;37625:1;37617:6;37613:14;37606:58;37698:20;37693:2;37685:6;37681:15;37674:45;37595:131;:::o;37732:225::-;37872:34;37868:1;37860:6;37856:14;37849:58;37941:8;37936:2;37928:6;37924:15;37917:33;37838:119;:::o;37963:224::-;38103:34;38099:1;38091:6;38087:14;38080:58;38172:7;38167:2;38159:6;38155:15;38148:32;38069:118;:::o;38193:178::-;38333:30;38329:1;38321:6;38317:14;38310:54;38299:72;:::o;38377:223::-;38517:34;38513:1;38505:6;38501:14;38494:58;38586:6;38581:2;38573:6;38569:15;38562:31;38483:117;:::o;38606:175::-;38746:27;38742:1;38734:6;38730:14;38723:51;38712:69;:::o;38787:228::-;38927:34;38923:1;38915:6;38911:14;38904:58;38996:11;38991:2;38983:6;38979:15;38972:36;38893:122;:::o;39021:162::-;39161:14;39157:1;39149:6;39145:14;39138:38;39127:56;:::o;39189:163::-;39329:15;39325:1;39317:6;39313:14;39306:39;39295:57;:::o;39358:249::-;39498:34;39494:1;39486:6;39482:14;39475:58;39567:32;39562:2;39554:6;39550:15;39543:57;39464:143;:::o;39613:182::-;39753:34;39749:1;39741:6;39737:14;39730:58;39719:76;:::o;39801:155::-;39941:7;39937:1;39929:6;39925:14;39918:31;39907:49;:::o;39962:182::-;40102:34;40098:1;40090:6;40086:14;40079:58;40068:76;:::o;40150:174::-;40290:26;40286:1;40278:6;40274:14;40267:50;40256:68;:::o;40330:220::-;40470:34;40466:1;40458:6;40454:14;40447:58;40539:3;40534:2;40526:6;40522:15;40515:28;40436:114;:::o;40556:231::-;40696:34;40692:1;40684:6;40680:14;40673:58;40765:14;40760:2;40752:6;40748:15;40741:39;40662:125;:::o;40793:233::-;40933:34;40929:1;40921:6;40917:14;40910:58;41002:16;40997:2;40989:6;40985:15;40978:41;40899:127;:::o;41032:171::-;41172:23;41168:1;41160:6;41156:14;41149:47;41138:65;:::o;41209:122::-;41282:24;41300:5;41282:24;:::i;:::-;41275:5;41272:35;41262:2;;41321:1;41318;41311:12;41262:2;41252:79;:::o;41337:116::-;41407:21;41422:5;41407:21;:::i;:::-;41400:5;41397:32;41387:2;;41443:1;41440;41433:12;41387:2;41377:76;:::o;41459:120::-;41531:23;41548:5;41531:23;:::i;:::-;41524:5;41521:34;41511:2;;41569:1;41566;41559:12;41511:2;41501:78;:::o;41585:122::-;41658:24;41676:5;41658:24;:::i;:::-;41651:5;41648:35;41638:2;;41697:1;41694;41687:12;41638:2;41628:79;:::o

Swarm Source

ipfs://aaba6def40b21ec5852d0ab73261b61db28ef7f7f3dc365c2afdea66b5d9a343
Loading