ETH Price: $3,333.23 (-3.81%)
Gas: 2 Gwei

Token

MarsWaWa (MWW)
 

Overview

Max Total Supply

3,056 MWW

Holders

737

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
limeflash.eth
Balance
1 MWW
0x489b552990876e3151f1ac08c1c6ecbc34b15289
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:
MarsWawa

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// 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/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// 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/security/Pausable.sol


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

pragma solidity ^0.8.0;


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

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

    bool private _paused;

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: MarsWawa.sol


pragma solidity ^0.8.4;

contract MarsWawa is ERC721, ERC721Enumerable, Pausable, Ownable, ReentrancyGuard {

  enum Stage {Pending, OGMint, WLMint, PublicSale, Publish}

  uint16 public constant MaxSupply = 3333;
  uint8 public constant MaxMint = 1;
  uint16 public constant ReserveCount = 200;
  uint16 public constant FreeMintCount = 1600;
  uint16 public constant Royalty = 750; 
  uint256 public constant PublicPrice = 0.00777 ether;

  uint256 public lastTime = 0; 

  using Counters for Counters.Counter;
  Counters.Counter private _tokenIdCounter;

  struct WLUser {
    uint8 count;
    bool isOG;
    bool isWL;
  }

  mapping (address => WLUser) private wlUsers;

  uint16 public ogCount = 0; 
  uint16 public wlCount = 0; 
  uint16 public freeCount = FreeMintCount; 
  uint16 public mintCount = MaxSupply - ReserveCount; 

  string private _uri;
  Stage private _stage = Stage.Pending;

  string private _contractURI = "ipfs://QmNkYsBzuSGtFdkUmwDimoqPd7UdfkmCHmzHyqvymz2EfH";

  constructor(string memory uri) ERC721("MarsWaWa", "MWW") {
    _uri = uri;
  }

  // region Stage

  modifier onlyStage(Stage stage_) {
    require(stage_ == _stage, "It's not right stage.");
    _;
  }

  function getStage() public view returns(Stage) {
    return _stage;
  }

  function setStage(Stage stage) public onlyOwner {
    lastTime = block.timestamp;
    _stage = stage;
  }

  // endregion

  // region URI

  function setURI(string memory baseURI_) public onlyOwner{
    _uri = baseURI_;
  }

  function _baseURI() override(ERC721) internal view returns (string memory){
    return _uri;
  }

  function tokenURI(uint256 tokenId) public view virtual override(ERC721) returns (string memory) {
    require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
    return super.tokenURI(_stage < Stage.Publish ? 0 : tokenId);
  }

  function _exists(uint256 tokenId) internal view virtual override(ERC721) returns (bool) {
    return tokenId == 0 ? true : super._exists(tokenId);
  }

  function setContractURI(string memory baseURI_) public onlyOwner{
    _contractURI = baseURI_;
  }

  function contractURI() public view returns (string memory) {
    return _contractURI;
  }

  // endregion

  // region Pause

  function setPause(bool value) public onlyOwner {
    value ? _pause() : _unpause();
  }

  // endregion

  // region Override

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

  function release() public onlyOwner {
    uint256 balance_ = address(this).balance;
    payable(address(owner())).transfer(balance_);
  }

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

  // endregion

  // region WhiteList

  function isOG(address sender) public view returns(bool){
    return wlUsers[sender].isOG;
  }
  function isWL(address sender) public view returns(bool){
    return wlUsers[sender].isWL;
  }
  function isWLMintEnable(address sender, uint8 num) public view returns(bool){
    return wlUsers[sender].count >= num;
  }

  function addOG(address[] calldata members) public onlyOwner {
    for (uint256 i = 0; i < members.length; i++)
      _addWL(members[i], true);
  }
  function addWL(address[] calldata members) public onlyOwner {
    for (uint256 i = 0; i < members.length; i++)
      _addWL(members[i], false);
  }
  function _addWL(address m, bool isOG_) private onlyOwner {
    if (isWL(m)) return;
    wlUsers[m] = WLUser(MaxMint, isOG_, true);
    if (isOG_) ogCount += wlUsers[m].count;
    wlCount += wlUsers[m].count;
  }

  function removeOG(address[] calldata members) public onlyOwner {
    for (uint256 i = 0; i < members.length; i++)
      _removeWL(members[i], true);
  }
  function removeWL(address[] calldata members) public onlyOwner {
    for (uint256 i = 0; i < members.length; i++)
      _removeWL(members[i], false);
  }
  function _removeWL(address m, bool isOG_) private onlyOwner {
    if (isOG_ ? !isOG(m) : (isOG(m) || !isWL(m))) return;
    if (isOG_) ogCount -= wlUsers[m].count;
    wlCount -= wlUsers[m].count;
    wlUsers[m] = WLUser(0, false, false);
  }

  // endregion

  // region Mint

  function ogMint(uint8 num) public onlyStage(Stage.OGMint) nonReentrant payable {
    _WLMint(num, true);
  }
  function wlMint(uint8 num) public onlyStage(Stage.WLMint) nonReentrant payable {
    _WLMint(num, false);
  }
  function _WLMint(uint8 num, bool isOG_) private {
    require(freeCount >= num, "Free mint is over!");
    require(isOG_ ? isOG(msg.sender) : isWL(msg.sender), "The address not in WL/OG");
    require(isWLMintEnable(msg.sender, num), "The address have minted");

    safeMint(msg.sender, num);

    wlUsers[msg.sender].count -= num;
    if (isOG_) ogCount -= num; wlCount -= num;

    freeCount -= num; mintCount -= num;
  }

  function mint(uint8 num) public onlyStage(Stage.PublicSale) nonReentrant payable {
    require(mintCount >= num, "All tokens have been minted!");

    uint balance = balanceOf(msg.sender);
    require(balance + num <= MaxMint, strConcat("The address have minted", Strings.toString(num)));

    uint totalPrice = num * PublicPrice;
    require(msg.value >= totalPrice, strConcat("Lack of ETH: ",
      strConcat(Strings.toString(msg.value), strConcat(" -> ", Strings.toString(totalPrice)))));

    safeMint(msg.sender, num);
    mintCount -= num;
  }

  function safeMint(address to, uint256 num) private {
    require(num > 0, "Can't mint zero NFT");

    for (uint256 i = 0; i < num; i++) {
      _tokenIdCounter.increment();
      uint256 current_ = _tokenIdCounter.current();
      require(current_ <= MaxSupply, "All NFTs have already been minted.");
      _safeMint(to, current_);
    }
  }

  function reserve(uint256 n) public onlyOwner {
    safeMint(msg.sender, n);
  }

  // endregion

  // region Utils

  function strConcat(string memory _a, string memory _b) public pure returns (string memory){
    bytes memory _ba = bytes(_a);
    bytes memory _bb = bytes(_b);
    string memory ret = new string(_ba.length + _bb.length);
    bytes memory bret = bytes(ret);
    uint k = 0;
    for (uint i = 0; i < _ba.length; i++)bret[k++] = _ba[i];
    for (uint i = 0; i < _bb.length; i++) bret[k++] = _bb[i];
    return string(ret);
  }

  // endregion

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"FreeMintCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxMint","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PublicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ReserveCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Royalty","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"members","type":"address[]"}],"name":"addOG","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"members","type":"address[]"}],"name":"addWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStage","outputs":[{"internalType":"enum MarsWawa.Stage","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"isOG","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"isWL","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint8","name":"num","type":"uint8"}],"name":"isWLMintEnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"num","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"num","type":"uint8"}],"name":"ogMint","outputs":[],"stateMutability":"payable","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"members","type":"address[]"}],"name":"removeOG","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"members","type":"address[]"}],"name":"removeWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"n","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum MarsWawa.Stage","name":"stage","type":"uint8"}],"name":"setStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_a","type":"string"},{"internalType":"string","name":"_b","type":"string"}],"name":"strConcat","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"num","type":"uint8"}],"name":"wlMint","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600c556000600f60006101000a81548161ffff021916908361ffff1602179055506000600f60026101000a81548161ffff021916908361ffff160217905550610640600f60046101000a81548161ffff021916908361ffff16021790555060c8610d05620000759190620004df565b600f60066101000a81548161ffff021916908361ffff1602179055506000601160006101000a81548160ff02191690836004811115620000de577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506040518060600160405280603581526020016200612e60359139601290805190602001906200011492919062000319565b503480156200012257600080fd5b50604051620061633803806200616383398181016040528101906200014891906200043b565b6040518060400160405280600881526020017f4d617273576157610000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4d575700000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001cc92919062000319565b508060019080519060200190620001e592919062000319565b5050506000600a60006101000a81548160ff02191690831515021790555062000223620002176200024b60201b60201c565b6200025360201b60201c565b6001600b8190555080601090805190602001906200024392919062000319565b505062000668565b600033905090565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000327906200055e565b90600052602060002090601f0160209004810192826200034b576000855562000397565b82601f106200036657805160ff191683800117855562000397565b8280016001018555821562000397579182015b828111156200039657825182559160200191906001019062000379565b5b509050620003a69190620003aa565b5090565b5b80821115620003c5576000816000905550600101620003ab565b5090565b6000620003e0620003da84620004a9565b62000480565b905082815260208101848484011115620003f957600080fd5b6200040684828562000528565b509392505050565b600082601f8301126200042057600080fd5b815162000432848260208601620003c9565b91505092915050565b6000602082840312156200044e57600080fd5b600082015167ffffffffffffffff8111156200046957600080fd5b62000477848285016200040e565b91505092915050565b60006200048c6200049f565b90506200049a828262000594565b919050565b6000604051905090565b600067ffffffffffffffff821115620004c757620004c662000628565b5b620004d28262000657565b9050602081019050919050565b6000620004ec826200051a565b9150620004f9836200051a565b9250828210156200050f576200050e620005ca565b5b828203905092915050565b600061ffff82169050919050565b60005b83811015620005485780820151818401526020810190506200052b565b8381111562000558576000848401525b50505050565b600060028204905060018216806200057757607f821691505b602082108114156200058e576200058d620005f9565b5b50919050565b6200059f8262000657565b810181811067ffffffffffffffff82111715620005c157620005c062000628565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b615ab680620006786000396000f3fe6080604052600436106102c95760003560e01c80638c831b7011610175578063b88d4fde116100dc578063e985e9c511610095578063f6ec6ecc1161006f578063f6ec6ecc14610add578063fa04703114610b06578063fcaa766414610b31578063ff74927b14610b5c576102c9565b8063e985e9c514610a4e578063ebea113e14610a8b578063f2fde38b14610ab4576102c9565b8063b88d4fde1461092e578063bedb86fb14610957578063c83271f514610980578063c87b56dd146109bd578063ce3cd997146109fa578063e8a3d48514610a23576102c9565b806395d89b411161012e57806395d89b411461082e5780639659867e14610859578063a22cb46514610884578063a6f48c90146108ad578063ac58821d146108d8578063b36c128414610903576102c9565b80638c831b701461071c5780638da5cb5b14610759578063938e3d7b1461078457806393e9a084146107ad5780639457990a146107d857806394f7439614610803576102c9565b80634a76afe7116102345780636352211e116101ed578063715018a6116101c7578063715018a6146106a95780637f489e49146106c0578063819b25ba146106dc57806386d1a69f14610705576102c9565b80636352211e146106135780636ecd23061461065057806370a082311461066c576102c9565b80634a76afe7146104ed5780634f6ccce7146105185780635793f133146105555780635c065600146105805780635c975abb146105ab5780635fbc8bb2146105d6576102c9565b80630d4fda07116102865780630d4fda07146103ee57806318160ddd1461041757806323b872dd146104425780632f745c591461046b5780633db0ce3e146104a857806342842e0e146104c4576102c9565b806301ffc9a7146102ce57806302fe53051461030b578063046adfe61461033457806306fdde031461035d578063081812fc14610388578063095ea7b3146103c5575b600080fd5b3480156102da57600080fd5b506102f560048036038101906102f09190614430565b610b99565b6040516103029190614ac0565b60405180910390f35b34801561031757600080fd5b50610332600480360381019061032d91906144ab565b610bab565b005b34801561034057600080fd5b5061035b600480360381019061035691906143c2565b610bcd565b005b34801561036957600080fd5b50610372610c53565b60405161037f9190614af6565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa9190614558565b610ce5565b6040516103bc9190614a59565b60405180910390f35b3480156103d157600080fd5b506103ec60048036038101906103e7919061434a565b610d2b565b005b3480156103fa57600080fd5b50610415600480360381019061041091906143c2565b610e43565b005b34801561042357600080fd5b5061042c610ec9565b6040516104399190614e73565b60405180910390f35b34801561044e57600080fd5b5061046960048036038101906104649190614244565b610ed6565b005b34801561047757600080fd5b50610492600480360381019061048d919061434a565b610f36565b60405161049f9190614e73565b60405180910390f35b6104c260048036038101906104bd9190614581565b610fdb565b005b3480156104d057600080fd5b506104eb60048036038101906104e69190614244565b611103565b005b3480156104f957600080fd5b50610502611123565b60405161050f9190614e58565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a9190614558565b611128565b60405161054c9190614e73565b60405180910390f35b34801561056157600080fd5b5061056a6111bf565b6040516105779190614e58565b60405180910390f35b34801561058c57600080fd5b506105956111c5565b6040516105a29190614e73565b60405180910390f35b3480156105b757600080fd5b506105c06111d0565b6040516105cd9190614ac0565b60405180910390f35b3480156105e257600080fd5b506105fd60048036038101906105f89190614386565b6111e7565b60405161060a9190614ac0565b60405180910390f35b34801561061f57600080fd5b5061063a60048036038101906106359190614558565b61124a565b6040516106479190614a59565b60405180910390f35b61066a60048036038101906106659190614581565b6112fc565b005b34801561067857600080fd5b50610693600480360381019061068e91906141df565b611663565b6040516106a09190614e73565b60405180910390f35b3480156106b557600080fd5b506106be61171b565b005b6106da60048036038101906106d59190614581565b61172f565b005b3480156106e857600080fd5b5061070360048036038101906106fe9190614558565b611857565b005b34801561071157600080fd5b5061071a61186c565b005b34801561072857600080fd5b50610743600480360381019061073e91906141df565b6118ca565b6040516107509190614ac0565b60405180910390f35b34801561076557600080fd5b5061076e611923565b60405161077b9190614a59565b60405180910390f35b34801561079057600080fd5b506107ab60048036038101906107a691906144ab565b61194d565b005b3480156107b957600080fd5b506107c261196f565b6040516107cf9190614e73565b60405180910390f35b3480156107e457600080fd5b506107ed611975565b6040516107fa9190614e58565b60405180910390f35b34801561080f57600080fd5b50610818611989565b6040516108259190614e8e565b60405180910390f35b34801561083a57600080fd5b5061084361198e565b6040516108509190614af6565b60405180910390f35b34801561086557600080fd5b5061086e611a20565b60405161087b9190614e58565b60405180910390f35b34801561089057600080fd5b506108ab60048036038101906108a6919061430e565b611a34565b005b3480156108b957600080fd5b506108c2611a4a565b6040516108cf9190614e58565b60405180910390f35b3480156108e457600080fd5b506108ed611a5e565b6040516108fa9190614e58565b60405180910390f35b34801561090f57600080fd5b50610918611a72565b6040516109259190614e58565b60405180910390f35b34801561093a57600080fd5b5061095560048036038101906109509190614293565b611a78565b005b34801561096357600080fd5b5061097e60048036038101906109799190614407565b611ada565b005b34801561098c57600080fd5b506109a760048036038101906109a291906141df565b611b00565b6040516109b49190614ac0565b60405180910390f35b3480156109c957600080fd5b506109e460048036038101906109df9190614558565b611b59565b6040516109f19190614af6565b60405180910390f35b348015610a0657600080fd5b50610a216004803603810190610a1c9190614482565b611c41565b005b348015610a2f57600080fd5b50610a38611ca3565b604051610a459190614af6565b60405180910390f35b348015610a5a57600080fd5b50610a756004803603810190610a709190614208565b611d35565b604051610a829190614ac0565b60405180910390f35b348015610a9757600080fd5b50610ab26004803603810190610aad91906143c2565b611dc9565b005b348015610ac057600080fd5b50610adb6004803603810190610ad691906141df565b611e4f565b005b348015610ae957600080fd5b50610b046004803603810190610aff91906143c2565b611ed3565b005b348015610b1257600080fd5b50610b1b611f59565b604051610b289190614e58565b60405180910390f35b348015610b3d57600080fd5b50610b46611f5f565b604051610b539190614adb565b60405180910390f35b348015610b6857600080fd5b50610b836004803603810190610b7e91906144ec565b611f76565b604051610b909190614af6565b60405180910390f35b6000610ba4826121ca565b9050919050565b610bb3612244565b8060109080519060200190610bc9929190613f8f565b5050565b610bd5612244565b60005b82829050811015610c4e57610c3b838383818110610c1f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610c3491906141df565b60016122c2565b8080610c4690615281565b915050610bd8565b505050565b606060008054610c629061521e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8e9061521e565b8015610cdb5780601f10610cb057610100808354040283529160200191610cdb565b820191906000526020600020905b815481529060010190602001808311610cbe57829003601f168201915b5050505050905090565b6000610cf0826124c6565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d368261124a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9e90614d78565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dc6612511565b73ffffffffffffffffffffffffffffffffffffffff161480610df55750610df481610def612511565b611d35565b5b610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b90614cb8565b60405180910390fd5b610e3e8383612519565b505050565b610e4b612244565b60005b82829050811015610ec457610eb1838383818110610e95577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610eaa91906141df565b60006125d2565b8080610ebc90615281565b915050610e4e565b505050565b6000600880549050905090565b610ee7610ee1612511565b826127fd565b610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d90614df8565b60405180910390fd5b610f31838383612892565b505050565b6000610f4183611663565b8210610f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7990614b78565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6002601160009054906101000a900460ff166004811115611025577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561105e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1461109e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109590614d18565b60405180910390fd5b6002600b5414156110e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110db90614e18565b60405180910390fd5b6002600b819055506110f7826000612af9565b6001600b819055505050565b61111e83838360405180602001604052806000815250611a78565b505050565b60c881565b6000611132610ec9565b8210611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116a90614dd8565b60405180910390fd5b600882815481106111ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b61064081565b661b9ac619e7a00081565b6000600a60009054906101000a900460ff16905090565b60008160ff16600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff161015905092915050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ea90614d58565b60405180910390fd5b80915050919050565b6003601160009054906101000a900460ff166004811115611346577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561137f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146113bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b690614d18565b60405180910390fd5b6002600b541415611405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fc90614e18565b60405180910390fd5b6002600b819055508160ff16600f60069054906101000a900461ffff1661ffff161015611467576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145e90614d98565b60405180910390fd5b600061147233611663565b9050600160ff168360ff16826114889190614fab565b11156114d46040518060400160405280601781526020017f54686520616464726573732068617665206d696e7465640000000000000000008152506114cf8660ff16612d76565b611f76565b90611515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150c9190614af6565b60405180910390fd5b506000661b9ac619e7a0008460ff1661152e9190615032565b9050803410156115ca6040518060400160405280600d81526020017f4c61636b206f66204554483a20000000000000000000000000000000000000008152506115c561157934612d76565b6115c06040518060400160405280600481526020017f202d3e20000000000000000000000000000000000000000000000000000000008152506115bb88612d76565b611f76565b611f76565b611f76565b9061160b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116029190614af6565b60405180910390fd5b50611619338560ff16612f23565b8360ff16600f60068282829054906101000a900461ffff1661163b919061508c565b92506101000a81548161ffff021916908361ffff16021790555050506001600b819055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cb90614c78565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611723612244565b61172d6000612ff5565b565b6001601160009054906101000a900460ff166004811115611779577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156117b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146117f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e990614d18565b60405180910390fd5b6002600b541415611838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182f90614e18565b60405180910390fd5b6002600b8190555061184b826001612af9565b6001600b819055505050565b61185f612244565b6118693382612f23565b50565b611874612244565b6000479050611881611923565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156118c6573d6000803e3d6000fd5b5050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160029054906101000a900460ff169050919050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611955612244565b806012908051906020019061196b929190613f8f565b5050565b600c5481565b600f60009054906101000a900461ffff1681565b600181565b60606001805461199d9061521e565b80601f01602080910402602001604051908101604052809291908181526020018280546119c99061521e565b8015611a165780601f106119eb57610100808354040283529160200191611a16565b820191906000526020600020905b8154815290600101906020018083116119f957829003601f168201915b5050505050905090565b600f60069054906101000a900461ffff1681565b611a46611a3f612511565b83836130bb565b5050565b600f60049054906101000a900461ffff1681565b600f60029054906101000a900461ffff1681565b610d0581565b611a89611a83612511565b836127fd565b611ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abf90614df8565b60405180910390fd5b611ad484848484613228565b50505050565b611ae2612244565b80611af457611aef613284565b611afd565b611afc6132e7565b5b50565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff169050919050565b6060611b648261334a565b611ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9a90614d38565b60405180910390fd5b611c3a600480811115611bdf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b601160009054906101000a900460ff166004811115611c27577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b10611c325782611c35565b60005b61336b565b9050919050565b611c49612244565b42600c8190555080601160006101000a81548160ff02191690836004811115611c9b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555050565b606060128054611cb29061521e565b80601f0160208091040260200160405190810160405280929190818152602001828054611cde9061521e565b8015611d2b5780601f10611d0057610100808354040283529160200191611d2b565b820191906000526020600020905b815481529060010190602001808311611d0e57829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611dd1612244565b60005b82829050811015611e4a57611e37838383818110611e1b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611e3091906141df565b60006122c2565b8080611e4290615281565b915050611dd4565b505050565b611e57612244565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebe90614bb8565b60405180910390fd5b611ed081612ff5565b50565b611edb612244565b60005b82829050811015611f5457611f41838383818110611f25577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611f3a91906141df565b60016125d2565b8080611f4c90615281565b915050611ede565b505050565b6102ee81565b6000601160009054906101000a900460ff16905090565b606060008390506000839050600081518351611f929190614fab565b67ffffffffffffffff811115611fd1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120035781602001600182028036833780820191505090505b50905060008190506000805b85518110156120e357858181518110612051577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b83838061206890615281565b9450815181106120a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806120db90615281565b91505061200f565b5060005b84518110156121bb57848181518110612129577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b83838061214090615281565b945081518110612179577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806121b390615281565b9150506120e7565b50829550505050505092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061223d575061223c826133d3565b5b9050919050565b61224c612511565b73ffffffffffffffffffffffffffffffffffffffff1661226a611923565b73ffffffffffffffffffffffffffffffffffffffff16146122c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b790614cf8565b60405180910390fd5b565b6122ca612244565b6122d3826118ca565b156122dd576124c2565b6040518060600160405280600160ff168152602001821515815260200160011515815250600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff021916908315150217905550905050801561243657600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff16600f60008282829054906101000a900461ffff1661241b9190614f73565b92506101000a81548161ffff021916908361ffff1602179055505b600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff16600f60028282829054906101000a900461ffff166124a79190614f73565b92506101000a81548161ffff021916908361ffff1602179055505b5050565b6124cf8161334a565b61250e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250590614d58565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661258c8361124a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6125da612244565b806125fe576125e882611b00565b806125f957506125f7826118ca565b155b612609565b61260782611b00565b155b15612613576127f9565b80156126a557600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff16600f60008282829054906101000a900461ffff1661268a919061508c565b92506101000a81548161ffff021916908361ffff1602179055505b600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff16600f60028282829054906101000a900461ffff16612716919061508c565b92506101000a81548161ffff021916908361ffff1602179055506040518060600160405280600060ff16815260200160001515815260200160001515815250600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff0219169083151502179055509050505b5050565b6000806128098361124a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061284b575061284a8185611d35565b5b8061288957508373ffffffffffffffffffffffffffffffffffffffff1661287184610ce5565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128b28261124a565b73ffffffffffffffffffffffffffffffffffffffff1614612908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ff90614bd8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296f90614c18565b60405180910390fd5b6129838383836134b5565b61298e600082612519565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129de91906150c0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a359190614fab565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612af48383836134cd565b505050565b8160ff16600f60049054906101000a900461ffff1661ffff161015612b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4a90614b38565b60405180910390fd5b80612b6657612b61336118ca565b612b70565b612b6f33611b00565b5b612baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba690614db8565b60405180910390fd5b612bb933836111e7565b612bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bef90614c98565b60405180910390fd5b612c05338360ff16612f23565b81600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900460ff16612c6391906150f4565b92506101000a81548160ff021916908360ff1602179055508015612cbe578160ff16600f60008282829054906101000a900461ffff16612ca3919061508c565b92506101000a81548161ffff021916908361ffff1602179055505b8160ff16600f60028282829054906101000a900461ffff16612ce0919061508c565b92506101000a81548161ffff021916908361ffff1602179055508160ff16600f60048282829054906101000a900461ffff16612d1c919061508c565b92506101000a81548161ffff021916908361ffff1602179055508160ff16600f60068282829054906101000a900461ffff16612d58919061508c565b92506101000a81548161ffff021916908361ffff1602179055505050565b60606000821415612dbe576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f1e565b600082905060005b60008214612df0578080612dd990615281565b915050600a82612de99190615001565b9150612dc6565b60008167ffffffffffffffff811115612e32577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612e645781602001600182028036833780820191505090505b5090505b60008514612f1757600182612e7d91906150c0565b9150600a85612e8c91906152ca565b6030612e989190614fab565b60f81b818381518110612ed4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f109190615001565b9450612e68565b8093505050505b919050565b60008111612f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5d90614e38565b60405180910390fd5b60005b81811015612ff057612f7b600d6134d2565b6000612f87600d6134e8565b9050610d0561ffff16811115612fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc990614b58565b60405180910390fd5b612fdc84826134f6565b508080612fe890615281565b915050612f69565b505050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561312a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312190614c38565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161321b9190614ac0565b60405180910390a3505050565b613233848484612892565b61323f84848484613514565b61327e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327590614b98565b60405180910390fd5b50505050565b61328c6136ab565b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6132d0612511565b6040516132dd9190614a59565b60405180910390a1565b6132ef6136f4565b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613333612511565b6040516133409190614a59565b60405180910390a1565b60008082146133615761335c8261373e565b613364565b60015b9050919050565b6060613376826124c6565b60006133806137aa565b905060008151116133a057604051806020016040528060008152506133cb565b806133aa84612d76565b6040516020016133bb929190614a35565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061349e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806134ae57506134ad8261383c565b5b9050919050565b6134bd6136f4565b6134c88383836138a6565b505050565b505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b6135108282604051806020016040528060008152506139ba565b5050565b60006135358473ffffffffffffffffffffffffffffffffffffffff16613a15565b1561369e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261355e612511565b8786866040518563ffffffff1660e01b81526004016135809493929190614a74565b602060405180830381600087803b15801561359a57600080fd5b505af19250505080156135cb57506040513d601f19601f820116820180604052508101906135c89190614459565b60015b61364e573d80600081146135fb576040519150601f19603f3d011682016040523d82523d6000602084013e613600565b606091505b50600081511415613646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161363d90614b98565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506136a3565b600190505b949350505050565b6136b36111d0565b6136f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136e990614b18565b60405180910390fd5b565b6136fc6111d0565b1561373c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161373390614c58565b60405180910390fd5b565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060601080546137b99061521e565b80601f01602080910402602001604051908101604052809291908181526020018280546137e59061521e565b80156138325780601f1061380757610100808354040283529160200191613832565b820191906000526020600020905b81548152906001019060200180831161381557829003601f168201915b5050505050905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6138b1838383613a38565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156138f4576138ef81613a3d565b613933565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613932576139318382613a86565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139765761397181613bf3565b6139b5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146139b4576139b38282613d36565b5b5b505050565b6139c48383613db5565b6139d16000848484613514565b613a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0790614b98565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613a9384611663565b613a9d91906150c0565b9050600060076000848152602001908152602001600020549050818114613b82576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613c0791906150c0565b9050600060096000848152602001908152602001600020549050600060088381548110613c5d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613ca5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613d1a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613d4183611663565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e1c90614cd8565b60405180910390fd5b613e2e8161334a565b15613e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e6590614bf8565b60405180910390fd5b613e7a600083836134b5565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613eca9190614fab565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613f8b600083836134cd565b5050565b828054613f9b9061521e565b90600052602060002090601f016020900481019282613fbd5760008555614004565b82601f10613fd657805160ff1916838001178555614004565b82800160010185558215614004579182015b82811115614003578251825591602001919060010190613fe8565b5b5090506140119190614015565b5090565b5b8082111561402e576000816000905550600101614016565b5090565b600061404561404084614ece565b614ea9565b90508281526020810184848401111561405d57600080fd5b6140688482856151dc565b509392505050565b600061408361407e84614eff565b614ea9565b90508281526020810184848401111561409b57600080fd5b6140a68482856151dc565b509392505050565b6000813590506140bd816159fd565b92915050565b60008083601f8401126140d557600080fd5b8235905067ffffffffffffffff8111156140ee57600080fd5b60208301915083602082028301111561410657600080fd5b9250929050565b60008135905061411c81615a14565b92915050565b60008135905061413181615a2b565b92915050565b60008151905061414681615a2b565b92915050565b600082601f83011261415d57600080fd5b813561416d848260208601614032565b91505092915050565b60008135905061418581615a42565b92915050565b600082601f83011261419c57600080fd5b81356141ac848260208601614070565b91505092915050565b6000813590506141c481615a52565b92915050565b6000813590506141d981615a69565b92915050565b6000602082840312156141f157600080fd5b60006141ff848285016140ae565b91505092915050565b6000806040838503121561421b57600080fd5b6000614229858286016140ae565b925050602061423a858286016140ae565b9150509250929050565b60008060006060848603121561425957600080fd5b6000614267868287016140ae565b9350506020614278868287016140ae565b9250506040614289868287016141b5565b9150509250925092565b600080600080608085870312156142a957600080fd5b60006142b7878288016140ae565b94505060206142c8878288016140ae565b93505060406142d9878288016141b5565b925050606085013567ffffffffffffffff8111156142f657600080fd5b6143028782880161414c565b91505092959194509250565b6000806040838503121561432157600080fd5b600061432f858286016140ae565b92505060206143408582860161410d565b9150509250929050565b6000806040838503121561435d57600080fd5b600061436b858286016140ae565b925050602061437c858286016141b5565b9150509250929050565b6000806040838503121561439957600080fd5b60006143a7858286016140ae565b92505060206143b8858286016141ca565b9150509250929050565b600080602083850312156143d557600080fd5b600083013567ffffffffffffffff8111156143ef57600080fd5b6143fb858286016140c3565b92509250509250929050565b60006020828403121561441957600080fd5b60006144278482850161410d565b91505092915050565b60006020828403121561444257600080fd5b600061445084828501614122565b91505092915050565b60006020828403121561446b57600080fd5b600061447984828501614137565b91505092915050565b60006020828403121561449457600080fd5b60006144a284828501614176565b91505092915050565b6000602082840312156144bd57600080fd5b600082013567ffffffffffffffff8111156144d757600080fd5b6144e38482850161418b565b91505092915050565b600080604083850312156144ff57600080fd5b600083013567ffffffffffffffff81111561451957600080fd5b6145258582860161418b565b925050602083013567ffffffffffffffff81111561454257600080fd5b61454e8582860161418b565b9150509250929050565b60006020828403121561456a57600080fd5b6000614578848285016141b5565b91505092915050565b60006020828403121561459357600080fd5b60006145a1848285016141ca565b91505092915050565b6145b381615128565b82525050565b6145c28161513a565b82525050565b60006145d382614f30565b6145dd8185614f46565b93506145ed8185602086016151eb565b6145f6816153e6565b840191505092915050565b61460a816151ca565b82525050565b600061461b82614f3b565b6146258185614f57565b93506146358185602086016151eb565b61463e816153e6565b840191505092915050565b600061465482614f3b565b61465e8185614f68565b935061466e8185602086016151eb565b80840191505092915050565b6000614687601483614f57565b9150614692826153f7565b602082019050919050565b60006146aa601283614f57565b91506146b582615420565b602082019050919050565b60006146cd602283614f57565b91506146d882615449565b604082019050919050565b60006146f0602b83614f57565b91506146fb82615498565b604082019050919050565b6000614713603283614f57565b915061471e826154e7565b604082019050919050565b6000614736602683614f57565b915061474182615536565b604082019050919050565b6000614759602583614f57565b915061476482615585565b604082019050919050565b600061477c601c83614f57565b9150614787826155d4565b602082019050919050565b600061479f602483614f57565b91506147aa826155fd565b604082019050919050565b60006147c2601983614f57565b91506147cd8261564c565b602082019050919050565b60006147e5601083614f57565b91506147f082615675565b602082019050919050565b6000614808602983614f57565b91506148138261569e565b604082019050919050565b600061482b601783614f57565b9150614836826156ed565b602082019050919050565b600061484e603e83614f57565b915061485982615716565b604082019050919050565b6000614871602083614f57565b915061487c82615765565b602082019050919050565b6000614894602083614f57565b915061489f8261578e565b602082019050919050565b60006148b7601583614f57565b91506148c2826157b7565b602082019050919050565b60006148da602f83614f57565b91506148e5826157e0565b604082019050919050565b60006148fd601883614f57565b91506149088261582f565b602082019050919050565b6000614920602183614f57565b915061492b82615858565b604082019050919050565b6000614943601c83614f57565b915061494e826158a7565b602082019050919050565b6000614966601883614f57565b9150614971826158d0565b602082019050919050565b6000614989602c83614f57565b9150614994826158f9565b604082019050919050565b60006149ac602e83614f57565b91506149b782615948565b604082019050919050565b60006149cf601f83614f57565b91506149da82615997565b602082019050919050565b60006149f2601383614f57565b91506149fd826159c0565b602082019050919050565b614a1181615185565b82525050565b614a20816151b3565b82525050565b614a2f816151bd565b82525050565b6000614a418285614649565b9150614a4d8284614649565b91508190509392505050565b6000602082019050614a6e60008301846145aa565b92915050565b6000608082019050614a8960008301876145aa565b614a9660208301866145aa565b614aa36040830185614a17565b8181036060830152614ab581846145c8565b905095945050505050565b6000602082019050614ad560008301846145b9565b92915050565b6000602082019050614af06000830184614601565b92915050565b60006020820190508181036000830152614b108184614610565b905092915050565b60006020820190508181036000830152614b318161467a565b9050919050565b60006020820190508181036000830152614b518161469d565b9050919050565b60006020820190508181036000830152614b71816146c0565b9050919050565b60006020820190508181036000830152614b91816146e3565b9050919050565b60006020820190508181036000830152614bb181614706565b9050919050565b60006020820190508181036000830152614bd181614729565b9050919050565b60006020820190508181036000830152614bf18161474c565b9050919050565b60006020820190508181036000830152614c118161476f565b9050919050565b60006020820190508181036000830152614c3181614792565b9050919050565b60006020820190508181036000830152614c51816147b5565b9050919050565b60006020820190508181036000830152614c71816147d8565b9050919050565b60006020820190508181036000830152614c91816147fb565b9050919050565b60006020820190508181036000830152614cb18161481e565b9050919050565b60006020820190508181036000830152614cd181614841565b9050919050565b60006020820190508181036000830152614cf181614864565b9050919050565b60006020820190508181036000830152614d1181614887565b9050919050565b60006020820190508181036000830152614d31816148aa565b9050919050565b60006020820190508181036000830152614d51816148cd565b9050919050565b60006020820190508181036000830152614d71816148f0565b9050919050565b60006020820190508181036000830152614d9181614913565b9050919050565b60006020820190508181036000830152614db181614936565b9050919050565b60006020820190508181036000830152614dd181614959565b9050919050565b60006020820190508181036000830152614df18161497c565b9050919050565b60006020820190508181036000830152614e118161499f565b9050919050565b60006020820190508181036000830152614e31816149c2565b9050919050565b60006020820190508181036000830152614e51816149e5565b9050919050565b6000602082019050614e6d6000830184614a08565b92915050565b6000602082019050614e886000830184614a17565b92915050565b6000602082019050614ea36000830184614a26565b92915050565b6000614eb3614ec4565b9050614ebf8282615250565b919050565b6000604051905090565b600067ffffffffffffffff821115614ee957614ee86153b7565b5b614ef2826153e6565b9050602081019050919050565b600067ffffffffffffffff821115614f1a57614f196153b7565b5b614f23826153e6565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f7e82615185565b9150614f8983615185565b92508261ffff03821115614fa057614f9f6152fb565b5b828201905092915050565b6000614fb6826151b3565b9150614fc1836151b3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ff657614ff56152fb565b5b828201905092915050565b600061500c826151b3565b9150615017836151b3565b9250826150275761502661532a565b5b828204905092915050565b600061503d826151b3565b9150615048836151b3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615081576150806152fb565b5b828202905092915050565b600061509782615185565b91506150a283615185565b9250828210156150b5576150b46152fb565b5b828203905092915050565b60006150cb826151b3565b91506150d6836151b3565b9250828210156150e9576150e86152fb565b5b828203905092915050565b60006150ff826151bd565b915061510a836151bd565b92508282101561511d5761511c6152fb565b5b828203905092915050565b600061513382615193565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050615180826159e9565b919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006151d582615172565b9050919050565b82818337600083830152505050565b60005b838110156152095780820151818401526020810190506151ee565b83811115615218576000848401525b50505050565b6000600282049050600182168061523657607f821691505b6020821081141561524a57615249615388565b5b50919050565b615259826153e6565b810181811067ffffffffffffffff82111715615278576152776153b7565b5b80604052505050565b600061528c826151b3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152bf576152be6152fb565b5b600182019050919050565b60006152d5826151b3565b91506152e0836151b3565b9250826152f0576152ef61532a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f46726565206d696e74206973206f766572210000000000000000000000000000600082015250565b7f416c6c204e465473206861766520616c7265616479206265656e206d696e746560008201527f642e000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f54686520616464726573732068617665206d696e746564000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f49742773206e6f742072696768742073746167652e0000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f416c6c20746f6b656e732068617665206265656e206d696e7465642100000000600082015250565b7f5468652061646472657373206e6f7420696e20574c2f4f470000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f43616e2774206d696e74207a65726f204e465400000000000000000000000000600082015250565b600581106159fa576159f9615359565b5b50565b615a0681615128565b8114615a1157600080fd5b50565b615a1d8161513a565b8114615a2857600080fd5b50565b615a3481615146565b8114615a3f57600080fd5b50565b60058110615a4f57600080fd5b50565b615a5b816151b3565b8114615a6657600080fd5b50565b615a72816151bd565b8114615a7d57600080fd5b5056fea2646970667358221220eb568ce24d8fe073622ada848b153850ba23b35f2d9a6017db645d7e623ba11964736f6c63430008040033697066733a2f2f516d4e6b5973427a7553477446646b556d7744696d6f715064375564666b6d43486d7a48797176796d7a324566480000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d536934725a37735242475a6f4a76655274417368646332555534766846574446336358644b6b785576514a482f00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102c95760003560e01c80638c831b7011610175578063b88d4fde116100dc578063e985e9c511610095578063f6ec6ecc1161006f578063f6ec6ecc14610add578063fa04703114610b06578063fcaa766414610b31578063ff74927b14610b5c576102c9565b8063e985e9c514610a4e578063ebea113e14610a8b578063f2fde38b14610ab4576102c9565b8063b88d4fde1461092e578063bedb86fb14610957578063c83271f514610980578063c87b56dd146109bd578063ce3cd997146109fa578063e8a3d48514610a23576102c9565b806395d89b411161012e57806395d89b411461082e5780639659867e14610859578063a22cb46514610884578063a6f48c90146108ad578063ac58821d146108d8578063b36c128414610903576102c9565b80638c831b701461071c5780638da5cb5b14610759578063938e3d7b1461078457806393e9a084146107ad5780639457990a146107d857806394f7439614610803576102c9565b80634a76afe7116102345780636352211e116101ed578063715018a6116101c7578063715018a6146106a95780637f489e49146106c0578063819b25ba146106dc57806386d1a69f14610705576102c9565b80636352211e146106135780636ecd23061461065057806370a082311461066c576102c9565b80634a76afe7146104ed5780634f6ccce7146105185780635793f133146105555780635c065600146105805780635c975abb146105ab5780635fbc8bb2146105d6576102c9565b80630d4fda07116102865780630d4fda07146103ee57806318160ddd1461041757806323b872dd146104425780632f745c591461046b5780633db0ce3e146104a857806342842e0e146104c4576102c9565b806301ffc9a7146102ce57806302fe53051461030b578063046adfe61461033457806306fdde031461035d578063081812fc14610388578063095ea7b3146103c5575b600080fd5b3480156102da57600080fd5b506102f560048036038101906102f09190614430565b610b99565b6040516103029190614ac0565b60405180910390f35b34801561031757600080fd5b50610332600480360381019061032d91906144ab565b610bab565b005b34801561034057600080fd5b5061035b600480360381019061035691906143c2565b610bcd565b005b34801561036957600080fd5b50610372610c53565b60405161037f9190614af6565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa9190614558565b610ce5565b6040516103bc9190614a59565b60405180910390f35b3480156103d157600080fd5b506103ec60048036038101906103e7919061434a565b610d2b565b005b3480156103fa57600080fd5b50610415600480360381019061041091906143c2565b610e43565b005b34801561042357600080fd5b5061042c610ec9565b6040516104399190614e73565b60405180910390f35b34801561044e57600080fd5b5061046960048036038101906104649190614244565b610ed6565b005b34801561047757600080fd5b50610492600480360381019061048d919061434a565b610f36565b60405161049f9190614e73565b60405180910390f35b6104c260048036038101906104bd9190614581565b610fdb565b005b3480156104d057600080fd5b506104eb60048036038101906104e69190614244565b611103565b005b3480156104f957600080fd5b50610502611123565b60405161050f9190614e58565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a9190614558565b611128565b60405161054c9190614e73565b60405180910390f35b34801561056157600080fd5b5061056a6111bf565b6040516105779190614e58565b60405180910390f35b34801561058c57600080fd5b506105956111c5565b6040516105a29190614e73565b60405180910390f35b3480156105b757600080fd5b506105c06111d0565b6040516105cd9190614ac0565b60405180910390f35b3480156105e257600080fd5b506105fd60048036038101906105f89190614386565b6111e7565b60405161060a9190614ac0565b60405180910390f35b34801561061f57600080fd5b5061063a60048036038101906106359190614558565b61124a565b6040516106479190614a59565b60405180910390f35b61066a60048036038101906106659190614581565b6112fc565b005b34801561067857600080fd5b50610693600480360381019061068e91906141df565b611663565b6040516106a09190614e73565b60405180910390f35b3480156106b557600080fd5b506106be61171b565b005b6106da60048036038101906106d59190614581565b61172f565b005b3480156106e857600080fd5b5061070360048036038101906106fe9190614558565b611857565b005b34801561071157600080fd5b5061071a61186c565b005b34801561072857600080fd5b50610743600480360381019061073e91906141df565b6118ca565b6040516107509190614ac0565b60405180910390f35b34801561076557600080fd5b5061076e611923565b60405161077b9190614a59565b60405180910390f35b34801561079057600080fd5b506107ab60048036038101906107a691906144ab565b61194d565b005b3480156107b957600080fd5b506107c261196f565b6040516107cf9190614e73565b60405180910390f35b3480156107e457600080fd5b506107ed611975565b6040516107fa9190614e58565b60405180910390f35b34801561080f57600080fd5b50610818611989565b6040516108259190614e8e565b60405180910390f35b34801561083a57600080fd5b5061084361198e565b6040516108509190614af6565b60405180910390f35b34801561086557600080fd5b5061086e611a20565b60405161087b9190614e58565b60405180910390f35b34801561089057600080fd5b506108ab60048036038101906108a6919061430e565b611a34565b005b3480156108b957600080fd5b506108c2611a4a565b6040516108cf9190614e58565b60405180910390f35b3480156108e457600080fd5b506108ed611a5e565b6040516108fa9190614e58565b60405180910390f35b34801561090f57600080fd5b50610918611a72565b6040516109259190614e58565b60405180910390f35b34801561093a57600080fd5b5061095560048036038101906109509190614293565b611a78565b005b34801561096357600080fd5b5061097e60048036038101906109799190614407565b611ada565b005b34801561098c57600080fd5b506109a760048036038101906109a291906141df565b611b00565b6040516109b49190614ac0565b60405180910390f35b3480156109c957600080fd5b506109e460048036038101906109df9190614558565b611b59565b6040516109f19190614af6565b60405180910390f35b348015610a0657600080fd5b50610a216004803603810190610a1c9190614482565b611c41565b005b348015610a2f57600080fd5b50610a38611ca3565b604051610a459190614af6565b60405180910390f35b348015610a5a57600080fd5b50610a756004803603810190610a709190614208565b611d35565b604051610a829190614ac0565b60405180910390f35b348015610a9757600080fd5b50610ab26004803603810190610aad91906143c2565b611dc9565b005b348015610ac057600080fd5b50610adb6004803603810190610ad691906141df565b611e4f565b005b348015610ae957600080fd5b50610b046004803603810190610aff91906143c2565b611ed3565b005b348015610b1257600080fd5b50610b1b611f59565b604051610b289190614e58565b60405180910390f35b348015610b3d57600080fd5b50610b46611f5f565b604051610b539190614adb565b60405180910390f35b348015610b6857600080fd5b50610b836004803603810190610b7e91906144ec565b611f76565b604051610b909190614af6565b60405180910390f35b6000610ba4826121ca565b9050919050565b610bb3612244565b8060109080519060200190610bc9929190613f8f565b5050565b610bd5612244565b60005b82829050811015610c4e57610c3b838383818110610c1f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610c3491906141df565b60016122c2565b8080610c4690615281565b915050610bd8565b505050565b606060008054610c629061521e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8e9061521e565b8015610cdb5780601f10610cb057610100808354040283529160200191610cdb565b820191906000526020600020905b815481529060010190602001808311610cbe57829003601f168201915b5050505050905090565b6000610cf0826124c6565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d368261124a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9e90614d78565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dc6612511565b73ffffffffffffffffffffffffffffffffffffffff161480610df55750610df481610def612511565b611d35565b5b610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b90614cb8565b60405180910390fd5b610e3e8383612519565b505050565b610e4b612244565b60005b82829050811015610ec457610eb1838383818110610e95577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610eaa91906141df565b60006125d2565b8080610ebc90615281565b915050610e4e565b505050565b6000600880549050905090565b610ee7610ee1612511565b826127fd565b610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d90614df8565b60405180910390fd5b610f31838383612892565b505050565b6000610f4183611663565b8210610f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7990614b78565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6002601160009054906101000a900460ff166004811115611025577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561105e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1461109e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109590614d18565b60405180910390fd5b6002600b5414156110e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110db90614e18565b60405180910390fd5b6002600b819055506110f7826000612af9565b6001600b819055505050565b61111e83838360405180602001604052806000815250611a78565b505050565b60c881565b6000611132610ec9565b8210611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116a90614dd8565b60405180910390fd5b600882815481106111ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b61064081565b661b9ac619e7a00081565b6000600a60009054906101000a900460ff16905090565b60008160ff16600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff161015905092915050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ea90614d58565b60405180910390fd5b80915050919050565b6003601160009054906101000a900460ff166004811115611346577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561137f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146113bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b690614d18565b60405180910390fd5b6002600b541415611405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fc90614e18565b60405180910390fd5b6002600b819055508160ff16600f60069054906101000a900461ffff1661ffff161015611467576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145e90614d98565b60405180910390fd5b600061147233611663565b9050600160ff168360ff16826114889190614fab565b11156114d46040518060400160405280601781526020017f54686520616464726573732068617665206d696e7465640000000000000000008152506114cf8660ff16612d76565b611f76565b90611515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150c9190614af6565b60405180910390fd5b506000661b9ac619e7a0008460ff1661152e9190615032565b9050803410156115ca6040518060400160405280600d81526020017f4c61636b206f66204554483a20000000000000000000000000000000000000008152506115c561157934612d76565b6115c06040518060400160405280600481526020017f202d3e20000000000000000000000000000000000000000000000000000000008152506115bb88612d76565b611f76565b611f76565b611f76565b9061160b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116029190614af6565b60405180910390fd5b50611619338560ff16612f23565b8360ff16600f60068282829054906101000a900461ffff1661163b919061508c565b92506101000a81548161ffff021916908361ffff16021790555050506001600b819055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cb90614c78565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611723612244565b61172d6000612ff5565b565b6001601160009054906101000a900460ff166004811115611779577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156117b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146117f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e990614d18565b60405180910390fd5b6002600b541415611838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182f90614e18565b60405180910390fd5b6002600b8190555061184b826001612af9565b6001600b819055505050565b61185f612244565b6118693382612f23565b50565b611874612244565b6000479050611881611923565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156118c6573d6000803e3d6000fd5b5050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160029054906101000a900460ff169050919050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611955612244565b806012908051906020019061196b929190613f8f565b5050565b600c5481565b600f60009054906101000a900461ffff1681565b600181565b60606001805461199d9061521e565b80601f01602080910402602001604051908101604052809291908181526020018280546119c99061521e565b8015611a165780601f106119eb57610100808354040283529160200191611a16565b820191906000526020600020905b8154815290600101906020018083116119f957829003601f168201915b5050505050905090565b600f60069054906101000a900461ffff1681565b611a46611a3f612511565b83836130bb565b5050565b600f60049054906101000a900461ffff1681565b600f60029054906101000a900461ffff1681565b610d0581565b611a89611a83612511565b836127fd565b611ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abf90614df8565b60405180910390fd5b611ad484848484613228565b50505050565b611ae2612244565b80611af457611aef613284565b611afd565b611afc6132e7565b5b50565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff169050919050565b6060611b648261334a565b611ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9a90614d38565b60405180910390fd5b611c3a600480811115611bdf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b601160009054906101000a900460ff166004811115611c27577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b10611c325782611c35565b60005b61336b565b9050919050565b611c49612244565b42600c8190555080601160006101000a81548160ff02191690836004811115611c9b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555050565b606060128054611cb29061521e565b80601f0160208091040260200160405190810160405280929190818152602001828054611cde9061521e565b8015611d2b5780601f10611d0057610100808354040283529160200191611d2b565b820191906000526020600020905b815481529060010190602001808311611d0e57829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611dd1612244565b60005b82829050811015611e4a57611e37838383818110611e1b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611e3091906141df565b60006122c2565b8080611e4290615281565b915050611dd4565b505050565b611e57612244565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebe90614bb8565b60405180910390fd5b611ed081612ff5565b50565b611edb612244565b60005b82829050811015611f5457611f41838383818110611f25577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611f3a91906141df565b60016125d2565b8080611f4c90615281565b915050611ede565b505050565b6102ee81565b6000601160009054906101000a900460ff16905090565b606060008390506000839050600081518351611f929190614fab565b67ffffffffffffffff811115611fd1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120035781602001600182028036833780820191505090505b50905060008190506000805b85518110156120e357858181518110612051577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b83838061206890615281565b9450815181106120a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806120db90615281565b91505061200f565b5060005b84518110156121bb57848181518110612129577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b83838061214090615281565b945081518110612179577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806121b390615281565b9150506120e7565b50829550505050505092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061223d575061223c826133d3565b5b9050919050565b61224c612511565b73ffffffffffffffffffffffffffffffffffffffff1661226a611923565b73ffffffffffffffffffffffffffffffffffffffff16146122c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b790614cf8565b60405180910390fd5b565b6122ca612244565b6122d3826118ca565b156122dd576124c2565b6040518060600160405280600160ff168152602001821515815260200160011515815250600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff021916908315150217905550905050801561243657600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff16600f60008282829054906101000a900461ffff1661241b9190614f73565b92506101000a81548161ffff021916908361ffff1602179055505b600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff16600f60028282829054906101000a900461ffff166124a79190614f73565b92506101000a81548161ffff021916908361ffff1602179055505b5050565b6124cf8161334a565b61250e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250590614d58565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661258c8361124a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6125da612244565b806125fe576125e882611b00565b806125f957506125f7826118ca565b155b612609565b61260782611b00565b155b15612613576127f9565b80156126a557600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff16600f60008282829054906101000a900461ffff1661268a919061508c565b92506101000a81548161ffff021916908361ffff1602179055505b600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660ff16600f60028282829054906101000a900461ffff16612716919061508c565b92506101000a81548161ffff021916908361ffff1602179055506040518060600160405280600060ff16815260200160001515815260200160001515815250600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff0219169083151502179055509050505b5050565b6000806128098361124a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061284b575061284a8185611d35565b5b8061288957508373ffffffffffffffffffffffffffffffffffffffff1661287184610ce5565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128b28261124a565b73ffffffffffffffffffffffffffffffffffffffff1614612908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ff90614bd8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296f90614c18565b60405180910390fd5b6129838383836134b5565b61298e600082612519565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129de91906150c0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a359190614fab565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612af48383836134cd565b505050565b8160ff16600f60049054906101000a900461ffff1661ffff161015612b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4a90614b38565b60405180910390fd5b80612b6657612b61336118ca565b612b70565b612b6f33611b00565b5b612baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba690614db8565b60405180910390fd5b612bb933836111e7565b612bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bef90614c98565b60405180910390fd5b612c05338360ff16612f23565b81600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900460ff16612c6391906150f4565b92506101000a81548160ff021916908360ff1602179055508015612cbe578160ff16600f60008282829054906101000a900461ffff16612ca3919061508c565b92506101000a81548161ffff021916908361ffff1602179055505b8160ff16600f60028282829054906101000a900461ffff16612ce0919061508c565b92506101000a81548161ffff021916908361ffff1602179055508160ff16600f60048282829054906101000a900461ffff16612d1c919061508c565b92506101000a81548161ffff021916908361ffff1602179055508160ff16600f60068282829054906101000a900461ffff16612d58919061508c565b92506101000a81548161ffff021916908361ffff1602179055505050565b60606000821415612dbe576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f1e565b600082905060005b60008214612df0578080612dd990615281565b915050600a82612de99190615001565b9150612dc6565b60008167ffffffffffffffff811115612e32577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612e645781602001600182028036833780820191505090505b5090505b60008514612f1757600182612e7d91906150c0565b9150600a85612e8c91906152ca565b6030612e989190614fab565b60f81b818381518110612ed4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f109190615001565b9450612e68565b8093505050505b919050565b60008111612f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5d90614e38565b60405180910390fd5b60005b81811015612ff057612f7b600d6134d2565b6000612f87600d6134e8565b9050610d0561ffff16811115612fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc990614b58565b60405180910390fd5b612fdc84826134f6565b508080612fe890615281565b915050612f69565b505050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561312a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312190614c38565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161321b9190614ac0565b60405180910390a3505050565b613233848484612892565b61323f84848484613514565b61327e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327590614b98565b60405180910390fd5b50505050565b61328c6136ab565b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6132d0612511565b6040516132dd9190614a59565b60405180910390a1565b6132ef6136f4565b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613333612511565b6040516133409190614a59565b60405180910390a1565b60008082146133615761335c8261373e565b613364565b60015b9050919050565b6060613376826124c6565b60006133806137aa565b905060008151116133a057604051806020016040528060008152506133cb565b806133aa84612d76565b6040516020016133bb929190614a35565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061349e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806134ae57506134ad8261383c565b5b9050919050565b6134bd6136f4565b6134c88383836138a6565b505050565b505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b6135108282604051806020016040528060008152506139ba565b5050565b60006135358473ffffffffffffffffffffffffffffffffffffffff16613a15565b1561369e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261355e612511565b8786866040518563ffffffff1660e01b81526004016135809493929190614a74565b602060405180830381600087803b15801561359a57600080fd5b505af19250505080156135cb57506040513d601f19601f820116820180604052508101906135c89190614459565b60015b61364e573d80600081146135fb576040519150601f19603f3d011682016040523d82523d6000602084013e613600565b606091505b50600081511415613646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161363d90614b98565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506136a3565b600190505b949350505050565b6136b36111d0565b6136f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136e990614b18565b60405180910390fd5b565b6136fc6111d0565b1561373c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161373390614c58565b60405180910390fd5b565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060601080546137b99061521e565b80601f01602080910402602001604051908101604052809291908181526020018280546137e59061521e565b80156138325780601f1061380757610100808354040283529160200191613832565b820191906000526020600020905b81548152906001019060200180831161381557829003601f168201915b5050505050905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6138b1838383613a38565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156138f4576138ef81613a3d565b613933565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613932576139318382613a86565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139765761397181613bf3565b6139b5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146139b4576139b38282613d36565b5b5b505050565b6139c48383613db5565b6139d16000848484613514565b613a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0790614b98565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613a9384611663565b613a9d91906150c0565b9050600060076000848152602001908152602001600020549050818114613b82576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613c0791906150c0565b9050600060096000848152602001908152602001600020549050600060088381548110613c5d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613ca5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613d1a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613d4183611663565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e1c90614cd8565b60405180910390fd5b613e2e8161334a565b15613e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e6590614bf8565b60405180910390fd5b613e7a600083836134b5565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613eca9190614fab565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613f8b600083836134cd565b5050565b828054613f9b9061521e565b90600052602060002090601f016020900481019282613fbd5760008555614004565b82601f10613fd657805160ff1916838001178555614004565b82800160010185558215614004579182015b82811115614003578251825591602001919060010190613fe8565b5b5090506140119190614015565b5090565b5b8082111561402e576000816000905550600101614016565b5090565b600061404561404084614ece565b614ea9565b90508281526020810184848401111561405d57600080fd5b6140688482856151dc565b509392505050565b600061408361407e84614eff565b614ea9565b90508281526020810184848401111561409b57600080fd5b6140a68482856151dc565b509392505050565b6000813590506140bd816159fd565b92915050565b60008083601f8401126140d557600080fd5b8235905067ffffffffffffffff8111156140ee57600080fd5b60208301915083602082028301111561410657600080fd5b9250929050565b60008135905061411c81615a14565b92915050565b60008135905061413181615a2b565b92915050565b60008151905061414681615a2b565b92915050565b600082601f83011261415d57600080fd5b813561416d848260208601614032565b91505092915050565b60008135905061418581615a42565b92915050565b600082601f83011261419c57600080fd5b81356141ac848260208601614070565b91505092915050565b6000813590506141c481615a52565b92915050565b6000813590506141d981615a69565b92915050565b6000602082840312156141f157600080fd5b60006141ff848285016140ae565b91505092915050565b6000806040838503121561421b57600080fd5b6000614229858286016140ae565b925050602061423a858286016140ae565b9150509250929050565b60008060006060848603121561425957600080fd5b6000614267868287016140ae565b9350506020614278868287016140ae565b9250506040614289868287016141b5565b9150509250925092565b600080600080608085870312156142a957600080fd5b60006142b7878288016140ae565b94505060206142c8878288016140ae565b93505060406142d9878288016141b5565b925050606085013567ffffffffffffffff8111156142f657600080fd5b6143028782880161414c565b91505092959194509250565b6000806040838503121561432157600080fd5b600061432f858286016140ae565b92505060206143408582860161410d565b9150509250929050565b6000806040838503121561435d57600080fd5b600061436b858286016140ae565b925050602061437c858286016141b5565b9150509250929050565b6000806040838503121561439957600080fd5b60006143a7858286016140ae565b92505060206143b8858286016141ca565b9150509250929050565b600080602083850312156143d557600080fd5b600083013567ffffffffffffffff8111156143ef57600080fd5b6143fb858286016140c3565b92509250509250929050565b60006020828403121561441957600080fd5b60006144278482850161410d565b91505092915050565b60006020828403121561444257600080fd5b600061445084828501614122565b91505092915050565b60006020828403121561446b57600080fd5b600061447984828501614137565b91505092915050565b60006020828403121561449457600080fd5b60006144a284828501614176565b91505092915050565b6000602082840312156144bd57600080fd5b600082013567ffffffffffffffff8111156144d757600080fd5b6144e38482850161418b565b91505092915050565b600080604083850312156144ff57600080fd5b600083013567ffffffffffffffff81111561451957600080fd5b6145258582860161418b565b925050602083013567ffffffffffffffff81111561454257600080fd5b61454e8582860161418b565b9150509250929050565b60006020828403121561456a57600080fd5b6000614578848285016141b5565b91505092915050565b60006020828403121561459357600080fd5b60006145a1848285016141ca565b91505092915050565b6145b381615128565b82525050565b6145c28161513a565b82525050565b60006145d382614f30565b6145dd8185614f46565b93506145ed8185602086016151eb565b6145f6816153e6565b840191505092915050565b61460a816151ca565b82525050565b600061461b82614f3b565b6146258185614f57565b93506146358185602086016151eb565b61463e816153e6565b840191505092915050565b600061465482614f3b565b61465e8185614f68565b935061466e8185602086016151eb565b80840191505092915050565b6000614687601483614f57565b9150614692826153f7565b602082019050919050565b60006146aa601283614f57565b91506146b582615420565b602082019050919050565b60006146cd602283614f57565b91506146d882615449565b604082019050919050565b60006146f0602b83614f57565b91506146fb82615498565b604082019050919050565b6000614713603283614f57565b915061471e826154e7565b604082019050919050565b6000614736602683614f57565b915061474182615536565b604082019050919050565b6000614759602583614f57565b915061476482615585565b604082019050919050565b600061477c601c83614f57565b9150614787826155d4565b602082019050919050565b600061479f602483614f57565b91506147aa826155fd565b604082019050919050565b60006147c2601983614f57565b91506147cd8261564c565b602082019050919050565b60006147e5601083614f57565b91506147f082615675565b602082019050919050565b6000614808602983614f57565b91506148138261569e565b604082019050919050565b600061482b601783614f57565b9150614836826156ed565b602082019050919050565b600061484e603e83614f57565b915061485982615716565b604082019050919050565b6000614871602083614f57565b915061487c82615765565b602082019050919050565b6000614894602083614f57565b915061489f8261578e565b602082019050919050565b60006148b7601583614f57565b91506148c2826157b7565b602082019050919050565b60006148da602f83614f57565b91506148e5826157e0565b604082019050919050565b60006148fd601883614f57565b91506149088261582f565b602082019050919050565b6000614920602183614f57565b915061492b82615858565b604082019050919050565b6000614943601c83614f57565b915061494e826158a7565b602082019050919050565b6000614966601883614f57565b9150614971826158d0565b602082019050919050565b6000614989602c83614f57565b9150614994826158f9565b604082019050919050565b60006149ac602e83614f57565b91506149b782615948565b604082019050919050565b60006149cf601f83614f57565b91506149da82615997565b602082019050919050565b60006149f2601383614f57565b91506149fd826159c0565b602082019050919050565b614a1181615185565b82525050565b614a20816151b3565b82525050565b614a2f816151bd565b82525050565b6000614a418285614649565b9150614a4d8284614649565b91508190509392505050565b6000602082019050614a6e60008301846145aa565b92915050565b6000608082019050614a8960008301876145aa565b614a9660208301866145aa565b614aa36040830185614a17565b8181036060830152614ab581846145c8565b905095945050505050565b6000602082019050614ad560008301846145b9565b92915050565b6000602082019050614af06000830184614601565b92915050565b60006020820190508181036000830152614b108184614610565b905092915050565b60006020820190508181036000830152614b318161467a565b9050919050565b60006020820190508181036000830152614b518161469d565b9050919050565b60006020820190508181036000830152614b71816146c0565b9050919050565b60006020820190508181036000830152614b91816146e3565b9050919050565b60006020820190508181036000830152614bb181614706565b9050919050565b60006020820190508181036000830152614bd181614729565b9050919050565b60006020820190508181036000830152614bf18161474c565b9050919050565b60006020820190508181036000830152614c118161476f565b9050919050565b60006020820190508181036000830152614c3181614792565b9050919050565b60006020820190508181036000830152614c51816147b5565b9050919050565b60006020820190508181036000830152614c71816147d8565b9050919050565b60006020820190508181036000830152614c91816147fb565b9050919050565b60006020820190508181036000830152614cb18161481e565b9050919050565b60006020820190508181036000830152614cd181614841565b9050919050565b60006020820190508181036000830152614cf181614864565b9050919050565b60006020820190508181036000830152614d1181614887565b9050919050565b60006020820190508181036000830152614d31816148aa565b9050919050565b60006020820190508181036000830152614d51816148cd565b9050919050565b60006020820190508181036000830152614d71816148f0565b9050919050565b60006020820190508181036000830152614d9181614913565b9050919050565b60006020820190508181036000830152614db181614936565b9050919050565b60006020820190508181036000830152614dd181614959565b9050919050565b60006020820190508181036000830152614df18161497c565b9050919050565b60006020820190508181036000830152614e118161499f565b9050919050565b60006020820190508181036000830152614e31816149c2565b9050919050565b60006020820190508181036000830152614e51816149e5565b9050919050565b6000602082019050614e6d6000830184614a08565b92915050565b6000602082019050614e886000830184614a17565b92915050565b6000602082019050614ea36000830184614a26565b92915050565b6000614eb3614ec4565b9050614ebf8282615250565b919050565b6000604051905090565b600067ffffffffffffffff821115614ee957614ee86153b7565b5b614ef2826153e6565b9050602081019050919050565b600067ffffffffffffffff821115614f1a57614f196153b7565b5b614f23826153e6565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f7e82615185565b9150614f8983615185565b92508261ffff03821115614fa057614f9f6152fb565b5b828201905092915050565b6000614fb6826151b3565b9150614fc1836151b3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ff657614ff56152fb565b5b828201905092915050565b600061500c826151b3565b9150615017836151b3565b9250826150275761502661532a565b5b828204905092915050565b600061503d826151b3565b9150615048836151b3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615081576150806152fb565b5b828202905092915050565b600061509782615185565b91506150a283615185565b9250828210156150b5576150b46152fb565b5b828203905092915050565b60006150cb826151b3565b91506150d6836151b3565b9250828210156150e9576150e86152fb565b5b828203905092915050565b60006150ff826151bd565b915061510a836151bd565b92508282101561511d5761511c6152fb565b5b828203905092915050565b600061513382615193565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050615180826159e9565b919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006151d582615172565b9050919050565b82818337600083830152505050565b60005b838110156152095780820151818401526020810190506151ee565b83811115615218576000848401525b50505050565b6000600282049050600182168061523657607f821691505b6020821081141561524a57615249615388565b5b50919050565b615259826153e6565b810181811067ffffffffffffffff82111715615278576152776153b7565b5b80604052505050565b600061528c826151b3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152bf576152be6152fb565b5b600182019050919050565b60006152d5826151b3565b91506152e0836151b3565b9250826152f0576152ef61532a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f46726565206d696e74206973206f766572210000000000000000000000000000600082015250565b7f416c6c204e465473206861766520616c7265616479206265656e206d696e746560008201527f642e000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f54686520616464726573732068617665206d696e746564000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f49742773206e6f742072696768742073746167652e0000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f416c6c20746f6b656e732068617665206265656e206d696e7465642100000000600082015250565b7f5468652061646472657373206e6f7420696e20574c2f4f470000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f43616e2774206d696e74207a65726f204e465400000000000000000000000000600082015250565b600581106159fa576159f9615359565b5b50565b615a0681615128565b8114615a1157600080fd5b50565b615a1d8161513a565b8114615a2857600080fd5b50565b615a3481615146565b8114615a3f57600080fd5b50565b60058110615a4f57600080fd5b50565b615a5b816151b3565b8114615a6657600080fd5b50565b615a72816151bd565b8114615a7d57600080fd5b5056fea2646970667358221220eb568ce24d8fe073622ada848b153850ba23b35f2d9a6017db645d7e623ba11964736f6c63430008040033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d536934725a37735242475a6f4a76655274417368646332555534766846574446336358644b6b785576514a482f00000000000000000000000000000000000000000000000000000000

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

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000044
Arg [2] : 68747470733a2f2f697066732e696f2f697066732f516d536934725a37735242
Arg [3] : 475a6f4a76655274417368646332555534766846574446336358644b6b785576
Arg [4] : 514a482f00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

