Token Chefz

Overview CRC721

Total Supply:
1,465 CHFZ

Holders:
114 addresses
Balance
0 CHFZ
0xf462978892606ebbdb43a577cacfe57e4f6932c0
Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Chefz

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (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/Address.sol


// 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/token/ERC721/IERC721Receiver.sol


// 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/introspection/IERC165.sol


// 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/utils/introspection/ERC165.sol


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


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


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


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


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


// 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: contracts/3_Ballot.sol


pragma solidity 0.8.13;




contract Chefz is ERC721Enumerable, Ownable {
  using Strings for uint256;

  struct TokenInfo {
    uint256 maxSupply;
    uint256 supply;
    uint256 price;
  }

  string baseURI;
  string public baseExtension = ".json";
  uint256 public cost = 250 ether;
  uint256 public Wlcost = 200 ether;
  uint256 constant public maxSupply = 2500;
  uint256 public maxMintAmount = 100;
  mapping(address => uint256) public mintPerWallet;
  bool public paused = false;
  mapping(address => bool) public whitelisted;

  uint256[maxSupply] internal availableIds;

  uint256 public croSupply;

  address public mmf = 0x97749c9B61F878a880DfE312d2594AE07AEd7656;
  address public svn = 0x654bAc3eC77d6dB497892478f854cF6e8245DcA9;
  address public usdc = 0xc21223249CA28397B4B6541dfFaEcC539BfF0c59;
  address public lion = 0x49fB98F9b4a3183Cd88e7a115144fdf00fa6fB95;
  address public weth = 0xe44Fd7fCb2b1581822D0c862B68222998a0c299a;

  address public daoWallet = 0x09C31F2aF32566d805c4090C4DB1AdA0bbF6F2ad;
  address public teamWallet = 0xd4Da6E077650BfA0f8D89cF558ff05BE0c2EF187;
  address public marketingWallet = 0xd96DbdF8Ce2526B9F1Aee4f047B2013Af2658905;
  address public projectWallet = 0xb68b5B646ECa05fe554a5e3cb499e664a91050D5;

  mapping(address => TokenInfo) public mintTokens;

  constructor(string memory _initBaseURI) ERC721("Chefz", "CHFZ") {
    setBaseURI(_initBaseURI);
    mintTokens[mmf] = TokenInfo(100, 0, 1000 ether);
    mintTokens[svn] = TokenInfo(100, 0, 1000 ether);
    mintTokens[usdc] = TokenInfo(100, 0, 30_000000);
    mintTokens[lion] = TokenInfo(100, 0, 1200 ether);
    mintTokens[weth] = TokenInfo(50, 0, 0.02 ether);
  }

  // internal
  function _baseURI() internal view virtual override returns (string memory) {
    return baseURI;
  }

  function _getNewId(uint256 _totalMinted) internal returns(uint256 value) {
    uint256 remaining = maxSupply - _totalMinted;
    uint256 rand = uint256(keccak256(abi.encodePacked(msg.sender, block.difficulty, block.timestamp, remaining))) % remaining;
    value = 0;
    // if array value exists, use, otherwise, use generated random value
    if (availableIds[rand] != 0)
      value = availableIds[rand];
    else
      value = rand;
    // store remaining - 1 in used ID to create mapping
    if (availableIds[remaining - 1] == 0)
      availableIds[rand] = remaining - 1;
    else
      availableIds[rand] = availableIds[remaining - 1];
    value += 1;
  } 

  // public
  function mintWithCRO(uint256 amount) public payable {
    require(!paused, "paused");
    
    require(amount > 0, "amount shouldn't be zero");
    require(mintPerWallet[msg.sender] + amount <= maxMintAmount, "Can't mint more than max Mint");
    uint256 supply = totalSupply();
    require(supply + amount <= maxSupply, "Max supply exceeded");
    require(croSupply + amount <= 1750, "CRO Max Supply exceeded");
    uint256 price = cost;
    if ( whitelisted[msg.sender] ) {
      price = Wlcost;
    }
    require(msg.value >= price * amount, "insufficient funds");
    for (uint256 i = 0; i < amount; i++) {
      _safeMint(msg.sender, _getNewId(supply+i));
    }
    mintPerWallet[msg.sender] += amount;
    croSupply += amount;
    
    uint256 balance = address(this).balance;
    uint256 pFee = balance * 500 / 1000;
    (bool sent,) = payable(projectWallet).call{value: pFee}("");
    require(sent, "CRO transfer failed");
    pFee = balance * 200 / 1000;
    (sent,) = payable(marketingWallet).call{value: pFee}("");
    require(sent, "CRO transfer failed");
    pFee = balance * 155 / 1000;
    (sent,) = payable(teamWallet).call{value: pFee}("");
    require(sent, "CRO transfer failed");
    (sent,) = payable(daoWallet).call{value: address(this).balance}("");
    require(sent, "CRO transfer failed");
  }

  function mintWithToken(uint256 amount, address token) public {
    require(!paused, "paused");
    
    require(amount > 0, "amount shouldn't be zero");
    require(mintPerWallet[msg.sender] + amount <= maxMintAmount, "Can't mint more than max Mint");
    uint256 supply = totalSupply();
    require(supply + amount <= maxSupply, "Max supply exceeded");

    TokenInfo storage tokenInfo = mintTokens[token];
    require(tokenInfo.maxSupply > 0, "Invalid Mint Token");
    
    require(tokenInfo.supply + amount <= tokenInfo.maxSupply, "Max Supply exceeded");
    
    // require(msg.value >= price * amount, "insufficient funds");
    uint256 totalPrice = amount * tokenInfo.price;
    _distributeFee(token, totalPrice);
    for (uint256 i = 0; i < amount; i++) {
      _safeMint(msg.sender, _getNewId(supply+i));
    }
    mintPerWallet[msg.sender] += amount;
    tokenInfo.supply += amount;
  }

  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory tokenIds = new uint256[](ownerTokenCount);
    for (uint256 i; i < ownerTokenCount; i++) {
      tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
    }
    return tokenIds;
  }

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

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

  function setCost(uint256 _newCost) public onlyOwner {
    cost = _newCost;
  }

  function setWlcost(uint256 _newWlcost) public onlyOwner {
    Wlcost = _newWlcost;
  }

  function setWhitelisted(address _address, bool _whitelisted)
    public
    onlyOwner
  {
    whitelisted[_address] = _whitelisted;
  }

  function setWhitelistAddresses(address[] memory addresses) public onlyOwner {
    for (uint i = 0; i < addresses.length; i++) {
      whitelisted[addresses[i]] = true;
    }
  }

  function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
    maxMintAmount = _newmaxMintAmount;
  }

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

  function setBaseExtension(string memory _newBaseExtension)
    public
    onlyOwner
  {
    baseExtension = _newBaseExtension;
  }

  function pause(bool _state) public onlyOwner {
    paused = _state;
  }

  //
  function mintCost(address _minter)
    external
    view
    returns (uint256)
  {
    if (whitelisted[_minter]) return Wlcost;
    return cost;
  }

  function airdropNFTs(
        address[] memory _holders,
        uint256[] memory _counts
    ) external onlyOwner {
        require(_holders.length == _counts.length, "Input Data error");
        uint256 supply = totalSupply();
        for (uint256 i = 0; i < _holders.length; i++) {
            for (uint256 j = 0; j < _counts[i]; j++) {
                _safeMint(_holders[i], _getNewId(supply+j));
            }
            supply += _counts[i];
        }
    }

  function _distributeFee(address token, uint256 totalPrice) private {
    uint256 pFee = totalPrice * 500 / 1000;
    uint256 mFee = totalPrice * 200 / 1000;
    uint256 tFee = totalPrice * 155 / 1000;
    uint256 dFee = totalPrice - pFee - mFee - tFee;
    IERC20(token).transferFrom(msg.sender, projectWallet, pFee);
    IERC20(token).transferFrom(msg.sender, marketingWallet, mFee);
    IERC20(token).transferFrom(msg.sender, teamWallet, tFee);
    IERC20(token).transferFrom(msg.sender, daoWallet, dFee);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"}],"stateMutability":"nonpayable","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":[],"name":"Wlcost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_holders","type":"address[]"},{"internalType":"uint256[]","name":"_counts","type":"uint256[]"}],"name":"airdropNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"croSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"daoWallet","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":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lion","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintTokens","outputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintWithCRO","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"token","type":"address"}],"name":"mintWithToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mmf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"projectWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"setWhitelistAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_whitelisted","type":"bool"}],"name":"setWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newWlcost","type":"uint256"}],"name":"setWlcost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","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":"svn","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"usdc","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c9080519060200190620000519291906200099d565b50680d8d726b7177a80000600d55680ad78ebc5ac6200000600e556064600f556000601160006101000a81548160ff0219169083151502179055507397749c9b61f878a880dfe312d2594ae07aed76566109d860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073654bac3ec77d6db497892478f854cf6e8245dca96109d960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073c21223249ca28397b4b6541dffaecc539bff0c596109da60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507349fb98f9b4a3183cd88e7a115144fdf00fa6fb956109db60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073e44fd7fcb2b1581822d0c862b68222998a0c299a6109dc60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507309c31f2af32566d805c4090c4db1ada0bbf6f2ad6109dd60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073d4da6e077650bfa0f8d89cf558ff05be0c2ef1876109de60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073d96dbdf8ce2526b9f1aee4f047b2013af26589056109df60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b68b5b646eca05fe554a5e3cb499e664a91050d56109e060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200039f57600080fd5b5060405162006742380380620067428339818101604052810190620003c5919062000bea565b6040518060400160405280600581526020017f436865667a0000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4348465a000000000000000000000000000000000000000000000000000000008152508160009080519060200190620004499291906200099d565b508060019080519060200190620004629291906200099d565b5050506200048562000479620007e860201b60201c565b620007f060201b60201c565b6200049681620008b660201b60201c565b60405180606001604052806064815260200160008152602001683635c9adc5dea000008152506109e160006109d860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015590505060405180606001604052806064815260200160008152602001683635c9adc5dea000008152506109e160006109d960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155905050604051806060016040528060648152602001600081526020016301c9c3808152506109e160006109da60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050506040518060600160405280606481526020016000815260200168410d586a20a4c000008152506109e160006109db60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050506040518060600160405280603281526020016000815260200166470de4df8200008152506109e160006109dc60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050505062000d22565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620008c6620008e260201b60201c565b80600b9080519060200190620008de9291906200099d565b5050565b620008f2620007e860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620009186200097360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000971576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009689062000c9c565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620009ab9062000ced565b90600052602060002090601f016020900481019282620009cf576000855562000a1b565b82601f10620009ea57805160ff191683800117855562000a1b565b8280016001018555821562000a1b579182015b8281111562000a1a578251825591602001919060010190620009fd565b5b50905062000a2a919062000a2e565b5090565b5b8082111562000a4957600081600090555060010162000a2f565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000ab68262000a6b565b810181811067ffffffffffffffff8211171562000ad85762000ad762000a7c565b5b80604052505050565b600062000aed62000a4d565b905062000afb828262000aab565b919050565b600067ffffffffffffffff82111562000b1e5762000b1d62000a7c565b5b62000b298262000a6b565b9050602081019050919050565b60005b8381101562000b5657808201518184015260208101905062000b39565b8381111562000b66576000848401525b50505050565b600062000b8362000b7d8462000b00565b62000ae1565b90508281526020810184848401111562000ba25762000ba162000a66565b5b62000baf84828562000b36565b509392505050565b600082601f83011262000bcf5762000bce62000a61565b5b815162000be184826020860162000b6c565b91505092915050565b60006020828403121562000c035762000c0262000a57565b5b600082015167ffffffffffffffff81111562000c245762000c2362000a5c565b5b62000c328482850162000bb7565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000c8460208362000c3b565b915062000c918262000c4c565b602082019050919050565b6000602082019050818103600083015262000cb78162000c75565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000d0657607f821691505b60208210810362000d1c5762000d1b62000cbe565b5b50919050565b615a108062000d326000396000f3fe6080604052600436106102e45760003560e01c80636352211e11610190578063beb08ab9116100dc578063da3ef23f11610095578063e85316411161006f578063e853164114610b6b578063e985e9c514610b94578063f2fde38b14610bd1578063f52ccc2d14610bfa576102e4565b8063da3ef23f14610aee578063e213b5f614610b17578063e7ac7d1314610b40576102e4565b8063beb08ab9146109d7578063c668286214610a02578063c87b56dd14610a2d578063ca9b611e14610a6a578063d5abeb0114610a86578063d936547e14610ab1576102e4565b80638da5cb5b11610149578063a22cb46511610123578063a22cb4651461091b578063b88d4fde14610944578063b8950cae1461096d578063bcfaa79d14610998576102e4565b80638da5cb5b1461089c5780639281aa0b146108c757806395d89b41146108f0576102e4565b80636352211e1461078c578063698a5897146107c957806370a08231146107f4578063715018a61461083157806375f0a874146108485780637f00c7a614610873576102e4565b80632acc659e1161024f578063438b63001161020857806355f804b3116101e257806355f804b3146106e2578063599270441461070b5780635c975abb146107365780636269505214610761576102e4565b8063438b63001461063f57806344a0d68a1461067c5780634f6ccce7146106a5576102e4565b80632acc659e1461051b5780632cf53d73146105585780632f745c59146105835780633e413bee146105c05780633fc8cef3146105eb57806342842e0e14610616576102e4565b8063095ea7b3116102a1578063095ea7b31461040b57806313413cd21461043457806313faede61461047157806318160ddd1461049c578063239c70ae146104c757806323b872dd146104f2576102e4565b806301ffc9a7146102e957806302329a291461032657806302b212721461034f5780630457d16b1461037857806306fdde03146103a3578063081812fc146103ce575b600080fd5b3480156102f557600080fd5b50610310600480360381019061030b9190613d2b565b610c23565b60405161031d9190613d73565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190613dba565b610c9d565b005b34801561035b57600080fd5b5061037660048036038101906103719190613e1d565b610cc2565b005b34801561038457600080fd5b5061038d610cd4565b60405161039a9190613e59565b60405180910390f35b3480156103af57600080fd5b506103b8610cda565b6040516103c59190613f0d565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f09190613e1d565b610d6c565b6040516104029190613f70565b60405180910390f35b34801561041757600080fd5b50610432600480360381019061042d9190613fb7565b610db2565b005b34801561044057600080fd5b5061045b60048036038101906104569190613ff7565b610ec9565b6040516104689190613e59565b60405180910390f35b34801561047d57600080fd5b50610486610ee1565b6040516104939190613e59565b60405180910390f35b3480156104a857600080fd5b506104b1610ee7565b6040516104be9190613e59565b60405180910390f35b3480156104d357600080fd5b506104dc610ef4565b6040516104e99190613e59565b60405180910390f35b3480156104fe57600080fd5b5061051960048036038101906105149190614024565b610efa565b005b34801561052757600080fd5b50610542600480360381019061053d9190613ff7565b610f5a565b60405161054f9190613e59565b60405180910390f35b34801561056457600080fd5b5061056d610fc3565b60405161057a9190613f70565b60405180910390f35b34801561058f57600080fd5b506105aa60048036038101906105a59190613fb7565b610fea565b6040516105b79190613e59565b60405180910390f35b3480156105cc57600080fd5b506105d561108f565b6040516105e29190613f70565b60405180910390f35b3480156105f757600080fd5b506106006110b6565b60405161060d9190613f70565b60405180910390f35b34801561062257600080fd5b5061063d60048036038101906106389190614024565b6110dd565b005b34801561064b57600080fd5b5061066660048036038101906106619190613ff7565b6110fd565b6040516106739190614135565b60405180910390f35b34801561068857600080fd5b506106a3600480360381019061069e9190613e1d565b6111ab565b005b3480156106b157600080fd5b506106cc60048036038101906106c79190613e1d565b6111bd565b6040516106d99190613e59565b60405180910390f35b3480156106ee57600080fd5b506107096004803603810190610704919061428c565b61122e565b005b34801561071757600080fd5b50610720611250565b60405161072d9190613f70565b60405180910390f35b34801561074257600080fd5b5061074b611277565b6040516107589190613d73565b60405180910390f35b34801561076d57600080fd5b5061077661128a565b6040516107839190613e59565b60405180910390f35b34801561079857600080fd5b506107b360048036038101906107ae9190613e1d565b611291565b6040516107c09190613f70565b60405180910390f35b3480156107d557600080fd5b506107de611342565b6040516107eb9190613f70565b60405180910390f35b34801561080057600080fd5b5061081b60048036038101906108169190613ff7565b611369565b6040516108289190613e59565b60405180910390f35b34801561083d57600080fd5b50610846611420565b005b34801561085457600080fd5b5061085d611434565b60405161086a9190613f70565b60405180910390f35b34801561087f57600080fd5b5061089a60048036038101906108959190613e1d565b61145b565b005b3480156108a857600080fd5b506108b161146d565b6040516108be9190613f70565b60405180910390f35b3480156108d357600080fd5b506108ee60048036038101906108e991906142d5565b611497565b005b3480156108fc57600080fd5b506109056114fa565b6040516109129190613f0d565b60405180910390f35b34801561092757600080fd5b50610942600480360381019061093d91906142d5565b61158c565b005b34801561095057600080fd5b5061096b600480360381019061096691906143b6565b6115a2565b005b34801561097957600080fd5b50610982611604565b60405161098f9190613f70565b60405180910390f35b3480156109a457600080fd5b506109bf60048036038101906109ba9190613ff7565b61162b565b6040516109ce93929190614439565b60405180910390f35b3480156109e357600080fd5b506109ec611656565b6040516109f99190613f70565b60405180910390f35b348015610a0e57600080fd5b50610a1761167d565b604051610a249190613f0d565b60405180910390f35b348015610a3957600080fd5b50610a546004803603810190610a4f9190613e1d565b61170b565b604051610a619190613f0d565b60405180910390f35b610a846004803603810190610a7f9190613e1d565b6117b5565b005b348015610a9257600080fd5b50610a9b611e7f565b604051610aa89190613e59565b60405180910390f35b348015610abd57600080fd5b50610ad86004803603810190610ad39190613ff7565b611e85565b604051610ae59190613d73565b60405180910390f35b348015610afa57600080fd5b50610b156004803603810190610b10919061428c565b611ea5565b005b348015610b2357600080fd5b50610b3e6004803603810190610b3991906145fb565b611ec7565b005b348015610b4c57600080fd5b50610b55611fdc565b604051610b629190613f70565b60405180910390f35b348015610b7757600080fd5b50610b926004803603810190610b8d9190614673565b612003565b005b348015610ba057600080fd5b50610bbb6004803603810190610bb691906146b3565b612334565b604051610bc89190613d73565b60405180910390f35b348015610bdd57600080fd5b50610bf86004803603810190610bf39190613ff7565b6123c8565b005b348015610c0657600080fd5b50610c216004803603810190610c1c91906146f3565b61244b565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c965750610c95826124e8565b5b9050919050565b610ca56125ca565b80601160006101000a81548160ff02191690831515021790555050565b610cca6125ca565b80600e8190555050565b600e5481565b606060008054610ce99061476b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d159061476b565b8015610d625780601f10610d3757610100808354040283529160200191610d62565b820191906000526020600020905b815481529060010190602001808311610d4557829003601f168201915b5050505050905090565b6000610d7782612648565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610dbd82611291565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e249061480e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e4c612693565b73ffffffffffffffffffffffffffffffffffffffff161480610e7b5750610e7a81610e75612693565b612334565b5b610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb1906148a0565b60405180910390fd5b610ec4838361269b565b505050565b60106020528060005260406000206000915090505481565b600d5481565b6000600880549050905090565b600f5481565b610f0b610f05612693565b82612754565b610f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4190614932565b60405180910390fd5b610f558383836127e9565b505050565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610fb857600e549050610fbe565b600d5490505b919050565b6109db60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610ff583611369565b8210611036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102d906149c4565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109da60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6109dc60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6110f8838383604051806020016040528060008152506115a2565b505050565b6060600061110a83611369565b905060008167ffffffffffffffff81111561112857611127614161565b5b6040519080825280602002602001820160405280156111565781602001602082028036833780820191505090505b50905060005b828110156111a05761116e8582610fea565b828281518110611181576111806149e4565b5b602002602001018181525050808061119890614a42565b91505061115c565b508092505050919050565b6111b36125ca565b80600d8190555050565b60006111c7610ee7565b8210611208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ff90614afc565b60405180910390fd5b6008828154811061121c5761121b6149e4565b5b90600052602060002001549050919050565b6112366125ca565b80600b908051906020019061124c929190613c1c565b5050565b6109de60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601160009054906101000a900460ff1681565b6109d75481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614b68565b60405180910390fd5b80915050919050565b6109dd60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d090614bfa565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114286125ca565b6114326000612a4f565b565b6109df60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114636125ca565b80600f8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61149f6125ca565b80601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6060600180546115099061476b565b80601f01602080910402602001604051908101604052809291908181526020018280546115359061476b565b80156115825780601f1061155757610100808354040283529160200191611582565b820191906000526020600020905b81548152906001019060200180831161156557829003601f168201915b5050505050905090565b61159e611597612693565b8383612b15565b5050565b6115b36115ad612693565b83612754565b6115f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e990614932565b60405180910390fd5b6115fe84848484612c81565b50505050565b6109d960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6109e16020528060005260406000206000915090508060000154908060010154908060020154905083565b6109e060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c805461168a9061476b565b80601f01602080910402602001604051908101604052809291908181526020018280546116b69061476b565b80156117035780601f106116d857610100808354040283529160200191611703565b820191906000526020600020905b8154815290600101906020018083116116e657829003601f168201915b505050505081565b606061171682612cdd565b611755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174c90614c8c565b60405180910390fd5b600061175f612d49565b9050600081511161177f57604051806020016040528060008152506117ad565b8061178984612ddb565b600c60405160200161179d93929190614d7c565b6040516020818303038152906040525b915050919050565b601160009054906101000a900460ff1615611805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fc90614df9565b60405180910390fd5b60008111611848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183f90614e65565b60405180910390fd5b600f5481601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118969190614e85565b11156118d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ce90614f27565b60405180910390fd5b60006118e1610ee7565b90506109c482826118f29190614e85565b1115611933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192a90614f93565b60405180910390fd5b6106d6826109d7546119459190614e85565b1115611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614fff565b60405180910390fd5b6000600d549050601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156119e557600e5490505b82816119f1919061501f565b341015611a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2a906150c5565b60405180910390fd5b60005b83811015611a6e57611a5b33611a568386611a519190614e85565b612f3b565b61307b565b8080611a6690614a42565b915050611a36565b5082601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611abe9190614e85565b92505081905550826109d76000828254611ad89190614e85565b92505081905550600047905060006103e86101f483611af7919061501f565b611b019190615114565b905060006109e060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051611b4c90615176565b60006040518083038185875af1925050503d8060008114611b89576040519150601f19603f3d011682016040523d82523d6000602084013e611b8e565b606091505b5050905080611bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc9906151d7565b60405180910390fd5b6103e860c884611be2919061501f565b611bec9190615114565b91506109df60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051611c3590615176565b60006040518083038185875af1925050503d8060008114611c72576040519150601f19603f3d011682016040523d82523d6000602084013e611c77565b606091505b50508091505080611cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb4906151d7565b60405180910390fd5b6103e8609b84611ccd919061501f565b611cd79190615114565b91506109de60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051611d2090615176565b60006040518083038185875af1925050503d8060008114611d5d576040519150601f19603f3d011682016040523d82523d6000602084013e611d62565b606091505b50508091505080611da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9f906151d7565b60405180910390fd5b6109dd60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051611def90615176565b60006040518083038185875af1925050503d8060008114611e2c576040519150601f19603f3d011682016040523d82523d6000602084013e611e31565b606091505b50508091505080611e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6e906151d7565b60405180910390fd5b505050505050565b6109c481565b60126020528060005260406000206000915054906101000a900460ff1681565b611ead6125ca565b80600c9080519060200190611ec3929190613c1c565b5050565b611ecf6125ca565b8051825114611f13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0a90615243565b60405180910390fd5b6000611f1d610ee7565b905060005b8351811015611fd65760005b838281518110611f4157611f406149e4565b5b6020026020010151811015611f9a57611f87858381518110611f6657611f656149e4565b5b6020026020010151611f828386611f7d9190614e85565b612f3b565b61307b565b8080611f9290614a42565b915050611f2e565b50828181518110611fae57611fad6149e4565b5b602002602001015182611fc19190614e85565b91508080611fce90614a42565b915050611f22565b50505050565b6109d860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601160009054906101000a900460ff1615612053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204a90614df9565b60405180910390fd5b60008211612096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208d90614e65565b60405180910390fd5b600f5482601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120e49190614e85565b1115612125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211c90614f27565b60405180910390fd5b600061212f610ee7565b90506109c483826121409190614e85565b1115612181576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217890614f93565b60405180910390fd5b60006109e160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001541161220c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612203906152af565b60405180910390fd5b80600001548482600101546122219190614e85565b1115612262576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122599061531b565b60405180910390fd5b6000816002015485612274919061501f565b90506122808482613099565b60005b858110156122bb576122a8336122a3838761229e9190614e85565b612f3b565b61307b565b80806122b390614a42565b915050612283565b5084601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461230b9190614e85565b92505081905550848260010160008282546123269190614e85565b925050819055505050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123d06125ca565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361243f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612436906153ad565b60405180910390fd5b61244881612a4f565b50565b6124536125ca565b60005b81518110156124e457600160126000848481518110612478576124776149e4565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806124dc90614a42565b915050612456565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125b357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125c357506125c2826133b2565b5b9050919050565b6125d2612693565b73ffffffffffffffffffffffffffffffffffffffff166125f061146d565b73ffffffffffffffffffffffffffffffffffffffff1614612646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263d90615419565b60405180910390fd5b565b61265181612cdd565b612690576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268790614b68565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661270e83611291565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061276083611291565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127a257506127a18185612334565b5b806127e057508373ffffffffffffffffffffffffffffffffffffffff166127c884610d6c565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661280982611291565b73ffffffffffffffffffffffffffffffffffffffff161461285f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612856906154ab565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036128ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c59061553d565b60405180910390fd5b6128d983838361341c565b6128e460008261269b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612934919061555d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461298b9190614e85565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a4a83838361352e565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7a906155dd565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c749190613d73565b60405180910390a3505050565b612c8c8484846127e9565b612c9884848484613533565b612cd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cce9061566f565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600b8054612d589061476b565b80601f0160208091040260200160405190810160405280929190818152602001828054612d849061476b565b8015612dd15780601f10612da657610100808354040283529160200191612dd1565b820191906000526020600020905b815481529060010190602001808311612db457829003601f168201915b5050505050905090565b606060008203612e22576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f36565b600082905060005b60008214612e54578080612e3d90614a42565b915050600a82612e4d9190615114565b9150612e2a565b60008167ffffffffffffffff811115612e7057612e6f614161565b5b6040519080825280601f01601f191660200182016040528015612ea25781602001600182028036833780820191505090505b5090505b60008514612f2f57600182612ebb919061555d565b9150600a85612eca919061568f565b6030612ed69190614e85565b60f81b818381518110612eec57612eeb6149e4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f289190615114565b9450612ea6565b8093505050505b919050565b600080826109c4612f4c919061555d565b905060008133444285604051602001612f689493929190615729565b6040516020818303038152906040528051906020012060001c612f8b919061568f565b90506000925060006013826109c48110612fa857612fa76149e4565b5b015414612fcd576013816109c48110612fc457612fc36149e4565b5b01549250612fd1565b8092505b60006013600184612fe2919061555d565b6109c48110612ff457612ff36149e4565b5b01540361302757600182613008919061555d565b6013826109c4811061301d5761301c6149e4565b5b0181905550613065565b6013600183613036919061555d565b6109c48110613048576130476149e4565b5b01546013826109c4811061305f5761305e6149e4565b5b01819055505b6001836130729190614e85565b92505050919050565b6130958282604051806020016040528060008152506136ba565b5050565b60006103e86101f4836130ac919061501f565b6130b69190615114565b905060006103e860c8846130ca919061501f565b6130d49190615114565b905060006103e8609b856130e8919061501f565b6130f29190615114565b9050600081838587613104919061555d565b61310e919061555d565b613118919061555d565b90508573ffffffffffffffffffffffffffffffffffffffff166323b872dd336109e060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16876040518463ffffffff1660e01b815260040161317a93929190615777565b6020604051808303816000875af1158015613199573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131bd91906157c3565b508573ffffffffffffffffffffffffffffffffffffffff166323b872dd336109df60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518463ffffffff1660e01b815260040161321e93929190615777565b6020604051808303816000875af115801561323d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061326191906157c3565b508573ffffffffffffffffffffffffffffffffffffffff166323b872dd336109de60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518463ffffffff1660e01b81526004016132c293929190615777565b6020604051808303816000875af11580156132e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061330591906157c3565b508573ffffffffffffffffffffffffffffffffffffffff166323b872dd336109dd60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b815260040161336693929190615777565b6020604051808303816000875af1158015613385573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133a991906157c3565b50505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613427838383613715565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613469576134648161371a565b6134a8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146134a7576134a68382613763565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036134ea576134e5816138d0565b613529565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146135285761352782826139a1565b5b5b505050565b505050565b60006135548473ffffffffffffffffffffffffffffffffffffffff16613a20565b156136ad578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261357d612693565b8786866040518563ffffffff1660e01b815260040161359f9493929190615845565b6020604051808303816000875af19250505080156135db57506040513d601f19601f820116820180604052508101906135d891906158a6565b60015b61365d573d806000811461360b576040519150601f19603f3d011682016040523d82523d6000602084013e613610565b606091505b506000815103613655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161364c9061566f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506136b2565b600190505b949350505050565b6136c48383613a43565b6136d16000848484613533565b613710576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137079061566f565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161377084611369565b61377a919061555d565b905060006007600084815260200190815260200160002054905081811461385f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506138e4919061555d565b9050600060096000848152602001908152602001600020549050600060088381548110613914576139136149e4565b5b906000526020600020015490508060088381548110613936576139356149e4565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613985576139846158d3565b5b6001900381819060005260206000200160009055905550505050565b60006139ac83611369565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aa99061594e565b60405180910390fd5b613abb81612cdd565b15613afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613af2906159ba565b60405180910390fd5b613b076000838361341c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b579190614e85565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613c186000838361352e565b5050565b828054613c289061476b565b90600052602060002090601f016020900481019282613c4a5760008555613c91565b82601f10613c6357805160ff1916838001178555613c91565b82800160010185558215613c91579182015b82811115613c90578251825591602001919060010190613c75565b5b509050613c9e9190613ca2565b5090565b5b80821115613cbb576000816000905550600101613ca3565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613d0881613cd3565b8114613d1357600080fd5b50565b600081359050613d2581613cff565b92915050565b600060208284031215613d4157613d40613cc9565b5b6000613d4f84828501613d16565b91505092915050565b60008115159050919050565b613d6d81613d58565b82525050565b6000602082019050613d886000830184613d64565b92915050565b613d9781613d58565b8114613da257600080fd5b50565b600081359050613db481613d8e565b92915050565b600060208284031215613dd057613dcf613cc9565b5b6000613dde84828501613da5565b91505092915050565b6000819050919050565b613dfa81613de7565b8114613e0557600080fd5b50565b600081359050613e1781613df1565b92915050565b600060208284031215613e3357613e32613cc9565b5b6000613e4184828501613e08565b91505092915050565b613e5381613de7565b82525050565b6000602082019050613e6e6000830184613e4a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613eae578082015181840152602081019050613e93565b83811115613ebd576000848401525b50505050565b6000601f19601f8301169050919050565b6000613edf82613e74565b613ee98185613e7f565b9350613ef9818560208601613e90565b613f0281613ec3565b840191505092915050565b60006020820190508181036000830152613f278184613ed4565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613f5a82613f2f565b9050919050565b613f6a81613f4f565b82525050565b6000602082019050613f856000830184613f61565b92915050565b613f9481613f4f565b8114613f9f57600080fd5b50565b600081359050613fb181613f8b565b92915050565b60008060408385031215613fce57613fcd613cc9565b5b6000613fdc85828601613fa2565b9250506020613fed85828601613e08565b9150509250929050565b60006020828403121561400d5761400c613cc9565b5b600061401b84828501613fa2565b91505092915050565b60008060006060848603121561403d5761403c613cc9565b5b600061404b86828701613fa2565b935050602061405c86828701613fa2565b925050604061406d86828701613e08565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6140ac81613de7565b82525050565b60006140be83836140a3565b60208301905092915050565b6000602082019050919050565b60006140e282614077565b6140ec8185614082565b93506140f783614093565b8060005b8381101561412857815161410f88826140b2565b975061411a836140ca565b9250506001810190506140fb565b5085935050505092915050565b6000602082019050818103600083015261414f81846140d7565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61419982613ec3565b810181811067ffffffffffffffff821117156141b8576141b7614161565b5b80604052505050565b60006141cb613cbf565b90506141d78282614190565b919050565b600067ffffffffffffffff8211156141f7576141f6614161565b5b61420082613ec3565b9050602081019050919050565b82818337600083830152505050565b600061422f61422a846141dc565b6141c1565b90508281526020810184848401111561424b5761424a61415c565b5b61425684828561420d565b509392505050565b600082601f83011261427357614272614157565b5b813561428384826020860161421c565b91505092915050565b6000602082840312156142a2576142a1613cc9565b5b600082013567ffffffffffffffff8111156142c0576142bf613cce565b5b6142cc8482850161425e565b91505092915050565b600080604083850312156142ec576142eb613cc9565b5b60006142fa85828601613fa2565b925050602061430b85828601613da5565b9150509250929050565b600067ffffffffffffffff8211156143305761432f614161565b5b61433982613ec3565b9050602081019050919050565b600061435961435484614315565b6141c1565b9050828152602081018484840111156143755761437461415c565b5b61438084828561420d565b509392505050565b600082601f83011261439d5761439c614157565b5b81356143ad848260208601614346565b91505092915050565b600080600080608085870312156143d0576143cf613cc9565b5b60006143de87828801613fa2565b94505060206143ef87828801613fa2565b935050604061440087828801613e08565b925050606085013567ffffffffffffffff81111561442157614420613cce565b5b61442d87828801614388565b91505092959194509250565b600060608201905061444e6000830186613e4a565b61445b6020830185613e4a565b6144686040830184613e4a565b949350505050565b600067ffffffffffffffff82111561448b5761448a614161565b5b602082029050602081019050919050565b600080fd5b60006144b46144af84614470565b6141c1565b905080838252602082019050602084028301858111156144d7576144d661449c565b5b835b8181101561450057806144ec8882613fa2565b8452602084019350506020810190506144d9565b5050509392505050565b600082601f83011261451f5761451e614157565b5b813561452f8482602086016144a1565b91505092915050565b600067ffffffffffffffff82111561455357614552614161565b5b602082029050602081019050919050565b600061457761457284614538565b6141c1565b9050808382526020820190506020840283018581111561459a5761459961449c565b5b835b818110156145c357806145af8882613e08565b84526020840193505060208101905061459c565b5050509392505050565b600082601f8301126145e2576145e1614157565b5b81356145f2848260208601614564565b91505092915050565b6000806040838503121561461257614611613cc9565b5b600083013567ffffffffffffffff8111156146305761462f613cce565b5b61463c8582860161450a565b925050602083013567ffffffffffffffff81111561465d5761465c613cce565b5b614669858286016145cd565b9150509250929050565b6000806040838503121561468a57614689613cc9565b5b600061469885828601613e08565b92505060206146a985828601613fa2565b9150509250929050565b600080604083850312156146ca576146c9613cc9565b5b60006146d885828601613fa2565b92505060206146e985828601613fa2565b9150509250929050565b60006020828403121561470957614708613cc9565b5b600082013567ffffffffffffffff81111561472757614726613cce565b5b6147338482850161450a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061478357607f821691505b6020821081036147965761479561473c565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006147f8602183613e7f565b91506148038261479c565b604082019050919050565b60006020820190508181036000830152614827816147eb565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b600061488a603e83613e7f565b91506148958261482e565b604082019050919050565b600060208201905081810360008301526148b98161487d565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b600061491c602e83613e7f565b9150614927826148c0565b604082019050919050565b6000602082019050818103600083015261494b8161490f565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006149ae602b83613e7f565b91506149b982614952565b604082019050919050565b600060208201905081810360008301526149dd816149a1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614a4d82613de7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a7f57614a7e614a13565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614ae6602c83613e7f565b9150614af182614a8a565b604082019050919050565b60006020820190508181036000830152614b1581614ad9565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614b52601883613e7f565b9150614b5d82614b1c565b602082019050919050565b60006020820190508181036000830152614b8181614b45565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614be4602983613e7f565b9150614bef82614b88565b604082019050919050565b60006020820190508181036000830152614c1381614bd7565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614c76602f83613e7f565b9150614c8182614c1a565b604082019050919050565b60006020820190508181036000830152614ca581614c69565b9050919050565b600081905092915050565b6000614cc282613e74565b614ccc8185614cac565b9350614cdc818560208601613e90565b80840191505092915050565b60008190508160005260206000209050919050565b60008154614d0a8161476b565b614d148186614cac565b94506001821660008114614d2f5760018114614d4057614d73565b60ff19831686528186019350614d73565b614d4985614ce8565b60005b83811015614d6b57815481890152600182019150602081019050614d4c565b838801955050505b50505092915050565b6000614d888286614cb7565b9150614d948285614cb7565b9150614da08284614cfd565b9150819050949350505050565b7f7061757365640000000000000000000000000000000000000000000000000000600082015250565b6000614de3600683613e7f565b9150614dee82614dad565b602082019050919050565b60006020820190508181036000830152614e1281614dd6565b9050919050565b7f616d6f756e742073686f756c646e2774206265207a65726f0000000000000000600082015250565b6000614e4f601883613e7f565b9150614e5a82614e19565b602082019050919050565b60006020820190508181036000830152614e7e81614e42565b9050919050565b6000614e9082613de7565b9150614e9b83613de7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ed057614ecf614a13565b5b828201905092915050565b7f43616e2774206d696e74206d6f7265207468616e206d6178204d696e74000000600082015250565b6000614f11601d83613e7f565b9150614f1c82614edb565b602082019050919050565b60006020820190508181036000830152614f4081614f04565b9050919050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b6000614f7d601383613e7f565b9150614f8882614f47565b602082019050919050565b60006020820190508181036000830152614fac81614f70565b9050919050565b7f43524f204d617820537570706c79206578636565646564000000000000000000600082015250565b6000614fe9601783613e7f565b9150614ff482614fb3565b602082019050919050565b6000602082019050818103600083015261501881614fdc565b9050919050565b600061502a82613de7565b915061503583613de7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561506e5761506d614a13565b5b828202905092915050565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b60006150af601283613e7f565b91506150ba82615079565b602082019050919050565b600060208201905081810360008301526150de816150a2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061511f82613de7565b915061512a83613de7565b92508261513a576151396150e5565b5b828204905092915050565b600081905092915050565b50565b6000615160600083615145565b915061516b82615150565b600082019050919050565b600061518182615153565b9150819050919050565b7f43524f207472616e73666572206661696c656400000000000000000000000000600082015250565b60006151c1601383613e7f565b91506151cc8261518b565b602082019050919050565b600060208201905081810360008301526151f0816151b4565b9050919050565b7f496e7075742044617461206572726f7200000000000000000000000000000000600082015250565b600061522d601083613e7f565b9150615238826151f7565b602082019050919050565b6000602082019050818103600083015261525c81615220565b9050919050565b7f496e76616c6964204d696e7420546f6b656e0000000000000000000000000000600082015250565b6000615299601283613e7f565b91506152a482615263565b602082019050919050565b600060208201905081810360008301526152c88161528c565b9050919050565b7f4d617820537570706c7920657863656564656400000000000000000000000000600082015250565b6000615305601383613e7f565b9150615310826152cf565b602082019050919050565b60006020820190508181036000830152615334816152f8565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615397602683613e7f565b91506153a28261533b565b604082019050919050565b600060208201905081810360008301526153c68161538a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615403602083613e7f565b915061540e826153cd565b602082019050919050565b60006020820190508181036000830152615432816153f6565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000615495602583613e7f565b91506154a082615439565b604082019050919050565b600060208201905081810360008301526154c481615488565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615527602483613e7f565b9150615532826154cb565b604082019050919050565b600060208201905081810360008301526155568161551a565b9050919050565b600061556882613de7565b915061557383613de7565b92508282101561558657615585614a13565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006155c7601983613e7f565b91506155d282615591565b602082019050919050565b600060208201905081810360008301526155f6816155ba565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615659603283613e7f565b9150615664826155fd565b604082019050919050565b600060208201905081810360008301526156888161564c565b9050919050565b600061569a82613de7565b91506156a583613de7565b9250826156b5576156b46150e5565b5b828206905092915050565b60008160601b9050919050565b60006156d8826156c0565b9050919050565b60006156ea826156cd565b9050919050565b6157026156fd82613f4f565b6156df565b82525050565b6000819050919050565b61572361571e82613de7565b615708565b82525050565b600061573582876156f1565b6014820191506157458286615712565b6020820191506157558285615712565b6020820191506157658284615712565b60208201915081905095945050505050565b600060608201905061578c6000830186613f61565b6157996020830185613f61565b6157a66040830184613e4a565b949350505050565b6000815190506157bd81613d8e565b92915050565b6000602082840312156157d9576157d8613cc9565b5b60006157e7848285016157ae565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000615817826157f0565b61582181856157fb565b9350615831818560208601613e90565b61583a81613ec3565b840191505092915050565b600060808201905061585a6000830187613f61565b6158676020830186613f61565b6158746040830185613e4a565b8181036060830152615886818461580c565b905095945050505050565b6000815190506158a081613cff565b92915050565b6000602082840312156158bc576158bb613cc9565b5b60006158ca84828501615891565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615938602083613e7f565b915061594382615902565b602082019050919050565b600060208201905081810360008301526159678161592b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006159a4601c83613e7f565b91506159af8261596e565b602082019050919050565b600060208201905081810360008301526159d381615997565b905091905056fea26469706673582212204b26face1ecc145d159ee04d9806ae56fc6bddf5786c5aeb4aafd7bb12dfeb4c64736f6c634300080d00330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d5a36574b706954675274754d5a5a46747766474d4a507772476e7470795031673752645a764c70416d4372372f00000000000000000000000000000000000000000000000000000000

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d5a36574b706954675274754d5a5a46747766474d4a507772476e7470795031673752645a764c70416d4372372f00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): https://ipfs.io/ipfs/QmZ6WKpiTgRtuMZZFtwfGMJPwrGntpyP1g7RdZvLpAmCr7/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000044
Arg [2] : 68747470733a2f2f697066732e696f2f697066732f516d5a36574b7069546752
Arg [3] : 74754d5a5a46747766474d4a507772476e7470795031673752645a764c70416d
Arg [4] : 4372372f00000000000000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

