ETH Price: $3,113.97 (+0.51%)
Gas: 4 Gwei

Token

MoonHunters.xyz (MoonHunters)
 

Overview

Max Total Supply

641 MoonHunters

Holders

636

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 MoonHunters
0xec12e0c8cab703aac87e587b7b627af02b219025
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MoonHunters

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/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/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: nft_contract.sol

pragma solidity >=0.7.0 <0.9.0;

contract MoonHunters is ERC721, Ownable {
  using Strings for uint256;
  using Counters for Counters.Counter;

  Counters.Counter private supply;

  string public uriPrefix = "ipfs://QmVNJzBMQFLQe8CFpvQeJNTQZH3n6sxsUcedqApR67qUa8/";
  string public uriSuffix = ".json";

  uint256 public maxSupply = 10000;
  uint256 public freeLimit = 1000;
  uint256 public publicSupply = 9000;
  uint256 public cost = 0.0069 ether;

  uint256 public freePerTransaction = 1;
  uint256 public freePerWallet = 1;
  uint256 public paidPerTransaction = 5;
  uint256 public paidPerWallet = 12;

  constructor() ERC721("MoonHunters.xyz", "MoonHunters") {
  }

  modifier mintCompliance(uint256 _mintAmount) {

    uint256 totSupply = supply.current();
    
    require(_mintAmount > 0 && _mintAmount <= paidPerTransaction, "Invalid mint amount!");
    require(totSupply + _mintAmount <= maxSupply, "Max supply exceeded!");

    if (msg.sender != owner()) {
        if (freeLimit > totSupply) {
            require(balanceOf(msg.sender) < freePerWallet, "Each address may only mint one free nft");
            require(_mintAmount <= freePerTransaction, "Each address may only mint one free nft");
        }

        if (totSupply >= freeLimit) {
            require(balanceOf(msg.sender) + _mintAmount <= paidPerWallet, "Each address may only mint 11 paid nft");
            require(_mintAmount <= paidPerTransaction, "Max 5 nft per transaction are allowed");
            uint256 requiredAmount = cost * _mintAmount;
            if (_mintAmount == 5) {
                requiredAmount = cost * 4;
            }

            require(msg.value >= requiredAmount, "You need to pay 0.0069 ETH per nft");
        }
    }

    uint256 newSupply = totSupply + _mintAmount;
    if (newSupply > publicSupply) {
      require(msg.sender == owner(), "Only owner can mint owner supplies");
    }
    _;
  }

  function totalSupply() public view returns (uint256) {
    return supply.current();
  }

  function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
    _mintLoop(msg.sender, _mintAmount);
  }

  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

  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(), uriSuffix))
        : "";
  }

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

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

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setMaxMintAmountPerWallet(uint256 _maxMintAmountPerWallet) public onlyOwner {
    paidPerWallet = _maxMintAmountPerWallet;
  }

  function withdraw() public onlyOwner {
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
  }

  function _mintLoop(address _receiver, uint256 _mintAmount) internal {
    for (uint256 i = 0; i < _mintAmount; i++) {
      supply.increment();
      _safeMint(_receiver, supply.current());
    }
  }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freePerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freePerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paidPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paidPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerWallet","type":"uint256"}],"name":"setMaxMintAmountPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052604051806060016040528060368152602001620044fc60369139600890816200002e9190620004b5565b506040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060099081620000759190620004b5565b50612710600a556103e8600b55612328600c556618838370f34000600d556001600e556001600f556005601055600c601155348015620000b457600080fd5b506040518060400160405280600f81526020017f4d6f6f6e48756e746572732e78797a00000000000000000000000000000000008152506040518060400160405280600b81526020017f4d6f6f6e48756e746572730000000000000000000000000000000000000000008152508160009081620001329190620004b5565b508060019081620001449190620004b5565b505050620001676200015b6200016d60201b60201c565b6200017560201b60201c565b6200059c565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002bd57607f821691505b602082108103620002d357620002d262000275565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200033d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002fe565b620003498683620002fe565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000396620003906200038a8462000361565b6200036b565b62000361565b9050919050565b6000819050919050565b620003b28362000375565b620003ca620003c1826200039d565b8484546200030b565b825550505050565b600090565b620003e1620003d2565b620003ee818484620003a7565b505050565b5b8181101562000416576200040a600082620003d7565b600181019050620003f4565b5050565b601f82111562000465576200042f81620002d9565b6200043a84620002ee565b810160208510156200044a578190505b620004626200045985620002ee565b830182620003f3565b50505b505050565b600082821c905092915050565b60006200048a600019846008026200046a565b1980831691505092915050565b6000620004a5838362000477565b9150826002028217905092915050565b620004c0826200023b565b67ffffffffffffffff811115620004dc57620004db62000246565b5b620004e88254620002a4565b620004f58282856200041a565b600060209050601f8311600181146200052d576000841562000518578287015190505b62000524858262000497565b86555062000594565b601f1984166200053d86620002d9565b60005b82811015620005675784890151825560018201915060208501945060208101905062000540565b8683101562000587578489015162000583601f89168262000477565b8355505b6001600288020188555050505b505050505050565b613f5080620005ac6000396000f3fe6080604052600436106101f95760003560e01c8063607f8b0e1161010d57806395d89b41116100a0578063c87b56dd1161006f578063c87b56dd146106ee578063d248c85c1461072b578063d5abeb0114610756578063e985e9c514610781578063f2fde38b146107be576101f9565b806395d89b4114610655578063a0712d6814610680578063a22cb4651461069c578063b88d4fde146106c5576101f9565b8063715018a6116100dc578063715018a6146105c1578063766b7d09146105d85780637ec4a659146106015780638da5cb5b1461062a576101f9565b8063607f8b0e146104f157806362b99ad41461051c5780636352211e1461054757806370a0823114610584576101f9565b80633ccfd60b11610190578063438b63001161015f578063438b63001461040a57806344a0d68a146104475780635503a0e8146104705780635b74efcf1461049b5780635e84d723146104c6576101f9565b80633ccfd60b1461037657806342842e0e1461038d57806342953560146103b657806342966c68146103e1576101f9565b806313faede6116101cc57806313faede6146102cc57806318160ddd146102f757806323b872dd14610322578063269bbebd1461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b50610225600480360381019061022091906125f7565b6107e7565b604051610232919061263f565b60405180910390f35b34801561024757600080fd5b506102506108c9565b60405161025d91906126f3565b60405180910390f35b34801561027257600080fd5b5061028d6004803603810190610288919061274b565b61095b565b60405161029a91906127b9565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190612800565b6109a1565b005b3480156102d857600080fd5b506102e1610ab8565b6040516102ee919061284f565b60405180910390f35b34801561030357600080fd5b5061030c610abe565b604051610319919061284f565b60405180910390f35b34801561032e57600080fd5b506103496004803603810190610344919061286a565b610acf565b005b34801561035757600080fd5b50610360610b2f565b60405161036d919061284f565b60405180910390f35b34801561038257600080fd5b5061038b610b35565b005b34801561039957600080fd5b506103b460048036038101906103af919061286a565b610bbd565b005b3480156103c257600080fd5b506103cb610bdd565b6040516103d8919061284f565b60405180910390f35b3480156103ed57600080fd5b506104086004803603810190610403919061274b565b610be3565b005b34801561041657600080fd5b50610431600480360381019061042c91906128bd565b610bf7565b60405161043e91906129a8565b60405180910390f35b34801561045357600080fd5b5061046e6004803603810190610469919061274b565b610d01565b005b34801561047c57600080fd5b50610485610d13565b60405161049291906126f3565b60405180910390f35b3480156104a757600080fd5b506104b0610da1565b6040516104bd919061284f565b60405180910390f35b3480156104d257600080fd5b506104db610da7565b6040516104e8919061284f565b60405180910390f35b3480156104fd57600080fd5b50610506610dad565b604051610513919061284f565b60405180910390f35b34801561052857600080fd5b50610531610db3565b60405161053e91906126f3565b60405180910390f35b34801561055357600080fd5b5061056e6004803603810190610569919061274b565b610e41565b60405161057b91906127b9565b60405180910390f35b34801561059057600080fd5b506105ab60048036038101906105a691906128bd565b610ef2565b6040516105b8919061284f565b60405180910390f35b3480156105cd57600080fd5b506105d6610fa9565b005b3480156105e457600080fd5b506105ff60048036038101906105fa919061274b565b610fbd565b005b34801561060d57600080fd5b5061062860048036038101906106239190612aff565b610fcf565b005b34801561063657600080fd5b5061063f610fea565b60405161064c91906127b9565b60405180910390f35b34801561066157600080fd5b5061066a611014565b60405161067791906126f3565b60405180910390f35b61069a6004803603810190610695919061274b565b6110a6565b005b3480156106a857600080fd5b506106c360048036038101906106be9190612b74565b6113e4565b005b3480156106d157600080fd5b506106ec60048036038101906106e79190612c55565b6113fa565b005b3480156106fa57600080fd5b506107156004803603810190610710919061274b565b61145c565b60405161072291906126f3565b60405180910390f35b34801561073757600080fd5b50610740611506565b60405161074d919061284f565b60405180910390f35b34801561076257600080fd5b5061076b61150c565b604051610778919061284f565b60405180910390f35b34801561078d57600080fd5b506107a860048036038101906107a39190612cd8565b611512565b6040516107b5919061263f565b60405180910390f35b3480156107ca57600080fd5b506107e560048036038101906107e091906128bd565b6115a6565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108b257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108c257506108c182611629565b5b9050919050565b6060600080546108d890612d47565b80601f016020809104026020016040519081016040528092919081815260200182805461090490612d47565b80156109515780601f1061092657610100808354040283529160200191610951565b820191906000526020600020905b81548152906001019060200180831161093457829003601f168201915b5050505050905090565b600061096682611693565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109ac82610e41565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1390612dea565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a3b6116de565b73ffffffffffffffffffffffffffffffffffffffff161480610a6a5750610a6981610a646116de565b611512565b5b610aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa090612e7c565b60405180910390fd5b610ab383836116e6565b505050565b600d5481565b6000610aca600761179f565b905090565b610ae0610ada6116de565b826117ad565b610b1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1690612f0e565b60405180910390fd5b610b2a838383611842565b505050565b600b5481565b610b3d611aa8565b6000610b47610fea565b73ffffffffffffffffffffffffffffffffffffffff1647604051610b6a90612f5f565b60006040518083038185875af1925050503d8060008114610ba7576040519150601f19603f3d011682016040523d82523d6000602084013e610bac565b606091505b5050905080610bba57600080fd5b50565b610bd8838383604051806020016040528060008152506113fa565b505050565b60105481565b610beb611aa8565b610bf481611b26565b50565b60606000610c0483610ef2565b905060008167ffffffffffffffff811115610c2257610c216129d4565b5b604051908082528060200260200182016040528015610c505781602001602082028036833780820191505090505b50905060006001905060005b8381108015610c6d5750600a548211155b15610cf5576000610c7d83610e41565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ce15782848381518110610cc657610cc5612f74565b5b6020026020010181815250508180610cdd90612fd2565b9250505b8280610cec90612fd2565b93505050610c5c565b82945050505050919050565b610d09611aa8565b80600d8190555050565b60098054610d2090612d47565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4c90612d47565b8015610d995780601f10610d6e57610100808354040283529160200191610d99565b820191906000526020600020905b815481529060010190602001808311610d7c57829003601f168201915b505050505081565b600f5481565b600c5481565b60115481565b60088054610dc090612d47565b80601f0160208091040260200160405190810160405280929190818152602001828054610dec90612d47565b8015610e395780601f10610e0e57610100808354040283529160200191610e39565b820191906000526020600020905b815481529060010190602001808311610e1c57829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee090613066565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f59906130f8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fb1611aa8565b610fbb6000611c43565b565b610fc5611aa8565b8060118190555050565b610fd7611aa8565b8060089081610fe691906132c4565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461102390612d47565b80601f016020809104026020016040519081016040528092919081815260200182805461104f90612d47565b801561109c5780601f106110715761010080835404028352916020019161109c565b820191906000526020600020905b81548152906001019060200180831161107f57829003601f168201915b5050505050905090565b8060006110b3600761179f565b90506000821180156110c757506010548211155b611106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fd906133e2565b60405180910390fd5b600a5482826111159190613402565b1115611156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114d906134a4565b60405180910390fd5b61115e610fea565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113445780600b54111561122c57600f546111a633610ef2565b106111e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dd90613536565b60405180910390fd5b600e5482111561122b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122290613536565b60405180910390fd5b5b600b548110611343576011548261124233610ef2565b61124c9190613402565b111561128d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611284906135c8565b60405180910390fd5b6010548211156112d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c99061365a565b60405180910390fd5b600082600d546112e2919061367a565b9050600583036112fe576004600d546112fb919061367a565b90505b80341015611341576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133890613746565b60405180910390fd5b505b5b600082826113529190613402565b9050600c548111156113d457611366610fea565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ca906137d8565b60405180910390fd5b5b6113de3385611d09565b50505050565b6113f66113ef6116de565b8383611d49565b5050565b61140b6114056116de565b836117ad565b61144a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144190612f0e565b60405180910390fd5b61145684848484611eb5565b50505050565b606061146782611f11565b6114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149d9061386a565b60405180910390fd5b60006114b0611f7d565b905060008151116114d057604051806020016040528060008152506114fe565b806114da8461200f565b60096040516020016114ee93929190613949565b6040516020818303038152906040525b915050919050565b600e5481565b600a5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115ae611aa8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361161d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611614906139ec565b60405180910390fd5b61162681611c43565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61169c81611f11565b6116db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d290613066565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661175983610e41565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000806117b983610e41565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806117fb57506117fa8185611512565b5b8061183957508373ffffffffffffffffffffffffffffffffffffffff166118218461095b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661186282610e41565b73ffffffffffffffffffffffffffffffffffffffff16146118b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118af90613a7e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191e90613b10565b60405180910390fd5b61193283838361216f565b61193d6000826116e6565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461198d9190613b30565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119e49190613402565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611aa3838383612174565b505050565b611ab06116de565b73ffffffffffffffffffffffffffffffffffffffff16611ace610fea565b73ffffffffffffffffffffffffffffffffffffffff1614611b24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1b90613bb0565b60405180910390fd5b565b6000611b3182610e41565b9050611b3f8160008461216f565b611b4a6000836116e6565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b9a9190613b30565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c3f81600084612174565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b81811015611d4457611d1e6007612179565b611d3183611d2c600761179f565b61218f565b8080611d3c90612fd2565b915050611d0c565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dae90613c1c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ea8919061263f565b60405180910390a3505050565b611ec0848484611842565b611ecc848484846121ad565b611f0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0290613cae565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060088054611f8c90612d47565b80601f0160208091040260200160405190810160405280929190818152602001828054611fb890612d47565b80156120055780601f10611fda57610100808354040283529160200191612005565b820191906000526020600020905b815481529060010190602001808311611fe857829003601f168201915b5050505050905090565b606060008203612056576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061216a565b600082905060005b6000821461208857808061207190612fd2565b915050600a826120819190613cfd565b915061205e565b60008167ffffffffffffffff8111156120a4576120a36129d4565b5b6040519080825280601f01601f1916602001820160405280156120d65781602001600182028036833780820191505090505b5090505b60008514612163576001826120ef9190613b30565b9150600a856120fe9190613d2e565b603061210a9190613402565b60f81b8183815181106121205761211f612f74565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561215c9190613cfd565b94506120da565b8093505050505b919050565b505050565b505050565b6001816000016000828254019250508190555050565b6121a9828260405180602001604052806000815250612334565b5050565b60006121ce8473ffffffffffffffffffffffffffffffffffffffff1661238f565b15612327578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121f76116de565b8786866040518563ffffffff1660e01b81526004016122199493929190613db4565b6020604051808303816000875af192505050801561225557506040513d601f19601f820116820180604052508101906122529190613e15565b60015b6122d7573d8060008114612285576040519150601f19603f3d011682016040523d82523d6000602084013e61228a565b606091505b5060008151036122cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c690613cae565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061232c565b600190505b949350505050565b61233e83836123b2565b61234b60008484846121ad565b61238a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238190613cae565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241890613e8e565b60405180910390fd5b61242a81611f11565b1561246a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246190613efa565b60405180910390fd5b6124766000838361216f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124c69190613402565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461258760008383612174565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6125d48161259f565b81146125df57600080fd5b50565b6000813590506125f1816125cb565b92915050565b60006020828403121561260d5761260c612595565b5b600061261b848285016125e2565b91505092915050565b60008115159050919050565b61263981612624565b82525050565b60006020820190506126546000830184612630565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612694578082015181840152602081019050612679565b838111156126a3576000848401525b50505050565b6000601f19601f8301169050919050565b60006126c58261265a565b6126cf8185612665565b93506126df818560208601612676565b6126e8816126a9565b840191505092915050565b6000602082019050818103600083015261270d81846126ba565b905092915050565b6000819050919050565b61272881612715565b811461273357600080fd5b50565b6000813590506127458161271f565b92915050565b60006020828403121561276157612760612595565b5b600061276f84828501612736565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127a382612778565b9050919050565b6127b381612798565b82525050565b60006020820190506127ce60008301846127aa565b92915050565b6127dd81612798565b81146127e857600080fd5b50565b6000813590506127fa816127d4565b92915050565b6000806040838503121561281757612816612595565b5b6000612825858286016127eb565b925050602061283685828601612736565b9150509250929050565b61284981612715565b82525050565b60006020820190506128646000830184612840565b92915050565b60008060006060848603121561288357612882612595565b5b6000612891868287016127eb565b93505060206128a2868287016127eb565b92505060406128b386828701612736565b9150509250925092565b6000602082840312156128d3576128d2612595565b5b60006128e1848285016127eb565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61291f81612715565b82525050565b60006129318383612916565b60208301905092915050565b6000602082019050919050565b6000612955826128ea565b61295f81856128f5565b935061296a83612906565b8060005b8381101561299b5781516129828882612925565b975061298d8361293d565b92505060018101905061296e565b5085935050505092915050565b600060208201905081810360008301526129c2818461294a565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a0c826126a9565b810181811067ffffffffffffffff82111715612a2b57612a2a6129d4565b5b80604052505050565b6000612a3e61258b565b9050612a4a8282612a03565b919050565b600067ffffffffffffffff821115612a6a57612a696129d4565b5b612a73826126a9565b9050602081019050919050565b82818337600083830152505050565b6000612aa2612a9d84612a4f565b612a34565b905082815260208101848484011115612abe57612abd6129cf565b5b612ac9848285612a80565b509392505050565b600082601f830112612ae657612ae56129ca565b5b8135612af6848260208601612a8f565b91505092915050565b600060208284031215612b1557612b14612595565b5b600082013567ffffffffffffffff811115612b3357612b3261259a565b5b612b3f84828501612ad1565b91505092915050565b612b5181612624565b8114612b5c57600080fd5b50565b600081359050612b6e81612b48565b92915050565b60008060408385031215612b8b57612b8a612595565b5b6000612b99858286016127eb565b9250506020612baa85828601612b5f565b9150509250929050565b600067ffffffffffffffff821115612bcf57612bce6129d4565b5b612bd8826126a9565b9050602081019050919050565b6000612bf8612bf384612bb4565b612a34565b905082815260208101848484011115612c1457612c136129cf565b5b612c1f848285612a80565b509392505050565b600082601f830112612c3c57612c3b6129ca565b5b8135612c4c848260208601612be5565b91505092915050565b60008060008060808587031215612c6f57612c6e612595565b5b6000612c7d878288016127eb565b9450506020612c8e878288016127eb565b9350506040612c9f87828801612736565b925050606085013567ffffffffffffffff811115612cc057612cbf61259a565b5b612ccc87828801612c27565b91505092959194509250565b60008060408385031215612cef57612cee612595565b5b6000612cfd858286016127eb565b9250506020612d0e858286016127eb565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612d5f57607f821691505b602082108103612d7257612d71612d18565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612dd4602183612665565b9150612ddf82612d78565b604082019050919050565b60006020820190508181036000830152612e0381612dc7565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000612e66603e83612665565b9150612e7182612e0a565b604082019050919050565b60006020820190508181036000830152612e9581612e59565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000612ef8602e83612665565b9150612f0382612e9c565b604082019050919050565b60006020820190508181036000830152612f2781612eeb565b9050919050565b600081905092915050565b50565b6000612f49600083612f2e565b9150612f5482612f39565b600082019050919050565b6000612f6a82612f3c565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612fdd82612715565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361300f5761300e612fa3565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613050601883612665565b915061305b8261301a565b602082019050919050565b6000602082019050818103600083015261307f81613043565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006130e2602983612665565b91506130ed82613086565b604082019050919050565b60006020820190508181036000830152613111816130d5565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261317a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261313d565b613184868361313d565b95508019841693508086168417925050509392505050565b6000819050919050565b60006131c16131bc6131b784612715565b61319c565b612715565b9050919050565b6000819050919050565b6131db836131a6565b6131ef6131e7826131c8565b84845461314a565b825550505050565b600090565b6132046131f7565b61320f8184846131d2565b505050565b5b81811015613233576132286000826131fc565b600181019050613215565b5050565b601f8211156132785761324981613118565b6132528461312d565b81016020851015613261578190505b61327561326d8561312d565b830182613214565b50505b505050565b600082821c905092915050565b600061329b6000198460080261327d565b1980831691505092915050565b60006132b4838361328a565b9150826002028217905092915050565b6132cd8261265a565b67ffffffffffffffff8111156132e6576132e56129d4565b5b6132f08254612d47565b6132fb828285613237565b600060209050601f83116001811461332e576000841561331c578287015190505b61332685826132a8565b86555061338e565b601f19841661333c86613118565b60005b828110156133645784890151825560018201915060208501945060208101905061333f565b86831015613381578489015161337d601f89168261328a565b8355505b6001600288020188555050505b505050505050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b60006133cc601483612665565b91506133d782613396565b602082019050919050565b600060208201905081810360008301526133fb816133bf565b9050919050565b600061340d82612715565b915061341883612715565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561344d5761344c612fa3565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b600061348e601483612665565b915061349982613458565b602082019050919050565b600060208201905081810360008301526134bd81613481565b9050919050565b7f456163682061646472657373206d6179206f6e6c79206d696e74206f6e65206660008201527f726565206e667400000000000000000000000000000000000000000000000000602082015250565b6000613520602783612665565b915061352b826134c4565b604082019050919050565b6000602082019050818103600083015261354f81613513565b9050919050565b7f456163682061646472657373206d6179206f6e6c79206d696e7420313120706160008201527f6964206e66740000000000000000000000000000000000000000000000000000602082015250565b60006135b2602683612665565b91506135bd82613556565b604082019050919050565b600060208201905081810360008301526135e1816135a5565b9050919050565b7f4d61782035206e667420706572207472616e73616374696f6e2061726520616c60008201527f6c6f776564000000000000000000000000000000000000000000000000000000602082015250565b6000613644602583612665565b915061364f826135e8565b604082019050919050565b6000602082019050818103600083015261367381613637565b9050919050565b600061368582612715565b915061369083612715565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156136c9576136c8612fa3565b5b828202905092915050565b7f596f75206e65656420746f2070617920302e303036392045544820706572206e60008201527f6674000000000000000000000000000000000000000000000000000000000000602082015250565b6000613730602283612665565b915061373b826136d4565b604082019050919050565b6000602082019050818103600083015261375f81613723565b9050919050565b7f4f6e6c79206f776e65722063616e206d696e74206f776e657220737570706c6960008201527f6573000000000000000000000000000000000000000000000000000000000000602082015250565b60006137c2602283612665565b91506137cd82613766565b604082019050919050565b600060208201905081810360008301526137f1816137b5565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613854602f83612665565b915061385f826137f8565b604082019050919050565b6000602082019050818103600083015261388381613847565b9050919050565b600081905092915050565b60006138a08261265a565b6138aa818561388a565b93506138ba818560208601612676565b80840191505092915050565b600081546138d381612d47565b6138dd818661388a565b945060018216600081146138f8576001811461390d57613940565b60ff1983168652811515820286019350613940565b61391685613118565b60005b8381101561393857815481890152600182019150602081019050613919565b838801955050505b50505092915050565b60006139558286613895565b91506139618285613895565b915061396d82846138c6565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006139d6602683612665565b91506139e18261397a565b604082019050919050565b60006020820190508181036000830152613a05816139c9565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613a68602583612665565b9150613a7382613a0c565b604082019050919050565b60006020820190508181036000830152613a9781613a5b565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613afa602483612665565b9150613b0582613a9e565b604082019050919050565b60006020820190508181036000830152613b2981613aed565b9050919050565b6000613b3b82612715565b9150613b4683612715565b925082821015613b5957613b58612fa3565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613b9a602083612665565b9150613ba582613b64565b602082019050919050565b60006020820190508181036000830152613bc981613b8d565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613c06601983612665565b9150613c1182613bd0565b602082019050919050565b60006020820190508181036000830152613c3581613bf9565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613c98603283612665565b9150613ca382613c3c565b604082019050919050565b60006020820190508181036000830152613cc781613c8b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613d0882612715565b9150613d1383612715565b925082613d2357613d22613cce565b5b828204905092915050565b6000613d3982612715565b9150613d4483612715565b925082613d5457613d53613cce565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000613d8682613d5f565b613d908185613d6a565b9350613da0818560208601612676565b613da9816126a9565b840191505092915050565b6000608082019050613dc960008301876127aa565b613dd660208301866127aa565b613de36040830185612840565b8181036060830152613df58184613d7b565b905095945050505050565b600081519050613e0f816125cb565b92915050565b600060208284031215613e2b57613e2a612595565b5b6000613e3984828501613e00565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613e78602083612665565b9150613e8382613e42565b602082019050919050565b60006020820190508181036000830152613ea781613e6b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613ee4601c83612665565b9150613eef82613eae565b602082019050919050565b60006020820190508181036000830152613f1381613ed7565b905091905056fea26469706673582212206316717151c2ef10d7bf407d465bf46a5d9c831b299cdfbaefdb3dbef160b88d64736f6c634300080f0033697066733a2f2f516d564e4a7a424d51464c5165384346707651654a4e54515a48336e3673787355636564714170523637715561382f

