ETH Price: $2,679.91 (+1.62%)

Token

TIRO - Time Is Running Out (TIRO)
 

Overview

Max Total Supply

1,111 TIRO

Holders

398

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 TIRO
0x6E47a768206673169eC07544544e37749DFA8B0D
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:
Tiro

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-06
*/

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev Provides a set of functions to operate with Base64 strings.
 *
 * _Available since v4.5._
 */
library Base64 {
    /**
     * @dev Base64 Encoding/Decoding Table
     */
    string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /**
     * @dev Converts a `bytes` to its Bytes64 `string` representation.
     */
    function encode(bytes memory data) internal pure returns (string memory) {
        /**
         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
         */
        if (data.length == 0) return "";

        // Loads the table into memory
        string memory table = _TABLE;

        // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
        // and split into 4 numbers of 6 bits.
        // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
        // - `data.length + 2`  -> Round up
        // - `/ 3`              -> Number of 3-bytes chunks
        // - `4 *`              -> 4 characters for each chunk
        string memory result = new string(4 * ((data.length + 2) / 3));

        /// @solidity memory-safe-assembly
        assembly {
            // Prepare the lookup table (skip the first "length" byte)
            let tablePtr := add(table, 1)

            // Prepare result pointer, jump over length
            let resultPtr := add(result, 32)

            // Run over the input, 3 bytes at a time
            for {
                let dataPtr := data
                let endPtr := add(data, mload(data))
            } lt(dataPtr, endPtr) {

            } {
                // Advance 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // To write each character, shift the 3 bytes (18 bits) chunk
                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
                // and apply logical AND with 0x3F which is the number of
                // the previous character in the ASCII table prior to the Base64 Table
                // The result is then added to the table to get the character to write,
                // and finally write it in the result pointer but with a left shift
                // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits

                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance
            }

            // When data `bytes` is not exactly 3 bytes long
            // it is padded with `=` characters at the end
            switch mod(mload(data), 3)
            case 1 {
                mstore8(sub(resultPtr, 1), 0x3d)
                mstore8(sub(resultPtr, 2), 0x3d)
            }
            case 2 {
                mstore8(sub(resultPtr, 1), 0x3d)
            }
        }

        return result;
    }
}

// File: contracts/ProjectMaybeMintPass.sol


pragma solidity ^0.8.1;




contract ProjectMaybeMintPass is ERC721Enumerable, Ownable {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;
    string private _baseUri;
    string uriSuffix = ".json";
    
    uint256 public constant MAX_SUPPLY = 500;
    uint256 public constant OG_SUPPLY = 130;
    uint256 public maxMintQuantity = 1;
    bool public isOGSalesActive = true;
    bool public isWLSalesActive = false;
    bool public isSalesActive = true;
    
    mapping(address => bool) private OGAddresses;
    mapping(address => bool) private WLAddresses;

    constructor(string memory baseUri) ERC721("Project Maybe Mint Pass", "PROJECTMAYBE") {
        _baseUri = baseUri;
    }
    
    function mint() external payable { 
        uint256 supply = totalSupply();
        uint256[] memory ownerTokenIds = walletOfOwner(msg.sender);
        require(isSalesActive, "mint is not active");
        require(ownerTokenIds.length < maxMintQuantity, "Cannot mint more than maximum quantity");
        if (isOGSalesActive) {
            require(OGAddresses[msg.sender] == true, "address not in the OG list");
            require(supply < OG_SUPPLY, "Exceeds maximum OG supply");
        }
        if (isWLSalesActive) {
            require(WLAddresses[msg.sender] == true, "address not in the whitelist");
        }
        require(supply < MAX_SUPPLY, "Exceeds maximum supply");
        
        safeMint(msg.sender);
    }

    function safeMint(address to) internal {
        _tokenIdCounter.increment();
        uint256 tokenId = _tokenIdCounter.current();
        _safeMint(to, tokenId);
    }

    // mint unclaimed tokens to _to
    function mintUnclaimed(address _to, uint256[] memory _tokenIds) external onlyOwner {
        for(uint256 i=0; i < _tokenIds.length; i++) {
            _safeMint(_to, _tokenIds[i]);
        }
    }

    // give presale access to whitelist addresses
    function giveWLAccess(address[] memory _addresses) external onlyOwner {
        for (uint256 i = 0; i < _addresses.length; i++) {
            WLAddresses[_addresses[i]] = true;
        }
    }

    // give presale access to OG addresses
    function giveOGAccess(address[] memory _addresses) external onlyOwner {
        for (uint256 i = 0; i < _addresses.length; i++) {
            OGAddresses[_addresses[i]] = true;
        }
    }

    // get token URI of given token ID
    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
        return string(abi.encodePacked(_baseUri, Strings.toString(_tokenId), uriSuffix));
    }

    // return all token IDs minted by _owner
    function walletOfOwner(address _owner) public view returns(uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);

        uint256[] memory tokensId = new uint256[](tokenCount);
        for(uint256 i; i < tokenCount; i++){
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }

    function baseURI() external view returns (string memory) {
        return _baseUri;
    }

    function setBaseURI(string memory newBaseUri) external onlyOwner {
        _baseUri = newBaseUri;
    }

    function toggleOGSales() external onlyOwner {
        isOGSalesActive = !isOGSalesActive;
    }

    function toggleWLSales() external onlyOwner {
        isWLSalesActive = !isWLSalesActive;
    }

    function toggleSales() external onlyOwner {
        isSalesActive = !isSalesActive;
    }
}

// File: contracts/Tiro.sol


pragma solidity ^0.8.0;







