ETH Price: $3,274.89 (+0.65%)
Gas: 1 Gwei

Token

365 Space Project (SPACE)
 

Overview

Max Total Supply

243 SPACE

Holders

93

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
15 SPACE
0x6403AAe03667cDbcEeE9c14d4Bc6D45B7Dd4728e
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:
Project365Space

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-20
*/

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



pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/math/SafeMath.sol



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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



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() {
        _setOwner(_msgSender());
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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



pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/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



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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/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 tokenId);

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



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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @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 of token that is not own");
        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);
    }

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

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

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

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



pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/365 Space Project NEW.sol


pragma solidity ^0.8.0;





contract Project365Space is ERC721Enumerable, Ownable {
    using Strings for uint256;
    using SafeMath for uint256;
    using Counters for Counters.Counter;

    Counters.Counter private tokenIdsCounter;

    enum SaleStage { sale1, sale2 }     // ids are 0, 1

    SaleStage public saleStage = SaleStage.sale1;     // Default to other
    mapping(uint => uint256) numTokensSoldByStage;      // Number of tokens sold by each stage
    mapping(uint => uint256) maxCapByStage;             // Max tokens that can be minted in sale stage

    string public baseURI;  // Base URI for json files
    string public baseExtension = ".json";  // extension for tokenURI files
    string public notRevealedUri;
    uint256 public cost = 0.07 ether;    // Cost per NFT
    uint256 public maxSupply = 5110;
    uint256 public maxMintAmount = 10;  // Maximum number of tokens can be minted in single transaction
    bool public paused = false;
    bool public isSaleActive = false;
    bool public revealed = false;
    bool public allowOnlyWhitelisted = false;
    address[] public whitelistedAddresses;

    constructor(
        string memory _initBaseURI,
        string memory _initNotRevealedUri
    ) ERC721("365 Space Project", "SPACE") {
        setBaseURI(_initBaseURI);
        setNotRevealedURI(_initNotRevealedUri);

        // Initialise max cap for sale stages
        maxCapByStage[uint(SaleStage.sale1)] = 1000;
        maxCapByStage[uint(SaleStage.sale2)] = 4000;
    }

    /**
     * reserve NFTs to given address
     */
    function reserve(address _to, uint _numOfNfts) public onlyOwner {
        uint256 supply = totalSupply();
        require(!paused, "Contract paused!");
        require(_to != address(0), "_to address cannot be dead address!");
        require(_numOfNfts > 0);
        require(supply.add(_numOfNfts) <= maxSupply, "MaxSupply exceeding!");

        for (uint256 i = 1; i <= _numOfNfts; i++) {
            tokenIdsCounter.increment();
            _safeMint(_to, tokenIdsCounter.current());
        }
    }

    function getMaxCapForStage(uint _stage) public view returns (uint256) {
        return maxCapByStage[_stage];
    }

    function getNumberOfTokensSoldByStage(uint _stage) public view returns (uint256) {
        return numTokensSoldByStage[_stage];
    }

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

    // public
    function mint(address _to, uint256 _mintAmount) public payable {
        uint256 supply = totalSupply();
        require(!paused, "Contract paused!");
        require(_to != address(0), "_to address cannot be dead address!");
        require(_mintAmount > 0);
        require(_mintAmount <= maxMintAmount, "_mintAmount exceeds max maxMintAmount!");
        require(supply.add(_mintAmount) <= maxSupply, "MaxSupply exceeding!");

        if (msg.sender != owner()) {
            require(isSaleActive, "Sale is inactive");
            if (allowOnlyWhitelisted == true) {
                require(isWhitelisted(msg.sender), "user is not whitelisted");
            }
            require(msg.value >= cost.mul(_mintAmount), "Not enough ethers sent to mint NFTs!");
        }

        if (isSaleActive) {
            uint256 _totalSell = numTokensSoldByStage[uint(saleStage)].add(_mintAmount);
            require(_totalSell <= maxCapByStage[uint(saleStage)], "_mintAmount exceeding max cap for current sale!");

            // Update token sold count
            numTokensSoldByStage[uint(saleStage)] = numTokensSoldByStage[uint(saleStage)].add(_mintAmount);
        }

        for (uint256 i = 1; i <= _mintAmount; i++) {
            tokenIdsCounter.increment();
            _safeMint(_to, tokenIdsCounter.current());
        }
    }

    function isWhitelisted(address _user) public view returns (bool) {
        for (uint i = 0; i < whitelistedAddresses.length; i++) {
            if (whitelistedAddresses[i] == _user) {
                return true;
            }
        }

        return false;
    }

    /**
     * @dev get tokenIds of _account address
     */
    function walletOfOwner(address _account)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_account);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_account, i);
        }
        return tokenIds;
    }

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

        if (revealed == false) {
            return notRevealedUri;
        }

        string memory currentBaseURI = _baseURI();

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

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

        require(!paused, "ERC721Pausable: token transfer while paused");
    }

    //only owner
    function reveal() public onlyOwner {
        revealed = true;
    }

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

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

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

    function setmaxCapForStage(uint _stage, uint256 _maxCap) public onlyOwner() {
        maxCapByStage[_stage] = _maxCap;
    }

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

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

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

    function setIsSaleActive(bool _state) public onlyOwner {
        isSaleActive = _state;
    }

    /**
    * @dev Allows admin to update the sale stage
    * @param _stage sale stage
    */
    function setSaleStage(uint _stage) public onlyOwner {
        if(uint(SaleStage.sale1) == _stage) {
            saleStage = SaleStage.sale1;
            cost = 0.07 ether;
        } else if (uint(SaleStage.sale2) == _stage) {
            saleStage = SaleStage.sale2;
            cost = 0.09 ether;
        }
    }

    function setAllowOnlyWhitelisted(bool _state) public onlyOwner {
        allowOnlyWhitelisted = _state;
    }

    function whitelistUsers(address[] calldata _users) public onlyOwner {
        delete whitelistedAddresses;
        whitelistedAddresses = _users;
    }

    /**
     * @dev Withdraw ethers available on contract to the callers address
     */
    function withdraw() public payable onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"allowOnlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stage","type":"uint256"}],"name":"getMaxCapForStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stage","type":"uint256"}],"name":"getNumberOfTokensSoldByStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_numOfNfts","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"name":"saleStage","outputs":[{"internalType":"enum Project365Space.SaleStage","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setAllowOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setIsSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stage","type":"uint256"}],"name":"setSaleStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stage","type":"uint256"},{"internalType":"uint256","name":"_maxCap","type":"uint256"}],"name":"setmaxCapForStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[{"internalType":"address","name":"_account","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600c60006101000a81548160ff0219169083600181111562000051577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055506040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060109080519060200190620000a392919062000537565b5066f8b0a10e4700006012556113f6601355600a6014556000601560006101000a81548160ff0219169083151502179055506000601560016101000a81548160ff0219169083151502179055506000601560026101000a81548160ff0219169083151502179055506000601560036101000a81548160ff0219169083151502179055503480156200013357600080fd5b50604051620061d6380380620061d6833981810160405281019062000159919062000659565b6040518060400160405280601181526020017f3336352053706163652050726f6a6563740000000000000000000000000000008152506040518060400160405280600581526020017f53504143450000000000000000000000000000000000000000000000000000008152508160009080519060200190620001dd92919062000537565b508060019080519060200190620001f692919062000537565b505050620002196200020d620002e960201b60201c565b620002f160201b60201c565b6200022a82620003b760201b60201c565b6200023b816200046260201b60201c565b6103e8600e60008060018111156200027c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002081905550610fa0600e6000600180811115620002cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002081905550505062000872565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003c7620002e960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003ed6200050d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000446576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200043d906200070e565b60405180910390fd5b80600f90805190602001906200045e92919062000537565b5050565b62000472620002e960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620004986200050d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620004f1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004e8906200070e565b60405180910390fd5b80601190805190602001906200050992919062000537565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200054590620007de565b90600052602060002090601f016020900481019282620005695760008555620005b5565b82601f106200058457805160ff1916838001178555620005b5565b82800160010185558215620005b5579182015b82811115620005b457825182559160200191906001019062000597565b5b509050620005c49190620005c8565b5090565b5b80821115620005e3576000816000905550600101620005c9565b5090565b6000620005fe620005f88462000764565b62000730565b9050828152602081018484840111156200061757600080fd5b62000624848285620007a8565b509392505050565b600082601f8301126200063e57600080fd5b815162000650848260208601620005e7565b91505092915050565b600080604083850312156200066d57600080fd5b600083015167ffffffffffffffff8111156200068857600080fd5b62000696858286016200062c565b925050602083015167ffffffffffffffff811115620006b457600080fd5b620006c2858286016200062c565b9150509250929050565b6000620006db60208362000797565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600060208201905081810360008301526200072981620006cc565b9050919050565b6000604051905081810181811067ffffffffffffffff821117156200075a576200075962000843565b5b8060405250919050565b600067ffffffffffffffff82111562000782576200078162000843565b5b601f19601f8301169050602081019050919050565b600082825260208201905092915050565b60005b83811015620007c8578082015181840152602081019050620007ab565b83811115620007d8576000848401525b50505050565b60006002820490506001821680620007f757607f821691505b602082108114156200080e576200080d62000814565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61595480620008826000396000f3fe6080604052600436106102c95760003560e01c80635c975abb11610175578063ba4e5c49116100dc578063d5abeb0111610095578063edec5f271161006f578063edec5f2714610afe578063ee67c5d714610b27578063f2c4ce1e14610b50578063f2fde38b14610b79576102c9565b8063d5abeb0114610a6d578063da3ef23f14610a98578063e985e9c514610ac1576102c9565b8063ba4e5c491461094b578063c668286214610988578063c87b56dd146109b3578063cae83aef146109f0578063cc47a40b14610a1b578063d2d65ff514610a44576102c9565b80637f00c7a61161012e5780637f00c7a6146108635780638da5cb5b1461088c57806395d89b41146108b7578063a22cb465146108e2578063a475b5dd1461090b578063b88d4fde14610922576102c9565b80635c975abb1461073f5780635d7d53f11461076a5780636352211e146107a75780636c0360eb146107e457806370a082311461080f578063715018a61461084c576102c9565b80632e47aca311610234578063438b6300116101ed5780634f6ccce7116101c75780634f6ccce71461068357806351830227146106c057806355f804b3146106eb578063564566a814610714576102c9565b8063438b6300146105f257806344a0d68a1461062f5780634aaca86d14610658576102c9565b80632e47aca3146105005780632f745c59146105295780633af32abf146105665780633ccfd60b146105a357806340c10f19146105ad57806342842e0e146105c9576102c9565b806311f8e6781161028657806311f8e678146103f057806313faede61461041957806318160ddd1461044457806321580b7d1461046f578063239c70ae146104ac57806323b872dd146104d7576102c9565b806301ffc9a7146102ce57806302329a291461030b57806306fdde0314610334578063081812fc1461035f578063081c8c441461039c578063095ea7b3146103c7575b600080fd5b3480156102da57600080fd5b506102f560048036038101906102f091906142fa565b610ba2565b6040516103029190615021565b60405180910390f35b34801561031757600080fd5b50610332600480360381019061032d91906142d1565b610c1c565b005b34801561034057600080fd5b50610349610cb5565b6040516103569190615057565b60405180910390f35b34801561036b57600080fd5b506103866004803603810190610381919061438d565b610d47565b6040516103939190614f98565b60405180910390f35b3480156103a857600080fd5b506103b1610dcc565b6040516103be9190615057565b60405180910390f35b3480156103d357600080fd5b506103ee60048036038101906103e99190614250565b610e5a565b005b3480156103fc57600080fd5b506104176004803603810190610412919061438d565b610f72565b005b34801561042557600080fd5b5061042e611138565b60405161043b91906153d9565b60405180910390f35b34801561045057600080fd5b5061045961113e565b60405161046691906153d9565b60405180910390f35b34801561047b57600080fd5b506104966004803603810190610491919061438d565b61114b565b6040516104a391906153d9565b60405180910390f35b3480156104b857600080fd5b506104c1611168565b6040516104ce91906153d9565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f9919061414a565b61116e565b005b34801561050c57600080fd5b50610527600480360381019061052291906143b6565b6111ce565b005b34801561053557600080fd5b50610550600480360381019061054b9190614250565b611266565b60405161055d91906153d9565b60405180910390f35b34801561057257600080fd5b5061058d600480360381019061058891906140e5565b61130b565b60405161059a9190615021565b60405180910390f35b6105ab6113e0565b005b6105c760048036038101906105c29190614250565b61149c565b005b3480156105d557600080fd5b506105f060048036038101906105eb919061414a565b61198b565b005b3480156105fe57600080fd5b50610619600480360381019061061491906140e5565b6119ab565b6040516106269190614fff565b60405180910390f35b34801561063b57600080fd5b506106566004803603810190610651919061438d565b611aa5565b005b34801561066457600080fd5b5061066d611b2b565b60405161067a919061503c565b60405180910390f35b34801561068f57600080fd5b506106aa60048036038101906106a5919061438d565b611b3e565b6040516106b791906153d9565b60405180910390f35b3480156106cc57600080fd5b506106d5611bd5565b6040516106e29190615021565b60405180910390f35b3480156106f757600080fd5b50610712600480360381019061070d919061434c565b611be8565b005b34801561072057600080fd5b50610729611c7e565b6040516107369190615021565b60405180910390f35b34801561074b57600080fd5b50610754611c91565b6040516107619190615021565b60405180910390f35b34801561077657600080fd5b50610791600480360381019061078c919061438d565b611ca4565b60405161079e91906153d9565b60405180910390f35b3480156107b357600080fd5b506107ce60048036038101906107c9919061438d565b611cc1565b6040516107db9190614f98565b60405180910390f35b3480156107f057600080fd5b506107f9611d73565b6040516108069190615057565b60405180910390f35b34801561081b57600080fd5b50610836600480360381019061083191906140e5565b611e01565b60405161084391906153d9565b60405180910390f35b34801561085857600080fd5b50610861611eb9565b005b34801561086f57600080fd5b5061088a6004803603810190610885919061438d565b611f41565b005b34801561089857600080fd5b506108a1611fc7565b6040516108ae9190614f98565b60405180910390f35b3480156108c357600080fd5b506108cc611ff1565b6040516108d99190615057565b60405180910390f35b3480156108ee57600080fd5b5061090960048036038101906109049190614214565b612083565b005b34801561091757600080fd5b50610920612204565b005b34801561092e57600080fd5b5061094960048036038101906109449190614199565b61229d565b005b34801561095757600080fd5b50610972600480360381019061096d919061438d565b6122ff565b60405161097f9190614f98565b60405180910390f35b34801561099457600080fd5b5061099d61233e565b6040516109aa9190615057565b60405180910390f35b3480156109bf57600080fd5b506109da60048036038101906109d5919061438d565b6123cc565b6040516109e79190615057565b60405180910390f35b3480156109fc57600080fd5b50610a05612525565b604051610a129190615021565b60405180910390f35b348015610a2757600080fd5b50610a426004803603810190610a3d9190614250565b612538565b005b348015610a5057600080fd5b50610a6b6004803603810190610a6691906142d1565b612728565b005b348015610a7957600080fd5b50610a826127c1565b604051610a8f91906153d9565b60405180910390f35b348015610aa457600080fd5b50610abf6004803603810190610aba919061434c565b6127c7565b005b348015610acd57600080fd5b50610ae86004803603810190610ae3919061410e565b61285d565b604051610af59190615021565b60405180910390f35b348015610b0a57600080fd5b50610b256004803603810190610b20919061428c565b6128f1565b005b348015610b3357600080fd5b50610b4e6004803603810190610b4991906142d1565b612991565b005b348015610b5c57600080fd5b50610b776004803603810190610b72919061434c565b612a2a565b005b348015610b8557600080fd5b50610ba06004803603810190610b9b91906140e5565b612ac0565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c155750610c1482612bb8565b5b9050919050565b610c24612c9a565b73ffffffffffffffffffffffffffffffffffffffff16610c42611fc7565b73ffffffffffffffffffffffffffffffffffffffff1614610c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8f90615299565b60405180910390fd5b80601560006101000a81548160ff02191690831515021790555050565b606060008054610cc490615706565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf090615706565b8015610d3d5780601f10610d1257610100808354040283529160200191610d3d565b820191906000526020600020905b815481529060010190602001808311610d2057829003601f168201915b5050505050905090565b6000610d5282612ca2565b610d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8890615279565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60118054610dd990615706565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0590615706565b8015610e525780601f10610e2757610100808354040283529160200191610e52565b820191906000526020600020905b815481529060010190602001808311610e3557829003601f168201915b505050505081565b6000610e6582611cc1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd906152f9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ef5612c9a565b73ffffffffffffffffffffffffffffffffffffffff161480610f245750610f2381610f1e612c9a565b61285d565b5b610f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5a906151f9565b60405180910390fd5b610f6d8383612d0e565b505050565b610f7a612c9a565b73ffffffffffffffffffffffffffffffffffffffff16610f98611fc7565b73ffffffffffffffffffffffffffffffffffffffff1614610fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe590615299565b60405180910390fd5b8060006001811115611029577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611093576000600c60006101000a81548160ff0219169083600181111561107b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555066f8b0a10e470000601281905550611135565b806001808111156110cd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611134576001600c60006101000a81548160ff0219169083600181111561111f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555067013fbe85edc900006012819055505b5b50565b60125481565b6000600880549050905090565b6000600e6000838152602001908152602001600020549050919050565b60145481565b61117f611179612c9a565b82612dc7565b6111be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b590615339565b60405180910390fd5b6111c9838383612ea5565b505050565b6111d6612c9a565b73ffffffffffffffffffffffffffffffffffffffff166111f4611fc7565b73ffffffffffffffffffffffffffffffffffffffff161461124a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124190615299565b60405180910390fd5b80600e6000848152602001908152602001600020819055505050565b600061127183611e01565b82106112b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a990615099565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600080600090505b6016805490508110156113d5578273ffffffffffffffffffffffffffffffffffffffff1660168281548110611371577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156113c25760019150506113db565b80806113cd90615738565b915050611313565b50600090505b919050565b6113e8612c9a565b73ffffffffffffffffffffffffffffffffffffffff16611406611fc7565b73ffffffffffffffffffffffffffffffffffffffff161461145c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145390615299565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061149a57600080fd5b565b60006114a661113e565b9050601560009054906101000a900460ff16156114f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ef90615179565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611568576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155f90615199565b60405180910390fd5b6000821161157557600080fd5b6014548211156115ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b1906151d9565b60405180910390fd5b6013546115d0838361310190919063ffffffff16565b1115611611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160890615319565b60405180910390fd5b611619611fc7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461175757601560019054906101000a900460ff1661169a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611691906153b9565b60405180910390fd5b60011515601560039054906101000a900460ff16151514156116ff576116bf3361130b565b6116fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f590615399565b60405180910390fd5b5b6117148260125461311790919063ffffffff16565b341015611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174d90615139565b60405180910390fd5b5b601560019054906101000a900460ff16156119475760006117db83600d6000600c60009054906101000a900460ff1660018111156117be577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000205461310190919063ffffffff16565b9050600e6000600c60009054906101000a900460ff166001811115611829577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000205481111561187a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187190615379565b60405180910390fd5b6118e783600d6000600c60009054906101000a900460ff1660018111156118ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000205461310190919063ffffffff16565b600d6000600c60009054906101000a900460ff166001811115611933577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002081905550505b6000600190505b8281116119855761195f600b61312d565b6119728461196d600b613143565b613151565b808061197d90615738565b91505061194e565b50505050565b6119a68383836040518060200160405280600081525061229d565b505050565b606060006119b883611e01565b905060008167ffffffffffffffff8111156119fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611a2a5781602001602082028036833780820191505090505b50905060005b82811015611a9a57611a428582611266565b828281518110611a7b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611a9290615738565b915050611a30565b508092505050919050565b611aad612c9a565b73ffffffffffffffffffffffffffffffffffffffff16611acb611fc7565b73ffffffffffffffffffffffffffffffffffffffff1614611b21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1890615299565b60405180910390fd5b8060128190555050565b600c60009054906101000a900460ff1681565b6000611b4861113e565b8210611b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8090615359565b60405180910390fd5b60088281548110611bc3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b601560029054906101000a900460ff1681565b611bf0612c9a565b73ffffffffffffffffffffffffffffffffffffffff16611c0e611fc7565b73ffffffffffffffffffffffffffffffffffffffff1614611c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5b90615299565b60405180910390fd5b80600f9080519060200190611c7a929190613dfe565b5050565b601560019054906101000a900460ff1681565b601560009054906101000a900460ff1681565b6000600d6000838152602001908152602001600020549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6190615239565b60405180910390fd5b80915050919050565b600f8054611d8090615706565b80601f0160208091040260200160405190810160405280929190818152602001828054611dac90615706565b8015611df95780601f10611dce57610100808354040283529160200191611df9565b820191906000526020600020905b815481529060010190602001808311611ddc57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6990615219565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ec1612c9a565b73ffffffffffffffffffffffffffffffffffffffff16611edf611fc7565b73ffffffffffffffffffffffffffffffffffffffff1614611f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2c90615299565b60405180910390fd5b611f3f600061316f565b565b611f49612c9a565b73ffffffffffffffffffffffffffffffffffffffff16611f67611fc7565b73ffffffffffffffffffffffffffffffffffffffff1614611fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb490615299565b60405180910390fd5b8060148190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461200090615706565b80601f016020809104026020016040519081016040528092919081815260200182805461202c90615706565b80156120795780601f1061204e57610100808354040283529160200191612079565b820191906000526020600020905b81548152906001019060200180831161205c57829003601f168201915b5050505050905090565b61208b612c9a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f090615159565b60405180910390fd5b8060056000612106612c9a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166121b3612c9a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121f89190615021565b60405180910390a35050565b61220c612c9a565b73ffffffffffffffffffffffffffffffffffffffff1661222a611fc7565b73ffffffffffffffffffffffffffffffffffffffff1614612280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227790615299565b60405180910390fd5b6001601560026101000a81548160ff021916908315150217905550565b6122ae6122a8612c9a565b83612dc7565b6122ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e490615339565b60405180910390fd5b6122f984848484613235565b50505050565b6016818154811061230f57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6010805461234b90615706565b80601f016020809104026020016040519081016040528092919081815260200182805461237790615706565b80156123c45780601f10612399576101008083540402835291602001916123c4565b820191906000526020600020905b8154815290600101906020018083116123a757829003601f168201915b505050505081565b60606123d782612ca2565b612416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240d906152d9565b60405180910390fd5b60001515601560029054906101000a900460ff16151514156124c4576011805461243f90615706565b80601f016020809104026020016040519081016040528092919081815260200182805461246b90615706565b80156124b85780601f1061248d576101008083540402835291602001916124b8565b820191906000526020600020905b81548152906001019060200180831161249b57829003601f168201915b50505050509050612520565b60006124ce613291565b905060008151116124ee576040518060200160405280600081525061251c565b806124f884613323565b601060405160200161250c93929190614f67565b6040516020818303038152906040525b9150505b919050565b601560039054906101000a900460ff1681565b612540612c9a565b73ffffffffffffffffffffffffffffffffffffffff1661255e611fc7565b73ffffffffffffffffffffffffffffffffffffffff16146125b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ab90615299565b60405180910390fd5b60006125be61113e565b9050601560009054906101000a900460ff1615612610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260790615179565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267790615199565b60405180910390fd5b6000821161268d57600080fd5b6013546126a3838361310190919063ffffffff16565b11156126e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126db90615319565b60405180910390fd5b6000600190505b828111612722576126fc600b61312d565b61270f8461270a600b613143565b613151565b808061271a90615738565b9150506126eb565b50505050565b612730612c9a565b73ffffffffffffffffffffffffffffffffffffffff1661274e611fc7565b73ffffffffffffffffffffffffffffffffffffffff16146127a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279b90615299565b60405180910390fd5b80601560016101000a81548160ff02191690831515021790555050565b60135481565b6127cf612c9a565b73ffffffffffffffffffffffffffffffffffffffff166127ed611fc7565b73ffffffffffffffffffffffffffffffffffffffff1614612843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283a90615299565b60405180910390fd5b8060109080519060200190612859929190613dfe565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6128f9612c9a565b73ffffffffffffffffffffffffffffffffffffffff16612917611fc7565b73ffffffffffffffffffffffffffffffffffffffff161461296d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296490615299565b60405180910390fd5b6016600061297b9190613e84565b81816016919061298c929190613ea5565b505050565b612999612c9a565b73ffffffffffffffffffffffffffffffffffffffff166129b7611fc7565b73ffffffffffffffffffffffffffffffffffffffff1614612a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0490615299565b60405180910390fd5b80601560036101000a81548160ff02191690831515021790555050565b612a32612c9a565b73ffffffffffffffffffffffffffffffffffffffff16612a50611fc7565b73ffffffffffffffffffffffffffffffffffffffff1614612aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9d90615299565b60405180910390fd5b8060119080519060200190612abc929190613dfe565b5050565b612ac8612c9a565b73ffffffffffffffffffffffffffffffffffffffff16612ae6611fc7565b73ffffffffffffffffffffffffffffffffffffffff1614612b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3390615299565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba3906150d9565b60405180910390fd5b612bb58161316f565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c8357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612c935750612c92826134d0565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612d8183611cc1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612dd282612ca2565b612e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e08906151b9565b60405180910390fd5b6000612e1c83611cc1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612e8b57508373ffffffffffffffffffffffffffffffffffffffff16612e7384610d47565b73ffffffffffffffffffffffffffffffffffffffff16145b80612e9c5750612e9b818561285d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612ec582611cc1565b73ffffffffffffffffffffffffffffffffffffffff1614612f1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f12906152b9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8290615119565b60405180910390fd5b612f9683838361353a565b612fa1600082612d0e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ff191906155f7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130489190615516565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000818361310f9190615516565b905092915050565b60008183613125919061559d565b905092915050565b6001816000016000828254019250508190555050565b600081600001549050919050565b61316b82826040518060200160405280600081525061359a565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613240848484612ea5565b61324c848484846135f5565b61328b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613282906150b9565b60405180910390fd5b50505050565b6060600f80546132a090615706565b80601f01602080910402602001604051908101604052809291908181526020018280546132cc90615706565b80156133195780601f106132ee57610100808354040283529160200191613319565b820191906000526020600020905b8154815290600101906020018083116132fc57829003601f168201915b5050505050905090565b6060600082141561336b576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134cb565b600082905060005b6000821461339d57808061338690615738565b915050600a82613396919061556c565b9150613373565b60008167ffffffffffffffff8111156133df577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156134115781602001600182028036833780820191505090505b5090505b600085146134c45760018261342a91906155f7565b9150600a856134399190615781565b60306134459190615516565b60f81b818381518110613481577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134bd919061556c565b9450613415565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61354583838361378c565b601560009054906101000a900460ff1615613595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161358c90615079565b60405180910390fd5b505050565b6135a483836138a0565b6135b160008484846135f5565b6135f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e7906150b9565b60405180910390fd5b505050565b60006136168473ffffffffffffffffffffffffffffffffffffffff16613a6e565b1561377f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261363f612c9a565b8786866040518563ffffffff1660e01b81526004016136619493929190614fb3565b602060405180830381600087803b15801561367b57600080fd5b505af19250505080156136ac57506040513d601f19601f820116820180604052508101906136a99190614323565b60015b61372f573d80600081146136dc576040519150601f19603f3d011682016040523d82523d6000602084013e6136e1565b606091505b50600081511415613727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161371e906150b9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613784565b600190505b949350505050565b613797838383613a81565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156137da576137d581613a86565b613819565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613818576138178382613acf565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561385c5761385781613c3c565b61389b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461389a576138998282613d7f565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161390790615259565b60405180910390fd5b61391981612ca2565b15613959576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613950906150f9565b60405180910390fd5b6139656000838361353a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139b59190615516565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613adc84611e01565b613ae691906155f7565b9050600060076000848152602001908152602001600020549050818114613bcb576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613c5091906155f7565b9050600060096000848152602001908152602001600020549050600060088381548110613ca6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613cee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613d63577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613d8a83611e01565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054613e0a90615706565b90600052602060002090601f016020900481019282613e2c5760008555613e73565b82601f10613e4557805160ff1916838001178555613e73565b82800160010185558215613e73579182015b82811115613e72578251825591602001919060010190613e57565b5b509050613e809190613f45565b5090565b5080546000825590600052602060002090810190613ea29190613f45565b50565b828054828255906000526020600020908101928215613f34579160200282015b82811115613f3357823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613ec5565b5b509050613f419190613f45565b5090565b5b80821115613f5e576000816000905550600101613f46565b5090565b6000613f75613f7084615425565b6153f4565b905082815260208101848484011115613f8d57600080fd5b613f988482856156c4565b509392505050565b6000613fb3613fae84615455565b6153f4565b905082815260208101848484011115613fcb57600080fd5b613fd68482856156c4565b509392505050565b600081359050613fed816158c2565b92915050565b60008083601f84011261400557600080fd5b8235905067ffffffffffffffff81111561401e57600080fd5b60208301915083602082028301111561403657600080fd5b9250929050565b60008135905061404c816158d9565b92915050565b600081359050614061816158f0565b92915050565b600081519050614076816158f0565b92915050565b600082601f83011261408d57600080fd5b813561409d848260208601613f62565b91505092915050565b600082601f8301126140b757600080fd5b81356140c7848260208601613fa0565b91505092915050565b6000813590506140df81615907565b92915050565b6000602082840312156140f757600080fd5b600061410584828501613fde565b91505092915050565b6000806040838503121561412157600080fd5b600061412f85828601613fde565b925050602061414085828601613fde565b9150509250929050565b60008060006060848603121561415f57600080fd5b600061416d86828701613fde565b935050602061417e86828701613fde565b925050604061418f868287016140d0565b9150509250925092565b600080600080608085870312156141af57600080fd5b60006141bd87828801613fde565b94505060206141ce87828801613fde565b93505060406141df878288016140d0565b925050606085013567ffffffffffffffff8111156141fc57600080fd5b6142088782880161407c565b91505092959194509250565b6000806040838503121561422757600080fd5b600061423585828601613fde565b92505060206142468582860161403d565b9150509250929050565b6000806040838503121561426357600080fd5b600061427185828601613fde565b9250506020614282858286016140d0565b9150509250929050565b6000806020838503121561429f57600080fd5b600083013567ffffffffffffffff8111156142b957600080fd5b6142c585828601613ff3565b92509250509250929050565b6000602082840312156142e357600080fd5b60006142f18482850161403d565b91505092915050565b60006020828403121561430c57600080fd5b600061431a84828501614052565b91505092915050565b60006020828403121561433557600080fd5b600061434384828501614067565b91505092915050565b60006020828403121561435e57600080fd5b600082013567ffffffffffffffff81111561437857600080fd5b614384848285016140a6565b91505092915050565b60006020828403121561439f57600080fd5b60006143ad848285016140d0565b91505092915050565b600080604083850312156143c957600080fd5b60006143d7858286016140d0565b92505060206143e8858286016140d0565b9150509250929050565b60006143fe8383614f49565b60208301905092915050565b6144138161562b565b82525050565b6000614424826154aa565b61442e81856154d8565b935061443983615485565b8060005b8381101561446a57815161445188826143f2565b975061445c836154cb565b92505060018101905061443d565b5085935050505092915050565b6144808161563d565b82525050565b6000614491826154b5565b61449b81856154e9565b93506144ab8185602086016156d3565b6144b48161589d565b840191505092915050565b6144c8816156b2565b82525050565b60006144d9826154c0565b6144e381856154fa565b93506144f38185602086016156d3565b6144fc8161589d565b840191505092915050565b6000614512826154c0565b61451c818561550b565b935061452c8185602086016156d3565b80840191505092915050565b6000815461454581615706565b61454f818661550b565b9450600182166000811461456a576001811461457b576145ae565b60ff198316865281860193506145ae565b61458485615495565b60005b838110156145a657815481890152600182019150602081019050614587565b838801955050505b50505092915050565b60006145c4602b836154fa565b91507f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008301527f68696c65207061757365640000000000000000000000000000000000000000006020830152604082019050919050565b600061462a602b836154fa565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006146906032836154fa565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006146f66026836154fa565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475c601c836154fa565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061479c6024836154fa565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006148026024836154fa565b91507f4e6f7420656e6f756768206574686572732073656e7420746f206d696e74204e60008301527f46547321000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006148686019836154fa565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006148a86010836154fa565b91507f436f6e74726163742070617573656421000000000000000000000000000000006000830152602082019050919050565b60006148e86023836154fa565b91507f5f746f20616464726573732063616e6e6f74206265206465616420616464726560008301527f73732100000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061494e602c836154fa565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006149b46026836154fa565b91507f5f6d696e74416d6f756e742065786365656473206d6178206d61784d696e744160008301527f6d6f756e742100000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a1a6038836154fa565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614a80602a836154fa565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ae66029836154fa565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b4c6020836154fa565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614b8c602c836154fa565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614bf26020836154fa565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614c326029836154fa565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c98602f836154fa565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614cfe6021836154fa565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d646014836154fa565b91507f4d6178537570706c7920657863656564696e67210000000000000000000000006000830152602082019050919050565b6000614da46031836154fa565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614e0a602c836154fa565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614e70602f836154fa565b91507f5f6d696e74416d6f756e7420657863656564696e67206d61782063617020666f60008301527f722063757272656e742073616c652100000000000000000000000000000000006020830152604082019050919050565b6000614ed66017836154fa565b91507f75736572206973206e6f742077686974656c69737465640000000000000000006000830152602082019050919050565b6000614f166010836154fa565b91507f53616c6520697320696e616374697665000000000000000000000000000000006000830152602082019050919050565b614f52816156a8565b82525050565b614f61816156a8565b82525050565b6000614f738286614507565b9150614f7f8285614507565b9150614f8b8284614538565b9150819050949350505050565b6000602082019050614fad600083018461440a565b92915050565b6000608082019050614fc8600083018761440a565b614fd5602083018661440a565b614fe26040830185614f58565b8181036060830152614ff48184614486565b905095945050505050565b600060208201905081810360008301526150198184614419565b905092915050565b60006020820190506150366000830184614477565b92915050565b600060208201905061505160008301846144bf565b92915050565b6000602082019050818103600083015261507181846144ce565b905092915050565b60006020820190508181036000830152615092816145b7565b9050919050565b600060208201905081810360008301526150b28161461d565b9050919050565b600060208201905081810360008301526150d281614683565b9050919050565b600060208201905081810360008301526150f2816146e9565b9050919050565b600060208201905081810360008301526151128161474f565b9050919050565b600060208201905081810360008301526151328161478f565b9050919050565b60006020820190508181036000830152615152816147f5565b9050919050565b600060208201905081810360008301526151728161485b565b9050919050565b600060208201905081810360008301526151928161489b565b9050919050565b600060208201905081810360008301526151b2816148db565b9050919050565b600060208201905081810360008301526151d281614941565b9050919050565b600060208201905081810360008301526151f2816149a7565b9050919050565b6000602082019050818103600083015261521281614a0d565b9050919050565b6000602082019050818103600083015261523281614a73565b9050919050565b6000602082019050818103600083015261525281614ad9565b9050919050565b6000602082019050818103600083015261527281614b3f565b9050919050565b6000602082019050818103600083015261529281614b7f565b9050919050565b600060208201905081810360008301526152b281614be5565b9050919050565b600060208201905081810360008301526152d281614c25565b9050919050565b600060208201905081810360008301526152f281614c8b565b9050919050565b6000602082019050818103600083015261531281614cf1565b9050919050565b6000602082019050818103600083015261533281614d57565b9050919050565b6000602082019050818103600083015261535281614d97565b9050919050565b6000602082019050818103600083015261537281614dfd565b9050919050565b6000602082019050818103600083015261539281614e63565b9050919050565b600060208201905081810360008301526153b281614ec9565b9050919050565b600060208201905081810360008301526153d281614f09565b9050919050565b60006020820190506153ee6000830184614f58565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561541b5761541a61586e565b5b8060405250919050565b600067ffffffffffffffff8211156154405761543f61586e565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156154705761546f61586e565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615521826156a8565b915061552c836156a8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615561576155606157b2565b5b828201905092915050565b6000615577826156a8565b9150615582836156a8565b925082615592576155916157e1565b5b828204905092915050565b60006155a8826156a8565b91506155b3836156a8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156155ec576155eb6157b2565b5b828202905092915050565b6000615602826156a8565b915061560d836156a8565b9250828210156156205761561f6157b2565b5b828203905092915050565b600061563682615688565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050615683826158ae565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006156bd82615675565b9050919050565b82818337600083830152505050565b60005b838110156156f15780820151818401526020810190506156d6565b83811115615700576000848401525b50505050565b6000600282049050600182168061571e57607f821691505b602082108114156157325761573161583f565b5b50919050565b6000615743826156a8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615776576157756157b2565b5b600182019050919050565b600061578c826156a8565b9150615797836156a8565b9250826157a7576157a66157e1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b600281106158bf576158be615810565b5b50565b6158cb8161562b565b81146158d657600080fd5b50565b6158e28161563d565b81146158ed57600080fd5b50565b6158f981615649565b811461590457600080fd5b50565b615910816156a8565b811461591b57600080fd5b5056fea26469706673582212207e3c7c2666461f3a7ce32ca43e5729c955c6ea5d5caedcd55a0f6dcdbc905c0c64736f6c63430008000033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5a664d5134437772776572615a4e685631316e4e6773795073626f34695675506350517447574d6768327a702f000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d596434695a6f657a577a5a537536737437436463373275776a744c644a56745869784b5a65314866535a54500000000000000000000000

Deployed Bytecode

0x6080604052600436106102c95760003560e01c80635c975abb11610175578063ba4e5c49116100dc578063d5abeb0111610095578063edec5f271161006f578063edec5f2714610afe578063ee67c5d714610b27578063f2c4ce1e14610b50578063f2fde38b14610b79576102c9565b8063d5abeb0114610a6d578063da3ef23f14610a98578063e985e9c514610ac1576102c9565b8063ba4e5c491461094b578063c668286214610988578063c87b56dd146109b3578063cae83aef146109f0578063cc47a40b14610a1b578063d2d65ff514610a44576102c9565b80637f00c7a61161012e5780637f00c7a6146108635780638da5cb5b1461088c57806395d89b41146108b7578063a22cb465146108e2578063a475b5dd1461090b578063b88d4fde14610922576102c9565b80635c975abb1461073f5780635d7d53f11461076a5780636352211e146107a75780636c0360eb146107e457806370a082311461080f578063715018a61461084c576102c9565b80632e47aca311610234578063438b6300116101ed5780634f6ccce7116101c75780634f6ccce71461068357806351830227146106c057806355f804b3146106eb578063564566a814610714576102c9565b8063438b6300146105f257806344a0d68a1461062f5780634aaca86d14610658576102c9565b80632e47aca3146105005780632f745c59146105295780633af32abf146105665780633ccfd60b146105a357806340c10f19146105ad57806342842e0e146105c9576102c9565b806311f8e6781161028657806311f8e678146103f057806313faede61461041957806318160ddd1461044457806321580b7d1461046f578063239c70ae146104ac57806323b872dd146104d7576102c9565b806301ffc9a7146102ce57806302329a291461030b57806306fdde0314610334578063081812fc1461035f578063081c8c441461039c578063095ea7b3146103c7575b600080fd5b3480156102da57600080fd5b506102f560048036038101906102f091906142fa565b610ba2565b6040516103029190615021565b60405180910390f35b34801561031757600080fd5b50610332600480360381019061032d91906142d1565b610c1c565b005b34801561034057600080fd5b50610349610cb5565b6040516103569190615057565b60405180910390f35b34801561036b57600080fd5b506103866004803603810190610381919061438d565b610d47565b6040516103939190614f98565b60405180910390f35b3480156103a857600080fd5b506103b1610dcc565b6040516103be9190615057565b60405180910390f35b3480156103d357600080fd5b506103ee60048036038101906103e99190614250565b610e5a565b005b3480156103fc57600080fd5b506104176004803603810190610412919061438d565b610f72565b005b34801561042557600080fd5b5061042e611138565b60405161043b91906153d9565b60405180910390f35b34801561045057600080fd5b5061045961113e565b60405161046691906153d9565b60405180910390f35b34801561047b57600080fd5b506104966004803603810190610491919061438d565b61114b565b6040516104a391906153d9565b60405180910390f35b3480156104b857600080fd5b506104c1611168565b6040516104ce91906153d9565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f9919061414a565b61116e565b005b34801561050c57600080fd5b50610527600480360381019061052291906143b6565b6111ce565b005b34801561053557600080fd5b50610550600480360381019061054b9190614250565b611266565b60405161055d91906153d9565b60405180910390f35b34801561057257600080fd5b5061058d600480360381019061058891906140e5565b61130b565b60405161059a9190615021565b60405180910390f35b6105ab6113e0565b005b6105c760048036038101906105c29190614250565b61149c565b005b3480156105d557600080fd5b506105f060048036038101906105eb919061414a565b61198b565b005b3480156105fe57600080fd5b50610619600480360381019061061491906140e5565b6119ab565b6040516106269190614fff565b60405180910390f35b34801561063b57600080fd5b506106566004803603810190610651919061438d565b611aa5565b005b34801561066457600080fd5b5061066d611b2b565b60405161067a919061503c565b60405180910390f35b34801561068f57600080fd5b506106aa60048036038101906106a5919061438d565b611b3e565b6040516106b791906153d9565b60405180910390f35b3480156106cc57600080fd5b506106d5611bd5565b6040516106e29190615021565b60405180910390f35b3480156106f757600080fd5b50610712600480360381019061070d919061434c565b611be8565b005b34801561072057600080fd5b50610729611c7e565b6040516107369190615021565b60405180910390f35b34801561074b57600080fd5b50610754611c91565b6040516107619190615021565b60405180910390f35b34801561077657600080fd5b50610791600480360381019061078c919061438d565b611ca4565b60405161079e91906153d9565b60405180910390f35b3480156107b357600080fd5b506107ce60048036038101906107c9919061438d565b611cc1565b6040516107db9190614f98565b60405180910390f35b3480156107f057600080fd5b506107f9611d73565b6040516108069190615057565b60405180910390f35b34801561081b57600080fd5b50610836600480360381019061083191906140e5565b611e01565b60405161084391906153d9565b60405180910390f35b34801561085857600080fd5b50610861611eb9565b005b34801561086f57600080fd5b5061088a6004803603810190610885919061438d565b611f41565b005b34801561089857600080fd5b506108a1611fc7565b6040516108ae9190614f98565b60405180910390f35b3480156108c357600080fd5b506108cc611ff1565b6040516108d99190615057565b60405180910390f35b3480156108ee57600080fd5b5061090960048036038101906109049190614214565b612083565b005b34801561091757600080fd5b50610920612204565b005b34801561092e57600080fd5b5061094960048036038101906109449190614199565b61229d565b005b34801561095757600080fd5b50610972600480360381019061096d919061438d565b6122ff565b60405161097f9190614f98565b60405180910390f35b34801561099457600080fd5b5061099d61233e565b6040516109aa9190615057565b60405180910390f35b3480156109bf57600080fd5b506109da60048036038101906109d5919061438d565b6123cc565b6040516109e79190615057565b60405180910390f35b3480156109fc57600080fd5b50610a05612525565b604051610a129190615021565b60405180910390f35b348015610a2757600080fd5b50610a426004803603810190610a3d9190614250565b612538565b005b348015610a5057600080fd5b50610a6b6004803603810190610a6691906142d1565b612728565b005b348015610a7957600080fd5b50610a826127c1565b604051610a8f91906153d9565b60405180910390f35b348015610aa457600080fd5b50610abf6004803603810190610aba919061434c565b6127c7565b005b348015610acd57600080fd5b50610ae86004803603810190610ae3919061410e565b61285d565b604051610af59190615021565b60405180910390f35b348015610b0a57600080fd5b50610b256004803603810190610b20919061428c565b6128f1565b005b348015610b3357600080fd5b50610b4e6004803603810190610b4991906142d1565b612991565b005b348015610b5c57600080fd5b50610b776004803603810190610b72919061434c565b612a2a565b005b348015610b8557600080fd5b50610ba06004803603810190610b9b91906140e5565b612ac0565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c155750610c1482612bb8565b5b9050919050565b610c24612c9a565b73ffffffffffffffffffffffffffffffffffffffff16610c42611fc7565b73ffffffffffffffffffffffffffffffffffffffff1614610c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8f90615299565b60405180910390fd5b80601560006101000a81548160ff02191690831515021790555050565b606060008054610cc490615706565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf090615706565b8015610d3d5780601f10610d1257610100808354040283529160200191610d3d565b820191906000526020600020905b815481529060010190602001808311610d2057829003601f168201915b5050505050905090565b6000610d5282612ca2565b610d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8890615279565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60118054610dd990615706565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0590615706565b8015610e525780601f10610e2757610100808354040283529160200191610e52565b820191906000526020600020905b815481529060010190602001808311610e3557829003601f168201915b505050505081565b6000610e6582611cc1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd906152f9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ef5612c9a565b73ffffffffffffffffffffffffffffffffffffffff161480610f245750610f2381610f1e612c9a565b61285d565b5b610f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5a906151f9565b60405180910390fd5b610f6d8383612d0e565b505050565b610f7a612c9a565b73ffffffffffffffffffffffffffffffffffffffff16610f98611fc7565b73ffffffffffffffffffffffffffffffffffffffff1614610fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe590615299565b60405180910390fd5b8060006001811115611029577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611093576000600c60006101000a81548160ff0219169083600181111561107b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555066f8b0a10e470000601281905550611135565b806001808111156110cd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611134576001600c60006101000a81548160ff0219169083600181111561111f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555067013fbe85edc900006012819055505b5b50565b60125481565b6000600880549050905090565b6000600e6000838152602001908152602001600020549050919050565b60145481565b61117f611179612c9a565b82612dc7565b6111be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b590615339565b60405180910390fd5b6111c9838383612ea5565b505050565b6111d6612c9a565b73ffffffffffffffffffffffffffffffffffffffff166111f4611fc7565b73ffffffffffffffffffffffffffffffffffffffff161461124a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124190615299565b60405180910390fd5b80600e6000848152602001908152602001600020819055505050565b600061127183611e01565b82106112b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a990615099565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600080600090505b6016805490508110156113d5578273ffffffffffffffffffffffffffffffffffffffff1660168281548110611371577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156113c25760019150506113db565b80806113cd90615738565b915050611313565b50600090505b919050565b6113e8612c9a565b73ffffffffffffffffffffffffffffffffffffffff16611406611fc7565b73ffffffffffffffffffffffffffffffffffffffff161461145c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145390615299565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061149a57600080fd5b565b60006114a661113e565b9050601560009054906101000a900460ff16156114f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ef90615179565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611568576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155f90615199565b60405180910390fd5b6000821161157557600080fd5b6014548211156115ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b1906151d9565b60405180910390fd5b6013546115d0838361310190919063ffffffff16565b1115611611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160890615319565b60405180910390fd5b611619611fc7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461175757601560019054906101000a900460ff1661169a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611691906153b9565b60405180910390fd5b60011515601560039054906101000a900460ff16151514156116ff576116bf3361130b565b6116fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f590615399565b60405180910390fd5b5b6117148260125461311790919063ffffffff16565b341015611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174d90615139565b60405180910390fd5b5b601560019054906101000a900460ff16156119475760006117db83600d6000600c60009054906101000a900460ff1660018111156117be577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000205461310190919063ffffffff16565b9050600e6000600c60009054906101000a900460ff166001811115611829577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000205481111561187a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187190615379565b60405180910390fd5b6118e783600d6000600c60009054906101000a900460ff1660018111156118ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000205461310190919063ffffffff16565b600d6000600c60009054906101000a900460ff166001811115611933577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002081905550505b6000600190505b8281116119855761195f600b61312d565b6119728461196d600b613143565b613151565b808061197d90615738565b91505061194e565b50505050565b6119a68383836040518060200160405280600081525061229d565b505050565b606060006119b883611e01565b905060008167ffffffffffffffff8111156119fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611a2a5781602001602082028036833780820191505090505b50905060005b82811015611a9a57611a428582611266565b828281518110611a7b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611a9290615738565b915050611a30565b508092505050919050565b611aad612c9a565b73ffffffffffffffffffffffffffffffffffffffff16611acb611fc7565b73ffffffffffffffffffffffffffffffffffffffff1614611b21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1890615299565b60405180910390fd5b8060128190555050565b600c60009054906101000a900460ff1681565b6000611b4861113e565b8210611b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8090615359565b60405180910390fd5b60088281548110611bc3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b601560029054906101000a900460ff1681565b611bf0612c9a565b73ffffffffffffffffffffffffffffffffffffffff16611c0e611fc7565b73ffffffffffffffffffffffffffffffffffffffff1614611c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5b90615299565b60405180910390fd5b80600f9080519060200190611c7a929190613dfe565b5050565b601560019054906101000a900460ff1681565b601560009054906101000a900460ff1681565b6000600d6000838152602001908152602001600020549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6190615239565b60405180910390fd5b80915050919050565b600f8054611d8090615706565b80601f0160208091040260200160405190810160405280929190818152602001828054611dac90615706565b8015611df95780601f10611dce57610100808354040283529160200191611df9565b820191906000526020600020905b815481529060010190602001808311611ddc57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6990615219565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ec1612c9a565b73ffffffffffffffffffffffffffffffffffffffff16611edf611fc7565b73ffffffffffffffffffffffffffffffffffffffff1614611f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2c90615299565b60405180910390fd5b611f3f600061316f565b565b611f49612c9a565b73ffffffffffffffffffffffffffffffffffffffff16611f67611fc7565b73ffffffffffffffffffffffffffffffffffffffff1614611fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb490615299565b60405180910390fd5b8060148190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461200090615706565b80601f016020809104026020016040519081016040528092919081815260200182805461202c90615706565b80156120795780601f1061204e57610100808354040283529160200191612079565b820191906000526020600020905b81548152906001019060200180831161205c57829003601f168201915b5050505050905090565b61208b612c9a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f090615159565b60405180910390fd5b8060056000612106612c9a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166121b3612c9a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121f89190615021565b60405180910390a35050565b61220c612c9a565b73ffffffffffffffffffffffffffffffffffffffff1661222a611fc7565b73ffffffffffffffffffffffffffffffffffffffff1614612280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227790615299565b60405180910390fd5b6001601560026101000a81548160ff021916908315150217905550565b6122ae6122a8612c9a565b83612dc7565b6122ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e490615339565b60405180910390fd5b6122f984848484613235565b50505050565b6016818154811061230f57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6010805461234b90615706565b80601f016020809104026020016040519081016040528092919081815260200182805461237790615706565b80156123c45780601f10612399576101008083540402835291602001916123c4565b820191906000526020600020905b8154815290600101906020018083116123a757829003601f168201915b505050505081565b60606123d782612ca2565b612416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240d906152d9565b60405180910390fd5b60001515601560029054906101000a900460ff16151514156124c4576011805461243f90615706565b80601f016020809104026020016040519081016040528092919081815260200182805461246b90615706565b80156124b85780601f1061248d576101008083540402835291602001916124b8565b820191906000526020600020905b81548152906001019060200180831161249b57829003601f168201915b50505050509050612520565b60006124ce613291565b905060008151116124ee576040518060200160405280600081525061251c565b806124f884613323565b601060405160200161250c93929190614f67565b6040516020818303038152906040525b9150505b919050565b601560039054906101000a900460ff1681565b612540612c9a565b73ffffffffffffffffffffffffffffffffffffffff1661255e611fc7565b73ffffffffffffffffffffffffffffffffffffffff16146125b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ab90615299565b60405180910390fd5b60006125be61113e565b9050601560009054906101000a900460ff1615612610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260790615179565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267790615199565b60405180910390fd5b6000821161268d57600080fd5b6013546126a3838361310190919063ffffffff16565b11156126e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126db90615319565b60405180910390fd5b6000600190505b828111612722576126fc600b61312d565b61270f8461270a600b613143565b613151565b808061271a90615738565b9150506126eb565b50505050565b612730612c9a565b73ffffffffffffffffffffffffffffffffffffffff1661274e611fc7565b73ffffffffffffffffffffffffffffffffffffffff16146127a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279b90615299565b60405180910390fd5b80601560016101000a81548160ff02191690831515021790555050565b60135481565b6127cf612c9a565b73ffffffffffffffffffffffffffffffffffffffff166127ed611fc7565b73ffffffffffffffffffffffffffffffffffffffff1614612843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283a90615299565b60405180910390fd5b8060109080519060200190612859929190613dfe565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6128f9612c9a565b73ffffffffffffffffffffffffffffffffffffffff16612917611fc7565b73ffffffffffffffffffffffffffffffffffffffff161461296d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296490615299565b60405180910390fd5b6016600061297b9190613e84565b81816016919061298c929190613ea5565b505050565b612999612c9a565b73ffffffffffffffffffffffffffffffffffffffff166129b7611fc7565b73ffffffffffffffffffffffffffffffffffffffff1614612a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0490615299565b60405180910390fd5b80601560036101000a81548160ff02191690831515021790555050565b612a32612c9a565b73ffffffffffffffffffffffffffffffffffffffff16612a50611fc7565b73ffffffffffffffffffffffffffffffffffffffff1614612aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9d90615299565b60405180910390fd5b8060119080519060200190612abc929190613dfe565b5050565b612ac8612c9a565b73ffffffffffffffffffffffffffffffffffffffff16612ae6611fc7565b73ffffffffffffffffffffffffffffffffffffffff1614612b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3390615299565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba3906150d9565b60405180910390fd5b612bb58161316f565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c8357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612c935750612c92826134d0565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612d8183611cc1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612dd282612ca2565b612e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e08906151b9565b60405180910390fd5b6000612e1c83611cc1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612e8b57508373ffffffffffffffffffffffffffffffffffffffff16612e7384610d47565b73ffffffffffffffffffffffffffffffffffffffff16145b80612e9c5750612e9b818561285d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612ec582611cc1565b73ffffffffffffffffffffffffffffffffffffffff1614612f1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f12906152b9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8290615119565b60405180910390fd5b612f9683838361353a565b612fa1600082612d0e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ff191906155f7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130489190615516565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000818361310f9190615516565b905092915050565b60008183613125919061559d565b905092915050565b6001816000016000828254019250508190555050565b600081600001549050919050565b61316b82826040518060200160405280600081525061359a565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613240848484612ea5565b61324c848484846135f5565b61328b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613282906150b9565b60405180910390fd5b50505050565b6060600f80546132a090615706565b80601f01602080910402602001604051908101604052809291908181526020018280546132cc90615706565b80156133195780601f106132ee57610100808354040283529160200191613319565b820191906000526020600020905b8154815290600101906020018083116132fc57829003601f168201915b5050505050905090565b6060600082141561336b576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134cb565b600082905060005b6000821461339d57808061338690615738565b915050600a82613396919061556c565b9150613373565b60008167ffffffffffffffff8111156133df577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156134115781602001600182028036833780820191505090505b5090505b600085146134c45760018261342a91906155f7565b9150600a856134399190615781565b60306134459190615516565b60f81b818381518110613481577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134bd919061556c565b9450613415565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61354583838361378c565b601560009054906101000a900460ff1615613595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161358c90615079565b60405180910390fd5b505050565b6135a483836138a0565b6135b160008484846135f5565b6135f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135e7906150b9565b60405180910390fd5b505050565b60006136168473ffffffffffffffffffffffffffffffffffffffff16613a6e565b1561377f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261363f612c9a565b8786866040518563ffffffff1660e01b81526004016136619493929190614fb3565b602060405180830381600087803b15801561367b57600080fd5b505af19250505080156136ac57506040513d601f19601f820116820180604052508101906136a99190614323565b60015b61372f573d80600081146136dc576040519150601f19603f3d011682016040523d82523d6000602084013e6136e1565b606091505b50600081511415613727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161371e906150b9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613784565b600190505b949350505050565b613797838383613a81565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156137da576137d581613a86565b613819565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613818576138178382613acf565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561385c5761385781613c3c565b61389b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461389a576138998282613d7f565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161390790615259565b60405180910390fd5b61391981612ca2565b15613959576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613950906150f9565b60405180910390fd5b6139656000838361353a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139b59190615516565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613adc84611e01565b613ae691906155f7565b9050600060076000848152602001908152602001600020549050818114613bcb576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613c5091906155f7565b9050600060096000848152602001908152602001600020549050600060088381548110613ca6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613cee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613d63577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613d8a83611e01565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054613e0a90615706565b90600052602060002090601f016020900481019282613e2c5760008555613e73565b82601f10613e4557805160ff1916838001178555613e73565b82800160010185558215613e73579182015b82811115613e72578251825591602001919060010190613e57565b5b509050613e809190613f45565b5090565b5080546000825590600052602060002090810190613ea29190613f45565b50565b828054828255906000526020600020908101928215613f34579160200282015b82811115613f3357823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613ec5565b5b509050613f419190613f45565b5090565b5b80821115613f5e576000816000905550600101613f46565b5090565b6000613f75613f7084615425565b6153f4565b905082815260208101848484011115613f8d57600080fd5b613f988482856156c4565b509392505050565b6000613fb3613fae84615455565b6153f4565b905082815260208101848484011115613fcb57600080fd5b613fd68482856156c4565b509392505050565b600081359050613fed816158c2565b92915050565b60008083601f84011261400557600080fd5b8235905067ffffffffffffffff81111561401e57600080fd5b60208301915083602082028301111561403657600080fd5b9250929050565b60008135905061404c816158d9565b92915050565b600081359050614061816158f0565b92915050565b600081519050614076816158f0565b92915050565b600082601f83011261408d57600080fd5b813561409d848260208601613f62565b91505092915050565b600082601f8301126140b757600080fd5b81356140c7848260208601613fa0565b91505092915050565b6000813590506140df81615907565b92915050565b6000602082840312156140f757600080fd5b600061410584828501613fde565b91505092915050565b6000806040838503121561412157600080fd5b600061412f85828601613fde565b925050602061414085828601613fde565b9150509250929050565b60008060006060848603121561415f57600080fd5b600061416d86828701613fde565b935050602061417e86828701613fde565b925050604061418f868287016140d0565b9150509250925092565b600080600080608085870312156141af57600080fd5b60006141bd87828801613fde565b94505060206141ce87828801613fde565b93505060406141df878288016140d0565b925050606085013567ffffffffffffffff8111156141fc57600080fd5b6142088782880161407c565b91505092959194509250565b6000806040838503121561422757600080fd5b600061423585828601613fde565b92505060206142468582860161403d565b9150509250929050565b6000806040838503121561426357600080fd5b600061427185828601613fde565b9250506020614282858286016140d0565b9150509250929050565b6000806020838503121561429f57600080fd5b600083013567ffffffffffffffff8111156142b957600080fd5b6142c585828601613ff3565b92509250509250929050565b6000602082840312156142e357600080fd5b60006142f18482850161403d565b91505092915050565b60006020828403121561430c57600080fd5b600061431a84828501614052565b91505092915050565b60006020828403121561433557600080fd5b600061434384828501614067565b91505092915050565b60006020828403121561435e57600080fd5b600082013567ffffffffffffffff81111561437857600080fd5b614384848285016140a6565b91505092915050565b60006020828403121561439f57600080fd5b60006143ad848285016140d0565b91505092915050565b600080604083850312156143c957600080fd5b60006143d7858286016140d0565b92505060206143e8858286016140d0565b9150509250929050565b60006143fe8383614f49565b60208301905092915050565b6144138161562b565b82525050565b6000614424826154aa565b61442e81856154d8565b935061443983615485565b8060005b8381101561446a57815161445188826143f2565b975061445c836154cb565b92505060018101905061443d565b5085935050505092915050565b6144808161563d565b82525050565b6000614491826154b5565b61449b81856154e9565b93506144ab8185602086016156d3565b6144b48161589d565b840191505092915050565b6144c8816156b2565b82525050565b60006144d9826154c0565b6144e381856154fa565b93506144f38185602086016156d3565b6144fc8161589d565b840191505092915050565b6000614512826154c0565b61451c818561550b565b935061452c8185602086016156d3565b80840191505092915050565b6000815461454581615706565b61454f818661550b565b9450600182166000811461456a576001811461457b576145ae565b60ff198316865281860193506145ae565b61458485615495565b60005b838110156145a657815481890152600182019150602081019050614587565b838801955050505b50505092915050565b60006145c4602b836154fa565b91507f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008301527f68696c65207061757365640000000000000000000000000000000000000000006020830152604082019050919050565b600061462a602b836154fa565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006146906032836154fa565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006146f66026836154fa565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475c601c836154fa565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061479c6024836154fa565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006148026024836154fa565b91507f4e6f7420656e6f756768206574686572732073656e7420746f206d696e74204e60008301527f46547321000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006148686019836154fa565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006148a86010836154fa565b91507f436f6e74726163742070617573656421000000000000000000000000000000006000830152602082019050919050565b60006148e86023836154fa565b91507f5f746f20616464726573732063616e6e6f74206265206465616420616464726560008301527f73732100000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061494e602c836154fa565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006149b46026836154fa565b91507f5f6d696e74416d6f756e742065786365656473206d6178206d61784d696e744160008301527f6d6f756e742100000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a1a6038836154fa565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614a80602a836154fa565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ae66029836154fa565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b4c6020836154fa565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614b8c602c836154fa565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614bf26020836154fa565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614c326029836154fa565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c98602f836154fa565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614cfe6021836154fa565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d646014836154fa565b91507f4d6178537570706c7920657863656564696e67210000000000000000000000006000830152602082019050919050565b6000614da46031836154fa565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614e0a602c836154fa565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614e70602f836154fa565b91507f5f6d696e74416d6f756e7420657863656564696e67206d61782063617020666f60008301527f722063757272656e742073616c652100000000000000000000000000000000006020830152604082019050919050565b6000614ed66017836154fa565b91507f75736572206973206e6f742077686974656c69737465640000000000000000006000830152602082019050919050565b6000614f166010836154fa565b91507f53616c6520697320696e616374697665000000000000000000000000000000006000830152602082019050919050565b614f52816156a8565b82525050565b614f61816156a8565b82525050565b6000614f738286614507565b9150614f7f8285614507565b9150614f8b8284614538565b9150819050949350505050565b6000602082019050614fad600083018461440a565b92915050565b6000608082019050614fc8600083018761440a565b614fd5602083018661440a565b614fe26040830185614f58565b8181036060830152614ff48184614486565b905095945050505050565b600060208201905081810360008301526150198184614419565b905092915050565b60006020820190506150366000830184614477565b92915050565b600060208201905061505160008301846144bf565b92915050565b6000602082019050818103600083015261507181846144ce565b905092915050565b60006020820190508181036000830152615092816145b7565b9050919050565b600060208201905081810360008301526150b28161461d565b9050919050565b600060208201905081810360008301526150d281614683565b9050919050565b600060208201905081810360008301526150f2816146e9565b9050919050565b600060208201905081810360008301526151128161474f565b9050919050565b600060208201905081810360008301526151328161478f565b9050919050565b60006020820190508181036000830152615152816147f5565b9050919050565b600060208201905081810360008301526151728161485b565b9050919050565b600060208201905081810360008301526151928161489b565b9050919050565b600060208201905081810360008301526151b2816148db565b9050919050565b600060208201905081810360008301526151d281614941565b9050919050565b600060208201905081810360008301526151f2816149a7565b9050919050565b6000602082019050818103600083015261521281614a0d565b9050919050565b6000602082019050818103600083015261523281614a73565b9050919050565b6000602082019050818103600083015261525281614ad9565b9050919050565b6000602082019050818103600083015261527281614b3f565b9050919050565b6000602082019050818103600083015261529281614b7f565b9050919050565b600060208201905081810360008301526152b281614be5565b9050919050565b600060208201905081810360008301526152d281614c25565b9050919050565b600060208201905081810360008301526152f281614c8b565b9050919050565b6000602082019050818103600083015261531281614cf1565b9050919050565b6000602082019050818103600083015261533281614d57565b9050919050565b6000602082019050818103600083015261535281614d97565b9050919050565b6000602082019050818103600083015261537281614dfd565b9050919050565b6000602082019050818103600083015261539281614e63565b9050919050565b600060208201905081810360008301526153b281614ec9565b9050919050565b600060208201905081810360008301526153d281614f09565b9050919050565b60006020820190506153ee6000830184614f58565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561541b5761541a61586e565b5b8060405250919050565b600067ffffffffffffffff8211156154405761543f61586e565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156154705761546f61586e565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615521826156a8565b915061552c836156a8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615561576155606157b2565b5b828201905092915050565b6000615577826156a8565b9150615582836156a8565b925082615592576155916157e1565b5b828204905092915050565b60006155a8826156a8565b91506155b3836156a8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156155ec576155eb6157b2565b5b828202905092915050565b6000615602826156a8565b915061560d836156a8565b9250828210156156205761561f6157b2565b5b828203905092915050565b600061563682615688565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050615683826158ae565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006156bd82615675565b9050919050565b82818337600083830152505050565b60005b838110156156f15780820151818401526020810190506156d6565b83811115615700576000848401525b50505050565b6000600282049050600182168061571e57607f821691505b602082108114156157325761573161583f565b5b50919050565b6000615743826156a8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615776576157756157b2565b5b600182019050919050565b600061578c826156a8565b9150615797836156a8565b9250826157a7576157a66157e1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b600281106158bf576158be615810565b5b50565b6158cb8161562b565b81146158d657600080fd5b50565b6158e28161563d565b81146158ed57600080fd5b50565b6158f981615649565b811461590457600080fd5b50565b615910816156a8565b811461591b57600080fd5b5056fea26469706673582212207e3c7c2666461f3a7ce32ca43e5729c955c6ea5d5caedcd55a0f6dcdbc905c0c64736f6c63430008000033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5a664d5134437772776572615a4e685631316e4e6773795073626f34695675506350517447574d6768327a702f000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d596434695a6f657a577a5a537536737437436463373275776a744c644a56745869784b5a65314866535a54500000000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): ipfs://QmZfMQ4CwrweraZNhV11nNgsyPsbo4iVuPcPQtGWMgh2zp/
Arg [1] : _initNotRevealedUri (string): ipfs://QmYd4iZoezWzZSu6st7Cdc72uwjtLdJVtXixKZe1HfSZTP

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [3] : 697066733a2f2f516d5a664d5134437772776572615a4e685631316e4e677379
Arg [4] : 5073626f34695675506350517447574d6768327a702f00000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [6] : 697066733a2f2f516d596434695a6f657a577a5a537536737437436463373275
Arg [7] : 776a744c644a56745869784b5a65314866535a54500000000000000000000000


Deployed Bytecode Sourcemap

51567:7513:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45334:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57966:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33226:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34785:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52255:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34308:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58255:321;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52290:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45974:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53662:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52386:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35675:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57584:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45642:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55442:273;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58957:120;;;:::i;:::-;;54078:1356;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36085:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55787:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57222:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51845:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46164:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52563:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57718:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52524:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52491:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53787:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32920:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52122:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32650:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12925:94;;;;;;;;;;;;;:::i;:::-;;57318:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12274:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33395:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35078:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57145:69;;;;;;;;;;;;;:::i;:::-;;36341:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52645:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52178;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56191:629;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52598:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53141:513;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58053:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52348:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57830:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35444:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58703:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58584:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57450:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13174:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45334:224;45436:4;45475:35;45460:50;;;:11;:50;;;;:90;;;;45514:36;45538:11;45514:23;:36::i;:::-;45460:90;45453:97;;45334:224;;;:::o;57966:79::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58031:6:::1;58022;;:15;;;;;;;;;;;;;;;;;;57966:79:::0;:::o;33226:100::-;33280:13;33313:5;33306:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33226:100;:::o;34785:221::-;34861:7;34889:16;34897:7;34889;:16::i;:::-;34881:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34974:15;:24;34990:7;34974:24;;;;;;;;;;;;;;;;;;;;;34967:31;;34785:221;;;:::o;52255:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34308:411::-;34389:13;34405:23;34420:7;34405:14;:23::i;:::-;34389:39;;34453:5;34447:11;;:2;:11;;;;34439:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;34547:5;34531:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;34556:37;34573:5;34580:12;:10;:12::i;:::-;34556:16;:37::i;:::-;34531:62;34509:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;34690:21;34699:2;34703:7;34690:8;:21::i;:::-;34308:411;;;:::o;58255:321::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58346:6:::1;58326:15;58321:21;;;;;;;;;;;;;;;;:31;58318:251;;;58381:15;58369:9;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58418:10;58411:4;:17;;;;58318:251;;;58475:6;58455:15;58450:21:::0;::::1;;;;;;;;;;;;;;;:31;58446:123;;;58510:15;58498:9;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58547:10;58540:4;:17;;;;58446:123;58318:251;58255:321:::0;:::o;52290:32::-;;;;:::o;45974:113::-;46035:7;46062:10;:17;;;;46055:24;;45974:113;:::o;53662:117::-;53723:7;53750:13;:21;53764:6;53750:21;;;;;;;;;;;;53743:28;;53662:117;;;:::o;52386:33::-;;;;:::o;35675:339::-;35870:41;35889:12;:10;:12::i;:::-;35903:7;35870:18;:41::i;:::-;35862:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;35978:28;35988:4;35994:2;35998:7;35978:9;:28::i;:::-;35675:339;;;:::o;57584:126::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57695:7:::1;57671:13;:21;57685:6;57671:21;;;;;;;;;;;:31;;;;57584:126:::0;;:::o;45642:256::-;45739:7;45775:23;45792:5;45775:16;:23::i;:::-;45767:5;:31;45759:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;45864:12;:19;45877:5;45864:19;;;;;;;;;;;;;;;:26;45884:5;45864:26;;;;;;;;;;;;45857:33;;45642:256;;;;:::o;55442:273::-;55501:4;55523:6;55532:1;55523:10;;55518:165;55539:20;:27;;;;55535:1;:31;55518:165;;;55619:5;55592:32;;:20;55613:1;55592:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;55588:84;;;55652:4;55645:11;;;;;55588:84;55568:3;;;;;:::i;:::-;;;;55518:165;;;;55702:5;55695:12;;55442:273;;;;:::o;58957:120::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59029:10:::1;59021:24;;:47;59046:21;59021:47;;;;;;;;;;;;;;;;;;;;;;;59013:56;;;::::0;::::1;;58957:120::o:0;54078:1356::-;54152:14;54169:13;:11;:13::i;:::-;54152:30;;54202:6;;;;;;;;;;;54201:7;54193:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;54263:1;54248:17;;:3;:17;;;;54240:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;54338:1;54324:11;:15;54316:24;;;;;;54374:13;;54359:11;:28;;54351:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;54476:9;;54449:23;54460:11;54449:6;:10;;:23;;;;:::i;:::-;:36;;54441:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;54541:7;:5;:7::i;:::-;54527:21;;:10;:21;;;54523:337;;54573:12;;;;;;;;;;;54565:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;54649:4;54625:28;;:20;;;;;;;;;;;:28;;;54621:130;;;54682:25;54696:10;54682:13;:25::i;:::-;54674:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;54621:130;54786:21;54795:11;54786:4;;:8;;:21;;;;:::i;:::-;54773:9;:34;;54765:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;54523:337;54876:12;;;;;;;;;;;54872:390;;;54905:18;54926:54;54968:11;54926:20;:37;54952:9;;;;;;;;;;;54947:15;;;;;;;;;;;;;;;;54926:37;;;;;;;;;;;;:41;;:54;;;;:::i;:::-;54905:75;;55017:13;:30;55036:9;;;;;;;;;;;55031:15;;;;;;;;;;;;;;;;55017:30;;;;;;;;;;;;55003:10;:44;;54995:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;55196:54;55238:11;55196:20;:37;55222:9;;;;;;;;;;;55217:15;;;;;;;;;;;;;;;;55196:37;;;;;;;;;;;;:41;;:54;;;;:::i;:::-;55156:20;:37;55182:9;;;;;;;;;;;55177:15;;;;;;;;;;;;;;;;55156:37;;;;;;;;;;;:94;;;;54872:390;;55279:9;55291:1;55279:13;;55274:153;55299:11;55294:1;:16;55274:153;;55332:27;:15;:25;:27::i;:::-;55374:41;55384:3;55389:25;:15;:23;:25::i;:::-;55374:9;:41::i;:::-;55312:3;;;;;:::i;:::-;;;;55274:153;;;;54078:1356;;;:::o;36085:185::-;36223:39;36240:4;36246:2;36250:7;36223:39;;;;;;;;;;;;:16;:39::i;:::-;36085:185;;;:::o;55787:396::-;55876:16;55910:23;55936:19;55946:8;55936:9;:19::i;:::-;55910:45;;55966:25;56008:15;55994:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55966:58;;56040:9;56035:115;56055:15;56051:1;:19;56035:115;;;56106:32;56126:8;56136:1;56106:19;:32::i;:::-;56092:8;56101:1;56092:11;;;;;;;;;;;;;;;;;;;;;:46;;;;;56072:3;;;;;:::i;:::-;;;;56035:115;;;;56167:8;56160:15;;;;55787:396;;;:::o;57222:88::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57294:8:::1;57287:4;:15;;;;57222:88:::0;:::o;51845:44::-;;;;;;;;;;;;;:::o;46164:233::-;46239:7;46275:30;:28;:30::i;:::-;46267:5;:38;46259:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;46372:10;46383:5;46372:17;;;;;;;;;;;;;;;;;;;;;;;;46365:24;;46164:233;;;:::o;52563:28::-;;;;;;;;;;;;;:::o;57718:104::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57803:11:::1;57793:7;:21;;;;;;;;;;;;:::i;:::-;;57718:104:::0;:::o;52524:32::-;;;;;;;;;;;;;:::o;52491:26::-;;;;;;;;;;;;;:::o;53787:135::-;53859:7;53886:20;:28;53907:6;53886:28;;;;;;;;;;;;53879:35;;53787:135;;;:::o;32920:239::-;32992:7;33012:13;33028:7;:16;33036:7;33028:16;;;;;;;;;;;;;;;;;;;;;33012:32;;33080:1;33063:19;;:5;:19;;;;33055:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33146:5;33139:12;;;32920:239;;;:::o;52122:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32650:208::-;32722:7;32767:1;32750:19;;:5;:19;;;;32742:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;32834:9;:16;32844:5;32834:16;;;;;;;;;;;;;;;;32827:23;;32650:208;;;:::o;12925:94::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12990:21:::1;13008:1;12990:9;:21::i;:::-;12925:94::o:0;57318:124::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57417:17:::1;57401:13;:33;;;;57318:124:::0;:::o;12274:87::-;12320:7;12347:6;;;;;;;;;;;12340:13;;12274:87;:::o;33395:104::-;33451:13;33484:7;33477:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33395:104;:::o;35078:295::-;35193:12;:10;:12::i;:::-;35181:24;;:8;:24;;;;35173:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;35293:8;35248:18;:32;35267:12;:10;:12::i;:::-;35248:32;;;;;;;;;;;;;;;:42;35281:8;35248:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;35346:8;35317:48;;35332:12;:10;:12::i;:::-;35317:48;;;35356:8;35317:48;;;;;;:::i;:::-;;;;;;;;35078:295;;:::o;57145:69::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57202:4:::1;57191:8;;:15;;;;;;;;;;;;;;;;;;57145:69::o:0;36341:328::-;36516:41;36535:12;:10;:12::i;:::-;36549:7;36516:18;:41::i;:::-;36508:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;36622:39;36636:4;36642:2;36646:7;36655:5;36622:13;:39::i;:::-;36341:328;;;;:::o;52645:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52178:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56191:629::-;56309:13;56362:16;56370:7;56362;:16::i;:::-;56340:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;56482:5;56470:17;;:8;;;;;;;;;;;:17;;;56466:71;;;56511:14;56504:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56466:71;56549:28;56580:10;:8;:10::i;:::-;56549:41;;56654:1;56629:14;56623:28;:32;:189;;;;;;;;;;;;;;;;;56721:14;56737:18;:7;:16;:18::i;:::-;56757:13;56704:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56623:189;56603:209;;;56191:629;;;;:::o;52598:40::-;;;;;;;;;;;;;:::o;53141:513::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53216:14:::1;53233:13;:11;:13::i;:::-;53216:30;;53266:6;;;;;;;;;;;53265:7;53257:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;53327:1;53312:17;;:3;:17;;;;53304:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;53401:1;53388:10;:14;53380:23;;;::::0;::::1;;53448:9;;53422:22;53433:10;53422:6;:10;;:22;;;;:::i;:::-;:35;;53414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53500:9;53512:1;53500:13;;53495:152;53520:10;53515:1;:15;53495:152;;53552:27;:15;:25;:27::i;:::-;53594:41;53604:3;53609:25;:15;:23;:25::i;:::-;53594:9;:41::i;:::-;53532:3;;;;;:::i;:::-;;;;53495:152;;;;12565:1;53141:513:::0;;:::o;58053:95::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58134:6:::1;58119:12;;:21;;;;;;;;;;;;;;;;;;58053:95:::0;:::o;52348:31::-;;;;:::o;57830:128::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57933:17:::1;57917:13;:33;;;;;;;;;;;;:::i;:::-;;57830:128:::0;:::o;35444:164::-;35541:4;35565:18;:25;35584:5;35565:25;;;;;;;;;;;;;;;:35;35591:8;35565:35;;;;;;;;;;;;;;;;;;;;;;;;;35558:42;;35444:164;;;;:::o;58703:154::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58789:20:::1;;58782:27;;;;:::i;:::-;58843:6;;58820:20;:29;;;;;;;:::i;:::-;;58703:154:::0;;:::o;58584:111::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58681:6:::1;58658:20;;:29;;;;;;;;;;;;;;;;;;58584:111:::0;:::o;57450:126::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57553:15:::1;57536:14;:32;;;;;;;;;;;;:::i;:::-;;57450:126:::0;:::o;13174:192::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13283:1:::1;13263:22;;:8;:22;;;;13255:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13339:19;13349:8;13339:9;:19::i;:::-;13174:192:::0;:::o;32281:305::-;32383:4;32435:25;32420:40;;;:11;:40;;;;:105;;;;32492:33;32477:48;;;:11;:48;;;;32420:105;:158;;;;32542:36;32566:11;32542:23;:36::i;:::-;32420:158;32400:178;;32281:305;;;:::o;11062:98::-;11115:7;11142:10;11135:17;;11062:98;:::o;38179:127::-;38244:4;38296:1;38268:30;;:7;:16;38276:7;38268:16;;;;;;;;;;;;;;;;;;;;;:30;;;;38261:37;;38179:127;;;:::o;42161:174::-;42263:2;42236:15;:24;42252:7;42236:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;42319:7;42315:2;42281:46;;42290:23;42305:7;42290:14;:23::i;:::-;42281:46;;;;;;;;;;;;42161:174;;:::o;38473:348::-;38566:4;38591:16;38599:7;38591;:16::i;:::-;38583:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38667:13;38683:23;38698:7;38683:14;:23::i;:::-;38667:39;;38736:5;38725:16;;:7;:16;;;:51;;;;38769:7;38745:31;;:20;38757:7;38745:11;:20::i;:::-;:31;;;38725:51;:87;;;;38780:32;38797:5;38804:7;38780:16;:32::i;:::-;38725:87;38717:96;;;38473:348;;;;:::o;41465:578::-;41624:4;41597:31;;:23;41612:7;41597:14;:23::i;:::-;:31;;;41589:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;41707:1;41693:16;;:2;:16;;;;41685:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;41763:39;41784:4;41790:2;41794:7;41763:20;:39::i;:::-;41867:29;41884:1;41888:7;41867:8;:29::i;:::-;41928:1;41909:9;:15;41919:4;41909:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;41957:1;41940:9;:13;41950:2;41940:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41988:2;41969:7;:16;41977:7;41969:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42027:7;42023:2;42008:27;;42017:4;42008:27;;;;;;;;;;;;41465:578;;;:::o;4202:98::-;4260:7;4291:1;4287;:5;;;;:::i;:::-;4280:12;;4202:98;;;;:::o;4940:::-;4998:7;5029:1;5025;:5;;;;:::i;:::-;5018:12;;4940:98;;;;:::o;939:127::-;1046:1;1028:7;:14;;;:19;;;;;;;;;;;939:127;:::o;817:114::-;882:7;909;:14;;;902:21;;817:114;;;:::o;39163:110::-;39239:26;39249:2;39253:7;39239:26;;;;;;;;;;;;:9;:26::i;:::-;39163:110;;:::o;13374:173::-;13430:16;13449:6;;;;;;;;;;;13430:25;;13475:8;13466:6;;:17;;;;;;;;;;;;;;;;;;13530:8;13499:40;;13520:8;13499:40;;;;;;;;;;;;13374:173;;:::o;37551:315::-;37708:28;37718:4;37724:2;37728:7;37708:9;:28::i;:::-;37755:48;37778:4;37784:2;37788:7;37797:5;37755:22;:48::i;:::-;37747:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;37551:315;;;;:::o;53947:108::-;54007:13;54040:7;54033:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53947:108;:::o;8678:723::-;8734:13;8964:1;8955:5;:10;8951:53;;;8982:10;;;;;;;;;;;;;;;;;;;;;8951:53;9014:12;9029:5;9014:20;;9045:14;9070:78;9085:1;9077:4;:9;9070:78;;9103:8;;;;;:::i;:::-;;;;9134:2;9126:10;;;;;:::i;:::-;;;9070:78;;;9158:19;9190:6;9180:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9158:39;;9208:154;9224:1;9215:5;:10;9208:154;;9252:1;9242:11;;;;;:::i;:::-;;;9319:2;9311:5;:10;;;;:::i;:::-;9298:2;:24;;;;:::i;:::-;9285:39;;9268:6;9275;9268:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;9348:2;9339:11;;;;;:::i;:::-;;;9208:154;;;9386:6;9372:21;;;;;8678:723;;;;:::o;24260:157::-;24345:4;24384:25;24369:40;;;:11;:40;;;;24362:47;;24260:157;;;:::o;56828:291::-;56990:45;57017:4;57023:2;57027:7;56990:26;:45::i;:::-;57057:6;;;;;;;;;;;57056:7;57048:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;56828:291;;;:::o;39500:321::-;39630:18;39636:2;39640:7;39630:5;:18::i;:::-;39681:54;39712:1;39716:2;39720:7;39729:5;39681:22;:54::i;:::-;39659:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;39500:321;;;:::o;42900:799::-;43055:4;43076:15;:2;:13;;;:15::i;:::-;43072:620;;;43128:2;43112:36;;;43149:12;:10;:12::i;:::-;43163:4;43169:7;43178:5;43112:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43108:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43371:1;43354:6;:13;:18;43350:272;;;43397:60;;;;;;;;;;:::i;:::-;;;;;;;;43350:272;43572:6;43566:13;43557:6;43553:2;43549:15;43542:38;43108:529;43245:41;;;43235:51;;;:6;:51;;;;43228:58;;;;;43072:620;43676:4;43669:11;;42900:799;;;;;;;:::o;47010:589::-;47154:45;47181:4;47187:2;47191:7;47154:26;:45::i;:::-;47232:1;47216:18;;:4;:18;;;47212:187;;;47251:40;47283:7;47251:31;:40::i;:::-;47212:187;;;47321:2;47313:10;;:4;:10;;;47309:90;;47340:47;47373:4;47379:7;47340:32;:47::i;:::-;47309:90;47212:187;47427:1;47413:16;;:2;:16;;;47409:183;;;47446:45;47483:7;47446:36;:45::i;:::-;47409:183;;;47519:4;47513:10;;:2;:10;;;47509:83;;47540:40;47568:2;47572:7;47540:27;:40::i;:::-;47509:83;47409:183;47010:589;;;:::o;40157:382::-;40251:1;40237:16;;:2;:16;;;;40229:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;40310:16;40318:7;40310;:16::i;:::-;40309:17;40301:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;40372:45;40401:1;40405:2;40409:7;40372:20;:45::i;:::-;40447:1;40430:9;:13;40440:2;40430:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;40478:2;40459:7;:16;40467:7;40459:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;40523:7;40519:2;40498:33;;40515:1;40498:33;;;;;;;;;;;;40157:382;;:::o;14320:387::-;14380:4;14588:12;14655:7;14643:20;14635:28;;14698:1;14691:4;:8;14684:15;;;14320:387;;;:::o;44271:126::-;;;;:::o;48322:164::-;48426:10;:17;;;;48399:15;:24;48415:7;48399:24;;;;;;;;;;;:44;;;;48454:10;48470:7;48454:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48322:164;:::o;49113:988::-;49379:22;49429:1;49404:22;49421:4;49404:16;:22::i;:::-;:26;;;;:::i;:::-;49379:51;;49441:18;49462:17;:26;49480:7;49462:26;;;;;;;;;;;;49441:47;;49609:14;49595:10;:28;49591:328;;49640:19;49662:12;:18;49675:4;49662:18;;;;;;;;;;;;;;;:34;49681:14;49662:34;;;;;;;;;;;;49640:56;;49746:11;49713:12;:18;49726:4;49713:18;;;;;;;;;;;;;;;:30;49732:10;49713:30;;;;;;;;;;;:44;;;;49863:10;49830:17;:30;49848:11;49830:30;;;;;;;;;;;:43;;;;49591:328;;50015:17;:26;50033:7;50015:26;;;;;;;;;;;50008:33;;;50059:12;:18;50072:4;50059:18;;;;;;;;;;;;;;;:34;50078:14;50059:34;;;;;;;;;;;50052:41;;;49113:988;;;;:::o;50396:1079::-;50649:22;50694:1;50674:10;:17;;;;:21;;;;:::i;:::-;50649:46;;50706:18;50727:15;:24;50743:7;50727:24;;;;;;;;;;;;50706:45;;51078:19;51100:10;51111:14;51100:26;;;;;;;;;;;;;;;;;;;;;;;;51078:48;;51164:11;51139:10;51150;51139:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;51275:10;51244:15;:28;51260:11;51244:28;;;;;;;;;;;:41;;;;51416:15;:24;51432:7;51416:24;;;;;;;;;;;51409:31;;;51451:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50396:1079;;;;:::o;47900:221::-;47985:14;48002:20;48019:2;48002:16;:20::i;:::-;47985:37;;48060:7;48033:12;:16;48046:2;48033:16;;;;;;;;;;;;;;;:24;48050:6;48033:24;;;;;;;;;;;:34;;;;48107:6;48078:17;:26;48096:7;48078:26;;;;;;;;;;;:35;;;;47900:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;867:367::-;;;1000:3;993:4;985:6;981:17;977:27;967:2;;1018:1;1015;1008:12;967:2;1054:6;1041:20;1031:30;;1084:18;1076:6;1073:30;1070:2;;;1116:1;1113;1106:12;1070:2;1153:4;1145:6;1141:17;1129:29;;1207:3;1199:4;1191:6;1187:17;1177:8;1173:32;1170:41;1167:2;;;1224:1;1221;1214:12;1167:2;957:277;;;;;:::o;1240:133::-;;1321:6;1308:20;1299:29;;1337:30;1361:5;1337:30;:::i;:::-;1289:84;;;;:::o;1379:137::-;;1462:6;1449:20;1440:29;;1478:32;1504:5;1478:32;:::i;:::-;1430:86;;;;:::o;1522:141::-;;1609:6;1603:13;1594:22;;1625:32;1651:5;1625:32;:::i;:::-;1584:79;;;;:::o;1682:271::-;;1786:3;1779:4;1771:6;1767:17;1763:27;1753:2;;1804:1;1801;1794:12;1753:2;1844:6;1831:20;1869:78;1943:3;1935:6;1928:4;1920:6;1916:17;1869:78;:::i;:::-;1860:87;;1743:210;;;;;:::o;1973:273::-;;2078:3;2071:4;2063:6;2059:17;2055:27;2045:2;;2096:1;2093;2086:12;2045:2;2136:6;2123:20;2161:79;2236:3;2228:6;2221:4;2213:6;2209:17;2161:79;:::i;:::-;2152:88;;2035:211;;;;;:::o;2252:139::-;;2336:6;2323:20;2314:29;;2352:33;2379:5;2352:33;:::i;:::-;2304:87;;;;:::o;2397:262::-;;2505:2;2493:9;2484:7;2480:23;2476:32;2473:2;;;2521:1;2518;2511:12;2473:2;2564:1;2589:53;2634:7;2625:6;2614:9;2610:22;2589:53;:::i;:::-;2579:63;;2535:117;2463:196;;;;:::o;2665:407::-;;;2790:2;2778:9;2769:7;2765:23;2761:32;2758:2;;;2806:1;2803;2796:12;2758:2;2849:1;2874:53;2919:7;2910:6;2899:9;2895:22;2874:53;:::i;:::-;2864:63;;2820:117;2976:2;3002:53;3047:7;3038:6;3027:9;3023:22;3002:53;:::i;:::-;2992:63;;2947:118;2748:324;;;;;:::o;3078:552::-;;;;3220:2;3208:9;3199:7;3195:23;3191:32;3188:2;;;3236:1;3233;3226:12;3188:2;3279:1;3304:53;3349:7;3340:6;3329:9;3325:22;3304:53;:::i;:::-;3294:63;;3250:117;3406:2;3432:53;3477:7;3468:6;3457:9;3453:22;3432:53;:::i;:::-;3422:63;;3377:118;3534:2;3560:53;3605:7;3596:6;3585:9;3581:22;3560:53;:::i;:::-;3550:63;;3505:118;3178:452;;;;;:::o;3636:809::-;;;;;3804:3;3792:9;3783:7;3779:23;3775:33;3772:2;;;3821:1;3818;3811:12;3772:2;3864:1;3889:53;3934:7;3925:6;3914:9;3910:22;3889:53;:::i;:::-;3879:63;;3835:117;3991:2;4017:53;4062:7;4053:6;4042:9;4038:22;4017:53;:::i;:::-;4007:63;;3962:118;4119:2;4145:53;4190:7;4181:6;4170:9;4166:22;4145:53;:::i;:::-;4135:63;;4090:118;4275:2;4264:9;4260:18;4247:32;4306:18;4298:6;4295:30;4292:2;;;4338:1;4335;4328:12;4292:2;4366:62;4420:7;4411:6;4400:9;4396:22;4366:62;:::i;:::-;4356:72;;4218:220;3762:683;;;;;;;:::o;4451:401::-;;;4573:2;4561:9;4552:7;4548:23;4544:32;4541:2;;;4589:1;4586;4579:12;4541:2;4632:1;4657:53;4702:7;4693:6;4682:9;4678:22;4657:53;:::i;:::-;4647:63;;4603:117;4759:2;4785:50;4827:7;4818:6;4807:9;4803:22;4785:50;:::i;:::-;4775:60;;4730:115;4531:321;;;;;:::o;4858:407::-;;;4983:2;4971:9;4962:7;4958:23;4954:32;4951:2;;;4999:1;4996;4989:12;4951:2;5042:1;5067:53;5112:7;5103:6;5092:9;5088:22;5067:53;:::i;:::-;5057:63;;5013:117;5169:2;5195:53;5240:7;5231:6;5220:9;5216:22;5195:53;:::i;:::-;5185:63;;5140:118;4941:324;;;;;:::o;5271:425::-;;;5414:2;5402:9;5393:7;5389:23;5385:32;5382:2;;;5430:1;5427;5420:12;5382:2;5501:1;5490:9;5486:17;5473:31;5531:18;5523:6;5520:30;5517:2;;;5563:1;5560;5553:12;5517:2;5599:80;5671:7;5662:6;5651:9;5647:22;5599:80;:::i;:::-;5581:98;;;;5444:245;5372:324;;;;;:::o;5702:256::-;;5807:2;5795:9;5786:7;5782:23;5778:32;5775:2;;;5823:1;5820;5813:12;5775:2;5866:1;5891:50;5933:7;5924:6;5913:9;5909:22;5891:50;:::i;:::-;5881:60;;5837:114;5765:193;;;;:::o;5964:260::-;;6071:2;6059:9;6050:7;6046:23;6042:32;6039:2;;;6087:1;6084;6077:12;6039:2;6130:1;6155:52;6199:7;6190:6;6179:9;6175:22;6155:52;:::i;:::-;6145:62;;6101:116;6029:195;;;;:::o;6230:282::-;;6348:2;6336:9;6327:7;6323:23;6319:32;6316:2;;;6364:1;6361;6354:12;6316:2;6407:1;6432:63;6487:7;6478:6;6467:9;6463:22;6432:63;:::i;:::-;6422:73;;6378:127;6306:206;;;;:::o;6518:375::-;;6636:2;6624:9;6615:7;6611:23;6607:32;6604:2;;;6652:1;6649;6642:12;6604:2;6723:1;6712:9;6708:17;6695:31;6753:18;6745:6;6742:30;6739:2;;;6785:1;6782;6775:12;6739:2;6813:63;6868:7;6859:6;6848:9;6844:22;6813:63;:::i;:::-;6803:73;;6666:220;6594:299;;;;:::o;6899:262::-;;7007:2;6995:9;6986:7;6982:23;6978:32;6975:2;;;7023:1;7020;7013:12;6975:2;7066:1;7091:53;7136:7;7127:6;7116:9;7112:22;7091:53;:::i;:::-;7081:63;;7037:117;6965:196;;;;:::o;7167:407::-;;;7292:2;7280:9;7271:7;7267:23;7263:32;7260:2;;;7308:1;7305;7298:12;7260:2;7351:1;7376:53;7421:7;7412:6;7401:9;7397:22;7376:53;:::i;:::-;7366:63;;7322:117;7478:2;7504:53;7549:7;7540:6;7529:9;7525:22;7504:53;:::i;:::-;7494:63;;7449:118;7250:324;;;;;:::o;7580:179::-;;7670:46;7712:3;7704:6;7670:46;:::i;:::-;7748:4;7743:3;7739:14;7725:28;;7660:99;;;;:::o;7765:118::-;7852:24;7870:5;7852:24;:::i;:::-;7847:3;7840:37;7830:53;;:::o;7919:732::-;;8067:54;8115:5;8067:54;:::i;:::-;8137:86;8216:6;8211:3;8137:86;:::i;:::-;8130:93;;8247:56;8297:5;8247:56;:::i;:::-;8326:7;8357:1;8342:284;8367:6;8364:1;8361:13;8342:284;;;8443:6;8437:13;8470:63;8529:3;8514:13;8470:63;:::i;:::-;8463:70;;8556:60;8609:6;8556:60;:::i;:::-;8546:70;;8402:224;8389:1;8386;8382:9;8377:14;;8342:284;;;8346:14;8642:3;8635:10;;8043:608;;;;;;;:::o;8657:109::-;8738:21;8753:5;8738:21;:::i;:::-;8733:3;8726:34;8716:50;;:::o;8772:360::-;;8886:38;8918:5;8886:38;:::i;:::-;8940:70;9003:6;8998:3;8940:70;:::i;:::-;8933:77;;9019:52;9064:6;9059:3;9052:4;9045:5;9041:16;9019:52;:::i;:::-;9096:29;9118:6;9096:29;:::i;:::-;9091:3;9087:39;9080:46;;8862:270;;;;;:::o;9138:155::-;9237:49;9280:5;9237:49;:::i;:::-;9232:3;9225:62;9215:78;;:::o;9299:364::-;;9415:39;9448:5;9415:39;:::i;:::-;9470:71;9534:6;9529:3;9470:71;:::i;:::-;9463:78;;9550:52;9595:6;9590:3;9583:4;9576:5;9572:16;9550:52;:::i;:::-;9627:29;9649:6;9627:29;:::i;:::-;9622:3;9618:39;9611:46;;9391:272;;;;;:::o;9669:377::-;;9803:39;9836:5;9803:39;:::i;:::-;9858:89;9940:6;9935:3;9858:89;:::i;:::-;9851:96;;9956:52;10001:6;9996:3;9989:4;9982:5;9978:16;9956:52;:::i;:::-;10033:6;10028:3;10024:16;10017:23;;9779:267;;;;;:::o;10076:845::-;;10216:5;10210:12;10245:36;10271:9;10245:36;:::i;:::-;10297:89;10379:6;10374:3;10297:89;:::i;:::-;10290:96;;10417:1;10406:9;10402:17;10433:1;10428:137;;;;10579:1;10574:341;;;;10395:520;;10428:137;10512:4;10508:9;10497;10493:25;10488:3;10481:38;10548:6;10543:3;10539:16;10532:23;;10428:137;;10574:341;10641:38;10673:5;10641:38;:::i;:::-;10701:1;10715:154;10729:6;10726:1;10723:13;10715:154;;;10803:7;10797:14;10793:1;10788:3;10784:11;10777:35;10853:1;10844:7;10840:15;10829:26;;10751:4;10748:1;10744:12;10739:17;;10715:154;;;10898:6;10893:3;10889:16;10882:23;;10581:334;;10395:520;;10183:738;;;;;;:::o;10927:375::-;;11090:67;11154:2;11149:3;11090:67;:::i;:::-;11083:74;;11187:34;11183:1;11178:3;11174:11;11167:55;11253:13;11248:2;11243:3;11239:12;11232:35;11293:2;11288:3;11284:12;11277:19;;11073:229;;;:::o;11308:375::-;;11471:67;11535:2;11530:3;11471:67;:::i;:::-;11464:74;;11568:34;11564:1;11559:3;11555:11;11548:55;11634:13;11629:2;11624:3;11620:12;11613:35;11674:2;11669:3;11665:12;11658:19;;11454:229;;;:::o;11689:382::-;;11852:67;11916:2;11911:3;11852:67;:::i;:::-;11845:74;;11949:34;11945:1;11940:3;11936:11;11929:55;12015:20;12010:2;12005:3;12001:12;11994:42;12062:2;12057:3;12053:12;12046:19;;11835:236;;;:::o;12077:370::-;;12240:67;12304:2;12299:3;12240:67;:::i;:::-;12233:74;;12337:34;12333:1;12328:3;12324:11;12317:55;12403:8;12398:2;12393:3;12389:12;12382:30;12438:2;12433:3;12429:12;12422:19;;12223:224;;;:::o;12453:326::-;;12616:67;12680:2;12675:3;12616:67;:::i;:::-;12609:74;;12713:30;12709:1;12704:3;12700:11;12693:51;12770:2;12765:3;12761:12;12754:19;;12599:180;;;:::o;12785:368::-;;12948:67;13012:2;13007:3;12948:67;:::i;:::-;12941:74;;13045:34;13041:1;13036:3;13032:11;13025:55;13111:6;13106:2;13101:3;13097:12;13090:28;13144:2;13139:3;13135:12;13128:19;;12931:222;;;:::o;13159:368::-;;13322:67;13386:2;13381:3;13322:67;:::i;:::-;13315:74;;13419:34;13415:1;13410:3;13406:11;13399:55;13485:6;13480:2;13475:3;13471:12;13464:28;13518:2;13513:3;13509:12;13502:19;;13305:222;;;:::o;13533:323::-;;13696:67;13760:2;13755:3;13696:67;:::i;:::-;13689:74;;13793:27;13789:1;13784:3;13780:11;13773:48;13847:2;13842:3;13838:12;13831:19;;13679:177;;;:::o;13862:314::-;;14025:67;14089:2;14084:3;14025:67;:::i;:::-;14018:74;;14122:18;14118:1;14113:3;14109:11;14102:39;14167:2;14162:3;14158:12;14151:19;;14008:168;;;:::o;14182:367::-;;14345:67;14409:2;14404:3;14345:67;:::i;:::-;14338:74;;14442:34;14438:1;14433:3;14429:11;14422:55;14508:5;14503:2;14498:3;14494:12;14487:27;14540:2;14535:3;14531:12;14524:19;;14328:221;;;:::o;14555:376::-;;14718:67;14782:2;14777:3;14718:67;:::i;:::-;14711:74;;14815:34;14811:1;14806:3;14802:11;14795:55;14881:14;14876:2;14871:3;14867:12;14860:36;14922:2;14917:3;14913:12;14906:19;;14701:230;;;:::o;14937:370::-;;15100:67;15164:2;15159:3;15100:67;:::i;:::-;15093:74;;15197:34;15193:1;15188:3;15184:11;15177:55;15263:8;15258:2;15253:3;15249:12;15242:30;15298:2;15293:3;15289:12;15282:19;;15083:224;;;:::o;15313:388::-;;15476:67;15540:2;15535:3;15476:67;:::i;:::-;15469:74;;15573:34;15569:1;15564:3;15560:11;15553:55;15639:26;15634:2;15629:3;15625:12;15618:48;15692:2;15687:3;15683:12;15676:19;;15459:242;;;:::o;15707:374::-;;15870:67;15934:2;15929:3;15870:67;:::i;:::-;15863:74;;15967:34;15963:1;15958:3;15954:11;15947:55;16033:12;16028:2;16023:3;16019:12;16012:34;16072:2;16067:3;16063:12;16056:19;;15853:228;;;:::o;16087:373::-;;16250:67;16314:2;16309:3;16250:67;:::i;:::-;16243:74;;16347:34;16343:1;16338:3;16334:11;16327:55;16413:11;16408:2;16403:3;16399:12;16392:33;16451:2;16446:3;16442:12;16435:19;;16233:227;;;:::o;16466:330::-;;16629:67;16693:2;16688:3;16629:67;:::i;:::-;16622:74;;16726:34;16722:1;16717:3;16713:11;16706:55;16787:2;16782:3;16778:12;16771:19;;16612:184;;;:::o;16802:376::-;;16965:67;17029:2;17024:3;16965:67;:::i;:::-;16958:74;;17062:34;17058:1;17053:3;17049:11;17042:55;17128:14;17123:2;17118:3;17114:12;17107:36;17169:2;17164:3;17160:12;17153:19;;16948:230;;;:::o;17184:330::-;;17347:67;17411:2;17406:3;17347:67;:::i;:::-;17340:74;;17444:34;17440:1;17435:3;17431:11;17424:55;17505:2;17500:3;17496:12;17489:19;;17330:184;;;:::o;17520:373::-;;17683:67;17747:2;17742:3;17683:67;:::i;:::-;17676:74;;17780:34;17776:1;17771:3;17767:11;17760:55;17846:11;17841:2;17836:3;17832:12;17825:33;17884:2;17879:3;17875:12;17868:19;;17666:227;;;:::o;17899:379::-;;18062:67;18126:2;18121:3;18062:67;:::i;:::-;18055:74;;18159:34;18155:1;18150:3;18146:11;18139:55;18225:17;18220:2;18215:3;18211:12;18204:39;18269:2;18264:3;18260:12;18253:19;;18045:233;;;:::o;18284:365::-;;18447:67;18511:2;18506:3;18447:67;:::i;:::-;18440:74;;18544:34;18540:1;18535:3;18531:11;18524:55;18610:3;18605:2;18600:3;18596:12;18589:25;18640:2;18635:3;18631:12;18624:19;;18430:219;;;:::o;18655:318::-;;18818:67;18882:2;18877:3;18818:67;:::i;:::-;18811:74;;18915:22;18911:1;18906:3;18902:11;18895:43;18964:2;18959:3;18955:12;18948:19;;18801:172;;;:::o;18979:381::-;;19142:67;19206:2;19201:3;19142:67;:::i;:::-;19135:74;;19239:34;19235:1;19230:3;19226:11;19219:55;19305:19;19300:2;19295:3;19291:12;19284:41;19351:2;19346:3;19342:12;19335:19;;19125:235;;;:::o;19366:376::-;;19529:67;19593:2;19588:3;19529:67;:::i;:::-;19522:74;;19626:34;19622:1;19617:3;19613:11;19606:55;19692:14;19687:2;19682:3;19678:12;19671:36;19733:2;19728:3;19724:12;19717:19;;19512:230;;;:::o;19748:379::-;;19911:67;19975:2;19970:3;19911:67;:::i;:::-;19904:74;;20008:34;20004:1;19999:3;19995:11;19988:55;20074:17;20069:2;20064:3;20060:12;20053:39;20118:2;20113:3;20109:12;20102:19;;19894:233;;;:::o;20133:321::-;;20296:67;20360:2;20355:3;20296:67;:::i;:::-;20289:74;;20393:25;20389:1;20384:3;20380:11;20373:46;20445:2;20440:3;20436:12;20429:19;;20279:175;;;:::o;20460:314::-;;20623:67;20687:2;20682:3;20623:67;:::i;:::-;20616:74;;20720:18;20716:1;20711:3;20707:11;20700:39;20765:2;20760:3;20756:12;20749:19;;20606:168;;;:::o;20780:108::-;20857:24;20875:5;20857:24;:::i;:::-;20852:3;20845:37;20835:53;;:::o;20894:118::-;20981:24;20999:5;20981:24;:::i;:::-;20976:3;20969:37;20959:53;;:::o;21018:589::-;;21265:95;21356:3;21347:6;21265:95;:::i;:::-;21258:102;;21377:95;21468:3;21459:6;21377:95;:::i;:::-;21370:102;;21489:92;21577:3;21568:6;21489:92;:::i;:::-;21482:99;;21598:3;21591:10;;21247:360;;;;;;:::o;21613:222::-;;21744:2;21733:9;21729:18;21721:26;;21757:71;21825:1;21814:9;21810:17;21801:6;21757:71;:::i;:::-;21711:124;;;;:::o;21841:640::-;;22074:3;22063:9;22059:19;22051:27;;22088:71;22156:1;22145:9;22141:17;22132:6;22088:71;:::i;:::-;22169:72;22237:2;22226:9;22222:18;22213:6;22169:72;:::i;:::-;22251;22319:2;22308:9;22304:18;22295:6;22251:72;:::i;:::-;22370:9;22364:4;22360:20;22355:2;22344:9;22340:18;22333:48;22398:76;22469:4;22460:6;22398:76;:::i;:::-;22390:84;;22041:440;;;;;;;:::o;22487:373::-;;22668:2;22657:9;22653:18;22645:26;;22717:9;22711:4;22707:20;22703:1;22692:9;22688:17;22681:47;22745:108;22848:4;22839:6;22745:108;:::i;:::-;22737:116;;22635:225;;;;:::o;22866:210::-;;22991:2;22980:9;22976:18;22968:26;;23004:65;23066:1;23055:9;23051:17;23042:6;23004:65;:::i;:::-;22958:118;;;;:::o;23082:246::-;;23225:2;23214:9;23210:18;23202:26;;23238:83;23318:1;23307:9;23303:17;23294:6;23238:83;:::i;:::-;23192:136;;;;:::o;23334:313::-;;23485:2;23474:9;23470:18;23462:26;;23534:9;23528:4;23524:20;23520:1;23509:9;23505:17;23498:47;23562:78;23635:4;23626:6;23562:78;:::i;:::-;23554:86;;23452:195;;;;:::o;23653:419::-;;23857:2;23846:9;23842:18;23834:26;;23906:9;23900:4;23896:20;23892:1;23881:9;23877:17;23870:47;23934:131;24060:4;23934:131;:::i;:::-;23926:139;;23824:248;;;:::o;24078:419::-;;24282:2;24271:9;24267:18;24259:26;;24331:9;24325:4;24321:20;24317:1;24306:9;24302:17;24295:47;24359:131;24485:4;24359:131;:::i;:::-;24351:139;;24249:248;;;:::o;24503:419::-;;24707:2;24696:9;24692:18;24684:26;;24756:9;24750:4;24746:20;24742:1;24731:9;24727:17;24720:47;24784:131;24910:4;24784:131;:::i;:::-;24776:139;;24674:248;;;:::o;24928:419::-;;25132:2;25121:9;25117:18;25109:26;;25181:9;25175:4;25171:20;25167:1;25156:9;25152:17;25145:47;25209:131;25335:4;25209:131;:::i;:::-;25201:139;;25099:248;;;:::o;25353:419::-;;25557:2;25546:9;25542:18;25534:26;;25606:9;25600:4;25596:20;25592:1;25581:9;25577:17;25570:47;25634:131;25760:4;25634:131;:::i;:::-;25626:139;;25524:248;;;:::o;25778:419::-;;25982:2;25971:9;25967:18;25959:26;;26031:9;26025:4;26021:20;26017:1;26006:9;26002:17;25995:47;26059:131;26185:4;26059:131;:::i;:::-;26051:139;;25949:248;;;:::o;26203:419::-;;26407:2;26396:9;26392:18;26384:26;;26456:9;26450:4;26446:20;26442:1;26431:9;26427:17;26420:47;26484:131;26610:4;26484:131;:::i;:::-;26476:139;;26374:248;;;:::o;26628:419::-;;26832:2;26821:9;26817:18;26809:26;;26881:9;26875:4;26871:20;26867:1;26856:9;26852:17;26845:47;26909:131;27035:4;26909:131;:::i;:::-;26901:139;;26799:248;;;:::o;27053:419::-;;27257:2;27246:9;27242:18;27234:26;;27306:9;27300:4;27296:20;27292:1;27281:9;27277:17;27270:47;27334:131;27460:4;27334:131;:::i;:::-;27326:139;;27224:248;;;:::o;27478:419::-;;27682:2;27671:9;27667:18;27659:26;;27731:9;27725:4;27721:20;27717:1;27706:9;27702:17;27695:47;27759:131;27885:4;27759:131;:::i;:::-;27751:139;;27649:248;;;:::o;27903:419::-;;28107:2;28096:9;28092:18;28084:26;;28156:9;28150:4;28146:20;28142:1;28131:9;28127:17;28120:47;28184:131;28310:4;28184:131;:::i;:::-;28176:139;;28074:248;;;:::o;28328:419::-;;28532:2;28521:9;28517:18;28509:26;;28581:9;28575:4;28571:20;28567:1;28556:9;28552:17;28545:47;28609:131;28735:4;28609:131;:::i;:::-;28601:139;;28499:248;;;:::o;28753:419::-;;28957:2;28946:9;28942:18;28934:26;;29006:9;29000:4;28996:20;28992:1;28981:9;28977:17;28970:47;29034:131;29160:4;29034:131;:::i;:::-;29026:139;;28924:248;;;:::o;29178:419::-;;29382:2;29371:9;29367:18;29359:26;;29431:9;29425:4;29421:20;29417:1;29406:9;29402:17;29395:47;29459:131;29585:4;29459:131;:::i;:::-;29451:139;;29349:248;;;:::o;29603:419::-;;29807:2;29796:9;29792:18;29784:26;;29856:9;29850:4;29846:20;29842:1;29831:9;29827:17;29820:47;29884:131;30010:4;29884:131;:::i;:::-;29876:139;;29774:248;;;:::o;30028:419::-;;30232:2;30221:9;30217:18;30209:26;;30281:9;30275:4;30271:20;30267:1;30256:9;30252:17;30245:47;30309:131;30435:4;30309:131;:::i;:::-;30301:139;;30199:248;;;:::o;30453:419::-;;30657:2;30646:9;30642:18;30634:26;;30706:9;30700:4;30696:20;30692:1;30681:9;30677:17;30670:47;30734:131;30860:4;30734:131;:::i;:::-;30726:139;;30624:248;;;:::o;30878:419::-;;31082:2;31071:9;31067:18;31059:26;;31131:9;31125:4;31121:20;31117:1;31106:9;31102:17;31095:47;31159:131;31285:4;31159:131;:::i;:::-;31151:139;;31049:248;;;:::o;31303:419::-;;31507:2;31496:9;31492:18;31484:26;;31556:9;31550:4;31546:20;31542:1;31531:9;31527:17;31520:47;31584:131;31710:4;31584:131;:::i;:::-;31576:139;;31474:248;;;:::o;31728:419::-;;31932:2;31921:9;31917:18;31909:26;;31981:9;31975:4;31971:20;31967:1;31956:9;31952:17;31945:47;32009:131;32135:4;32009:131;:::i;:::-;32001:139;;31899:248;;;:::o;32153:419::-;;32357:2;32346:9;32342:18;32334:26;;32406:9;32400:4;32396:20;32392:1;32381:9;32377:17;32370:47;32434:131;32560:4;32434:131;:::i;:::-;32426:139;;32324:248;;;:::o;32578:419::-;;32782:2;32771:9;32767:18;32759:26;;32831:9;32825:4;32821:20;32817:1;32806:9;32802:17;32795:47;32859:131;32985:4;32859:131;:::i;:::-;32851:139;;32749:248;;;:::o;33003:419::-;;33207:2;33196:9;33192:18;33184:26;;33256:9;33250:4;33246:20;33242:1;33231:9;33227:17;33220:47;33284:131;33410:4;33284:131;:::i;:::-;33276:139;;33174:248;;;:::o;33428:419::-;;33632:2;33621:9;33617:18;33609:26;;33681:9;33675:4;33671:20;33667:1;33656:9;33652:17;33645:47;33709:131;33835:4;33709:131;:::i;:::-;33701:139;;33599:248;;;:::o;33853:419::-;;34057:2;34046:9;34042:18;34034:26;;34106:9;34100:4;34096:20;34092:1;34081:9;34077:17;34070:47;34134:131;34260:4;34134:131;:::i;:::-;34126:139;;34024:248;;;:::o;34278:419::-;;34482:2;34471:9;34467:18;34459:26;;34531:9;34525:4;34521:20;34517:1;34506:9;34502:17;34495:47;34559:131;34685:4;34559:131;:::i;:::-;34551:139;;34449:248;;;:::o;34703:419::-;;34907:2;34896:9;34892:18;34884:26;;34956:9;34950:4;34946:20;34942:1;34931:9;34927:17;34920:47;34984:131;35110:4;34984:131;:::i;:::-;34976:139;;34874:248;;;:::o;35128:222::-;;35259:2;35248:9;35244:18;35236:26;;35272:71;35340:1;35329:9;35325:17;35316:6;35272:71;:::i;:::-;35226:124;;;;:::o;35356:283::-;;35422:2;35416:9;35406:19;;35464:4;35456:6;35452:17;35571:6;35559:10;35556:22;35535:18;35523:10;35520:34;35517:62;35514:2;;;35582:18;;:::i;:::-;35514:2;35622:10;35618:2;35611:22;35396:243;;;;:::o;35645:331::-;;35796:18;35788:6;35785:30;35782:2;;;35818:18;;:::i;:::-;35782:2;35903:4;35899:9;35892:4;35884:6;35880:17;35876:33;35868:41;;35964:4;35958;35954:15;35946:23;;35711:265;;;:::o;35982:332::-;;36134:18;36126:6;36123:30;36120:2;;;36156:18;;:::i;:::-;36120:2;36241:4;36237:9;36230:4;36222:6;36218:17;36214:33;36206:41;;36302:4;36296;36292:15;36284:23;;36049:265;;;:::o;36320:132::-;;36410:3;36402:11;;36440:4;36435:3;36431:14;36423:22;;36392:60;;;:::o;36458:141::-;;36530:3;36522:11;;36553:3;36550:1;36543:14;36587:4;36584:1;36574:18;36566:26;;36512:87;;;:::o;36605:114::-;;36706:5;36700:12;36690:22;;36679:40;;;:::o;36725:98::-;;36810:5;36804:12;36794:22;;36783:40;;;:::o;36829:99::-;;36915:5;36909:12;36899:22;;36888:40;;;:::o;36934:113::-;;37036:4;37031:3;37027:14;37019:22;;37009:38;;;:::o;37053:184::-;;37186:6;37181:3;37174:19;37226:4;37221:3;37217:14;37202:29;;37164:73;;;;:::o;37243:168::-;;37360:6;37355:3;37348:19;37400:4;37395:3;37391:14;37376:29;;37338:73;;;;:::o;37417:169::-;;37535:6;37530:3;37523:19;37575:4;37570:3;37566:14;37551:29;;37513:73;;;;:::o;37592:148::-;;37731:3;37716:18;;37706:34;;;;:::o;37746:305::-;;37805:20;37823:1;37805:20;:::i;:::-;37800:25;;37839:20;37857:1;37839:20;:::i;:::-;37834:25;;37993:1;37925:66;37921:74;37918:1;37915:81;37912:2;;;37999:18;;:::i;:::-;37912:2;38043:1;38040;38036:9;38029:16;;37790:261;;;;:::o;38057:185::-;;38114:20;38132:1;38114:20;:::i;:::-;38109:25;;38148:20;38166:1;38148:20;:::i;:::-;38143:25;;38187:1;38177:2;;38192:18;;:::i;:::-;38177:2;38234:1;38231;38227:9;38222:14;;38099:143;;;;:::o;38248:348::-;;38311:20;38329:1;38311:20;:::i;:::-;38306:25;;38345:20;38363:1;38345:20;:::i;:::-;38340:25;;38533:1;38465:66;38461:74;38458:1;38455:81;38450:1;38443:9;38436:17;38432:105;38429:2;;;38540:18;;:::i;:::-;38429:2;38588:1;38585;38581:9;38570:20;;38296:300;;;;:::o;38602:191::-;;38662:20;38680:1;38662:20;:::i;:::-;38657:25;;38696:20;38714:1;38696:20;:::i;:::-;38691:25;;38735:1;38732;38729:8;38726:2;;;38740:18;;:::i;:::-;38726:2;38785:1;38782;38778:9;38770:17;;38647:146;;;;:::o;38799:96::-;;38865:24;38883:5;38865:24;:::i;:::-;38854:35;;38844:51;;;:::o;38901:90::-;;38978:5;38971:13;38964:21;38953:32;;38943:48;;;:::o;38997:149::-;;39073:66;39066:5;39062:78;39051:89;;39041:105;;;:::o;39152:139::-;;39232:5;39221:16;;39238:47;39279:5;39238:47;:::i;:::-;39211:80;;;:::o;39297:126::-;;39374:42;39367:5;39363:54;39352:65;;39342:81;;;:::o;39429:77::-;;39495:5;39484:16;;39474:32;;;:::o;39512:139::-;;39607:38;39639:5;39607:38;:::i;:::-;39594:51;;39584:67;;;:::o;39657:154::-;39741:6;39736:3;39731;39718:30;39803:1;39794:6;39789:3;39785:16;39778:27;39708:103;;;:::o;39817:307::-;39885:1;39895:113;39909:6;39906:1;39903:13;39895:113;;;39994:1;39989:3;39985:11;39979:18;39975:1;39970:3;39966:11;39959:39;39931:2;39928:1;39924:10;39919:15;;39895:113;;;40026:6;40023:1;40020:13;40017:2;;;40106:1;40097:6;40092:3;40088:16;40081:27;40017:2;39866:258;;;;:::o;40130:320::-;;40211:1;40205:4;40201:12;40191:22;;40258:1;40252:4;40248:12;40279:18;40269:2;;40335:4;40327:6;40323:17;40313:27;;40269:2;40397;40389:6;40386:14;40366:18;40363:38;40360:2;;;40416:18;;:::i;:::-;40360:2;40181:269;;;;:::o;40456:233::-;;40518:24;40536:5;40518:24;:::i;:::-;40509:33;;40564:66;40557:5;40554:77;40551:2;;;40634:18;;:::i;:::-;40551:2;40681:1;40674:5;40670:13;40663:20;;40499:190;;;:::o;40695:176::-;;40744:20;40762:1;40744:20;:::i;:::-;40739:25;;40778:20;40796:1;40778:20;:::i;:::-;40773:25;;40817:1;40807:2;;40822:18;;:::i;:::-;40807:2;40863:1;40860;40856:9;40851:14;;40729:142;;;;:::o;40877:180::-;40925:77;40922:1;40915:88;41022:4;41019:1;41012:15;41046:4;41043:1;41036:15;41063:180;41111:77;41108:1;41101:88;41208:4;41205:1;41198:15;41232:4;41229:1;41222:15;41249:180;41297:77;41294:1;41287:88;41394:4;41391:1;41384:15;41418:4;41415:1;41408:15;41435:180;41483:77;41480:1;41473:88;41580:4;41577:1;41570:15;41604:4;41601:1;41594:15;41621:180;41669:77;41666:1;41659:88;41766:4;41763:1;41756:15;41790:4;41787:1;41780:15;41807:102;;41899:2;41895:7;41890:2;41883:5;41879:14;41875:28;41865:38;;41855:54;;;:::o;41915:119::-;42002:1;41995:5;41992:12;41982:2;;42008:18;;:::i;:::-;41982:2;41972:62;:::o;42040:122::-;42113:24;42131:5;42113:24;:::i;:::-;42106:5;42103:35;42093:2;;42152:1;42149;42142:12;42093:2;42083:79;:::o;42168:116::-;42238:21;42253:5;42238:21;:::i;:::-;42231:5;42228:32;42218:2;;42274:1;42271;42264:12;42218:2;42208:76;:::o;42290:120::-;42362:23;42379:5;42362:23;:::i;:::-;42355:5;42352:34;42342:2;;42400:1;42397;42390:12;42342:2;42332:78;:::o;42416:122::-;42489:24;42507:5;42489:24;:::i;:::-;42482:5;42479:35;42469:2;;42528:1;42525;42518:12;42469:2;42459:79;:::o

Swarm Source

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