49107:7783:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42889:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55639:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54845:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49379:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29623:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31136:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30653:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49501:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49343:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43529:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49462:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31836:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55724:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49918:64;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43197:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49849:64;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49987;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32243:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53895:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54759:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43719:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55394:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50132:70;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49554:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49682:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29334:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50058:69;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29065:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8152:103;;;;;;;;;;;;;:::i;:::-;;50207:75;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55272:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7504:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54939:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29792:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31379:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32499:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49781:63;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50367:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;50287:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49301:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54249:504;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51617:1349;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49417:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49585:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55498:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55885:476;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49713:63;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52972:917;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31605:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8410:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55085:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42889:224;42991:4;43030:35;43015:50;;;:11;:50;;;;:90;;;;43069:36;43093:11;43069:23;:36::i;:::-;43015:90;43008:97;;42889:224;;;:::o;55639:73::-;7390:13;:11;:13::i;:::-;55700:6:::1;55691;;:15;;;;;;;;;;;;;;;;;;55639:73:::0;:::o;54845:88::-;7390:13;:11;:13::i;:::-;54917:10:::1;54908:6;:19;;;;54845:88:::0;:::o;49379:33::-;;;;:::o;29623:100::-;29677:13;29710:5;29703:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29623:100;:::o;31136:171::-;31212:7;31232:23;31247:7;31232:14;:23::i;:::-;31275:15;:24;31291:7;31275:24;;;;;;;;;;;;;;;;;;;;;31268:31;;31136:171;;;:::o;30653:417::-;30734:13;30750:23;30765:7;30750:14;:23::i;:::-;30734:39;;30798:5;30792:11;;:2;:11;;;30784:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;30892:5;30876:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;30901:37;30918:5;30925:12;:10;:12::i;:::-;30901:16;:37::i;:::-;30876:62;30854:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;31041:21;31050:2;31054:7;31041:8;:21::i;:::-;30723:347;30653:417;;:::o;49501:48::-;;;;;;;;;;;;;;;;;:::o;49343:31::-;;;;:::o;43529:113::-;43590:7;43617:10;:17;;;;43610:24;;43529:113;:::o;49462:34::-;;;;:::o;31836:336::-;32031:41;32050:12;:10;:12::i;:::-;32064:7;32031:18;:41::i;:::-;32023:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;32136:28;32146:4;32152:2;32156:7;32136:9;:28::i;:::-;31836:336;;;:::o;55724:155::-;55797:7;55820:11;:20;55832:7;55820:20;;;;;;;;;;;;;;;;;;;;;;;;;55816:39;;;55849:6;;55842:13;;;;55816:39;55869:4;;55862:11;;55724:155;;;;:::o;49918:64::-;;;;;;;;;;;;;:::o;43197:256::-;43294:7;43330:23;43347:5;43330:16;:23::i;:::-;43322:5;:31;43314:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43419:12;:19;43432:5;43419:19;;;;;;;;;;;;;;;:26;43439:5;43419:26;;;;;;;;;;;;43412:33;;43197:256;;;;:::o;49849:64::-;;;;;;;;;;;;;:::o;49987:::-;;;;;;;;;;;;;:::o;32243:185::-;32381:39;32398:4;32404:2;32408:7;32381:39;;;;;;;;;;;;:16;:39::i;:::-;32243:185;;;:::o;53895:348::-;53970:16;53998:23;54024:17;54034:6;54024:9;:17::i;:::-;53998:43;;54048:25;54090:15;54076:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54048:58;;54118:9;54113:103;54133:15;54129:1;:19;54113:103;;;54178:30;54198:6;54206:1;54178:19;:30::i;:::-;54164:8;54173:1;54164:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;54150:3;;;;;:::i;:::-;;;;54113:103;;;;54229:8;54222:15;;;;53895:348;;;:::o;54759:80::-;7390:13;:11;:13::i;:::-;54825:8:::1;54818:4;:15;;;;54759:80:::0;:::o;43719:233::-;43794:7;43830:30;:28;:30::i;:::-;43822:5;:38;43814:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43927:10;43938:5;43927:17;;;;;;;;:::i;:::-;;;;;;;;;;43920:24;;43719:233;;;:::o;55394:98::-;7390:13;:11;:13::i;:::-;55475:11:::1;55465:7;:21;;;;;;;;;;;;:::i;:::-;;55394:98:::0;:::o;50132:70::-;;;;;;;;;;;;;:::o;49554:26::-;;;;;;;;;;;;;:::o;49682:24::-;;;;:::o;29334:222::-;29406:7;29426:13;29442:7;:16;29450:7;29442:16;;;;;;;;;;;;;;;;;;;;;29426:32;;29494:1;29477:19;;:5;:19;;;29469:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;29543:5;29536:12;;;29334:222;;;:::o;50058:69::-;;;;;;;;;;;;;:::o;29065:207::-;29137:7;29182:1;29165:19;;:5;:19;;;29157:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29248:9;:16;29258:5;29248:16;;;;;;;;;;;;;;;;29241:23;;29065:207;;;:::o;8152:103::-;7390:13;:11;:13::i;:::-;8217:30:::1;8244:1;8217:18;:30::i;:::-;8152:103::o:0;50207:75::-;;;;;;;;;;;;;:::o;55272:116::-;7390:13;:11;:13::i;:::-;55365:17:::1;55349:13;:33;;;;55272:116:::0;:::o;7504:87::-;7550:7;7577:6;;;;;;;;;;;7570:13;;7504:87;:::o;54939:140::-;7390:13;:11;:13::i;:::-;55061:12:::1;55037:11;:21;55049:8;55037:21;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;54939:140:::0;;:::o;29792:104::-;29848:13;29881:7;29874:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29792:104;:::o;31379:155::-;31474:52;31493:12;:10;:12::i;:::-;31507:8;31517;31474:18;:52::i;:::-;31379:155;;:::o;32499:323::-;32673:41;32692:12;:10;:12::i;:::-;32706:7;32673:18;:41::i;:::-;32665:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;32776:38;32790:4;32796:2;32800:7;32809:4;32776:13;:38::i;:::-;32499:323;;;;:::o;49781:63::-;;;;;;;;;;;;;:::o;50367:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50287:73::-;;;;;;;;;;;;;:::o;49301:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54249:504::-;54347:13;54388:16;54396:7;54388;:16::i;:::-;54372:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;54478:28;54509:10;:8;:10::i;:::-;54478:41;;54571:1;54546:14;54540:28;:32;:207;;;;;;;;;;;;;;;;;54634:14;54663:18;:7;:16;:18::i;:::-;54696:13;54603:119;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54540:207;54526:221;;;54249:504;;;:::o;51617:1349::-;51685:6;;;;;;;;;;;51684:7;51676:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;51732:1;51723:6;:10;51715:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;51815:13;;51805:6;51777:13;:25;51791:10;51777:25;;;;;;;;;;;;;;;;:34;;;;:::i;:::-;:51;;51769:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;51869:14;51886:13;:11;:13::i;:::-;51869:30;;49453:4;51923:6;51914;:15;;;;:::i;:::-;:28;;51906:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;52003:4;51993:6;51981:9;;:18;;;;:::i;:::-;:26;;51973:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;52042:13;52058:4;;52042:20;;52074:11;:23;52086:10;52074:23;;;;;;;;;;;;;;;;;;;;;;;;;52069:62;;;52117:6;;52109:14;;52069:62;52166:6;52158:5;:14;;;;:::i;:::-;52145:9;:27;;52137:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;52207:9;52202:96;52226:6;52222:1;:10;52202:96;;;52248:42;52258:10;52270:19;52287:1;52280:6;:8;;;;:::i;:::-;52270:9;:19::i;:::-;52248:9;:42::i;:::-;52234:3;;;;;:::i;:::-;;;;52202:96;;;;52333:6;52304:13;:25;52318:10;52304:25;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;52359:6;52346:9;;:19;;;;;;;:::i;:::-;;;;;;;;52378:15;52396:21;52378:39;;52424:12;52455:4;52449:3;52439:7;:13;;;;:::i;:::-;:20;;;;:::i;:::-;52424:35;;52467:9;52489:13;;;;;;;;;;;52481:27;;52516:4;52481:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52466:59;;;52540:4;52532:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;52598:4;52592:3;52582:7;:13;;;;:::i;:::-;:20;;;;:::i;:::-;52575:27;;52627:15;;;;;;;;;;;52619:29;;52656:4;52619:46;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52609:56;;;;;52680:4;52672:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;52738:4;52732:3;52722:7;:13;;;;:::i;:::-;:20;;;;:::i;:::-;52715:27;;52767:10;;;;;;;;;;;52759:24;;52791:4;52759:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52749:51;;;;;52815:4;52807:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;52868:9;;;;;;;;;;;52860:23;;52891:21;52860:57;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52850:67;;;;;52932:4;52924:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;51669:1297;;;;;51617:1349;:::o;49417:40::-;49453:4;49417:40;:::o;49585:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;55498:135::-;7390:13;:11;:13::i;:::-;55610:17:::1;55594:13;:33;;;;;;;;;;;;:::i;:::-;;55498:135:::0;:::o;55885:476::-;7390:13;:11;:13::i;:::-;56041:7:::1;:14;56022:8;:15;:33;56014:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;56087:14;56104:13;:11;:13::i;:::-;56087:30;;56133:9;56128:226;56152:8;:15;56148:1;:19;56128:226;;;56194:9;56189:119;56213:7;56221:1;56213:10;;;;;;;;:::i;:::-;;;;;;;;56209:1;:14;56189:119;;;56249:43;56259:8;56268:1;56259:11;;;;;;;;:::i;:::-;;;;;;;;56272:19;56289:1;56282:6;:8;;;;:::i;:::-;56272:9;:19::i;:::-;56249:9;:43::i;:::-;56225:3;;;;;:::i;:::-;;;;56189:119;;;;56332:7;56340:1;56332:10;;;;;;;;:::i;:::-;;;;;;;;56322:20;;;;;:::i;:::-;;;56169:3;;;;;:::i;:::-;;;;56128:226;;;;56003:358;55885:476:::0;;:::o;49713:63::-;;;;;;;;;;;;;:::o;52972:917::-;53049:6;;;;;;;;;;;53048:7;53040:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;53096:1;53087:6;:10;53079:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;53179:13;;53169:6;53141:13;:25;53155:10;53141:25;;;;;;;;;;;;;;;;:34;;;;:::i;:::-;:51;;53133:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;53233:14;53250:13;:11;:13::i;:::-;53233:30;;49453:4;53287:6;53278;:15;;;;:::i;:::-;:28;;53270:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;53339:27;53369:10;:17;53380:5;53369:17;;;;;;;;;;;;;;;53339:47;;53423:1;53401:9;:19;;;:23;53393:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;53497:9;:19;;;53487:6;53468:9;:16;;;:25;;;;:::i;:::-;:48;;53460:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;53621:18;53651:9;:15;;;53642:6;:24;;;;:::i;:::-;53621:45;;53673:33;53688:5;53695:10;53673:14;:33::i;:::-;53718:9;53713:96;53737:6;53733:1;:10;53713:96;;;53759:42;53769:10;53781:19;53798:1;53791:6;:8;;;;:::i;:::-;53781:9;:19::i;:::-;53759:9;:42::i;:::-;53745:3;;;;;:::i;:::-;;;;53713:96;;;;53844:6;53815:13;:25;53829:10;53815:25;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;53877:6;53857:9;:16;;;:26;;;;;;;:::i;:::-;;;;;;;;53033:856;;;52972:917;;:::o;31605:164::-;31702:4;31726:18;:25;31745:5;31726:25;;;;;;;;;;;;;;;:35;31752:8;31726:35;;;;;;;;;;;;;;;;;;;;;;;;;31719:42;;31605:164;;;;:::o;8410:201::-;7390:13;:11;:13::i;:::-;8519:1:::1;8499:22;;:8;:22;;::::0;8491:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;8575:28;8594:8;8575:18;:28::i;:::-;8410:201:::0;:::o;55085:181::-;7390:13;:11;:13::i;:::-;55173:6:::1;55168:93;55189:9;:16;55185:1;:20;55168:93;;;55249:4;55221:11;:25;55233:9;55243:1;55233:12;;;;;;;;:::i;:::-;;;;;;;;55221:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;55207:3;;;;;:::i;:::-;;;;55168:93;;;;55085:181:::0;:::o;28696:305::-;28798:4;28850:25;28835:40;;;:11;:40;;;;:105;;;;28907:33;28892:48;;;:11;:48;;;;28835:105;:158;;;;28957:36;28981:11;28957:23;:36::i;:::-;28835:158;28815:178;;28696:305;;;:::o;7669:132::-;7744:12;:10;:12::i;:::-;7733:23;;:7;:5;:7::i;:::-;:23;;;7725:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7669:132::o;39111:135::-;39193:16;39201:7;39193;:16::i;:::-;39185:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;39111:135;:::o;6055:98::-;6108:7;6135:10;6128:17;;6055:98;:::o;38390:174::-;38492:2;38465:15;:24;38481:7;38465:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;38548:7;38544:2;38510:46;;38519:23;38534:7;38519:14;:23::i;:::-;38510:46;;;;;;;;;;;;38390:174;;:::o;34623:264::-;34716:4;34733:13;34749:23;34764:7;34749:14;:23::i;:::-;34733:39;;34802:5;34791:16;;:7;:16;;;:52;;;;34811:32;34828:5;34835:7;34811:16;:32::i;:::-;34791:52;:87;;;;34871:7;34847:31;;:20;34859:7;34847:11;:20::i;:::-;:31;;;34791:87;34783:96;;;34623:264;;;;:::o;37646:625::-;37805:4;37778:31;;:23;37793:7;37778:14;:23::i;:::-;:31;;;37770:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;37884:1;37870:16;;:2;:16;;;37862:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37940:39;37961:4;37967:2;37971:7;37940:20;:39::i;:::-;38044:29;38061:1;38065:7;38044:8;:29::i;:::-;38105:1;38086:9;:15;38096:4;38086:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;38134:1;38117:9;:13;38127:2;38117:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38165:2;38146:7;:16;38154:7;38146:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38204:7;38200:2;38185:27;;38194:4;38185:27;;;;;;;;;;;;38225:38;38245:4;38251:2;38255:7;38225:19;:38::i;:::-;37646:625;;;:::o;8771:191::-;8845:16;8864:6;;;;;;;;;;;8845:25;;8890:8;8881:6;;:17;;;;;;;;;;;;;;;;;;8945:8;8914:40;;8935:8;8914:40;;;;;;;;;;;;8834:128;8771:191;:::o;38707:315::-;38862:8;38853:17;;:5;:17;;;38845:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;38949:8;38911:18;:25;38930:5;38911:25;;;;;;;;;;;;;;;:35;38937:8;38911:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;38995:8;38973:41;;38988:5;38973:41;;;39005:8;38973:41;;;;;;:::i;:::-;;;;;;;;38707:315;;;:::o;33703:313::-;33859:28;33869:4;33875:2;33879:7;33859:9;:28::i;:::-;33906:47;33929:4;33935:2;33939:7;33948:4;33906:22;:47::i;:::-;33898:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;33703:313;;;;:::o;34329:127::-;34394:4;34446:1;34418:30;;:7;:16;34426:7;34418:16;;;;;;;;;;;;;;;;;;;;;:30;;;;34411:37;;34329:127;;;:::o;50814:102::-;50874:13;50903:7;50896:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50814:102;:::o;3309:723::-;3365:13;3595:1;3586:5;:10;3582:53;;3613:10;;;;;;;;;;;;;;;;;;;;;3582:53;3645:12;3660:5;3645:20;;3676:14;3701:78;3716:1;3708:4;:9;3701:78;;3734:8;;;;;:::i;:::-;;;;3765:2;3757:10;;;;;:::i;:::-;;;3701:78;;;3789:19;3821:6;3811:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3789:39;;3839:154;3855:1;3846:5;:10;3839:154;;3883:1;3873:11;;;;;:::i;:::-;;;3950:2;3942:5;:10;;;;:::i;:::-;3929:2;:24;;;;:::i;:::-;3916:39;;3899:6;3906;3899:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3979:2;3970:11;;;;;:::i;:::-;;;3839:154;;;4017:6;4003:21;;;;;3309:723;;;;:::o;50922:675::-;50980:13;51002:17;51034:12;49453:4;51022:24;;;;:::i;:::-;51002:44;;51053:12;51165:9;51103:10;51115:16;51133:15;51150:9;51086:74;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51076:85;;;;;;51068:94;;:106;;;;:::i;:::-;51053:121;;51189:1;51181:9;;51297:1;51275:12;51288:4;51275:18;;;;;;;:::i;:::-;;;;:23;51271:93;;51315:12;51328:4;51315:18;;;;;;;:::i;:::-;;;;51307:26;;51271:93;;;51360:4;51352:12;;51271:93;51463:1;51432:12;51457:1;51445:9;:13;;;;:::i;:::-;51432:27;;;;;;;:::i;:::-;;;;:32;51428:146;;51506:1;51494:9;:13;;;;:::i;:::-;51473:12;51486:4;51473:18;;;;;;;:::i;:::-;;;:34;;;;51428:146;;;51547:12;51572:1;51560:9;:13;;;;:::i;:::-;51547:27;;;;;;;:::i;:::-;;;;51526:12;51539:4;51526:18;;;;;;;:::i;:::-;;;:48;;;;51428:146;51590:1;51581:10;;;;;:::i;:::-;;;50995:602;;50922:675;;;:::o;35229:110::-;35305:26;35315:2;35319:7;35305:26;;;;;;;;;;;;:9;:26::i;:::-;35229:110;;:::o;56367:520::-;56441:12;56475:4;56469:3;56456:10;:16;;;;:::i;:::-;:23;;;;:::i;:::-;56441:38;;56486:12;56520:4;56514:3;56501:10;:16;;;;:::i;:::-;:23;;;;:::i;:::-;56486:38;;56531:12;56565:4;56559:3;56546:10;:16;;;;:::i;:::-;:23;;;;:::i;:::-;56531:38;;56576:12;56618:4;56611;56604;56591:10;:17;;;;:::i;:::-;:24;;;;:::i;:::-;:31;;;;:::i;:::-;56576:46;;56636:5;56629:26;;;56656:10;56668:13;;;;;;;;;;;56683:4;56629:59;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;56702:5;56695:26;;;56722:10;56734:15;;;;;;;;;;;56751:4;56695:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;56770:5;56763:26;;;56790:10;56802;;;;;;;;;;;56814:4;56763:56;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;56833:5;56826:26;;;56853:10;56865:9;;;;;;;;;;;56876:4;56826:55;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;56434:453;;;;56367:520;;:::o;20358:157::-;20443:4;20482:25;20467:40;;;:11;:40;;;;20460:47;;20358:157;;;:::o;44565:589::-;44709:45;44736:4;44742:2;44746:7;44709:26;:45::i;:::-;44787:1;44771:18;;:4;:18;;;44767:187;;44806:40;44838:7;44806:31;:40::i;:::-;44767:187;;;44876:2;44868:10;;:4;:10;;;44864:90;;44895:47;44928:4;44934:7;44895:32;:47::i;:::-;44864:90;44767:187;44982:1;44968:16;;:2;:16;;;44964:183;;45001:45;45038:7;45001:36;:45::i;:::-;44964:183;;;45074:4;45068:10;;:2;:10;;;45064:83;;45095:40;45123:2;45127:7;45095:27;:40::i;:::-;45064:83;44964:183;44565:589;;;:::o;41746:125::-;;;;:::o;39810:853::-;39964:4;39985:15;:2;:13;;;:15::i;:::-;39981:675;;;40037:2;40021:36;;;40058:12;:10;:12::i;:::-;40072:4;40078:7;40087:4;40021:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40017:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40279:1;40262:6;:13;:18;40258:328;;40305:60;;;;;;;;;;:::i;:::-;;;;;;;;40258:328;40536:6;40530:13;40521:6;40517:2;40513:15;40506:38;40017:584;40153:41;;;40143:51;;;:6;:51;;;;40136:58;;;;;39981:675;40640:4;40633:11;;39810:853;;;;;;;:::o;35566:319::-;35695:18;35701:2;35705:7;35695:5;:18::i;:::-;35746:53;35777:1;35781:2;35785:7;35794:4;35746:22;:53::i;:::-;35724:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;35566:319;;;:::o;41235:126::-;;;;:::o;45877:164::-;45981:10;:17;;;;45954:15;:24;45970:7;45954:24;;;;;;;;;;;:44;;;;46009:10;46025:7;46009:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45877:164;:::o;46668:988::-;46934:22;46984:1;46959:22;46976:4;46959:16;:22::i;:::-;:26;;;;:::i;:::-;46934:51;;46996:18;47017:17;:26;47035:7;47017:26;;;;;;;;;;;;46996:47;;47164:14;47150:10;:28;47146:328;;47195:19;47217:12;:18;47230:4;47217:18;;;;;;;;;;;;;;;:34;47236:14;47217:34;;;;;;;;;;;;47195:56;;47301:11;47268:12;:18;47281:4;47268:18;;;;;;;;;;;;;;;:30;47287:10;47268:30;;;;;;;;;;;:44;;;;47418:10;47385:17;:30;47403:11;47385:30;;;;;;;;;;;:43;;;;47180:294;47146:328;47570:17;:26;47588:7;47570:26;;;;;;;;;;;47563:33;;;47614:12;:18;47627:4;47614:18;;;;;;;;;;;;;;;:34;47633:14;47614:34;;;;;;;;;;;47607:41;;;46749:907;;46668:988;;:::o;47951:1079::-;48204:22;48249:1;48229:10;:17;;;;:21;;;;:::i;:::-;48204:46;;48261:18;48282:15;:24;48298:7;48282:24;;;;;;;;;;;;48261:45;;48633:19;48655:10;48666:14;48655:26;;;;;;;;:::i;:::-;;;;;;;;;;48633:48;;48719:11;48694:10;48705;48694:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;48830:10;48799:15;:28;48815:11;48799:28;;;;;;;;;;;:41;;;;48971:15;:24;48987:7;48971:24;;;;;;;;;;;48964:31;;;49006:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48022:1008;;;47951:1079;:::o;45455:221::-;45540:14;45557:20;45574:2;45557:16;:20::i;:::-;45540:37;;45615:7;45588:12;:16;45601:2;45588:16;;;;;;;;;;;;;;;:24;45605:6;45588:24;;;;;;;;;;;:34;;;;45662:6;45633:17;:26;45651:7;45633:26;;;;;;;;;;;:35;;;;45529:147;45455:221;;:::o;10202:326::-;10262:4;10519:1;10497:7;:19;;;:23;10490:30;;10202:326;;;:::o;36221:439::-;36315:1;36301:16;;:2;:16;;;36293:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;36374:16;36382:7;36374;:16::i;:::-;36373:17;36365:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36436:45;36465:1;36469:2;36473:7;36436:20;:45::i;:::-;36511:1;36494:9;:13;36504:2;36494:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36542:2;36523:7;:16;36531:7;36523:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36587:7;36583:2;36562:33;;36579:1;36562:33;;;;;;;;;;;;36608:44;36636:1;36640:2;36644:7;36608:19;:44::i;:::-;36221:439;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:116::-;1588:21;1603:5;1588:21;:::i;:::-;1581:5;1578:32;1568:60;;1624:1;1621;1614:12;1568:60;1518:116;:::o;1640:133::-;1683:5;1721:6;1708:20;1699:29;;1737:30;1761:5;1737:30;:::i;:::-;1640:133;;;;:::o;1779:323::-;1835:6;1884:2;1872:9;1863:7;1859:23;1855:32;1852:119;;;1890:79;;:::i;:::-;1852:119;2010:1;2035:50;2077:7;2068:6;2057:9;2053:22;2035:50;:::i;:::-;2025:60;;1981:114;1779:323;;;;:::o;2108:77::-;2145:7;2174:5;2163:16;;2108:77;;;:::o;2191:122::-;2264:24;2282:5;2264:24;:::i;:::-;2257:5;2254:35;2244:63;;2303:1;2300;2293:12;2244:63;2191:122;:::o;2319:139::-;2365:5;2403:6;2390:20;2381:29;;2419:33;2446:5;2419:33;:::i;:::-;2319:139;;;;:::o;2464:329::-;2523:6;2572:2;2560:9;2551:7;2547:23;2543:32;2540:119;;;2578:79;;:::i;:::-;2540:119;2698:1;2723:53;2768:7;2759:6;2748:9;2744:22;2723:53;:::i;:::-;2713:63;;2669:117;2464:329;;;;:::o;2799:118::-;2886:24;2904:5;2886:24;:::i;:::-;2881:3;2874:37;2799:118;;:::o;2923:222::-;3016:4;3054:2;3043:9;3039:18;3031:26;;3067:71;3135:1;3124:9;3120:17;3111:6;3067:71;:::i;:::-;2923:222;;;;:::o;3151:99::-;3203:6;3237:5;3231:12;3221:22;;3151:99;;;:::o;3256:169::-;3340:11;3374:6;3369:3;3362:19;3414:4;3409:3;3405:14;3390:29;;3256:169;;;;:::o;3431:307::-;3499:1;3509:113;3523:6;3520:1;3517:13;3509:113;;;3608:1;3603:3;3599:11;3593:18;3589:1;3584:3;3580:11;3573:39;3545:2;3542:1;3538:10;3533:15;;3509:113;;;3640:6;3637:1;3634:13;3631:101;;;3720:1;3711:6;3706:3;3702:16;3695:27;3631:101;3480:258;3431:307;;;:::o;3744:102::-;3785:6;3836:2;3832:7;3827:2;3820:5;3816:14;3812:28;3802:38;;3744:102;;;:::o;3852:364::-;3940:3;3968:39;4001:5;3968:39;:::i;:::-;4023:71;4087:6;4082:3;4023:71;:::i;:::-;4016:78;;4103:52;4148:6;4143:3;4136:4;4129:5;4125:16;4103:52;:::i;:::-;4180:29;4202:6;4180:29;:::i;:::-;4175:3;4171:39;4164:46;;3944:272;3852:364;;;;:::o;4222:313::-;4335:4;4373:2;4362:9;4358:18;4350:26;;4422:9;4416:4;4412:20;4408:1;4397:9;4393:17;4386:47;4450:78;4523:4;4514:6;4450:78;:::i;:::-;4442:86;;4222:313;;;;:::o;4541:126::-;4578:7;4618:42;4611:5;4607:54;4596:65;;4541:126;;;:::o;4673:96::-;4710:7;4739:24;4757:5;4739:24;:::i;:::-;4728:35;;4673:96;;;:::o;4775:118::-;4862:24;4880:5;4862:24;:::i;:::-;4857:3;4850:37;4775:118;;:::o;4899:222::-;4992:4;5030:2;5019:9;5015:18;5007:26;;5043:71;5111:1;5100:9;5096:17;5087:6;5043:71;:::i;:::-;4899:222;;;;:::o;5127:122::-;5200:24;5218:5;5200:24;:::i;:::-;5193:5;5190:35;5180:63;;5239:1;5236;5229:12;5180:63;5127:122;:::o;5255:139::-;5301:5;5339:6;5326:20;5317:29;;5355:33;5382:5;5355:33;:::i;:::-;5255:139;;;;:::o;5400:474::-;5468:6;5476;5525:2;5513:9;5504:7;5500:23;5496:32;5493:119;;;5531:79;;:::i;:::-;5493:119;5651:1;5676:53;5721:7;5712:6;5701:9;5697:22;5676:53;:::i;:::-;5666:63;;5622:117;5778:2;5804:53;5849:7;5840:6;5829:9;5825:22;5804:53;:::i;:::-;5794:63;;5749:118;5400:474;;;;;:::o;5880:329::-;5939:6;5988:2;5976:9;5967:7;5963:23;5959:32;5956:119;;;5994:79;;:::i;:::-;5956:119;6114:1;6139:53;6184:7;6175:6;6164:9;6160:22;6139:53;:::i;:::-;6129:63;;6085:117;5880:329;;;;:::o;6215:619::-;6292:6;6300;6308;6357:2;6345:9;6336:7;6332:23;6328:32;6325:119;;;6363:79;;:::i;:::-;6325:119;6483:1;6508:53;6553:7;6544:6;6533:9;6529:22;6508:53;:::i;:::-;6498:63;;6454:117;6610:2;6636:53;6681:7;6672:6;6661:9;6657:22;6636:53;:::i;:::-;6626:63;;6581:118;6738:2;6764:53;6809:7;6800:6;6789:9;6785:22;6764:53;:::i;:::-;6754:63;;6709:118;6215:619;;;;;:::o;6840:114::-;6907:6;6941:5;6935:12;6925:22;;6840:114;;;:::o;6960:184::-;7059:11;7093:6;7088:3;7081:19;7133:4;7128:3;7124:14;7109:29;;6960:184;;;;:::o;7150:132::-;7217:4;7240:3;7232:11;;7270:4;7265:3;7261:14;7253:22;;7150:132;;;:::o;7288:108::-;7365:24;7383:5;7365:24;:::i;:::-;7360:3;7353:37;7288:108;;:::o;7402:179::-;7471:10;7492:46;7534:3;7526:6;7492:46;:::i;:::-;7570:4;7565:3;7561:14;7547:28;;7402:179;;;;:::o;7587:113::-;7657:4;7689;7684:3;7680:14;7672:22;;7587:113;;;:::o;7736:732::-;7855:3;7884:54;7932:5;7884:54;:::i;:::-;7954:86;8033:6;8028:3;7954:86;:::i;:::-;7947:93;;8064:56;8114:5;8064:56;:::i;:::-;8143:7;8174:1;8159:284;8184:6;8181:1;8178:13;8159:284;;;8260:6;8254:13;8287:63;8346:3;8331:13;8287:63;:::i;:::-;8280:70;;8373:60;8426:6;8373:60;:::i;:::-;8363:70;;8219:224;8206:1;8203;8199:9;8194:14;;8159:284;;;8163:14;8459:3;8452:10;;7860:608;;;7736:732;;;;:::o;8474:373::-;8617:4;8655:2;8644:9;8640:18;8632:26;;8704:9;8698:4;8694:20;8690:1;8679:9;8675:17;8668:47;8732:108;8835:4;8826:6;8732:108;:::i;:::-;8724:116;;8474:373;;;;:::o;8853:117::-;8962:1;8959;8952:12;8976:117;9085:1;9082;9075:12;9099:180;9147:77;9144:1;9137:88;9244:4;9241:1;9234:15;9268:4;9265:1;9258:15;9285:281;9368:27;9390:4;9368:27;:::i;:::-;9360:6;9356:40;9498:6;9486:10;9483:22;9462:18;9450:10;9447:34;9444:62;9441:88;;;9509:18;;:::i;:::-;9441:88;9549:10;9545:2;9538:22;9328:238;9285:281;;:::o;9572:129::-;9606:6;9633:20;;:::i;:::-;9623:30;;9662:33;9690:4;9682:6;9662:33;:::i;:::-;9572:129;;;:::o;9707:308::-;9769:4;9859:18;9851:6;9848:30;9845:56;;;9881:18;;:::i;:::-;9845:56;9919:29;9941:6;9919:29;:::i;:::-;9911:37;;10003:4;9997;9993:15;9985:23;;9707:308;;;:::o;10021:154::-;10105:6;10100:3;10095;10082:30;10167:1;10158:6;10153:3;10149:16;10142:27;10021:154;;;:::o;10181:412::-;10259:5;10284:66;10300:49;10342:6;10300:49;:::i;:::-;10284:66;:::i;:::-;10275:75;;10373:6;10366:5;10359:21;10411:4;10404:5;10400:16;10449:3;10440:6;10435:3;10431:16;10428:25;10425:112;;;10456:79;;:::i;:::-;10425:112;10546:41;10580:6;10575:3;10570;10546:41;:::i;:::-;10265:328;10181:412;;;;;:::o;10613:340::-;10669:5;10718:3;10711:4;10703:6;10699:17;10695:27;10685:122;;10726:79;;:::i;:::-;10685:122;10843:6;10830:20;10868:79;10943:3;10935:6;10928:4;10920:6;10916:17;10868:79;:::i;:::-;10859:88;;10675:278;10613:340;;;;:::o;10959:509::-;11028:6;11077:2;11065:9;11056:7;11052:23;11048:32;11045:119;;;11083:79;;:::i;:::-;11045:119;11231:1;11220:9;11216:17;11203:31;11261:18;11253:6;11250:30;11247:117;;;11283:79;;:::i;:::-;11247:117;11388:63;11443:7;11434:6;11423:9;11419:22;11388:63;:::i;:::-;11378:73;;11174:287;10959:509;;;;:::o;11474:468::-;11539:6;11547;11596:2;11584:9;11575:7;11571:23;11567:32;11564:119;;;11602:79;;:::i;:::-;11564:119;11722:1;11747:53;11792:7;11783:6;11772:9;11768:22;11747:53;:::i;:::-;11737:63;;11693:117;11849:2;11875:50;11917:7;11908:6;11897:9;11893:22;11875:50;:::i;:::-;11865:60;;11820:115;11474:468;;;;;:::o;11948:307::-;12009:4;12099:18;12091:6;12088:30;12085:56;;;12121:18;;:::i;:::-;12085:56;12159:29;12181:6;12159:29;:::i;:::-;12151:37;;12243:4;12237;12233:15;12225:23;;11948:307;;;:::o;12261:410::-;12338:5;12363:65;12379:48;12420:6;12379:48;:::i;:::-;12363:65;:::i;:::-;12354:74;;12451:6;12444:5;12437:21;12489:4;12482:5;12478:16;12527:3;12518:6;12513:3;12509:16;12506:25;12503:112;;;12534:79;;:::i;:::-;12503:112;12624:41;12658:6;12653:3;12648;12624:41;:::i;:::-;12344:327;12261:410;;;;;:::o;12690:338::-;12745:5;12794:3;12787:4;12779:6;12775:17;12771:27;12761:122;;12802:79;;:::i;:::-;12761:122;12919:6;12906:20;12944:78;13018:3;13010:6;13003:4;12995:6;12991:17;12944:78;:::i;:::-;12935:87;;12751:277;12690:338;;;;:::o;13034:943::-;13129:6;13137;13145;13153;13202:3;13190:9;13181:7;13177:23;13173:33;13170:120;;;13209:79;;:::i;:::-;13170:120;13329:1;13354:53;13399:7;13390:6;13379:9;13375:22;13354:53;:::i;:::-;13344:63;;13300:117;13456:2;13482:53;13527:7;13518:6;13507:9;13503:22;13482:53;:::i;:::-;13472:63;;13427:118;13584:2;13610:53;13655:7;13646:6;13635:9;13631:22;13610:53;:::i;:::-;13600:63;;13555:118;13740:2;13729:9;13725:18;13712:32;13771:18;13763:6;13760:30;13757:117;;;13793:79;;:::i;:::-;13757:117;13898:62;13952:7;13943:6;13932:9;13928:22;13898:62;:::i;:::-;13888:72;;13683:287;13034:943;;;;;;;:::o;13983:442::-;14132:4;14170:2;14159:9;14155:18;14147:26;;14183:71;14251:1;14240:9;14236:17;14227:6;14183:71;:::i;:::-;14264:72;14332:2;14321:9;14317:18;14308:6;14264:72;:::i;:::-;14346;14414:2;14403:9;14399:18;14390:6;14346:72;:::i;:::-;13983:442;;;;;;:::o;14431:311::-;14508:4;14598:18;14590:6;14587:30;14584:56;;;14620:18;;:::i;:::-;14584:56;14670:4;14662:6;14658:17;14650:25;;14730:4;14724;14720:15;14712:23;;14431:311;;;:::o;14748:117::-;14857:1;14854;14847:12;14888:710;14984:5;15009:81;15025:64;15082:6;15025:64;:::i;:::-;15009:81;:::i;:::-;15000:90;;15110:5;15139:6;15132:5;15125:21;15173:4;15166:5;15162:16;15155:23;;15226:4;15218:6;15214:17;15206:6;15202:30;15255:3;15247:6;15244:15;15241:122;;;15274:79;;:::i;:::-;15241:122;15389:6;15372:220;15406:6;15401:3;15398:15;15372:220;;;15481:3;15510:37;15543:3;15531:10;15510:37;:::i;:::-;15505:3;15498:50;15577:4;15572:3;15568:14;15561:21;;15448:144;15432:4;15427:3;15423:14;15416:21;;15372:220;;;15376:21;14990:608;;14888:710;;;;;:::o;15621:370::-;15692:5;15741:3;15734:4;15726:6;15722:17;15718:27;15708:122;;15749:79;;:::i;:::-;15708:122;15866:6;15853:20;15891:94;15981:3;15973:6;15966:4;15958:6;15954:17;15891:94;:::i;:::-;15882:103;;15698:293;15621:370;;;;:::o;15997:311::-;16074:4;16164:18;16156:6;16153:30;16150:56;;;16186:18;;:::i;:::-;16150:56;16236:4;16228:6;16224:17;16216:25;;16296:4;16290;16286:15;16278:23;;15997:311;;;:::o;16331:710::-;16427:5;16452:81;16468:64;16525:6;16468:64;:::i;:::-;16452:81;:::i;:::-;16443:90;;16553:5;16582:6;16575:5;16568:21;16616:4;16609:5;16605:16;16598:23;;16669:4;16661:6;16657:17;16649:6;16645:30;16698:3;16690:6;16687:15;16684:122;;;16717:79;;:::i;:::-;16684:122;16832:6;16815:220;16849:6;16844:3;16841:15;16815:220;;;16924:3;16953:37;16986:3;16974:10;16953:37;:::i;:::-;16948:3;16941:50;17020:4;17015:3;17011:14;17004:21;;16891:144;16875:4;16870:3;16866:14;16859:21;;16815:220;;;16819:21;16433:608;;16331:710;;;;;:::o;17064:370::-;17135:5;17184:3;17177:4;17169:6;17165:17;17161:27;17151:122;;17192:79;;:::i;:::-;17151:122;17309:6;17296:20;17334:94;17424:3;17416:6;17409:4;17401:6;17397:17;17334:94;:::i;:::-;17325:103;;17141:293;17064:370;;;;:::o;17440:894::-;17558:6;17566;17615:2;17603:9;17594:7;17590:23;17586:32;17583:119;;;17621:79;;:::i;:::-;17583:119;17769:1;17758:9;17754:17;17741:31;17799:18;17791:6;17788:30;17785:117;;;17821:79;;:::i;:::-;17785:117;17926:78;17996:7;17987:6;17976:9;17972:22;17926:78;:::i;:::-;17916:88;;17712:302;18081:2;18070:9;18066:18;18053:32;18112:18;18104:6;18101:30;18098:117;;;18134:79;;:::i;:::-;18098:117;18239:78;18309:7;18300:6;18289:9;18285:22;18239:78;:::i;:::-;18229:88;;18024:303;17440:894;;;;;:::o;18340:474::-;18408:6;18416;18465:2;18453:9;18444:7;18440:23;18436:32;18433:119;;;18471:79;;:::i;:::-;18433:119;18591:1;18616:53;18661:7;18652:6;18641:9;18637:22;18616:53;:::i;:::-;18606:63;;18562:117;18718:2;18744:53;18789:7;18780:6;18769:9;18765:22;18744:53;:::i;:::-;18734:63;;18689:118;18340:474;;;;;:::o;18820:::-;18888:6;18896;18945:2;18933:9;18924:7;18920:23;18916:32;18913:119;;;18951:79;;:::i;:::-;18913:119;19071:1;19096:53;19141:7;19132:6;19121:9;19117:22;19096:53;:::i;:::-;19086:63;;19042:117;19198:2;19224:53;19269:7;19260:6;19249:9;19245:22;19224:53;:::i;:::-;19214:63;;19169:118;18820:474;;;;;:::o;19300:539::-;19384:6;19433:2;19421:9;19412:7;19408:23;19404:32;19401:119;;;19439:79;;:::i;:::-;19401:119;19587:1;19576:9;19572:17;19559:31;19617:18;19609:6;19606:30;19603:117;;;19639:79;;:::i;:::-;19603:117;19744:78;19814:7;19805:6;19794:9;19790:22;19744:78;:::i;:::-;19734:88;;19530:302;19300:539;;;;:::o;19845:180::-;19893:77;19890:1;19883:88;19990:4;19987:1;19980:15;20014:4;20011:1;20004:15;20031:320;20075:6;20112:1;20106:4;20102:12;20092:22;;20159:1;20153:4;20149:12;20180:18;20170:81;;20236:4;20228:6;20224:17;20214:27;;20170:81;20298:2;20290:6;20287:14;20267:18;20264:38;20261:84;;20317:18;;:::i;:::-;20261:84;20082:269;20031:320;;;:::o;20357:220::-;20497:34;20493:1;20485:6;20481:14;20474:58;20566:3;20561:2;20553:6;20549:15;20542:28;20357:220;:::o;20583:366::-;20725:3;20746:67;20810:2;20805:3;20746:67;:::i;:::-;20739:74;;20822:93;20911:3;20822:93;:::i;:::-;20940:2;20935:3;20931:12;20924:19;;20583:366;;;:::o;20955:419::-;21121:4;21159:2;21148:9;21144:18;21136:26;;21208:9;21202:4;21198:20;21194:1;21183:9;21179:17;21172:47;21236:131;21362:4;21236:131;:::i;:::-;21228:139;;20955:419;;;:::o;21380:249::-;21520:34;21516:1;21508:6;21504:14;21497:58;21589:32;21584:2;21576:6;21572:15;21565:57;21380:249;:::o;21635:366::-;21777:3;21798:67;21862:2;21857:3;21798:67;:::i;:::-;21791:74;;21874:93;21963:3;21874:93;:::i;:::-;21992:2;21987:3;21983:12;21976:19;;21635:366;;;:::o;22007:419::-;22173:4;22211:2;22200:9;22196:18;22188:26;;22260:9;22254:4;22250:20;22246:1;22235:9;22231:17;22224:47;22288:131;22414:4;22288:131;:::i;:::-;22280:139;;22007:419;;;:::o;22432:233::-;22572:34;22568:1;22560:6;22556:14;22549:58;22641:16;22636:2;22628:6;22624:15;22617:41;22432:233;:::o;22671:366::-;22813:3;22834:67;22898:2;22893:3;22834:67;:::i;:::-;22827:74;;22910:93;22999:3;22910:93;:::i;:::-;23028:2;23023:3;23019:12;23012:19;;22671:366;;;:::o;23043:419::-;23209:4;23247:2;23236:9;23232:18;23224:26;;23296:9;23290:4;23286:20;23282:1;23271:9;23267:17;23260:47;23324:131;23450:4;23324:131;:::i;:::-;23316:139;;23043:419;;;:::o;23468:230::-;23608:34;23604:1;23596:6;23592:14;23585:58;23677:13;23672:2;23664:6;23660:15;23653:38;23468:230;:::o;23704:366::-;23846:3;23867:67;23931:2;23926:3;23867:67;:::i;:::-;23860:74;;23943:93;24032:3;23943:93;:::i;:::-;24061:2;24056:3;24052:12;24045:19;;23704:366;;;:::o;24076:419::-;24242:4;24280:2;24269:9;24265:18;24257:26;;24329:9;24323:4;24319:20;24315:1;24304:9;24300:17;24293:47;24357:131;24483:4;24357:131;:::i;:::-;24349:139;;24076:419;;;:::o;24501:180::-;24549:77;24546:1;24539:88;24646:4;24643:1;24636:15;24670:4;24667:1;24660:15;24687:180;24735:77;24732:1;24725:88;24832:4;24829:1;24822:15;24856:4;24853:1;24846:15;24873:233;24912:3;24935:24;24953:5;24935:24;:::i;:::-;24926:33;;24981:66;24974:5;24971:77;24968:103;;25051:18;;:::i;:::-;24968:103;25098:1;25091:5;25087:13;25080:20;;24873:233;;;:::o;25112:231::-;25252:34;25248:1;25240:6;25236:14;25229:58;25321:14;25316:2;25308:6;25304:15;25297:39;25112:231;:::o;25349:366::-;25491:3;25512:67;25576:2;25571:3;25512:67;:::i;:::-;25505:74;;25588:93;25677:3;25588:93;:::i;:::-;25706:2;25701:3;25697:12;25690:19;;25349:366;;;:::o;25721:419::-;25887:4;25925:2;25914:9;25910:18;25902:26;;25974:9;25968:4;25964:20;25960:1;25949:9;25945:17;25938:47;26002:131;26128:4;26002:131;:::i;:::-;25994:139;;25721:419;;;:::o;26146:174::-;26286:26;26282:1;26274:6;26270:14;26263:50;26146:174;:::o;26326:366::-;26468:3;26489:67;26553:2;26548:3;26489:67;:::i;:::-;26482:74;;26565:93;26654:3;26565:93;:::i;:::-;26683:2;26678:3;26674:12;26667:19;;26326:366;;;:::o;26698:419::-;26864:4;26902:2;26891:9;26887:18;26879:26;;26951:9;26945:4;26941:20;26937:1;26926:9;26922:17;26915:47;26979:131;27105:4;26979:131;:::i;:::-;26971:139;;26698:419;;;:::o;27123:228::-;27263:34;27259:1;27251:6;27247:14;27240:58;27332:11;27327:2;27319:6;27315:15;27308:36;27123:228;:::o;27357:366::-;27499:3;27520:67;27584:2;27579:3;27520:67;:::i;:::-;27513:74;;27596:93;27685:3;27596:93;:::i;:::-;27714:2;27709:3;27705:12;27698:19;;27357:366;;;:::o;27729:419::-;27895:4;27933:2;27922:9;27918:18;27910:26;;27982:9;27976:4;27972:20;27968:1;27957:9;27953:17;27946:47;28010:131;28136:4;28010:131;:::i;:::-;28002:139;;27729:419;;;:::o;28154:234::-;28294:34;28290:1;28282:6;28278:14;28271:58;28363:17;28358:2;28350:6;28346:15;28339:42;28154:234;:::o;28394:366::-;28536:3;28557:67;28621:2;28616:3;28557:67;:::i;:::-;28550:74;;28633:93;28722:3;28633:93;:::i;:::-;28751:2;28746:3;28742:12;28735:19;;28394:366;;;:::o;28766:419::-;28932:4;28970:2;28959:9;28955:18;28947:26;;29019:9;29013:4;29009:20;29005:1;28994:9;28990:17;28983:47;29047:131;29173:4;29047:131;:::i;:::-;29039:139;;28766:419;;;:::o;29191:148::-;29293:11;29330:3;29315:18;;29191:148;;;;:::o;29345:377::-;29451:3;29479:39;29512:5;29479:39;:::i;:::-;29534:89;29616:6;29611:3;29534:89;:::i;:::-;29527:96;;29632:52;29677:6;29672:3;29665:4;29658:5;29654:16;29632:52;:::i;:::-;29709:6;29704:3;29700:16;29693:23;;29455:267;29345:377;;;;:::o;29728:141::-;29777:4;29800:3;29792:11;;29823:3;29820:1;29813:14;29857:4;29854:1;29844:18;29836:26;;29728:141;;;:::o;29899:845::-;30002:3;30039:5;30033:12;30068:36;30094:9;30068:36;:::i;:::-;30120:89;30202:6;30197:3;30120:89;:::i;:::-;30113:96;;30240:1;30229:9;30225:17;30256:1;30251:137;;;;30402:1;30397:341;;;;30218:520;;30251:137;30335:4;30331:9;30320;30316:25;30311:3;30304:38;30371:6;30366:3;30362:16;30355:23;;30251:137;;30397:341;30464:38;30496:5;30464:38;:::i;:::-;30524:1;30538:154;30552:6;30549:1;30546:13;30538:154;;;30626:7;30620:14;30616:1;30611:3;30607:11;30600:35;30676:1;30667:7;30663:15;30652:26;;30574:4;30571:1;30567:12;30562:17;;30538:154;;;30721:6;30716:3;30712:16;30705:23;;30404:334;;30218:520;;30006:738;;29899:845;;;;:::o;30750:589::-;30975:3;30997:95;31088:3;31079:6;30997:95;:::i;:::-;30990:102;;31109:95;31200:3;31191:6;31109:95;:::i;:::-;31102:102;;31221:92;31309:3;31300:6;31221:92;:::i;:::-;31214:99;;31330:3;31323:10;;30750:589;;;;;;:::o;31345:156::-;31485:8;31481:1;31473:6;31469:14;31462:32;31345:156;:::o;31507:365::-;31649:3;31670:66;31734:1;31729:3;31670:66;:::i;:::-;31663:73;;31745:93;31834:3;31745:93;:::i;:::-;31863:2;31858:3;31854:12;31847:19;;31507:365;;;:::o;31878:419::-;32044:4;32082:2;32071:9;32067:18;32059:26;;32131:9;32125:4;32121:20;32117:1;32106:9;32102:17;32095:47;32159:131;32285:4;32159:131;:::i;:::-;32151:139;;31878:419;;;:::o;32303:174::-;32443:26;32439:1;32431:6;32427:14;32420:50;32303:174;:::o;32483:366::-;32625:3;32646:67;32710:2;32705:3;32646:67;:::i;:::-;32639:74;;32722:93;32811:3;32722:93;:::i;:::-;32840:2;32835:3;32831:12;32824:19;;32483:366;;;:::o;32855:419::-;33021:4;33059:2;33048:9;33044:18;33036:26;;33108:9;33102:4;33098:20;33094:1;33083:9;33079:17;33072:47;33136:131;33262:4;33136:131;:::i;:::-;33128:139;;32855:419;;;:::o;33280:305::-;33320:3;33339:20;33357:1;33339:20;:::i;:::-;33334:25;;33373:20;33391:1;33373:20;:::i;:::-;33368:25;;33527:1;33459:66;33455:74;33452:1;33449:81;33446:107;;;33533:18;;:::i;:::-;33446:107;33577:1;33574;33570:9;33563:16;;33280:305;;;;:::o;33591:179::-;33731:31;33727:1;33719:6;33715:14;33708:55;33591:179;:::o;33776:366::-;33918:3;33939:67;34003:2;33998:3;33939:67;:::i;:::-;33932:74;;34015:93;34104:3;34015:93;:::i;:::-;34133:2;34128:3;34124:12;34117:19;;33776:366;;;:::o;34148:419::-;34314:4;34352:2;34341:9;34337:18;34329:26;;34401:9;34395:4;34391:20;34387:1;34376:9;34372:17;34365:47;34429:131;34555:4;34429:131;:::i;:::-;34421:139;;34148:419;;;:::o;34573:169::-;34713:21;34709:1;34701:6;34697:14;34690:45;34573:169;:::o;34748:366::-;34890:3;34911:67;34975:2;34970:3;34911:67;:::i;:::-;34904:74;;34987:93;35076:3;34987:93;:::i;:::-;35105:2;35100:3;35096:12;35089:19;;34748:366;;;:::o;35120:419::-;35286:4;35324:2;35313:9;35309:18;35301:26;;35373:9;35367:4;35363:20;35359:1;35348:9;35344:17;35337:47;35401:131;35527:4;35401:131;:::i;:::-;35393:139;;35120:419;;;:::o;35545:173::-;35685:25;35681:1;35673:6;35669:14;35662:49;35545:173;:::o;35724:366::-;35866:3;35887:67;35951:2;35946:3;35887:67;:::i;:::-;35880:74;;35963:93;36052:3;35963:93;:::i;:::-;36081:2;36076:3;36072:12;36065:19;;35724:366;;;:::o;36096:419::-;36262:4;36300:2;36289:9;36285:18;36277:26;;36349:9;36343:4;36339:20;36335:1;36324:9;36320:17;36313:47;36377:131;36503:4;36377:131;:::i;:::-;36369:139;;36096:419;;;:::o;36521:348::-;36561:7;36584:20;36602:1;36584:20;:::i;:::-;36579:25;;36618:20;36636:1;36618:20;:::i;:::-;36613:25;;36806:1;36738:66;36734:74;36731:1;36728:81;36723:1;36716:9;36709:17;36705:105;36702:131;;;36813:18;;:::i;:::-;36702:131;36861:1;36858;36854:9;36843:20;;36521:348;;;;:::o;36875:168::-;37015:20;37011:1;37003:6;36999:14;36992:44;36875:168;:::o;37049:366::-;37191:3;37212:67;37276:2;37271:3;37212:67;:::i;:::-;37205:74;;37288:93;37377:3;37288:93;:::i;:::-;37406:2;37401:3;37397:12;37390:19;;37049:366;;;:::o;37421:419::-;37587:4;37625:2;37614:9;37610:18;37602:26;;37674:9;37668:4;37664:20;37660:1;37649:9;37645:17;37638:47;37702:131;37828:4;37702:131;:::i;:::-;37694:139;;37421:419;;;:::o;37846:180::-;37894:77;37891:1;37884:88;37991:4;37988:1;37981:15;38015:4;38012:1;38005:15;38032:185;38072:1;38089:20;38107:1;38089:20;:::i;:::-;38084:25;;38123:20;38141:1;38123:20;:::i;:::-;38118:25;;38162:1;38152:35;;38167:18;;:::i;:::-;38152:35;38209:1;38206;38202:9;38197:14;;38032:185;;;;:::o;38223:147::-;38324:11;38361:3;38346:18;;38223:147;;;;:::o;38376:114::-;;:::o;38496:398::-;38655:3;38676:83;38757:1;38752:3;38676:83;:::i;:::-;38669:90;;38768:93;38857:3;38768:93;:::i;:::-;38886:1;38881:3;38877:11;38870:18;;38496:398;;;:::o;38900:379::-;39084:3;39106:147;39249:3;39106:147;:::i;:::-;39099:154;;39270:3;39263:10;;38900:379;;;:::o;39285:169::-;39425:21;39421:1;39413:6;39409:14;39402:45;39285:169;:::o;39460:366::-;39602:3;39623:67;39687:2;39682:3;39623:67;:::i;:::-;39616:74;;39699:93;39788:3;39699:93;:::i;:::-;39817:2;39812:3;39808:12;39801:19;;39460:366;;;:::o;39832:419::-;39998:4;40036:2;40025:9;40021:18;40013:26;;40085:9;40079:4;40075:20;40071:1;40060:9;40056:17;40049:47;40113:131;40239:4;40113:131;:::i;:::-;40105:139;;39832:419;;;:::o;40257:166::-;40397:18;40393:1;40385:6;40381:14;40374:42;40257:166;:::o;40429:366::-;40571:3;40592:67;40656:2;40651:3;40592:67;:::i;:::-;40585:74;;40668:93;40757:3;40668:93;:::i;:::-;40786:2;40781:3;40777:12;40770:19;;40429:366;;;:::o;40801:419::-;40967:4;41005:2;40994:9;40990:18;40982:26;;41054:9;41048:4;41044:20;41040:1;41029:9;41025:17;41018:47;41082:131;41208:4;41082:131;:::i;:::-;41074:139;;40801:419;;;:::o;41226:168::-;41366:20;41362:1;41354:6;41350:14;41343:44;41226:168;:::o;41400:366::-;41542:3;41563:67;41627:2;41622:3;41563:67;:::i;:::-;41556:74;;41639:93;41728:3;41639:93;:::i;:::-;41757:2;41752:3;41748:12;41741:19;;41400:366;;;:::o;41772:419::-;41938:4;41976:2;41965:9;41961:18;41953:26;;42025:9;42019:4;42015:20;42011:1;42000:9;41996:17;41989:47;42053:131;42179:4;42053:131;:::i;:::-;42045:139;;41772:419;;;:::o;42197:169::-;42337:21;42333:1;42325:6;42321:14;42314:45;42197:169;:::o;42372:366::-;42514:3;42535:67;42599:2;42594:3;42535:67;:::i;:::-;42528:74;;42611:93;42700:3;42611:93;:::i;:::-;42729:2;42724:3;42720:12;42713:19;;42372:366;;;:::o;42744:419::-;42910:4;42948:2;42937:9;42933:18;42925:26;;42997:9;42991:4;42987:20;42983:1;42972:9;42968:17;42961:47;43025:131;43151:4;43025:131;:::i;:::-;43017:139;;42744:419;;;:::o;43169:225::-;43309:34;43305:1;43297:6;43293:14;43286:58;43378:8;43373:2;43365:6;43361:15;43354:33;43169:225;:::o;43400:366::-;43542:3;43563:67;43627:2;43622:3;43563:67;:::i;:::-;43556:74;;43639:93;43728:3;43639:93;:::i;:::-;43757:2;43752:3;43748:12;43741:19;;43400:366;;;:::o;43772:419::-;43938:4;43976:2;43965:9;43961:18;43953:26;;44025:9;44019:4;44015:20;44011:1;44000:9;43996:17;43989:47;44053:131;44179:4;44053:131;:::i;:::-;44045:139;;43772:419;;;:::o;44197:182::-;44337:34;44333:1;44325:6;44321:14;44314:58;44197:182;:::o;44385:366::-;44527:3;44548:67;44612:2;44607:3;44548:67;:::i;:::-;44541:74;;44624:93;44713:3;44624:93;:::i;:::-;44742:2;44737:3;44733:12;44726:19;;44385:366;;;:::o;44757:419::-;44923:4;44961:2;44950:9;44946:18;44938:26;;45010:9;45004:4;45000:20;44996:1;44985:9;44981:17;44974:47;45038:131;45164:4;45038:131;:::i;:::-;45030:139;;44757:419;;;:::o;45182:224::-;45322:34;45318:1;45310:6;45306:14;45299:58;45391:7;45386:2;45378:6;45374:15;45367:32;45182:224;:::o;45412:366::-;45554:3;45575:67;45639:2;45634:3;45575:67;:::i;:::-;45568:74;;45651:93;45740:3;45651:93;:::i;:::-;45769:2;45764:3;45760:12;45753:19;;45412:366;;;:::o;45784:419::-;45950:4;45988:2;45977:9;45973:18;45965:26;;46037:9;46031:4;46027:20;46023:1;46012:9;46008:17;46001:47;46065:131;46191:4;46065:131;:::i;:::-;46057:139;;45784:419;;;:::o;46209:223::-;46349:34;46345:1;46337:6;46333:14;46326:58;46418:6;46413:2;46405:6;46401:15;46394:31;46209:223;:::o;46438:366::-;46580:3;46601:67;46665:2;46660:3;46601:67;:::i;:::-;46594:74;;46677:93;46766:3;46677:93;:::i;:::-;46795:2;46790:3;46786:12;46779:19;;46438:366;;;:::o;46810:419::-;46976:4;47014:2;47003:9;46999:18;46991:26;;47063:9;47057:4;47053:20;47049:1;47038:9;47034:17;47027:47;47091:131;47217:4;47091:131;:::i;:::-;47083:139;;46810:419;;;:::o;47235:191::-;47275:4;47295:20;47313:1;47295:20;:::i;:::-;47290:25;;47329:20;47347:1;47329:20;:::i;:::-;47324:25;;47368:1;47365;47362:8;47359:34;;;47373:18;;:::i;:::-;47359:34;47418:1;47415;47411:9;47403:17;;47235:191;;;;:::o;47432:175::-;47572:27;47568:1;47560:6;47556:14;47549:51;47432:175;:::o;47613:366::-;47755:3;47776:67;47840:2;47835:3;47776:67;:::i;:::-;47769:74;;47852:93;47941:3;47852:93;:::i;:::-;47970:2;47965:3;47961:12;47954:19;;47613:366;;;:::o;47985:419::-;48151:4;48189:2;48178:9;48174:18;48166:26;;48238:9;48232:4;48228:20;48224:1;48213:9;48209:17;48202:47;48266:131;48392:4;48266:131;:::i;:::-;48258:139;;47985:419;;;:::o;48410:237::-;48550:34;48546:1;48538:6;48534:14;48527:58;48619:20;48614:2;48606:6;48602:15;48595:45;48410:237;:::o;48653:366::-;48795:3;48816:67;48880:2;48875:3;48816:67;:::i;:::-;48809:74;;48892:93;48981:3;48892:93;:::i;:::-;49010:2;49005:3;49001:12;48994:19;;48653:366;;;:::o;49025:419::-;49191:4;49229:2;49218:9;49214:18;49206:26;;49278:9;49272:4;49268:20;49264:1;49253:9;49249:17;49242:47;49306:131;49432:4;49306:131;:::i;:::-;49298:139;;49025:419;;;:::o;49450:176::-;49482:1;49499:20;49517:1;49499:20;:::i;:::-;49494:25;;49533:20;49551:1;49533:20;:::i;:::-;49528:25;;49572:1;49562:35;;49577:18;;:::i;:::-;49562:35;49618:1;49615;49611:9;49606:14;;49450:176;;;;:::o;49632:94::-;49665:8;49713:5;49709:2;49705:14;49684:35;;49632:94;;;:::o;49732:::-;49771:7;49800:20;49814:5;49800:20;:::i;:::-;49789:31;;49732:94;;;:::o;49832:100::-;49871:7;49900:26;49920:5;49900:26;:::i;:::-;49889:37;;49832:100;;;:::o;49938:157::-;50043:45;50063:24;50081:5;50063:24;:::i;:::-;50043:45;:::i;:::-;50038:3;50031:58;49938:157;;:::o;50101:79::-;50140:7;50169:5;50158:16;;50101:79;;;:::o;50186:157::-;50291:45;50311:24;50329:5;50311:24;:::i;:::-;50291:45;:::i;:::-;50286:3;50279:58;50186:157;;:::o;50349:679::-;50545:3;50560:75;50631:3;50622:6;50560:75;:::i;:::-;50660:2;50655:3;50651:12;50644:19;;50673:75;50744:3;50735:6;50673:75;:::i;:::-;50773:2;50768:3;50764:12;50757:19;;50786:75;50857:3;50848:6;50786:75;:::i;:::-;50886:2;50881:3;50877:12;50870:19;;50899:75;50970:3;50961:6;50899:75;:::i;:::-;50999:2;50994:3;50990:12;50983:19;;51019:3;51012:10;;50349:679;;;;;;;:::o;51034:442::-;51183:4;51221:2;51210:9;51206:18;51198:26;;51234:71;51302:1;51291:9;51287:17;51278:6;51234:71;:::i;:::-;51315:72;51383:2;51372:9;51368:18;51359:6;51315:72;:::i;:::-;51397;51465:2;51454:9;51450:18;51441:6;51397:72;:::i;:::-;51034:442;;;;;;:::o;51482:137::-;51536:5;51567:6;51561:13;51552:22;;51583:30;51607:5;51583:30;:::i;:::-;51482:137;;;;:::o;51625:345::-;51692:6;51741:2;51729:9;51720:7;51716:23;51712:32;51709:119;;;51747:79;;:::i;:::-;51709:119;51867:1;51892:61;51945:7;51936:6;51925:9;51921:22;51892:61;:::i;:::-;51882:71;;51838:125;51625:345;;;;:::o;51976:98::-;52027:6;52061:5;52055:12;52045:22;;51976:98;;;:::o;52080:168::-;52163:11;52197:6;52192:3;52185:19;52237:4;52232:3;52228:14;52213:29;;52080:168;;;;:::o;52254:360::-;52340:3;52368:38;52400:5;52368:38;:::i;:::-;52422:70;52485:6;52480:3;52422:70;:::i;:::-;52415:77;;52501:52;52546:6;52541:3;52534:4;52527:5;52523:16;52501:52;:::i;:::-;52578:29;52600:6;52578:29;:::i;:::-;52573:3;52569:39;52562:46;;52344:270;52254:360;;;;:::o;52620:640::-;52815:4;52853:3;52842:9;52838:19;52830:27;;52867:71;52935:1;52924:9;52920:17;52911:6;52867:71;:::i;:::-;52948:72;53016:2;53005:9;53001:18;52992:6;52948:72;:::i;:::-;53030;53098:2;53087:9;53083:18;53074:6;53030:72;:::i;:::-;53149:9;53143:4;53139:20;53134:2;53123:9;53119:18;53112:48;53177:76;53248:4;53239:6;53177:76;:::i;:::-;53169:84;;52620:640;;;;;;;:::o;53266:141::-;53322:5;53353:6;53347:13;53338:22;;53369:32;53395:5;53369:32;:::i;:::-;53266:141;;;;:::o;53413:349::-;53482:6;53531:2;53519:9;53510:7;53506:23;53502:32;53499:119;;;53537:79;;:::i;:::-;53499:119;53657:1;53682:63;53737:7;53728:6;53717:9;53713:22;53682:63;:::i;:::-;53672:73;;53628:127;53413:349;;;;:::o;53768:180::-;53816:77;53813:1;53806:88;53913:4;53910:1;53903:15;53937:4;53934:1;53927:15;53954:182;54094:34;54090:1;54082:6;54078:14;54071:58;53954:182;:::o;54142:366::-;54284:3;54305:67;54369:2;54364:3;54305:67;:::i;:::-;54298:74;;54381:93;54470:3;54381:93;:::i;:::-;54499:2;54494:3;54490:12;54483:19;;54142:366;;;:::o;54514:419::-;54680:4;54718:2;54707:9;54703:18;54695:26;;54767:9;54761:4;54757:20;54753:1;54742:9;54738:17;54731:47;54795:131;54921:4;54795:131;:::i;:::-;54787:139;;54514:419;;;:::o;54939:178::-;55079:30;55075:1;55067:6;55063:14;55056:54;54939:178;:::o;55123:366::-;55265:3;55286:67;55350:2;55345:3;55286:67;:::i;:::-;55279:74;;55362:93;55451:3;55362:93;:::i;:::-;55480:2;55475:3;55471:12;55464:19;;55123:366;;;:::o;55495:419::-;55661:4;55699:2;55688:9;55684:18;55676:26;;55748:9;55742:4;55738:20;55734:1;55723:9;55719:17;55712:47;55776:131;55902:4;55776:131;:::i;:::-;55768:139;;55495:419;;;:::o

Swarm Source

ipfs://4b26face1ecc145d159ee04d9806ae56fc6bddf5786c5aeb4aafd7bb12dfeb4c
Loading