Deployed Bytecode

0x6080604052600436106101f95760003560e01c8063607f8b0e1161010d57806395d89b41116100a0578063c87b56dd1161006f578063c87b56dd146106ee578063d248c85c1461072b578063d5abeb0114610756578063e985e9c514610781578063f2fde38b146107be576101f9565b806395d89b4114610655578063a0712d6814610680578063a22cb4651461069c578063b88d4fde146106c5576101f9565b8063715018a6116100dc578063715018a6146105c1578063766b7d09146105d85780637ec4a659146106015780638da5cb5b1461062a576101f9565b8063607f8b0e146104f157806362b99ad41461051c5780636352211e1461054757806370a0823114610584576101f9565b80633ccfd60b11610190578063438b63001161015f578063438b63001461040a57806344a0d68a146104475780635503a0e8146104705780635b74efcf1461049b5780635e84d723146104c6576101f9565b80633ccfd60b1461037657806342842e0e1461038d57806342953560146103b657806342966c68146103e1576101f9565b806313faede6116101cc57806313faede6146102cc57806318160ddd146102f757806323b872dd14610322578063269bbebd1461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b50610225600480360381019061022091906125f7565b6107e7565b604051610232919061263f565b60405180910390f35b34801561024757600080fd5b506102506108c9565b60405161025d91906126f3565b60405180910390f35b34801561027257600080fd5b5061028d6004803603810190610288919061274b565b61095b565b60405161029a91906127b9565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190612800565b6109a1565b005b3480156102d857600080fd5b506102e1610ab8565b6040516102ee919061284f565b60405180910390f35b34801561030357600080fd5b5061030c610abe565b604051610319919061284f565b60405180910390f35b34801561032e57600080fd5b506103496004803603810190610344919061286a565b610acf565b005b34801561035757600080fd5b50610360610b2f565b60405161036d919061284f565b60405180910390f35b34801561038257600080fd5b5061038b610b35565b005b34801561039957600080fd5b506103b460048036038101906103af919061286a565b610bbd565b005b3480156103c257600080fd5b506103cb610bdd565b6040516103d8919061284f565b60405180910390f35b3480156103ed57600080fd5b506104086004803603810190610403919061274b565b610be3565b005b34801561041657600080fd5b50610431600480360381019061042c91906128bd565b610bf7565b60405161043e91906129a8565b60405180910390f35b34801561045357600080fd5b5061046e6004803603810190610469919061274b565b610d01565b005b34801561047c57600080fd5b50610485610d13565b60405161049291906126f3565b60405180910390f35b3480156104a757600080fd5b506104b0610da1565b6040516104bd919061284f565b60405180910390f35b3480156104d257600080fd5b506104db610da7565b6040516104e8919061284f565b60405180910390f35b3480156104fd57600080fd5b50610506610dad565b604051610513919061284f565b60405180910390f35b34801561052857600080fd5b50610531610db3565b60405161053e91906126f3565b60405180910390f35b34801561055357600080fd5b5061056e6004803603810190610569919061274b565b610e41565b60405161057b91906127b9565b60405180910390f35b34801561059057600080fd5b506105ab60048036038101906105a691906128bd565b610ef2565b6040516105b8919061284f565b60405180910390f35b3480156105cd57600080fd5b506105d6610fa9565b005b3480156105e457600080fd5b506105ff60048036038101906105fa919061274b565b610fbd565b005b34801561060d57600080fd5b5061062860048036038101906106239190612aff565b610fcf565b005b34801561063657600080fd5b5061063f610fea565b60405161064c91906127b9565b60405180910390f35b34801561066157600080fd5b5061066a611014565b60405161067791906126f3565b60405180910390f35b61069a6004803603810190610695919061274b565b6110a6565b005b3480156106a857600080fd5b506106c360048036038101906106be9190612b74565b6113e4565b005b3480156106d157600080fd5b506106ec60048036038101906106e79190612c55565b6113fa565b005b3480156106fa57600080fd5b506107156004803603810190610710919061274b565b61145c565b60405161072291906126f3565b60405180910390f35b34801561073757600080fd5b50610740611506565b60405161074d919061284f565b60405180910390f35b34801561076257600080fd5b5061076b61150c565b604051610778919061284f565b60405180910390f35b34801561078d57600080fd5b506107a860048036038101906107a39190612cd8565b611512565b6040516107b5919061263f565b60405180910390f35b3480156107ca57600080fd5b506107e560048036038101906107e091906128bd565b6115a6565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108b257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108c257506108c182611629565b5b9050919050565b6060600080546108d890612d47565b80601f016020809104026020016040519081016040528092919081815260200182805461090490612d47565b80156109515780601f1061092657610100808354040283529160200191610951565b820191906000526020600020905b81548152906001019060200180831161093457829003601f168201915b5050505050905090565b600061096682611693565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109ac82610e41565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1390612dea565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a3b6116de565b73ffffffffffffffffffffffffffffffffffffffff161480610a6a5750610a6981610a646116de565b611512565b5b610aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa090612e7c565b60405180910390fd5b610ab383836116e6565b505050565b600d5481565b6000610aca600761179f565b905090565b610ae0610ada6116de565b826117ad565b610b1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1690612f0e565b60405180910390fd5b610b2a838383611842565b505050565b600b5481565b610b3d611aa8565b6000610b47610fea565b73ffffffffffffffffffffffffffffffffffffffff1647604051610b6a90612f5f565b60006040518083038185875af1925050503d8060008114610ba7576040519150601f19603f3d011682016040523d82523d6000602084013e610bac565b606091505b5050905080610bba57600080fd5b50565b610bd8838383604051806020016040528060008152506113fa565b505050565b60105481565b610beb611aa8565b610bf481611b26565b50565b60606000610c0483610ef2565b905060008167ffffffffffffffff811115610c2257610c216129d4565b5b604051908082528060200260200182016040528015610c505781602001602082028036833780820191505090505b50905060006001905060005b8381108015610c6d5750600a548211155b15610cf5576000610c7d83610e41565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ce15782848381518110610cc657610cc5612f74565b5b6020026020010181815250508180610cdd90612fd2565b9250505b8280610cec90612fd2565b93505050610c5c565b82945050505050919050565b610d09611aa8565b80600d8190555050565b60098054610d2090612d47565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4c90612d47565b8015610d995780601f10610d6e57610100808354040283529160200191610d99565b820191906000526020600020905b815481529060010190602001808311610d7c57829003601f168201915b505050505081565b600f5481565b600c5481565b60115481565b60088054610dc090612d47565b80601f0160208091040260200160405190810160405280929190818152602001828054610dec90612d47565b8015610e395780601f10610e0e57610100808354040283529160200191610e39565b820191906000526020600020905b815481529060010190602001808311610e1c57829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee090613066565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f59906130f8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fb1611aa8565b610fbb6000611c43565b565b610fc5611aa8565b8060118190555050565b610fd7611aa8565b8060089081610fe691906132c4565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461102390612d47565b80601f016020809104026020016040519081016040528092919081815260200182805461104f90612d47565b801561109c5780601f106110715761010080835404028352916020019161109c565b820191906000526020600020905b81548152906001019060200180831161107f57829003601f168201915b5050505050905090565b8060006110b3600761179f565b90506000821180156110c757506010548211155b611106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fd906133e2565b60405180910390fd5b600a5482826111159190613402565b1115611156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114d906134a4565b60405180910390fd5b61115e610fea565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113445780600b54111561122c57600f546111a633610ef2565b106111e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dd90613536565b60405180910390fd5b600e5482111561122b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122290613536565b60405180910390fd5b5b600b548110611343576011548261124233610ef2565b61124c9190613402565b111561128d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611284906135c8565b60405180910390fd5b6010548211156112d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c99061365a565b60405180910390fd5b600082600d546112e2919061367a565b9050600583036112fe576004600d546112fb919061367a565b90505b80341015611341576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133890613746565b60405180910390fd5b505b5b600082826113529190613402565b9050600c548111156113d457611366610fea565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ca906137d8565b60405180910390fd5b5b6113de3385611d09565b50505050565b6113f66113ef6116de565b8383611d49565b5050565b61140b6114056116de565b836117ad565b61144a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144190612f0e565b60405180910390fd5b61145684848484611eb5565b50505050565b606061146782611f11565b6114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149d9061386a565b60405180910390fd5b60006114b0611f7d565b905060008151116114d057604051806020016040528060008152506114fe565b806114da8461200f565b60096040516020016114ee93929190613949565b6040516020818303038152906040525b915050919050565b600e5481565b600a5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115ae611aa8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361161d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611614906139ec565b60405180910390fd5b61162681611c43565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61169c81611f11565b6116db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d290613066565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661175983610e41565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000806117b983610e41565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806117fb57506117fa8185611512565b5b8061183957508373ffffffffffffffffffffffffffffffffffffffff166118218461095b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661186282610e41565b73ffffffffffffffffffffffffffffffffffffffff16146118b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118af90613a7e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191e90613b10565b60405180910390fd5b61193283838361216f565b61193d6000826116e6565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461198d9190613b30565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119e49190613402565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611aa3838383612174565b505050565b611ab06116de565b73ffffffffffffffffffffffffffffffffffffffff16611ace610fea565b73ffffffffffffffffffffffffffffffffffffffff1614611b24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1b90613bb0565b60405180910390fd5b565b6000611b3182610e41565b9050611b3f8160008461216f565b611b4a6000836116e6565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b9a9190613b30565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c3f81600084612174565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b81811015611d4457611d1e6007612179565b611d3183611d2c600761179f565b61218f565b8080611d3c90612fd2565b915050611d0c565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dae90613c1c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ea8919061263f565b60405180910390a3505050565b611ec0848484611842565b611ecc848484846121ad565b611f0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0290613cae565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060088054611f8c90612d47565b80601f0160208091040260200160405190810160405280929190818152602001828054611fb890612d47565b80156120055780601f10611fda57610100808354040283529160200191612005565b820191906000526020600020905b815481529060010190602001808311611fe857829003601f168201915b5050505050905090565b606060008203612056576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061216a565b600082905060005b6000821461208857808061207190612fd2565b915050600a826120819190613cfd565b915061205e565b60008167ffffffffffffffff8111156120a4576120a36129d4565b5b6040519080825280601f01601f1916602001820160405280156120d65781602001600182028036833780820191505090505b5090505b60008514612163576001826120ef9190613b30565b9150600a856120fe9190613d2e565b603061210a9190613402565b60f81b8183815181106121205761211f612f74565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561215c9190613cfd565b94506120da565b8093505050505b919050565b505050565b505050565b6001816000016000828254019250508190555050565b6121a9828260405180602001604052806000815250612334565b5050565b60006121ce8473ffffffffffffffffffffffffffffffffffffffff1661238f565b15612327578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121f76116de565b8786866040518563ffffffff1660e01b81526004016122199493929190613db4565b6020604051808303816000875af192505050801561225557506040513d601f19601f820116820180604052508101906122529190613e15565b60015b6122d7573d8060008114612285576040519150601f19603f3d011682016040523d82523d6000602084013e61228a565b606091505b5060008151036122cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c690613cae565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061232c565b600190505b949350505050565b61233e83836123b2565b61234b60008484846121ad565b61238a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238190613cae565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241890613e8e565b60405180910390fd5b61242a81611f11565b1561246a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246190613efa565b60405180910390fd5b6124766000838361216f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124c69190613402565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461258760008383612174565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6125d48161259f565b81146125df57600080fd5b50565b6000813590506125f1816125cb565b92915050565b60006020828403121561260d5761260c612595565b5b600061261b848285016125e2565b91505092915050565b60008115159050919050565b61263981612624565b82525050565b60006020820190506126546000830184612630565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612694578082015181840152602081019050612679565b838111156126a3576000848401525b50505050565b6000601f19601f8301169050919050565b60006126c58261265a565b6126cf8185612665565b93506126df818560208601612676565b6126e8816126a9565b840191505092915050565b6000602082019050818103600083015261270d81846126ba565b905092915050565b6000819050919050565b61272881612715565b811461273357600080fd5b50565b6000813590506127458161271f565b92915050565b60006020828403121561276157612760612595565b5b600061276f84828501612736565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127a382612778565b9050919050565b6127b381612798565b82525050565b60006020820190506127ce60008301846127aa565b92915050565b6127dd81612798565b81146127e857600080fd5b50565b6000813590506127fa816127d4565b92915050565b6000806040838503121561281757612816612595565b5b6000612825858286016127eb565b925050602061283685828601612736565b9150509250929050565b61284981612715565b82525050565b60006020820190506128646000830184612840565b92915050565b60008060006060848603121561288357612882612595565b5b6000612891868287016127eb565b93505060206128a2868287016127eb565b92505060406128b386828701612736565b9150509250925092565b6000602082840312156128d3576128d2612595565b5b60006128e1848285016127eb565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61291f81612715565b82525050565b60006129318383612916565b60208301905092915050565b6000602082019050919050565b6000612955826128ea565b61295f81856128f5565b935061296a83612906565b8060005b8381101561299b5781516129828882612925565b975061298d8361293d565b92505060018101905061296e565b5085935050505092915050565b600060208201905081810360008301526129c2818461294a565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a0c826126a9565b810181811067ffffffffffffffff82111715612a2b57612a2a6129d4565b5b80604052505050565b6000612a3e61258b565b9050612a4a8282612a03565b919050565b600067ffffffffffffffff821115612a6a57612a696129d4565b5b612a73826126a9565b9050602081019050919050565b82818337600083830152505050565b6000612aa2612a9d84612a4f565b612a34565b905082815260208101848484011115612abe57612abd6129cf565b5b612ac9848285612a80565b509392505050565b600082601f830112612ae657612ae56129ca565b5b8135612af6848260208601612a8f565b91505092915050565b600060208284031215612b1557612b14612595565b5b600082013567ffffffffffffffff811115612b3357612b3261259a565b5b612b3f84828501612ad1565b91505092915050565b612b5181612624565b8114612b5c57600080fd5b50565b600081359050612b6e81612b48565b92915050565b60008060408385031215612b8b57612b8a612595565b5b6000612b99858286016127eb565b9250506020612baa85828601612b5f565b9150509250929050565b600067ffffffffffffffff821115612bcf57612bce6129d4565b5b612bd8826126a9565b9050602081019050919050565b6000612bf8612bf384612bb4565b612a34565b905082815260208101848484011115612c1457612c136129cf565b5b612c1f848285612a80565b509392505050565b600082601f830112612c3c57612c3b6129ca565b5b8135612c4c848260208601612be5565b91505092915050565b60008060008060808587031215612c6f57612c6e612595565b5b6000612c7d878288016127eb565b9450506020612c8e878288016127eb565b9350506040612c9f87828801612736565b925050606085013567ffffffffffffffff811115612cc057612cbf61259a565b5b612ccc87828801612c27565b91505092959194509250565b60008060408385031215612cef57612cee612595565b5b6000612cfd858286016127eb565b9250506020612d0e858286016127eb565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612d5f57607f821691505b602082108103612d7257612d71612d18565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612dd4602183612665565b9150612ddf82612d78565b604082019050919050565b60006020820190508181036000830152612e0381612dc7565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000612e66603e83612665565b9150612e7182612e0a565b604082019050919050565b60006020820190508181036000830152612e9581612e59565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000612ef8602e83612665565b9150612f0382612e9c565b604082019050919050565b60006020820190508181036000830152612f2781612eeb565b9050919050565b600081905092915050565b50565b6000612f49600083612f2e565b9150612f5482612f39565b600082019050919050565b6000612f6a82612f3c565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612fdd82612715565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361300f5761300e612fa3565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613050601883612665565b915061305b8261301a565b602082019050919050565b6000602082019050818103600083015261307f81613043565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006130e2602983612665565b91506130ed82613086565b604082019050919050565b60006020820190508181036000830152613111816130d5565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261317a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261313d565b613184868361313d565b95508019841693508086168417925050509392505050565b6000819050919050565b60006131c16131bc6131b784612715565b61319c565b612715565b9050919050565b6000819050919050565b6131db836131a6565b6131ef6131e7826131c8565b84845461314a565b825550505050565b600090565b6132046131f7565b61320f8184846131d2565b505050565b5b81811015613233576132286000826131fc565b600181019050613215565b5050565b601f8211156132785761324981613118565b6132528461312d565b81016020851015613261578190505b61327561326d8561312d565b830182613214565b50505b505050565b600082821c905092915050565b600061329b6000198460080261327d565b1980831691505092915050565b60006132b4838361328a565b9150826002028217905092915050565b6132cd8261265a565b67ffffffffffffffff8111156132e6576132e56129d4565b5b6132f08254612d47565b6132fb828285613237565b600060209050601f83116001811461332e576000841561331c578287015190505b61332685826132a8565b86555061338e565b601f19841661333c86613118565b60005b828110156133645784890151825560018201915060208501945060208101905061333f565b86831015613381578489015161337d601f89168261328a565b8355505b6001600288020188555050505b505050505050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b60006133cc601483612665565b91506133d782613396565b602082019050919050565b600060208201905081810360008301526133fb816133bf565b9050919050565b600061340d82612715565b915061341883612715565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561344d5761344c612fa3565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b600061348e601483612665565b915061349982613458565b602082019050919050565b600060208201905081810360008301526134bd81613481565b9050919050565b7f456163682061646472657373206d6179206f6e6c79206d696e74206f6e65206660008201527f726565206e667400000000000000000000000000000000000000000000000000602082015250565b6000613520602783612665565b915061352b826134c4565b604082019050919050565b6000602082019050818103600083015261354f81613513565b9050919050565b7f456163682061646472657373206d6179206f6e6c79206d696e7420313120706160008201527f6964206e66740000000000000000000000000000000000000000000000000000602082015250565b60006135b2602683612665565b91506135bd82613556565b604082019050919050565b600060208201905081810360008301526135e1816135a5565b9050919050565b7f4d61782035206e667420706572207472616e73616374696f6e2061726520616c60008201527f6c6f776564000000000000000000000000000000000000000000000000000000602082015250565b6000613644602583612665565b915061364f826135e8565b604082019050919050565b6000602082019050818103600083015261367381613637565b9050919050565b600061368582612715565b915061369083612715565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156136c9576136c8612fa3565b5b828202905092915050565b7f596f75206e65656420746f2070617920302e303036392045544820706572206e60008201527f6674000000000000000000000000000000000000000000000000000000000000602082015250565b6000613730602283612665565b915061373b826136d4565b604082019050919050565b6000602082019050818103600083015261375f81613723565b9050919050565b7f4f6e6c79206f776e65722063616e206d696e74206f776e657220737570706c6960008201527f6573000000000000000000000000000000000000000000000000000000000000602082015250565b60006137c2602283612665565b91506137cd82613766565b604082019050919050565b600060208201905081810360008301526137f1816137b5565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613854602f83612665565b915061385f826137f8565b604082019050919050565b6000602082019050818103600083015261388381613847565b9050919050565b600081905092915050565b60006138a08261265a565b6138aa818561388a565b93506138ba818560208601612676565b80840191505092915050565b600081546138d381612d47565b6138dd818661388a565b945060018216600081146138f8576001811461390d57613940565b60ff1983168652811515820286019350613940565b61391685613118565b60005b8381101561393857815481890152600182019150602081019050613919565b838801955050505b50505092915050565b60006139558286613895565b91506139618285613895565b915061396d82846138c6565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006139d6602683612665565b91506139e18261397a565b604082019050919050565b60006020820190508181036000830152613a05816139c9565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613a68602583612665565b9150613a7382613a0c565b604082019050919050565b60006020820190508181036000830152613a9781613a5b565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613afa602483612665565b9150613b0582613a9e565b604082019050919050565b60006020820190508181036000830152613b2981613aed565b9050919050565b6000613b3b82612715565b9150613b4683612715565b925082821015613b5957613b58612fa3565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613b9a602083612665565b9150613ba582613b64565b602082019050919050565b60006020820190508181036000830152613bc981613b8d565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613c06601983612665565b9150613c1182613bd0565b602082019050919050565b60006020820190508181036000830152613c3581613bf9565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613c98603283612665565b9150613ca382613c3c565b604082019050919050565b60006020820190508181036000830152613cc781613c8b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613d0882612715565b9150613d1383612715565b925082613d2357613d22613cce565b5b828204905092915050565b6000613d3982612715565b9150613d4483612715565b925082613d5457613d53613cce565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000613d8682613d5f565b613d908185613d6a565b9350613da0818560208601612676565b613da9816126a9565b840191505092915050565b6000608082019050613dc960008301876127aa565b613dd660208301866127aa565b613de36040830185612840565b8181036060830152613df58184613d7b565b905095945050505050565b600081519050613e0f816125cb565b92915050565b600060208284031215613e2b57613e2a612595565b5b6000613e3984828501613e00565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613e78602083612665565b9150613e8382613e42565b602082019050919050565b60006020820190508181036000830152613ea781613e6b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613ee4601c83612665565b9150613eef82613eae565b602082019050919050565b60006020820190508181036000830152613f1381613ed7565b905091905056fea26469706673582212206316717151c2ef10d7bf407d465bf46a5d9c831b299cdfbaefdb3dbef160b88d64736f6c634300080f0033