53091:6642:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55875:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54538:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56419:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33623:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35136:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34653:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57107:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47529:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35836:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47197:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57672:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36243:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53325:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47719:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53371:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53461:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11987:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56289:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33334:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58228:561;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33065:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9497:103;;;;;;;;;;;;;:::i;:::-;;57558:110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59152:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55729:140;;;;;;;;;;;;;:::i;:::-;;56190:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8849:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55147:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53519:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53767:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53287:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33792:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53874:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35379:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53829:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53798:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53243:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36499:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55389:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56091:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54732:251;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54387:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55253:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35605:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56572:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9755:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56948:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53419:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54308:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59278:432;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55875:167;55981:4;56000:36;56024:11;56000:23;:36::i;:::-;55993:43;;55875:167;;;:::o;54538:84::-;8735:13;:11;:13::i;:::-;54608:8:::1;54601:4;:15;;;;;;;;;;;;:::i;:::-;;54538:84:::0;:::o;56419:149::-;8735:13;:11;:13::i;:::-;56491:9:::1;56486:76;56510:7;;:14;;56506:1;:18;56486:76;;;56538:24;56545:7;;56553:1;56545:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56557:4;56538:6;:24::i;:::-;56526:3;;;;;:::i;:::-;;;;56486:76;;;;56419:149:::0;;:::o;33623:100::-;33677:13;33710:5;33703:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33623:100;:::o;35136:171::-;35212:7;35232:23;35247:7;35232:14;:23::i;:::-;35275:15;:24;35291:7;35275:24;;;;;;;;;;;;;;;;;;;;;35268:31;;35136:171;;;:::o;34653:417::-;34734:13;34750:23;34765:7;34750:14;:23::i;:::-;34734:39;;34798:5;34792:11;;:2;:11;;;;34784:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;34892:5;34876:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;34901:37;34918:5;34925:12;:10;:12::i;:::-;34901:16;:37::i;:::-;34876:62;34854:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;35041:21;35050:2;35054:7;35041:8;:21::i;:::-;34653:417;;;:::o;57107:156::-;8735:13;:11;:13::i;:::-;57182:9:::1;57177:80;57201:7;;:14;;57197:1;:18;57177:80;;;57229:28;57239:7;;57247:1;57239:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57251:5;57229:9;:28::i;:::-;57217:3;;;;;:::i;:::-;;;;57177:80;;;;57107:156:::0;;:::o;47529:113::-;47590:7;47617:10;:17;;;;47610:24;;47529:113;:::o;35836:336::-;36031:41;36050:12;:10;:12::i;:::-;36064:7;36031:18;:41::i;:::-;36023:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;36136:28;36146:4;36152:2;36156:7;36136:9;:28::i;:::-;35836:336;;;:::o;47197:256::-;47294:7;47330:23;47347:5;47330:16;:23::i;:::-;47322:5;:31;47314:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;47419:12;:19;47432:5;47419:19;;;;;;;;;;;;;;;:26;47439:5;47419:26;;;;;;;;;;;;47412:33;;47197:256;;;;:::o;57672:111::-;57716:12;54256:6;;;;;;;;;;;54246:16;;;;;;;;;;;;;;;;:6;:16;;;;;;;;;;;;;;;;;54238:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;3277:1:::1;3875:7;;:19;;3867:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;3277:1;4008:7;:18;;;;57758:19:::2;57766:3;57771:5;57758:7;:19::i;:::-;3233:1:::1;4187:7;:22;;;;57672:111:::0;;:::o;36243:185::-;36381:39;36398:4;36404:2;36408:7;36381:39;;;;;;;;;;;;:16;:39::i;:::-;36243:185;;;:::o;53325:41::-;53363:3;53325:41;:::o;47719:233::-;47794:7;47830:30;:28;:30::i;:::-;47822:5;:38;47814:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;47927:10;47938:5;47927:17;;;;;;;;;;;;;;;;;;;;;;;;47920:24;;47719:233;;;:::o;53371:43::-;53410:4;53371:43;:::o;53461:51::-;53499:13;53461:51;:::o;11987:86::-;12034:4;12058:7;;;;;;;;;;;12051:14;;11987:86;:::o;56289:124::-;56360:4;56404:3;56379:28;;:7;:15;56387:6;56379:15;;;;;;;;;;;;;;;:21;;;;;;;;;;;;:28;;;;56372:35;;56289:124;;;;:::o;33334:222::-;33406:7;33426:13;33442:7;:16;33450:7;33442:16;;;;;;;;;;;;;;;;;;;;;33426:32;;33494:1;33477:19;;:5;:19;;;;33469:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;33543:5;33536:12;;;33334:222;;;:::o;58228:561::-;58270:16;54256:6;;;;;;;;;;;54246:16;;;;;;;;;;;;;;;;:6;:16;;;;;;;;;;;;;;;;;54238:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;3277:1:::1;3875:7;;:19;;3867:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;3277:1;4008:7;:18;;;;58337:3:::2;58324:16;;:9;;;;;;;;;;;:16;;;;58316:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;58382:12;58397:21;58407:10;58397:9;:21::i;:::-;58382:36;;53319:1;58433:24;;58443:3;58433:13;;:7;:13;;;;:::i;:::-;:24;;58459:59;;;;;;;;;;;;;;;;;::::0;58496:21:::2;58513:3;58496:21;;:16;:21::i;:::-;58459:9;:59::i;:::-;58425:94;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;58528:15;53499:13;58546:3;:17;;;;;;:::i;:::-;58528:35;;58591:10;58578:9;:23;;58603:122;;;;;;;;;;;;;;;;;::::0;58637:87:::2;58647:27;58664:9;58647:16;:27::i;:::-;58676:47;;;;;;;;;;;;;;;;;::::0;58694:28:::2;58711:10;58694:16;:28::i;:::-;58676:9;:47::i;:::-;58637:9;:87::i;:::-;58603:9;:122::i;:::-;58570:156;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;58735:25;58744:10;58756:3;58735:25;;:8;:25::i;:::-;58780:3;58767:16;;:9;;:16;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;4039:1;;3233::::1;4187:7;:22;;;;58228:561:::0;;:::o;33065:207::-;33137:7;33182:1;33165:19;;:5;:19;;;;33157:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33248:9;:16;33258:5;33248:16;;;;;;;;;;;;;;;;33241:23;;33065:207;;;:::o;9497:103::-;8735:13;:11;:13::i;:::-;9562:30:::1;9589:1;9562:18;:30::i;:::-;9497:103::o:0;57558:110::-;57602:12;54256:6;;;;;;;;;;;54246:16;;;;;;;;;;;;;;;;:6;:16;;;;;;;;;;;;;;;;;54238:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;3277:1:::1;3875:7;;:19;;3867:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;3277:1;4008:7;:18;;;;57644::::2;57652:3;57657:4;57644:7;:18::i;:::-;3233:1:::1;4187:7;:22;;;;57558:110:::0;;:::o;59152:81::-;8735:13;:11;:13::i;:::-;59204:23:::1;59213:10;59225:1;59204:8;:23::i;:::-;59152:81:::0;:::o;55729:140::-;8735:13;:11;:13::i;:::-;55772:16:::1;55791:21;55772:40;;55835:7;:5;:7::i;:::-;55819:34;;:44;55854:8;55819:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;8759:1;55729:140::o:0;56190:95::-;56240:4;56259:7;:15;56267:6;56259:15;;;;;;;;;;;;;;;:20;;;;;;;;;;;;56252:27;;56190:95;;;:::o;8849:87::-;8895:7;8922:6;;;;;;;;;;;8915:13;;8849:87;:::o;55147:100::-;8735:13;:11;:13::i;:::-;55233:8:::1;55218:12;:23;;;;;;;;;;;;:::i;:::-;;55147:100:::0;:::o;53519:27::-;;;;:::o;53767:25::-;;;;;;;;;;;;;:::o;53287:33::-;53319:1;53287:33;:::o;33792:104::-;33848:13;33881:7;33874:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33792:104;:::o;53874:50::-;;;;;;;;;;;;;:::o;35379:155::-;35474:52;35493:12;:10;:12::i;:::-;35507:8;35517;35474:18;:52::i;:::-;35379:155;;:::o;53829:39::-;;;;;;;;;;;;;:::o;53798:25::-;;;;;;;;;;;;;:::o;53243:39::-;53278:4;53243:39;:::o;36499:323::-;36673:41;36692:12;:10;:12::i;:::-;36706:7;36673:18;:41::i;:::-;36665:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;36776:38;36790:4;36796:2;36800:7;36809:4;36776:13;:38::i;:::-;36499:323;;;;:::o;55389:89::-;8735:13;:11;:13::i;:::-;55443:5:::1;:29;;55462:10;:8;:10::i;:::-;55443:29;;;55451:8;:6;:8::i;:::-;55443:29;55389:89:::0;:::o;56091:95::-;56141:4;56160:7;:15;56168:6;56160:15;;;;;;;;;;;;;;;:20;;;;;;;;;;;;56153:27;;56091:95;;;:::o;54732:251::-;54813:13;54843:16;54851:7;54843;:16::i;:::-;54835:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;54925:52;54949:13;54940:22;;;;;;;;;;;;;;;;:6;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;:36;;54969:7;54940:36;;;54965:1;54940:36;54925:14;:52::i;:::-;54918:59;;54732:251;;;:::o;54387:108::-;8735:13;:11;:13::i;:::-;54453:15:::1;54442:8;:26;;;;54484:5;54475:6;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54387:108:::0;:::o;55253:91::-;55297:13;55326:12;55319:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55253:91;:::o;35605:164::-;35702:4;35726:18;:25;35745:5;35726:25;;;;;;;;;;;;;;;:35;35752:8;35726:35;;;;;;;;;;;;;;;;;;;;;;;;;35719:42;;35605:164;;;;:::o;56572:150::-;8735:13;:11;:13::i;:::-;56644:9:::1;56639:77;56663:7;;:14;;56659:1;:18;56639:77;;;56691:25;56698:7;;56706:1;56698:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56710:5;56691:6;:25::i;:::-;56679:3;;;;;:::i;:::-;;;;56639:77;;;;56572:150:::0;;:::o;9755:201::-;8735:13;:11;:13::i;:::-;9864:1:::1;9844:22;;:8;:22;;;;9836:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9920:28;9939:8;9920:18;:28::i;:::-;9755:201:::0;:::o;56948:155::-;8735:13;:11;:13::i;:::-;57023:9:::1;57018:79;57042:7;;:14;;57038:1;:18;57018:79;;;57070:27;57080:7;;57088:1;57080:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57092:4;57070:9;:27::i;:::-;57058:3;;;;;:::i;:::-;;;;57018:79;;;;56948:155:::0;;:::o;53419:36::-;53452:3;53419:36;:::o;54308:73::-;54348:5;54369:6;;;;;;;;;;;54362:13;;54308:73;:::o;59278:432::-;59354:13;59375:16;59400:2;59375:28;;59410:16;59435:2;59410:28;;59445:17;59489:3;:10;59476:3;:10;:23;;;;:::i;:::-;59465:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59445:55;;59507:17;59533:3;59507:30;;59544:6;59566;59561:55;59582:3;:10;59578:1;:14;59561:55;;;59610:3;59614:1;59610:6;;;;;;;;;;;;;;;;;;;;;;;;59598:4;59603:3;;;;;:::i;:::-;;;59598:9;;;;;;;;;;;;;;;;;;;:18;;;;;;;;;;;59594:3;;;;;:::i;:::-;;;;59561:55;;;;59628:6;59623:56;59644:3;:10;59640:1;:14;59623:56;;;59673:3;59677:1;59673:6;;;;;;;;;;;;;;;;;;;;;;;;59661:4;59666:3;;;;;:::i;:::-;;;59661:9;;;;;;;;;;;;;;;;;;;:18;;;;;;;;;;;59656:3;;;;;:::i;:::-;;;;59623:56;;;;59700:3;59686:18;;;;;;;59278:432;;;;:::o;46889:224::-;46991:4;47030:35;47015:50;;;:11;:50;;;;:90;;;;47069:36;47093:11;47069:23;:36::i;:::-;47015:90;47008:97;;46889:224;;;:::o;9014:132::-;9089:12;:10;:12::i;:::-;9078:23;;:7;:5;:7::i;:::-;:23;;;9070:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9014:132::o;56726:216::-;8735:13;:11;:13::i;:::-;56794:7:::1;56799:1;56794:4;:7::i;:::-;56790:20;;;56803:7;;56790:20;56829:28;;;;;;;;53319:1;56829:28;;;;;;56845:5;56829:28;;;;;;56852:4;56829:28;;;;::::0;56816:7:::1;:10;56824:1;56816:10;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56868:5;56864:38;;;56886:7;:10;56894:1;56886:10;;;;;;;;;;;;;;;:16;;;;;;;;;;;;56875:27;;:7;;:27;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;56864:38;56920:7;:10;56928:1;56920:10;;;;;;;;;;;;;;;:16;;;;;;;;;;;;56909:27;;:7;;:27;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;8759:1;56726:216:::0;;:::o;43111:135::-;43193:16;43201:7;43193;:16::i;:::-;43185:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;43111:135;:::o;7400:98::-;7453:7;7480:10;7473:17;;7400:98;:::o;42390:174::-;42492:2;42465:15;:24;42481:7;42465:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;42548:7;42544:2;42510:46;;42519:23;42534:7;42519:14;:23::i;:::-;42510:46;;;;;;;;;;;;42390:174;;:::o;57267:247::-;8735:13;:11;:13::i;:::-;57338:5:::1;:40;;57358:7;57363:1;57358:4;:7::i;:::-;:19;;;;57370:7;57375:1;57370:4;:7::i;:::-;57369:8;57358:19;57338:40;;;57347:7;57352:1;57347:4;:7::i;:::-;57346:8;57338:40;57334:53;;;57380:7;;57334:53;57397:5;57393:38;;;57415:7;:10;57423:1;57415:10;;;;;;;;;;;;;;;:16;;;;;;;;;;;;57404:27;;:7;;:27;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;57393:38;57449:7;:10;57457:1;57449:10;;;;;;;;;;;;;;;:16;;;;;;;;;;;;57438:27;;:7;;:27;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;57485:23;;;;;;;;57492:1;57485:23;;;;;;57495:5;57485:23;;;;;;57502:5;57485:23;;;;::::0;57472:7:::1;:10;57480:1;57472:10;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8759:1;57267:247:::0;;:::o;38623:264::-;38716:4;38733:13;38749:23;38764:7;38749:14;:23::i;:::-;38733:39;;38802:5;38791:16;;:7;:16;;;:52;;;;38811:32;38828:5;38835:7;38811:16;:32::i;:::-;38791:52;:87;;;;38871:7;38847:31;;:20;38859:7;38847:11;:20::i;:::-;:31;;;38791:87;38783:96;;;38623:264;;;;:::o;41646:625::-;41805:4;41778:31;;:23;41793:7;41778:14;:23::i;:::-;:31;;;41770:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;41884:1;41870:16;;:2;:16;;;;41862:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;41940:39;41961:4;41967:2;41971:7;41940:20;:39::i;:::-;42044:29;42061:1;42065:7;42044:8;:29::i;:::-;42105:1;42086:9;:15;42096:4;42086:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;42134:1;42117:9;:13;42127:2;42117:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42165:2;42146:7;:16;42154:7;42146:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42204:7;42200:2;42185:27;;42194:4;42185:27;;;;;;;;;;;;42225:38;42245:4;42251:2;42255:7;42225:19;:38::i;:::-;41646:625;;;:::o;57787:435::-;57863:3;57850:16;;:9;;;;;;;;;;;:16;;;;57842:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;57904:5;:43;;57931:16;57936:10;57931:4;:16::i;:::-;57904:43;;;57912:16;57917:10;57912:4;:16::i;:::-;57904:43;57896:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;57991:31;58006:10;58018:3;57991:14;:31::i;:::-;57983:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;58059:25;58068:10;58080:3;58059:25;;:8;:25::i;:::-;58122:3;58093:7;:19;58101:10;58093:19;;;;;;;;;;;;;;;:25;;;:32;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;58136:5;58132:25;;;58154:3;58143:14;;:7;;:14;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;58132:25;58170:3;58159:14;;:7;;:14;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;58195:3;58182:16;;:9;;:16;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;58213:3;58200:16;;:9;;:16;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;57787:435;;:::o;4654:723::-;4710:13;4940:1;4931:5;:10;4927:53;;;4958:10;;;;;;;;;;;;;;;;;;;;;4927:53;4990:12;5005:5;4990:20;;5021:14;5046:78;5061:1;5053:4;:9;5046:78;;5079:8;;;;;:::i;:::-;;;;5110:2;5102:10;;;;;:::i;:::-;;;5046:78;;;5134:19;5166:6;5156:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5134:39;;5184:154;5200:1;5191:5;:10;5184:154;;5228:1;5218:11;;;;;:::i;:::-;;;5295:2;5287:5;:10;;;;:::i;:::-;5274:2;:24;;;;:::i;:::-;5261:39;;5244:6;5251;5244:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;5324:2;5315:11;;;;;:::i;:::-;;;5184:154;;;5362:6;5348:21;;;;;4654:723;;;;:::o;58795:351::-;58867:1;58861:3;:7;58853:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;58906:9;58901:240;58925:3;58921:1;:7;58901:240;;;58944:27;:15;:25;:27::i;:::-;58980:16;58999:25;:15;:23;:25::i;:::-;58980:44;;53278:4;59041:21;;:8;:21;;59033:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59110:23;59120:2;59124:8;59110:9;:23::i;:::-;58901:240;58930:3;;;;;:::i;:::-;;;;58901:240;;;;58795:351;;:::o;10116:191::-;10190:16;10209:6;;;;;;;;;;;10190:25;;10235:8;10226:6;;:17;;;;;;;;;;;;;;;;;;10290:8;10259:40;;10280:8;10259:40;;;;;;;;;;;;10116:191;;:::o;42707:315::-;42862:8;42853:17;;:5;:17;;;;42845:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;42949:8;42911:18;:25;42930:5;42911:25;;;;;;;;;;;;;;;:35;42937:8;42911:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;42995:8;42973:41;;42988:5;42973:41;;;43005:8;42973:41;;;;;;:::i;:::-;;;;;;;;42707:315;;;:::o;37703:313::-;37859:28;37869:4;37875:2;37879:7;37859:9;:28::i;:::-;37906:47;37929:4;37935:2;37939:7;37948:4;37906:22;:47::i;:::-;37898:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;37703:313;;;;:::o;12842:120::-;11851:16;:14;:16::i;:::-;12911:5:::1;12901:7;;:15;;;;;;;;;;;;;;;;;;12932:22;12941:12;:10;:12::i;:::-;12932:22;;;;;;:::i;:::-;;;;;;;;12842:120::o:0;12583:118::-;11592:19;:17;:19::i;:::-;12653:4:::1;12643:7;;:14;;;;;;;;;;;;;;;;;;12673:20;12680:12;:10;:12::i;:::-;12673:20;;;;;;:::i;:::-;;;;;;;;12583:118::o:0;54989:152::-;55071:4;55102:1;55091:7;:12;:44;;55113:22;55127:7;55113:13;:22::i;:::-;55091:44;;;55106:4;55091:44;55084:51;;54989:152;;;:::o;33967:281::-;34040:13;34066:23;34081:7;34066:14;:23::i;:::-;34102:21;34126:10;:8;:10::i;:::-;34102:34;;34178:1;34160:7;34154:21;:25;:86;;;;;;;;;;;;;;;;;34206:7;34215:18;:7;:16;:18::i;:::-;34189:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34154:86;34147:93;;;33967:281;;;:::o;32696:305::-;32798:4;32850:25;32835:40;;;:11;:40;;;;:105;;;;32907:33;32892:48;;;:11;:48;;;;32835:105;:158;;;;32957:36;32981:11;32957:23;:36::i;:::-;32835:158;32815:178;;32696:305;;;:::o;55526:197::-;11592:19;:17;:19::i;:::-;55674:43:::1;55701:4;55706:2;55709:7;55674:26;:43::i;:::-;55526:197:::0;;;:::o;45746:125::-;;;;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;39229:110::-;39305:26;39315:2;39319:7;39305:26;;;;;;;;;;;;:9;:26::i;:::-;39229:110;;:::o;43810:853::-;43964:4;43985:15;:2;:13;;;:15::i;:::-;43981:675;;;44037:2;44021:36;;;44058:12;:10;:12::i;:::-;44072:4;44078:7;44087:4;44021:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44017:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44279:1;44262:6;:13;:18;44258:328;;;44305:60;;;;;;;;;;:::i;:::-;;;;;;;;44258:328;44536:6;44530:13;44521:6;44517:2;44513:15;44506:38;44017:584;44153:41;;;44143:51;;;:6;:51;;;;44136:58;;;;;43981:675;44640:4;44633:11;;43810:853;;;;;;;:::o;12331:108::-;12398:8;:6;:8::i;:::-;12390:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;12331:108::o;12146:::-;12217:8;:6;:8::i;:::-;12216:9;12208:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;12146:108::o;38329:127::-;38394:4;38446:1;38418:30;;:7;:16;38426:7;38418:16;;;;;;;;;;;;;;;;;;;;;:30;;;;38411:37;;38329:127;;;:::o;54628:98::-;54688:13;54716:4;54709:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54628:98;:::o;24358:157::-;24443:4;24482:25;24467:40;;;:11;:40;;;;24460:47;;24358:157;;;:::o;48565:589::-;48709:45;48736:4;48742:2;48746:7;48709:26;:45::i;:::-;48787:1;48771:18;;:4;:18;;;48767:187;;;48806:40;48838:7;48806:31;:40::i;:::-;48767:187;;;48876:2;48868:10;;:4;:10;;;48864:90;;48895:47;48928:4;48934:7;48895:32;:47::i;:::-;48864:90;48767:187;48982:1;48968:16;;:2;:16;;;48964:183;;;49001:45;49038:7;49001:36;:45::i;:::-;48964:183;;;49074:4;49068:10;;:2;:10;;;49064:83;;49095:40;49123:2;49127:7;49095:27;:40::i;:::-;49064:83;48964:183;48565:589;;;:::o;39566:319::-;39695:18;39701:2;39705:7;39695:5;:18::i;:::-;39746:53;39777:1;39781:2;39785:7;39794:4;39746:22;:53::i;:::-;39724:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;39566:319;;;:::o;14202:326::-;14262:4;14519:1;14497:7;:19;;;:23;14490:30;;14202:326;;;:::o;45235:126::-;;;;:::o;49877:164::-;49981:10;:17;;;;49954:15;:24;49970:7;49954:24;;;;;;;;;;;:44;;;;50009:10;50025:7;50009:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49877:164;:::o;50668:988::-;50934:22;50984:1;50959:22;50976:4;50959:16;:22::i;:::-;:26;;;;:::i;:::-;50934:51;;50996:18;51017:17;:26;51035:7;51017:26;;;;;;;;;;;;50996:47;;51164:14;51150:10;:28;51146:328;;51195:19;51217:12;:18;51230:4;51217:18;;;;;;;;;;;;;;;:34;51236:14;51217:34;;;;;;;;;;;;51195:56;;51301:11;51268:12;:18;51281:4;51268:18;;;;;;;;;;;;;;;:30;51287:10;51268:30;;;;;;;;;;;:44;;;;51418:10;51385:17;:30;51403:11;51385:30;;;;;;;;;;;:43;;;;51146:328;;51570:17;:26;51588:7;51570:26;;;;;;;;;;;51563:33;;;51614:12;:18;51627:4;51614:18;;;;;;;;;;;;;;;:34;51633:14;51614:34;;;;;;;;;;;51607:41;;;50668:988;;;;:::o;51951:1079::-;52204:22;52249:1;52229:10;:17;;;;:21;;;;:::i;:::-;52204:46;;52261:18;52282:15;:24;52298:7;52282:24;;;;;;;;;;;;52261:45;;52633:19;52655:10;52666:14;52655:26;;;;;;;;;;;;;;;;;;;;;;;;52633:48;;52719:11;52694:10;52705;52694:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;52830:10;52799:15;:28;52815:11;52799:28;;;;;;;;;;;:41;;;;52971:15;:24;52987:7;52971:24;;;;;;;;;;;52964:31;;;53006:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51951:1079;;;;:::o;49455:221::-;49540:14;49557:20;49574:2;49557:16;:20::i;:::-;49540:37;;49615:7;49588:12;:16;49601:2;49588:16;;;;;;;;;;;;;;;:24;49605:6;49588:24;;;;;;;;;;;:34;;;;49662:6;49633:17;:26;49651:7;49633:26;;;;;;;;;;;:35;;;;49455:221;;;:::o;40221:439::-;40315:1;40301:16;;:2;:16;;;;40293:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;40374:16;40382:7;40374;:16::i;:::-;40373:17;40365:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;40436:45;40465:1;40469:2;40473:7;40436:20;:45::i;:::-;40511:1;40494:9;:13;40504:2;40494:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;40542:2;40523:7;:16;40531:7;40523:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;40587:7;40583:2;40562:33;;40579:1;40562:33;;;;;;;;;;;;40608:44;40636:1;40640:2;40644:7;40608:19;:44::i;:::-;40221:439;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;869:367::-;942:8;952:6;1002:3;995:4;987:6;983:17;979:27;969:2;;1020:1;1017;1010:12;969:2;1056:6;1043:20;1033:30;;1086:18;1078:6;1075:30;1072:2;;;1118:1;1115;1108:12;1072:2;1155:4;1147:6;1143:17;1131:29;;1209:3;1201:4;1193:6;1189:17;1179:8;1175:32;1172:41;1169:2;;;1226:1;1223;1216:12;1169:2;959:277;;;;;:::o;1242:133::-;1285:5;1323:6;1310:20;1301:29;;1339:30;1363:5;1339:30;:::i;:::-;1291:84;;;;:::o;1381:137::-;1426:5;1464:6;1451:20;1442:29;;1480:32;1506:5;1480:32;:::i;:::-;1432:86;;;;:::o;1524:141::-;1580:5;1611:6;1605:13;1596:22;;1627:32;1653:5;1627:32;:::i;:::-;1586:79;;;;:::o;1684:271::-;1739:5;1788:3;1781:4;1773:6;1769:17;1765:27;1755:2;;1806:1;1803;1796:12;1755:2;1846:6;1833:20;1871:78;1945:3;1937:6;1930:4;1922:6;1918:17;1871:78;:::i;:::-;1862:87;;1745:210;;;;;:::o;1961:159::-;2017:5;2055:6;2042:20;2033:29;;2071:43;2108:5;2071:43;:::i;:::-;2023:97;;;;:::o;2140:273::-;2196:5;2245:3;2238:4;2230:6;2226:17;2222:27;2212:2;;2263:1;2260;2253:12;2212:2;2303:6;2290:20;2328:79;2403:3;2395:6;2388:4;2380:6;2376:17;2328:79;:::i;:::-;2319:88;;2202:211;;;;;:::o;2419:139::-;2465:5;2503:6;2490:20;2481:29;;2519:33;2546:5;2519:33;:::i;:::-;2471:87;;;;:::o;2564:135::-;2608:5;2646:6;2633:20;2624:29;;2662:31;2687:5;2662:31;:::i;:::-;2614:85;;;;:::o;2705:262::-;2764:6;2813:2;2801:9;2792:7;2788:23;2784:32;2781:2;;;2829:1;2826;2819:12;2781:2;2872:1;2897:53;2942:7;2933:6;2922:9;2918:22;2897:53;:::i;:::-;2887:63;;2843:117;2771:196;;;;:::o;2973:407::-;3041:6;3049;3098:2;3086:9;3077:7;3073:23;3069:32;3066:2;;;3114:1;3111;3104:12;3066:2;3157:1;3182:53;3227:7;3218:6;3207:9;3203:22;3182:53;:::i;:::-;3172:63;;3128:117;3284:2;3310:53;3355:7;3346:6;3335:9;3331:22;3310:53;:::i;:::-;3300:63;;3255:118;3056:324;;;;;:::o;3386:552::-;3463:6;3471;3479;3528:2;3516:9;3507:7;3503:23;3499:32;3496:2;;;3544:1;3541;3534:12;3496:2;3587:1;3612:53;3657:7;3648:6;3637:9;3633:22;3612:53;:::i;:::-;3602:63;;3558:117;3714:2;3740:53;3785:7;3776:6;3765:9;3761:22;3740:53;:::i;:::-;3730:63;;3685:118;3842:2;3868:53;3913:7;3904:6;3893:9;3889:22;3868:53;:::i;:::-;3858:63;;3813:118;3486:452;;;;;:::o;3944:809::-;4039:6;4047;4055;4063;4112:3;4100:9;4091:7;4087:23;4083:33;4080:2;;;4129:1;4126;4119:12;4080:2;4172:1;4197:53;4242:7;4233:6;4222:9;4218:22;4197:53;:::i;:::-;4187:63;;4143:117;4299:2;4325:53;4370:7;4361:6;4350:9;4346:22;4325:53;:::i;:::-;4315:63;;4270:118;4427:2;4453:53;4498:7;4489:6;4478:9;4474:22;4453:53;:::i;:::-;4443:63;;4398:118;4583:2;4572:9;4568:18;4555:32;4614:18;4606:6;4603:30;4600:2;;;4646:1;4643;4636:12;4600:2;4674:62;4728:7;4719:6;4708:9;4704:22;4674:62;:::i;:::-;4664:72;;4526:220;4070:683;;;;;;;:::o;4759:401::-;4824:6;4832;4881:2;4869:9;4860:7;4856:23;4852:32;4849:2;;;4897:1;4894;4887:12;4849:2;4940:1;4965:53;5010:7;5001:6;4990:9;4986:22;4965:53;:::i;:::-;4955:63;;4911:117;5067:2;5093:50;5135:7;5126:6;5115:9;5111:22;5093:50;:::i;:::-;5083:60;;5038:115;4839:321;;;;;:::o;5166:407::-;5234:6;5242;5291:2;5279:9;5270:7;5266:23;5262:32;5259:2;;;5307:1;5304;5297:12;5259:2;5350:1;5375:53;5420:7;5411:6;5400:9;5396:22;5375:53;:::i;:::-;5365:63;;5321:117;5477:2;5503:53;5548:7;5539:6;5528:9;5524:22;5503:53;:::i;:::-;5493:63;;5448:118;5249:324;;;;;:::o;5579:403::-;5645:6;5653;5702:2;5690:9;5681:7;5677:23;5673:32;5670:2;;;5718:1;5715;5708:12;5670:2;5761:1;5786:53;5831:7;5822:6;5811:9;5807:22;5786:53;:::i;:::-;5776:63;;5732:117;5888:2;5914:51;5957:7;5948:6;5937:9;5933:22;5914:51;:::i;:::-;5904:61;;5859:116;5660:322;;;;;:::o;5988:425::-;6074:6;6082;6131:2;6119:9;6110:7;6106:23;6102:32;6099:2;;;6147:1;6144;6137:12;6099:2;6218:1;6207:9;6203:17;6190:31;6248:18;6240:6;6237:30;6234:2;;;6280:1;6277;6270:12;6234:2;6316:80;6388:7;6379:6;6368:9;6364:22;6316:80;:::i;:::-;6298:98;;;;6161:245;6089:324;;;;;:::o;6419:256::-;6475:6;6524:2;6512:9;6503:7;6499:23;6495:32;6492:2;;;6540:1;6537;6530:12;6492:2;6583:1;6608:50;6650:7;6641:6;6630:9;6626:22;6608:50;:::i;:::-;6598:60;;6554:114;6482:193;;;;:::o;6681:260::-;6739:6;6788:2;6776:9;6767:7;6763:23;6759:32;6756:2;;;6804:1;6801;6794:12;6756:2;6847:1;6872:52;6916:7;6907:6;6896:9;6892:22;6872:52;:::i;:::-;6862:62;;6818:116;6746:195;;;;:::o;6947:282::-;7016:6;7065:2;7053:9;7044:7;7040:23;7036:32;7033:2;;;7081:1;7078;7071:12;7033:2;7124:1;7149:63;7204:7;7195:6;7184:9;7180:22;7149:63;:::i;:::-;7139:73;;7095:127;7023:206;;;;:::o;7235:282::-;7304:6;7353:2;7341:9;7332:7;7328:23;7324:32;7321:2;;;7369:1;7366;7359:12;7321:2;7412:1;7437:63;7492:7;7483:6;7472:9;7468:22;7437:63;:::i;:::-;7427:73;;7383:127;7311:206;;;;:::o;7523:375::-;7592:6;7641:2;7629:9;7620:7;7616:23;7612:32;7609:2;;;7657:1;7654;7647:12;7609:2;7728:1;7717:9;7713:17;7700:31;7758:18;7750:6;7747:30;7744:2;;;7790:1;7787;7780:12;7744:2;7818:63;7873:7;7864:6;7853:9;7849:22;7818:63;:::i;:::-;7808:73;;7671:220;7599:299;;;;:::o;7904:633::-;7992:6;8000;8049:2;8037:9;8028:7;8024:23;8020:32;8017:2;;;8065:1;8062;8055:12;8017:2;8136:1;8125:9;8121:17;8108:31;8166:18;8158:6;8155:30;8152:2;;;8198:1;8195;8188:12;8152:2;8226:63;8281:7;8272:6;8261:9;8257:22;8226:63;:::i;:::-;8216:73;;8079:220;8366:2;8355:9;8351:18;8338:32;8397:18;8389:6;8386:30;8383:2;;;8429:1;8426;8419:12;8383:2;8457:63;8512:7;8503:6;8492:9;8488:22;8457:63;:::i;:::-;8447:73;;8309:221;8007:530;;;;;:::o;8543:262::-;8602:6;8651:2;8639:9;8630:7;8626:23;8622:32;8619:2;;;8667:1;8664;8657:12;8619:2;8710:1;8735:53;8780:7;8771:6;8760:9;8756:22;8735:53;:::i;:::-;8725:63;;8681:117;8609:196;;;;:::o;8811:258::-;8868:6;8917:2;8905:9;8896:7;8892:23;8888:32;8885:2;;;8933:1;8930;8923:12;8885:2;8976:1;9001:51;9044:7;9035:6;9024:9;9020:22;9001:51;:::i;:::-;8991:61;;8947:115;8875:194;;;;:::o;9075:118::-;9162:24;9180:5;9162:24;:::i;:::-;9157:3;9150:37;9140:53;;:::o;9199:109::-;9280:21;9295:5;9280:21;:::i;:::-;9275:3;9268:34;9258:50;;:::o;9314:360::-;9400:3;9428:38;9460:5;9428:38;:::i;:::-;9482:70;9545:6;9540:3;9482:70;:::i;:::-;9475:77;;9561:52;9606:6;9601:3;9594:4;9587:5;9583:16;9561:52;:::i;:::-;9638:29;9660:6;9638:29;:::i;:::-;9633:3;9629:39;9622:46;;9404:270;;;;;:::o;9680:147::-;9775:45;9814:5;9775:45;:::i;:::-;9770:3;9763:58;9753:74;;:::o;9833:364::-;9921:3;9949:39;9982:5;9949:39;:::i;:::-;10004:71;10068:6;10063:3;10004:71;:::i;:::-;9997:78;;10084:52;10129:6;10124:3;10117:4;10110:5;10106:16;10084:52;:::i;:::-;10161:29;10183:6;10161:29;:::i;:::-;10156:3;10152:39;10145:46;;9925:272;;;;;:::o;10203:377::-;10309:3;10337:39;10370:5;10337:39;:::i;:::-;10392:89;10474:6;10469:3;10392:89;:::i;:::-;10385:96;;10490:52;10535:6;10530:3;10523:4;10516:5;10512:16;10490:52;:::i;:::-;10567:6;10562:3;10558:16;10551:23;;10313:267;;;;;:::o;10586:366::-;10728:3;10749:67;10813:2;10808:3;10749:67;:::i;:::-;10742:74;;10825:93;10914:3;10825:93;:::i;:::-;10943:2;10938:3;10934:12;10927:19;;10732:220;;;:::o;10958:366::-;11100:3;11121:67;11185:2;11180:3;11121:67;:::i;:::-;11114:74;;11197:93;11286:3;11197:93;:::i;:::-;11315:2;11310:3;11306:12;11299:19;;11104:220;;;:::o;11330:366::-;11472:3;11493:67;11557:2;11552:3;11493:67;:::i;:::-;11486:74;;11569:93;11658:3;11569:93;:::i;:::-;11687:2;11682:3;11678:12;11671:19;;11476:220;;;:::o;11702:366::-;11844:3;11865:67;11929:2;11924:3;11865:67;:::i;:::-;11858:74;;11941:93;12030:3;11941:93;:::i;:::-;12059:2;12054:3;12050:12;12043:19;;11848:220;;;:::o;12074:366::-;12216:3;12237:67;12301:2;12296:3;12237:67;:::i;:::-;12230:74;;12313:93;12402:3;12313:93;:::i;:::-;12431:2;12426:3;12422:12;12415:19;;12220:220;;;:::o;12446:366::-;12588:3;12609:67;12673:2;12668:3;12609:67;:::i;:::-;12602:74;;12685:93;12774:3;12685:93;:::i;:::-;12803:2;12798:3;12794:12;12787:19;;12592:220;;;:::o;12818:366::-;12960:3;12981:67;13045:2;13040:3;12981:67;:::i;:::-;12974:74;;13057:93;13146:3;13057:93;:::i;:::-;13175:2;13170:3;13166:12;13159:19;;12964:220;;;:::o;13190:366::-;13332:3;13353:67;13417:2;13412:3;13353:67;:::i;:::-;13346:74;;13429:93;13518:3;13429:93;:::i;:::-;13547:2;13542:3;13538:12;13531:19;;13336:220;;;:::o;13562:366::-;13704:3;13725:67;13789:2;13784:3;13725:67;:::i;:::-;13718:74;;13801:93;13890:3;13801:93;:::i;:::-;13919:2;13914:3;13910:12;13903:19;;13708:220;;;:::o;13934:366::-;14076:3;14097:67;14161:2;14156:3;14097:67;:::i;:::-;14090:74;;14173:93;14262:3;14173:93;:::i;:::-;14291:2;14286:3;14282:12;14275:19;;14080:220;;;:::o;14306:366::-;14448:3;14469:67;14533:2;14528:3;14469:67;:::i;:::-;14462:74;;14545:93;14634:3;14545:93;:::i;:::-;14663:2;14658:3;14654:12;14647:19;;14452:220;;;:::o;14678:366::-;14820:3;14841:67;14905:2;14900:3;14841:67;:::i;:::-;14834:74;;14917:93;15006:3;14917:93;:::i;:::-;15035:2;15030:3;15026:12;15019:19;;14824:220;;;:::o;15050:366::-;15192:3;15213:67;15277:2;15272:3;15213:67;:::i;:::-;15206:74;;15289:93;15378:3;15289:93;:::i;:::-;15407:2;15402:3;15398:12;15391:19;;15196:220;;;:::o;15422:366::-;15564:3;15585:67;15649:2;15644:3;15585:67;:::i;:::-;15578:74;;15661:93;15750:3;15661:93;:::i;:::-;15779:2;15774:3;15770:12;15763:19;;15568:220;;;:::o;15794:366::-;15936:3;15957:67;16021:2;16016:3;15957:67;:::i;:::-;15950:74;;16033:93;16122:3;16033:93;:::i;:::-;16151:2;16146:3;16142:12;16135:19;;15940:220;;;:::o;16166:366::-;16308:3;16329:67;16393:2;16388:3;16329:67;:::i;:::-;16322:74;;16405:93;16494:3;16405:93;:::i;:::-;16523:2;16518:3;16514:12;16507:19;;16312:220;;;:::o;16538:366::-;16680:3;16701:67;16765:2;16760:3;16701:67;:::i;:::-;16694:74;;16777:93;16866:3;16777:93;:::i;:::-;16895:2;16890:3;16886:12;16879:19;;16684:220;;;:::o;16910:366::-;17052:3;17073:67;17137:2;17132:3;17073:67;:::i;:::-;17066:74;;17149:93;17238:3;17149:93;:::i;:::-;17267:2;17262:3;17258:12;17251:19;;17056:220;;;:::o;17282:366::-;17424:3;17445:67;17509:2;17504:3;17445:67;:::i;:::-;17438:74;;17521:93;17610:3;17521:93;:::i;:::-;17639:2;17634:3;17630:12;17623:19;;17428:220;;;:::o;17654:366::-;17796:3;17817:67;17881:2;17876:3;17817:67;:::i;:::-;17810:74;;17893:93;17982:3;17893:93;:::i;:::-;18011:2;18006:3;18002:12;17995:19;;17800:220;;;:::o;18026:366::-;18168:3;18189:67;18253:2;18248:3;18189:67;:::i;:::-;18182:74;;18265:93;18354:3;18265:93;:::i;:::-;18383:2;18378:3;18374:12;18367:19;;18172:220;;;:::o;18398:366::-;18540:3;18561:67;18625:2;18620:3;18561:67;:::i;:::-;18554:74;;18637:93;18726:3;18637:93;:::i;:::-;18755:2;18750:3;18746:12;18739:19;;18544:220;;;:::o;18770:366::-;18912:3;18933:67;18997:2;18992:3;18933:67;:::i;:::-;18926:74;;19009:93;19098:3;19009:93;:::i;:::-;19127:2;19122:3;19118:12;19111:19;;18916:220;;;:::o;19142:366::-;19284:3;19305:67;19369:2;19364:3;19305:67;:::i;:::-;19298:74;;19381:93;19470:3;19381:93;:::i;:::-;19499:2;19494:3;19490:12;19483:19;;19288:220;;;:::o;19514:366::-;19656:3;19677:67;19741:2;19736:3;19677:67;:::i;:::-;19670:74;;19753:93;19842:3;19753:93;:::i;:::-;19871:2;19866:3;19862:12;19855:19;;19660:220;;;:::o;19886:366::-;20028:3;20049:67;20113:2;20108:3;20049:67;:::i;:::-;20042:74;;20125:93;20214:3;20125:93;:::i;:::-;20243:2;20238:3;20234:12;20227:19;;20032:220;;;:::o;20258:115::-;20343:23;20360:5;20343:23;:::i;:::-;20338:3;20331:36;20321:52;;:::o;20379:118::-;20466:24;20484:5;20466:24;:::i;:::-;20461:3;20454:37;20444:53;;:::o;20503:112::-;20586:22;20602:5;20586:22;:::i;:::-;20581:3;20574:35;20564:51;;:::o;20621:435::-;20801:3;20823:95;20914:3;20905:6;20823:95;:::i;:::-;20816:102;;20935:95;21026:3;21017:6;20935:95;:::i;:::-;20928:102;;21047:3;21040:10;;20805:251;;;;;:::o;21062:222::-;21155:4;21193:2;21182:9;21178:18;21170:26;;21206:71;21274:1;21263:9;21259:17;21250:6;21206:71;:::i;:::-;21160:124;;;;:::o;21290:640::-;21485:4;21523:3;21512:9;21508:19;21500:27;;21537:71;21605:1;21594:9;21590:17;21581:6;21537:71;:::i;:::-;21618:72;21686:2;21675:9;21671:18;21662:6;21618:72;:::i;:::-;21700;21768:2;21757:9;21753:18;21744:6;21700:72;:::i;:::-;21819:9;21813:4;21809:20;21804:2;21793:9;21789:18;21782:48;21847:76;21918:4;21909:6;21847:76;:::i;:::-;21839:84;;21490:440;;;;;;;:::o;21936:210::-;22023:4;22061:2;22050:9;22046:18;22038:26;;22074:65;22136:1;22125:9;22121:17;22112:6;22074:65;:::i;:::-;22028:118;;;;:::o;22152:238::-;22253:4;22291:2;22280:9;22276:18;22268:26;;22304:79;22380:1;22369:9;22365:17;22356:6;22304:79;:::i;:::-;22258:132;;;;:::o;22396:313::-;22509:4;22547:2;22536:9;22532:18;22524:26;;22596:9;22590:4;22586:20;22582:1;22571:9;22567:17;22560:47;22624:78;22697:4;22688:6;22624:78;:::i;:::-;22616:86;;22514:195;;;;:::o;22715:419::-;22881:4;22919:2;22908:9;22904:18;22896:26;;22968:9;22962:4;22958:20;22954:1;22943:9;22939:17;22932:47;22996:131;23122:4;22996:131;:::i;:::-;22988:139;;22886:248;;;:::o;23140:419::-;23306:4;23344:2;23333:9;23329:18;23321:26;;23393:9;23387:4;23383:20;23379:1;23368:9;23364:17;23357:47;23421:131;23547:4;23421:131;:::i;:::-;23413:139;;23311:248;;;:::o;23565:419::-;23731:4;23769:2;23758:9;23754:18;23746:26;;23818:9;23812:4;23808:20;23804:1;23793:9;23789:17;23782:47;23846:131;23972:4;23846:131;:::i;:::-;23838:139;;23736:248;;;:::o;23990:419::-;24156:4;24194:2;24183:9;24179:18;24171:26;;24243:9;24237:4;24233:20;24229:1;24218:9;24214:17;24207:47;24271:131;24397:4;24271:131;:::i;:::-;24263:139;;24161:248;;;:::o;24415:419::-;24581:4;24619:2;24608:9;24604:18;24596:26;;24668:9;24662:4;24658:20;24654:1;24643:9;24639:17;24632:47;24696:131;24822:4;24696:131;:::i;:::-;24688:139;;24586:248;;;:::o;24840:419::-;25006:4;25044:2;25033:9;25029:18;25021:26;;25093:9;25087:4;25083:20;25079:1;25068:9;25064:17;25057:47;25121:131;25247:4;25121:131;:::i;:::-;25113:139;;25011:248;;;:::o;25265:419::-;25431:4;25469:2;25458:9;25454:18;25446:26;;25518:9;25512:4;25508:20;25504:1;25493:9;25489:17;25482:47;25546:131;25672:4;25546:131;:::i;:::-;25538:139;;25436:248;;;:::o;25690:419::-;25856:4;25894:2;25883:9;25879:18;25871:26;;25943:9;25937:4;25933:20;25929:1;25918:9;25914:17;25907:47;25971:131;26097:4;25971:131;:::i;:::-;25963:139;;25861:248;;;:::o;26115:419::-;26281:4;26319:2;26308:9;26304:18;26296:26;;26368:9;26362:4;26358:20;26354:1;26343:9;26339:17;26332:47;26396:131;26522:4;26396:131;:::i;:::-;26388:139;;26286:248;;;:::o;26540:419::-;26706:4;26744:2;26733:9;26729:18;26721:26;;26793:9;26787:4;26783:20;26779:1;26768:9;26764:17;26757:47;26821:131;26947:4;26821:131;:::i;:::-;26813:139;;26711:248;;;:::o;26965:419::-;27131:4;27169:2;27158:9;27154:18;27146:26;;27218:9;27212:4;27208:20;27204:1;27193:9;27189:17;27182:47;27246:131;27372:4;27246:131;:::i;:::-;27238:139;;27136:248;;;:::o;27390:419::-;27556:4;27594:2;27583:9;27579:18;27571:26;;27643:9;27637:4;27633:20;27629:1;27618:9;27614:17;27607:47;27671:131;27797:4;27671:131;:::i;:::-;27663:139;;27561:248;;;:::o;27815:419::-;27981:4;28019:2;28008:9;28004:18;27996:26;;28068:9;28062:4;28058:20;28054:1;28043:9;28039:17;28032:47;28096:131;28222:4;28096:131;:::i;:::-;28088:139;;27986:248;;;:::o;28240:419::-;28406:4;28444:2;28433:9;28429:18;28421:26;;28493:9;28487:4;28483:20;28479:1;28468:9;28464:17;28457:47;28521:131;28647:4;28521:131;:::i;:::-;28513:139;;28411:248;;;:::o;28665:419::-;28831:4;28869:2;28858:9;28854:18;28846:26;;28918:9;28912:4;28908:20;28904:1;28893:9;28889:17;28882:47;28946:131;29072:4;28946:131;:::i;:::-;28938:139;;28836:248;;;:::o;29090:419::-;29256:4;29294:2;29283:9;29279:18;29271:26;;29343:9;29337:4;29333:20;29329:1;29318:9;29314:17;29307:47;29371:131;29497:4;29371:131;:::i;:::-;29363:139;;29261:248;;;:::o;29515:419::-;29681:4;29719:2;29708:9;29704:18;29696:26;;29768:9;29762:4;29758:20;29754:1;29743:9;29739:17;29732:47;29796:131;29922:4;29796:131;:::i;:::-;29788:139;;29686:248;;;:::o;29940:419::-;30106:4;30144:2;30133:9;30129:18;30121:26;;30193:9;30187:4;30183:20;30179:1;30168:9;30164:17;30157:47;30221:131;30347:4;30221:131;:::i;:::-;30213:139;;30111:248;;;:::o;30365:419::-;30531:4;30569:2;30558:9;30554:18;30546:26;;30618:9;30612:4;30608:20;30604:1;30593:9;30589:17;30582:47;30646:131;30772:4;30646:131;:::i;:::-;30638:139;;30536:248;;;:::o;30790:419::-;30956:4;30994:2;30983:9;30979:18;30971:26;;31043:9;31037:4;31033:20;31029:1;31018:9;31014:17;31007:47;31071:131;31197:4;31071:131;:::i;:::-;31063:139;;30961:248;;;:::o;31215:419::-;31381:4;31419:2;31408:9;31404:18;31396:26;;31468:9;31462:4;31458:20;31454:1;31443:9;31439:17;31432:47;31496:131;31622:4;31496:131;:::i;:::-;31488:139;;31386:248;;;:::o;31640:419::-;31806:4;31844:2;31833:9;31829:18;31821:26;;31893:9;31887:4;31883:20;31879:1;31868:9;31864:17;31857:47;31921:131;32047:4;31921:131;:::i;:::-;31913:139;;31811:248;;;:::o;32065:419::-;32231:4;32269:2;32258:9;32254:18;32246:26;;32318:9;32312:4;32308:20;32304:1;32293:9;32289:17;32282:47;32346:131;32472:4;32346:131;:::i;:::-;32338:139;;32236:248;;;:::o;32490:419::-;32656:4;32694:2;32683:9;32679:18;32671:26;;32743:9;32737:4;32733:20;32729:1;32718:9;32714:17;32707:47;32771:131;32897:4;32771:131;:::i;:::-;32763:139;;32661:248;;;:::o;32915:419::-;33081:4;33119:2;33108:9;33104:18;33096:26;;33168:9;33162:4;33158:20;33154:1;33143:9;33139:17;33132:47;33196:131;33322:4;33196:131;:::i;:::-;33188:139;;33086:248;;;:::o;33340:419::-;33506:4;33544:2;33533:9;33529:18;33521:26;;33593:9;33587:4;33583:20;33579:1;33568:9;33564:17;33557:47;33621:131;33747:4;33621:131;:::i;:::-;33613:139;;33511:248;;;:::o;33765:218::-;33856:4;33894:2;33883:9;33879:18;33871:26;;33907:69;33973:1;33962:9;33958:17;33949:6;33907:69;:::i;:::-;33861:122;;;;:::o;33989:222::-;34082:4;34120:2;34109:9;34105:18;34097:26;;34133:71;34201:1;34190:9;34186:17;34177:6;34133:71;:::i;:::-;34087:124;;;;:::o;34217:214::-;34306:4;34344:2;34333:9;34329:18;34321:26;;34357:67;34421:1;34410:9;34406:17;34397:6;34357:67;:::i;:::-;34311:120;;;;:::o;34437:129::-;34471:6;34498:20;;:::i;:::-;34488:30;;34527:33;34555:4;34547:6;34527:33;:::i;:::-;34478:88;;;:::o;34572:75::-;34605:6;34638:2;34632:9;34622:19;;34612:35;:::o;34653:307::-;34714:4;34804:18;34796:6;34793:30;34790:2;;;34826:18;;:::i;:::-;34790:2;34864:29;34886:6;34864:29;:::i;:::-;34856:37;;34948:4;34942;34938:15;34930:23;;34719:241;;;:::o;34966:308::-;35028:4;35118:18;35110:6;35107:30;35104:2;;;35140:18;;:::i;:::-;35104:2;35178:29;35200:6;35178:29;:::i;:::-;35170:37;;35262:4;35256;35252:15;35244:23;;35033:241;;;:::o;35280:98::-;35331:6;35365:5;35359:12;35349:22;;35338:40;;;:::o;35384:99::-;35436:6;35470:5;35464:12;35454:22;;35443:40;;;:::o;35489:168::-;35572:11;35606:6;35601:3;35594:19;35646:4;35641:3;35637:14;35622:29;;35584:73;;;;:::o;35663:169::-;35747:11;35781:6;35776:3;35769:19;35821:4;35816:3;35812:14;35797:29;;35759:73;;;;:::o;35838:148::-;35940:11;35977:3;35962:18;;35952:34;;;;:::o;35992:242::-;36031:3;36050:19;36067:1;36050:19;:::i;:::-;36045:24;;36083:19;36100:1;36083:19;:::i;:::-;36078:24;;36176:1;36168:6;36164:14;36161:1;36158:21;36155:2;;;36182:18;;:::i;:::-;36155:2;36226:1;36223;36219:9;36212:16;;36035:199;;;;:::o;36240:305::-;36280:3;36299:20;36317:1;36299:20;:::i;:::-;36294:25;;36333:20;36351:1;36333:20;:::i;:::-;36328:25;;36487:1;36419:66;36415:74;36412:1;36409:81;36406:2;;;36493:18;;:::i;:::-;36406:2;36537:1;36534;36530:9;36523:16;;36284:261;;;;:::o;36551:185::-;36591:1;36608:20;36626:1;36608:20;:::i;:::-;36603:25;;36642:20;36660:1;36642:20;:::i;:::-;36637:25;;36681:1;36671:2;;36686:18;;:::i;:::-;36671:2;36728:1;36725;36721:9;36716:14;;36593:143;;;;:::o;36742:348::-;36782:7;36805:20;36823:1;36805:20;:::i;:::-;36800:25;;36839:20;36857:1;36839:20;:::i;:::-;36834:25;;37027:1;36959:66;36955:74;36952:1;36949:81;36944:1;36937:9;36930:17;36926:105;36923:2;;;37034:18;;:::i;:::-;36923:2;37082:1;37079;37075:9;37064:20;;36790:300;;;;:::o;37096:188::-;37135:4;37155:19;37172:1;37155:19;:::i;:::-;37150:24;;37188:19;37205:1;37188:19;:::i;:::-;37183:24;;37226:1;37223;37220:8;37217:2;;;37231:18;;:::i;:::-;37217:2;37276:1;37273;37269:9;37261:17;;37140:144;;;;:::o;37290:191::-;37330:4;37350:20;37368:1;37350:20;:::i;:::-;37345:25;;37384:20;37402:1;37384:20;:::i;:::-;37379:25;;37423:1;37420;37417:8;37414:2;;;37428:18;;:::i;:::-;37414:2;37473:1;37470;37466:9;37458:17;;37335:146;;;;:::o;37487:185::-;37525:4;37545:18;37561:1;37545:18;:::i;:::-;37540:23;;37577:18;37593:1;37577:18;:::i;:::-;37572:23;;37614:1;37611;37608:8;37605:2;;;37619:18;;:::i;:::-;37605:2;37664:1;37661;37657:9;37649:17;;37530:142;;;;:::o;37678:96::-;37715:7;37744:24;37762:5;37744:24;:::i;:::-;37733:35;;37723:51;;;:::o;37780:90::-;37814:7;37857:5;37850:13;37843:21;37832:32;;37822:48;;;:::o;37876:149::-;37912:7;37952:66;37945:5;37941:78;37930:89;;37920:105;;;:::o;38031:131::-;38078:7;38107:5;38096:16;;38113:43;38150:5;38113:43;:::i;:::-;38086:76;;;:::o;38168:89::-;38204:7;38244:6;38237:5;38233:18;38222:29;;38212:45;;;:::o;38263:126::-;38300:7;38340:42;38333:5;38329:54;38318:65;;38308:81;;;:::o;38395:77::-;38432:7;38461:5;38450:16;;38440:32;;;:::o;38478:86::-;38513:7;38553:4;38546:5;38542:16;38531:27;;38521:43;;;:::o;38570:131::-;38628:9;38661:34;38689:5;38661:34;:::i;:::-;38648:47;;38638:63;;;:::o;38707:154::-;38791:6;38786:3;38781;38768:30;38853:1;38844:6;38839:3;38835:16;38828:27;38758:103;;;:::o;38867:307::-;38935:1;38945:113;38959:6;38956:1;38953:13;38945:113;;;39044:1;39039:3;39035:11;39029:18;39025:1;39020:3;39016:11;39009:39;38981:2;38978:1;38974:10;38969:15;;38945:113;;;39076:6;39073:1;39070:13;39067:2;;;39156:1;39147:6;39142:3;39138:16;39131:27;39067:2;38916:258;;;;:::o;39180:320::-;39224:6;39261:1;39255:4;39251:12;39241:22;;39308:1;39302:4;39298:12;39329:18;39319:2;;39385:4;39377:6;39373:17;39363:27;;39319:2;39447;39439:6;39436:14;39416:18;39413:38;39410:2;;;39466:18;;:::i;:::-;39410:2;39231:269;;;;:::o;39506:281::-;39589:27;39611:4;39589:27;:::i;:::-;39581:6;39577:40;39719:6;39707:10;39704:22;39683:18;39671:10;39668:34;39665:62;39662:2;;;39730:18;;:::i;:::-;39662:2;39770:10;39766:2;39759:22;39549:238;;;:::o;39793:233::-;39832:3;39855:24;39873:5;39855:24;:::i;:::-;39846:33;;39901:66;39894:5;39891:77;39888:2;;;39971:18;;:::i;:::-;39888:2;40018:1;40011:5;40007:13;40000:20;;39836:190;;;:::o;40032:176::-;40064:1;40081:20;40099:1;40081:20;:::i;:::-;40076:25;;40115:20;40133:1;40115:20;:::i;:::-;40110:25;;40154:1;40144:2;;40159:18;;:::i;:::-;40144:2;40200:1;40197;40193:9;40188:14;;40066:142;;;;:::o;40214:180::-;40262:77;40259:1;40252:88;40359:4;40356:1;40349:15;40383:4;40380:1;40373:15;40400:180;40448:77;40445:1;40438:88;40545:4;40542:1;40535:15;40569:4;40566:1;40559:15;40586:180;40634:77;40631:1;40624:88;40731:4;40728:1;40721:15;40755:4;40752:1;40745:15;40772:180;40820:77;40817:1;40810:88;40917:4;40914:1;40907:15;40941:4;40938:1;40931:15;40958:180;41006:77;41003:1;40996:88;41103:4;41100:1;41093:15;41127:4;41124:1;41117:15;41144:102;41185:6;41236:2;41232:7;41227:2;41220:5;41216:14;41212:28;41202:38;;41192:54;;;:::o;41252:170::-;41392:22;41388:1;41380:6;41376:14;41369:46;41358:64;:::o;41428:168::-;41568:20;41564:1;41556:6;41552:14;41545:44;41534:62;:::o;41602:221::-;41742:34;41738:1;41730:6;41726:14;41719:58;41811:4;41806:2;41798:6;41794:15;41787:29;41708:115;:::o;41829:230::-;41969:34;41965:1;41957:6;41953:14;41946:58;42038:13;42033:2;42025:6;42021:15;42014:38;41935:124;:::o;42065:237::-;42205:34;42201:1;42193:6;42189:14;42182:58;42274:20;42269:2;42261:6;42257:15;42250:45;42171:131;:::o;42308:225::-;42448:34;42444:1;42436:6;42432:14;42425:58;42517:8;42512:2;42504:6;42500:15;42493:33;42414:119;:::o;42539:224::-;42679:34;42675:1;42667:6;42663:14;42656:58;42748:7;42743:2;42735:6;42731:15;42724:32;42645:118;:::o;42769:178::-;42909:30;42905:1;42897:6;42893:14;42886:54;42875:72;:::o;42953:223::-;43093:34;43089:1;43081:6;43077:14;43070:58;43162:6;43157:2;43149:6;43145:15;43138:31;43059:117;:::o;43182:175::-;43322:27;43318:1;43310:6;43306:14;43299:51;43288:69;:::o;43363:166::-;43503:18;43499:1;43491:6;43487:14;43480:42;43469:60;:::o;43535:228::-;43675:34;43671:1;43663:6;43659:14;43652:58;43744:11;43739:2;43731:6;43727:15;43720:36;43641:122;:::o;43769:173::-;43909:25;43905:1;43897:6;43893:14;43886:49;43875:67;:::o;43948:249::-;44088:34;44084:1;44076:6;44072:14;44065:58;44157:32;44152:2;44144:6;44140:15;44133:57;44054:143;:::o;44203:182::-;44343:34;44339:1;44331:6;44327:14;44320:58;44309:76;:::o;44391:182::-;44531:34;44527:1;44519:6;44515:14;44508:58;44497:76;:::o;44579:171::-;44719:23;44715:1;44707:6;44703:14;44696:47;44685:65;:::o;44756:234::-;44896:34;44892:1;44884:6;44880:14;44873:58;44965:17;44960:2;44952:6;44948:15;44941:42;44862:128;:::o;44996:174::-;45136:26;45132:1;45124:6;45120:14;45113:50;45102:68;:::o;45176:220::-;45316:34;45312:1;45304:6;45300:14;45293:58;45385:3;45380:2;45372:6;45368:15;45361:28;45282:114;:::o;45402:178::-;45542:30;45538:1;45530:6;45526:14;45519:54;45508:72;:::o;45586:174::-;45726:26;45722:1;45714:6;45710:14;45703:50;45692:68;:::o;45766:231::-;45906:34;45902:1;45894:6;45890:14;45883:58;45975:14;45970:2;45962:6;45958:15;45951:39;45872:125;:::o;46003:233::-;46143:34;46139:1;46131:6;46127:14;46120:58;46212:16;46207:2;46199:6;46195:15;46188:41;46109:127;:::o;46242:181::-;46382:33;46378:1;46370:6;46366:14;46359:57;46348:75;:::o;46429:169::-;46569:21;46565:1;46557:6;46553:14;46546:45;46535:63;:::o;46604:115::-;46687:1;46680:5;46677:12;46667:2;;46693:18;;:::i;:::-;46667:2;46657:62;:::o;46725:122::-;46798:24;46816:5;46798:24;:::i;:::-;46791:5;46788:35;46778:2;;46837:1;46834;46827:12;46778:2;46768:79;:::o;46853:116::-;46923:21;46938:5;46923:21;:::i;:::-;46916:5;46913:32;46903:2;;46959:1;46956;46949:12;46903:2;46893:76;:::o;46975:120::-;47047:23;47064:5;47047:23;:::i;:::-;47040:5;47037:34;47027:2;;47085:1;47082;47075:12;47027:2;47017:78;:::o;47101:109::-;47184:1;47177:5;47174:12;47164:2;;47200:1;47197;47190:12;47164:2;47154:56;:::o;47216:122::-;47289:24;47307:5;47289:24;:::i;:::-;47282:5;47279:35;47269:2;;47328:1;47325;47318:12;47269:2;47259:79;:::o;47344:118::-;47415:22;47431:5;47415:22;:::i;:::-;47408:5;47405:33;47395:2;;47452:1;47449;47442:12;47395:2;47385:77;:::o

Swarm Source

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