ETH Price: $3,404.21 (+2.78%)

Token

House of Assets (HOA)
 

Overview

Max Total Supply

2,000 HOA

Holders

764

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 HOA
0xf3bf4cadebee8427f6fc87f4d846f21d78efe2dc
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:
HOA

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

pragma solidity ^0.8.0;


// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
/**
 * @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);
}


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

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

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

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

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

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

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

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

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

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

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

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


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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
/**
 * @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);
}


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
/**
 * @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

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
/**
 * @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;
    }
}


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
/**
 * @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;
    }
}


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

    /**
     * @dev Edit for rawOwnerOf token
     */
    function rawOwnerOf(uint256 tokenId) public view returns (address) {
        return _owners[tokenId];
    }

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(owner, to, tokenId);

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

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

        emit Transfer(owner, to, tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)
/**
 * @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);
}


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


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)
/**
 * @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;
    }
}


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
/**
 * @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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

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


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)
/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}


// @author: Patrick
/////////////////////////////////////////////////////////////////////////////////////
//                                                                                 //
//                                                                                 //
//                                                                                 //
//        @@          @@               @@                      @@@                 //
//        @@          @@             @    @                  @@   @@               //
//        @@          @@           @        @               @@     @@              //
//        @@          @@         @            @            @@       @@             //
//        @@@@@@@@@@@@@@        @      @@      @          @@@@@@@@@@@@@            //
//        @@          @@         @            @          @@           @@           //
//        @@          @@           @        @           @@             @@          //
//        @@          @@             @    @            @@               @@         //
//        @@          @@               @@             @@                 @@        //
//                                                                                 //
//                                                                                 //
//                                                                                 //
/////////////////////////////////////////////////////////////////////////////////////
contract HOA is ERC721Enumerable, Ownable {
    using SafeMath for uint256;
    using Counters for Counters.Counter;
    using Strings for uint256;

    uint256 public MAX_ELEMENTS = 10000;
    uint256 public PRICE = 0.15 ether;
    uint256 public constant START_AT = 1;

    bool private PAUSE = true;

    Counters.Counter private _tokenIdTracker;

    string public baseTokenURI;

    bool public META_REVEAL = false;
    uint256 public HIDE_FROM = 1;
    uint256 public HIDE_TO = 10000;
    string public sampleTokenURI;

    address public constant creatorAddress = 0x12673391A96EC59A7d2c56C555EAfe51a3C543cF;
    mapping (address => uint) public ownWallet;

    event PauseEvent(bool pause);
    event welcomeToHOA(uint256 indexed id);
    event NewPriceEvent(uint256 price);
    event NewMaxElement(uint256 max);

    bytes32 public merkleRoot;

    constructor(string memory baseURI, string memory sampleURI) ERC721("House of Assets", "HOA"){
        setBaseURI(baseURI);
        setSampleURI(sampleURI);
    }

    modifier saleIsOpen {
        require(totalToken() <= MAX_ELEMENTS, "Soldout!");
        require(!PAUSE, "Sales not open");
        _;
    }

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

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

    function setSampleURI(string memory sampleURI) public onlyOwner {
        sampleTokenURI = sampleURI;
    }

    function totalToken() public view returns (uint256) {
        return _tokenIdTracker.current();
    }

    function isStatus() public view returns (uint256) {
        if(block.timestamp < 1654441060) {
            return 0; // Before Mint
        } else if(block.timestamp >= 1654441060 && block.timestamp < 1654441060 + 1 days) {
            return 1; // Allowlist Sale Period
        } else {
            return 2; // Public Sale Period
        }
    }

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

        if(!META_REVEAL && tokenId >= HIDE_FROM && tokenId <= HIDE_TO) 
            return sampleTokenURI;
        
        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    function whitelistMint(uint256 _tokenAmount, bytes32[] memory _merkleProof) public payable saleIsOpen {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Invalid proof");
        uint256 total = totalToken();
        require(_tokenAmount <= 10, "Max limit a wallet");
        require(ownWallet[msg.sender] + _tokenAmount <= 10, "Maxium is 10");
        require(total + _tokenAmount <= 7500, "Max limit");
        require(msg.value >= price(_tokenAmount), "Value below price");

        address wallet = _msgSender();

        for(uint8 i = 1; i <= _tokenAmount; i++){
            _mintAnElement(wallet, total + i);
        }
    }
    
    function mintItem(uint256 _tokenAmount) public payable saleIsOpen {

        uint256 total = totalToken();
        require(_tokenAmount <= 2, "Max limit a wallet");
        require(ownWallet[msg.sender] + _tokenAmount <= 2, "Maxium is 2");
        require(total + _tokenAmount <= MAX_ELEMENTS, "Max limit");
        require(msg.value >= price(_tokenAmount), "Value below price");

        address wallet = _msgSender();

        for(uint8 i = 1; i <= _tokenAmount; i++){
            _mintAnElement(wallet, total + i);
        }

    }

    function giftMint(uint256 _tokenAmount) public onlyOwner saleIsOpen {
        uint256 total = totalToken();
        require(_tokenAmount <= 100, "Max limit a wallet");
        require(ownWallet[msg.sender] + _tokenAmount <= 100, "Maxium is 100");
        require(total + _tokenAmount <= MAX_ELEMENTS, "Max limit");

        address wallet = _msgSender();

        for(uint8 i = 1; i <= _tokenAmount; i++){
            _mintAnElement(wallet, total + i);
        }
    }

    function _mintAnElement(address _to, uint256 _tokenId) private {

        _tokenIdTracker.increment();
        ownWallet[_to]++;
        _safeMint(_to, _tokenId);

        emit welcomeToHOA(_tokenId);
    }

    function price(uint256 _count) public view returns (uint256) {
        return PRICE.mul(_count);
    }

    function setPause(bool _pause) public onlyOwner{
        PAUSE = _pause;
        emit PauseEvent(PAUSE);
    }

    function setPrice(uint256 _price) public onlyOwner{
        PRICE = _price;
        emit NewPriceEvent(PRICE);
    }

    function setMaxElement(uint256 _max) public onlyOwner{
        MAX_ELEMENTS = _max;
        emit NewMaxElement(MAX_ELEMENTS);
    }

    function setMetaReveal(bool _reveal, uint256 _from, uint256 _to) public onlyOwner{
        META_REVEAL = _reveal;
        HIDE_FROM = _from;
        HIDE_TO = _to;
    }

    function withdrawAll() public onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0);
        _widthdraw(creatorAddress, address(this).balance);
    }

    function _widthdraw(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "Transfer failed.");
    }

    function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
        merkleRoot = _merkleRoot;
    }

    function isWhitelist(bytes32[] memory _merkleProof) public view returns (bool) {
       bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
       return MerkleProof.verify(_merkleProof, merkleRoot, leaf);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"string","name":"sampleURI","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":false,"internalType":"uint256","name":"max","type":"uint256"}],"name":"NewMaxElement","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"NewPriceEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"pause","type":"bool"}],"name":"PauseEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"welcomeToHOA","type":"event"},{"inputs":[],"name":"HIDE_FROM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HIDE_TO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ELEMENTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"META_REVEAL","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"START_AT","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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creatorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"giftMint","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":"isStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"isWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"mintItem","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ownWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"rawOwnerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sampleTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxElement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_reveal","type":"bool"},{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"setMetaReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_pause","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"sampleURI","type":"string"}],"name":"setSampleURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalToken","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":"_tokenAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052612710600b55670214e8348c4f0000600c556001600d60006101000a81548160ff0219169083151502179055506000601060006101000a81548160ff02191690831515021790555060016011556127106012553480156200006457600080fd5b5060405162005d8a38038062005d8a83398181016040528101906200008a9190620004f0565b6040518060400160405280600f81526020017f486f757365206f662041737365747300000000000000000000000000000000008152506040518060400160405280600381526020017f484f41000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200010e929190620003c2565b50806001908051906020019062000127929190620003c2565b5050506200014a6200013e6200017460201b60201c565b6200017c60201b60201c565b6200015b826200024260201b60201c565b6200016c81620002ed60201b60201c565b50506200077c565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002526200017460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002786200039860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002d1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002c8906200059c565b60405180910390fd5b80600f9080519060200190620002e9929190620003c2565b5050565b620002fd6200017460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003236200039860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200037c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000373906200059c565b60405180910390fd5b806013908051906020019062000394929190620003c2565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003d09062000664565b90600052602060002090601f016020900481019282620003f4576000855562000440565b82601f106200040f57805160ff191683800117855562000440565b8280016001018555821562000440579182015b828111156200043f57825182559160200191906001019062000422565b5b5090506200044f919062000453565b5090565b5b808211156200046e57600081600090555060010162000454565b5090565b6000620004896200048384620005e7565b620005be565b905082815260208101848484011115620004a857620004a762000733565b5b620004b58482856200062e565b509392505050565b600082601f830112620004d557620004d46200072e565b5b8151620004e784826020860162000472565b91505092915050565b600080604083850312156200050a57620005096200073d565b5b600083015167ffffffffffffffff8111156200052b576200052a62000738565b5b6200053985828601620004bd565b925050602083015167ffffffffffffffff8111156200055d576200055c62000738565b5b6200056b85828601620004bd565b9150509250929050565b6000620005846020836200061d565b9150620005918262000753565b602082019050919050565b60006020820190508181036000830152620005b78162000575565b9050919050565b6000620005ca620005dd565b9050620005d882826200069a565b919050565b6000604051905090565b600067ffffffffffffffff821115620006055762000604620006ff565b5b620006108262000742565b9050602081019050919050565b600082825260208201905092915050565b60005b838110156200064e57808201518184015260208101905062000631565b838111156200065e576000848401525b50505050565b600060028204905060018216806200067d57607f821691505b60208210811415620006945762000693620006d0565b5b50919050565b620006a58262000742565b810181811067ffffffffffffffff82111715620006c757620006c6620006ff565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6155fe806200078c6000396000f3fe60806040526004361061027d5760003560e01c80637f81be691161014f578063bedb86fb116100c1578063e2b4db971161007a578063e2b4db9714610990578063e927fc5c146109b9578063e985e9c5146109e4578063ed475f6314610a21578063ee53408314610a5e578063f2fde38b14610a895761027d565b8063bedb86fb1461088d578063bf7b766d146108b6578063c7427093146108e1578063c87b56dd1461090c578063d2cab05614610949578063d547cfb7146109655761027d565b806391b7f5ed1161011357806391b7f5ed1461079357806395d89b41146107bc578063a22cb465146107e7578063b88d4fde14610810578063b8ea3cb014610839578063bc13a688146108625761027d565b80637f81be69146106c0578063853828b6146106fd57806389ece941146107145780638d859f3e1461073d5780638da5cb5b146107685761027d565b80632eb4a7ab116101f35780635d7cf6a3116101ac5780635d7cf6a31461059e578063626be567146105db5780636352211e1461060657806370a0823114610643578063715018a6146106805780637cb64759146106975761027d565b80632eb4a7ab1461047c5780632f745c59146104a75780633502a716146104e457806342842e0e1461050f5780634f6ccce71461053857806355f804b3146105755761027d565b806312c2449f1161024557806312c2449f1461037b57806317fb8594146103a457806318160ddd146103c05780631ec858ec146103eb57806323b872dd1461041657806326a49e371461043f5761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b314610327578063103c4b5314610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613e9c565b610ab2565b6040516102b69190614570565b60405180910390f35b3480156102cb57600080fd5b506102d4610b2c565b6040516102e191906145a6565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c9190613f3f565b610bbe565b60405161031e9190614509565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613d66565b610c43565b005b34801561035c57600080fd5b50610365610d5b565b60405161037291906145a6565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d9190613e1c565b610de9565b005b6103be60048036038101906103b99190613f3f565b610e92565b005b3480156103cc57600080fd5b506103d56110f5565b6040516103e29190614948565b60405180910390f35b3480156103f757600080fd5b50610400611102565b60405161040d9190614948565b60405180910390f35b34801561042257600080fd5b5061043d60048036038101906104389190613c50565b611108565b005b34801561044b57600080fd5b5061046660048036038101906104619190613f3f565b611168565b6040516104739190614948565b60405180910390f35b34801561048857600080fd5b50610491611186565b60405161049e919061458b565b60405180910390f35b3480156104b357600080fd5b506104ce60048036038101906104c99190613d66565b61118c565b6040516104db9190614948565b60405180910390f35b3480156104f057600080fd5b506104f9611231565b6040516105069190614948565b60405180910390f35b34801561051b57600080fd5b5061053660048036038101906105319190613c50565b611237565b005b34801561054457600080fd5b5061055f600480360381019061055a9190613f3f565b611257565b60405161056c9190614948565b60405180910390f35b34801561058157600080fd5b5061059c60048036038101906105979190613ef6565b6112c8565b005b3480156105aa57600080fd5b506105c560048036038101906105c09190613be3565b61135e565b6040516105d29190614948565b60405180910390f35b3480156105e757600080fd5b506105f0611376565b6040516105fd9190614948565b60405180910390f35b34801561061257600080fd5b5061062d60048036038101906106289190613f3f565b611387565b60405161063a9190614509565b60405180910390f35b34801561064f57600080fd5b5061066a60048036038101906106659190613be3565b611439565b6040516106779190614948565b60405180910390f35b34801561068c57600080fd5b506106956114f1565b005b3480156106a357600080fd5b506106be60048036038101906106b99190613e6f565b611579565b005b3480156106cc57600080fd5b506106e760048036038101906106e29190613f3f565b6115ff565b6040516106f49190614509565b60405180910390f35b34801561070957600080fd5b5061071261163c565b005b34801561072057600080fd5b5061073b60048036038101906107369190613ef6565b6116eb565b005b34801561074957600080fd5b50610752611781565b60405161075f9190614948565b60405180910390f35b34801561077457600080fd5b5061077d611787565b60405161078a9190614509565b60405180910390f35b34801561079f57600080fd5b506107ba60048036038101906107b59190613f3f565b6117b1565b005b3480156107c857600080fd5b506107d1611870565b6040516107de91906145a6565b60405180910390f35b3480156107f357600080fd5b5061080e60048036038101906108099190613d26565b611902565b005b34801561081c57600080fd5b5061083760048036038101906108329190613ca3565b611a83565b005b34801561084557600080fd5b50610860600480360381019061085b9190613f3f565b611ae5565b005b34801561086e57600080fd5b50610877611ba4565b6040516108849190614570565b60405180910390f35b34801561089957600080fd5b506108b460048036038101906108af9190613def565b611bb7565b005b3480156108c257600080fd5b506108cb611c96565b6040516108d89190614948565b60405180910390f35b3480156108ed57600080fd5b506108f6611c9b565b6040516109039190614948565b60405180910390f35b34801561091857600080fd5b50610933600480360381019061092e9190613f3f565b611ca1565b60405161094091906145a6565b60405180910390f35b610963600480360381019061095e9190613f6c565b611e0d565b005b34801561097157600080fd5b5061097a6120e9565b60405161098791906145a6565b60405180910390f35b34801561099c57600080fd5b506109b760048036038101906109b29190613f3f565b612177565b005b3480156109c557600080fd5b506109ce61240b565b6040516109db9190614509565b60405180910390f35b3480156109f057600080fd5b50610a0b6004803603810190610a069190613c10565b612423565b604051610a189190614570565b60405180910390f35b348015610a2d57600080fd5b50610a486004803603810190610a439190613da6565b6124b7565b604051610a559190614570565b60405180910390f35b348015610a6a57600080fd5b50610a736124f8565b604051610a809190614948565b60405180910390f35b348015610a9557600080fd5b50610ab06004803603810190610aab9190613be3565b61253c565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b255750610b2482612634565b5b9050919050565b606060008054610b3b90614c46565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6790614c46565b8015610bb45780601f10610b8957610100808354040283529160200191610bb4565b820191906000526020600020905b815481529060010190602001808311610b9757829003601f168201915b5050505050905090565b6000610bc982612716565b610c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bff90614788565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c4e82611387565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb690614828565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cde612782565b73ffffffffffffffffffffffffffffffffffffffff161480610d0d5750610d0c81610d07612782565b612423565b5b610d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4390614708565b60405180910390fd5b610d56838361278a565b505050565b60138054610d6890614c46565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9490614c46565b8015610de15780601f10610db657610100808354040283529160200191610de1565b820191906000526020600020905b815481529060010190602001808311610dc457829003601f168201915b505050505081565b610df1612782565b73ffffffffffffffffffffffffffffffffffffffff16610e0f611787565b73ffffffffffffffffffffffffffffffffffffffff1614610e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5c906147a8565b60405180910390fd5b82601060006101000a81548160ff0219169083151502179055508160118190555080601281905550505050565b600b54610e9d611376565b1115610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed590614928565b60405180910390fd5b600d60009054906101000a900460ff1615610f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2590614848565b60405180910390fd5b6000610f38611376565b90506002821115610f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7590614868565b60405180910390fd5b600282601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610fcb9190614a64565b111561100c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611003906145c8565b60405180910390fd5b600b54828261101b9190614a64565b111561105c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611053906146a8565b60405180910390fd5b61106582611168565b3410156110a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109e90614808565b60405180910390fd5b60006110b1612782565b90506000600190505b838160ff16116110ef576110dc828260ff16856110d79190614a64565b612843565b80806110e790614cf2565b9150506110ba565b50505050565b6000600880549050905090565b60115481565b611119611113612782565b826128dd565b611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f906148a8565b60405180910390fd5b6111638383836129bb565b505050565b600061117f82600c54612c1790919063ffffffff16565b9050919050565b60155481565b600061119783611439565b82106111d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cf906145e8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b5481565b61125283838360405180602001604052806000815250611a83565b505050565b60006112616110f5565b82106112a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611299906148c8565b60405180910390fd5b600882815481106112b6576112b5614e2d565b5b90600052602060002001549050919050565b6112d0612782565b73ffffffffffffffffffffffffffffffffffffffff166112ee611787565b73ffffffffffffffffffffffffffffffffffffffff1614611344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133b906147a8565b60405180910390fd5b80600f908051906020019061135a929190613944565b5050565b60146020528060005260406000206000915090505481565b6000611382600e612c2d565b905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142790614748565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a190614728565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114f9612782565b73ffffffffffffffffffffffffffffffffffffffff16611517611787565b73ffffffffffffffffffffffffffffffffffffffff161461156d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611564906147a8565b60405180910390fd5b6115776000612c3b565b565b611581612782565b73ffffffffffffffffffffffffffffffffffffffff1661159f611787565b73ffffffffffffffffffffffffffffffffffffffff16146115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec906147a8565b60405180910390fd5b8060158190555050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611644612782565b73ffffffffffffffffffffffffffffffffffffffff16611662611787565b73ffffffffffffffffffffffffffffffffffffffff16146116b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116af906147a8565b60405180910390fd5b6000479050600081116116ca57600080fd5b6116e87312673391a96ec59a7d2c56c555eafe51a3c543cf47612d01565b50565b6116f3612782565b73ffffffffffffffffffffffffffffffffffffffff16611711611787565b73ffffffffffffffffffffffffffffffffffffffff1614611767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175e906147a8565b60405180910390fd5b806013908051906020019061177d929190613944565b5050565b600c5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117b9612782565b73ffffffffffffffffffffffffffffffffffffffff166117d7611787565b73ffffffffffffffffffffffffffffffffffffffff161461182d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611824906147a8565b60405180910390fd5b80600c819055507f0e4af3870af723022c49a1ebcf7379a14fa7732c2dc92925407b8d219116a26b600c546040516118659190614948565b60405180910390a150565b60606001805461187f90614c46565b80601f01602080910402602001604051908101604052809291908181526020018280546118ab90614c46565b80156118f85780601f106118cd576101008083540402835291602001916118f8565b820191906000526020600020905b8154815290600101906020018083116118db57829003601f168201915b5050505050905090565b61190a612782565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196f90614688565b60405180910390fd5b8060056000611985612782565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a32612782565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a779190614570565b60405180910390a35050565b611a94611a8e612782565b836128dd565b611ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aca906148a8565b60405180910390fd5b611adf84848484612db2565b50505050565b611aed612782565b73ffffffffffffffffffffffffffffffffffffffff16611b0b611787565b73ffffffffffffffffffffffffffffffffffffffff1614611b61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b58906147a8565b60405180910390fd5b80600b819055507fc83d13efd20405bd69a6e26fd71d067b31246b9fe9ad2b945536dd1770330d48600b54604051611b999190614948565b60405180910390a150565b601060009054906101000a900460ff1681565b611bbf612782565b73ffffffffffffffffffffffffffffffffffffffff16611bdd611787565b73ffffffffffffffffffffffffffffffffffffffff1614611c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2a906147a8565b60405180910390fd5b80600d60006101000a81548160ff0219169083151502179055507f10e1c3fcaff06b68391033547e8f9bb8067d7c4a2e32659b0629153814d242d3600d60009054906101000a900460ff16604051611c8b9190614570565b60405180910390a150565b600181565b60125481565b6060611cac82612716565b611ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce2906147e8565b60405180910390fd5b601060009054906101000a900460ff16158015611d0a57506011548210155b8015611d1857506012548211155b15611daf5760138054611d2a90614c46565b80601f0160208091040260200160405190810160405280929190818152602001828054611d5690614c46565b8015611da35780601f10611d7857610100808354040283529160200191611da3565b820191906000526020600020905b815481529060010190602001808311611d8657829003601f168201915b50505050509050611e08565b6000611db9612e0e565b90506000815111611dd95760405180602001604052806000815250611e04565b80611de384612ea0565b604051602001611df49291906144d0565b6040516020818303038152906040525b9150505b919050565b600b54611e18611376565b1115611e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5090614928565b60405180910390fd5b600d60009054906101000a900460ff1615611ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea090614848565b60405180910390fd5b600033604051602001611ebc91906144b5565b604051602081830303815290604052805190602001209050611ee18260155483613001565b611f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f17906148e8565b60405180910390fd5b6000611f2a611376565b9050600a841115611f70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6790614868565b60405180910390fd5b600a84601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fbd9190614a64565b1115611ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff590614908565b60405180910390fd5b611d4c848261200d9190614a64565b111561204e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612045906146a8565b60405180910390fd5b61205784611168565b341015612099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209090614808565b60405180910390fd5b60006120a3612782565b90506000600190505b858160ff16116120e1576120ce828260ff16856120c99190614a64565b612843565b80806120d990614cf2565b9150506120ac565b505050505050565b600f80546120f690614c46565b80601f016020809104026020016040519081016040528092919081815260200182805461212290614c46565b801561216f5780601f106121445761010080835404028352916020019161216f565b820191906000526020600020905b81548152906001019060200180831161215257829003601f168201915b505050505081565b61217f612782565b73ffffffffffffffffffffffffffffffffffffffff1661219d611787565b73ffffffffffffffffffffffffffffffffffffffff16146121f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ea906147a8565b60405180910390fd5b600b546121fe611376565b111561223f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223690614928565b60405180910390fd5b600d60009054906101000a900460ff161561228f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228690614848565b60405180910390fd5b6000612299611376565b905060648211156122df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d690614868565b60405180910390fd5b606482601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461232c9190614a64565b111561236d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612364906146e8565b60405180910390fd5b600b54828261237c9190614a64565b11156123bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b4906146a8565b60405180910390fd5b60006123c7612782565b90506000600190505b838160ff1611612405576123f2828260ff16856123ed9190614a64565b612843565b80806123fd90614cf2565b9150506123d0565b50505050565b7312673391a96ec59a7d2c56c555eafe51a3c543cf81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080336040516020016124cb91906144b5565b6040516020818303038152906040528051906020012090506124f08360155483613001565b915050919050565b600063629cc46442101561250f5760009050612539565b63629cc4644210158015612526575063629e15e442105b156125345760019050612539565b600290505b90565b612544612782565b73ffffffffffffffffffffffffffffffffffffffff16612562611787565b73ffffffffffffffffffffffffffffffffffffffff16146125b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125af906147a8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261f90614628565b60405180910390fd5b61263181612c3b565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126ff57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061270f575061270e82613018565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127fd83611387565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61284d600e613082565b601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061289d90614ca9565b91905055506128ac8282613098565b807f7de9ff3a06537ba46c8a2243263d06a06584838cb3077f70fb2d379fa82b5c7c60405160405180910390a25050565b60006128e882612716565b612927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291e906146c8565b60405180910390fd5b600061293283611387565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806129a157508373ffffffffffffffffffffffffffffffffffffffff1661298984610bbe565b73ffffffffffffffffffffffffffffffffffffffff16145b806129b257506129b18185612423565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129db82611387565b73ffffffffffffffffffffffffffffffffffffffff1614612a31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a28906147c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9890614668565b60405180910390fd5b612aac8383836130b6565b612ab760008261278a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b079190614b45565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b5e9190614a64565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612c259190614aeb565b905092915050565b600081600001549050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612d27906144f4565b60006040518083038185875af1925050503d8060008114612d64576040519150601f19603f3d011682016040523d82523d6000602084013e612d69565b606091505b5050905080612dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da490614888565b60405180910390fd5b505050565b612dbd8484846129bb565b612dc9848484846131ca565b612e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dff90614608565b60405180910390fd5b50505050565b6060600f8054612e1d90614c46565b80601f0160208091040260200160405190810160405280929190818152602001828054612e4990614c46565b8015612e965780601f10612e6b57610100808354040283529160200191612e96565b820191906000526020600020905b815481529060010190602001808311612e7957829003601f168201915b5050505050905090565b60606000821415612ee8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ffc565b600082905060005b60008214612f1a578080612f0390614ca9565b915050600a82612f139190614aba565b9150612ef0565b60008167ffffffffffffffff811115612f3657612f35614e5c565b5b6040519080825280601f01601f191660200182016040528015612f685781602001600182028036833780820191505090505b5090505b60008514612ff557600182612f819190614b45565b9150600a85612f909190614d40565b6030612f9c9190614a64565b60f81b818381518110612fb257612fb1614e2d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612fee9190614aba565b9450612f6c565b8093505050505b919050565b60008261300e8584613361565b1490509392505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6001816000016000828254019250508190555050565b6130b28282604051806020016040528060008152506133d6565b5050565b6130c1838383613431565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613104576130ff81613436565b613143565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461314257613141838261347f565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561318657613181816135ec565b6131c5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131c4576131c382826136bd565b5b5b505050565b60006131eb8473ffffffffffffffffffffffffffffffffffffffff1661373c565b15613354578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613214612782565b8786866040518563ffffffff1660e01b81526004016132369493929190614524565b602060405180830381600087803b15801561325057600080fd5b505af192505050801561328157506040513d601f19601f8201168201806040525081019061327e9190613ec9565b60015b613304573d80600081146132b1576040519150601f19603f3d011682016040523d82523d6000602084013e6132b6565b606091505b506000815114156132fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f390614608565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613359565b600190505b949350505050565b60008082905060005b84518110156133cb57600085828151811061338857613387614e2d565b5b602002602001015190508083116133aa576133a3838261375f565b92506133b7565b6133b4818461375f565b92505b5080806133c390614ca9565b91505061336a565b508091505092915050565b6133e08383613776565b6133ed60008484846131ca565b61342c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342390614608565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161348c84611439565b6134969190614b45565b905060006007600084815260200190815260200160002054905081811461357b576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136009190614b45565b90506000600960008481526020019081526020016000205490506000600883815481106136305761362f614e2d565b5b90600052602060002001549050806008838154811061365257613651614e2d565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806136a1576136a0614dfe565b5b6001900381819060005260206000200160009055905550505050565b60006136c883611439565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137dd90614768565b60405180910390fd5b6137ef81612716565b1561382f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161382690614648565b60405180910390fd5b61383b600083836130b6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461388b9190614a64565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461395090614c46565b90600052602060002090601f01602090048101928261397257600085556139b9565b82601f1061398b57805160ff19168380011785556139b9565b828001600101855582156139b9579182015b828111156139b857825182559160200191906001019061399d565b5b5090506139c691906139ca565b5090565b5b808211156139e35760008160009055506001016139cb565b5090565b60006139fa6139f584614988565b614963565b90508083825260208201905082856020860282011115613a1d57613a1c614e90565b5b60005b85811015613a4d5781613a338882613b33565b845260208401935060208301925050600181019050613a20565b5050509392505050565b6000613a6a613a65846149b4565b614963565b905082815260208101848484011115613a8657613a85614e95565b5b613a91848285614c04565b509392505050565b6000613aac613aa7846149e5565b614963565b905082815260208101848484011115613ac857613ac7614e95565b5b613ad3848285614c04565b509392505050565b600081359050613aea81615555565b92915050565b600082601f830112613b0557613b04614e8b565b5b8135613b158482602086016139e7565b91505092915050565b600081359050613b2d8161556c565b92915050565b600081359050613b4281615583565b92915050565b600081359050613b578161559a565b92915050565b600081519050613b6c8161559a565b92915050565b600082601f830112613b8757613b86614e8b565b5b8135613b97848260208601613a57565b91505092915050565b600082601f830112613bb557613bb4614e8b565b5b8135613bc5848260208601613a99565b91505092915050565b600081359050613bdd816155b1565b92915050565b600060208284031215613bf957613bf8614e9f565b5b6000613c0784828501613adb565b91505092915050565b60008060408385031215613c2757613c26614e9f565b5b6000613c3585828601613adb565b9250506020613c4685828601613adb565b9150509250929050565b600080600060608486031215613c6957613c68614e9f565b5b6000613c7786828701613adb565b9350506020613c8886828701613adb565b9250506040613c9986828701613bce565b9150509250925092565b60008060008060808587031215613cbd57613cbc614e9f565b5b6000613ccb87828801613adb565b9450506020613cdc87828801613adb565b9350506040613ced87828801613bce565b925050606085013567ffffffffffffffff811115613d0e57613d0d614e9a565b5b613d1a87828801613b72565b91505092959194509250565b60008060408385031215613d3d57613d3c614e9f565b5b6000613d4b85828601613adb565b9250506020613d5c85828601613b1e565b9150509250929050565b60008060408385031215613d7d57613d7c614e9f565b5b6000613d8b85828601613adb565b9250506020613d9c85828601613bce565b9150509250929050565b600060208284031215613dbc57613dbb614e9f565b5b600082013567ffffffffffffffff811115613dda57613dd9614e9a565b5b613de684828501613af0565b91505092915050565b600060208284031215613e0557613e04614e9f565b5b6000613e1384828501613b1e565b91505092915050565b600080600060608486031215613e3557613e34614e9f565b5b6000613e4386828701613b1e565b9350506020613e5486828701613bce565b9250506040613e6586828701613bce565b9150509250925092565b600060208284031215613e8557613e84614e9f565b5b6000613e9384828501613b33565b91505092915050565b600060208284031215613eb257613eb1614e9f565b5b6000613ec084828501613b48565b91505092915050565b600060208284031215613edf57613ede614e9f565b5b6000613eed84828501613b5d565b91505092915050565b600060208284031215613f0c57613f0b614e9f565b5b600082013567ffffffffffffffff811115613f2a57613f29614e9a565b5b613f3684828501613ba0565b91505092915050565b600060208284031215613f5557613f54614e9f565b5b6000613f6384828501613bce565b91505092915050565b60008060408385031215613f8357613f82614e9f565b5b6000613f9185828601613bce565b925050602083013567ffffffffffffffff811115613fb257613fb1614e9a565b5b613fbe85828601613af0565b9150509250929050565b613fd181614b79565b82525050565b613fe8613fe382614b79565b614d1c565b82525050565b613ff781614b8b565b82525050565b61400681614b97565b82525050565b600061401782614a16565b6140218185614a2c565b9350614031818560208601614c13565b61403a81614ea4565b840191505092915050565b600061405082614a21565b61405a8185614a48565b935061406a818560208601614c13565b61407381614ea4565b840191505092915050565b600061408982614a21565b6140938185614a59565b93506140a3818560208601614c13565b80840191505092915050565b60006140bc600b83614a48565b91506140c782614ec2565b602082019050919050565b60006140df602b83614a48565b91506140ea82614eeb565b604082019050919050565b6000614102603283614a48565b915061410d82614f3a565b604082019050919050565b6000614125602683614a48565b915061413082614f89565b604082019050919050565b6000614148601c83614a48565b915061415382614fd8565b602082019050919050565b600061416b602483614a48565b915061417682615001565b604082019050919050565b600061418e601983614a48565b915061419982615050565b602082019050919050565b60006141b1600983614a48565b91506141bc82615079565b602082019050919050565b60006141d4602c83614a48565b91506141df826150a2565b604082019050919050565b60006141f7600d83614a48565b9150614202826150f1565b602082019050919050565b600061421a603883614a48565b91506142258261511a565b604082019050919050565b600061423d602a83614a48565b915061424882615169565b604082019050919050565b6000614260602983614a48565b915061426b826151b8565b604082019050919050565b6000614283602083614a48565b915061428e82615207565b602082019050919050565b60006142a6602c83614a48565b91506142b182615230565b604082019050919050565b60006142c9602083614a48565b91506142d48261527f565b602082019050919050565b60006142ec602983614a48565b91506142f7826152a8565b604082019050919050565b600061430f602f83614a48565b915061431a826152f7565b604082019050919050565b6000614332601183614a48565b915061433d82615346565b602082019050919050565b6000614355602183614a48565b91506143608261536f565b604082019050919050565b6000614378600e83614a48565b9150614383826153be565b602082019050919050565b600061439b601283614a48565b91506143a6826153e7565b602082019050919050565b60006143be600083614a3d565b91506143c982615410565b600082019050919050565b60006143e1601083614a48565b91506143ec82615413565b602082019050919050565b6000614404603183614a48565b915061440f8261543c565b604082019050919050565b6000614427602c83614a48565b91506144328261548b565b604082019050919050565b600061444a600d83614a48565b9150614455826154da565b602082019050919050565b600061446d600c83614a48565b915061447882615503565b602082019050919050565b6000614490600883614a48565b915061449b8261552c565b602082019050919050565b6144af81614bed565b82525050565b60006144c18284613fd7565b60148201915081905092915050565b60006144dc828561407e565b91506144e8828461407e565b91508190509392505050565b60006144ff826143b1565b9150819050919050565b600060208201905061451e6000830184613fc8565b92915050565b60006080820190506145396000830187613fc8565b6145466020830186613fc8565b61455360408301856144a6565b8181036060830152614565818461400c565b905095945050505050565b60006020820190506145856000830184613fee565b92915050565b60006020820190506145a06000830184613ffd565b92915050565b600060208201905081810360008301526145c08184614045565b905092915050565b600060208201905081810360008301526145e1816140af565b9050919050565b60006020820190508181036000830152614601816140d2565b9050919050565b60006020820190508181036000830152614621816140f5565b9050919050565b6000602082019050818103600083015261464181614118565b9050919050565b600060208201905081810360008301526146618161413b565b9050919050565b600060208201905081810360008301526146818161415e565b9050919050565b600060208201905081810360008301526146a181614181565b9050919050565b600060208201905081810360008301526146c1816141a4565b9050919050565b600060208201905081810360008301526146e1816141c7565b9050919050565b60006020820190508181036000830152614701816141ea565b9050919050565b600060208201905081810360008301526147218161420d565b9050919050565b6000602082019050818103600083015261474181614230565b9050919050565b6000602082019050818103600083015261476181614253565b9050919050565b6000602082019050818103600083015261478181614276565b9050919050565b600060208201905081810360008301526147a181614299565b9050919050565b600060208201905081810360008301526147c1816142bc565b9050919050565b600060208201905081810360008301526147e1816142df565b9050919050565b6000602082019050818103600083015261480181614302565b9050919050565b6000602082019050818103600083015261482181614325565b9050919050565b6000602082019050818103600083015261484181614348565b9050919050565b600060208201905081810360008301526148618161436b565b9050919050565b600060208201905081810360008301526148818161438e565b9050919050565b600060208201905081810360008301526148a1816143d4565b9050919050565b600060208201905081810360008301526148c1816143f7565b9050919050565b600060208201905081810360008301526148e18161441a565b9050919050565b600060208201905081810360008301526149018161443d565b9050919050565b6000602082019050818103600083015261492181614460565b9050919050565b6000602082019050818103600083015261494181614483565b9050919050565b600060208201905061495d60008301846144a6565b92915050565b600061496d61497e565b90506149798282614c78565b919050565b6000604051905090565b600067ffffffffffffffff8211156149a3576149a2614e5c565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156149cf576149ce614e5c565b5b6149d882614ea4565b9050602081019050919050565b600067ffffffffffffffff821115614a00576149ff614e5c565b5b614a0982614ea4565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a6f82614bed565b9150614a7a83614bed565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614aaf57614aae614d71565b5b828201905092915050565b6000614ac582614bed565b9150614ad083614bed565b925082614ae057614adf614da0565b5b828204905092915050565b6000614af682614bed565b9150614b0183614bed565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b3a57614b39614d71565b5b828202905092915050565b6000614b5082614bed565b9150614b5b83614bed565b925082821015614b6e57614b6d614d71565b5b828203905092915050565b6000614b8482614bcd565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614c31578082015181840152602081019050614c16565b83811115614c40576000848401525b50505050565b60006002820490506001821680614c5e57607f821691505b60208210811415614c7257614c71614dcf565b5b50919050565b614c8182614ea4565b810181811067ffffffffffffffff82111715614ca057614c9f614e5c565b5b80604052505050565b6000614cb482614bed565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ce757614ce6614d71565b5b600182019050919050565b6000614cfd82614bf7565b915060ff821415614d1157614d10614d71565b5b600182019050919050565b6000614d2782614d2e565b9050919050565b6000614d3982614eb5565b9050919050565b6000614d4b82614bed565b9150614d5683614bed565b925082614d6657614d65614da0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4d617869756d2069732032000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4d6178206c696d69740000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d617869756d2069732031303000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f56616c75652062656c6f77207072696365000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c6573206e6f74206f70656e000000000000000000000000000000000000600082015250565b7f4d6178206c696d697420612077616c6c65740000000000000000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b7f4d617869756d2069732031300000000000000000000000000000000000000000600082015250565b7f536f6c646f757421000000000000000000000000000000000000000000000000600082015250565b61555e81614b79565b811461556957600080fd5b50565b61557581614b8b565b811461558057600080fd5b50565b61558c81614b97565b811461559757600080fd5b50565b6155a381614ba1565b81146155ae57600080fd5b50565b6155ba81614bed565b81146155c557600080fd5b5056fea2646970667358221220f7d395dee1fe3aec9a8dc879cdf4db8d93e963ad64850fc7db564e140b1769b164736f6c63430008070033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d6639353332484331437a7253676445657248664e354d62686e43745642425347325a666f5a334c4c7265584e2f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a68747470733a2f2f697066732e696f2f697066732f516d5670544e50375857395a6a6b6867426d5a674d7146665a534b62334e7a4e48415146446936357657344445682f72657665616c00000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061027d5760003560e01c80637f81be691161014f578063bedb86fb116100c1578063e2b4db971161007a578063e2b4db9714610990578063e927fc5c146109b9578063e985e9c5146109e4578063ed475f6314610a21578063ee53408314610a5e578063f2fde38b14610a895761027d565b8063bedb86fb1461088d578063bf7b766d146108b6578063c7427093146108e1578063c87b56dd1461090c578063d2cab05614610949578063d547cfb7146109655761027d565b806391b7f5ed1161011357806391b7f5ed1461079357806395d89b41146107bc578063a22cb465146107e7578063b88d4fde14610810578063b8ea3cb014610839578063bc13a688146108625761027d565b80637f81be69146106c0578063853828b6146106fd57806389ece941146107145780638d859f3e1461073d5780638da5cb5b146107685761027d565b80632eb4a7ab116101f35780635d7cf6a3116101ac5780635d7cf6a31461059e578063626be567146105db5780636352211e1461060657806370a0823114610643578063715018a6146106805780637cb64759146106975761027d565b80632eb4a7ab1461047c5780632f745c59146104a75780633502a716146104e457806342842e0e1461050f5780634f6ccce71461053857806355f804b3146105755761027d565b806312c2449f1161024557806312c2449f1461037b57806317fb8594146103a457806318160ddd146103c05780631ec858ec146103eb57806323b872dd1461041657806326a49e371461043f5761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b314610327578063103c4b5314610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613e9c565b610ab2565b6040516102b69190614570565b60405180910390f35b3480156102cb57600080fd5b506102d4610b2c565b6040516102e191906145a6565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c9190613f3f565b610bbe565b60405161031e9190614509565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613d66565b610c43565b005b34801561035c57600080fd5b50610365610d5b565b60405161037291906145a6565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d9190613e1c565b610de9565b005b6103be60048036038101906103b99190613f3f565b610e92565b005b3480156103cc57600080fd5b506103d56110f5565b6040516103e29190614948565b60405180910390f35b3480156103f757600080fd5b50610400611102565b60405161040d9190614948565b60405180910390f35b34801561042257600080fd5b5061043d60048036038101906104389190613c50565b611108565b005b34801561044b57600080fd5b5061046660048036038101906104619190613f3f565b611168565b6040516104739190614948565b60405180910390f35b34801561048857600080fd5b50610491611186565b60405161049e919061458b565b60405180910390f35b3480156104b357600080fd5b506104ce60048036038101906104c99190613d66565b61118c565b6040516104db9190614948565b60405180910390f35b3480156104f057600080fd5b506104f9611231565b6040516105069190614948565b60405180910390f35b34801561051b57600080fd5b5061053660048036038101906105319190613c50565b611237565b005b34801561054457600080fd5b5061055f600480360381019061055a9190613f3f565b611257565b60405161056c9190614948565b60405180910390f35b34801561058157600080fd5b5061059c60048036038101906105979190613ef6565b6112c8565b005b3480156105aa57600080fd5b506105c560048036038101906105c09190613be3565b61135e565b6040516105d29190614948565b60405180910390f35b3480156105e757600080fd5b506105f0611376565b6040516105fd9190614948565b60405180910390f35b34801561061257600080fd5b5061062d60048036038101906106289190613f3f565b611387565b60405161063a9190614509565b60405180910390f35b34801561064f57600080fd5b5061066a60048036038101906106659190613be3565b611439565b6040516106779190614948565b60405180910390f35b34801561068c57600080fd5b506106956114f1565b005b3480156106a357600080fd5b506106be60048036038101906106b99190613e6f565b611579565b005b3480156106cc57600080fd5b506106e760048036038101906106e29190613f3f565b6115ff565b6040516106f49190614509565b60405180910390f35b34801561070957600080fd5b5061071261163c565b005b34801561072057600080fd5b5061073b60048036038101906107369190613ef6565b6116eb565b005b34801561074957600080fd5b50610752611781565b60405161075f9190614948565b60405180910390f35b34801561077457600080fd5b5061077d611787565b60405161078a9190614509565b60405180910390f35b34801561079f57600080fd5b506107ba60048036038101906107b59190613f3f565b6117b1565b005b3480156107c857600080fd5b506107d1611870565b6040516107de91906145a6565b60405180910390f35b3480156107f357600080fd5b5061080e60048036038101906108099190613d26565b611902565b005b34801561081c57600080fd5b5061083760048036038101906108329190613ca3565b611a83565b005b34801561084557600080fd5b50610860600480360381019061085b9190613f3f565b611ae5565b005b34801561086e57600080fd5b50610877611ba4565b6040516108849190614570565b60405180910390f35b34801561089957600080fd5b506108b460048036038101906108af9190613def565b611bb7565b005b3480156108c257600080fd5b506108cb611c96565b6040516108d89190614948565b60405180910390f35b3480156108ed57600080fd5b506108f6611c9b565b6040516109039190614948565b60405180910390f35b34801561091857600080fd5b50610933600480360381019061092e9190613f3f565b611ca1565b60405161094091906145a6565b60405180910390f35b610963600480360381019061095e9190613f6c565b611e0d565b005b34801561097157600080fd5b5061097a6120e9565b60405161098791906145a6565b60405180910390f35b34801561099c57600080fd5b506109b760048036038101906109b29190613f3f565b612177565b005b3480156109c557600080fd5b506109ce61240b565b6040516109db9190614509565b60405180910390f35b3480156109f057600080fd5b50610a0b6004803603810190610a069190613c10565b612423565b604051610a189190614570565b60405180910390f35b348015610a2d57600080fd5b50610a486004803603810190610a439190613da6565b6124b7565b604051610a559190614570565b60405180910390f35b348015610a6a57600080fd5b50610a736124f8565b604051610a809190614948565b60405180910390f35b348015610a9557600080fd5b50610ab06004803603810190610aab9190613be3565b61253c565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b255750610b2482612634565b5b9050919050565b606060008054610b3b90614c46565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6790614c46565b8015610bb45780601f10610b8957610100808354040283529160200191610bb4565b820191906000526020600020905b815481529060010190602001808311610b9757829003601f168201915b5050505050905090565b6000610bc982612716565b610c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bff90614788565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c4e82611387565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb690614828565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cde612782565b73ffffffffffffffffffffffffffffffffffffffff161480610d0d5750610d0c81610d07612782565b612423565b5b610d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4390614708565b60405180910390fd5b610d56838361278a565b505050565b60138054610d6890614c46565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9490614c46565b8015610de15780601f10610db657610100808354040283529160200191610de1565b820191906000526020600020905b815481529060010190602001808311610dc457829003601f168201915b505050505081565b610df1612782565b73ffffffffffffffffffffffffffffffffffffffff16610e0f611787565b73ffffffffffffffffffffffffffffffffffffffff1614610e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5c906147a8565b60405180910390fd5b82601060006101000a81548160ff0219169083151502179055508160118190555080601281905550505050565b600b54610e9d611376565b1115610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed590614928565b60405180910390fd5b600d60009054906101000a900460ff1615610f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2590614848565b60405180910390fd5b6000610f38611376565b90506002821115610f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7590614868565b60405180910390fd5b600282601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610fcb9190614a64565b111561100c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611003906145c8565b60405180910390fd5b600b54828261101b9190614a64565b111561105c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611053906146a8565b60405180910390fd5b61106582611168565b3410156110a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109e90614808565b60405180910390fd5b60006110b1612782565b90506000600190505b838160ff16116110ef576110dc828260ff16856110d79190614a64565b612843565b80806110e790614cf2565b9150506110ba565b50505050565b6000600880549050905090565b60115481565b611119611113612782565b826128dd565b611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f906148a8565b60405180910390fd5b6111638383836129bb565b505050565b600061117f82600c54612c1790919063ffffffff16565b9050919050565b60155481565b600061119783611439565b82106111d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cf906145e8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b5481565b61125283838360405180602001604052806000815250611a83565b505050565b60006112616110f5565b82106112a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611299906148c8565b60405180910390fd5b600882815481106112b6576112b5614e2d565b5b90600052602060002001549050919050565b6112d0612782565b73ffffffffffffffffffffffffffffffffffffffff166112ee611787565b73ffffffffffffffffffffffffffffffffffffffff1614611344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133b906147a8565b60405180910390fd5b80600f908051906020019061135a929190613944565b5050565b60146020528060005260406000206000915090505481565b6000611382600e612c2d565b905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142790614748565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a190614728565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114f9612782565b73ffffffffffffffffffffffffffffffffffffffff16611517611787565b73ffffffffffffffffffffffffffffffffffffffff161461156d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611564906147a8565b60405180910390fd5b6115776000612c3b565b565b611581612782565b73ffffffffffffffffffffffffffffffffffffffff1661159f611787565b73ffffffffffffffffffffffffffffffffffffffff16146115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec906147a8565b60405180910390fd5b8060158190555050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611644612782565b73ffffffffffffffffffffffffffffffffffffffff16611662611787565b73ffffffffffffffffffffffffffffffffffffffff16146116b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116af906147a8565b60405180910390fd5b6000479050600081116116ca57600080fd5b6116e87312673391a96ec59a7d2c56c555eafe51a3c543cf47612d01565b50565b6116f3612782565b73ffffffffffffffffffffffffffffffffffffffff16611711611787565b73ffffffffffffffffffffffffffffffffffffffff1614611767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175e906147a8565b60405180910390fd5b806013908051906020019061177d929190613944565b5050565b600c5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117b9612782565b73ffffffffffffffffffffffffffffffffffffffff166117d7611787565b73ffffffffffffffffffffffffffffffffffffffff161461182d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611824906147a8565b60405180910390fd5b80600c819055507f0e4af3870af723022c49a1ebcf7379a14fa7732c2dc92925407b8d219116a26b600c546040516118659190614948565b60405180910390a150565b60606001805461187f90614c46565b80601f01602080910402602001604051908101604052809291908181526020018280546118ab90614c46565b80156118f85780601f106118cd576101008083540402835291602001916118f8565b820191906000526020600020905b8154815290600101906020018083116118db57829003601f168201915b5050505050905090565b61190a612782565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196f90614688565b60405180910390fd5b8060056000611985612782565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a32612782565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a779190614570565b60405180910390a35050565b611a94611a8e612782565b836128dd565b611ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aca906148a8565b60405180910390fd5b611adf84848484612db2565b50505050565b611aed612782565b73ffffffffffffffffffffffffffffffffffffffff16611b0b611787565b73ffffffffffffffffffffffffffffffffffffffff1614611b61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b58906147a8565b60405180910390fd5b80600b819055507fc83d13efd20405bd69a6e26fd71d067b31246b9fe9ad2b945536dd1770330d48600b54604051611b999190614948565b60405180910390a150565b601060009054906101000a900460ff1681565b611bbf612782565b73ffffffffffffffffffffffffffffffffffffffff16611bdd611787565b73ffffffffffffffffffffffffffffffffffffffff1614611c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2a906147a8565b60405180910390fd5b80600d60006101000a81548160ff0219169083151502179055507f10e1c3fcaff06b68391033547e8f9bb8067d7c4a2e32659b0629153814d242d3600d60009054906101000a900460ff16604051611c8b9190614570565b60405180910390a150565b600181565b60125481565b6060611cac82612716565b611ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce2906147e8565b60405180910390fd5b601060009054906101000a900460ff16158015611d0a57506011548210155b8015611d1857506012548211155b15611daf5760138054611d2a90614c46565b80601f0160208091040260200160405190810160405280929190818152602001828054611d5690614c46565b8015611da35780601f10611d7857610100808354040283529160200191611da3565b820191906000526020600020905b815481529060010190602001808311611d8657829003601f168201915b50505050509050611e08565b6000611db9612e0e565b90506000815111611dd95760405180602001604052806000815250611e04565b80611de384612ea0565b604051602001611df49291906144d0565b6040516020818303038152906040525b9150505b919050565b600b54611e18611376565b1115611e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5090614928565b60405180910390fd5b600d60009054906101000a900460ff1615611ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea090614848565b60405180910390fd5b600033604051602001611ebc91906144b5565b604051602081830303815290604052805190602001209050611ee18260155483613001565b611f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f17906148e8565b60405180910390fd5b6000611f2a611376565b9050600a841115611f70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6790614868565b60405180910390fd5b600a84601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fbd9190614a64565b1115611ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff590614908565b60405180910390fd5b611d4c848261200d9190614a64565b111561204e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612045906146a8565b60405180910390fd5b61205784611168565b341015612099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209090614808565b60405180910390fd5b60006120a3612782565b90506000600190505b858160ff16116120e1576120ce828260ff16856120c99190614a64565b612843565b80806120d990614cf2565b9150506120ac565b505050505050565b600f80546120f690614c46565b80601f016020809104026020016040519081016040528092919081815260200182805461212290614c46565b801561216f5780601f106121445761010080835404028352916020019161216f565b820191906000526020600020905b81548152906001019060200180831161215257829003601f168201915b505050505081565b61217f612782565b73ffffffffffffffffffffffffffffffffffffffff1661219d611787565b73ffffffffffffffffffffffffffffffffffffffff16146121f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ea906147a8565b60405180910390fd5b600b546121fe611376565b111561223f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223690614928565b60405180910390fd5b600d60009054906101000a900460ff161561228f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228690614848565b60405180910390fd5b6000612299611376565b905060648211156122df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d690614868565b60405180910390fd5b606482601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461232c9190614a64565b111561236d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612364906146e8565b60405180910390fd5b600b54828261237c9190614a64565b11156123bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b4906146a8565b60405180910390fd5b60006123c7612782565b90506000600190505b838160ff1611612405576123f2828260ff16856123ed9190614a64565b612843565b80806123fd90614cf2565b9150506123d0565b50505050565b7312673391a96ec59a7d2c56c555eafe51a3c543cf81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080336040516020016124cb91906144b5565b6040516020818303038152906040528051906020012090506124f08360155483613001565b915050919050565b600063629cc46442101561250f5760009050612539565b63629cc4644210158015612526575063629e15e442105b156125345760019050612539565b600290505b90565b612544612782565b73ffffffffffffffffffffffffffffffffffffffff16612562611787565b73ffffffffffffffffffffffffffffffffffffffff16146125b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125af906147a8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261f90614628565b60405180910390fd5b61263181612c3b565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126ff57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061270f575061270e82613018565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127fd83611387565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61284d600e613082565b601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061289d90614ca9565b91905055506128ac8282613098565b807f7de9ff3a06537ba46c8a2243263d06a06584838cb3077f70fb2d379fa82b5c7c60405160405180910390a25050565b60006128e882612716565b612927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291e906146c8565b60405180910390fd5b600061293283611387565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806129a157508373ffffffffffffffffffffffffffffffffffffffff1661298984610bbe565b73ffffffffffffffffffffffffffffffffffffffff16145b806129b257506129b18185612423565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129db82611387565b73ffffffffffffffffffffffffffffffffffffffff1614612a31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a28906147c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9890614668565b60405180910390fd5b612aac8383836130b6565b612ab760008261278a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b079190614b45565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b5e9190614a64565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612c259190614aeb565b905092915050565b600081600001549050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612d27906144f4565b60006040518083038185875af1925050503d8060008114612d64576040519150601f19603f3d011682016040523d82523d6000602084013e612d69565b606091505b5050905080612dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da490614888565b60405180910390fd5b505050565b612dbd8484846129bb565b612dc9848484846131ca565b612e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dff90614608565b60405180910390fd5b50505050565b6060600f8054612e1d90614c46565b80601f0160208091040260200160405190810160405280929190818152602001828054612e4990614c46565b8015612e965780601f10612e6b57610100808354040283529160200191612e96565b820191906000526020600020905b815481529060010190602001808311612e7957829003601f168201915b5050505050905090565b60606000821415612ee8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ffc565b600082905060005b60008214612f1a578080612f0390614ca9565b915050600a82612f139190614aba565b9150612ef0565b60008167ffffffffffffffff811115612f3657612f35614e5c565b5b6040519080825280601f01601f191660200182016040528015612f685781602001600182028036833780820191505090505b5090505b60008514612ff557600182612f819190614b45565b9150600a85612f909190614d40565b6030612f9c9190614a64565b60f81b818381518110612fb257612fb1614e2d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612fee9190614aba565b9450612f6c565b8093505050505b919050565b60008261300e8584613361565b1490509392505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6001816000016000828254019250508190555050565b6130b28282604051806020016040528060008152506133d6565b5050565b6130c1838383613431565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613104576130ff81613436565b613143565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461314257613141838261347f565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561318657613181816135ec565b6131c5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131c4576131c382826136bd565b5b5b505050565b60006131eb8473ffffffffffffffffffffffffffffffffffffffff1661373c565b15613354578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613214612782565b8786866040518563ffffffff1660e01b81526004016132369493929190614524565b602060405180830381600087803b15801561325057600080fd5b505af192505050801561328157506040513d601f19601f8201168201806040525081019061327e9190613ec9565b60015b613304573d80600081146132b1576040519150601f19603f3d011682016040523d82523d6000602084013e6132b6565b606091505b506000815114156132fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f390614608565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613359565b600190505b949350505050565b60008082905060005b84518110156133cb57600085828151811061338857613387614e2d565b5b602002602001015190508083116133aa576133a3838261375f565b92506133b7565b6133b4818461375f565b92505b5080806133c390614ca9565b91505061336a565b508091505092915050565b6133e08383613776565b6133ed60008484846131ca565b61342c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342390614608565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161348c84611439565b6134969190614b45565b905060006007600084815260200190815260200160002054905081811461357b576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136009190614b45565b90506000600960008481526020019081526020016000205490506000600883815481106136305761362f614e2d565b5b90600052602060002001549050806008838154811061365257613651614e2d565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806136a1576136a0614dfe565b5b6001900381819060005260206000200160009055905550505050565b60006136c883611439565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137dd90614768565b60405180910390fd5b6137ef81612716565b1561382f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161382690614648565b60405180910390fd5b61383b600083836130b6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461388b9190614a64565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461395090614c46565b90600052602060002090601f01602090048101928261397257600085556139b9565b82601f1061398b57805160ff19168380011785556139b9565b828001600101855582156139b9579182015b828111156139b857825182559160200191906001019061399d565b5b5090506139c691906139ca565b5090565b5b808211156139e35760008160009055506001016139cb565b5090565b60006139fa6139f584614988565b614963565b90508083825260208201905082856020860282011115613a1d57613a1c614e90565b5b60005b85811015613a4d5781613a338882613b33565b845260208401935060208301925050600181019050613a20565b5050509392505050565b6000613a6a613a65846149b4565b614963565b905082815260208101848484011115613a8657613a85614e95565b5b613a91848285614c04565b509392505050565b6000613aac613aa7846149e5565b614963565b905082815260208101848484011115613ac857613ac7614e95565b5b613ad3848285614c04565b509392505050565b600081359050613aea81615555565b92915050565b600082601f830112613b0557613b04614e8b565b5b8135613b158482602086016139e7565b91505092915050565b600081359050613b2d8161556c565b92915050565b600081359050613b4281615583565b92915050565b600081359050613b578161559a565b92915050565b600081519050613b6c8161559a565b92915050565b600082601f830112613b8757613b86614e8b565b5b8135613b97848260208601613a57565b91505092915050565b600082601f830112613bb557613bb4614e8b565b5b8135613bc5848260208601613a99565b91505092915050565b600081359050613bdd816155b1565b92915050565b600060208284031215613bf957613bf8614e9f565b5b6000613c0784828501613adb565b91505092915050565b60008060408385031215613c2757613c26614e9f565b5b6000613c3585828601613adb565b9250506020613c4685828601613adb565b9150509250929050565b600080600060608486031215613c6957613c68614e9f565b5b6000613c7786828701613adb565b9350506020613c8886828701613adb565b9250506040613c9986828701613bce565b9150509250925092565b60008060008060808587031215613cbd57613cbc614e9f565b5b6000613ccb87828801613adb565b9450506020613cdc87828801613adb565b9350506040613ced87828801613bce565b925050606085013567ffffffffffffffff811115613d0e57613d0d614e9a565b5b613d1a87828801613b72565b91505092959194509250565b60008060408385031215613d3d57613d3c614e9f565b5b6000613d4b85828601613adb565b9250506020613d5c85828601613b1e565b9150509250929050565b60008060408385031215613d7d57613d7c614e9f565b5b6000613d8b85828601613adb565b9250506020613d9c85828601613bce565b9150509250929050565b600060208284031215613dbc57613dbb614e9f565b5b600082013567ffffffffffffffff811115613dda57613dd9614e9a565b5b613de684828501613af0565b91505092915050565b600060208284031215613e0557613e04614e9f565b5b6000613e1384828501613b1e565b91505092915050565b600080600060608486031215613e3557613e34614e9f565b5b6000613e4386828701613b1e565b9350506020613e5486828701613bce565b9250506040613e6586828701613bce565b9150509250925092565b600060208284031215613e8557613e84614e9f565b5b6000613e9384828501613b33565b91505092915050565b600060208284031215613eb257613eb1614e9f565b5b6000613ec084828501613b48565b91505092915050565b600060208284031215613edf57613ede614e9f565b5b6000613eed84828501613b5d565b91505092915050565b600060208284031215613f0c57613f0b614e9f565b5b600082013567ffffffffffffffff811115613f2a57613f29614e9a565b5b613f3684828501613ba0565b91505092915050565b600060208284031215613f5557613f54614e9f565b5b6000613f6384828501613bce565b91505092915050565b60008060408385031215613f8357613f82614e9f565b5b6000613f9185828601613bce565b925050602083013567ffffffffffffffff811115613fb257613fb1614e9a565b5b613fbe85828601613af0565b9150509250929050565b613fd181614b79565b82525050565b613fe8613fe382614b79565b614d1c565b82525050565b613ff781614b8b565b82525050565b61400681614b97565b82525050565b600061401782614a16565b6140218185614a2c565b9350614031818560208601614c13565b61403a81614ea4565b840191505092915050565b600061405082614a21565b61405a8185614a48565b935061406a818560208601614c13565b61407381614ea4565b840191505092915050565b600061408982614a21565b6140938185614a59565b93506140a3818560208601614c13565b80840191505092915050565b60006140bc600b83614a48565b91506140c782614ec2565b602082019050919050565b60006140df602b83614a48565b91506140ea82614eeb565b604082019050919050565b6000614102603283614a48565b915061410d82614f3a565b604082019050919050565b6000614125602683614a48565b915061413082614f89565b604082019050919050565b6000614148601c83614a48565b915061415382614fd8565b602082019050919050565b600061416b602483614a48565b915061417682615001565b604082019050919050565b600061418e601983614a48565b915061419982615050565b602082019050919050565b60006141b1600983614a48565b91506141bc82615079565b602082019050919050565b60006141d4602c83614a48565b91506141df826150a2565b604082019050919050565b60006141f7600d83614a48565b9150614202826150f1565b602082019050919050565b600061421a603883614a48565b91506142258261511a565b604082019050919050565b600061423d602a83614a48565b915061424882615169565b604082019050919050565b6000614260602983614a48565b915061426b826151b8565b604082019050919050565b6000614283602083614a48565b915061428e82615207565b602082019050919050565b60006142a6602c83614a48565b91506142b182615230565b604082019050919050565b60006142c9602083614a48565b91506142d48261527f565b602082019050919050565b60006142ec602983614a48565b91506142f7826152a8565b604082019050919050565b600061430f602f83614a48565b915061431a826152f7565b604082019050919050565b6000614332601183614a48565b915061433d82615346565b602082019050919050565b6000614355602183614a48565b91506143608261536f565b604082019050919050565b6000614378600e83614a48565b9150614383826153be565b602082019050919050565b600061439b601283614a48565b91506143a6826153e7565b602082019050919050565b60006143be600083614a3d565b91506143c982615410565b600082019050919050565b60006143e1601083614a48565b91506143ec82615413565b602082019050919050565b6000614404603183614a48565b915061440f8261543c565b604082019050919050565b6000614427602c83614a48565b91506144328261548b565b604082019050919050565b600061444a600d83614a48565b9150614455826154da565b602082019050919050565b600061446d600c83614a48565b915061447882615503565b602082019050919050565b6000614490600883614a48565b915061449b8261552c565b602082019050919050565b6144af81614bed565b82525050565b60006144c18284613fd7565b60148201915081905092915050565b60006144dc828561407e565b91506144e8828461407e565b91508190509392505050565b60006144ff826143b1565b9150819050919050565b600060208201905061451e6000830184613fc8565b92915050565b60006080820190506145396000830187613fc8565b6145466020830186613fc8565b61455360408301856144a6565b8181036060830152614565818461400c565b905095945050505050565b60006020820190506145856000830184613fee565b92915050565b60006020820190506145a06000830184613ffd565b92915050565b600060208201905081810360008301526145c08184614045565b905092915050565b600060208201905081810360008301526145e1816140af565b9050919050565b60006020820190508181036000830152614601816140d2565b9050919050565b60006020820190508181036000830152614621816140f5565b9050919050565b6000602082019050818103600083015261464181614118565b9050919050565b600060208201905081810360008301526146618161413b565b9050919050565b600060208201905081810360008301526146818161415e565b9050919050565b600060208201905081810360008301526146a181614181565b9050919050565b600060208201905081810360008301526146c1816141a4565b9050919050565b600060208201905081810360008301526146e1816141c7565b9050919050565b60006020820190508181036000830152614701816141ea565b9050919050565b600060208201905081810360008301526147218161420d565b9050919050565b6000602082019050818103600083015261474181614230565b9050919050565b6000602082019050818103600083015261476181614253565b9050919050565b6000602082019050818103600083015261478181614276565b9050919050565b600060208201905081810360008301526147a181614299565b9050919050565b600060208201905081810360008301526147c1816142bc565b9050919050565b600060208201905081810360008301526147e1816142df565b9050919050565b6000602082019050818103600083015261480181614302565b9050919050565b6000602082019050818103600083015261482181614325565b9050919050565b6000602082019050818103600083015261484181614348565b9050919050565b600060208201905081810360008301526148618161436b565b9050919050565b600060208201905081810360008301526148818161438e565b9050919050565b600060208201905081810360008301526148a1816143d4565b9050919050565b600060208201905081810360008301526148c1816143f7565b9050919050565b600060208201905081810360008301526148e18161441a565b9050919050565b600060208201905081810360008301526149018161443d565b9050919050565b6000602082019050818103600083015261492181614460565b9050919050565b6000602082019050818103600083015261494181614483565b9050919050565b600060208201905061495d60008301846144a6565b92915050565b600061496d61497e565b90506149798282614c78565b919050565b6000604051905090565b600067ffffffffffffffff8211156149a3576149a2614e5c565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156149cf576149ce614e5c565b5b6149d882614ea4565b9050602081019050919050565b600067ffffffffffffffff821115614a00576149ff614e5c565b5b614a0982614ea4565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a6f82614bed565b9150614a7a83614bed565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614aaf57614aae614d71565b5b828201905092915050565b6000614ac582614bed565b9150614ad083614bed565b925082614ae057614adf614da0565b5b828204905092915050565b6000614af682614bed565b9150614b0183614bed565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b3a57614b39614d71565b5b828202905092915050565b6000614b5082614bed565b9150614b5b83614bed565b925082821015614b6e57614b6d614d71565b5b828203905092915050565b6000614b8482614bcd565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614c31578082015181840152602081019050614c16565b83811115614c40576000848401525b50505050565b60006002820490506001821680614c5e57607f821691505b60208210811415614c7257614c71614dcf565b5b50919050565b614c8182614ea4565b810181811067ffffffffffffffff82111715614ca057614c9f614e5c565b5b80604052505050565b6000614cb482614bed565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ce757614ce6614d71565b5b600182019050919050565b6000614cfd82614bf7565b915060ff821415614d1157614d10614d71565b5b600182019050919050565b6000614d2782614d2e565b9050919050565b6000614d3982614eb5565b9050919050565b6000614d4b82614bed565b9150614d5683614bed565b925082614d6657614d65614da0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4d617869756d2069732032000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4d6178206c696d69740000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d617869756d2069732031303000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f56616c75652062656c6f77207072696365000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c6573206e6f74206f70656e000000000000000000000000000000000000600082015250565b7f4d6178206c696d697420612077616c6c65740000000000000000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b7f4d617869756d2069732031300000000000000000000000000000000000000000600082015250565b7f536f6c646f757421000000000000000000000000000000000000000000000000600082015250565b61555e81614b79565b811461556957600080fd5b50565b61557581614b8b565b811461558057600080fd5b50565b61558c81614b97565b811461559757600080fd5b50565b6155a381614ba1565b81146155ae57600080fd5b50565b6155ba81614bed565b81146155c557600080fd5b5056fea2646970667358221220f7d395dee1fe3aec9a8dc879cdf4db8d93e963ad64850fc7db564e140b1769b164736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d6639353332484331437a7253676445657248664e354d62686e43745642425347325a666f5a334c4c7265584e2f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a68747470733a2f2f697066732e696f2f697066732f516d5670544e50375857395a6a6b6867426d5a674d7146665a534b62334e7a4e48415146446936357657344445682f72657665616c00000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string): https://ipfs.io/ipfs/Qmf9532HC1CzrSgdEerHfN5MbhnCtVBBSG2ZfoZ3LLreXN/
Arg [1] : sampleURI (string): https://ipfs.io/ipfs/QmVpTNP7XW9ZjkhgBmZgMqFfZSKb3NzNHAQFDi65vW4DEh/reveal

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000044
Arg [3] : 68747470733a2f2f697066732e696f2f697066732f516d663935333248433143
Arg [4] : 7a7253676445657248664e354d62686e43745642425347325a666f5a334c4c72
Arg [5] : 65584e2f00000000000000000000000000000000000000000000000000000000
Arg [6] : 000000000000000000000000000000000000000000000000000000000000004a
Arg [7] : 68747470733a2f2f697066732e696f2f697066732f516d5670544e5037585739
Arg [8] : 5a6a6b6867426d5a674d7146665a534b62334e7a4e4841514644693635765734
Arg [9] : 4445682f72657665616c00000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

55506:5902:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34806:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21823:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23382:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22905:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56019:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60504:173;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58738:548;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35446:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55947:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24272:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60002:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56359:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35114:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55664:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24682:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35636:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56838:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56146:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57064:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21343:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21073:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43962:103;;;;;;;;;;;;;:::i;:::-;;61071:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21647:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60685:189;;;;;;;;;;;;;:::i;:::-;;56947:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55706:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43311:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60235:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21992:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23675:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24938:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60362:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55909:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60114:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55746:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55982:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57538:453;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57999:727;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55874:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59294:479;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56056:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24041:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61185:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57175:355;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44220:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34806:224;34908:4;34947:35;34932:50;;;:11;:50;;;;:90;;;;34986:36;35010:11;34986:23;:36::i;:::-;34932:90;34925:97;;34806:224;;;:::o;21823:100::-;21877:13;21910:5;21903:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21823:100;:::o;23382:221::-;23458:7;23486:16;23494:7;23486;:16::i;:::-;23478:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23571:15;:24;23587:7;23571:24;;;;;;;;;;;;;;;;;;;;;23564:31;;23382:221;;;:::o;22905:411::-;22986:13;23002:23;23017:7;23002:14;:23::i;:::-;22986:39;;23050:5;23044:11;;:2;:11;;;;23036:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23144:5;23128:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23153:37;23170:5;23177:12;:10;:12::i;:::-;23153:16;:37::i;:::-;23128:62;23106:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23287:21;23296:2;23300:7;23287:8;:21::i;:::-;22975:341;22905:411;;:::o;56019:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60504:173::-;43542:12;:10;:12::i;:::-;43531:23;;:7;:5;:7::i;:::-;:23;;;43523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60610:7:::1;60596:11;;:21;;;;;;;;;;;;;;;;;;60640:5;60628:9;:17;;;;60666:3;60656:7;:13;;;;60504:173:::0;;;:::o;58738:548::-;56620:12;;56604;:10;:12::i;:::-;:28;;56596:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;56665:5;;;;;;;;;;;56664:6;56656:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;58817:13:::1;58833:12;:10;:12::i;:::-;58817:28;;58880:1;58864:12;:17;;58856:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;58963:1;58947:12;58923:9;:21;58933:10;58923:21;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:41;;58915:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;59023:12;;59007;58999:5;:20;;;;:::i;:::-;:36;;58991:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;59081:19;59087:12;59081:5;:19::i;:::-;59068:9;:32;;59060:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;59135:14;59152:12;:10;:12::i;:::-;59135:29;;59181:7;59191:1;59181:11;;59177:100;59199:12;59194:1;:17;;;59177:100;;59232:33;59247:6;59263:1;59255:9;;:5;:9;;;;:::i;:::-;59232:14;:33::i;:::-;59213:3;;;;;:::i;:::-;;;;59177:100;;;;58804:482;;58738:548:::0;:::o;35446:113::-;35507:7;35534:10;:17;;;;35527:24;;35446:113;:::o;55947:28::-;;;;:::o;24272:339::-;24467:41;24486:12;:10;:12::i;:::-;24500:7;24467:18;:41::i;:::-;24459:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24575:28;24585:4;24591:2;24595:7;24575:9;:28::i;:::-;24272:339;;;:::o;60002:104::-;60054:7;60081:17;60091:6;60081:5;;:9;;:17;;;;:::i;:::-;60074:24;;60002:104;;;:::o;56359:25::-;;;;:::o;35114:256::-;35211:7;35247:23;35264:5;35247:16;:23::i;:::-;35239:5;:31;35231:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35336:12;:19;35349:5;35336:19;;;;;;;;;;;;;;;:26;35356:5;35336:26;;;;;;;;;;;;35329:33;;35114:256;;;;:::o;55664:35::-;;;;:::o;24682:185::-;24820:39;24837:4;24843:2;24847:7;24820:39;;;;;;;;;;;;:16;:39::i;:::-;24682:185;;;:::o;35636:233::-;35711:7;35747:30;:28;:30::i;:::-;35739:5;:38;35731:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35844:10;35855:5;35844:17;;;;;;;;:::i;:::-;;;;;;;;;;35837:24;;35636:233;;;:::o;56838:101::-;43542:12;:10;:12::i;:::-;43531:23;;:7;:5;:7::i;:::-;:23;;;43523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56924:7:::1;56909:12;:22;;;;;;;;;;;;:::i;:::-;;56838:101:::0;:::o;56146:42::-;;;;;;;;;;;;;;;;;:::o;57064:103::-;57107:7;57134:25;:15;:23;:25::i;:::-;57127:32;;57064:103;:::o;21343:239::-;21415:7;21435:13;21451:7;:16;21459:7;21451:16;;;;;;;;;;;;;;;;;;;;;21435:32;;21503:1;21486:19;;:5;:19;;;;21478:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21569:5;21562:12;;;21343:239;;;:::o;21073:208::-;21145:7;21190:1;21173:19;;:5;:19;;;;21165:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21257:9;:16;21267:5;21257:16;;;;;;;;;;;;;;;;21250:23;;21073:208;;;:::o;43962:103::-;43542:12;:10;:12::i;:::-;43531:23;;:7;:5;:7::i;:::-;:23;;;43523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44027:30:::1;44054:1;44027:18;:30::i;:::-;43962:103::o:0;61071:106::-;43542:12;:10;:12::i;:::-;43531:23;;:7;:5;:7::i;:::-;:23;;;43523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61158:11:::1;61145:10;:24;;;;61071:106:::0;:::o;21647:109::-;21705:7;21732;:16;21740:7;21732:16;;;;;;;;;;;;;;;;;;;;;21725:23;;21647:109;;;:::o;60685:189::-;43542:12;:10;:12::i;:::-;43531:23;;:7;:5;:7::i;:::-;:23;;;43523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60736:15:::1;60754:21;60736:39;;60804:1;60794:7;:11;60786:20;;;::::0;::::1;;60817:49;56097:42;60844:21;60817:10;:49::i;:::-;60725:149;60685:189::o:0;56947:109::-;43542:12;:10;:12::i;:::-;43531:23;;:7;:5;:7::i;:::-;:23;;;43523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57039:9:::1;57022:14;:26;;;;;;;;;;;;:::i;:::-;;56947:109:::0;:::o;55706:33::-;;;;:::o;43311:87::-;43357:7;43384:6;;;;;;;;;;;43377:13;;43311:87;:::o;60235:119::-;43542:12;:10;:12::i;:::-;43531:23;;:7;:5;:7::i;:::-;:23;;;43523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60304:6:::1;60296:5;:14;;;;60326:20;60340:5;;60326:20;;;;;;:::i;:::-;;;;;;;;60235:119:::0;:::o;21992:104::-;22048:13;22081:7;22074:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21992:104;:::o;23675:295::-;23790:12;:10;:12::i;:::-;23778:24;;:8;:24;;;;23770:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23890:8;23845:18;:32;23864:12;:10;:12::i;:::-;23845:32;;;;;;;;;;;;;;;:42;23878:8;23845:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23943:8;23914:48;;23929:12;:10;:12::i;:::-;23914:48;;;23953:8;23914:48;;;;;;:::i;:::-;;;;;;;;23675:295;;:::o;24938:328::-;25113:41;25132:12;:10;:12::i;:::-;25146:7;25113:18;:41::i;:::-;25105:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25219:39;25233:4;25239:2;25243:7;25252:5;25219:13;:39::i;:::-;24938:328;;;;:::o;60362:134::-;43542:12;:10;:12::i;:::-;43531:23;;:7;:5;:7::i;:::-;:23;;;43523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60441:4:::1;60426:12;:19;;;;60461:27;60475:12;;60461:27;;;;;;:::i;:::-;;;;;;;;60362:134:::0;:::o;55909:31::-;;;;;;;;;;;;;:::o;60114:113::-;43542:12;:10;:12::i;:::-;43531:23;;:7;:5;:7::i;:::-;:23;;;43523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60180:6:::1;60172:5;;:14;;;;;;;;;;;;;;;;;;60202:17;60213:5;;;;;;;;;;;60202:17;;;;;;:::i;:::-;;;;;;;;60114:113:::0;:::o;55746:36::-;55781:1;55746:36;:::o;55982:30::-;;;;:::o;57538:453::-;57611:13;57645:16;57653:7;57645;:16::i;:::-;57637:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;57730:11;;;;;;;;;;;57729:12;:36;;;;;57756:9;;57745:7;:20;;57729:36;:58;;;;;57780:7;;57769;:18;;57729:58;57726:98;;;57810:14;57803:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57726:98;57845:21;57869:10;:8;:10::i;:::-;57845:34;;57921:1;57903:7;57897:21;:25;:86;;;;;;;;;;;;;;;;;57949:7;57958:18;:7;:16;:18::i;:::-;57932:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57897:86;57890:93;;;57538:453;;;;:::o;57999:727::-;56620:12;;56604;:10;:12::i;:::-;:28;;56596:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;56665:5;;;;;;;;;;;56664:6;56656:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;58112:12:::1;58154:10;58137:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;58127:39;;;;;;58112:54;;58185:50;58204:12;58218:10;;58230:4;58185:18;:50::i;:::-;58177:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;58264:13;58280:12;:10;:12::i;:::-;58264:28;;58327:2;58311:12;:18;;58303:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;58411:2;58395:12;58371:9;:21;58381:10;58371:21;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:42;;58363:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;58473:4;58457:12;58449:5;:20;;;;:::i;:::-;:28;;58441:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;58523:19;58529:12;58523:5;:19::i;:::-;58510:9;:32;;58502:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;58577:14;58594:12;:10;:12::i;:::-;58577:29;;58623:7;58633:1;58623:11;;58619:100;58641:12;58636:1;:17;;;58619:100;;58674:33;58689:6;58705:1;58697:9;;:5;:9;;;;:::i;:::-;58674:14;:33::i;:::-;58655:3;;;;;:::i;:::-;;;;58619:100;;;;58101:625;;;57999:727:::0;;:::o;55874:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59294:479::-;43542:12;:10;:12::i;:::-;43531:23;;:7;:5;:7::i;:::-;:23;;;43523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56620:12:::1;;56604;:10;:12::i;:::-;:28;;56596:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;56665:5;;;;;;;;;;;56664:6;56656:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;59373:13:::2;59389:12;:10;:12::i;:::-;59373:28;;59436:3;59420:12;:19;;59412:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;59521:3;59505:12;59481:9;:21;59491:10;59481:21;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:43;;59473:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;59585:12;;59569;59561:5;:20;;;;:::i;:::-;:36;;59553:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;59624:14;59641:12;:10;:12::i;:::-;59624:29;;59670:7;59680:1;59670:11;;59666:100;59688:12;59683:1;:17;;;59666:100;;59721:33;59736:6;59752:1;59744:9;;:5;:9;;;;:::i;:::-;59721:14;:33::i;:::-;59702:3;;;;;:::i;:::-;;;;59666:100;;;;59362:411;;59294:479:::0;:::o;56056:83::-;56097:42;56056:83;:::o;24041:164::-;24138:4;24162:18;:25;24181:5;24162:25;;;;;;;;;;;;;;;:35;24188:8;24162:35;;;;;;;;;;;;;;;;;;;;;;;;;24155:42;;24041:164;;;;:::o;61185:218::-;61258:4;61274:12;61316:10;61299:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;61289:39;;;;;;61274:54;;61345:50;61364:12;61378:10;;61390:4;61345:18;:50::i;:::-;61338:57;;;61185:218;;;:::o;57175:355::-;57216:7;57257:10;57239:15;:28;57236:287;;;57291:1;57284:8;;;;57236:287;57347:10;57328:15;:29;;:70;;;;;57379:19;57361:15;:37;57328:70;57325:198;;;57422:1;57415:8;;;;57325:198;57488:1;57481:8;;57175:355;;:::o;44220:201::-;43542:12;:10;:12::i;:::-;43531:23;;:7;:5;:7::i;:::-;:23;;;43523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44329:1:::1;44309:22;;:8;:22;;;;44301:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44385:28;44404:8;44385:18;:28::i;:::-;44220:201:::0;:::o;20716:293::-;20818:4;20866:25;20851:40;;;:11;:40;;;;:101;;;;20919:33;20904:48;;;:11;:48;;;;20851:101;:150;;;;20965:36;20989:11;20965:23;:36::i;:::-;20851:150;20835:166;;20716:293;;;:::o;26776:127::-;26841:4;26893:1;26865:30;;:7;:16;26873:7;26865:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26858:37;;26776:127;;;:::o;16301:98::-;16354:7;16381:10;16374:17;;16301:98;:::o;30776:174::-;30878:2;30851:15;:24;30867:7;30851:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30934:7;30930:2;30896:46;;30905:23;30920:7;30905:14;:23::i;:::-;30896:46;;;;;;;;;;;;30776:174;;:::o;59781:213::-;59857:27;:15;:25;:27::i;:::-;59895:9;:14;59905:3;59895:14;;;;;;;;;;;;;;;;:16;;;;;;;;;:::i;:::-;;;;;;59922:24;59932:3;59937:8;59922:9;:24::i;:::-;59977:8;59964:22;;;;;;;;;;59781:213;;:::o;27070:348::-;27163:4;27188:16;27196:7;27188;:16::i;:::-;27180:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27264:13;27280:23;27295:7;27280:14;:23::i;:::-;27264:39;;27333:5;27322:16;;:7;:16;;;:51;;;;27366:7;27342:31;;:20;27354:7;27342:11;:20::i;:::-;:31;;;27322:51;:87;;;;27377:32;27394:5;27401:7;27377:16;:32::i;:::-;27322:87;27314:96;;;27070:348;;;;:::o;30080:578::-;30239:4;30212:31;;:23;30227:7;30212:14;:23::i;:::-;:31;;;30204:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30322:1;30308:16;;:2;:16;;;;30300:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30378:39;30399:4;30405:2;30409:7;30378:20;:39::i;:::-;30482:29;30499:1;30503:7;30482:8;:29::i;:::-;30543:1;30524:9;:15;30534:4;30524:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30572:1;30555:9;:13;30565:2;30555:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30603:2;30584:7;:16;30592:7;30584:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30642:7;30638:2;30623:27;;30632:4;30623:27;;;;;;;;;;;;30080:578;;;:::o;48288:98::-;48346:7;48377:1;48373;:5;;;;:::i;:::-;48366:12;;48288:98;;;;:::o;41742:114::-;41807:7;41834;:14;;;41827:21;;41742:114;;;:::o;44581:191::-;44655:16;44674:6;;;;;;;;;;;44655:25;;44700:8;44691:6;;:17;;;;;;;;;;;;;;;;;;44755:8;44724:40;;44745:8;44724:40;;;;;;;;;;;;44644:128;44581:191;:::o;60882:181::-;60957:12;60975:8;:13;;60996:7;60975:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60956:52;;;61027:7;61019:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;60945:118;60882:181;;:::o;26148:315::-;26305:28;26315:4;26321:2;26325:7;26305:9;:28::i;:::-;26352:48;26375:4;26381:2;26385:7;26394:5;26352:22;:48::i;:::-;26344:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26148:315;;;;:::o;56717:113::-;56777:13;56810:12;56803:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56717:113;:::o;16797:723::-;16853:13;17083:1;17074:5;:10;17070:53;;;17101:10;;;;;;;;;;;;;;;;;;;;;17070:53;17133:12;17148:5;17133:20;;17164:14;17189:78;17204:1;17196:4;:9;17189:78;;17222:8;;;;;:::i;:::-;;;;17253:2;17245:10;;;;;:::i;:::-;;;17189:78;;;17277:19;17309:6;17299:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17277:39;;17327:154;17343:1;17334:5;:10;17327:154;;17371:1;17361:11;;;;;:::i;:::-;;;17438:2;17430:5;:10;;;;:::i;:::-;17417:2;:24;;;;:::i;:::-;17404:39;;17387:6;17394;17387:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17467:2;17458:11;;;;;:::i;:::-;;;17327:154;;;17505:6;17491:21;;;;;16797:723;;;;:::o;52538:190::-;52663:4;52716;52687:25;52700:5;52707:4;52687:12;:25::i;:::-;:33;52680:40;;52538:190;;;;;:::o;19323:157::-;19408:4;19447:25;19432:40;;;:11;:40;;;;19425:47;;19323:157;;;:::o;41864:127::-;41971:1;41953:7;:14;;;:19;;;;;;;;;;;41864:127;:::o;27760:110::-;27836:26;27846:2;27850:7;27836:26;;;;;;;;;;;;:9;:26::i;:::-;27760:110;;:::o;36482:589::-;36626:45;36653:4;36659:2;36663:7;36626:26;:45::i;:::-;36704:1;36688:18;;:4;:18;;;36684:187;;;36723:40;36755:7;36723:31;:40::i;:::-;36684:187;;;36793:2;36785:10;;:4;:10;;;36781:90;;36812:47;36845:4;36851:7;36812:32;:47::i;:::-;36781:90;36684:187;36899:1;36885:16;;:2;:16;;;36881:183;;;36918:45;36955:7;36918:36;:45::i;:::-;36881:183;;;36991:4;36985:10;;:2;:10;;;36981:83;;37012:40;37040:2;37044:7;37012:27;:40::i;:::-;36981:83;36881:183;36482:589;;;:::o;31515:803::-;31670:4;31691:15;:2;:13;;;:15::i;:::-;31687:624;;;31743:2;31727:36;;;31764:12;:10;:12::i;:::-;31778:4;31784:7;31793:5;31727:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31723:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31990:1;31973:6;:13;:18;31969:272;;;32016:60;;;;;;;;;;:::i;:::-;;;;;;;;31969:272;32191:6;32185:13;32176:6;32172:2;32168:15;32161:38;31723:533;31860:45;;;31850:55;;;:6;:55;;;;31843:62;;;;;31687:624;32295:4;32288:11;;31515:803;;;;;;;:::o;53090:675::-;53173:7;53193:20;53216:4;53193:27;;53236:9;53231:497;53255:5;:12;53251:1;:16;53231:497;;;53289:20;53312:5;53318:1;53312:8;;;;;;;;:::i;:::-;;;;;;;;53289:31;;53355:12;53339;:28;53335:382;;53482:42;53497:12;53511;53482:14;:42::i;:::-;53467:57;;53335:382;;;53659:42;53674:12;53688;53659:14;:42::i;:::-;53644:57;;53335:382;53274:454;53269:3;;;;;:::i;:::-;;;;53231:497;;;;53745:12;53738:19;;;53090:675;;;;:::o;28097:321::-;28227:18;28233:2;28237:7;28227:5;:18::i;:::-;28278:54;28309:1;28313:2;28317:7;28326:5;28278:22;:54::i;:::-;28256:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28097:321;;;:::o;32890:126::-;;;;:::o;37794:164::-;37898:10;:17;;;;37871:15;:24;37887:7;37871:24;;;;;;;;;;;:44;;;;37926:10;37942:7;37926:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37794:164;:::o;38585:988::-;38851:22;38901:1;38876:22;38893:4;38876:16;:22::i;:::-;:26;;;;:::i;:::-;38851:51;;38913:18;38934:17;:26;38952:7;38934:26;;;;;;;;;;;;38913:47;;39081:14;39067:10;:28;39063:328;;39112:19;39134:12;:18;39147:4;39134:18;;;;;;;;;;;;;;;:34;39153:14;39134:34;;;;;;;;;;;;39112:56;;39218:11;39185:12;:18;39198:4;39185:18;;;;;;;;;;;;;;;:30;39204:10;39185:30;;;;;;;;;;;:44;;;;39335:10;39302:17;:30;39320:11;39302:30;;;;;;;;;;;:43;;;;39097:294;39063:328;39487:17;:26;39505:7;39487:26;;;;;;;;;;;39480:33;;;39531:12;:18;39544:4;39531:18;;;;;;;;;;;;;;;:34;39550:14;39531:34;;;;;;;;;;;39524:41;;;38666:907;;38585:988;;:::o;39868:1079::-;40121:22;40166:1;40146:10;:17;;;;:21;;;;:::i;:::-;40121:46;;40178:18;40199:15;:24;40215:7;40199:24;;;;;;;;;;;;40178:45;;40550:19;40572:10;40583:14;40572:26;;;;;;;;:::i;:::-;;;;;;;;;;40550:48;;40636:11;40611:10;40622;40611:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;40747:10;40716:15;:28;40732:11;40716:28;;;;;;;;;;;:41;;;;40888:15;:24;40904:7;40888:24;;;;;;;;;;;40881:31;;;40923:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39939:1008;;;39868:1079;:::o;37372:221::-;37457:14;37474:20;37491:2;37474:16;:20::i;:::-;37457:37;;37532:7;37505:12;:16;37518:2;37505:16;;;;;;;;;;;;;;;:24;37522:6;37505:24;;;;;;;;;;;:34;;;;37579:6;37550:17;:26;37568:7;37550:26;;;;;;;;;;;:35;;;;37446:147;37372:221;;:::o;8435:326::-;8495:4;8752:1;8730:7;:19;;;:23;8723:30;;8435:326;;;:::o;53773:224::-;53841:13;53904:1;53898:4;53891:15;53933:1;53927:4;53920:15;53974:4;53968;53958:21;53949:30;;53773:224;;;;:::o;28754:382::-;28848:1;28834:16;;:2;:16;;;;28826:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28907:16;28915:7;28907;:16::i;:::-;28906:17;28898:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28969:45;28998:1;29002:2;29006:7;28969:20;:45::i;:::-;29044:1;29027:9;:13;29037:2;29027:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29075:2;29056:7;:16;29064:7;29056:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29120:7;29116:2;29095:33;;29112:1;29095:33;;;;;;;;;;;;28754:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:139::-;2309:5;2347:6;2334:20;2325:29;;2363:33;2390:5;2363:33;:::i;:::-;2263:139;;;;:::o;2408:137::-;2453:5;2491:6;2478:20;2469:29;;2507:32;2533:5;2507:32;:::i;:::-;2408:137;;;;:::o;2551:141::-;2607:5;2638:6;2632:13;2623:22;;2654:32;2680:5;2654:32;:::i;:::-;2551:141;;;;:::o;2711:338::-;2766:5;2815:3;2808:4;2800:6;2796:17;2792:27;2782:122;;2823:79;;:::i;:::-;2782:122;2940:6;2927:20;2965:78;3039:3;3031:6;3024:4;3016:6;3012:17;2965:78;:::i;:::-;2956:87;;2772:277;2711:338;;;;:::o;3069:340::-;3125:5;3174:3;3167:4;3159:6;3155:17;3151:27;3141:122;;3182:79;;:::i;:::-;3141:122;3299:6;3286:20;3324:79;3399:3;3391:6;3384:4;3376:6;3372:17;3324:79;:::i;:::-;3315:88;;3131:278;3069:340;;;;:::o;3415:139::-;3461:5;3499:6;3486:20;3477:29;;3515:33;3542:5;3515:33;:::i;:::-;3415:139;;;;:::o;3560:329::-;3619:6;3668:2;3656:9;3647:7;3643:23;3639:32;3636:119;;;3674:79;;:::i;:::-;3636:119;3794:1;3819:53;3864:7;3855:6;3844:9;3840:22;3819:53;:::i;:::-;3809:63;;3765:117;3560:329;;;;:::o;3895:474::-;3963:6;3971;4020:2;4008:9;3999:7;3995:23;3991:32;3988:119;;;4026:79;;:::i;:::-;3988:119;4146:1;4171:53;4216:7;4207:6;4196:9;4192:22;4171:53;:::i;:::-;4161:63;;4117:117;4273:2;4299:53;4344:7;4335:6;4324:9;4320:22;4299:53;:::i;:::-;4289:63;;4244:118;3895:474;;;;;:::o;4375:619::-;4452:6;4460;4468;4517:2;4505:9;4496:7;4492:23;4488:32;4485:119;;;4523:79;;:::i;:::-;4485:119;4643:1;4668:53;4713:7;4704:6;4693:9;4689:22;4668:53;:::i;:::-;4658:63;;4614:117;4770:2;4796:53;4841:7;4832:6;4821:9;4817:22;4796:53;:::i;:::-;4786:63;;4741:118;4898:2;4924:53;4969:7;4960:6;4949:9;4945:22;4924:53;:::i;:::-;4914:63;;4869:118;4375:619;;;;;:::o;5000:943::-;5095:6;5103;5111;5119;5168:3;5156:9;5147:7;5143:23;5139:33;5136:120;;;5175:79;;:::i;:::-;5136:120;5295:1;5320:53;5365:7;5356:6;5345:9;5341:22;5320:53;:::i;:::-;5310:63;;5266:117;5422:2;5448:53;5493:7;5484:6;5473:9;5469:22;5448:53;:::i;:::-;5438:63;;5393:118;5550:2;5576:53;5621:7;5612:6;5601:9;5597:22;5576:53;:::i;:::-;5566:63;;5521:118;5706:2;5695:9;5691:18;5678:32;5737:18;5729:6;5726:30;5723:117;;;5759:79;;:::i;:::-;5723:117;5864:62;5918:7;5909:6;5898:9;5894:22;5864:62;:::i;:::-;5854:72;;5649:287;5000:943;;;;;;;:::o;5949:468::-;6014:6;6022;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:53;6267:7;6258:6;6247:9;6243:22;6222:53;:::i;:::-;6212:63;;6168:117;6324:2;6350:50;6392:7;6383:6;6372:9;6368:22;6350:50;:::i;:::-;6340:60;;6295:115;5949:468;;;;;:::o;6423:474::-;6491:6;6499;6548:2;6536:9;6527:7;6523:23;6519:32;6516:119;;;6554:79;;:::i;:::-;6516:119;6674:1;6699:53;6744:7;6735:6;6724:9;6720:22;6699:53;:::i;:::-;6689:63;;6645:117;6801:2;6827:53;6872:7;6863:6;6852:9;6848:22;6827:53;:::i;:::-;6817:63;;6772:118;6423:474;;;;;:::o;6903:539::-;6987:6;7036:2;7024:9;7015:7;7011:23;7007:32;7004:119;;;7042:79;;:::i;:::-;7004:119;7190:1;7179:9;7175:17;7162:31;7220:18;7212:6;7209:30;7206:117;;;7242:79;;:::i;:::-;7206:117;7347:78;7417:7;7408:6;7397:9;7393:22;7347:78;:::i;:::-;7337:88;;7133:302;6903:539;;;;:::o;7448:323::-;7504:6;7553:2;7541:9;7532:7;7528:23;7524:32;7521:119;;;7559:79;;:::i;:::-;7521:119;7679:1;7704:50;7746:7;7737:6;7726:9;7722:22;7704:50;:::i;:::-;7694:60;;7650:114;7448:323;;;;:::o;7777:613::-;7851:6;7859;7867;7916:2;7904:9;7895:7;7891:23;7887:32;7884:119;;;7922:79;;:::i;:::-;7884:119;8042:1;8067:50;8109:7;8100:6;8089:9;8085:22;8067:50;:::i;:::-;8057:60;;8013:114;8166:2;8192:53;8237:7;8228:6;8217:9;8213:22;8192:53;:::i;:::-;8182:63;;8137:118;8294:2;8320:53;8365:7;8356:6;8345:9;8341:22;8320:53;:::i;:::-;8310:63;;8265:118;7777:613;;;;;:::o;8396:329::-;8455:6;8504:2;8492:9;8483:7;8479:23;8475:32;8472:119;;;8510:79;;:::i;:::-;8472:119;8630:1;8655:53;8700:7;8691:6;8680:9;8676:22;8655:53;:::i;:::-;8645:63;;8601:117;8396:329;;;;:::o;8731:327::-;8789:6;8838:2;8826:9;8817:7;8813:23;8809:32;8806:119;;;8844:79;;:::i;:::-;8806:119;8964:1;8989:52;9033:7;9024:6;9013:9;9009:22;8989:52;:::i;:::-;8979:62;;8935:116;8731:327;;;;:::o;9064:349::-;9133:6;9182:2;9170:9;9161:7;9157:23;9153:32;9150:119;;;9188:79;;:::i;:::-;9150:119;9308:1;9333:63;9388:7;9379:6;9368:9;9364:22;9333:63;:::i;:::-;9323:73;;9279:127;9064:349;;;;:::o;9419:509::-;9488:6;9537:2;9525:9;9516:7;9512:23;9508:32;9505:119;;;9543:79;;:::i;:::-;9505:119;9691:1;9680:9;9676:17;9663:31;9721:18;9713:6;9710:30;9707:117;;;9743:79;;:::i;:::-;9707:117;9848:63;9903:7;9894:6;9883:9;9879:22;9848:63;:::i;:::-;9838:73;;9634:287;9419:509;;;;:::o;9934:329::-;9993:6;10042:2;10030:9;10021:7;10017:23;10013:32;10010:119;;;10048:79;;:::i;:::-;10010:119;10168:1;10193:53;10238:7;10229:6;10218:9;10214:22;10193:53;:::i;:::-;10183:63;;10139:117;9934:329;;;;:::o;10269:684::-;10362:6;10370;10419:2;10407:9;10398:7;10394:23;10390:32;10387:119;;;10425:79;;:::i;:::-;10387:119;10545:1;10570:53;10615:7;10606:6;10595:9;10591:22;10570:53;:::i;:::-;10560:63;;10516:117;10700:2;10689:9;10685:18;10672:32;10731:18;10723:6;10720:30;10717:117;;;10753:79;;:::i;:::-;10717:117;10858:78;10928:7;10919:6;10908:9;10904:22;10858:78;:::i;:::-;10848:88;;10643:303;10269:684;;;;;:::o;10959:118::-;11046:24;11064:5;11046:24;:::i;:::-;11041:3;11034:37;10959:118;;:::o;11083:157::-;11188:45;11208:24;11226:5;11208:24;:::i;:::-;11188:45;:::i;:::-;11183:3;11176:58;11083:157;;:::o;11246:109::-;11327:21;11342:5;11327:21;:::i;:::-;11322:3;11315:34;11246:109;;:::o;11361:118::-;11448:24;11466:5;11448:24;:::i;:::-;11443:3;11436:37;11361:118;;:::o;11485:360::-;11571:3;11599:38;11631:5;11599:38;:::i;:::-;11653:70;11716:6;11711:3;11653:70;:::i;:::-;11646:77;;11732:52;11777:6;11772:3;11765:4;11758:5;11754:16;11732:52;:::i;:::-;11809:29;11831:6;11809:29;:::i;:::-;11804:3;11800:39;11793:46;;11575:270;11485:360;;;;:::o;11851:364::-;11939:3;11967:39;12000:5;11967:39;:::i;:::-;12022:71;12086:6;12081:3;12022:71;:::i;:::-;12015:78;;12102:52;12147:6;12142:3;12135:4;12128:5;12124:16;12102:52;:::i;:::-;12179:29;12201:6;12179:29;:::i;:::-;12174:3;12170:39;12163:46;;11943:272;11851:364;;;;:::o;12221:377::-;12327:3;12355:39;12388:5;12355:39;:::i;:::-;12410:89;12492:6;12487:3;12410:89;:::i;:::-;12403:96;;12508:52;12553:6;12548:3;12541:4;12534:5;12530:16;12508:52;:::i;:::-;12585:6;12580:3;12576:16;12569:23;;12331:267;12221:377;;;;:::o;12604:366::-;12746:3;12767:67;12831:2;12826:3;12767:67;:::i;:::-;12760:74;;12843:93;12932:3;12843:93;:::i;:::-;12961:2;12956:3;12952:12;12945:19;;12604:366;;;:::o;12976:::-;13118:3;13139:67;13203:2;13198:3;13139:67;:::i;:::-;13132:74;;13215:93;13304:3;13215:93;:::i;:::-;13333:2;13328:3;13324:12;13317:19;;12976:366;;;:::o;13348:::-;13490:3;13511:67;13575:2;13570:3;13511:67;:::i;:::-;13504:74;;13587:93;13676:3;13587:93;:::i;:::-;13705:2;13700:3;13696:12;13689:19;;13348:366;;;:::o;13720:::-;13862:3;13883:67;13947:2;13942:3;13883:67;:::i;:::-;13876:74;;13959:93;14048:3;13959:93;:::i;:::-;14077:2;14072:3;14068:12;14061:19;;13720:366;;;:::o;14092:::-;14234:3;14255:67;14319:2;14314:3;14255:67;:::i;:::-;14248:74;;14331:93;14420:3;14331:93;:::i;:::-;14449:2;14444:3;14440:12;14433:19;;14092:366;;;:::o;14464:::-;14606:3;14627:67;14691:2;14686:3;14627:67;:::i;:::-;14620:74;;14703:93;14792:3;14703:93;:::i;:::-;14821:2;14816:3;14812:12;14805:19;;14464:366;;;:::o;14836:::-;14978:3;14999:67;15063:2;15058:3;14999:67;:::i;:::-;14992:74;;15075:93;15164:3;15075:93;:::i;:::-;15193:2;15188:3;15184:12;15177:19;;14836:366;;;:::o;15208:365::-;15350:3;15371:66;15435:1;15430:3;15371:66;:::i;:::-;15364:73;;15446:93;15535:3;15446:93;:::i;:::-;15564:2;15559:3;15555:12;15548:19;;15208:365;;;:::o;15579:366::-;15721:3;15742:67;15806:2;15801:3;15742:67;:::i;:::-;15735:74;;15818:93;15907:3;15818:93;:::i;:::-;15936:2;15931:3;15927:12;15920:19;;15579:366;;;:::o;15951:::-;16093:3;16114:67;16178:2;16173:3;16114:67;:::i;:::-;16107:74;;16190:93;16279:3;16190:93;:::i;:::-;16308:2;16303:3;16299:12;16292:19;;15951:366;;;:::o;16323:::-;16465:3;16486:67;16550:2;16545:3;16486:67;:::i;:::-;16479:74;;16562:93;16651:3;16562:93;:::i;:::-;16680:2;16675:3;16671:12;16664:19;;16323:366;;;:::o;16695:::-;16837:3;16858:67;16922:2;16917:3;16858:67;:::i;:::-;16851:74;;16934:93;17023:3;16934:93;:::i;:::-;17052:2;17047:3;17043:12;17036:19;;16695:366;;;:::o;17067:::-;17209:3;17230:67;17294:2;17289:3;17230:67;:::i;:::-;17223:74;;17306:93;17395:3;17306:93;:::i;:::-;17424:2;17419:3;17415:12;17408:19;;17067:366;;;:::o;17439:::-;17581:3;17602:67;17666:2;17661:3;17602:67;:::i;:::-;17595:74;;17678:93;17767:3;17678:93;:::i;:::-;17796:2;17791:3;17787:12;17780:19;;17439:366;;;:::o;17811:::-;17953:3;17974:67;18038:2;18033:3;17974:67;:::i;:::-;17967:74;;18050:93;18139:3;18050:93;:::i;:::-;18168:2;18163:3;18159:12;18152:19;;17811:366;;;:::o;18183:::-;18325:3;18346:67;18410:2;18405:3;18346:67;:::i;:::-;18339:74;;18422:93;18511:3;18422:93;:::i;:::-;18540:2;18535:3;18531:12;18524:19;;18183:366;;;:::o;18555:::-;18697:3;18718:67;18782:2;18777:3;18718:67;:::i;:::-;18711:74;;18794:93;18883:3;18794:93;:::i;:::-;18912:2;18907:3;18903:12;18896:19;;18555:366;;;:::o;18927:::-;19069:3;19090:67;19154:2;19149:3;19090:67;:::i;:::-;19083:74;;19166:93;19255:3;19166:93;:::i;:::-;19284:2;19279:3;19275:12;19268:19;;18927:366;;;:::o;19299:::-;19441:3;19462:67;19526:2;19521:3;19462:67;:::i;:::-;19455:74;;19538:93;19627:3;19538:93;:::i;:::-;19656:2;19651:3;19647:12;19640:19;;19299:366;;;:::o;19671:::-;19813:3;19834:67;19898:2;19893:3;19834:67;:::i;:::-;19827:74;;19910:93;19999:3;19910:93;:::i;:::-;20028:2;20023:3;20019:12;20012:19;;19671:366;;;:::o;20043:::-;20185:3;20206:67;20270:2;20265:3;20206:67;:::i;:::-;20199:74;;20282:93;20371:3;20282:93;:::i;:::-;20400:2;20395:3;20391:12;20384:19;;20043:366;;;:::o;20415:::-;20557:3;20578:67;20642:2;20637:3;20578:67;:::i;:::-;20571:74;;20654:93;20743:3;20654:93;:::i;:::-;20772:2;20767:3;20763:12;20756:19;;20415:366;;;:::o;20787:398::-;20946:3;20967:83;21048:1;21043:3;20967:83;:::i;:::-;20960:90;;21059:93;21148:3;21059:93;:::i;:::-;21177:1;21172:3;21168:11;21161:18;;20787:398;;;:::o;21191:366::-;21333:3;21354:67;21418:2;21413:3;21354:67;:::i;:::-;21347:74;;21430:93;21519:3;21430:93;:::i;:::-;21548:2;21543:3;21539:12;21532:19;;21191:366;;;:::o;21563:::-;21705:3;21726:67;21790:2;21785:3;21726:67;:::i;:::-;21719:74;;21802:93;21891:3;21802:93;:::i;:::-;21920:2;21915:3;21911:12;21904:19;;21563:366;;;:::o;21935:::-;22077:3;22098:67;22162:2;22157:3;22098:67;:::i;:::-;22091:74;;22174:93;22263:3;22174:93;:::i;:::-;22292:2;22287:3;22283:12;22276:19;;21935:366;;;:::o;22307:::-;22449:3;22470:67;22534:2;22529:3;22470:67;:::i;:::-;22463:74;;22546:93;22635:3;22546:93;:::i;:::-;22664:2;22659:3;22655:12;22648:19;;22307:366;;;:::o;22679:::-;22821:3;22842:67;22906:2;22901:3;22842:67;:::i;:::-;22835:74;;22918:93;23007:3;22918:93;:::i;:::-;23036:2;23031:3;23027:12;23020:19;;22679:366;;;:::o;23051:365::-;23193:3;23214:66;23278:1;23273:3;23214:66;:::i;:::-;23207:73;;23289:93;23378:3;23289:93;:::i;:::-;23407:2;23402:3;23398:12;23391:19;;23051:365;;;:::o;23422:118::-;23509:24;23527:5;23509:24;:::i;:::-;23504:3;23497:37;23422:118;;:::o;23546:256::-;23658:3;23673:75;23744:3;23735:6;23673:75;:::i;:::-;23773:2;23768:3;23764:12;23757:19;;23793:3;23786:10;;23546:256;;;;:::o;23808:435::-;23988:3;24010:95;24101:3;24092:6;24010:95;:::i;:::-;24003:102;;24122:95;24213:3;24204:6;24122:95;:::i;:::-;24115:102;;24234:3;24227:10;;23808:435;;;;;:::o;24249:379::-;24433:3;24455:147;24598:3;24455:147;:::i;:::-;24448:154;;24619:3;24612:10;;24249:379;;;:::o;24634:222::-;24727:4;24765:2;24754:9;24750:18;24742:26;;24778:71;24846:1;24835:9;24831:17;24822:6;24778:71;:::i;:::-;24634:222;;;;:::o;24862:640::-;25057:4;25095:3;25084:9;25080:19;25072:27;;25109:71;25177:1;25166:9;25162:17;25153:6;25109:71;:::i;:::-;25190:72;25258:2;25247:9;25243:18;25234:6;25190:72;:::i;:::-;25272;25340:2;25329:9;25325:18;25316:6;25272:72;:::i;:::-;25391:9;25385:4;25381:20;25376:2;25365:9;25361:18;25354:48;25419:76;25490:4;25481:6;25419:76;:::i;:::-;25411:84;;24862:640;;;;;;;:::o;25508:210::-;25595:4;25633:2;25622:9;25618:18;25610:26;;25646:65;25708:1;25697:9;25693:17;25684:6;25646:65;:::i;:::-;25508:210;;;;:::o;25724:222::-;25817:4;25855:2;25844:9;25840:18;25832:26;;25868:71;25936:1;25925:9;25921:17;25912:6;25868:71;:::i;:::-;25724:222;;;;:::o;25952:313::-;26065:4;26103:2;26092:9;26088:18;26080:26;;26152:9;26146:4;26142:20;26138:1;26127:9;26123:17;26116:47;26180:78;26253:4;26244:6;26180:78;:::i;:::-;26172:86;;25952:313;;;;:::o;26271:419::-;26437:4;26475:2;26464:9;26460:18;26452:26;;26524:9;26518:4;26514:20;26510:1;26499:9;26495:17;26488:47;26552:131;26678:4;26552:131;:::i;:::-;26544:139;;26271:419;;;:::o;26696:::-;26862:4;26900:2;26889:9;26885:18;26877:26;;26949:9;26943:4;26939:20;26935:1;26924:9;26920:17;26913:47;26977:131;27103:4;26977:131;:::i;:::-;26969:139;;26696:419;;;:::o;27121:::-;27287:4;27325:2;27314:9;27310:18;27302:26;;27374:9;27368:4;27364:20;27360:1;27349:9;27345:17;27338:47;27402:131;27528:4;27402:131;:::i;:::-;27394:139;;27121:419;;;:::o;27546:::-;27712:4;27750:2;27739:9;27735:18;27727:26;;27799:9;27793:4;27789:20;27785:1;27774:9;27770:17;27763:47;27827:131;27953:4;27827:131;:::i;:::-;27819:139;;27546:419;;;:::o;27971:::-;28137:4;28175:2;28164:9;28160:18;28152:26;;28224:9;28218:4;28214:20;28210:1;28199:9;28195:17;28188:47;28252:131;28378:4;28252:131;:::i;:::-;28244:139;;27971:419;;;:::o;28396:::-;28562:4;28600:2;28589:9;28585:18;28577:26;;28649:9;28643:4;28639:20;28635:1;28624:9;28620:17;28613:47;28677:131;28803:4;28677:131;:::i;:::-;28669:139;;28396:419;;;:::o;28821:::-;28987:4;29025:2;29014:9;29010:18;29002:26;;29074:9;29068:4;29064:20;29060:1;29049:9;29045:17;29038:47;29102:131;29228:4;29102:131;:::i;:::-;29094:139;;28821:419;;;:::o;29246:::-;29412:4;29450:2;29439:9;29435:18;29427:26;;29499:9;29493:4;29489:20;29485:1;29474:9;29470:17;29463:47;29527:131;29653:4;29527:131;:::i;:::-;29519:139;;29246:419;;;:::o;29671:::-;29837:4;29875:2;29864:9;29860:18;29852:26;;29924:9;29918:4;29914:20;29910:1;29899:9;29895:17;29888:47;29952:131;30078:4;29952:131;:::i;:::-;29944:139;;29671:419;;;:::o;30096:::-;30262:4;30300:2;30289:9;30285:18;30277:26;;30349:9;30343:4;30339:20;30335:1;30324:9;30320:17;30313:47;30377:131;30503:4;30377:131;:::i;:::-;30369:139;;30096:419;;;:::o;30521:::-;30687:4;30725:2;30714:9;30710:18;30702:26;;30774:9;30768:4;30764:20;30760:1;30749:9;30745:17;30738:47;30802:131;30928:4;30802:131;:::i;:::-;30794:139;;30521:419;;;:::o;30946:::-;31112:4;31150:2;31139:9;31135:18;31127:26;;31199:9;31193:4;31189:20;31185:1;31174:9;31170:17;31163:47;31227:131;31353:4;31227:131;:::i;:::-;31219:139;;30946:419;;;:::o;31371:::-;31537:4;31575:2;31564:9;31560:18;31552:26;;31624:9;31618:4;31614:20;31610:1;31599:9;31595:17;31588:47;31652:131;31778:4;31652:131;:::i;:::-;31644:139;;31371:419;;;:::o;31796:::-;31962:4;32000:2;31989:9;31985:18;31977:26;;32049:9;32043:4;32039:20;32035:1;32024:9;32020:17;32013:47;32077:131;32203:4;32077:131;:::i;:::-;32069:139;;31796:419;;;:::o;32221:::-;32387:4;32425:2;32414:9;32410:18;32402:26;;32474:9;32468:4;32464:20;32460:1;32449:9;32445:17;32438:47;32502:131;32628:4;32502:131;:::i;:::-;32494:139;;32221:419;;;:::o;32646:::-;32812:4;32850:2;32839:9;32835:18;32827:26;;32899:9;32893:4;32889:20;32885:1;32874:9;32870:17;32863:47;32927:131;33053:4;32927:131;:::i;:::-;32919:139;;32646:419;;;:::o;33071:::-;33237:4;33275:2;33264:9;33260:18;33252:26;;33324:9;33318:4;33314:20;33310:1;33299:9;33295:17;33288:47;33352:131;33478:4;33352:131;:::i;:::-;33344:139;;33071:419;;;:::o;33496:::-;33662:4;33700:2;33689:9;33685:18;33677:26;;33749:9;33743:4;33739:20;33735:1;33724:9;33720:17;33713:47;33777:131;33903:4;33777:131;:::i;:::-;33769:139;;33496:419;;;:::o;33921:::-;34087:4;34125:2;34114:9;34110:18;34102:26;;34174:9;34168:4;34164:20;34160:1;34149:9;34145:17;34138:47;34202:131;34328:4;34202:131;:::i;:::-;34194:139;;33921:419;;;:::o;34346:::-;34512:4;34550:2;34539:9;34535:18;34527:26;;34599:9;34593:4;34589:20;34585:1;34574:9;34570:17;34563:47;34627:131;34753:4;34627:131;:::i;:::-;34619:139;;34346:419;;;:::o;34771:::-;34937:4;34975:2;34964:9;34960:18;34952:26;;35024:9;35018:4;35014:20;35010:1;34999:9;34995:17;34988:47;35052:131;35178:4;35052:131;:::i;:::-;35044:139;;34771:419;;;:::o;35196:::-;35362:4;35400:2;35389:9;35385:18;35377:26;;35449:9;35443:4;35439:20;35435:1;35424:9;35420:17;35413:47;35477:131;35603:4;35477:131;:::i;:::-;35469:139;;35196:419;;;:::o;35621:::-;35787:4;35825:2;35814:9;35810:18;35802:26;;35874:9;35868:4;35864:20;35860:1;35849:9;35845:17;35838:47;35902:131;36028:4;35902:131;:::i;:::-;35894:139;;35621:419;;;:::o;36046:::-;36212:4;36250:2;36239:9;36235:18;36227:26;;36299:9;36293:4;36289:20;36285:1;36274:9;36270:17;36263:47;36327:131;36453:4;36327:131;:::i;:::-;36319:139;;36046:419;;;:::o;36471:::-;36637:4;36675:2;36664:9;36660:18;36652:26;;36724:9;36718:4;36714:20;36710:1;36699:9;36695:17;36688:47;36752:131;36878:4;36752:131;:::i;:::-;36744:139;;36471:419;;;:::o;36896:::-;37062:4;37100:2;37089:9;37085:18;37077:26;;37149:9;37143:4;37139:20;37135:1;37124:9;37120:17;37113:47;37177:131;37303:4;37177:131;:::i;:::-;37169:139;;36896:419;;;:::o;37321:::-;37487:4;37525:2;37514:9;37510:18;37502:26;;37574:9;37568:4;37564:20;37560:1;37549:9;37545:17;37538:47;37602:131;37728:4;37602:131;:::i;:::-;37594:139;;37321:419;;;:::o;37746:::-;37912:4;37950:2;37939:9;37935:18;37927:26;;37999:9;37993:4;37989:20;37985:1;37974:9;37970:17;37963:47;38027:131;38153:4;38027:131;:::i;:::-;38019:139;;37746:419;;;:::o;38171:222::-;38264:4;38302:2;38291:9;38287:18;38279:26;;38315:71;38383:1;38372:9;38368:17;38359:6;38315:71;:::i;:::-;38171:222;;;;:::o;38399:129::-;38433:6;38460:20;;:::i;:::-;38450:30;;38489:33;38517:4;38509:6;38489:33;:::i;:::-;38399:129;;;:::o;38534:75::-;38567:6;38600:2;38594:9;38584:19;;38534:75;:::o;38615:311::-;38692:4;38782:18;38774:6;38771:30;38768:56;;;38804:18;;:::i;:::-;38768:56;38854:4;38846:6;38842:17;38834:25;;38914:4;38908;38904:15;38896:23;;38615:311;;;:::o;38932:307::-;38993:4;39083:18;39075:6;39072:30;39069:56;;;39105:18;;:::i;:::-;39069:56;39143:29;39165:6;39143:29;:::i;:::-;39135:37;;39227:4;39221;39217:15;39209:23;;38932:307;;;:::o;39245:308::-;39307:4;39397:18;39389:6;39386:30;39383:56;;;39419:18;;:::i;:::-;39383:56;39457:29;39479:6;39457:29;:::i;:::-;39449:37;;39541:4;39535;39531:15;39523:23;;39245:308;;;:::o;39559:98::-;39610:6;39644:5;39638:12;39628:22;;39559:98;;;:::o;39663:99::-;39715:6;39749:5;39743:12;39733:22;;39663:99;;;:::o;39768:168::-;39851:11;39885:6;39880:3;39873:19;39925:4;39920:3;39916:14;39901:29;;39768:168;;;;:::o;39942:147::-;40043:11;40080:3;40065:18;;39942:147;;;;:::o;40095:169::-;40179:11;40213:6;40208:3;40201:19;40253:4;40248:3;40244:14;40229:29;;40095:169;;;;:::o;40270:148::-;40372:11;40409:3;40394:18;;40270:148;;;;:::o;40424:305::-;40464:3;40483:20;40501:1;40483:20;:::i;:::-;40478:25;;40517:20;40535:1;40517:20;:::i;:::-;40512:25;;40671:1;40603:66;40599:74;40596:1;40593:81;40590:107;;;40677:18;;:::i;:::-;40590:107;40721:1;40718;40714:9;40707:16;;40424:305;;;;:::o;40735:185::-;40775:1;40792:20;40810:1;40792:20;:::i;:::-;40787:25;;40826:20;40844:1;40826:20;:::i;:::-;40821:25;;40865:1;40855:35;;40870:18;;:::i;:::-;40855:35;40912:1;40909;40905:9;40900:14;;40735:185;;;;:::o;40926:348::-;40966:7;40989:20;41007:1;40989:20;:::i;:::-;40984:25;;41023:20;41041:1;41023:20;:::i;:::-;41018:25;;41211:1;41143:66;41139:74;41136:1;41133:81;41128:1;41121:9;41114:17;41110:105;41107:131;;;41218:18;;:::i;:::-;41107:131;41266:1;41263;41259:9;41248:20;;40926:348;;;;:::o;41280:191::-;41320:4;41340:20;41358:1;41340:20;:::i;:::-;41335:25;;41374:20;41392:1;41374:20;:::i;:::-;41369:25;;41413:1;41410;41407:8;41404:34;;;41418:18;;:::i;:::-;41404:34;41463:1;41460;41456:9;41448:17;;41280:191;;;;:::o;41477:96::-;41514:7;41543:24;41561:5;41543:24;:::i;:::-;41532:35;;41477:96;;;:::o;41579:90::-;41613:7;41656:5;41649:13;41642:21;41631:32;;41579:90;;;:::o;41675:77::-;41712:7;41741:5;41730:16;;41675:77;;;:::o;41758:149::-;41794:7;41834:66;41827:5;41823:78;41812:89;;41758:149;;;:::o;41913:126::-;41950:7;41990:42;41983:5;41979:54;41968:65;;41913:126;;;:::o;42045:77::-;42082:7;42111:5;42100:16;;42045:77;;;:::o;42128:86::-;42163:7;42203:4;42196:5;42192:16;42181:27;;42128:86;;;:::o;42220:154::-;42304:6;42299:3;42294;42281:30;42366:1;42357:6;42352:3;42348:16;42341:27;42220:154;;;:::o;42380:307::-;42448:1;42458:113;42472:6;42469:1;42466:13;42458:113;;;42557:1;42552:3;42548:11;42542:18;42538:1;42533:3;42529:11;42522:39;42494:2;42491:1;42487:10;42482:15;;42458:113;;;42589:6;42586:1;42583:13;42580:101;;;42669:1;42660:6;42655:3;42651:16;42644:27;42580:101;42429:258;42380:307;;;:::o;42693:320::-;42737:6;42774:1;42768:4;42764:12;42754:22;;42821:1;42815:4;42811:12;42842:18;42832:81;;42898:4;42890:6;42886:17;42876:27;;42832:81;42960:2;42952:6;42949:14;42929:18;42926:38;42923:84;;;42979:18;;:::i;:::-;42923:84;42744:269;42693:320;;;:::o;43019:281::-;43102:27;43124:4;43102:27;:::i;:::-;43094:6;43090:40;43232:6;43220:10;43217:22;43196:18;43184:10;43181:34;43178:62;43175:88;;;43243:18;;:::i;:::-;43175:88;43283:10;43279:2;43272:22;43062:238;43019:281;;:::o;43306:233::-;43345:3;43368:24;43386:5;43368:24;:::i;:::-;43359:33;;43414:66;43407:5;43404:77;43401:103;;;43484:18;;:::i;:::-;43401:103;43531:1;43524:5;43520:13;43513:20;;43306:233;;;:::o;43545:167::-;43582:3;43605:22;43621:5;43605:22;:::i;:::-;43596:31;;43649:4;43642:5;43639:15;43636:41;;;43657:18;;:::i;:::-;43636:41;43704:1;43697:5;43693:13;43686:20;;43545:167;;;:::o;43718:100::-;43757:7;43786:26;43806:5;43786:26;:::i;:::-;43775:37;;43718:100;;;:::o;43824:94::-;43863:7;43892:20;43906:5;43892:20;:::i;:::-;43881:31;;43824:94;;;:::o;43924:176::-;43956:1;43973:20;43991:1;43973:20;:::i;:::-;43968:25;;44007:20;44025:1;44007:20;:::i;:::-;44002:25;;44046:1;44036:35;;44051:18;;:::i;:::-;44036:35;44092:1;44089;44085:9;44080:14;;43924:176;;;;:::o;44106:180::-;44154:77;44151:1;44144:88;44251:4;44248:1;44241:15;44275:4;44272:1;44265:15;44292:180;44340:77;44337:1;44330:88;44437:4;44434:1;44427:15;44461:4;44458:1;44451:15;44478:180;44526:77;44523:1;44516:88;44623:4;44620:1;44613:15;44647:4;44644:1;44637:15;44664:180;44712:77;44709:1;44702:88;44809:4;44806:1;44799:15;44833:4;44830:1;44823:15;44850:180;44898:77;44895:1;44888:88;44995:4;44992:1;44985:15;45019:4;45016:1;45009:15;45036:180;45084:77;45081:1;45074:88;45181:4;45178:1;45171:15;45205:4;45202:1;45195:15;45222:117;45331:1;45328;45321:12;45345:117;45454:1;45451;45444:12;45468:117;45577:1;45574;45567:12;45591:117;45700:1;45697;45690:12;45714:117;45823:1;45820;45813:12;45837:102;45878:6;45929:2;45925:7;45920:2;45913:5;45909:14;45905:28;45895:38;;45837:102;;;:::o;45945:94::-;45978:8;46026:5;46022:2;46018:14;45997:35;;45945:94;;;:::o;46045:161::-;46185:13;46181:1;46173:6;46169:14;46162:37;46045:161;:::o;46212:230::-;46352:34;46348:1;46340:6;46336:14;46329:58;46421:13;46416:2;46408:6;46404:15;46397:38;46212:230;:::o;46448:237::-;46588:34;46584:1;46576:6;46572:14;46565:58;46657:20;46652:2;46644:6;46640:15;46633:45;46448:237;:::o;46691:225::-;46831:34;46827:1;46819:6;46815:14;46808:58;46900:8;46895:2;46887:6;46883:15;46876:33;46691:225;:::o;46922:178::-;47062:30;47058:1;47050:6;47046:14;47039:54;46922:178;:::o;47106:223::-;47246:34;47242:1;47234:6;47230:14;47223:58;47315:6;47310:2;47302:6;47298:15;47291:31;47106:223;:::o;47335:175::-;47475:27;47471:1;47463:6;47459:14;47452:51;47335:175;:::o;47516:159::-;47656:11;47652:1;47644:6;47640:14;47633:35;47516:159;:::o;47681:231::-;47821:34;47817:1;47809:6;47805:14;47798:58;47890:14;47885:2;47877:6;47873:15;47866:39;47681:231;:::o;47918:163::-;48058:15;48054:1;48046:6;48042:14;48035:39;47918:163;:::o;48087:243::-;48227:34;48223:1;48215:6;48211:14;48204:58;48296:26;48291:2;48283:6;48279:15;48272:51;48087:243;:::o;48336:229::-;48476:34;48472:1;48464:6;48460:14;48453:58;48545:12;48540:2;48532:6;48528:15;48521:37;48336:229;:::o;48571:228::-;48711:34;48707:1;48699:6;48695:14;48688:58;48780:11;48775:2;48767:6;48763:15;48756:36;48571:228;:::o;48805:182::-;48945:34;48941:1;48933:6;48929:14;48922:58;48805:182;:::o;48993:231::-;49133:34;49129:1;49121:6;49117:14;49110:58;49202:14;49197:2;49189:6;49185:15;49178:39;48993:231;:::o;49230:182::-;49370:34;49366:1;49358:6;49354:14;49347:58;49230:182;:::o;49418:228::-;49558:34;49554:1;49546:6;49542:14;49535:58;49627:11;49622:2;49614:6;49610:15;49603:36;49418:228;:::o;49652:234::-;49792:34;49788:1;49780:6;49776:14;49769:58;49861:17;49856:2;49848:6;49844:15;49837:42;49652:234;:::o;49892:167::-;50032:19;50028:1;50020:6;50016:14;50009:43;49892:167;:::o;50065:220::-;50205:34;50201:1;50193:6;50189:14;50182:58;50274:3;50269:2;50261:6;50257:15;50250:28;50065:220;:::o;50291:164::-;50431:16;50427:1;50419:6;50415:14;50408:40;50291:164;:::o;50461:168::-;50601:20;50597:1;50589:6;50585:14;50578:44;50461:168;:::o;50635:114::-;;:::o;50755:166::-;50895:18;50891:1;50883:6;50879:14;50872:42;50755:166;:::o;50927:236::-;51067:34;51063:1;51055:6;51051:14;51044:58;51136:19;51131:2;51123:6;51119:15;51112:44;50927:236;:::o;51169:231::-;51309:34;51305:1;51297:6;51293:14;51286:58;51378:14;51373:2;51365:6;51361:15;51354:39;51169:231;:::o;51406:163::-;51546:15;51542:1;51534:6;51530:14;51523:39;51406:163;:::o;51575:162::-;51715:14;51711:1;51703:6;51699:14;51692:38;51575:162;:::o;51743:158::-;51883:10;51879:1;51871:6;51867:14;51860:34;51743:158;:::o;51907:122::-;51980:24;51998:5;51980:24;:::i;:::-;51973:5;51970:35;51960:63;;52019:1;52016;52009:12;51960:63;51907:122;:::o;52035:116::-;52105:21;52120:5;52105:21;:::i;:::-;52098:5;52095:32;52085:60;;52141:1;52138;52131:12;52085:60;52035:116;:::o;52157:122::-;52230:24;52248:5;52230:24;:::i;:::-;52223:5;52220:35;52210:63;;52269:1;52266;52259:12;52210:63;52157:122;:::o;52285:120::-;52357:23;52374:5;52357:23;:::i;:::-;52350:5;52347:34;52337:62;;52395:1;52392;52385:12;52337:62;52285:120;:::o;52411:122::-;52484:24;52502:5;52484:24;:::i;:::-;52477:5;52474:35;52464:63;;52523:1;52520;52513:12;52464:63;52411:122;:::o

Swarm Source

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