Deployed Bytecode Sourcemap

39483:4094:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26237:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27164:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28677:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28194:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39877:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41412:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29377:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39802:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43117:137;;;;;;;;;;;;;:::i;:::-;;29784:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39997:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42707:75;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41638:635;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42788:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39725:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39960:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39838:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40039:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39638:82;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26875:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26606:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6773:103;;;;;;;;;;;;;:::i;:::-;;42974:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42868:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6125:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27333:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41507:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28920:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30040:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42279:422;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39918:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39765:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29146:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7031:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26237:305;26339:4;26391:25;26376:40;;;:11;:40;;;;:105;;;;26448:33;26433:48;;;:11;:48;;;;26376:105;:158;;;;26498:36;26522:11;26498:23;:36::i;:::-;26376:158;26356:178;;26237:305;;;:::o;27164:100::-;27218:13;27251:5;27244:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27164:100;:::o;28677:171::-;28753:7;28773:23;28788:7;28773:14;:23::i;:::-;28816:15;:24;28832:7;28816:24;;;;;;;;;;;;;;;;;;;;;28809:31;;28677:171;;;:::o;28194:417::-;28275:13;28291:23;28306:7;28291:14;:23::i;:::-;28275:39;;28339:5;28333:11;;:2;:11;;;28325:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28433:5;28417:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28442:37;28459:5;28466:12;:10;:12::i;:::-;28442:16;:37::i;:::-;28417:62;28395:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;28582:21;28591:2;28595:7;28582:8;:21::i;:::-;28264:347;28194:417;;:::o;39877:34::-;;;;:::o;41412:89::-;41456:7;41479:16;:6;:14;:16::i;:::-;41472:23;;41412:89;:::o;29377:336::-;29572:41;29591:12;:10;:12::i;:::-;29605:7;29572:18;:41::i;:::-;29564:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;29677:28;29687:4;29693:2;29697:7;29677:9;:28::i;:::-;29377:336;;;:::o;39802:31::-;;;;:::o;43117:137::-;6011:13;:11;:13::i;:::-;43162:7:::1;43183;:5;:7::i;:::-;43175:21;;43204;43175:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43161:69;;;43245:2;43237:11;;;::::0;::::1;;43154:100;43117:137::o:0;29784:185::-;29922:39;29939:4;29945:2;29949:7;29922:39;;;;;;;;;;;;:16;:39::i;:::-;29784:185;;;:::o;39997:37::-;;;;:::o;42707:75::-;6011:13;:11;:13::i;:::-;42762:14:::1;42768:7;42762:5;:14::i;:::-;42707:75:::0;:::o;41638:635::-;41713:16;41741:23;41767:17;41777:6;41767:9;:17::i;:::-;41741:43;;41791:30;41838:15;41824:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41791:63;;41861:22;41886:1;41861:26;;41894:23;41930:309;41955:15;41937;:33;:64;;;;;41992:9;;41974:14;:27;;41937:64;41930:309;;;42012:25;42040:23;42048:14;42040:7;:23::i;:::-;42012:51;;42099:6;42078:27;;:17;:27;;;42074:131;;42151:14;42118:13;42132:15;42118:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;42178:17;;;;;:::i;:::-;;;;42074:131;42215:16;;;;;:::i;:::-;;;;42003:236;41930:309;;;42254:13;42247:20;;;;;;41638:635;;;:::o;42788:74::-;6011:13;:11;:13::i;:::-;42851:5:::1;42844:4;:12;;;;42788:74:::0;:::o;39725:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39960:32::-;;;;:::o;39838:34::-;;;;:::o;40039:33::-;;;;:::o;39638:82::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26875:222::-;26947:7;26967:13;26983:7;:16;26991:7;26983:16;;;;;;;;;;;;;;;;;;;;;26967:32;;27035:1;27018:19;;:5;:19;;;27010:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;27084:5;27077:12;;;26875:222;;;:::o;26606:207::-;26678:7;26723:1;26706:19;;:5;:19;;;26698:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26789:9;:16;26799:5;26789:16;;;;;;;;;;;;;;;;26782:23;;26606:207;;;:::o;6773:103::-;6011:13;:11;:13::i;:::-;6838:30:::1;6865:1;6838:18;:30::i;:::-;6773:103::o:0;42974:137::-;6011:13;:11;:13::i;:::-;43082:23:::1;43066:13;:39;;;;42974:137:::0;:::o;42868:100::-;6011:13;:11;:13::i;:::-;42952:10:::1;42940:9;:22;;;;;;:::i;:::-;;42868:100:::0;:::o;6125:87::-;6171:7;6198:6;;;;;;;;;;;6191:13;;6125:87;:::o;27333:104::-;27389:13;27422:7;27415:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27333:104;:::o;41507:125::-;41572:11;40200:17;40220:16;:6;:14;:16::i;:::-;40200:36;;40271:1;40257:11;:15;:52;;;;;40291:18;;40276:11;:33;;40257:52;40249:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;40376:9;;40361:11;40349:9;:23;;;;:::i;:::-;:36;;40341:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;40437:7;:5;:7::i;:::-;40423:21;;:10;:21;;;40419:801;;40473:9;40461;;:21;40457:243;;;40531:13;;40507:21;40517:10;40507:9;:21::i;:::-;:37;40499:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;40626:18;;40611:11;:33;;40603:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;40457:243;40729:9;;40716;:22;40712:501;;40802:13;;40787:11;40763:21;40773:10;40763:9;:21::i;:::-;:35;;;;:::i;:::-;:52;;40755:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;40896:18;;40881:11;:33;;40873:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;40971:22;41003:11;40996:4;;:18;;;;:::i;:::-;40971:43;;41048:1;41033:11;:16;41029:82;;41094:1;41087:4;;:8;;;;:::i;:::-;41070:25;;41029:82;41148:14;41135:9;:27;;41127:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;40740:473;40712:501;40419:801;41228:17;41260:11;41248:9;:23;;;;:::i;:::-;41228:43;;41294:12;;41282:9;:24;41278:115;;;41339:7;:5;:7::i;:::-;41325:21;;:10;:21;;;41317:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41278:115;41592:34:::1;41602:10;41614:11;41592:9;:34::i;:::-;40191:1215:::0;;41507:125;;:::o;28920:155::-;29015:52;29034:12;:10;:12::i;:::-;29048:8;29058;29015:18;:52::i;:::-;28920:155;;:::o;30040:323::-;30214:41;30233:12;:10;:12::i;:::-;30247:7;30214:18;:41::i;:::-;30206:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;30317:38;30331:4;30337:2;30341:7;30350:4;30317:13;:38::i;:::-;30040:323;;;;:::o;42279:422::-;42378:13;42419:17;42427:8;42419:7;:17::i;:::-;42403:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;42510:28;42541:10;:8;:10::i;:::-;42510:41;;42596:1;42571:14;42565:28;:32;:130;;;;;;;;;;;;;;;;;42633:14;42649:19;:8;:17;:19::i;:::-;42670:9;42616:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42565:130;42558:137;;;42279:422;;;:::o;39918:37::-;;;;:::o;39765:32::-;;;;:::o;29146:164::-;29243:4;29267:18;:25;29286:5;29267:25;;;;;;;;;;;;;;;:35;29293:8;29267:35;;;;;;;;;;;;;;;;;;;;;;;;;29260:42;;29146:164;;;;:::o;7031:201::-;6011:13;:11;:13::i;:::-;7140:1:::1;7120:22;;:8;:22;;::::0;7112:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;7196:28;7215:8;7196:18;:28::i;:::-;7031:201:::0;:::o;18979:157::-;19064:4;19103:25;19088:40;;;:11;:40;;;;19081:47;;18979:157;;;:::o;36652:135::-;36734:16;36742:7;36734;:16::i;:::-;36726:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;36652:135;:::o;4676:98::-;4729:7;4756:10;4749:17;;4676:98;:::o;35931:174::-;36033:2;36006:15;:24;36022:7;36006:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36089:7;36085:2;36051:46;;36060:23;36075:7;36060:14;:23::i;:::-;36051:46;;;;;;;;;;;;35931:174;;:::o;907:114::-;972:7;999;:14;;;992:21;;907:114;;;:::o;32164:264::-;32257:4;32274:13;32290:23;32305:7;32290:14;:23::i;:::-;32274:39;;32343:5;32332:16;;:7;:16;;;:52;;;;32352:32;32369:5;32376:7;32352:16;:32::i;:::-;32332:52;:87;;;;32412:7;32388:31;;:20;32400:7;32388:11;:20::i;:::-;:31;;;32332:87;32324:96;;;32164:264;;;;:::o;35187:625::-;35346:4;35319:31;;:23;35334:7;35319:14;:23::i;:::-;:31;;;35311:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;35425:1;35411:16;;:2;:16;;;35403:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35481:39;35502:4;35508:2;35512:7;35481:20;:39::i;:::-;35585:29;35602:1;35606:7;35585:8;:29::i;:::-;35646:1;35627:9;:15;35637:4;35627:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35675:1;35658:9;:13;35668:2;35658:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35706:2;35687:7;:16;35695:7;35687:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35745:7;35741:2;35726:27;;35735:4;35726:27;;;;;;;;;;;;35766:38;35786:4;35792:2;35796:7;35766:19;:38::i;:::-;35187:625;;;:::o;6290:132::-;6365:12;:10;:12::i;:::-;6354:23;;:7;:5;:7::i;:::-;:23;;;6346:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6290:132::o;34430:420::-;34490:13;34506:23;34521:7;34506:14;:23::i;:::-;34490:39;;34542:48;34563:5;34578:1;34582:7;34542:20;:48::i;:::-;34631:29;34648:1;34652:7;34631:8;:29::i;:::-;34693:1;34673:9;:16;34683:5;34673:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;34712:7;:16;34720:7;34712:16;;;;;;;;;;;;34705:23;;;;;;;;;;;34774:7;34770:1;34746:36;;34755:5;34746:36;;;;;;;;;;;;34795:47;34815:5;34830:1;34834:7;34795:19;:47::i;:::-;34479:371;34430:420;:::o;7392:191::-;7466:16;7485:6;;;;;;;;;;;7466:25;;7511:8;7502:6;;:17;;;;;;;;;;;;;;;;;;7566:8;7535:40;;7556:8;7535:40;;;;;;;;;;;;7455:128;7392:191;:::o;43260:204::-;43340:9;43335:124;43359:11;43355:1;:15;43335:124;;;43386:18;:6;:16;:18::i;:::-;43413:38;43423:9;43434:16;:6;:14;:16::i;:::-;43413:9;:38::i;:::-;43372:3;;;;;:::i;:::-;;;;43335:124;;;;43260:204;;:::o;36248:315::-;36403:8;36394:17;;:5;:17;;;36386:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36490:8;36452:18;:25;36471:5;36452:25;;;;;;;;;;;;;;;:35;36478:8;36452:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36536:8;36514:41;;36529:5;36514:41;;;36546:8;36514:41;;;;;;:::i;:::-;;;;;;;;36248:315;;;:::o;31244:313::-;31400:28;31410:4;31416:2;31420:7;31400:9;:28::i;:::-;31447:47;31470:4;31476:2;31480:7;31489:4;31447:22;:47::i;:::-;31439:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;31244:313;;;;:::o;31870:127::-;31935:4;31987:1;31959:30;;:7;:16;31967:7;31959:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31952:37;;31870:127;;;:::o;43470:104::-;43530:13;43559:9;43552:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43470:104;:::o;1930:723::-;1986:13;2216:1;2207:5;:10;2203:53;;2234:10;;;;;;;;;;;;;;;;;;;;;2203:53;2266:12;2281:5;2266:20;;2297:14;2322:78;2337:1;2329:4;:9;2322:78;;2355:8;;;;;:::i;:::-;;;;2386:2;2378:10;;;;;:::i;:::-;;;2322:78;;;2410:19;2442:6;2432:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2410:39;;2460:154;2476:1;2467:5;:10;2460:154;;2504:1;2494:11;;;;;:::i;:::-;;;2571:2;2563:5;:10;;;;:::i;:::-;2550:2;:24;;;;:::i;:::-;2537:39;;2520:6;2527;2520:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2600:2;2591:11;;;;;:::i;:::-;;;2460:154;;;2638:6;2624:21;;;;;1930:723;;;;:::o;38776:126::-;;;;:::o;39287:125::-;;;;:::o;1029:127::-;1136:1;1118:7;:14;;;:19;;;;;;;;;;;1029:127;:::o;32770:110::-;32846:26;32856:2;32860:7;32846:26;;;;;;;;;;;;:9;:26::i;:::-;32770:110;;:::o;37351:853::-;37505:4;37526:15;:2;:13;;;:15::i;:::-;37522:675;;;37578:2;37562:36;;;37599:12;:10;:12::i;:::-;37613:4;37619:7;37628:4;37562:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37558:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37820:1;37803:6;:13;:18;37799:328;;37846:60;;;;;;;;;;:::i;:::-;;;;;;;;37799:328;38077:6;38071:13;38062:6;38058:2;38054:15;38047:38;37558:584;37694:41;;;37684:51;;;:6;:51;;;;37677:58;;;;;37522:675;38181:4;38174:11;;37351:853;;;;;;;:::o;33107:319::-;33236:18;33242:2;33246:7;33236:5;:18::i;:::-;33287:53;33318:1;33322:2;33326:7;33335:4;33287:22;:53::i;:::-;33265:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;33107:319;;;:::o;8823:326::-;8883:4;9140:1;9118:7;:19;;;:23;9111:30;;8823:326;;;:::o;33762:439::-;33856:1;33842:16;;:2;:16;;;33834:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33915:16;33923:7;33915;:16::i;:::-;33914:17;33906:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33977:45;34006:1;34010:2;34014:7;33977:20;:45::i;:::-;34052:1;34035:9;:13;34045:2;34035:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34083:2;34064:7;:16;34072:7;34064:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34128:7;34124:2;34103:33;;34120:1;34103:33;;;;;;;;;;;;34149:44;34177:1;34181:2;34185:7;34149:19;:44::i;:::-;33762:439;;:::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:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:114::-;6317:6;6351:5;6345:12;6335:22;;6250:114;;;:::o;6370:184::-;6469:11;6503:6;6498:3;6491:19;6543:4;6538:3;6534:14;6519:29;;6370:184;;;;:::o;6560:132::-;6627:4;6650:3;6642:11;;6680:4;6675:3;6671:14;6663:22;;6560:132;;;:::o;6698:108::-;6775:24;6793:5;6775:24;:::i;:::-;6770:3;6763:37;6698:108;;:::o;6812:179::-;6881:10;6902:46;6944:3;6936:6;6902:46;:::i;:::-;6980:4;6975:3;6971:14;6957:28;;6812:179;;;;:::o;6997:113::-;7067:4;7099;7094:3;7090:14;7082:22;;6997:113;;;:::o;7146:732::-;7265:3;7294:54;7342:5;7294:54;:::i;:::-;7364:86;7443:6;7438:3;7364:86;:::i;:::-;7357:93;;7474:56;7524:5;7474:56;:::i;:::-;7553:7;7584:1;7569:284;7594:6;7591:1;7588:13;7569:284;;;7670:6;7664:13;7697:63;7756:3;7741:13;7697:63;:::i;:::-;7690:70;;7783:60;7836:6;7783:60;:::i;:::-;7773:70;;7629:224;7616:1;7613;7609:9;7604:14;;7569:284;;;7573:14;7869:3;7862:10;;7270:608;;;7146:732;;;;:::o;7884:373::-;8027:4;8065:2;8054:9;8050:18;8042:26;;8114:9;8108:4;8104:20;8100:1;8089:9;8085:17;8078:47;8142:108;8245:4;8236:6;8142:108;:::i;:::-;8134:116;;7884:373;;;;:::o;8263:117::-;8372:1;8369;8362:12;8386:117;8495:1;8492;8485:12;8509:180;8557:77;8554:1;8547:88;8654:4;8651:1;8644:15;8678:4;8675:1;8668:15;8695:281;8778:27;8800:4;8778:27;:::i;:::-;8770:6;8766:40;8908:6;8896:10;8893:22;8872:18;8860:10;8857:34;8854:62;8851:88;;;8919:18;;:::i;:::-;8851:88;8959:10;8955:2;8948:22;8738:238;8695:281;;:::o;8982:129::-;9016:6;9043:20;;:::i;:::-;9033:30;;9072:33;9100:4;9092:6;9072:33;:::i;:::-;8982:129;;;:::o;9117:308::-;9179:4;9269:18;9261:6;9258:30;9255:56;;;9291:18;;:::i;:::-;9255:56;9329:29;9351:6;9329:29;:::i;:::-;9321:37;;9413:4;9407;9403:15;9395:23;;9117:308;;;:::o;9431:154::-;9515:6;9510:3;9505;9492:30;9577:1;9568:6;9563:3;9559:16;9552:27;9431:154;;;:::o;9591:412::-;9669:5;9694:66;9710:49;9752:6;9710:49;:::i;:::-;9694:66;:::i;:::-;9685:75;;9783:6;9776:5;9769:21;9821:4;9814:5;9810:16;9859:3;9850:6;9845:3;9841:16;9838:25;9835:112;;;9866:79;;:::i;:::-;9835:112;9956:41;9990:6;9985:3;9980;9956:41;:::i;:::-;9675:328;9591:412;;;;;:::o;10023:340::-;10079:5;10128:3;10121:4;10113:6;10109:17;10105:27;10095:122;;10136:79;;:::i;:::-;10095:122;10253:6;10240:20;10278:79;10353:3;10345:6;10338:4;10330:6;10326:17;10278:79;:::i;:::-;10269:88;;10085:278;10023:340;;;;:::o;10369:509::-;10438:6;10487:2;10475:9;10466:7;10462:23;10458:32;10455:119;;;10493:79;;:::i;:::-;10455:119;10641:1;10630:9;10626:17;10613:31;10671:18;10663:6;10660:30;10657:117;;;10693:79;;:::i;:::-;10657:117;10798:63;10853:7;10844:6;10833:9;10829:22;10798:63;:::i;:::-;10788:73;;10584:287;10369:509;;;;:::o;10884:116::-;10954:21;10969:5;10954:21;:::i;:::-;10947:5;10944:32;10934:60;;10990:1;10987;10980:12;10934:60;10884:116;:::o;11006:133::-;11049:5;11087:6;11074:20;11065:29;;11103:30;11127:5;11103:30;:::i;:::-;11006:133;;;;:::o;11145:468::-;11210:6;11218;11267:2;11255:9;11246:7;11242:23;11238:32;11235:119;;;11273:79;;:::i;:::-;11235:119;11393:1;11418:53;11463:7;11454:6;11443:9;11439:22;11418:53;:::i;:::-;11408:63;;11364:117;11520:2;11546:50;11588:7;11579:6;11568:9;11564:22;11546:50;:::i;:::-;11536:60;;11491:115;11145:468;;;;;:::o;11619:307::-;11680:4;11770:18;11762:6;11759:30;11756:56;;;11792:18;;:::i;:::-;11756:56;11830:29;11852:6;11830:29;:::i;:::-;11822:37;;11914:4;11908;11904:15;11896:23;;11619:307;;;:::o;11932:410::-;12009:5;12034:65;12050:48;12091:6;12050:48;:::i;:::-;12034:65;:::i;:::-;12025:74;;12122:6;12115:5;12108:21;12160:4;12153:5;12149:16;12198:3;12189:6;12184:3;12180:16;12177:25;12174:112;;;12205:79;;:::i;:::-;12174:112;12295:41;12329:6;12324:3;12319;12295:41;:::i;:::-;12015:327;11932:410;;;;;:::o;12361:338::-;12416:5;12465:3;12458:4;12450:6;12446:17;12442:27;12432:122;;12473:79;;:::i;:::-;12432:122;12590:6;12577:20;12615:78;12689:3;12681:6;12674:4;12666:6;12662:17;12615:78;:::i;:::-;12606:87;;12422:277;12361:338;;;;:::o;12705:943::-;12800:6;12808;12816;12824;12873:3;12861:9;12852:7;12848:23;12844:33;12841:120;;;12880:79;;:::i;:::-;12841:120;13000:1;13025:53;13070:7;13061:6;13050:9;13046:22;13025:53;:::i;:::-;13015:63;;12971:117;13127:2;13153:53;13198:7;13189:6;13178:9;13174:22;13153:53;:::i;:::-;13143:63;;13098:118;13255:2;13281:53;13326:7;13317:6;13306:9;13302:22;13281:53;:::i;:::-;13271:63;;13226:118;13411:2;13400:9;13396:18;13383:32;13442:18;13434:6;13431:30;13428:117;;;13464:79;;:::i;:::-;13428:117;13569:62;13623:7;13614:6;13603:9;13599:22;13569:62;:::i;:::-;13559:72;;13354:287;12705:943;;;;;;;:::o;13654:474::-;13722:6;13730;13779:2;13767:9;13758:7;13754:23;13750:32;13747:119;;;13785:79;;:::i;:::-;13747:119;13905:1;13930:53;13975:7;13966:6;13955:9;13951:22;13930:53;:::i;:::-;13920:63;;13876:117;14032:2;14058:53;14103:7;14094:6;14083:9;14079:22;14058:53;:::i;:::-;14048:63;;14003:118;13654:474;;;;;:::o;14134:180::-;14182:77;14179:1;14172:88;14279:4;14276:1;14269:15;14303:4;14300:1;14293:15;14320:320;14364:6;14401:1;14395:4;14391:12;14381:22;;14448:1;14442:4;14438:12;14469:18;14459:81;;14525:4;14517:6;14513:17;14503:27;;14459:81;14587:2;14579:6;14576:14;14556:18;14553:38;14550:84;;14606:18;;:::i;:::-;14550:84;14371:269;14320:320;;;:::o;14646:220::-;14786:34;14782:1;14774:6;14770:14;14763:58;14855:3;14850:2;14842:6;14838:15;14831:28;14646:220;:::o;14872:366::-;15014:3;15035:67;15099:2;15094:3;15035:67;:::i;:::-;15028:74;;15111:93;15200:3;15111:93;:::i;:::-;15229:2;15224:3;15220:12;15213:19;;14872:366;;;:::o;15244:419::-;15410:4;15448:2;15437:9;15433:18;15425:26;;15497:9;15491:4;15487:20;15483:1;15472:9;15468:17;15461:47;15525:131;15651:4;15525:131;:::i;:::-;15517:139;;15244:419;;;:::o;15669:249::-;15809:34;15805:1;15797:6;15793:14;15786:58;15878:32;15873:2;15865:6;15861:15;15854:57;15669:249;:::o;15924:366::-;16066:3;16087:67;16151:2;16146:3;16087:67;:::i;:::-;16080:74;;16163:93;16252:3;16163:93;:::i;:::-;16281:2;16276:3;16272:12;16265:19;;15924:366;;;:::o;16296:419::-;16462:4;16500:2;16489:9;16485:18;16477:26;;16549:9;16543:4;16539:20;16535:1;16524:9;16520:17;16513:47;16577:131;16703:4;16577:131;:::i;:::-;16569:139;;16296:419;;;:::o;16721:233::-;16861:34;16857:1;16849:6;16845:14;16838:58;16930:16;16925:2;16917:6;16913:15;16906:41;16721:233;:::o;16960:366::-;17102:3;17123:67;17187:2;17182:3;17123:67;:::i;:::-;17116:74;;17199:93;17288:3;17199:93;:::i;:::-;17317:2;17312:3;17308:12;17301:19;;16960:366;;;:::o;17332:419::-;17498:4;17536:2;17525:9;17521:18;17513:26;;17585:9;17579:4;17575:20;17571:1;17560:9;17556:17;17549:47;17613:131;17739:4;17613:131;:::i;:::-;17605:139;;17332:419;;;:::o;17757:147::-;17858:11;17895:3;17880:18;;17757:147;;;;:::o;17910:114::-;;:::o;18030:398::-;18189:3;18210:83;18291:1;18286:3;18210:83;:::i;:::-;18203:90;;18302:93;18391:3;18302:93;:::i;:::-;18420:1;18415:3;18411:11;18404:18;;18030:398;;;:::o;18434:379::-;18618:3;18640:147;18783:3;18640:147;:::i;:::-;18633:154;;18804:3;18797:10;;18434:379;;;:::o;18819:180::-;18867:77;18864:1;18857:88;18964:4;18961:1;18954:15;18988:4;18985:1;18978:15;19005:180;19053:77;19050:1;19043:88;19150:4;19147:1;19140:15;19174:4;19171:1;19164:15;19191:233;19230:3;19253:24;19271:5;19253:24;:::i;:::-;19244:33;;19299:66;19292:5;19289:77;19286:103;;19369:18;;:::i;:::-;19286:103;19416:1;19409:5;19405:13;19398:20;;19191:233;;;:::o;19430:174::-;19570:26;19566:1;19558:6;19554:14;19547:50;19430:174;:::o;19610:366::-;19752:3;19773:67;19837:2;19832:3;19773:67;:::i;:::-;19766:74;;19849:93;19938:3;19849:93;:::i;:::-;19967:2;19962:3;19958:12;19951:19;;19610:366;;;:::o;19982:419::-;20148:4;20186:2;20175:9;20171:18;20163:26;;20235:9;20229:4;20225:20;20221:1;20210:9;20206:17;20199:47;20263:131;20389:4;20263:131;:::i;:::-;20255:139;;19982:419;;;:::o;20407:228::-;20547:34;20543:1;20535:6;20531:14;20524:58;20616:11;20611:2;20603:6;20599:15;20592:36;20407:228;:::o;20641:366::-;20783:3;20804:67;20868:2;20863:3;20804:67;:::i;:::-;20797:74;;20880:93;20969:3;20880:93;:::i;:::-;20998:2;20993:3;20989:12;20982:19;;20641:366;;;:::o;21013:419::-;21179:4;21217:2;21206:9;21202:18;21194:26;;21266:9;21260:4;21256:20;21252:1;21241:9;21237:17;21230:47;21294:131;21420:4;21294:131;:::i;:::-;21286:139;;21013:419;;;:::o;21438:141::-;21487:4;21510:3;21502:11;;21533:3;21530:1;21523:14;21567:4;21564:1;21554:18;21546:26;;21438:141;;;:::o;21585:93::-;21622:6;21669:2;21664;21657:5;21653:14;21649:23;21639:33;;21585:93;;;:::o;21684:107::-;21728:8;21778:5;21772:4;21768:16;21747:37;;21684:107;;;;:::o;21797:393::-;21866:6;21916:1;21904:10;21900:18;21939:97;21969:66;21958:9;21939:97;:::i;:::-;22057:39;22087:8;22076:9;22057:39;:::i;:::-;22045:51;;22129:4;22125:9;22118:5;22114:21;22105:30;;22178:4;22168:8;22164:19;22157:5;22154:30;22144:40;;21873:317;;21797:393;;;;;:::o;22196:60::-;22224:3;22245:5;22238:12;;22196:60;;;:::o;22262:142::-;22312:9;22345:53;22363:34;22372:24;22390:5;22372:24;:::i;:::-;22363:34;:::i;:::-;22345:53;:::i;:::-;22332:66;;22262:142;;;:::o;22410:75::-;22453:3;22474:5;22467:12;;22410:75;;;:::o;22491:269::-;22601:39;22632:7;22601:39;:::i;:::-;22662:91;22711:41;22735:16;22711:41;:::i;:::-;22703:6;22696:4;22690:11;22662:91;:::i;:::-;22656:4;22649:105;22567:193;22491:269;;;:::o;22766:73::-;22811:3;22766:73;:::o;22845:189::-;22922:32;;:::i;:::-;22963:65;23021:6;23013;23007:4;22963:65;:::i;:::-;22898:136;22845:189;;:::o;23040:186::-;23100:120;23117:3;23110:5;23107:14;23100:120;;;23171:39;23208:1;23201:5;23171:39;:::i;:::-;23144:1;23137:5;23133:13;23124:22;;23100:120;;;23040:186;;:::o;23232:543::-;23333:2;23328:3;23325:11;23322:446;;;23367:38;23399:5;23367:38;:::i;:::-;23451:29;23469:10;23451:29;:::i;:::-;23441:8;23437:44;23634:2;23622:10;23619:18;23616:49;;;23655:8;23640:23;;23616:49;23678:80;23734:22;23752:3;23734:22;:::i;:::-;23724:8;23720:37;23707:11;23678:80;:::i;:::-;23337:431;;23322:446;23232:543;;;:::o;23781:117::-;23835:8;23885:5;23879:4;23875:16;23854:37;;23781:117;;;;:::o;23904:169::-;23948:6;23981:51;24029:1;24025:6;24017:5;24014:1;24010:13;23981:51;:::i;:::-;23977:56;24062:4;24056;24052:15;24042:25;;23955:118;23904:169;;;;:::o;24078:295::-;24154:4;24300:29;24325:3;24319:4;24300:29;:::i;:::-;24292:37;;24362:3;24359:1;24355:11;24349:4;24346:21;24338:29;;24078:295;;;;:::o;24378:1395::-;24495:37;24528:3;24495:37;:::i;:::-;24597:18;24589:6;24586:30;24583:56;;;24619:18;;:::i;:::-;24583:56;24663:38;24695:4;24689:11;24663:38;:::i;:::-;24748:67;24808:6;24800;24794:4;24748:67;:::i;:::-;24842:1;24866:4;24853:17;;24898:2;24890:6;24887:14;24915:1;24910:618;;;;25572:1;25589:6;25586:77;;;25638:9;25633:3;25629:19;25623:26;25614:35;;25586:77;25689:67;25749:6;25742:5;25689:67;:::i;:::-;25683:4;25676:81;25545:222;24880:887;;24910:618;24962:4;24958:9;24950:6;24946:22;24996:37;25028:4;24996:37;:::i;:::-;25055:1;25069:208;25083:7;25080:1;25077:14;25069:208;;;25162:9;25157:3;25153:19;25147:26;25139:6;25132:42;25213:1;25205:6;25201:14;25191:24;;25260:2;25249:9;25245:18;25232:31;;25106:4;25103:1;25099:12;25094:17;;25069:208;;;25305:6;25296:7;25293:19;25290:179;;;25363:9;25358:3;25354:19;25348:26;25406:48;25448:4;25440:6;25436:17;25425:9;25406:48;:::i;:::-;25398:6;25391:64;25313:156;25290:179;25515:1;25511;25503:6;25499:14;25495:22;25489:4;25482:36;24917:611;;;24880:887;;24470:1303;;;24378:1395;;:::o;25779:170::-;25919:22;25915:1;25907:6;25903:14;25896:46;25779:170;:::o;25955:366::-;26097:3;26118:67;26182:2;26177:3;26118:67;:::i;:::-;26111:74;;26194:93;26283:3;26194:93;:::i;:::-;26312:2;26307:3;26303:12;26296:19;;25955:366;;;:::o;26327:419::-;26493:4;26531:2;26520:9;26516:18;26508:26;;26580:9;26574:4;26570:20;26566:1;26555:9;26551:17;26544:47;26608:131;26734:4;26608:131;:::i;:::-;26600:139;;26327:419;;;:::o;26752:305::-;26792:3;26811:20;26829:1;26811:20;:::i;:::-;26806:25;;26845:20;26863:1;26845:20;:::i;:::-;26840:25;;26999:1;26931:66;26927:74;26924:1;26921:81;26918:107;;;27005:18;;:::i;:::-;26918:107;27049:1;27046;27042:9;27035:16;;26752:305;;;;:::o;27063:170::-;27203:22;27199:1;27191:6;27187:14;27180:46;27063:170;:::o;27239:366::-;27381:3;27402:67;27466:2;27461:3;27402:67;:::i;:::-;27395:74;;27478:93;27567:3;27478:93;:::i;:::-;27596:2;27591:3;27587:12;27580:19;;27239:366;;;:::o;27611:419::-;27777:4;27815:2;27804:9;27800:18;27792:26;;27864:9;27858:4;27854:20;27850:1;27839:9;27835:17;27828:47;27892:131;28018:4;27892:131;:::i;:::-;27884:139;;27611:419;;;:::o;28036:226::-;28176:34;28172:1;28164:6;28160:14;28153:58;28245:9;28240:2;28232:6;28228:15;28221:34;28036:226;:::o;28268:366::-;28410:3;28431:67;28495:2;28490:3;28431:67;:::i;:::-;28424:74;;28507:93;28596:3;28507:93;:::i;:::-;28625:2;28620:3;28616:12;28609:19;;28268:366;;;:::o;28640:419::-;28806:4;28844:2;28833:9;28829:18;28821:26;;28893:9;28887:4;28883:20;28879:1;28868:9;28864:17;28857:47;28921:131;29047:4;28921:131;:::i;:::-;28913:139;;28640:419;;;:::o;29065:225::-;29205:34;29201:1;29193:6;29189:14;29182:58;29274:8;29269:2;29261:6;29257:15;29250:33;29065:225;:::o;29296:366::-;29438:3;29459:67;29523:2;29518:3;29459:67;:::i;:::-;29452:74;;29535:93;29624:3;29535:93;:::i;:::-;29653:2;29648:3;29644:12;29637:19;;29296:366;;;:::o;29668:419::-;29834:4;29872:2;29861:9;29857:18;29849:26;;29921:9;29915:4;29911:20;29907:1;29896:9;29892:17;29885:47;29949:131;30075:4;29949:131;:::i;:::-;29941:139;;29668:419;;;:::o;30093:224::-;30233:34;30229:1;30221:6;30217:14;30210:58;30302:7;30297:2;30289:6;30285:15;30278:32;30093:224;:::o;30323:366::-;30465:3;30486:67;30550:2;30545:3;30486:67;:::i;:::-;30479:74;;30562:93;30651:3;30562:93;:::i;:::-;30680:2;30675:3;30671:12;30664:19;;30323:366;;;:::o;30695:419::-;30861:4;30899:2;30888:9;30884:18;30876:26;;30948:9;30942:4;30938:20;30934:1;30923:9;30919:17;30912:47;30976:131;31102:4;30976:131;:::i;:::-;30968:139;;30695:419;;;:::o;31120:348::-;31160:7;31183:20;31201:1;31183:20;:::i;:::-;31178:25;;31217:20;31235:1;31217:20;:::i;:::-;31212:25;;31405:1;31337:66;31333:74;31330:1;31327:81;31322:1;31315:9;31308:17;31304:105;31301:131;;;31412:18;;:::i;:::-;31301:131;31460:1;31457;31453:9;31442:20;;31120:348;;;;:::o;31474:221::-;31614:34;31610:1;31602:6;31598:14;31591:58;31683:4;31678:2;31670:6;31666:15;31659:29;31474:221;:::o;31701:366::-;31843:3;31864:67;31928:2;31923:3;31864:67;:::i;:::-;31857:74;;31940:93;32029:3;31940:93;:::i;:::-;32058:2;32053:3;32049:12;32042:19;;31701:366;;;:::o;32073:419::-;32239:4;32277:2;32266:9;32262:18;32254:26;;32326:9;32320:4;32316:20;32312:1;32301:9;32297:17;32290:47;32354:131;32480:4;32354:131;:::i;:::-;32346:139;;32073:419;;;:::o;32498:221::-;32638:34;32634:1;32626:6;32622:14;32615:58;32707:4;32702:2;32694:6;32690:15;32683:29;32498:221;:::o;32725:366::-;32867:3;32888:67;32952:2;32947:3;32888:67;:::i;:::-;32881:74;;32964:93;33053:3;32964:93;:::i;:::-;33082:2;33077:3;33073:12;33066:19;;32725:366;;;:::o;33097:419::-;33263:4;33301:2;33290:9;33286:18;33278:26;;33350:9;33344:4;33340:20;33336:1;33325:9;33321:17;33314:47;33378:131;33504:4;33378:131;:::i;:::-;33370:139;;33097:419;;;:::o;33522:234::-;33662:34;33658:1;33650:6;33646:14;33639:58;33731:17;33726:2;33718:6;33714:15;33707:42;33522:234;:::o;33762:366::-;33904:3;33925:67;33989:2;33984:3;33925:67;:::i;:::-;33918:74;;34001:93;34090:3;34001:93;:::i;:::-;34119:2;34114:3;34110:12;34103:19;;33762:366;;;:::o;34134:419::-;34300:4;34338:2;34327:9;34323:18;34315:26;;34387:9;34381:4;34377:20;34373:1;34362:9;34358:17;34351:47;34415:131;34541:4;34415:131;:::i;:::-;34407:139;;34134:419;;;:::o;34559:148::-;34661:11;34698:3;34683:18;;34559:148;;;;:::o;34713:377::-;34819:3;34847:39;34880:5;34847:39;:::i;:::-;34902:89;34984:6;34979:3;34902:89;:::i;:::-;34895:96;;35000:52;35045:6;35040:3;35033:4;35026:5;35022:16;35000:52;:::i;:::-;35077:6;35072:3;35068:16;35061:23;;34823:267;34713:377;;;;:::o;35120:874::-;35223:3;35260:5;35254:12;35289:36;35315:9;35289:36;:::i;:::-;35341:89;35423:6;35418:3;35341:89;:::i;:::-;35334:96;;35461:1;35450:9;35446:17;35477:1;35472:166;;;;35652:1;35647:341;;;;35439:549;;35472:166;35556:4;35552:9;35541;35537:25;35532:3;35525:38;35618:6;35611:14;35604:22;35596:6;35592:35;35587:3;35583:45;35576:52;;35472:166;;35647:341;35714:38;35746:5;35714:38;:::i;:::-;35774:1;35788:154;35802:6;35799:1;35796:13;35788:154;;;35876:7;35870:14;35866:1;35861:3;35857:11;35850:35;35926:1;35917:7;35913:15;35902:26;;35824:4;35821:1;35817:12;35812:17;;35788:154;;;35971:6;35966:3;35962:16;35955:23;;35654:334;;35439:549;;35227:767;;35120:874;;;;:::o;36000:589::-;36225:3;36247:95;36338:3;36329:6;36247:95;:::i;:::-;36240:102;;36359:95;36450:3;36441:6;36359:95;:::i;:::-;36352:102;;36471:92;36559:3;36550:6;36471:92;:::i;:::-;36464:99;;36580:3;36573:10;;36000:589;;;;;;:::o;36595:225::-;36735:34;36731:1;36723:6;36719:14;36712:58;36804:8;36799:2;36791:6;36787:15;36780:33;36595:225;:::o;36826:366::-;36968:3;36989:67;37053:2;37048:3;36989:67;:::i;:::-;36982:74;;37065:93;37154:3;37065:93;:::i;:::-;37183:2;37178:3;37174:12;37167:19;;36826:366;;;:::o;37198:419::-;37364:4;37402:2;37391:9;37387:18;37379:26;;37451:9;37445:4;37441:20;37437:1;37426:9;37422:17;37415:47;37479:131;37605:4;37479:131;:::i;:::-;37471:139;;37198:419;;;:::o;37623:224::-;37763:34;37759:1;37751:6;37747:14;37740:58;37832:7;37827:2;37819:6;37815:15;37808:32;37623:224;:::o;37853:366::-;37995:3;38016:67;38080:2;38075:3;38016:67;:::i;:::-;38009:74;;38092:93;38181:3;38092:93;:::i;:::-;38210:2;38205:3;38201:12;38194:19;;37853:366;;;:::o;38225:419::-;38391:4;38429:2;38418:9;38414:18;38406:26;;38478:9;38472:4;38468:20;38464:1;38453:9;38449:17;38442:47;38506:131;38632:4;38506:131;:::i;:::-;38498:139;;38225:419;;;:::o;38650:223::-;38790:34;38786:1;38778:6;38774:14;38767:58;38859:6;38854:2;38846:6;38842:15;38835:31;38650:223;:::o;38879:366::-;39021:3;39042:67;39106:2;39101:3;39042:67;:::i;:::-;39035:74;;39118:93;39207:3;39118:93;:::i;:::-;39236:2;39231:3;39227:12;39220:19;;38879:366;;;:::o;39251:419::-;39417:4;39455:2;39444:9;39440:18;39432:26;;39504:9;39498:4;39494:20;39490:1;39479:9;39475:17;39468:47;39532:131;39658:4;39532:131;:::i;:::-;39524:139;;39251:419;;;:::o;39676:191::-;39716:4;39736:20;39754:1;39736:20;:::i;:::-;39731:25;;39770:20;39788:1;39770:20;:::i;:::-;39765:25;;39809:1;39806;39803:8;39800:34;;;39814:18;;:::i;:::-;39800:34;39859:1;39856;39852:9;39844:17;;39676:191;;;;:::o;39873:182::-;40013:34;40009:1;40001:6;39997:14;39990:58;39873:182;:::o;40061:366::-;40203:3;40224:67;40288:2;40283:3;40224:67;:::i;:::-;40217:74;;40300:93;40389:3;40300:93;:::i;:::-;40418:2;40413:3;40409:12;40402:19;;40061:366;;;:::o;40433:419::-;40599:4;40637:2;40626:9;40622:18;40614:26;;40686:9;40680:4;40676:20;40672:1;40661:9;40657:17;40650:47;40714:131;40840:4;40714:131;:::i;:::-;40706:139;;40433:419;;;:::o;40858:175::-;40998:27;40994:1;40986:6;40982:14;40975:51;40858:175;:::o;41039:366::-;41181:3;41202:67;41266:2;41261:3;41202:67;:::i;:::-;41195:74;;41278:93;41367:3;41278:93;:::i;:::-;41396:2;41391:3;41387:12;41380:19;;41039:366;;;:::o;41411:419::-;41577:4;41615:2;41604:9;41600:18;41592:26;;41664:9;41658:4;41654:20;41650:1;41639:9;41635:17;41628:47;41692:131;41818:4;41692:131;:::i;:::-;41684:139;;41411:419;;;:::o;41836:237::-;41976:34;41972:1;41964:6;41960:14;41953:58;42045:20;42040:2;42032:6;42028:15;42021:45;41836:237;:::o;42079:366::-;42221:3;42242:67;42306:2;42301:3;42242:67;:::i;:::-;42235:74;;42318:93;42407:3;42318:93;:::i;:::-;42436:2;42431:3;42427:12;42420:19;;42079:366;;;:::o;42451:419::-;42617:4;42655:2;42644:9;42640:18;42632:26;;42704:9;42698:4;42694:20;42690:1;42679:9;42675:17;42668:47;42732:131;42858:4;42732:131;:::i;:::-;42724:139;;42451:419;;;:::o;42876:180::-;42924:77;42921:1;42914:88;43021:4;43018:1;43011:15;43045:4;43042:1;43035:15;43062:185;43102:1;43119:20;43137:1;43119:20;:::i;:::-;43114:25;;43153:20;43171:1;43153:20;:::i;:::-;43148:25;;43192:1;43182:35;;43197:18;;:::i;:::-;43182:35;43239:1;43236;43232:9;43227:14;;43062:185;;;;:::o;43253:176::-;43285:1;43302:20;43320:1;43302:20;:::i;:::-;43297:25;;43336:20;43354:1;43336:20;:::i;:::-;43331:25;;43375:1;43365:35;;43380:18;;:::i;:::-;43365:35;43421:1;43418;43414:9;43409:14;;43253:176;;;;:::o;43435:98::-;43486:6;43520:5;43514:12;43504:22;;43435:98;;;:::o;43539:168::-;43622:11;43656:6;43651:3;43644:19;43696:4;43691:3;43687:14;43672:29;;43539:168;;;;:::o;43713:360::-;43799:3;43827:38;43859:5;43827:38;:::i;:::-;43881:70;43944:6;43939:3;43881:70;:::i;:::-;43874:77;;43960:52;44005:6;44000:3;43993:4;43986:5;43982:16;43960:52;:::i;:::-;44037:29;44059:6;44037:29;:::i;:::-;44032:3;44028:39;44021:46;;43803:270;43713:360;;;;:::o;44079:640::-;44274:4;44312:3;44301:9;44297:19;44289:27;;44326:71;44394:1;44383:9;44379:17;44370:6;44326:71;:::i;:::-;44407:72;44475:2;44464:9;44460:18;44451:6;44407:72;:::i;:::-;44489;44557:2;44546:9;44542:18;44533:6;44489:72;:::i;:::-;44608:9;44602:4;44598:20;44593:2;44582:9;44578:18;44571:48;44636:76;44707:4;44698:6;44636:76;:::i;:::-;44628:84;;44079:640;;;;;;;:::o;44725:141::-;44781:5;44812:6;44806:13;44797:22;;44828:32;44854:5;44828:32;:::i;:::-;44725:141;;;;:::o;44872:349::-;44941:6;44990:2;44978:9;44969:7;44965:23;44961:32;44958:119;;;44996:79;;:::i;:::-;44958:119;45116:1;45141:63;45196:7;45187:6;45176:9;45172:22;45141:63;:::i;:::-;45131:73;;45087:127;44872:349;;;;:::o;45227:182::-;45367:34;45363:1;45355:6;45351:14;45344:58;45227:182;:::o;45415:366::-;45557:3;45578:67;45642:2;45637:3;45578:67;:::i;:::-;45571:74;;45654:93;45743:3;45654:93;:::i;:::-;45772:2;45767:3;45763:12;45756:19;;45415:366;;;:::o;45787:419::-;45953:4;45991:2;45980:9;45976:18;45968:26;;46040:9;46034:4;46030:20;46026:1;46015:9;46011:17;46004:47;46068:131;46194:4;46068:131;:::i;:::-;46060:139;;45787:419;;;:::o;46212:178::-;46352:30;46348:1;46340:6;46336:14;46329:54;46212:178;:::o;46396:366::-;46538:3;46559:67;46623:2;46618:3;46559:67;:::i;:::-;46552:74;;46635:93;46724:3;46635:93;:::i;:::-;46753:2;46748:3;46744:12;46737:19;;46396:366;;;:::o;46768:419::-;46934:4;46972:2;46961:9;46957:18;46949:26;;47021:9;47015:4;47011:20;47007:1;46996:9;46992:17;46985:47;47049:131;47175:4;47049:131;:::i;:::-;47041:139;;46768:419;;;:::o

Swarm Source

ipfs://6316717151c2ef10d7bf407d465bf46a5d9c831b299cdfbaefdb3dbef160b88d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.