contract Tiro is ERC721Enumerable, Ownable {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;
    string private _baseUri;
    
    uint256 public constant MAX_SUPPLY = 1111;
    uint256 public constant GOLD_MINT_PASS_MAX = 100;
    uint256 public price = 0.015 ether;
    uint256 public maxMintQuantity = 3;
    bool public isMintPassActive = true;
    bool public isWLActive = false;
    bool public isSalesActive = true;

    mapping(address => bool) private _wlAccess;
    mapping(uint256 => address) private _mintPassHolders;
    mapping(uint256 => address) private _usedMintPass;

    constructor(string memory baseUri) ERC721("TIRO - Time Is Running Out", "TIRO") {
        _baseUri = baseUri;
    }
    
    function mint(uint quantity, uint256[] memory mintPassTokenIds) external payable {
        uint256 mintedQuantity = totalSupply();
        uint256[] memory ownerTokenIds = walletOfOwner(msg.sender);
        uint256 paidMintQuantity = quantity;
        require(isSalesActive, "sales is not active");
        require(mintedQuantity < MAX_SUPPLY, "All sold out");
        if (mintPassTokenIds.length > 0) {
            for(uint256 i=0; i < mintPassTokenIds.length; i++) {
                // check if the msg.sender is indeed the snapshot address for the mint pass tokenID
                require(_mintPassHolders[mintPassTokenIds[i]-1] == msg.sender, "Sender is not a rightful owner of the submitted Mint Passes");
                require(usedMintPassByTokenId(mintPassTokenIds[i]) == address(0), "At least one of the Mint Passes had already been used");
            }

            // count mint other than from mint pass
            uint256 freemintQuantity = _covertMintPassQuantity(mintPassTokenIds);
            paidMintQuantity = quantity - freemintQuantity;
        }
        require(paidMintQuantity >= 0, "paid quantity cannot be negative");
        // paid mint
        if (paidMintQuantity >= 1) {
            if (isMintPassActive) {
                // guard off anyone who tries to mint more than the number of mint pass during the pre-WL time
                require(paidMintQuantity == 0, "No paid mint during Mint Pass hour");
            }
            else {
                if (isWLActive) {
                    require(_wlAccess[msg.sender] == true, "address not in the whitelist");
                }
                require(paidMintQuantity <= maxMintQuantity, "Cannot mint more than maximum quantity per wallet");
                require(ownerTokenIds.length <= maxMintQuantity, "Cannot mint more than maximum quantity per wallet");
            }
            require(mintedQuantity + quantity <= MAX_SUPPLY, "Exceeds maximum supply");
            require(msg.value >= price * paidMintQuantity, "ether send is under price");
        } 
        else {
            // if holder uses mint pass and remaining quantity is less than number of mint pass, allow holder to mint everything that is left
            if (mintedQuantity + quantity > MAX_SUPPLY) {
                quantity = MAX_SUPPLY - mintedQuantity;
            }
        }

        // update the mint pass tokens as used
        for(uint256 i=0; i < mintPassTokenIds.length; i++) {
            _usedMintPass[mintPassTokenIds[i]] = msg.sender;
        }
        
        for (uint256 i = 0; i < quantity; i++) {
            safeMint(msg.sender);
        }
    }

    function safeMint(address to) internal {
        _tokenIdCounter.increment();
        uint256 tokenId = _tokenIdCounter.current();
        _safeMint(to, tokenId);
    }

    function _covertMintPassQuantity(uint256[] memory mintPassTokenIds) internal pure returns (uint256) {
        uint256 mintPassQuantity = mintPassTokenIds.length;
        for (uint256 i=0; i < mintPassTokenIds.length; i++) {
            // Gold Mint Pass gets 2 Free mint
            if (mintPassTokenIds[i] <= GOLD_MINT_PASS_MAX) {
                mintPassQuantity += 1;
            }
        }
        return mintPassQuantity;
    }

    // mint unclaimed tokens to _to
    function mintUnclaimed(address to, uint256[] memory tokenIds) external onlyOwner {
        for(uint256 i=0; i < tokenIds.length; i++) {
            _safeMint(to, tokenIds[i]);
        }
    }

    // assign mint pass holders addresses
    function snapshotMintPassHolders(address[] memory addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            _mintPassHolders[i] = addresses[i];
        }
    }

    // give presale access to whitelist addresses
    function give_wlAccess(address[] memory addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            _wlAccess[addresses[i]] = true;
        }
    }

    // get token URI of given token ID
    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
        return string(abi.encodePacked(_baseUri, Strings.toString(_tokenId), ".json"));
    }

    // return all token IDs minted by _owner
    function walletOfOwner(address _owner) public view returns(uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);

        uint256[] memory tokensId = new uint256[](tokenCount);
        for(uint256 i; i < tokenCount; i++){
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }

    // return address of whom used the mint pass token
    function usedMintPassByTokenId(uint256 tokenId) public view returns (address) {
        return _usedMintPass[tokenId];
    }

    function baseURI() external view returns (string memory) {
        return _baseUri;
    }

    function setBaseURI(string memory newBaseUri) external onlyOwner {
        _baseUri = newBaseUri;
    }

    function toggleSales(bool mintpass, bool wl, bool sales, uint256 newPrice) external onlyOwner {
        isMintPassActive = mintpass;
        isWLActive = wl;
        isSalesActive = sales;
        price = newPrice;
    }
    
    function withdrawAll() external onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseUri","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":"GOLD_MINT_PASS_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"give_wlAccess","outputs":[],"stateMutability":"nonpayable","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":"isMintPassActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSalesActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWLActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintQuantity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256[]","name":"mintPassTokenIds","type":"uint256[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"mintUnclaimed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"snapshotMintPassHolders","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":"bool","name":"mintpass","type":"bool"},{"internalType":"bool","name":"wl","type":"bool"},{"internalType":"bool","name":"sales","type":"bool"},{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"toggleSales","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"tokenId","type":"uint256"}],"name":"usedMintPassByTokenId","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266354a6ba7a18000600d556003600e556001600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff0219169083151502179055506001600f60026101000a81548160ff0219169083151502179055503480156200007257600080fd5b50604051620053d8380380620053d88339818101604052810190620000989190620003c4565b6040518060400160405280601a81526020017f5449524f202d2054696d652049732052756e6e696e67204f75740000000000008152506040518060400160405280600481526020017f5449524f00000000000000000000000000000000000000000000000000000000815250816000908162000115919062000660565b50806001908162000127919062000660565b5050506200014a6200013e6200016360201b60201c565b6200016b60201b60201c565b80600c90816200015b919062000660565b505062000747565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200029a826200024f565b810181811067ffffffffffffffff82111715620002bc57620002bb62000260565b5b80604052505050565b6000620002d162000231565b9050620002df82826200028f565b919050565b600067ffffffffffffffff82111562000302576200030162000260565b5b6200030d826200024f565b9050602081019050919050565b60005b838110156200033a5780820151818401526020810190506200031d565b60008484015250505050565b60006200035d6200035784620002e4565b620002c5565b9050828152602081018484840111156200037c576200037b6200024a565b5b620003898482856200031a565b509392505050565b600082601f830112620003a957620003a862000245565b5b8151620003bb84826020860162000346565b91505092915050565b600060208284031215620003dd57620003dc6200023b565b5b600082015167ffffffffffffffff811115620003fe57620003fd62000240565b5b6200040c8482850162000391565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200046857607f821691505b6020821081036200047e576200047d62000420565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004e87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620004a9565b620004f48683620004a9565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005416200053b62000535846200050c565b62000516565b6200050c565b9050919050565b6000819050919050565b6200055d8362000520565b620005756200056c8262000548565b848454620004b6565b825550505050565b600090565b6200058c6200057d565b6200059981848462000552565b505050565b5b81811015620005c157620005b560008262000582565b6001810190506200059f565b5050565b601f8211156200061057620005da8162000484565b620005e58462000499565b81016020851015620005f5578190505b6200060d620006048562000499565b8301826200059e565b50505b505050565b600082821c905092915050565b6000620006356000198460080262000615565b1980831691505092915050565b600062000650838362000622565b9150826002028217905092915050565b6200066b8262000415565b67ffffffffffffffff81111562000687576200068662000260565b5b6200069382546200044f565b620006a0828285620005c5565b600060209050601f831160018114620006d85760008415620006c3578287015190505b620006cf858262000642565b8655506200073f565b601f198416620006e88662000484565b60005b828110156200071257848901518255600182019150602085019450602081019050620006eb565b868310156200073257848901516200072e601f89168262000622565b8355505b6001600288020188555050505b505050505050565b614c8180620007576000396000f3fe60806040526004361061020f5760003560e01c80636e05c9d311610118578063a22cb465116100a0578063b88d4fde1161006f578063b88d4fde14610790578063c87b56dd146107b9578063daa81cdd146107f6578063e985e9c514610821578063f2fde38b1461085e5761020f565b8063a22cb465146106e8578063aaad175614610711578063ae9aea6d1461073c578063b2dbf058146107675761020f565b806382c6752a116100e757806382c6752a14610625578063853828b6146106505780638da5cb5b1461066757806395d89b4114610692578063a035b1fe146106bd5761020f565b80636e05c9d31461056b57806370a08231146105a8578063715018a6146105e557806373111f40146105fc5761020f565b806332cb6b0c1161019b57806355f804b31161016a57806355f804b3146104865780636352211e146104af57806367ccec1e146104ec57806368c2415b146105175780636c0360eb146105405761020f565b806332cb6b0c146103b857806342842e0e146103e3578063438b63001461040c5780634f6ccce7146104495761020f565b806318160ddd116101e257806318160ddd146102e25780631cb83d371461030d57806323b872dd146103365780632d69044f1461035f5780632f745c591461037b5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612e03565b610887565b6040516102489190612e4b565b60405180910390f35b34801561025d57600080fd5b50610266610901565b6040516102739190612ef6565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190612f4e565b610993565b6040516102b09190612fbc565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190613003565b6109d9565b005b3480156102ee57600080fd5b506102f7610af0565b6040516103049190613052565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f91906131b5565b610afd565b005b34801561034257600080fd5b5061035d600480360381019061035891906131fe565b610b9a565b005b61037960048036038101906103749190613314565b610bfa565b005b34801561038757600080fd5b506103a2600480360381019061039d9190613003565b6111af565b6040516103af9190613052565b60405180910390f35b3480156103c457600080fd5b506103cd611254565b6040516103da9190613052565b60405180910390f35b3480156103ef57600080fd5b5061040a600480360381019061040591906131fe565b61125a565b005b34801561041857600080fd5b50610433600480360381019061042e9190613370565b61127a565b604051610440919061345b565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b9190612f4e565b611328565b60405161047d9190613052565b60405180910390f35b34801561049257600080fd5b506104ad60048036038101906104a89190613532565b611399565b005b3480156104bb57600080fd5b506104d660048036038101906104d19190612f4e565b6113b4565b6040516104e39190612fbc565b60405180910390f35b3480156104f857600080fd5b50610501611465565b60405161050e9190612e4b565b60405180910390f35b34801561052357600080fd5b5061053e600480360381019061053991906135a7565b611478565b005b34801561054c57600080fd5b506105556114db565b6040516105629190612ef6565b60405180910390f35b34801561057757600080fd5b50610592600480360381019061058d9190612f4e565b61156d565b60405161059f9190612fbc565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca9190613370565b6115aa565b6040516105dc9190613052565b60405180910390f35b3480156105f157600080fd5b506105fa611661565b005b34801561060857600080fd5b50610623600480360381019061061e91906131b5565b611675565b005b34801561063157600080fd5b5061063a61170c565b6040516106479190613052565b60405180910390f35b34801561065c57600080fd5b50610665611711565b005b34801561067357600080fd5b5061067c611759565b6040516106899190612fbc565b60405180910390f35b34801561069e57600080fd5b506106a7611783565b6040516106b49190612ef6565b60405180910390f35b3480156106c957600080fd5b506106d2611815565b6040516106df9190613052565b60405180910390f35b3480156106f457600080fd5b5061070f600480360381019061070a919061360e565b61181b565b005b34801561071d57600080fd5b50610726611831565b6040516107339190612e4b565b60405180910390f35b34801561074857600080fd5b50610751611844565b60405161075e9190613052565b60405180910390f35b34801561077357600080fd5b5061078e6004803603810190610789919061364e565b61184a565b005b34801561079c57600080fd5b506107b760048036038101906107b2919061374b565b61189a565b005b3480156107c557600080fd5b506107e060048036038101906107db9190612f4e565b6118fc565b6040516107ed9190612ef6565b60405180910390f35b34801561080257600080fd5b5061080b611978565b6040516108189190612e4b565b60405180910390f35b34801561082d57600080fd5b50610848600480360381019061084391906137ce565b61198b565b6040516108559190612e4b565b60405180910390f35b34801561086a57600080fd5b5061088560048036038101906108809190613370565b611a1f565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108fa57506108f982611aa2565b5b9050919050565b6060600080546109109061383d565b80601f016020809104026020016040519081016040528092919081815260200182805461093c9061383d565b80156109895780601f1061095e57610100808354040283529160200191610989565b820191906000526020600020905b81548152906001019060200180831161096c57829003601f168201915b5050505050905090565b600061099e82611b84565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109e4826113b4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4b906138e0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a73611bcf565b73ffffffffffffffffffffffffffffffffffffffff161480610aa25750610aa181610a9c611bcf565b61198b565b5b610ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad890613972565b60405180910390fd5b610aeb8383611bd7565b505050565b6000600880549050905090565b610b05611c90565b60005b8151811015610b9657600160106000848481518110610b2a57610b29613992565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610b8e906139f0565b915050610b08565b5050565b610bab610ba5611bcf565b82611d0e565b610bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be190613aaa565b60405180910390fd5b610bf5838383611da3565b505050565b6000610c04610af0565b90506000610c113361127a565b90506000849050600f60029054906101000a900460ff16610c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5e90613b16565b60405180910390fd5b6104578310610cab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca290613b82565b60405180910390fd5b600084511115610e4a5760005b8451811015610e2c573373ffffffffffffffffffffffffffffffffffffffff16601160006001888581518110610cf157610cf0613992565b5b6020026020010151610d039190613ba2565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7f90613c48565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16610dc3868381518110610db657610db5613992565b5b602002602001015161156d565b73ffffffffffffffffffffffffffffffffffffffff1614610e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1090613cda565b60405180910390fd5b8080610e24906139f0565b915050610cb8565b506000610e3885612009565b90508086610e469190613ba2565b9150505b6000811015610e8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8590613d46565b60405180910390fd5b600181106110cd57600f60009054906101000a900460ff1615610ef35760008114610eee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee590613dd8565b60405180910390fd5b611028565b600f60019054906101000a900460ff1615610f9c5760011515601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9290613e44565b60405180910390fd5b5b600e54811115610fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd890613ed6565b60405180910390fd5b600e5482511115611027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101e90613ed6565b60405180910390fd5b5b61045785846110379190613ef6565b1115611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f90613f76565b60405180910390fd5b80600d546110869190613f96565b3410156110c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bf90614024565b60405180910390fd5b6110f4565b61045785846110dc9190613ef6565b11156110f357826104576110f09190613ba2565b94505b5b60005b845181101561117f57336012600087848151811061111857611117613992565b5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080611177906139f0565b9150506110f7565b5060005b858110156111a7576111943361206b565b808061119f906139f0565b915050611183565b505050505050565b60006111ba836115aa565b82106111fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f2906140b6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61045781565b6112758383836040518060200160405280600081525061189a565b505050565b60606000611287836115aa565b905060008167ffffffffffffffff8111156112a5576112a4613072565b5b6040519080825280602002602001820160405280156112d35781602001602082028036833780820191505090505b50905060005b8281101561131d576112eb85826111af565b8282815181106112fe576112fd613992565b5b6020026020010181815250508080611315906139f0565b9150506112d9565b508092505050919050565b6000611332610af0565b8210611373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136a90614148565b60405180910390fd5b6008828154811061138757611386613992565b5b90600052602060002001549050919050565b6113a1611c90565b80600c90816113b09190614314565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361145c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145390614432565b60405180910390fd5b80915050919050565b600f60019054906101000a900460ff1681565b611480611c90565b83600f60006101000a81548160ff02191690831515021790555082600f60016101000a81548160ff02191690831515021790555081600f60026101000a81548160ff02191690831515021790555080600d8190555050505050565b6060600c80546114ea9061383d565b80601f01602080910402602001604051908101604052809291908181526020018280546115169061383d565b80156115635780601f1061153857610100808354040283529160200191611563565b820191906000526020600020905b81548152906001019060200180831161154657829003601f168201915b5050505050905090565b60006012600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361161a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611611906144c4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611669611c90565b6116736000612091565b565b61167d611c90565b60005b81518110156117085781818151811061169c5761169b613992565b5b60200260200101516011600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080611700906139f0565b915050611680565b5050565b606481565b611719611c90565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061175757600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546117929061383d565b80601f01602080910402602001604051908101604052809291908181526020018280546117be9061383d565b801561180b5780601f106117e05761010080835404028352916020019161180b565b820191906000526020600020905b8154815290600101906020018083116117ee57829003601f168201915b5050505050905090565b600d5481565b61182d611826611bcf565b8383612157565b5050565b600f60009054906101000a900460ff1681565b600e5481565b611852611c90565b60005b8151811015611895576118828383838151811061187557611874613992565b5b60200260200101516122c3565b808061188d906139f0565b915050611855565b505050565b6118ab6118a5611bcf565b83611d0e565b6118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e190613aaa565b60405180910390fd5b6118f6848484846122e1565b50505050565b60606119078261233d565b611946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193d90614556565b60405180910390fd5b600c611951836123a9565b604051602001611962929190614681565b6040516020818303038152906040529050919050565b600f60029054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a27611c90565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8d90614722565b60405180910390fd5b611a9f81612091565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b6d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b7d5750611b7c82612509565b5b9050919050565b611b8d8161233d565b611bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc390614432565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c4a836113b4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611c98611bcf565b73ffffffffffffffffffffffffffffffffffffffff16611cb6611759565b73ffffffffffffffffffffffffffffffffffffffff1614611d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d039061478e565b60405180910390fd5b565b600080611d1a836113b4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d5c5750611d5b818561198b565b5b80611d9a57508373ffffffffffffffffffffffffffffffffffffffff16611d8284610993565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611dc3826113b4565b73ffffffffffffffffffffffffffffffffffffffff1614611e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1090614820565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7f906148b2565b60405180910390fd5b611e93838383612573565b611e9e600082611bd7565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eee9190613ba2565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f459190613ef6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612004838383612685565b505050565b6000808251905060005b835181101561206157606484828151811061203157612030613992565b5b60200260200101511161204e5760018261204b9190613ef6565b91505b8080612059906139f0565b915050612013565b5080915050919050565b612075600b61268a565b6000612081600b6126a0565b905061208d82826122c3565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121bc9061491e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122b69190612e4b565b60405180910390a3505050565b6122dd8282604051806020016040528060008152506126ae565b5050565b6122ec848484611da3565b6122f884848484612709565b612337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232e906149b0565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600082036123f0576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612504565b600082905060005b6000821461242257808061240b906139f0565b915050600a8261241b91906149ff565b91506123f8565b60008167ffffffffffffffff81111561243e5761243d613072565b5b6040519080825280601f01601f1916602001820160405280156124705781602001600182028036833780820191505090505b5090505b600085146124fd576001826124899190613ba2565b9150600a856124989190614a30565b60306124a49190613ef6565b60f81b8183815181106124ba576124b9613992565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124f691906149ff565b9450612474565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61257e838383612890565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036125c0576125bb81612895565b6125ff565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125fe576125fd83826128de565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126415761263c81612a4b565b612680565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461267f5761267e8282612b1c565b5b5b505050565b505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b6126b88383612b9b565b6126c56000848484612709565b612704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fb906149b0565b60405180910390fd5b505050565b600061272a8473ffffffffffffffffffffffffffffffffffffffff16612d74565b15612883578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612753611bcf565b8786866040518563ffffffff1660e01b81526004016127759493929190614ab6565b6020604051808303816000875af19250505080156127b157506040513d601f19601f820116820180604052508101906127ae9190614b17565b60015b612833573d80600081146127e1576040519150601f19603f3d011682016040523d82523d6000602084013e6127e6565b606091505b50600081510361282b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612822906149b0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612888565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016128eb846115aa565b6128f59190613ba2565b90506000600760008481526020019081526020016000205490508181146129da576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612a5f9190613ba2565b9050600060096000848152602001908152602001600020549050600060088381548110612a8f57612a8e613992565b5b906000526020600020015490508060088381548110612ab157612ab0613992565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612b0057612aff614b44565b5b6001900381819060005260206000200160009055905550505050565b6000612b27836115aa565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0190614bbf565b60405180910390fd5b612c138161233d565b15612c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4a90614c2b565b60405180910390fd5b612c5f60008383612573565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612caf9190613ef6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d7060008383612685565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612de081612dab565b8114612deb57600080fd5b50565b600081359050612dfd81612dd7565b92915050565b600060208284031215612e1957612e18612da1565b5b6000612e2784828501612dee565b91505092915050565b60008115159050919050565b612e4581612e30565b82525050565b6000602082019050612e606000830184612e3c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ea0578082015181840152602081019050612e85565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ec882612e66565b612ed28185612e71565b9350612ee2818560208601612e82565b612eeb81612eac565b840191505092915050565b60006020820190508181036000830152612f108184612ebd565b905092915050565b6000819050919050565b612f2b81612f18565b8114612f3657600080fd5b50565b600081359050612f4881612f22565b92915050565b600060208284031215612f6457612f63612da1565b5b6000612f7284828501612f39565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612fa682612f7b565b9050919050565b612fb681612f9b565b82525050565b6000602082019050612fd16000830184612fad565b92915050565b612fe081612f9b565b8114612feb57600080fd5b50565b600081359050612ffd81612fd7565b92915050565b6000806040838503121561301a57613019612da1565b5b600061302885828601612fee565b925050602061303985828601612f39565b9150509250929050565b61304c81612f18565b82525050565b60006020820190506130676000830184613043565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6130aa82612eac565b810181811067ffffffffffffffff821117156130c9576130c8613072565b5b80604052505050565b60006130dc612d97565b90506130e882826130a1565b919050565b600067ffffffffffffffff82111561310857613107613072565b5b602082029050602081019050919050565b600080fd5b600061313161312c846130ed565b6130d2565b9050808382526020820190506020840283018581111561315457613153613119565b5b835b8181101561317d57806131698882612fee565b845260208401935050602081019050613156565b5050509392505050565b600082601f83011261319c5761319b61306d565b5b81356131ac84826020860161311e565b91505092915050565b6000602082840312156131cb576131ca612da1565b5b600082013567ffffffffffffffff8111156131e9576131e8612da6565b5b6131f584828501613187565b91505092915050565b60008060006060848603121561321757613216612da1565b5b600061322586828701612fee565b935050602061323686828701612fee565b925050604061324786828701612f39565b9150509250925092565b600067ffffffffffffffff82111561326c5761326b613072565b5b602082029050602081019050919050565b600061329061328b84613251565b6130d2565b905080838252602082019050602084028301858111156132b3576132b2613119565b5b835b818110156132dc57806132c88882612f39565b8452602084019350506020810190506132b5565b5050509392505050565b600082601f8301126132fb576132fa61306d565b5b813561330b84826020860161327d565b91505092915050565b6000806040838503121561332b5761332a612da1565b5b600061333985828601612f39565b925050602083013567ffffffffffffffff81111561335a57613359612da6565b5b613366858286016132e6565b9150509250929050565b60006020828403121561338657613385612da1565b5b600061339484828501612fee565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6133d281612f18565b82525050565b60006133e483836133c9565b60208301905092915050565b6000602082019050919050565b60006134088261339d565b61341281856133a8565b935061341d836133b9565b8060005b8381101561344e57815161343588826133d8565b9750613440836133f0565b925050600181019050613421565b5085935050505092915050565b6000602082019050818103600083015261347581846133fd565b905092915050565b600080fd5b600067ffffffffffffffff82111561349d5761349c613072565b5b6134a682612eac565b9050602081019050919050565b82818337600083830152505050565b60006134d56134d084613482565b6130d2565b9050828152602081018484840111156134f1576134f061347d565b5b6134fc8482856134b3565b509392505050565b600082601f8301126135195761351861306d565b5b81356135298482602086016134c2565b91505092915050565b60006020828403121561354857613547612da1565b5b600082013567ffffffffffffffff81111561356657613565612da6565b5b61357284828501613504565b91505092915050565b61358481612e30565b811461358f57600080fd5b50565b6000813590506135a18161357b565b92915050565b600080600080608085870312156135c1576135c0612da1565b5b60006135cf87828801613592565b94505060206135e087828801613592565b93505060406135f187828801613592565b925050606061360287828801612f39565b91505092959194509250565b6000806040838503121561362557613624612da1565b5b600061363385828601612fee565b925050602061364485828601613592565b9150509250929050565b6000806040838503121561366557613664612da1565b5b600061367385828601612fee565b925050602083013567ffffffffffffffff81111561369457613693612da6565b5b6136a0858286016132e6565b9150509250929050565b600067ffffffffffffffff8211156136c5576136c4613072565b5b6136ce82612eac565b9050602081019050919050565b60006136ee6136e9846136aa565b6130d2565b90508281526020810184848401111561370a5761370961347d565b5b6137158482856134b3565b509392505050565b600082601f8301126137325761373161306d565b5b81356137428482602086016136db565b91505092915050565b6000806000806080858703121561376557613764612da1565b5b600061377387828801612fee565b945050602061378487828801612fee565b935050604061379587828801612f39565b925050606085013567ffffffffffffffff8111156137b6576137b5612da6565b5b6137c28782880161371d565b91505092959194509250565b600080604083850312156137e5576137e4612da1565b5b60006137f385828601612fee565b925050602061380485828601612fee565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061385557607f821691505b6020821081036138685761386761380e565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006138ca602183612e71565b91506138d58261386e565b604082019050919050565b600060208201905081810360008301526138f9816138bd565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b600061395c603e83612e71565b915061396782613900565b604082019050919050565b6000602082019050818103600083015261398b8161394f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139fb82612f18565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a2d57613a2c6139c1565b5b600182019050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000613a94602e83612e71565b9150613a9f82613a38565b604082019050919050565b60006020820190508181036000830152613ac381613a87565b9050919050565b7f73616c6573206973206e6f742061637469766500000000000000000000000000600082015250565b6000613b00601383612e71565b9150613b0b82613aca565b602082019050919050565b60006020820190508181036000830152613b2f81613af3565b9050919050565b7f416c6c20736f6c64206f75740000000000000000000000000000000000000000600082015250565b6000613b6c600c83612e71565b9150613b7782613b36565b602082019050919050565b60006020820190508181036000830152613b9b81613b5f565b9050919050565b6000613bad82612f18565b9150613bb883612f18565b9250828203905081811115613bd057613bcf6139c1565b5b92915050565b7f53656e646572206973206e6f74206120726967687466756c206f776e6572206f60008201527f6620746865207375626d6974746564204d696e74205061737365730000000000602082015250565b6000613c32603b83612e71565b9150613c3d82613bd6565b604082019050919050565b60006020820190508181036000830152613c6181613c25565b9050919050565b7f4174206c65617374206f6e65206f6620746865204d696e74205061737365732060008201527f68616420616c7265616479206265656e20757365640000000000000000000000602082015250565b6000613cc4603583612e71565b9150613ccf82613c68565b604082019050919050565b60006020820190508181036000830152613cf381613cb7565b9050919050565b7f70616964207175616e746974792063616e6e6f74206265206e65676174697665600082015250565b6000613d30602083612e71565b9150613d3b82613cfa565b602082019050919050565b60006020820190508181036000830152613d5f81613d23565b9050919050565b7f4e6f2070616964206d696e7420647572696e67204d696e74205061737320686f60008201527f7572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613dc2602283612e71565b9150613dcd82613d66565b604082019050919050565b60006020820190508181036000830152613df181613db5565b9050919050565b7f61646472657373206e6f7420696e207468652077686974656c69737400000000600082015250565b6000613e2e601c83612e71565b9150613e3982613df8565b602082019050919050565b60006020820190508181036000830152613e5d81613e21565b9050919050565b7f43616e6e6f74206d696e74206d6f7265207468616e206d6178696d756d20717560008201527f616e74697479207065722077616c6c6574000000000000000000000000000000602082015250565b6000613ec0603183612e71565b9150613ecb82613e64565b604082019050919050565b60006020820190508181036000830152613eef81613eb3565b9050919050565b6000613f0182612f18565b9150613f0c83612f18565b9250828201905080821115613f2457613f236139c1565b5b92915050565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b6000613f60601683612e71565b9150613f6b82613f2a565b602082019050919050565b60006020820190508181036000830152613f8f81613f53565b9050919050565b6000613fa182612f18565b9150613fac83612f18565b9250828202613fba81612f18565b91508282048414831517613fd157613fd06139c1565b5b5092915050565b7f65746865722073656e6420697320756e64657220707269636500000000000000600082015250565b600061400e601983612e71565b915061401982613fd8565b602082019050919050565b6000602082019050818103600083015261403d81614001565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006140a0602b83612e71565b91506140ab82614044565b604082019050919050565b600060208201905081810360008301526140cf81614093565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614132602c83612e71565b915061413d826140d6565b604082019050919050565b6000602082019050818103600083015261416181614125565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026141ca7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261418d565b6141d4868361418d565b95508019841693508086168417925050509392505050565b6000819050919050565b600061421161420c61420784612f18565b6141ec565b612f18565b9050919050565b6000819050919050565b61422b836141f6565b61423f61423782614218565b84845461419a565b825550505050565b600090565b614254614247565b61425f818484614222565b505050565b5b818110156142835761427860008261424c565b600181019050614265565b5050565b601f8211156142c85761429981614168565b6142a28461417d565b810160208510156142b1578190505b6142c56142bd8561417d565b830182614264565b50505b505050565b600082821c905092915050565b60006142eb600019846008026142cd565b1980831691505092915050565b600061430483836142da565b9150826002028217905092915050565b61431d82612e66565b67ffffffffffffffff81111561433657614335613072565b5b614340825461383d565b61434b828285614287565b600060209050601f83116001811461437e576000841561436c578287015190505b61437685826142f8565b8655506143de565b601f19841661438c86614168565b60005b828110156143b45784890151825560018201915060208501945060208101905061438f565b868310156143d157848901516143cd601f8916826142da565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061441c601883612e71565b9150614427826143e6565b602082019050919050565b6000602082019050818103600083015261444b8161440f565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006144ae602983612e71565b91506144b982614452565b604082019050919050565b600060208201905081810360008301526144dd816144a1565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614540602f83612e71565b915061454b826144e4565b604082019050919050565b6000602082019050818103600083015261456f81614533565b9050919050565b600081905092915050565b6000815461458e8161383d565b6145988186614576565b945060018216600081146145b357600181146145c8576145fb565b60ff19831686528115158202860193506145fb565b6145d185614168565b60005b838110156145f3578154818901526001820191506020810190506145d4565b838801955050505b50505092915050565b600061460f82612e66565b6146198185614576565b9350614629818560208601612e82565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061466b600583614576565b915061467682614635565b600582019050919050565b600061468d8285614581565b91506146998284614604565b91506146a48261465e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061470c602683612e71565b9150614717826146b0565b604082019050919050565b6000602082019050818103600083015261473b816146ff565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614778602083612e71565b915061478382614742565b602082019050919050565b600060208201905081810360008301526147a78161476b565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061480a602583612e71565b9150614815826147ae565b604082019050919050565b60006020820190508181036000830152614839816147fd565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061489c602483612e71565b91506148a782614840565b604082019050919050565b600060208201905081810360008301526148cb8161488f565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614908601983612e71565b9150614913826148d2565b602082019050919050565b60006020820190508181036000830152614937816148fb565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061499a603283612e71565b91506149a58261493e565b604082019050919050565b600060208201905081810360008301526149c98161498d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614a0a82612f18565b9150614a1583612f18565b925082614a2557614a246149d0565b5b828204905092915050565b6000614a3b82612f18565b9150614a4683612f18565b925082614a5657614a556149d0565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614a8882614a61565b614a928185614a6c565b9350614aa2818560208601612e82565b614aab81612eac565b840191505092915050565b6000608082019050614acb6000830187612fad565b614ad86020830186612fad565b614ae56040830185613043565b8181036060830152614af78184614a7d565b905095945050505050565b600081519050614b1181612dd7565b92915050565b600060208284031215614b2d57614b2c612da1565b5b6000614b3b84828501614b02565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614ba9602083612e71565b9150614bb482614b73565b602082019050919050565b60006020820190508181036000830152614bd881614b9c565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614c15601c83612e71565b9150614c2082614bdf565b602082019050919050565b60006020820190508181036000830152614c4481614c08565b905091905056fea2646970667358221220ee5e551bc1040144fb63d6ce05fa29c540ec83ca1f686420d1022a61c2b6f62e64736f6c634300081100330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006868747470733a2f2f636f72616c2d656c696769626c652d707461726d6967616e2d3634342e6d7970696e6174612e636c6f75642f697066732f516d5748446b646a613156426364343947637554757a6563315273584741656a7a565a57537a4d524c504e4b7a6b2f000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061020f5760003560e01c80636e05c9d311610118578063a22cb465116100a0578063b88d4fde1161006f578063b88d4fde14610790578063c87b56dd146107b9578063daa81cdd146107f6578063e985e9c514610821578063f2fde38b1461085e5761020f565b8063a22cb465146106e8578063aaad175614610711578063ae9aea6d1461073c578063b2dbf058146107675761020f565b806382c6752a116100e757806382c6752a14610625578063853828b6146106505780638da5cb5b1461066757806395d89b4114610692578063a035b1fe146106bd5761020f565b80636e05c9d31461056b57806370a08231146105a8578063715018a6146105e557806373111f40146105fc5761020f565b806332cb6b0c1161019b57806355f804b31161016a57806355f804b3146104865780636352211e146104af57806367ccec1e146104ec57806368c2415b146105175780636c0360eb146105405761020f565b806332cb6b0c146103b857806342842e0e146103e3578063438b63001461040c5780634f6ccce7146104495761020f565b806318160ddd116101e257806318160ddd146102e25780631cb83d371461030d57806323b872dd146103365780632d69044f1461035f5780632f745c591461037b5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612e03565b610887565b6040516102489190612e4b565b60405180910390f35b34801561025d57600080fd5b50610266610901565b6040516102739190612ef6565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190612f4e565b610993565b6040516102b09190612fbc565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190613003565b6109d9565b005b3480156102ee57600080fd5b506102f7610af0565b6040516103049190613052565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f91906131b5565b610afd565b005b34801561034257600080fd5b5061035d600480360381019061035891906131fe565b610b9a565b005b61037960048036038101906103749190613314565b610bfa565b005b34801561038757600080fd5b506103a2600480360381019061039d9190613003565b6111af565b6040516103af9190613052565b60405180910390f35b3480156103c457600080fd5b506103cd611254565b6040516103da9190613052565b60405180910390f35b3480156103ef57600080fd5b5061040a600480360381019061040591906131fe565b61125a565b005b34801561041857600080fd5b50610433600480360381019061042e9190613370565b61127a565b604051610440919061345b565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b9190612f4e565b611328565b60405161047d9190613052565b60405180910390f35b34801561049257600080fd5b506104ad60048036038101906104a89190613532565b611399565b005b3480156104bb57600080fd5b506104d660048036038101906104d19190612f4e565b6113b4565b6040516104e39190612fbc565b60405180910390f35b3480156104f857600080fd5b50610501611465565b60405161050e9190612e4b565b60405180910390f35b34801561052357600080fd5b5061053e600480360381019061053991906135a7565b611478565b005b34801561054c57600080fd5b506105556114db565b6040516105629190612ef6565b60405180910390f35b34801561057757600080fd5b50610592600480360381019061058d9190612f4e565b61156d565b60405161059f9190612fbc565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca9190613370565b6115aa565b6040516105dc9190613052565b60405180910390f35b3480156105f157600080fd5b506105fa611661565b005b34801561060857600080fd5b50610623600480360381019061061e91906131b5565b611675565b005b34801561063157600080fd5b5061063a61170c565b6040516106479190613052565b60405180910390f35b34801561065c57600080fd5b50610665611711565b005b34801561067357600080fd5b5061067c611759565b6040516106899190612fbc565b60405180910390f35b34801561069e57600080fd5b506106a7611783565b6040516106b49190612ef6565b60405180910390f35b3480156106c957600080fd5b506106d2611815565b6040516106df9190613052565b60405180910390f35b3480156106f457600080fd5b5061070f600480360381019061070a919061360e565b61181b565b005b34801561071d57600080fd5b50610726611831565b6040516107339190612e4b565b60405180910390f35b34801561074857600080fd5b50610751611844565b60405161075e9190613052565b60405180910390f35b34801561077357600080fd5b5061078e6004803603810190610789919061364e565b61184a565b005b34801561079c57600080fd5b506107b760048036038101906107b2919061374b565b61189a565b005b3480156107c557600080fd5b506107e060048036038101906107db9190612f4e565b6118fc565b6040516107ed9190612ef6565b60405180910390f35b34801561080257600080fd5b5061080b611978565b6040516108189190612e4b565b60405180910390f35b34801561082d57600080fd5b50610848600480360381019061084391906137ce565b61198b565b6040516108559190612e4b565b60405180910390f35b34801561086a57600080fd5b5061088560048036038101906108809190613370565b611a1f565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108fa57506108f982611aa2565b5b9050919050565b6060600080546109109061383d565b80601f016020809104026020016040519081016040528092919081815260200182805461093c9061383d565b80156109895780601f1061095e57610100808354040283529160200191610989565b820191906000526020600020905b81548152906001019060200180831161096c57829003601f168201915b5050505050905090565b600061099e82611b84565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109e4826113b4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4b906138e0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a73611bcf565b73ffffffffffffffffffffffffffffffffffffffff161480610aa25750610aa181610a9c611bcf565b61198b565b5b610ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad890613972565b60405180910390fd5b610aeb8383611bd7565b505050565b6000600880549050905090565b610b05611c90565b60005b8151811015610b9657600160106000848481518110610b2a57610b29613992565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610b8e906139f0565b915050610b08565b5050565b610bab610ba5611bcf565b82611d0e565b610bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be190613aaa565b60405180910390fd5b610bf5838383611da3565b505050565b6000610c04610af0565b90506000610c113361127a565b90506000849050600f60029054906101000a900460ff16610c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5e90613b16565b60405180910390fd5b6104578310610cab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca290613b82565b60405180910390fd5b600084511115610e4a5760005b8451811015610e2c573373ffffffffffffffffffffffffffffffffffffffff16601160006001888581518110610cf157610cf0613992565b5b6020026020010151610d039190613ba2565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7f90613c48565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16610dc3868381518110610db657610db5613992565b5b602002602001015161156d565b73ffffffffffffffffffffffffffffffffffffffff1614610e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1090613cda565b60405180910390fd5b8080610e24906139f0565b915050610cb8565b506000610e3885612009565b90508086610e469190613ba2565b9150505b6000811015610e8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8590613d46565b60405180910390fd5b600181106110cd57600f60009054906101000a900460ff1615610ef35760008114610eee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee590613dd8565b60405180910390fd5b611028565b600f60019054906101000a900460ff1615610f9c5760011515601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9290613e44565b60405180910390fd5b5b600e54811115610fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd890613ed6565b60405180910390fd5b600e5482511115611027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101e90613ed6565b60405180910390fd5b5b61045785846110379190613ef6565b1115611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f90613f76565b60405180910390fd5b80600d546110869190613f96565b3410156110c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bf90614024565b60405180910390fd5b6110f4565b61045785846110dc9190613ef6565b11156110f357826104576110f09190613ba2565b94505b5b60005b845181101561117f57336012600087848151811061111857611117613992565b5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080611177906139f0565b9150506110f7565b5060005b858110156111a7576111943361206b565b808061119f906139f0565b915050611183565b505050505050565b60006111ba836115aa565b82106111fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f2906140b6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61045781565b6112758383836040518060200160405280600081525061189a565b505050565b60606000611287836115aa565b905060008167ffffffffffffffff8111156112a5576112a4613072565b5b6040519080825280602002602001820160405280156112d35781602001602082028036833780820191505090505b50905060005b8281101561131d576112eb85826111af565b8282815181106112fe576112fd613992565b5b6020026020010181815250508080611315906139f0565b9150506112d9565b508092505050919050565b6000611332610af0565b8210611373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136a90614148565b60405180910390fd5b6008828154811061138757611386613992565b5b90600052602060002001549050919050565b6113a1611c90565b80600c90816113b09190614314565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361145c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145390614432565b60405180910390fd5b80915050919050565b600f60019054906101000a900460ff1681565b611480611c90565b83600f60006101000a81548160ff02191690831515021790555082600f60016101000a81548160ff02191690831515021790555081600f60026101000a81548160ff02191690831515021790555080600d8190555050505050565b6060600c80546114ea9061383d565b80601f01602080910402602001604051908101604052809291908181526020018280546115169061383d565b80156115635780601f1061153857610100808354040283529160200191611563565b820191906000526020600020905b81548152906001019060200180831161154657829003601f168201915b5050505050905090565b60006012600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361161a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611611906144c4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611669611c90565b6116736000612091565b565b61167d611c90565b60005b81518110156117085781818151811061169c5761169b613992565b5b60200260200101516011600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080611700906139f0565b915050611680565b5050565b606481565b611719611c90565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061175757600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546117929061383d565b80601f01602080910402602001604051908101604052809291908181526020018280546117be9061383d565b801561180b5780601f106117e05761010080835404028352916020019161180b565b820191906000526020600020905b8154815290600101906020018083116117ee57829003601f168201915b5050505050905090565b600d5481565b61182d611826611bcf565b8383612157565b5050565b600f60009054906101000a900460ff1681565b600e5481565b611852611c90565b60005b8151811015611895576118828383838151811061187557611874613992565b5b60200260200101516122c3565b808061188d906139f0565b915050611855565b505050565b6118ab6118a5611bcf565b83611d0e565b6118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e190613aaa565b60405180910390fd5b6118f6848484846122e1565b50505050565b60606119078261233d565b611946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193d90614556565b60405180910390fd5b600c611951836123a9565b604051602001611962929190614681565b6040516020818303038152906040529050919050565b600f60029054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a27611c90565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8d90614722565b60405180910390fd5b611a9f81612091565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b6d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b7d5750611b7c82612509565b5b9050919050565b611b8d8161233d565b611bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc390614432565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c4a836113b4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611c98611bcf565b73ffffffffffffffffffffffffffffffffffffffff16611cb6611759565b73ffffffffffffffffffffffffffffffffffffffff1614611d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d039061478e565b60405180910390fd5b565b600080611d1a836113b4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d5c5750611d5b818561198b565b5b80611d9a57508373ffffffffffffffffffffffffffffffffffffffff16611d8284610993565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611dc3826113b4565b73ffffffffffffffffffffffffffffffffffffffff1614611e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1090614820565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7f906148b2565b60405180910390fd5b611e93838383612573565b611e9e600082611bd7565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eee9190613ba2565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f459190613ef6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612004838383612685565b505050565b6000808251905060005b835181101561206157606484828151811061203157612030613992565b5b60200260200101511161204e5760018261204b9190613ef6565b91505b8080612059906139f0565b915050612013565b5080915050919050565b612075600b61268a565b6000612081600b6126a0565b905061208d82826122c3565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121bc9061491e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122b69190612e4b565b60405180910390a3505050565b6122dd8282604051806020016040528060008152506126ae565b5050565b6122ec848484611da3565b6122f884848484612709565b612337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232e906149b0565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600082036123f0576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612504565b600082905060005b6000821461242257808061240b906139f0565b915050600a8261241b91906149ff565b91506123f8565b60008167ffffffffffffffff81111561243e5761243d613072565b5b6040519080825280601f01601f1916602001820160405280156124705781602001600182028036833780820191505090505b5090505b600085146124fd576001826124899190613ba2565b9150600a856124989190614a30565b60306124a49190613ef6565b60f81b8183815181106124ba576124b9613992565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124f691906149ff565b9450612474565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61257e838383612890565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036125c0576125bb81612895565b6125ff565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125fe576125fd83826128de565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036126415761263c81612a4b565b612680565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461267f5761267e8282612b1c565b5b5b505050565b505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b6126b88383612b9b565b6126c56000848484612709565b612704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fb906149b0565b60405180910390fd5b505050565b600061272a8473ffffffffffffffffffffffffffffffffffffffff16612d74565b15612883578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612753611bcf565b8786866040518563ffffffff1660e01b81526004016127759493929190614ab6565b6020604051808303816000875af19250505080156127b157506040513d601f19601f820116820180604052508101906127ae9190614b17565b60015b612833573d80600081146127e1576040519150601f19603f3d011682016040523d82523d6000602084013e6127e6565b606091505b50600081510361282b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612822906149b0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612888565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016128eb846115aa565b6128f59190613ba2565b90506000600760008481526020019081526020016000205490508181146129da576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612a5f9190613ba2565b9050600060096000848152602001908152602001600020549050600060088381548110612a8f57612a8e613992565b5b906000526020600020015490508060088381548110612ab157612ab0613992565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612b0057612aff614b44565b5b6001900381819060005260206000200160009055905550505050565b6000612b27836115aa565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0190614bbf565b60405180910390fd5b612c138161233d565b15612c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4a90614c2b565b60405180910390fd5b612c5f60008383612573565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612caf9190613ef6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d7060008383612685565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612de081612dab565b8114612deb57600080fd5b50565b600081359050612dfd81612dd7565b92915050565b600060208284031215612e1957612e18612da1565b5b6000612e2784828501612dee565b91505092915050565b60008115159050919050565b612e4581612e30565b82525050565b6000602082019050612e606000830184612e3c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ea0578082015181840152602081019050612e85565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ec882612e66565b612ed28185612e71565b9350612ee2818560208601612e82565b612eeb81612eac565b840191505092915050565b60006020820190508181036000830152612f108184612ebd565b905092915050565b6000819050919050565b612f2b81612f18565b8114612f3657600080fd5b50565b600081359050612f4881612f22565b92915050565b600060208284031215612f6457612f63612da1565b5b6000612f7284828501612f39565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612fa682612f7b565b9050919050565b612fb681612f9b565b82525050565b6000602082019050612fd16000830184612fad565b92915050565b612fe081612f9b565b8114612feb57600080fd5b50565b600081359050612ffd81612fd7565b92915050565b6000806040838503121561301a57613019612da1565b5b600061302885828601612fee565b925050602061303985828601612f39565b9150509250929050565b61304c81612f18565b82525050565b60006020820190506130676000830184613043565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6130aa82612eac565b810181811067ffffffffffffffff821117156130c9576130c8613072565b5b80604052505050565b60006130dc612d97565b90506130e882826130a1565b919050565b600067ffffffffffffffff82111561310857613107613072565b5b602082029050602081019050919050565b600080fd5b600061313161312c846130ed565b6130d2565b9050808382526020820190506020840283018581111561315457613153613119565b5b835b8181101561317d57806131698882612fee565b845260208401935050602081019050613156565b5050509392505050565b600082601f83011261319c5761319b61306d565b5b81356131ac84826020860161311e565b91505092915050565b6000602082840312156131cb576131ca612da1565b5b600082013567ffffffffffffffff8111156131e9576131e8612da6565b5b6131f584828501613187565b91505092915050565b60008060006060848603121561321757613216612da1565b5b600061322586828701612fee565b935050602061323686828701612fee565b925050604061324786828701612f39565b9150509250925092565b600067ffffffffffffffff82111561326c5761326b613072565b5b602082029050602081019050919050565b600061329061328b84613251565b6130d2565b905080838252602082019050602084028301858111156132b3576132b2613119565b5b835b818110156132dc57806132c88882612f39565b8452602084019350506020810190506132b5565b5050509392505050565b600082601f8301126132fb576132fa61306d565b5b813561330b84826020860161327d565b91505092915050565b6000806040838503121561332b5761332a612da1565b5b600061333985828601612f39565b925050602083013567ffffffffffffffff81111561335a57613359612da6565b5b613366858286016132e6565b9150509250929050565b60006020828403121561338657613385612da1565b5b600061339484828501612fee565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6133d281612f18565b82525050565b60006133e483836133c9565b60208301905092915050565b6000602082019050919050565b60006134088261339d565b61341281856133a8565b935061341d836133b9565b8060005b8381101561344e57815161343588826133d8565b9750613440836133f0565b925050600181019050613421565b5085935050505092915050565b6000602082019050818103600083015261347581846133fd565b905092915050565b600080fd5b600067ffffffffffffffff82111561349d5761349c613072565b5b6134a682612eac565b9050602081019050919050565b82818337600083830152505050565b60006134d56134d084613482565b6130d2565b9050828152602081018484840111156134f1576134f061347d565b5b6134fc8482856134b3565b509392505050565b600082601f8301126135195761351861306d565b5b81356135298482602086016134c2565b91505092915050565b60006020828403121561354857613547612da1565b5b600082013567ffffffffffffffff81111561356657613565612da6565b5b61357284828501613504565b91505092915050565b61358481612e30565b811461358f57600080fd5b50565b6000813590506135a18161357b565b92915050565b600080600080608085870312156135c1576135c0612da1565b5b60006135cf87828801613592565b94505060206135e087828801613592565b93505060406135f187828801613592565b925050606061360287828801612f39565b91505092959194509250565b6000806040838503121561362557613624612da1565b5b600061363385828601612fee565b925050602061364485828601613592565b9150509250929050565b6000806040838503121561366557613664612da1565b5b600061367385828601612fee565b925050602083013567ffffffffffffffff81111561369457613693612da6565b5b6136a0858286016132e6565b9150509250929050565b600067ffffffffffffffff8211156136c5576136c4613072565b5b6136ce82612eac565b9050602081019050919050565b60006136ee6136e9846136aa565b6130d2565b90508281526020810184848401111561370a5761370961347d565b5b6137158482856134b3565b509392505050565b600082601f8301126137325761373161306d565b5b81356137428482602086016136db565b91505092915050565b6000806000806080858703121561376557613764612da1565b5b600061377387828801612fee565b945050602061378487828801612fee565b935050604061379587828801612f39565b925050606085013567ffffffffffffffff8111156137b6576137b5612da6565b5b6137c28782880161371d565b91505092959194509250565b600080604083850312156137e5576137e4612da1565b5b60006137f385828601612fee565b925050602061380485828601612fee565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061385557607f821691505b6020821081036138685761386761380e565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006138ca602183612e71565b91506138d58261386e565b604082019050919050565b600060208201905081810360008301526138f9816138bd565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b600061395c603e83612e71565b915061396782613900565b604082019050919050565b6000602082019050818103600083015261398b8161394f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139fb82612f18565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a2d57613a2c6139c1565b5b600182019050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000613a94602e83612e71565b9150613a9f82613a38565b604082019050919050565b60006020820190508181036000830152613ac381613a87565b9050919050565b7f73616c6573206973206e6f742061637469766500000000000000000000000000600082015250565b6000613b00601383612e71565b9150613b0b82613aca565b602082019050919050565b60006020820190508181036000830152613b2f81613af3565b9050919050565b7f416c6c20736f6c64206f75740000000000000000000000000000000000000000600082015250565b6000613b6c600c83612e71565b9150613b7782613b36565b602082019050919050565b60006020820190508181036000830152613b9b81613b5f565b9050919050565b6000613bad82612f18565b9150613bb883612f18565b9250828203905081811115613bd057613bcf6139c1565b5b92915050565b7f53656e646572206973206e6f74206120726967687466756c206f776e6572206f60008201527f6620746865207375626d6974746564204d696e74205061737365730000000000602082015250565b6000613c32603b83612e71565b9150613c3d82613bd6565b604082019050919050565b60006020820190508181036000830152613c6181613c25565b9050919050565b7f4174206c65617374206f6e65206f6620746865204d696e74205061737365732060008201527f68616420616c7265616479206265656e20757365640000000000000000000000602082015250565b6000613cc4603583612e71565b9150613ccf82613c68565b604082019050919050565b60006020820190508181036000830152613cf381613cb7565b9050919050565b7f70616964207175616e746974792063616e6e6f74206265206e65676174697665600082015250565b6000613d30602083612e71565b9150613d3b82613cfa565b602082019050919050565b60006020820190508181036000830152613d5f81613d23565b9050919050565b7f4e6f2070616964206d696e7420647572696e67204d696e74205061737320686f60008201527f7572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613dc2602283612e71565b9150613dcd82613d66565b604082019050919050565b60006020820190508181036000830152613df181613db5565b9050919050565b7f61646472657373206e6f7420696e207468652077686974656c69737400000000600082015250565b6000613e2e601c83612e71565b9150613e3982613df8565b602082019050919050565b60006020820190508181036000830152613e5d81613e21565b9050919050565b7f43616e6e6f74206d696e74206d6f7265207468616e206d6178696d756d20717560008201527f616e74697479207065722077616c6c6574000000000000000000000000000000602082015250565b6000613ec0603183612e71565b9150613ecb82613e64565b604082019050919050565b60006020820190508181036000830152613eef81613eb3565b9050919050565b6000613f0182612f18565b9150613f0c83612f18565b9250828201905080821115613f2457613f236139c1565b5b92915050565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b6000613f60601683612e71565b9150613f6b82613f2a565b602082019050919050565b60006020820190508181036000830152613f8f81613f53565b9050919050565b6000613fa182612f18565b9150613fac83612f18565b9250828202613fba81612f18565b91508282048414831517613fd157613fd06139c1565b5b5092915050565b7f65746865722073656e6420697320756e64657220707269636500000000000000600082015250565b600061400e601983612e71565b915061401982613fd8565b602082019050919050565b6000602082019050818103600083015261403d81614001565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006140a0602b83612e71565b91506140ab82614044565b604082019050919050565b600060208201905081810360008301526140cf81614093565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614132602c83612e71565b915061413d826140d6565b604082019050919050565b6000602082019050818103600083015261416181614125565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026141ca7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261418d565b6141d4868361418d565b95508019841693508086168417925050509392505050565b6000819050919050565b600061421161420c61420784612f18565b6141ec565b612f18565b9050919050565b6000819050919050565b61422b836141f6565b61423f61423782614218565b84845461419a565b825550505050565b600090565b614254614247565b61425f818484614222565b505050565b5b818110156142835761427860008261424c565b600181019050614265565b5050565b601f8211156142c85761429981614168565b6142a28461417d565b810160208510156142b1578190505b6142c56142bd8561417d565b830182614264565b50505b505050565b600082821c905092915050565b60006142eb600019846008026142cd565b1980831691505092915050565b600061430483836142da565b9150826002028217905092915050565b61431d82612e66565b67ffffffffffffffff81111561433657614335613072565b5b614340825461383d565b61434b828285614287565b600060209050601f83116001811461437e576000841561436c578287015190505b61437685826142f8565b8655506143de565b601f19841661438c86614168565b60005b828110156143b45784890151825560018201915060208501945060208101905061438f565b868310156143d157848901516143cd601f8916826142da565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061441c601883612e71565b9150614427826143e6565b602082019050919050565b6000602082019050818103600083015261444b8161440f565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006144ae602983612e71565b91506144b982614452565b604082019050919050565b600060208201905081810360008301526144dd816144a1565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614540602f83612e71565b915061454b826144e4565b604082019050919050565b6000602082019050818103600083015261456f81614533565b9050919050565b600081905092915050565b6000815461458e8161383d565b6145988186614576565b945060018216600081146145b357600181146145c8576145fb565b60ff19831686528115158202860193506145fb565b6145d185614168565b60005b838110156145f3578154818901526001820191506020810190506145d4565b838801955050505b50505092915050565b600061460f82612e66565b6146198185614576565b9350614629818560208601612e82565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061466b600583614576565b915061467682614635565b600582019050919050565b600061468d8285614581565b91506146998284614604565b91506146a48261465e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061470c602683612e71565b9150614717826146b0565b604082019050919050565b6000602082019050818103600083015261473b816146ff565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614778602083612e71565b915061478382614742565b602082019050919050565b600060208201905081810360008301526147a78161476b565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061480a602583612e71565b9150614815826147ae565b604082019050919050565b60006020820190508181036000830152614839816147fd565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061489c602483612e71565b91506148a782614840565b604082019050919050565b600060208201905081810360008301526148cb8161488f565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614908601983612e71565b9150614913826148d2565b602082019050919050565b60006020820190508181036000830152614937816148fb565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061499a603283612e71565b91506149a58261493e565b604082019050919050565b600060208201905081810360008301526149c98161498d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614a0a82612f18565b9150614a1583612f18565b925082614a2557614a246149d0565b5b828204905092915050565b6000614a3b82612f18565b9150614a4683612f18565b925082614a5657614a556149d0565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614a8882614a61565b614a928185614a6c565b9350614aa2818560208601612e82565b614aab81612eac565b840191505092915050565b6000608082019050614acb6000830187612fad565b614ad86020830186612fad565b614ae56040830185613043565b8181036060830152614af78184614a7d565b905095945050505050565b600081519050614b1181612dd7565b92915050565b600060208284031215614b2d57614b2c612da1565b5b6000614b3b84828501614b02565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614ba9602083612e71565b9150614bb482614b73565b602082019050919050565b60006020820190508181036000830152614bd881614b9c565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614c15601c83612e71565b9150614c2082614bdf565b602082019050919050565b60006020820190508181036000830152614c4481614c08565b905091905056fea2646970667358221220ee5e551bc1040144fb63d6ce05fa29c540ec83ca1f686420d1022a61c2b6f62e64736f6c63430008110033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006868747470733a2f2f636f72616c2d656c696769626c652d707461726d6967616e2d3634342e6d7970696e6174612e636c6f75642f697066732f516d5748446b646a613156426364343947637554757a6563315273584741656a7a565a57537a4d524c504e4b7a6b2f000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseUri (string): https://coral-eligible-ptarmigan-644.mypinata.cloud/ipfs/QmWHDkdja1VBcd49GcuTuzec1RsXGAejzVZWSzMRLPNKzk/

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000068
Arg [2] : 68747470733a2f2f636f72616c2d656c696769626c652d707461726d6967616e
Arg [3] : 2d3634342e6d7970696e6174612e636c6f75642f697066732f516d5748446b64
Arg [4] : 6a613156426364343947637554757a6563315273584741656a7a565a57537a4d
Arg [5] : 524c504e4b7a6b2f000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

55088:6322:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37329:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22987:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24500:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24017:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37969:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59733:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25200:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55865:2682;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37637:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55265:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25607:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60301:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38159:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60940:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22698:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55492:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61053:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60841:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60707:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22429:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45358:103;;;;;;;;;;;;;:::i;:::-;;59468:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55313:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61290:117;;;;;;;;;;;;;:::i;:::-;;44710:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23156:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55368:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24743:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55450:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55409:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59222:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25863:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59973:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55529:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24969:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45616:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37329:224;37431:4;37470:35;37455:50;;;:11;:50;;;;:90;;;;37509:36;37533:11;37509:23;:36::i;:::-;37455:90;37448:97;;37329:224;;;:::o;22987:100::-;23041:13;23074:5;23067:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22987:100;:::o;24500:171::-;24576:7;24596:23;24611:7;24596:14;:23::i;:::-;24639:15;:24;24655:7;24639:24;;;;;;;;;;;;;;;;;;;;;24632:31;;24500:171;;;:::o;24017:417::-;24098:13;24114:23;24129:7;24114:14;:23::i;:::-;24098:39;;24162:5;24156:11;;:2;:11;;;24148:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24256:5;24240:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24265:37;24282:5;24289:12;:10;:12::i;:::-;24265:16;:37::i;:::-;24240:62;24218:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;24405:21;24414:2;24418:7;24405:8;:21::i;:::-;24087:347;24017:417;;:::o;37969:113::-;38030:7;38057:10;:17;;;;38050:24;;37969:113;:::o;59733:192::-;44596:13;:11;:13::i;:::-;59819:9:::1;59814:104;59838:9;:16;59834:1;:20;59814:104;;;59902:4;59876:9;:23;59886:9;59896:1;59886:12;;;;;;;;:::i;:::-;;;;;;;;59876:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;59856:3;;;;;:::i;:::-;;;;59814:104;;;;59733:192:::0;:::o;25200:336::-;25395:41;25414:12;:10;:12::i;:::-;25428:7;25395:18;:41::i;:::-;25387:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;25500:28;25510:4;25516:2;25520:7;25500:9;:28::i;:::-;25200:336;;;:::o;55865:2682::-;55957:22;55982:13;:11;:13::i;:::-;55957:38;;56006:30;56039:25;56053:10;56039:13;:25::i;:::-;56006:58;;56075:24;56102:8;56075:35;;56129:13;;;;;;;;;;;56121:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;55302:4;56185:14;:27;56177:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;56270:1;56244:16;:23;:27;56240:711;;;56292:9;56288:453;56309:16;:23;56305:1;:27;56288:453;;;56510:10;56467:53;;:16;:39;56504:1;56484:16;56501:1;56484:19;;;;;;;;:::i;:::-;;;;;;;;:21;;;;:::i;:::-;56467:39;;;;;;;;;;;;;;;;;;;;;:53;;;56459:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;56665:1;56611:56;;:42;56633:16;56650:1;56633:19;;;;;;;;:::i;:::-;;;;;;;;56611:21;:42::i;:::-;:56;;;56603:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;56334:3;;;;;:::i;:::-;;;;56288:453;;;;56810:24;56837:41;56861:16;56837:23;:41::i;:::-;56810:68;;56923:16;56912:8;:27;;;;:::i;:::-;56893:46;;56273:678;56240:711;56989:1;56969:16;:21;;56961:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;57084:1;57064:16;:21;57060:1189;;57106:16;;;;;;;;;;;57102:655;;;57283:1;57263:16;:21;57255:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57102:655;;;57381:10;;;;;;;;;;;57377:129;;;57449:4;57424:29;;:9;:21;57434:10;57424:21;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;57416:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;57377:129;57552:15;;57532:16;:35;;57524:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;57672:15;;57648:13;:20;:39;;57640:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;57102:655;55302:4;57796:8;57779:14;:25;;;;:::i;:::-;:39;;57771:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;57889:16;57881:5;;:24;;;;:::i;:::-;57868:9;:37;;57860:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;57060:1189;;;55302:4;58142:8;58125:14;:25;;;;:::i;:::-;:38;58121:117;;;58208:14;55302:4;58195:27;;;;:::i;:::-;58184:38;;58121:117;57060:1189;58313:9;58309:125;58330:16;:23;58326:1;:27;58309:125;;;58412:10;58375:13;:34;58389:16;58406:1;58389:19;;;;;;;;:::i;:::-;;;;;;;;58375:34;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;58355:3;;;;;:::i;:::-;;;;58309:125;;;;58459:9;58454:86;58478:8;58474:1;:12;58454:86;;;58508:20;58517:10;58508:8;:20::i;:::-;58488:3;;;;;:::i;:::-;;;;58454:86;;;;55946:2601;;;55865:2682;;:::o;37637:256::-;37734:7;37770:23;37787:5;37770:16;:23::i;:::-;37762:5;:31;37754:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37859:12;:19;37872:5;37859:19;;;;;;;;;;;;;;;:26;37879:5;37859:26;;;;;;;;;;;;37852:33;;37637:256;;;;:::o;55265:41::-;55302:4;55265:41;:::o;25607:185::-;25745:39;25762:4;25768:2;25772:7;25745:39;;;;;;;;;;;;:16;:39::i;:::-;25607:185;;;:::o;60301:342::-;60360:16;60389:18;60410:17;60420:6;60410:9;:17::i;:::-;60389:38;;60440:25;60482:10;60468:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60440:53;;60508:9;60504:106;60523:10;60519:1;:14;60504:106;;;60568:30;60588:6;60596:1;60568:19;:30::i;:::-;60554:8;60563:1;60554:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;60535:3;;;;;:::i;:::-;;;;60504:106;;;;60627:8;60620:15;;;;60301:342;;;:::o;38159:233::-;38234:7;38270:30;:28;:30::i;:::-;38262:5;:38;38254:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38367:10;38378:5;38367:17;;;;;;;;:::i;:::-;;;;;;;;;;38360:24;;38159:233;;;:::o;60940:105::-;44596:13;:11;:13::i;:::-;61027:10:::1;61016:8;:21;;;;;;:::i;:::-;;60940:105:::0;:::o;22698:222::-;22770:7;22790:13;22806:7;:16;22814:7;22806:16;;;;;;;;;;;;;;;;;;;;;22790:32;;22858:1;22841:19;;:5;:19;;;22833:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;22907:5;22900:12;;;22698:222;;;:::o;55492:30::-;;;;;;;;;;;;;:::o;61053:225::-;44596:13;:11;:13::i;:::-;61177:8:::1;61158:16;;:27;;;;;;;;;;;;;;;;;;61209:2;61196:10;;:15;;;;;;;;;;;;;;;;;;61238:5;61222:13;;:21;;;;;;;;;;;;;;;;;;61262:8;61254:5;:16;;;;61053:225:::0;;;;:::o;60841:91::-;60883:13;60916:8;60909:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60841:91;:::o;60707:126::-;60776:7;60803:13;:22;60817:7;60803:22;;;;;;;;;;;;;;;;;;;;;60796:29;;60707:126;;;:::o;22429:207::-;22501:7;22546:1;22529:19;;:5;:19;;;22521:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22612:9;:16;22622:5;22612:16;;;;;;;;;;;;;;;;22605:23;;22429:207;;;:::o;45358:103::-;44596:13;:11;:13::i;:::-;45423:30:::1;45450:1;45423:18;:30::i;:::-;45358:103::o:0;59468:206::-;44596:13;:11;:13::i;:::-;59564:9:::1;59559:108;59583:9;:16;59579:1;:20;59559:108;;;59643:9;59653:1;59643:12;;;;;;;;:::i;:::-;;;;;;;;59621:16;:19;59638:1;59621:19;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;59601:3;;;;;:::i;:::-;;;;59559:108;;;;59468:206:::0;:::o;55313:48::-;55358:3;55313:48;:::o;61290:117::-;44596:13;:11;:13::i;:::-;61359:10:::1;61351:24;;:47;61376:21;61351:47;;;;;;;;;;;;;;;;;;;;;;;61343:56;;;::::0;::::1;;61290:117::o:0;44710:87::-;44756:7;44783:6;;;;;;;;;;;44776:13;;44710:87;:::o;23156:104::-;23212:13;23245:7;23238:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23156:104;:::o;55368:34::-;;;;:::o;24743:155::-;24838:52;24857:12;:10;:12::i;:::-;24871:8;24881;24838:18;:52::i;:::-;24743:155;;:::o;55450:35::-;;;;;;;;;;;;;:::o;55409:34::-;;;;:::o;59222:195::-;44596:13;:11;:13::i;:::-;59318:9:::1;59314:96;59335:8;:15;59331:1;:19;59314:96;;;59372:26;59382:2;59386:8;59395:1;59386:11;;;;;;;;:::i;:::-;;;;;;;;59372:9;:26::i;:::-;59352:3;;;;;:::i;:::-;;;;59314:96;;;;59222:195:::0;;:::o;25863:323::-;26037:41;26056:12;:10;:12::i;:::-;26070:7;26037:18;:41::i;:::-;26029:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;26140:38;26154:4;26160:2;26164:7;26173:4;26140:13;:38::i;:::-;25863:323;;;;:::o;59973:274::-;60047:13;60081:17;60089:8;60081:7;:17::i;:::-;60073:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;60192:8;60202:26;60219:8;60202:16;:26::i;:::-;60175:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60161:78;;59973:274;;;:::o;55529:32::-;;;;;;;;;;;;;:::o;24969:164::-;25066:4;25090:18;:25;25109:5;25090:25;;;;;;;;;;;;;;;:35;25116:8;25090:35;;;;;;;;;;;;;;;;;;;;;;;;;25083:42;;24969:164;;;;:::o;45616:201::-;44596:13;:11;:13::i;:::-;45725:1:::1;45705:22;;:8;:22;;::::0;45697:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;45781:28;45800:8;45781:18;:28::i;:::-;45616:201:::0;:::o;22060:305::-;22162:4;22214:25;22199:40;;;:11;:40;;;;:105;;;;22271:33;22256:48;;;:11;:48;;;;22199:105;:158;;;;22321:36;22345:11;22321:23;:36::i;:::-;22199:158;22179:178;;22060:305;;;:::o;32475:135::-;32557:16;32565:7;32557;:16::i;:::-;32549:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;32475:135;:::o;16917:98::-;16970:7;16997:10;16990:17;;16917:98;:::o;31754:174::-;31856:2;31829:15;:24;31845:7;31829:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31912:7;31908:2;31874:46;;31883:23;31898:7;31883:14;:23::i;:::-;31874:46;;;;;;;;;;;;31754:174;;:::o;44875:132::-;44950:12;:10;:12::i;:::-;44939:23;;:7;:5;:7::i;:::-;:23;;;44931:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44875:132::o;27987:264::-;28080:4;28097:13;28113:23;28128:7;28113:14;:23::i;:::-;28097:39;;28166:5;28155:16;;:7;:16;;;:52;;;;28175:32;28192:5;28199:7;28175:16;:32::i;:::-;28155:52;:87;;;;28235:7;28211:31;;:20;28223:7;28211:11;:20::i;:::-;:31;;;28155:87;28147:96;;;27987:264;;;;:::o;31010:625::-;31169:4;31142:31;;:23;31157:7;31142:14;:23::i;:::-;:31;;;31134:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31248:1;31234:16;;:2;:16;;;31226:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31304:39;31325:4;31331:2;31335:7;31304:20;:39::i;:::-;31408:29;31425:1;31429:7;31408:8;:29::i;:::-;31469:1;31450:9;:15;31460:4;31450:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31498:1;31481:9;:13;31491:2;31481:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31529:2;31510:7;:16;31518:7;31510:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31568:7;31564:2;31549:27;;31558:4;31549:27;;;;;;;;;;;;31589:38;31609:4;31615:2;31619:7;31589:19;:38::i;:::-;31010:625;;;:::o;58735:442::-;58826:7;58846:24;58873:16;:23;58846:50;;58912:9;58907:229;58929:16;:23;58925:1;:27;58907:229;;;55358:3;59026:16;59043:1;59026:19;;;;;;;;:::i;:::-;;;;;;;;:41;59022:103;;59108:1;59088:21;;;;;:::i;:::-;;;59022:103;58954:3;;;;;:::i;:::-;;;;58907:229;;;;59153:16;59146:23;;;58735:442;;;:::o;58555:172::-;58605:27;:15;:25;:27::i;:::-;58643:15;58661:25;:15;:23;:25::i;:::-;58643:43;;58697:22;58707:2;58711:7;58697:9;:22::i;:::-;58594:133;58555:172;:::o;45977:191::-;46051:16;46070:6;;;;;;;;;;;46051:25;;46096:8;46087:6;;:17;;;;;;;;;;;;;;;;;;46151:8;46120:40;;46141:8;46120:40;;;;;;;;;;;;46040:128;45977:191;:::o;32071:315::-;32226:8;32217:17;;:5;:17;;;32209:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32313:8;32275:18;:25;32294:5;32275:25;;;;;;;;;;;;;;;:35;32301:8;32275:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32359:8;32337:41;;32352:5;32337:41;;;32369:8;32337:41;;;;;;:::i;:::-;;;;;;;;32071:315;;;:::o;28593:110::-;28669:26;28679:2;28683:7;28669:26;;;;;;;;;;;;:9;:26::i;:::-;28593:110;;:::o;27067:313::-;27223:28;27233:4;27239:2;27243:7;27223:9;:28::i;:::-;27270:47;27293:4;27299:2;27303:7;27312:4;27270:22;:47::i;:::-;27262:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;27067:313;;;;:::o;27693:127::-;27758:4;27810:1;27782:30;;:7;:16;27790:7;27782:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27775:37;;27693:127;;;:::o;17561:723::-;17617:13;17847:1;17838:5;:10;17834:53;;17865:10;;;;;;;;;;;;;;;;;;;;;17834:53;17897:12;17912:5;17897:20;;17928:14;17953:78;17968:1;17960:4;:9;17953:78;;17986:8;;;;;:::i;:::-;;;;18017:2;18009:10;;;;;:::i;:::-;;;17953:78;;;18041:19;18073:6;18063:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18041:39;;18091:154;18107:1;18098:5;:10;18091:154;;18135:1;18125:11;;;;;:::i;:::-;;;18202:2;18194:5;:10;;;;:::i;:::-;18181:2;:24;;;;:::i;:::-;18168:39;;18151:6;18158;18151:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18231:2;18222:11;;;;;:::i;:::-;;;18091:154;;;18269:6;18255:21;;;;;17561:723;;;;:::o;20491:157::-;20576:4;20615:25;20600:40;;;:11;:40;;;;20593:47;;20491:157;;;:::o;39005:589::-;39149:45;39176:4;39182:2;39186:7;39149:26;:45::i;:::-;39227:1;39211:18;;:4;:18;;;39207:187;;39246:40;39278:7;39246:31;:40::i;:::-;39207:187;;;39316:2;39308:10;;:4;:10;;;39304:90;;39335:47;39368:4;39374:7;39335:32;:47::i;:::-;39304:90;39207:187;39422:1;39408:16;;:2;:16;;;39404:183;;39441:45;39478:7;39441:36;:45::i;:::-;39404:183;;;39514:4;39508:10;;:2;:10;;;39504:83;;39535:40;39563:2;39567:7;39535:27;:40::i;:::-;39504:83;39404:183;39005:589;;;:::o;35110:125::-;;;;:::o;47169:127::-;47276:1;47258:7;:14;;;:19;;;;;;;;;;;47169:127;:::o;47047:114::-;47112:7;47139;:14;;;47132:21;;47047:114;;;:::o;28930:319::-;29059:18;29065:2;29069:7;29059:5;:18::i;:::-;29110:53;29141:1;29145:2;29149:7;29158:4;29110:22;:53::i;:::-;29088:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;28930:319;;;:::o;33174:853::-;33328:4;33349:15;:2;:13;;;:15::i;:::-;33345:675;;;33401:2;33385:36;;;33422:12;:10;:12::i;:::-;33436:4;33442:7;33451:4;33385:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33381:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33643:1;33626:6;:13;:18;33622:328;;33669:60;;;;;;;;;;:::i;:::-;;;;;;;;33622:328;33900:6;33894:13;33885:6;33881:2;33877:15;33870:38;33381:584;33517:41;;;33507:51;;;:6;:51;;;;33500:58;;;;;33345:675;34004:4;33997:11;;33174:853;;;;;;;:::o;34599:126::-;;;;:::o;40317:164::-;40421:10;:17;;;;40394:15;:24;40410:7;40394:24;;;;;;;;;;;:44;;;;40449:10;40465:7;40449:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40317:164;:::o;41108:988::-;41374:22;41424:1;41399:22;41416:4;41399:16;:22::i;:::-;:26;;;;:::i;:::-;41374:51;;41436:18;41457:17;:26;41475:7;41457:26;;;;;;;;;;;;41436:47;;41604:14;41590:10;:28;41586:328;;41635:19;41657:12;:18;41670:4;41657:18;;;;;;;;;;;;;;;:34;41676:14;41657:34;;;;;;;;;;;;41635:56;;41741:11;41708:12;:18;41721:4;41708:18;;;;;;;;;;;;;;;:30;41727:10;41708:30;;;;;;;;;;;:44;;;;41858:10;41825:17;:30;41843:11;41825:30;;;;;;;;;;;:43;;;;41620:294;41586:328;42010:17;:26;42028:7;42010:26;;;;;;;;;;;42003:33;;;42054:12;:18;42067:4;42054:18;;;;;;;;;;;;;;;:34;42073:14;42054:34;;;;;;;;;;;42047:41;;;41189:907;;41108:988;;:::o;42391:1079::-;42644:22;42689:1;42669:10;:17;;;;:21;;;;:::i;:::-;42644:46;;42701:18;42722:15;:24;42738:7;42722:24;;;;;;;;;;;;42701:45;;43073:19;43095:10;43106:14;43095:26;;;;;;;;:::i;:::-;;;;;;;;;;43073:48;;43159:11;43134:10;43145;43134:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;43270:10;43239:15;:28;43255:11;43239:28;;;;;;;;;;;:41;;;;43411:15;:24;43427:7;43411:24;;;;;;;;;;;43404:31;;;43446:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42462:1008;;;42391:1079;:::o;39895:221::-;39980:14;39997:20;40014:2;39997:16;:20::i;:::-;39980:37;;40055:7;40028:12;:16;40041:2;40028:16;;;;;;;;;;;;;;;:24;40045:6;40028:24;;;;;;;;;;;:34;;;;40102:6;40073:17;:26;40091:7;40073:26;;;;;;;;;;;:35;;;;39969:147;39895:221;;:::o;29585:439::-;29679:1;29665:16;;:2;:16;;;29657:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29738:16;29746:7;29738;:16::i;:::-;29737:17;29729:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29800:45;29829:1;29833:2;29837:7;29800:20;:45::i;:::-;29875:1;29858:9;:13;29868:2;29858:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29906:2;29887:7;:16;29895:7;29887:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29951:7;29947:2;29926:33;;29943:1;29926:33;;;;;;;;;;;;29972:44;30000:1;30004:2;30008:7;29972:19;:44::i;:::-;29585:439;;:::o;8918:326::-;8978:4;9235:1;9213:7;:19;;;:23;9206:30;;8918:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:117::-;5351:1;5348;5341:12;5365:180;5413:77;5410:1;5403:88;5510:4;5507:1;5500:15;5534:4;5531:1;5524:15;5551:281;5634:27;5656:4;5634:27;:::i;:::-;5626:6;5622:40;5764:6;5752:10;5749:22;5728:18;5716:10;5713:34;5710:62;5707:88;;;5775:18;;:::i;:::-;5707:88;5815:10;5811:2;5804:22;5594:238;5551:281;;:::o;5838:129::-;5872:6;5899:20;;:::i;:::-;5889:30;;5928:33;5956:4;5948:6;5928:33;:::i;:::-;5838:129;;;:::o;5973:311::-;6050:4;6140:18;6132:6;6129:30;6126:56;;;6162:18;;:::i;:::-;6126:56;6212:4;6204:6;6200:17;6192:25;;6272:4;6266;6262:15;6254:23;;5973:311;;;:::o;6290:117::-;6399:1;6396;6389:12;6430:710;6526:5;6551:81;6567:64;6624:6;6567:64;:::i;:::-;6551:81;:::i;:::-;6542:90;;6652:5;6681:6;6674:5;6667:21;6715:4;6708:5;6704:16;6697:23;;6768:4;6760:6;6756:17;6748:6;6744:30;6797:3;6789:6;6786:15;6783:122;;;6816:79;;:::i;:::-;6783:122;6931:6;6914:220;6948:6;6943:3;6940:15;6914:220;;;7023:3;7052:37;7085:3;7073:10;7052:37;:::i;:::-;7047:3;7040:50;7119:4;7114:3;7110:14;7103:21;;6990:144;6974:4;6969:3;6965:14;6958:21;;6914:220;;;6918:21;6532:608;;6430:710;;;;;:::o;7163:370::-;7234:5;7283:3;7276:4;7268:6;7264:17;7260:27;7250:122;;7291:79;;:::i;:::-;7250:122;7408:6;7395:20;7433:94;7523:3;7515:6;7508:4;7500:6;7496:17;7433:94;:::i;:::-;7424:103;;7240:293;7163:370;;;;:::o;7539:539::-;7623:6;7672:2;7660:9;7651:7;7647:23;7643:32;7640:119;;;7678:79;;:::i;:::-;7640:119;7826:1;7815:9;7811:17;7798:31;7856:18;7848:6;7845:30;7842:117;;;7878:79;;:::i;:::-;7842:117;7983:78;8053:7;8044:6;8033:9;8029:22;7983:78;:::i;:::-;7973:88;;7769:302;7539:539;;;;:::o;8084:619::-;8161:6;8169;8177;8226:2;8214:9;8205:7;8201:23;8197:32;8194:119;;;8232:79;;:::i;:::-;8194:119;8352:1;8377:53;8422:7;8413:6;8402:9;8398:22;8377:53;:::i;:::-;8367:63;;8323:117;8479:2;8505:53;8550:7;8541:6;8530:9;8526:22;8505:53;:::i;:::-;8495:63;;8450:118;8607:2;8633:53;8678:7;8669:6;8658:9;8654:22;8633:53;:::i;:::-;8623:63;;8578:118;8084:619;;;;;:::o;8709:311::-;8786:4;8876:18;8868:6;8865:30;8862:56;;;8898:18;;:::i;:::-;8862:56;8948:4;8940:6;8936:17;8928:25;;9008:4;9002;8998:15;8990:23;;8709:311;;;:::o;9043:710::-;9139:5;9164:81;9180:64;9237:6;9180:64;:::i;:::-;9164:81;:::i;:::-;9155:90;;9265:5;9294:6;9287:5;9280:21;9328:4;9321:5;9317:16;9310:23;;9381:4;9373:6;9369:17;9361:6;9357:30;9410:3;9402:6;9399:15;9396:122;;;9429:79;;:::i;:::-;9396:122;9544:6;9527:220;9561:6;9556:3;9553:15;9527:220;;;9636:3;9665:37;9698:3;9686:10;9665:37;:::i;:::-;9660:3;9653:50;9732:4;9727:3;9723:14;9716:21;;9603:144;9587:4;9582:3;9578:14;9571:21;;9527:220;;;9531:21;9145:608;;9043:710;;;;;:::o;9776:370::-;9847:5;9896:3;9889:4;9881:6;9877:17;9873:27;9863:122;;9904:79;;:::i;:::-;9863:122;10021:6;10008:20;10046:94;10136:3;10128:6;10121:4;10113:6;10109:17;10046:94;:::i;:::-;10037:103;;9853:293;9776:370;;;;:::o;10152:684::-;10245:6;10253;10302:2;10290:9;10281:7;10277:23;10273:32;10270:119;;;10308:79;;:::i;:::-;10270:119;10428:1;10453:53;10498:7;10489:6;10478:9;10474:22;10453:53;:::i;:::-;10443:63;;10399:117;10583:2;10572:9;10568:18;10555:32;10614:18;10606:6;10603:30;10600:117;;;10636:79;;:::i;:::-;10600:117;10741:78;10811:7;10802:6;10791:9;10787:22;10741:78;:::i;:::-;10731:88;;10526:303;10152:684;;;;;:::o;10842:329::-;10901:6;10950:2;10938:9;10929:7;10925:23;10921:32;10918:119;;;10956:79;;:::i;:::-;10918:119;11076:1;11101:53;11146:7;11137:6;11126:9;11122:22;11101:53;:::i;:::-;11091:63;;11047:117;10842:329;;;;:::o;11177:114::-;11244:6;11278:5;11272:12;11262:22;;11177:114;;;:::o;11297:184::-;11396:11;11430:6;11425:3;11418:19;11470:4;11465:3;11461:14;11446:29;;11297:184;;;;:::o;11487:132::-;11554:4;11577:3;11569:11;;11607:4;11602:3;11598:14;11590:22;;11487:132;;;:::o;11625:108::-;11702:24;11720:5;11702:24;:::i;:::-;11697:3;11690:37;11625:108;;:::o;11739:179::-;11808:10;11829:46;11871:3;11863:6;11829:46;:::i;:::-;11907:4;11902:3;11898:14;11884:28;;11739:179;;;;:::o;11924:113::-;11994:4;12026;12021:3;12017:14;12009:22;;11924:113;;;:::o;12073:732::-;12192:3;12221:54;12269:5;12221:54;:::i;:::-;12291:86;12370:6;12365:3;12291:86;:::i;:::-;12284:93;;12401:56;12451:5;12401:56;:::i;:::-;12480:7;12511:1;12496:284;12521:6;12518:1;12515:13;12496:284;;;12597:6;12591:13;12624:63;12683:3;12668:13;12624:63;:::i;:::-;12617:70;;12710:60;12763:6;12710:60;:::i;:::-;12700:70;;12556:224;12543:1;12540;12536:9;12531:14;;12496:284;;;12500:14;12796:3;12789:10;;12197:608;;;12073:732;;;;:::o;12811:373::-;12954:4;12992:2;12981:9;12977:18;12969:26;;13041:9;13035:4;13031:20;13027:1;13016:9;13012:17;13005:47;13069:108;13172:4;13163:6;13069:108;:::i;:::-;13061:116;;12811:373;;;;:::o;13190:117::-;13299:1;13296;13289:12;13313:308;13375:4;13465:18;13457:6;13454:30;13451:56;;;13487:18;;:::i;:::-;13451:56;13525:29;13547:6;13525:29;:::i;:::-;13517:37;;13609:4;13603;13599:15;13591:23;;13313:308;;;:::o;13627:146::-;13724:6;13719:3;13714;13701:30;13765:1;13756:6;13751:3;13747:16;13740:27;13627:146;;;:::o;13779:425::-;13857:5;13882:66;13898:49;13940:6;13898:49;:::i;:::-;13882:66;:::i;:::-;13873:75;;13971:6;13964:5;13957:21;14009:4;14002:5;13998:16;14047:3;14038:6;14033:3;14029:16;14026:25;14023:112;;;14054:79;;:::i;:::-;14023:112;14144:54;14191:6;14186:3;14181;14144:54;:::i;:::-;13863:341;13779:425;;;;;:::o;14224:340::-;14280:5;14329:3;14322:4;14314:6;14310:17;14306:27;14296:122;;14337:79;;:::i;:::-;14296:122;14454:6;14441:20;14479:79;14554:3;14546:6;14539:4;14531:6;14527:17;14479:79;:::i;:::-;14470:88;;14286:278;14224:340;;;;:::o;14570:509::-;14639:6;14688:2;14676:9;14667:7;14663:23;14659:32;14656:119;;;14694:79;;:::i;:::-;14656:119;14842:1;14831:9;14827:17;14814:31;14872:18;14864:6;14861:30;14858:117;;;14894:79;;:::i;:::-;14858:117;14999:63;15054:7;15045:6;15034:9;15030:22;14999:63;:::i;:::-;14989:73;;14785:287;14570:509;;;;:::o;15085:116::-;15155:21;15170:5;15155:21;:::i;:::-;15148:5;15145:32;15135:60;;15191:1;15188;15181:12;15135:60;15085:116;:::o;15207:133::-;15250:5;15288:6;15275:20;15266:29;;15304:30;15328:5;15304:30;:::i;:::-;15207:133;;;;:::o;15346:747::-;15423:6;15431;15439;15447;15496:3;15484:9;15475:7;15471:23;15467:33;15464:120;;;15503:79;;:::i;:::-;15464:120;15623:1;15648:50;15690:7;15681:6;15670:9;15666:22;15648:50;:::i;:::-;15638:60;;15594:114;15747:2;15773:50;15815:7;15806:6;15795:9;15791:22;15773:50;:::i;:::-;15763:60;;15718:115;15872:2;15898:50;15940:7;15931:6;15920:9;15916:22;15898:50;:::i;:::-;15888:60;;15843:115;15997:2;16023:53;16068:7;16059:6;16048:9;16044:22;16023:53;:::i;:::-;16013:63;;15968:118;15346:747;;;;;;;:::o;16099:468::-;16164:6;16172;16221:2;16209:9;16200:7;16196:23;16192:32;16189:119;;;16227:79;;:::i;:::-;16189:119;16347:1;16372:53;16417:7;16408:6;16397:9;16393:22;16372:53;:::i;:::-;16362:63;;16318:117;16474:2;16500:50;16542:7;16533:6;16522:9;16518:22;16500:50;:::i;:::-;16490:60;;16445:115;16099:468;;;;;:::o;16573:684::-;16666:6;16674;16723:2;16711:9;16702:7;16698:23;16694:32;16691:119;;;16729:79;;:::i;:::-;16691:119;16849:1;16874:53;16919:7;16910:6;16899:9;16895:22;16874:53;:::i;:::-;16864:63;;16820:117;17004:2;16993:9;16989:18;16976:32;17035:18;17027:6;17024:30;17021:117;;;17057:79;;:::i;:::-;17021:117;17162:78;17232:7;17223:6;17212:9;17208:22;17162:78;:::i;:::-;17152:88;;16947:303;16573:684;;;;;:::o;17263:307::-;17324:4;17414:18;17406:6;17403:30;17400:56;;;17436:18;;:::i;:::-;17400:56;17474:29;17496:6;17474:29;:::i;:::-;17466:37;;17558:4;17552;17548:15;17540:23;;17263:307;;;:::o;17576:423::-;17653:5;17678:65;17694:48;17735:6;17694:48;:::i;:::-;17678:65;:::i;:::-;17669:74;;17766:6;17759:5;17752:21;17804:4;17797:5;17793:16;17842:3;17833:6;17828:3;17824:16;17821:25;17818:112;;;17849:79;;:::i;:::-;17818:112;17939:54;17986:6;17981:3;17976;17939:54;:::i;:::-;17659:340;17576:423;;;;;:::o;18018:338::-;18073:5;18122:3;18115:4;18107:6;18103:17;18099:27;18089:122;;18130:79;;:::i;:::-;18089:122;18247:6;18234:20;18272:78;18346:3;18338:6;18331:4;18323:6;18319:17;18272:78;:::i;:::-;18263:87;;18079:277;18018:338;;;;:::o;18362:943::-;18457:6;18465;18473;18481;18530:3;18518:9;18509:7;18505:23;18501:33;18498:120;;;18537:79;;:::i;:::-;18498:120;18657:1;18682:53;18727:7;18718:6;18707:9;18703:22;18682:53;:::i;:::-;18672:63;;18628:117;18784:2;18810:53;18855:7;18846:6;18835:9;18831:22;18810:53;:::i;:::-;18800:63;;18755:118;18912:2;18938:53;18983:7;18974:6;18963:9;18959:22;18938:53;:::i;:::-;18928:63;;18883:118;19068:2;19057:9;19053:18;19040:32;19099:18;19091:6;19088:30;19085:117;;;19121:79;;:::i;:::-;19085:117;19226:62;19280:7;19271:6;19260:9;19256:22;19226:62;:::i;:::-;19216:72;;19011:287;18362:943;;;;;;;:::o;19311:474::-;19379:6;19387;19436:2;19424:9;19415:7;19411:23;19407:32;19404:119;;;19442:79;;:::i;:::-;19404:119;19562:1;19587:53;19632:7;19623:6;19612:9;19608:22;19587:53;:::i;:::-;19577:63;;19533:117;19689:2;19715:53;19760:7;19751:6;19740:9;19736:22;19715:53;:::i;:::-;19705:63;;19660:118;19311:474;;;;;:::o;19791:180::-;19839:77;19836:1;19829:88;19936:4;19933:1;19926:15;19960:4;19957:1;19950:15;19977:320;20021:6;20058:1;20052:4;20048:12;20038:22;;20105:1;20099:4;20095:12;20126:18;20116:81;;20182:4;20174:6;20170:17;20160:27;;20116:81;20244:2;20236:6;20233:14;20213:18;20210:38;20207:84;;20263:18;;:::i;:::-;20207:84;20028:269;19977:320;;;:::o;20303:220::-;20443:34;20439:1;20431:6;20427:14;20420:58;20512:3;20507:2;20499:6;20495:15;20488:28;20303:220;:::o;20529:366::-;20671:3;20692:67;20756:2;20751:3;20692:67;:::i;:::-;20685:74;;20768:93;20857:3;20768:93;:::i;:::-;20886:2;20881:3;20877:12;20870:19;;20529:366;;;:::o;20901:419::-;21067:4;21105:2;21094:9;21090:18;21082:26;;21154:9;21148:4;21144:20;21140:1;21129:9;21125:17;21118:47;21182:131;21308:4;21182:131;:::i;:::-;21174:139;;20901:419;;;:::o;21326:249::-;21466:34;21462:1;21454:6;21450:14;21443:58;21535:32;21530:2;21522:6;21518:15;21511:57;21326:249;:::o;21581:366::-;21723:3;21744:67;21808:2;21803:3;21744:67;:::i;:::-;21737:74;;21820:93;21909:3;21820:93;:::i;:::-;21938:2;21933:3;21929:12;21922:19;;21581:366;;;:::o;21953:419::-;22119:4;22157:2;22146:9;22142:18;22134:26;;22206:9;22200:4;22196:20;22192:1;22181:9;22177:17;22170:47;22234:131;22360:4;22234:131;:::i;:::-;22226:139;;21953:419;;;:::o;22378:180::-;22426:77;22423:1;22416:88;22523:4;22520:1;22513:15;22547:4;22544:1;22537:15;22564:180;22612:77;22609:1;22602:88;22709:4;22706:1;22699:15;22733:4;22730:1;22723:15;22750:233;22789:3;22812:24;22830:5;22812:24;:::i;:::-;22803:33;;22858:66;22851:5;22848:77;22845:103;;22928:18;;:::i;:::-;22845:103;22975:1;22968:5;22964:13;22957:20;;22750:233;;;:::o;22989:::-;23129:34;23125:1;23117:6;23113:14;23106:58;23198:16;23193:2;23185:6;23181:15;23174:41;22989:233;:::o;23228:366::-;23370:3;23391:67;23455:2;23450:3;23391:67;:::i;:::-;23384:74;;23467:93;23556:3;23467:93;:::i;:::-;23585:2;23580:3;23576:12;23569:19;;23228:366;;;:::o;23600:419::-;23766:4;23804:2;23793:9;23789:18;23781:26;;23853:9;23847:4;23843:20;23839:1;23828:9;23824:17;23817:47;23881:131;24007:4;23881:131;:::i;:::-;23873:139;;23600:419;;;:::o;24025:169::-;24165:21;24161:1;24153:6;24149:14;24142:45;24025:169;:::o;24200:366::-;24342:3;24363:67;24427:2;24422:3;24363:67;:::i;:::-;24356:74;;24439:93;24528:3;24439:93;:::i;:::-;24557:2;24552:3;24548:12;24541:19;;24200:366;;;:::o;24572:419::-;24738:4;24776:2;24765:9;24761:18;24753:26;;24825:9;24819:4;24815:20;24811:1;24800:9;24796:17;24789:47;24853:131;24979:4;24853:131;:::i;:::-;24845:139;;24572:419;;;:::o;24997:162::-;25137:14;25133:1;25125:6;25121:14;25114:38;24997:162;:::o;25165:366::-;25307:3;25328:67;25392:2;25387:3;25328:67;:::i;:::-;25321:74;;25404:93;25493:3;25404:93;:::i;:::-;25522:2;25517:3;25513:12;25506:19;;25165:366;;;:::o;25537:419::-;25703:4;25741:2;25730:9;25726:18;25718:26;;25790:9;25784:4;25780:20;25776:1;25765:9;25761:17;25754:47;25818:131;25944:4;25818:131;:::i;:::-;25810:139;;25537:419;;;:::o;25962:194::-;26002:4;26022:20;26040:1;26022:20;:::i;:::-;26017:25;;26056:20;26074:1;26056:20;:::i;:::-;26051:25;;26100:1;26097;26093:9;26085:17;;26124:1;26118:4;26115:11;26112:37;;;26129:18;;:::i;:::-;26112:37;25962:194;;;;:::o;26162:246::-;26302:34;26298:1;26290:6;26286:14;26279:58;26371:29;26366:2;26358:6;26354:15;26347:54;26162:246;:::o;26414:366::-;26556:3;26577:67;26641:2;26636:3;26577:67;:::i;:::-;26570:74;;26653:93;26742:3;26653:93;:::i;:::-;26771:2;26766:3;26762:12;26755:19;;26414:366;;;:::o;26786:419::-;26952:4;26990:2;26979:9;26975:18;26967:26;;27039:9;27033:4;27029:20;27025:1;27014:9;27010:17;27003:47;27067:131;27193:4;27067:131;:::i;:::-;27059:139;;26786:419;;;:::o;27211:240::-;27351:34;27347:1;27339:6;27335:14;27328:58;27420:23;27415:2;27407:6;27403:15;27396:48;27211:240;:::o;27457:366::-;27599:3;27620:67;27684:2;27679:3;27620:67;:::i;:::-;27613:74;;27696:93;27785:3;27696:93;:::i;:::-;27814:2;27809:3;27805:12;27798:19;;27457:366;;;:::o;27829:419::-;27995:4;28033:2;28022:9;28018:18;28010:26;;28082:9;28076:4;28072:20;28068:1;28057:9;28053:17;28046:47;28110:131;28236:4;28110:131;:::i;:::-;28102:139;;27829:419;;;:::o;28254:182::-;28394:34;28390:1;28382:6;28378:14;28371:58;28254:182;:::o;28442:366::-;28584:3;28605:67;28669:2;28664:3;28605:67;:::i;:::-;28598:74;;28681:93;28770:3;28681:93;:::i;:::-;28799:2;28794:3;28790:12;28783:19;;28442:366;;;:::o;28814:419::-;28980:4;29018:2;29007:9;29003:18;28995:26;;29067:9;29061:4;29057:20;29053:1;29042:9;29038:17;29031:47;29095:131;29221:4;29095:131;:::i;:::-;29087:139;;28814:419;;;:::o;29239:221::-;29379:34;29375:1;29367:6;29363:14;29356:58;29448:4;29443:2;29435:6;29431:15;29424:29;29239:221;:::o;29466:366::-;29608:3;29629:67;29693:2;29688:3;29629:67;:::i;:::-;29622:74;;29705:93;29794:3;29705:93;:::i;:::-;29823:2;29818:3;29814:12;29807:19;;29466:366;;;:::o;29838:419::-;30004:4;30042:2;30031:9;30027:18;30019:26;;30091:9;30085:4;30081:20;30077:1;30066:9;30062:17;30055:47;30119:131;30245:4;30119:131;:::i;:::-;30111:139;;29838:419;;;:::o;30263:178::-;30403:30;30399:1;30391:6;30387:14;30380:54;30263:178;:::o;30447:366::-;30589:3;30610:67;30674:2;30669:3;30610:67;:::i;:::-;30603:74;;30686:93;30775:3;30686:93;:::i;:::-;30804:2;30799:3;30795:12;30788:19;;30447:366;;;:::o;30819:419::-;30985:4;31023:2;31012:9;31008:18;31000:26;;31072:9;31066:4;31062:20;31058:1;31047:9;31043:17;31036:47;31100:131;31226:4;31100:131;:::i;:::-;31092:139;;30819:419;;;:::o;31244:236::-;31384:34;31380:1;31372:6;31368:14;31361:58;31453:19;31448:2;31440:6;31436:15;31429:44;31244:236;:::o;31486:366::-;31628:3;31649:67;31713:2;31708:3;31649:67;:::i;:::-;31642:74;;31725:93;31814:3;31725:93;:::i;:::-;31843:2;31838:3;31834:12;31827:19;;31486:366;;;:::o;31858:419::-;32024:4;32062:2;32051:9;32047:18;32039:26;;32111:9;32105:4;32101:20;32097:1;32086:9;32082:17;32075:47;32139:131;32265:4;32139:131;:::i;:::-;32131:139;;31858:419;;;:::o;32283:191::-;32323:3;32342:20;32360:1;32342:20;:::i;:::-;32337:25;;32376:20;32394:1;32376:20;:::i;:::-;32371:25;;32419:1;32416;32412:9;32405:16;;32440:3;32437:1;32434:10;32431:36;;;32447:18;;:::i;:::-;32431:36;32283:191;;;;:::o;32480:172::-;32620:24;32616:1;32608:6;32604:14;32597:48;32480:172;:::o;32658:366::-;32800:3;32821:67;32885:2;32880:3;32821:67;:::i;:::-;32814:74;;32897:93;32986:3;32897:93;:::i;:::-;33015:2;33010:3;33006:12;32999:19;;32658:366;;;:::o;33030:419::-;33196:4;33234:2;33223:9;33219:18;33211:26;;33283:9;33277:4;33273:20;33269:1;33258:9;33254:17;33247:47;33311:131;33437:4;33311:131;:::i;:::-;33303:139;;33030:419;;;:::o;33455:410::-;33495:7;33518:20;33536:1;33518:20;:::i;:::-;33513:25;;33552:20;33570:1;33552:20;:::i;:::-;33547:25;;33607:1;33604;33600:9;33629:30;33647:11;33629:30;:::i;:::-;33618:41;;33808:1;33799:7;33795:15;33792:1;33789:22;33769:1;33762:9;33742:83;33719:139;;33838:18;;:::i;:::-;33719:139;33503:362;33455:410;;;;:::o;33871:175::-;34011:27;34007:1;33999:6;33995:14;33988:51;33871:175;:::o;34052:366::-;34194:3;34215:67;34279:2;34274:3;34215:67;:::i;:::-;34208:74;;34291:93;34380:3;34291:93;:::i;:::-;34409:2;34404:3;34400:12;34393:19;;34052:366;;;:::o;34424:419::-;34590:4;34628:2;34617:9;34613:18;34605:26;;34677:9;34671:4;34667:20;34663:1;34652:9;34648:17;34641:47;34705:131;34831:4;34705:131;:::i;:::-;34697:139;;34424:419;;;:::o;34849:230::-;34989:34;34985:1;34977:6;34973:14;34966:58;35058:13;35053:2;35045:6;35041:15;35034:38;34849:230;:::o;35085:366::-;35227:3;35248:67;35312:2;35307:3;35248:67;:::i;:::-;35241:74;;35324:93;35413:3;35324:93;:::i;:::-;35442:2;35437:3;35433:12;35426:19;;35085:366;;;:::o;35457:419::-;35623:4;35661:2;35650:9;35646:18;35638:26;;35710:9;35704:4;35700:20;35696:1;35685:9;35681:17;35674:47;35738:131;35864:4;35738:131;:::i;:::-;35730:139;;35457:419;;;:::o;35882:231::-;36022:34;36018:1;36010:6;36006:14;35999:58;36091:14;36086:2;36078:6;36074:15;36067:39;35882:231;:::o;36119:366::-;36261:3;36282:67;36346:2;36341:3;36282:67;:::i;:::-;36275:74;;36358:93;36447:3;36358:93;:::i;:::-;36476:2;36471:3;36467:12;36460:19;;36119:366;;;:::o;36491:419::-;36657:4;36695:2;36684:9;36680:18;36672:26;;36744:9;36738:4;36734:20;36730:1;36719:9;36715:17;36708:47;36772:131;36898:4;36772:131;:::i;:::-;36764:139;;36491:419;;;:::o;36916:141::-;36965:4;36988:3;36980:11;;37011:3;37008:1;37001:14;37045:4;37042:1;37032:18;37024:26;;36916:141;;;:::o;37063:93::-;37100:6;37147:2;37142;37135:5;37131:14;37127:23;37117:33;;37063:93;;;:::o;37162:107::-;37206:8;37256:5;37250:4;37246:16;37225:37;;37162:107;;;;:::o;37275:393::-;37344:6;37394:1;37382:10;37378:18;37417:97;37447:66;37436:9;37417:97;:::i;:::-;37535:39;37565:8;37554:9;37535:39;:::i;:::-;37523:51;;37607:4;37603:9;37596:5;37592:21;37583:30;;37656:4;37646:8;37642:19;37635:5;37632:30;37622:40;;37351:317;;37275:393;;;;;:::o;37674:60::-;37702:3;37723:5;37716:12;;37674:60;;;:::o;37740:142::-;37790:9;37823:53;37841:34;37850:24;37868:5;37850:24;:::i;:::-;37841:34;:::i;:::-;37823:53;:::i;:::-;37810:66;;37740:142;;;:::o;37888:75::-;37931:3;37952:5;37945:12;;37888:75;;;:::o;37969:269::-;38079:39;38110:7;38079:39;:::i;:::-;38140:91;38189:41;38213:16;38189:41;:::i;:::-;38181:6;38174:4;38168:11;38140:91;:::i;:::-;38134:4;38127:105;38045:193;37969:269;;;:::o;38244:73::-;38289:3;38244:73;:::o;38323:189::-;38400:32;;:::i;:::-;38441:65;38499:6;38491;38485:4;38441:65;:::i;:::-;38376:136;38323:189;;:::o;38518:186::-;38578:120;38595:3;38588:5;38585:14;38578:120;;;38649:39;38686:1;38679:5;38649:39;:::i;:::-;38622:1;38615:5;38611:13;38602:22;;38578:120;;;38518:186;;:::o;38710:543::-;38811:2;38806:3;38803:11;38800:446;;;38845:38;38877:5;38845:38;:::i;:::-;38929:29;38947:10;38929:29;:::i;:::-;38919:8;38915:44;39112:2;39100:10;39097:18;39094:49;;;39133:8;39118:23;;39094:49;39156:80;39212:22;39230:3;39212:22;:::i;:::-;39202:8;39198:37;39185:11;39156:80;:::i;:::-;38815:431;;38800:446;38710:543;;;:::o;39259:117::-;39313:8;39363:5;39357:4;39353:16;39332:37;;39259:117;;;;:::o;39382:169::-;39426:6;39459:51;39507:1;39503:6;39495:5;39492:1;39488:13;39459:51;:::i;:::-;39455:56;39540:4;39534;39530:15;39520:25;;39433:118;39382:169;;;;:::o;39556:295::-;39632:4;39778:29;39803:3;39797:4;39778:29;:::i;:::-;39770:37;;39840:3;39837:1;39833:11;39827:4;39824:21;39816:29;;39556:295;;;;:::o;39856:1395::-;39973:37;40006:3;39973:37;:::i;:::-;40075:18;40067:6;40064:30;40061:56;;;40097:18;;:::i;:::-;40061:56;40141:38;40173:4;40167:11;40141:38;:::i;:::-;40226:67;40286:6;40278;40272:4;40226:67;:::i;:::-;40320:1;40344:4;40331:17;;40376:2;40368:6;40365:14;40393:1;40388:618;;;;41050:1;41067:6;41064:77;;;41116:9;41111:3;41107:19;41101:26;41092:35;;41064:77;41167:67;41227:6;41220:5;41167:67;:::i;:::-;41161:4;41154:81;41023:222;40358:887;;40388:618;40440:4;40436:9;40428:6;40424:22;40474:37;40506:4;40474:37;:::i;:::-;40533:1;40547:208;40561:7;40558:1;40555:14;40547:208;;;40640:9;40635:3;40631:19;40625:26;40617:6;40610:42;40691:1;40683:6;40679:14;40669:24;;40738:2;40727:9;40723:18;40710:31;;40584:4;40581:1;40577:12;40572:17;;40547:208;;;40783:6;40774:7;40771:19;40768:179;;;40841:9;40836:3;40832:19;40826:26;40884:48;40926:4;40918:6;40914:17;40903:9;40884:48;:::i;:::-;40876:6;40869:64;40791:156;40768:179;40993:1;40989;40981:6;40977:14;40973:22;40967:4;40960:36;40395:611;;;40358:887;;39948:1303;;;39856:1395;;:::o;41257:174::-;41397:26;41393:1;41385:6;41381:14;41374:50;41257:174;:::o;41437:366::-;41579:3;41600:67;41664:2;41659:3;41600:67;:::i;:::-;41593:74;;41676:93;41765:3;41676:93;:::i;:::-;41794:2;41789:3;41785:12;41778:19;;41437:366;;;:::o;41809:419::-;41975:4;42013:2;42002:9;41998:18;41990:26;;42062:9;42056:4;42052:20;42048:1;42037:9;42033:17;42026:47;42090:131;42216:4;42090:131;:::i;:::-;42082:139;;41809:419;;;:::o;42234:228::-;42374:34;42370:1;42362:6;42358:14;42351:58;42443:11;42438:2;42430:6;42426:15;42419:36;42234:228;:::o;42468:366::-;42610:3;42631:67;42695:2;42690:3;42631:67;:::i;:::-;42624:74;;42707:93;42796:3;42707:93;:::i;:::-;42825:2;42820:3;42816:12;42809:19;;42468:366;;;:::o;42840:419::-;43006:4;43044:2;43033:9;43029:18;43021:26;;43093:9;43087:4;43083:20;43079:1;43068:9;43064:17;43057:47;43121:131;43247:4;43121:131;:::i;:::-;43113:139;;42840:419;;;:::o;43265:234::-;43405:34;43401:1;43393:6;43389:14;43382:58;43474:17;43469:2;43461:6;43457:15;43450:42;43265:234;:::o;43505:366::-;43647:3;43668:67;43732:2;43727:3;43668:67;:::i;:::-;43661:74;;43744:93;43833:3;43744:93;:::i;:::-;43862:2;43857:3;43853:12;43846:19;;43505:366;;;:::o;43877:419::-;44043:4;44081:2;44070:9;44066:18;44058:26;;44130:9;44124:4;44120:20;44116:1;44105:9;44101:17;44094:47;44158:131;44284:4;44158:131;:::i;:::-;44150:139;;43877:419;;;:::o;44302:148::-;44404:11;44441:3;44426:18;;44302:148;;;;:::o;44480:874::-;44583:3;44620:5;44614:12;44649:36;44675:9;44649:36;:::i;:::-;44701:89;44783:6;44778:3;44701:89;:::i;:::-;44694:96;;44821:1;44810:9;44806:17;44837:1;44832:166;;;;45012:1;45007:341;;;;44799:549;;44832:166;44916:4;44912:9;44901;44897:25;44892:3;44885:38;44978:6;44971:14;44964:22;44956:6;44952:35;44947:3;44943:45;44936:52;;44832:166;;45007:341;45074:38;45106:5;45074:38;:::i;:::-;45134:1;45148:154;45162:6;45159:1;45156:13;45148:154;;;45236:7;45230:14;45226:1;45221:3;45217:11;45210:35;45286:1;45277:7;45273:15;45262:26;;45184:4;45181:1;45177:12;45172:17;;45148:154;;;45331:6;45326:3;45322:16;45315:23;;45014:334;;44799:549;;44587:767;;44480:874;;;;:::o;45360:390::-;45466:3;45494:39;45527:5;45494:39;:::i;:::-;45549:89;45631:6;45626:3;45549:89;:::i;:::-;45542:96;;45647:65;45705:6;45700:3;45693:4;45686:5;45682:16;45647:65;:::i;:::-;45737:6;45732:3;45728:16;45721:23;;45470:280;45360:390;;;;:::o;45756:155::-;45896:7;45892:1;45884:6;45880:14;45873:31;45756:155;:::o;45917:400::-;46077:3;46098:84;46180:1;46175:3;46098:84;:::i;:::-;46091:91;;46191:93;46280:3;46191:93;:::i;:::-;46309:1;46304:3;46300:11;46293:18;;45917:400;;;:::o;46323:695::-;46601:3;46623:92;46711:3;46702:6;46623:92;:::i;:::-;46616:99;;46732:95;46823:3;46814:6;46732:95;:::i;:::-;46725:102;;46844:148;46988:3;46844:148;:::i;:::-;46837:155;;47009:3;47002:10;;46323:695;;;;;:::o;47024:225::-;47164:34;47160:1;47152:6;47148:14;47141:58;47233:8;47228:2;47220:6;47216:15;47209:33;47024:225;:::o;47255:366::-;47397:3;47418:67;47482:2;47477:3;47418:67;:::i;:::-;47411:74;;47494:93;47583:3;47494:93;:::i;:::-;47612:2;47607:3;47603:12;47596:19;;47255:366;;;:::o;47627:419::-;47793:4;47831:2;47820:9;47816:18;47808:26;;47880:9;47874:4;47870:20;47866:1;47855:9;47851:17;47844:47;47908:131;48034:4;47908:131;:::i;:::-;47900:139;;47627:419;;;:::o;48052:182::-;48192:34;48188:1;48180:6;48176:14;48169:58;48052:182;:::o;48240:366::-;48382:3;48403:67;48467:2;48462:3;48403:67;:::i;:::-;48396:74;;48479:93;48568:3;48479:93;:::i;:::-;48597:2;48592:3;48588:12;48581:19;;48240:366;;;:::o;48612:419::-;48778:4;48816:2;48805:9;48801:18;48793:26;;48865:9;48859:4;48855:20;48851:1;48840:9;48836:17;48829:47;48893:131;49019:4;48893:131;:::i;:::-;48885:139;;48612:419;;;:::o;49037:224::-;49177:34;49173:1;49165:6;49161:14;49154:58;49246:7;49241:2;49233:6;49229:15;49222:32;49037:224;:::o;49267:366::-;49409:3;49430:67;49494:2;49489:3;49430:67;:::i;:::-;49423:74;;49506:93;49595:3;49506:93;:::i;:::-;49624:2;49619:3;49615:12;49608:19;;49267:366;;;:::o;49639:419::-;49805:4;49843:2;49832:9;49828:18;49820:26;;49892:9;49886:4;49882:20;49878:1;49867:9;49863:17;49856:47;49920:131;50046:4;49920:131;:::i;:::-;49912:139;;49639:419;;;:::o;50064:223::-;50204:34;50200:1;50192:6;50188:14;50181:58;50273:6;50268:2;50260:6;50256:15;50249:31;50064:223;:::o;50293:366::-;50435:3;50456:67;50520:2;50515:3;50456:67;:::i;:::-;50449:74;;50532:93;50621:3;50532:93;:::i;:::-;50650:2;50645:3;50641:12;50634:19;;50293:366;;;:::o;50665:419::-;50831:4;50869:2;50858:9;50854:18;50846:26;;50918:9;50912:4;50908:20;50904:1;50893:9;50889:17;50882:47;50946:131;51072:4;50946:131;:::i;:::-;50938:139;;50665:419;;;:::o;51090:175::-;51230:27;51226:1;51218:6;51214:14;51207:51;51090:175;:::o;51271:366::-;51413:3;51434:67;51498:2;51493:3;51434:67;:::i;:::-;51427:74;;51510:93;51599:3;51510:93;:::i;:::-;51628:2;51623:3;51619:12;51612:19;;51271:366;;;:::o;51643:419::-;51809:4;51847:2;51836:9;51832:18;51824:26;;51896:9;51890:4;51886:20;51882:1;51871:9;51867:17;51860:47;51924:131;52050:4;51924:131;:::i;:::-;51916:139;;51643:419;;;:::o;52068:237::-;52208:34;52204:1;52196:6;52192:14;52185:58;52277:20;52272:2;52264:6;52260:15;52253:45;52068:237;:::o;52311:366::-;52453:3;52474:67;52538:2;52533:3;52474:67;:::i;:::-;52467:74;;52550:93;52639:3;52550:93;:::i;:::-;52668:2;52663:3;52659:12;52652:19;;52311:366;;;:::o;52683:419::-;52849:4;52887:2;52876:9;52872:18;52864:26;;52936:9;52930:4;52926:20;52922:1;52911:9;52907:17;52900:47;52964:131;53090:4;52964:131;:::i;:::-;52956:139;;52683:419;;;:::o;53108:180::-;53156:77;53153:1;53146:88;53253:4;53250:1;53243:15;53277:4;53274:1;53267:15;53294:185;53334:1;53351:20;53369:1;53351:20;:::i;:::-;53346:25;;53385:20;53403:1;53385:20;:::i;:::-;53380:25;;53424:1;53414:35;;53429:18;;:::i;:::-;53414:35;53471:1;53468;53464:9;53459:14;;53294:185;;;;:::o;53485:176::-;53517:1;53534:20;53552:1;53534:20;:::i;:::-;53529:25;;53568:20;53586:1;53568:20;:::i;:::-;53563:25;;53607:1;53597:35;;53612:18;;:::i;:::-;53597:35;53653:1;53650;53646:9;53641:14;;53485:176;;;;:::o;53667:98::-;53718:6;53752:5;53746:12;53736:22;;53667:98;;;:::o;53771:168::-;53854:11;53888:6;53883:3;53876:19;53928:4;53923:3;53919:14;53904:29;;53771:168;;;;:::o;53945:373::-;54031:3;54059:38;54091:5;54059:38;:::i;:::-;54113:70;54176:6;54171:3;54113:70;:::i;:::-;54106:77;;54192:65;54250:6;54245:3;54238:4;54231:5;54227:16;54192:65;:::i;:::-;54282:29;54304:6;54282:29;:::i;:::-;54277:3;54273:39;54266:46;;54035:283;53945:373;;;;:::o;54324:640::-;54519:4;54557:3;54546:9;54542:19;54534:27;;54571:71;54639:1;54628:9;54624:17;54615:6;54571:71;:::i;:::-;54652:72;54720:2;54709:9;54705:18;54696:6;54652:72;:::i;:::-;54734;54802:2;54791:9;54787:18;54778:6;54734:72;:::i;:::-;54853:9;54847:4;54843:20;54838:2;54827:9;54823:18;54816:48;54881:76;54952:4;54943:6;54881:76;:::i;:::-;54873:84;;54324:640;;;;;;;:::o;54970:141::-;55026:5;55057:6;55051:13;55042:22;;55073:32;55099:5;55073:32;:::i;:::-;54970:141;;;;:::o;55117:349::-;55186:6;55235:2;55223:9;55214:7;55210:23;55206:32;55203:119;;;55241:79;;:::i;:::-;55203:119;55361:1;55386:63;55441:7;55432:6;55421:9;55417:22;55386:63;:::i;:::-;55376:73;;55332:127;55117:349;;;;:::o;55472:180::-;55520:77;55517:1;55510:88;55617:4;55614:1;55607:15;55641:4;55638:1;55631:15;55658:182;55798:34;55794:1;55786:6;55782:14;55775:58;55658:182;:::o;55846:366::-;55988:3;56009:67;56073:2;56068:3;56009:67;:::i;:::-;56002:74;;56085:93;56174:3;56085:93;:::i;:::-;56203:2;56198:3;56194:12;56187:19;;55846:366;;;:::o;56218:419::-;56384:4;56422:2;56411:9;56407:18;56399:26;;56471:9;56465:4;56461:20;56457:1;56446:9;56442:17;56435:47;56499:131;56625:4;56499:131;:::i;:::-;56491:139;;56218:419;;;:::o;56643:178::-;56783:30;56779:1;56771:6;56767:14;56760:54;56643:178;:::o;56827:366::-;56969:3;56990:67;57054:2;57049:3;56990:67;:::i;:::-;56983:74;;57066:93;57155:3;57066:93;:::i;:::-;57184:2;57179:3;57175:12;57168:19;;56827:366;;;:::o;57199:419::-;57365:4;57403:2;57392:9;57388:18;57380:26;;57452:9;57446:4;57442:20;57438:1;57427:9;57423:17;57416:47;57480:131;57606:4;57480:131;:::i;:::-;57472:139;;57199:419;;;:::o

Swarm Source

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