ETH Price: $2,376.12 (+0.33%)

Token

Infinity Headset Genesis (IHG)
 

Overview

Max Total Supply

491 IHG

Holders

156

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 IHG
0x01d6481a0683e458ba8a764cb97cf1a1819908b1
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:
ERC721Mintable

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-25
*/

// SPDX-License-Identifier: MIT
//0.8.7
pragma solidity ^0.8.0;

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

/**
 * @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 MUST emit when the URI is updated for a token ID.
        URIs are defined in RFC 3986.
        The URI MUST point a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema".
    */
    event URI(string _value, uint256 indexed _id);

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


/**
 * @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);
}
/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


/**
 * @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}.
     */
     /*
        bytes4(keccak256('supportsInterface(bytes4)'));
    */
    bytes4 constant private INTERFACE_SIGNATURE_ERC165 = 0x01ffc9a7;
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == INTERFACE_SIGNATURE_ERC165;
    }
}

/**
 * @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}.
 */
abstract contract ERC721 is ERC165, IERC721, IERC721Metadata {
    using Address for address;
    //using Strings for uint256;
    // Token name
    string internal _name;

    // Token symbol
    string internal _symbol;

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

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

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

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

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

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

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

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

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


    /**
     * @dev See {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(msg.sender == owner || isApprovedForAll(owner, msg.sender),
            "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 != msg.sender, "ERC721: approve to caller");

        _operatorApprovals[msg.sender][operator] = approved;
        emit ApprovalForAll(msg.sender, 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(msg.sender, 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(msg.sender, 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 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)
        internal returns (bool)
    {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(msg.sender, 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 {
                    // solhint-disable-next-line no-inline-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` 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 { }
}

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * 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;
        }
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return payable(msg.sender);
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

/**
 * @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;
    mapping (address => bool) private _managers;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event AddManager(address indexed manager);
    event RemoveManager(address indexed manager);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view 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");
        _;
    }
    
    modifier onlyManager() {
        require((_owner == _msgSender()) || _managers[_msgSender()], "Ownable: caller is not owner/manager");
        _;
    }
    
    function addManager(address manager) public onlyOwner {
        _managers[manager]=true;
        emit AddManager(manager);
    }
    
    function removeManager(address manager) public onlyOwner {
        _managers[manager]=false;
        emit RemoveManager(manager);
    }

    /**
     * @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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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


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];
    }
    
    
    function tokenOfOwnerTotal(address owner) public view returns (uint256[] memory _ids) {
        uint256 number = ERC721.balanceOf(owner);
        uint256[] memory K = new uint256[](number);
        //require(msg.sender == creators[_id]);
        for (uint256 i = 0; i < number; ++i) {
            K[i] = _ownedTokens[owner][i];
        }
        
        return K;
    }

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

contract ERC721Mintable is ERC721Enumerable ,Ownable{
    using SafeMath for uint256;
    using Address for address;

    mapping(uint256 => mapping (bytes32 => uint256)) internal Config;
    // id => creators
    mapping(uint256 => string) public tokenUris;
    /**
     * @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_;
    }
    
    // function test_owners(uint256 _id) external view returns (address) {
    //     return _owners[_id];
    // }
    
    // function test_exists(uint256 tokenId) external view returns (bool) {
    //     return _owners[tokenId] != address(0);
    // }
    
    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 _id) external view override returns (string memory) {
        require(_exists(_id), "ERC721Metadata: URI query for nonexistent token");
        return tokenUris[_id];
    }
    
    function setURI(string calldata _uri, uint256 _id) external onlyManager {
        //require(msg.sender == creators[_id]);
        tokenUris[_id] = _uri;
        emit URI(_uri, _id);
    }
    
    function setBatchURI(string calldata _uri, uint256[] calldata _id) external onlyManager {
        for (uint256 i = 0; i < _id.length; ++i) {
            uint256 id = _id[i];
            tokenUris[id] = _uri;
            emit URI(_uri, id);
        }
    }
    
    
    function setMultipleBatchURI(string[] calldata _uri, uint256[] calldata _id) external onlyManager {
        require(_id.length == _uri.length, "_ids and _uri array length must match.");
        for (uint256 i = 0; i < _id.length; ++i) {
            uint256 id = _id[i];
            string memory uri = _uri[i];
            tokenUris[id] = uri;
            emit URI(uri, id);
        }
    }
    
    
    function safeMint(uint256 _id, address _to, string calldata _uri) public onlyManager {
        require(_to != address(0), "ERC721: mint to the zero address");
        require(!_exists(_id), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), _to, _id);

        _balances[_to] += 1;
        _owners[_id] = _to;
        tokenUris[_id] = _uri;

        emit Transfer(address(0), _to, _id);
        emit URI(_uri, _id);
        
        
        if (_to.isContract()) {
            require(_checkOnERC721Received(address(0), _to, _id, ''), "ERC721: transfer to non ERC721Receiver implementer");
        }
    }
    
    // Batch mint tokens. Assign directly to _to[].
    function safeBatchMint(uint256[] calldata _id, address[] calldata _to, string calldata _uri) external onlyManager {
        require(_id.length == _to.length, "_ids and _to array length must match.");
        //require(msg.sender == creators[_id]);
        for (uint256 i = 0; i < _to.length; ++i) {

            address to = _to[i];
            uint256 id = _id[i];
            
            safeMint(id, to, _uri);
        }
    }
    
    //mint tokens. Assign directly to _to[].
    function safeMultipleBatchMint(uint256[] calldata _id, address[] calldata _to, string[] calldata _uri) external onlyManager {
        require(_id.length == _to.length, "_ids and _to array length must match.");
        require(_id.length == _uri.length, "_ids and _uri array length must match.");
        for (uint256 i = 0; i < _to.length; ++i) {

            address to = _to[i];
            uint256 id = _id[i];
            string calldata uri = _uri[i];
            
            safeMint(id, to, uri);
        }
    }
    
    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeBatchTransferFrom(address _from, address[] calldata _to, uint256[] calldata _tokenId) external {
        require(_to.length == _tokenId.length, "_to and _tokenId array length must match.");
        for (uint256 i = 0; i < _to.length; ++i) {
            address to = _to[i];
            uint256 tokenId = _tokenId[i];
            safeTransferFrom(_from, to, tokenId, "");
        }
    }
    
    function setSingleProperty(bytes32 _property, uint256 _id, uint256 _value) external onlyManager {
        Config[_id][_property] = _value;
    }
    
    function setMultipleProperty(bytes32 _property, uint256[] calldata _id, uint256[] calldata _value) external onlyManager {
        //require(msg.sender == creators[_id]);
        for (uint256 i = 0; i < _id.length; ++i) {
            Config[_id[i]][_property] = _value[i];
        }
    }
    
    function setBatchProperty(bytes32[] calldata _property, uint256[] calldata _id, uint256[] calldata _value) external onlyManager {
        //require(msg.sender == creators[_id]);
        for (uint256 i = 0; i < _id.length; ++i) {
            Config[_id[i]][_property[i]] = _value[i];
        }
    }
    
    function getSingleProperty(bytes32 _property, uint256 _id) public view returns (uint256 _value) {
        return Config[_id][_property];
    }
    
    function getMultipleProperty(bytes32 _property, uint256[] calldata _id) public view returns (uint256[] memory _value) {
        uint256[] memory K = new uint256[](_id.length);
        //require(msg.sender == creators[_id]);
        for (uint256 i = 0; i < _id.length; ++i) {
            K[i] = Config[_id[i]][_property];
        }
        
        return K;
    }
    
    function getBatchProperty(bytes32[] calldata _property, uint256[] calldata _id) public view returns (uint256[] memory _value) {
        uint256[] memory K = new uint256[](_id.length);
        //require(msg.sender == creators[_id]);
        for (uint256 i = 0; i < _id.length; ++i) {
            K[i] = Config[_id[i]][_property[i]];
        }
        
        return K;
    }
    
    
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"manager","type":"address"}],"name":"AddManager","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"manager","type":"address"}],"name":"RemoveManager","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_value","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"addManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_property","type":"bytes32[]"},{"internalType":"uint256[]","name":"_id","type":"uint256[]"}],"name":"getBatchProperty","outputs":[{"internalType":"uint256[]","name":"_value","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_property","type":"bytes32"},{"internalType":"uint256[]","name":"_id","type":"uint256[]"}],"name":"getMultipleProperty","outputs":[{"internalType":"uint256[]","name":"_value","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_property","type":"bytes32"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getSingleProperty","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"removeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_id","type":"uint256[]"},{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"string","name":"_uri","type":"string"}],"name":"safeBatchMint","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":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"string","name":"_uri","type":"string"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_id","type":"uint256[]"},{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"string[]","name":"_uri","type":"string[]"}],"name":"safeMultipleBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_property","type":"bytes32[]"},{"internalType":"uint256[]","name":"_id","type":"uint256[]"},{"internalType":"uint256[]","name":"_value","type":"uint256[]"}],"name":"setBatchProperty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"},{"internalType":"uint256[]","name":"_id","type":"uint256[]"}],"name":"setBatchURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"_uri","type":"string[]"},{"internalType":"uint256[]","name":"_id","type":"uint256[]"}],"name":"setMultipleBatchURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_property","type":"bytes32"},{"internalType":"uint256[]","name":"_id","type":"uint256[]"},{"internalType":"uint256[]","name":"_value","type":"uint256[]"}],"name":"setMultipleProperty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_property","type":"bytes32"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setSingleProperty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"setURI","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":"address","name":"owner","type":"address"}],"name":"tokenOfOwnerTotal","outputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenUris","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162005b8238038062005b82833981810160405281019062000037919062000258565b6000620000496200012260201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508160009080519060200190620001009291906200012a565b508060019080519060200190620001199291906200012a565b50505062000461565b600033905090565b828054620001389062000372565b90600052602060002090601f0160209004810192826200015c5760008555620001a8565b82601f106200017757805160ff1916838001178555620001a8565b82800160010185558215620001a8579182015b82811115620001a75782518255916020019190600101906200018a565b5b509050620001b79190620001bb565b5090565b5b80821115620001d6576000816000905550600101620001bc565b5090565b6000620001f1620001eb8462000306565b620002dd565b90508281526020810184848401111562000210576200020f62000441565b5b6200021d8482856200033c565b509392505050565b600082601f8301126200023d576200023c6200043c565b5b81516200024f848260208601620001da565b91505092915050565b600080604083850312156200027257620002716200044b565b5b600083015167ffffffffffffffff81111562000293576200029262000446565b5b620002a18582860162000225565b925050602083015167ffffffffffffffff811115620002c557620002c462000446565b5b620002d38582860162000225565b9150509250929050565b6000620002e9620002fc565b9050620002f78282620003a8565b919050565b6000604051905090565b600067ffffffffffffffff8211156200032457620003236200040d565b5b6200032f8262000450565b9050602081019050919050565b60005b838110156200035c5780820151818401526020810190506200033f565b838111156200036c576000848401525b50505050565b600060028204905060018216806200038b57607f821691505b60208210811415620003a257620003a1620003de565b5b50919050565b620003b38262000450565b810181811067ffffffffffffffff82111715620003d557620003d46200040d565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b61571180620004716000396000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c80638da5cb5b11610125578063b88d4fde116100ad578063ec4db2831161007c578063ec4db28314610643578063f2fde38b14610673578063f56d504f1461068f578063f626cf2c146106bf578063fb570bbf146106db5761021c565b8063b88d4fde146105ab578063c87b56dd146105c7578063d9965572146105f7578063e985e9c5146106135761021c565b80639dc54171116100f45780639dc541711461050b578063a22cb46514610527578063ac18de4314610543578063ae882b651461055f578063b0c4a0ea1461058f5761021c565b80638da5cb5b146104975780639034edb5146104b557806395d89b41146104d15780639c26eb3f146104ef5761021c565b80632d06177a116101a85780636352211e116101775780636352211e146103f557806367db3b8f1461042557806370a0823114610441578063715018a614610471578063769aaecc1461047b5761021c565b80632d06177a1461035d5780632f745c591461037957806342842e0e146103a95780634f6ccce7146103c55761021c565b8063095ea7b3116101ef578063095ea7b3146102cf57806318160ddd146102eb578063234d4386146103095780632350f1ea1461032557806323b872dd146103415761021c565b806301ffc9a714610221578063052641da1461025157806306fdde0314610281578063081812fc1461029f575b600080fd5b61023b600480360381019061023691906141f9565b61070b565b60405161024891906148b1565b60405180910390f35b61026b60048036038101906102669190614071565b610785565b604051610278919061488f565b60405180910390f35b61028961085f565b60405161029691906148f0565b60405180910390f35b6102b960048036038101906102b49190614334565b6108f1565b6040516102c69190614828565b60405180910390f35b6102e960048036038101906102e49190613d13565b610976565b005b6102f3610a80565b6040516103009190614bd2565b60405180910390f35b610323600480360381019061031e9190613c3e565b610a8d565b005b61033f600480360381019061033a9190613e88565b610b63565b005b61035b60048036038101906103569190613b68565b610daf565b005b61037760048036038101906103729190613afb565b610e08565b005b610393600480360381019061038e9190613d13565b610f3d565b6040516103a09190614bd2565b60405180910390f35b6103c360048036038101906103be9190613b68565b610fe2565b005b6103df60048036038101906103da9190614334565b611002565b6040516103ec9190614bd2565b60405180910390f35b61040f600480360381019061040a9190614334565b611073565b60405161041c9190614828565b60405180910390f35b61043f600480360381019061043a91906142d4565b611125565b005b61045b60048036038101906104569190613afb565b611279565b6040516104689190614bd2565b60405180910390f35b610479611331565b005b61049560048036038101906104909190613f09565b611489565b005b61049f6116b9565b6040516104ac9190614828565b60405180910390f35b6104cf60048036038101906104ca9190613dd4565b6116e3565b005b6104d9611871565b6040516104e691906148f0565b60405180910390f35b610509600480360381019061050491906140d1565b611903565b005b61052560048036038101906105209190613fbd565b611a77565b005b610541600480360381019061053c9190613cd3565b611c31565b005b61055d60048036038101906105589190613afb565b611d9d565b005b61057960048036038101906105749190614334565b611ed2565b60405161058691906148f0565b60405180910390f35b6105a960048036038101906105a49190614253565b611f72565b005b6105c560048036038101906105c09190613bbb565b612106565b005b6105e160048036038101906105dc9190614334565b612161565b6040516105ee91906148f0565b60405180910390f35b610611600480360381019061060c91906141a6565b61224e565b005b61062d60048036038101906106289190613b28565b61236e565b60405161063a91906148b1565b60405180910390f35b61065d60048036038101906106589190614166565b612402565b60405161066a9190614bd2565b60405180910390f35b61068d60048036038101906106889190613afb565b612431565b005b6106a960048036038101906106a49190613d53565b6125f8565b6040516106b6919061488f565b60405180910390f35b6106d960048036038101906106d49190614361565b6126ec565b005b6106f560048036038101906106f09190613afb565b612a8b565b604051610702919061488f565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061077e575061077d82612b7e565b5b9050919050565b606060008383905067ffffffffffffffff8111156107a6576107a5614fc9565b5b6040519080825280602002602001820160405280156107d45781602001602082028036833780820191505090505b50905060005b8484905081101561085357600c60008686848181106107fc576107fb614f9a565b5b90506020020135815260200190815260200160002060008781526020019081526020016000205482828151811061083657610835614f9a565b5b6020026020010181815250508061084c90614ec4565b90506107da565b50809150509392505050565b60606000805461086e90614e61565b80601f016020809104026020016040519081016040528092919081815260200182805461089a90614e61565b80156108e75780601f106108bc576101008083540402835291602001916108e7565b820191906000526020600020905b8154815290600101906020018083116108ca57829003601f168201915b5050505050905090565b60006108fc82612c60565b61093b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093290614ad2565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061098182611073565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e990614b52565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610a325750610a31813361236e565b5b610a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6890614a12565b60405180910390fd5b610a7b8383612ccc565b505050565b6000600880549050905090565b818190508484905014610ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acc906149b2565b60405180910390fd5b60005b84849050811015610b5b576000858583818110610af857610af7614f9a565b5b9050602002016020810190610b0d9190613afb565b90506000848484818110610b2457610b23614f9a565b5b905060200201359050610b4888838360405180602001604052806000815250612106565b505080610b5490614ec4565b9050610ad8565b505050505050565b610b6b612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610c165750600b6000610bcd612d85565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4c90614a92565b60405180910390fd5b838390508282905014610c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9490614b72565b60405180910390fd5b60005b82829050811015610da8576000838383818110610cc057610cbf614f9a565b5b9050602002013590506000868684818110610cde57610cdd614f9a565b5b9050602002810190610cf09190614bed565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905080600d60008481526020019081526020016000209080519060200190610d5c929190613736565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b82604051610d8d91906148f0565b60405180910390a2505080610da190614ec4565b9050610ca0565b5050505050565b610db93382612d8d565b610df8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610def90614b92565b60405180910390fd5b610e03838383612e6b565b505050565b610e10612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9690614af2565b60405180910390fd5b6001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f3630096a7f9a158ab9fae41e86bfe31fd2202585a26a9668242672566dae028d60405160405180910390a250565b6000610f4883611279565b8210610f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8090614912565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ffd83838360405180602001604052806000815250612106565b505050565b600061100c610a80565b821061104d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104490614bb2565b60405180910390fd5b6008828154811061106157611060614f9a565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561111c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111390614a52565b60405180910390fd5b80915050919050565b61112d612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806111d85750600b600061118f612d85565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120e90614a92565b60405180910390fd5b8282600d600084815260200190815260200160002091906112399291906137bc565b50807f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b848460405161126c9291906148cc565b60405180910390a2505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e190614a32565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611339612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bf90614af2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611491612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061153c5750600b60006114f3612d85565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61157b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157290614a92565b60405180910390fd5b8383905086869050146115c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ba90614a72565b60405180910390fd5b81819050868690501461160b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160290614b72565b60405180910390fd5b60005b848490508110156116b057600085858381811061162e5761162d614f9a565b5b90506020020160208101906116439190613afb565b9050600088888481811061165a57611659614f9a565b5b90506020020135905036600086868681811061167957611678614f9a565b5b905060200281019061168b9190614bed565b9150915061169b838584846126ec565b50505050806116a990614ec4565b905061160e565b50505050505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116eb612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806117965750600b600061174d612d85565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6117d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cc90614a92565b60405180910390fd5b60005b84849050811015611868578282828181106117f6576117f5614f9a565b5b90506020020135600c600087878581811061181457611813614f9a565b5b905060200201358152602001908152602001600020600089898581811061183e5761183d614f9a565b5b905060200201358152602001908152602001600020819055508061186190614ec4565b90506117d8565b50505050505050565b60606001805461188090614e61565b80601f01602080910402602001604051908101604052809291908181526020018280546118ac90614e61565b80156118f95780601f106118ce576101008083540402835291602001916118f9565b820191906000526020600020905b8154815290600101906020018083116118dc57829003601f168201915b5050505050905090565b61190b612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806119b65750600b600061196d612d85565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6119f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ec90614a92565b60405180910390fd5b60005b84849050811015611a6f57828282818110611a1657611a15614f9a565b5b90506020020135600c6000878785818110611a3457611a33614f9a565b5b90506020020135815260200190815260200160002060008881526020019081526020016000208190555080611a6890614ec4565b90506119f8565b505050505050565b611a7f612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611b2a5750600b6000611ae1612d85565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6090614a92565b60405180910390fd5b838390508686905014611bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba890614a72565b60405180910390fd5b60005b84849050811015611c28576000858583818110611bd457611bd3614f9a565b5b9050602002016020810190611be99190613afb565b90506000888884818110611c0057611bff614f9a565b5b905060200201359050611c15818387876126ec565b505080611c2190614ec4565b9050611bb4565b50505050505050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c97906149d2565b60405180910390fd5b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d9191906148b1565b60405180910390a35050565b611da5612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2b90614af2565b60405180910390fd5b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f1e25ed4cabec84d314dc176241019653f237da01f2bdd3a10cb0f38b33da676360405160405180910390a250565b600d6020528060005260406000206000915090508054611ef190614e61565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1d90614e61565b8015611f6a5780601f10611f3f57610100808354040283529160200191611f6a565b820191906000526020600020905b815481529060010190602001808311611f4d57829003601f168201915b505050505081565b611f7a612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806120255750600b6000611fdc612d85565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205b90614a92565b60405180910390fd5b60005b828290508110156120ff57600083838381811061208757612086614f9a565b5b9050602002013590508585600d600084815260200190815260200160002091906120b29291906137bc565b50807f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b87876040516120e59291906148cc565b60405180910390a250806120f890614ec4565b9050612067565b5050505050565b6121103383612d8d565b61214f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214690614b92565b60405180910390fd5b61215b848484846130c7565b50505050565b606061216c82612c60565b6121ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a290614b32565b60405180910390fd5b600d600083815260200190815260200160002080546121c990614e61565b80601f01602080910402602001604051908101604052809291908181526020018280546121f590614e61565b80156122425780601f1061221757610100808354040283529160200191612242565b820191906000526020600020905b81548152906001019060200180831161222557829003601f168201915b50505050509050919050565b612256612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806123015750600b60006122b8612d85565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233790614a92565b60405180910390fd5b80600c6000848152602001908152602001600020600085815260200190815260200160002081905550505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600c6000838152602001908152602001600020600084815260200190815260200160002054905092915050565b612439612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146124c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bf90614af2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252f90614952565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060008383905067ffffffffffffffff81111561261957612618614fc9565b5b6040519080825280602002602001820160405280156126475781602001602082028036833780820191505090505b50905060005b848490508110156126df57600c600086868481811061266f5761266e614f9a565b5b905060200201358152602001908152602001600020600088888481811061269957612698614f9a565b5b905060200201358152602001908152602001600020548282815181106126c2576126c1614f9a565b5b602002602001018181525050806126d890614ec4565b905061264d565b5080915050949350505050565b6126f4612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061279f5750600b6000612756612d85565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6127de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d590614a92565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561284e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284590614ab2565b60405180910390fd5b61285784612c60565b15612897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288e90614972565b60405180910390fd5b6128a360008486613123565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128f39190614d17565b92505081905550826002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508181600d6000878152602001908152602001600020919061296e9291906137bc565b50838373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4837f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b83836040516129fd9291906148cc565b60405180910390a2612a248373ffffffffffffffffffffffffffffffffffffffff16613237565b15612a8557612a45600084866040518060200160405280600081525061324a565b612a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7b90614932565b60405180910390fd5b5b50505050565b60606000612a9883611279565b905060008167ffffffffffffffff811115612ab657612ab5614fc9565b5b604051908082528060200260200182016040528015612ae45781602001602082028036833780820191505090505b50905060005b82811015612b7357600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002054828281518110612b5657612b55614f9a565b5b60200260200101818152505080612b6c90614ec4565b9050612aea565b508092505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c4957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612c595750612c58826133da565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612d3f83611073565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600033905090565b6000612d9882612c60565b612dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dce906149f2565b60405180910390fd5b6000612de283611073565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612e5157508373ffffffffffffffffffffffffffffffffffffffff16612e39846108f1565b73ffffffffffffffffffffffffffffffffffffffff16145b80612e625750612e61818561236e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612e8b82611073565b73ffffffffffffffffffffffffffffffffffffffff1614612ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed890614b12565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4890614992565b60405180910390fd5b612f5c838383613123565b612f67600082612ccc565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fb79190614d6d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461300e9190614d17565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6130d2848484612e6b565b6130de8484848461324a565b61311d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311490614932565b60405180910390fd5b50505050565b61312e83838361342b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131715761316c81613430565b6131b0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146131af576131ae8382613479565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131f3576131ee816135e6565b613232565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146132315761323082826136b7565b5b5b505050565b600080823b905060008111915050919050565b600061326b8473ffffffffffffffffffffffffffffffffffffffff16613237565b156133cd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b81526004016132af9493929190614843565b602060405180830381600087803b1580156132c957600080fd5b505af19250505080156132fa57506040513d601f19601f820116820180604052508101906132f79190614226565b60015b61337d573d806000811461332a576040519150601f19603f3d011682016040523d82523d6000602084013e61332f565b606091505b50600081511415613375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161336c90614932565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506133d2565b600190505b949350505050565b60006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161348684611279565b6134909190614d6d565b9050600060076000848152602001908152602001600020549050818114613575576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506135fa9190614d6d565b905060006009600084815260200190815260200160002054905060006008838154811061362a57613629614f9a565b5b90600052602060002001549050806008838154811061364c5761364b614f9a565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061369b5761369a614f6b565b5b6001900381819060005260206000200160009055905550505050565b60006136c283611279565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461374290614e61565b90600052602060002090601f01602090048101928261376457600085556137ab565b82601f1061377d57805160ff19168380011785556137ab565b828001600101855582156137ab579182015b828111156137aa57825182559160200191906001019061378f565b5b5090506137b89190613842565b5090565b8280546137c890614e61565b90600052602060002090601f0160209004810192826137ea5760008555613831565b82601f1061380357803560ff1916838001178555613831565b82800160010185558215613831579182015b82811115613830578235825591602001919060010190613815565b5b50905061383e9190613842565b5090565b5b8082111561385b576000816000905550600101613843565b5090565b600061387261386d84614c75565b614c50565b90508281526020810184848401111561388e5761388d615016565b5b613899848285614e1f565b509392505050565b6000813590506138b081615668565b92915050565b60008083601f8401126138cc576138cb614ffd565b5b8235905067ffffffffffffffff8111156138e9576138e8614ff8565b5b6020830191508360208202830111156139055761390461500c565b5b9250929050565b60008083601f84011261392257613921614ffd565b5b8235905067ffffffffffffffff81111561393f5761393e614ff8565b5b60208301915083602082028301111561395b5761395a61500c565b5b9250929050565b60008083601f84011261397857613977614ffd565b5b8235905067ffffffffffffffff81111561399557613994614ff8565b5b6020830191508360208202830111156139b1576139b061500c565b5b9250929050565b60008083601f8401126139ce576139cd614ffd565b5b8235905067ffffffffffffffff8111156139eb576139ea614ff8565b5b602083019150836020820283011115613a0757613a0661500c565b5b9250929050565b600081359050613a1d8161567f565b92915050565b600081359050613a3281615696565b92915050565b600081359050613a47816156ad565b92915050565b600081519050613a5c816156ad565b92915050565b600082601f830112613a7757613a76614ffd565b5b8135613a8784826020860161385f565b91505092915050565b60008083601f840112613aa657613aa5614ffd565b5b8235905067ffffffffffffffff811115613ac357613ac2614ff8565b5b602083019150836001820283011115613adf57613ade61500c565b5b9250929050565b600081359050613af5816156c4565b92915050565b600060208284031215613b1157613b10615020565b5b6000613b1f848285016138a1565b91505092915050565b60008060408385031215613b3f57613b3e615020565b5b6000613b4d858286016138a1565b9250506020613b5e858286016138a1565b9150509250929050565b600080600060608486031215613b8157613b80615020565b5b6000613b8f868287016138a1565b9350506020613ba0868287016138a1565b9250506040613bb186828701613ae6565b9150509250925092565b60008060008060808587031215613bd557613bd4615020565b5b6000613be3878288016138a1565b9450506020613bf4878288016138a1565b9350506040613c0587828801613ae6565b925050606085013567ffffffffffffffff811115613c2657613c2561501b565b5b613c3287828801613a62565b91505092959194509250565b600080600080600060608688031215613c5a57613c59615020565b5b6000613c68888289016138a1565b955050602086013567ffffffffffffffff811115613c8957613c8861501b565b5b613c95888289016138b6565b9450945050604086013567ffffffffffffffff811115613cb857613cb761501b565b5b613cc4888289016139b8565b92509250509295509295909350565b60008060408385031215613cea57613ce9615020565b5b6000613cf8858286016138a1565b9250506020613d0985828601613a0e565b9150509250929050565b60008060408385031215613d2a57613d29615020565b5b6000613d38858286016138a1565b9250506020613d4985828601613ae6565b9150509250929050565b60008060008060408587031215613d6d57613d6c615020565b5b600085013567ffffffffffffffff811115613d8b57613d8a61501b565b5b613d978782880161390c565b9450945050602085013567ffffffffffffffff811115613dba57613db961501b565b5b613dc6878288016139b8565b925092505092959194509250565b60008060008060008060608789031215613df157613df0615020565b5b600087013567ffffffffffffffff811115613e0f57613e0e61501b565b5b613e1b89828a0161390c565b9650965050602087013567ffffffffffffffff811115613e3e57613e3d61501b565b5b613e4a89828a016139b8565b9450945050604087013567ffffffffffffffff811115613e6d57613e6c61501b565b5b613e7989828a016139b8565b92509250509295509295509295565b60008060008060408587031215613ea257613ea1615020565b5b600085013567ffffffffffffffff811115613ec057613ebf61501b565b5b613ecc87828801613962565b9450945050602085013567ffffffffffffffff811115613eef57613eee61501b565b5b613efb878288016139b8565b925092505092959194509250565b60008060008060008060608789031215613f2657613f25615020565b5b600087013567ffffffffffffffff811115613f4457613f4361501b565b5b613f5089828a016139b8565b9650965050602087013567ffffffffffffffff811115613f7357613f7261501b565b5b613f7f89828a016138b6565b9450945050604087013567ffffffffffffffff811115613fa257613fa161501b565b5b613fae89828a01613962565b92509250509295509295509295565b60008060008060008060608789031215613fda57613fd9615020565b5b600087013567ffffffffffffffff811115613ff857613ff761501b565b5b61400489828a016139b8565b9650965050602087013567ffffffffffffffff8111156140275761402661501b565b5b61403389828a016138b6565b9450945050604087013567ffffffffffffffff8111156140565761405561501b565b5b61406289828a01613a90565b92509250509295509295509295565b60008060006040848603121561408a57614089615020565b5b600061409886828701613a23565b935050602084013567ffffffffffffffff8111156140b9576140b861501b565b5b6140c5868287016139b8565b92509250509250925092565b6000806000806000606086880312156140ed576140ec615020565b5b60006140fb88828901613a23565b955050602086013567ffffffffffffffff81111561411c5761411b61501b565b5b614128888289016139b8565b9450945050604086013567ffffffffffffffff81111561414b5761414a61501b565b5b614157888289016139b8565b92509250509295509295909350565b6000806040838503121561417d5761417c615020565b5b600061418b85828601613a23565b925050602061419c85828601613ae6565b9150509250929050565b6000806000606084860312156141bf576141be615020565b5b60006141cd86828701613a23565b93505060206141de86828701613ae6565b92505060406141ef86828701613ae6565b9150509250925092565b60006020828403121561420f5761420e615020565b5b600061421d84828501613a38565b91505092915050565b60006020828403121561423c5761423b615020565b5b600061424a84828501613a4d565b91505092915050565b6000806000806040858703121561426d5761426c615020565b5b600085013567ffffffffffffffff81111561428b5761428a61501b565b5b61429787828801613a90565b9450945050602085013567ffffffffffffffff8111156142ba576142b961501b565b5b6142c6878288016139b8565b925092505092959194509250565b6000806000604084860312156142ed576142ec615020565b5b600084013567ffffffffffffffff81111561430b5761430a61501b565b5b61431786828701613a90565b9350935050602061432a86828701613ae6565b9150509250925092565b60006020828403121561434a57614349615020565b5b600061435884828501613ae6565b91505092915050565b6000806000806060858703121561437b5761437a615020565b5b600061438987828801613ae6565b945050602061439a878288016138a1565b935050604085013567ffffffffffffffff8111156143bb576143ba61501b565b5b6143c787828801613a90565b925092505092959194509250565b60006143e1838361480a565b60208301905092915050565b6143f681614da1565b82525050565b600061440782614cb6565b6144118185614ce4565b935061441c83614ca6565b8060005b8381101561444d57815161443488826143d5565b975061443f83614cd7565b925050600181019050614420565b5085935050505092915050565b61446381614db3565b82525050565b600061447482614cc1565b61447e8185614cf5565b935061448e818560208601614e2e565b61449781615025565b840191505092915050565b60006144ae8385614d06565b93506144bb838584614e1f565b6144c483615025565b840190509392505050565b60006144da82614ccc565b6144e48185614d06565b93506144f4818560208601614e2e565b6144fd81615025565b840191505092915050565b6000614515602b83614d06565b915061452082615036565b604082019050919050565b6000614538603283614d06565b915061454382615085565b604082019050919050565b600061455b602683614d06565b9150614566826150d4565b604082019050919050565b600061457e601c83614d06565b915061458982615123565b602082019050919050565b60006145a1602483614d06565b91506145ac8261514c565b604082019050919050565b60006145c4602983614d06565b91506145cf8261519b565b604082019050919050565b60006145e7601983614d06565b91506145f2826151ea565b602082019050919050565b600061460a602c83614d06565b915061461582615213565b604082019050919050565b600061462d603883614d06565b915061463882615262565b604082019050919050565b6000614650602a83614d06565b915061465b826152b1565b604082019050919050565b6000614673602983614d06565b915061467e82615300565b604082019050919050565b6000614696602583614d06565b91506146a18261534f565b604082019050919050565b60006146b9602483614d06565b91506146c48261539e565b604082019050919050565b60006146dc602083614d06565b91506146e7826153ed565b602082019050919050565b60006146ff602c83614d06565b915061470a82615416565b604082019050919050565b6000614722602083614d06565b915061472d82615465565b602082019050919050565b6000614745602983614d06565b91506147508261548e565b604082019050919050565b6000614768602f83614d06565b9150614773826154dd565b604082019050919050565b600061478b602183614d06565b91506147968261552c565b604082019050919050565b60006147ae602683614d06565b91506147b98261557b565b604082019050919050565b60006147d1603183614d06565b91506147dc826155ca565b604082019050919050565b60006147f4602c83614d06565b91506147ff82615619565b604082019050919050565b61481381614e15565b82525050565b61482281614e15565b82525050565b600060208201905061483d60008301846143ed565b92915050565b600060808201905061485860008301876143ed565b61486560208301866143ed565b6148726040830185614819565b81810360608301526148848184614469565b905095945050505050565b600060208201905081810360008301526148a981846143fc565b905092915050565b60006020820190506148c6600083018461445a565b92915050565b600060208201905081810360008301526148e78184866144a2565b90509392505050565b6000602082019050818103600083015261490a81846144cf565b905092915050565b6000602082019050818103600083015261492b81614508565b9050919050565b6000602082019050818103600083015261494b8161452b565b9050919050565b6000602082019050818103600083015261496b8161454e565b9050919050565b6000602082019050818103600083015261498b81614571565b9050919050565b600060208201905081810360008301526149ab81614594565b9050919050565b600060208201905081810360008301526149cb816145b7565b9050919050565b600060208201905081810360008301526149eb816145da565b9050919050565b60006020820190508181036000830152614a0b816145fd565b9050919050565b60006020820190508181036000830152614a2b81614620565b9050919050565b60006020820190508181036000830152614a4b81614643565b9050919050565b60006020820190508181036000830152614a6b81614666565b9050919050565b60006020820190508181036000830152614a8b81614689565b9050919050565b60006020820190508181036000830152614aab816146ac565b9050919050565b60006020820190508181036000830152614acb816146cf565b9050919050565b60006020820190508181036000830152614aeb816146f2565b9050919050565b60006020820190508181036000830152614b0b81614715565b9050919050565b60006020820190508181036000830152614b2b81614738565b9050919050565b60006020820190508181036000830152614b4b8161475b565b9050919050565b60006020820190508181036000830152614b6b8161477e565b9050919050565b60006020820190508181036000830152614b8b816147a1565b9050919050565b60006020820190508181036000830152614bab816147c4565b9050919050565b60006020820190508181036000830152614bcb816147e7565b9050919050565b6000602082019050614be76000830184614819565b92915050565b60008083356001602003843603038112614c0a57614c09615007565b5b80840192508235915067ffffffffffffffff821115614c2c57614c2b615002565b5b602083019250600182023603831315614c4857614c47615011565b5b509250929050565b6000614c5a614c6b565b9050614c668282614e93565b919050565b6000604051905090565b600067ffffffffffffffff821115614c9057614c8f614fc9565b5b614c9982615025565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000614d2282614e15565b9150614d2d83614e15565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d6257614d61614f0d565b5b828201905092915050565b6000614d7882614e15565b9150614d8383614e15565b925082821015614d9657614d95614f0d565b5b828203905092915050565b6000614dac82614df5565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614e4c578082015181840152602081019050614e31565b83811115614e5b576000848401525b50505050565b60006002820490506001821680614e7957607f821691505b60208210811415614e8d57614e8c614f3c565b5b50919050565b614e9c82615025565b810181811067ffffffffffffffff82111715614ebb57614eba614fc9565b5b80604052505050565b6000614ecf82614e15565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f0257614f01614f0d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f5f746f20616e64205f746f6b656e4964206172726179206c656e677468206d7560008201527f7374206d617463682e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f5f69647320616e64205f746f206172726179206c656e677468206d757374206d60008201527f617463682e000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f74206f776e65722f6d616e60008201527f6167657200000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5f69647320616e64205f757269206172726179206c656e677468206d7573742060008201527f6d617463682e0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61567181614da1565b811461567c57600080fd5b50565b61568881614db3565b811461569357600080fd5b50565b61569f81614dbf565b81146156aa57600080fd5b50565b6156b681614dc9565b81146156c157600080fd5b50565b6156cd81614e15565b81146156d857600080fd5b5056fea26469706673582212206cca98241f9a7ea7213a69bb2d0f178986f5f26f2208d3b8b8f123cba93e75ed64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000018496e66696e69747920486561647365742047656e65736973000000000000000000000000000000000000000000000000000000000000000000000000000000034948470000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061021c5760003560e01c80638da5cb5b11610125578063b88d4fde116100ad578063ec4db2831161007c578063ec4db28314610643578063f2fde38b14610673578063f56d504f1461068f578063f626cf2c146106bf578063fb570bbf146106db5761021c565b8063b88d4fde146105ab578063c87b56dd146105c7578063d9965572146105f7578063e985e9c5146106135761021c565b80639dc54171116100f45780639dc541711461050b578063a22cb46514610527578063ac18de4314610543578063ae882b651461055f578063b0c4a0ea1461058f5761021c565b80638da5cb5b146104975780639034edb5146104b557806395d89b41146104d15780639c26eb3f146104ef5761021c565b80632d06177a116101a85780636352211e116101775780636352211e146103f557806367db3b8f1461042557806370a0823114610441578063715018a614610471578063769aaecc1461047b5761021c565b80632d06177a1461035d5780632f745c591461037957806342842e0e146103a95780634f6ccce7146103c55761021c565b8063095ea7b3116101ef578063095ea7b3146102cf57806318160ddd146102eb578063234d4386146103095780632350f1ea1461032557806323b872dd146103415761021c565b806301ffc9a714610221578063052641da1461025157806306fdde0314610281578063081812fc1461029f575b600080fd5b61023b600480360381019061023691906141f9565b61070b565b60405161024891906148b1565b60405180910390f35b61026b60048036038101906102669190614071565b610785565b604051610278919061488f565b60405180910390f35b61028961085f565b60405161029691906148f0565b60405180910390f35b6102b960048036038101906102b49190614334565b6108f1565b6040516102c69190614828565b60405180910390f35b6102e960048036038101906102e49190613d13565b610976565b005b6102f3610a80565b6040516103009190614bd2565b60405180910390f35b610323600480360381019061031e9190613c3e565b610a8d565b005b61033f600480360381019061033a9190613e88565b610b63565b005b61035b60048036038101906103569190613b68565b610daf565b005b61037760048036038101906103729190613afb565b610e08565b005b610393600480360381019061038e9190613d13565b610f3d565b6040516103a09190614bd2565b60405180910390f35b6103c360048036038101906103be9190613b68565b610fe2565b005b6103df60048036038101906103da9190614334565b611002565b6040516103ec9190614bd2565b60405180910390f35b61040f600480360381019061040a9190614334565b611073565b60405161041c9190614828565b60405180910390f35b61043f600480360381019061043a91906142d4565b611125565b005b61045b60048036038101906104569190613afb565b611279565b6040516104689190614bd2565b60405180910390f35b610479611331565b005b61049560048036038101906104909190613f09565b611489565b005b61049f6116b9565b6040516104ac9190614828565b60405180910390f35b6104cf60048036038101906104ca9190613dd4565b6116e3565b005b6104d9611871565b6040516104e691906148f0565b60405180910390f35b610509600480360381019061050491906140d1565b611903565b005b61052560048036038101906105209190613fbd565b611a77565b005b610541600480360381019061053c9190613cd3565b611c31565b005b61055d60048036038101906105589190613afb565b611d9d565b005b61057960048036038101906105749190614334565b611ed2565b60405161058691906148f0565b60405180910390f35b6105a960048036038101906105a49190614253565b611f72565b005b6105c560048036038101906105c09190613bbb565b612106565b005b6105e160048036038101906105dc9190614334565b612161565b6040516105ee91906148f0565b60405180910390f35b610611600480360381019061060c91906141a6565b61224e565b005b61062d60048036038101906106289190613b28565b61236e565b60405161063a91906148b1565b60405180910390f35b61065d60048036038101906106589190614166565b612402565b60405161066a9190614bd2565b60405180910390f35b61068d60048036038101906106889190613afb565b612431565b005b6106a960048036038101906106a49190613d53565b6125f8565b6040516106b6919061488f565b60405180910390f35b6106d960048036038101906106d49190614361565b6126ec565b005b6106f560048036038101906106f09190613afb565b612a8b565b604051610702919061488f565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061077e575061077d82612b7e565b5b9050919050565b606060008383905067ffffffffffffffff8111156107a6576107a5614fc9565b5b6040519080825280602002602001820160405280156107d45781602001602082028036833780820191505090505b50905060005b8484905081101561085357600c60008686848181106107fc576107fb614f9a565b5b90506020020135815260200190815260200160002060008781526020019081526020016000205482828151811061083657610835614f9a565b5b6020026020010181815250508061084c90614ec4565b90506107da565b50809150509392505050565b60606000805461086e90614e61565b80601f016020809104026020016040519081016040528092919081815260200182805461089a90614e61565b80156108e75780601f106108bc576101008083540402835291602001916108e7565b820191906000526020600020905b8154815290600101906020018083116108ca57829003601f168201915b5050505050905090565b60006108fc82612c60565b61093b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093290614ad2565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061098182611073565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e990614b52565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610a325750610a31813361236e565b5b610a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6890614a12565b60405180910390fd5b610a7b8383612ccc565b505050565b6000600880549050905090565b818190508484905014610ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acc906149b2565b60405180910390fd5b60005b84849050811015610b5b576000858583818110610af857610af7614f9a565b5b9050602002016020810190610b0d9190613afb565b90506000848484818110610b2457610b23614f9a565b5b905060200201359050610b4888838360405180602001604052806000815250612106565b505080610b5490614ec4565b9050610ad8565b505050505050565b610b6b612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610c165750600b6000610bcd612d85565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4c90614a92565b60405180910390fd5b838390508282905014610c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9490614b72565b60405180910390fd5b60005b82829050811015610da8576000838383818110610cc057610cbf614f9a565b5b9050602002013590506000868684818110610cde57610cdd614f9a565b5b9050602002810190610cf09190614bed565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905080600d60008481526020019081526020016000209080519060200190610d5c929190613736565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b82604051610d8d91906148f0565b60405180910390a2505080610da190614ec4565b9050610ca0565b5050505050565b610db93382612d8d565b610df8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610def90614b92565b60405180910390fd5b610e03838383612e6b565b505050565b610e10612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9690614af2565b60405180910390fd5b6001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f3630096a7f9a158ab9fae41e86bfe31fd2202585a26a9668242672566dae028d60405160405180910390a250565b6000610f4883611279565b8210610f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8090614912565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ffd83838360405180602001604052806000815250612106565b505050565b600061100c610a80565b821061104d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104490614bb2565b60405180910390fd5b6008828154811061106157611060614f9a565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561111c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111390614a52565b60405180910390fd5b80915050919050565b61112d612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806111d85750600b600061118f612d85565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120e90614a92565b60405180910390fd5b8282600d600084815260200190815260200160002091906112399291906137bc565b50807f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b848460405161126c9291906148cc565b60405180910390a2505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e190614a32565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611339612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bf90614af2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611491612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061153c5750600b60006114f3612d85565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61157b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157290614a92565b60405180910390fd5b8383905086869050146115c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ba90614a72565b60405180910390fd5b81819050868690501461160b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160290614b72565b60405180910390fd5b60005b848490508110156116b057600085858381811061162e5761162d614f9a565b5b90506020020160208101906116439190613afb565b9050600088888481811061165a57611659614f9a565b5b90506020020135905036600086868681811061167957611678614f9a565b5b905060200281019061168b9190614bed565b9150915061169b838584846126ec565b50505050806116a990614ec4565b905061160e565b50505050505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116eb612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806117965750600b600061174d612d85565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6117d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cc90614a92565b60405180910390fd5b60005b84849050811015611868578282828181106117f6576117f5614f9a565b5b90506020020135600c600087878581811061181457611813614f9a565b5b905060200201358152602001908152602001600020600089898581811061183e5761183d614f9a565b5b905060200201358152602001908152602001600020819055508061186190614ec4565b90506117d8565b50505050505050565b60606001805461188090614e61565b80601f01602080910402602001604051908101604052809291908181526020018280546118ac90614e61565b80156118f95780601f106118ce576101008083540402835291602001916118f9565b820191906000526020600020905b8154815290600101906020018083116118dc57829003601f168201915b5050505050905090565b61190b612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806119b65750600b600061196d612d85565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6119f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ec90614a92565b60405180910390fd5b60005b84849050811015611a6f57828282818110611a1657611a15614f9a565b5b90506020020135600c6000878785818110611a3457611a33614f9a565b5b90506020020135815260200190815260200160002060008881526020019081526020016000208190555080611a6890614ec4565b90506119f8565b505050505050565b611a7f612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611b2a5750600b6000611ae1612d85565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6090614a92565b60405180910390fd5b838390508686905014611bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba890614a72565b60405180910390fd5b60005b84849050811015611c28576000858583818110611bd457611bd3614f9a565b5b9050602002016020810190611be99190613afb565b90506000888884818110611c0057611bff614f9a565b5b905060200201359050611c15818387876126ec565b505080611c2190614ec4565b9050611bb4565b50505050505050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c97906149d2565b60405180910390fd5b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d9191906148b1565b60405180910390a35050565b611da5612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2b90614af2565b60405180910390fd5b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f1e25ed4cabec84d314dc176241019653f237da01f2bdd3a10cb0f38b33da676360405160405180910390a250565b600d6020528060005260406000206000915090508054611ef190614e61565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1d90614e61565b8015611f6a5780601f10611f3f57610100808354040283529160200191611f6a565b820191906000526020600020905b815481529060010190602001808311611f4d57829003601f168201915b505050505081565b611f7a612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806120255750600b6000611fdc612d85565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205b90614a92565b60405180910390fd5b60005b828290508110156120ff57600083838381811061208757612086614f9a565b5b9050602002013590508585600d600084815260200190815260200160002091906120b29291906137bc565b50807f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b87876040516120e59291906148cc565b60405180910390a250806120f890614ec4565b9050612067565b5050505050565b6121103383612d8d565b61214f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214690614b92565b60405180910390fd5b61215b848484846130c7565b50505050565b606061216c82612c60565b6121ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a290614b32565b60405180910390fd5b600d600083815260200190815260200160002080546121c990614e61565b80601f01602080910402602001604051908101604052809291908181526020018280546121f590614e61565b80156122425780601f1061221757610100808354040283529160200191612242565b820191906000526020600020905b81548152906001019060200180831161222557829003601f168201915b50505050509050919050565b612256612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806123015750600b60006122b8612d85565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233790614a92565b60405180910390fd5b80600c6000848152602001908152602001600020600085815260200190815260200160002081905550505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600c6000838152602001908152602001600020600084815260200190815260200160002054905092915050565b612439612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146124c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bf90614af2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252f90614952565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060008383905067ffffffffffffffff81111561261957612618614fc9565b5b6040519080825280602002602001820160405280156126475781602001602082028036833780820191505090505b50905060005b848490508110156126df57600c600086868481811061266f5761266e614f9a565b5b905060200201358152602001908152602001600020600088888481811061269957612698614f9a565b5b905060200201358152602001908152602001600020548282815181106126c2576126c1614f9a565b5b602002602001018181525050806126d890614ec4565b905061264d565b5080915050949350505050565b6126f4612d85565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061279f5750600b6000612756612d85565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6127de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d590614a92565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561284e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284590614ab2565b60405180910390fd5b61285784612c60565b15612897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288e90614972565b60405180910390fd5b6128a360008486613123565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128f39190614d17565b92505081905550826002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508181600d6000878152602001908152602001600020919061296e9291906137bc565b50838373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4837f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b83836040516129fd9291906148cc565b60405180910390a2612a248373ffffffffffffffffffffffffffffffffffffffff16613237565b15612a8557612a45600084866040518060200160405280600081525061324a565b612a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7b90614932565b60405180910390fd5b5b50505050565b60606000612a9883611279565b905060008167ffffffffffffffff811115612ab657612ab5614fc9565b5b604051908082528060200260200182016040528015612ae45781602001602082028036833780820191505090505b50905060005b82811015612b7357600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002054828281518110612b5657612b55614f9a565b5b60200260200101818152505080612b6c90614ec4565b9050612aea565b508092505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c4957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612c595750612c58826133da565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612d3f83611073565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600033905090565b6000612d9882612c60565b612dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dce906149f2565b60405180910390fd5b6000612de283611073565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612e5157508373ffffffffffffffffffffffffffffffffffffffff16612e39846108f1565b73ffffffffffffffffffffffffffffffffffffffff16145b80612e625750612e61818561236e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612e8b82611073565b73ffffffffffffffffffffffffffffffffffffffff1614612ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed890614b12565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4890614992565b60405180910390fd5b612f5c838383613123565b612f67600082612ccc565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fb79190614d6d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461300e9190614d17565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6130d2848484612e6b565b6130de8484848461324a565b61311d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311490614932565b60405180910390fd5b50505050565b61312e83838361342b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131715761316c81613430565b6131b0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146131af576131ae8382613479565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131f3576131ee816135e6565b613232565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146132315761323082826136b7565b5b5b505050565b600080823b905060008111915050919050565b600061326b8473ffffffffffffffffffffffffffffffffffffffff16613237565b156133cd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b81526004016132af9493929190614843565b602060405180830381600087803b1580156132c957600080fd5b505af19250505080156132fa57506040513d601f19601f820116820180604052508101906132f79190614226565b60015b61337d573d806000811461332a576040519150601f19603f3d011682016040523d82523d6000602084013e61332f565b606091505b50600081511415613375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161336c90614932565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506133d2565b600190505b949350505050565b60006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161348684611279565b6134909190614d6d565b9050600060076000848152602001908152602001600020549050818114613575576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506135fa9190614d6d565b905060006009600084815260200190815260200160002054905060006008838154811061362a57613629614f9a565b5b90600052602060002001549050806008838154811061364c5761364b614f9a565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061369b5761369a614f6b565b5b6001900381819060005260206000200160009055905550505050565b60006136c283611279565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461374290614e61565b90600052602060002090601f01602090048101928261376457600085556137ab565b82601f1061377d57805160ff19168380011785556137ab565b828001600101855582156137ab579182015b828111156137aa57825182559160200191906001019061378f565b5b5090506137b89190613842565b5090565b8280546137c890614e61565b90600052602060002090601f0160209004810192826137ea5760008555613831565b82601f1061380357803560ff1916838001178555613831565b82800160010185558215613831579182015b82811115613830578235825591602001919060010190613815565b5b50905061383e9190613842565b5090565b5b8082111561385b576000816000905550600101613843565b5090565b600061387261386d84614c75565b614c50565b90508281526020810184848401111561388e5761388d615016565b5b613899848285614e1f565b509392505050565b6000813590506138b081615668565b92915050565b60008083601f8401126138cc576138cb614ffd565b5b8235905067ffffffffffffffff8111156138e9576138e8614ff8565b5b6020830191508360208202830111156139055761390461500c565b5b9250929050565b60008083601f84011261392257613921614ffd565b5b8235905067ffffffffffffffff81111561393f5761393e614ff8565b5b60208301915083602082028301111561395b5761395a61500c565b5b9250929050565b60008083601f84011261397857613977614ffd565b5b8235905067ffffffffffffffff81111561399557613994614ff8565b5b6020830191508360208202830111156139b1576139b061500c565b5b9250929050565b60008083601f8401126139ce576139cd614ffd565b5b8235905067ffffffffffffffff8111156139eb576139ea614ff8565b5b602083019150836020820283011115613a0757613a0661500c565b5b9250929050565b600081359050613a1d8161567f565b92915050565b600081359050613a3281615696565b92915050565b600081359050613a47816156ad565b92915050565b600081519050613a5c816156ad565b92915050565b600082601f830112613a7757613a76614ffd565b5b8135613a8784826020860161385f565b91505092915050565b60008083601f840112613aa657613aa5614ffd565b5b8235905067ffffffffffffffff811115613ac357613ac2614ff8565b5b602083019150836001820283011115613adf57613ade61500c565b5b9250929050565b600081359050613af5816156c4565b92915050565b600060208284031215613b1157613b10615020565b5b6000613b1f848285016138a1565b91505092915050565b60008060408385031215613b3f57613b3e615020565b5b6000613b4d858286016138a1565b9250506020613b5e858286016138a1565b9150509250929050565b600080600060608486031215613b8157613b80615020565b5b6000613b8f868287016138a1565b9350506020613ba0868287016138a1565b9250506040613bb186828701613ae6565b9150509250925092565b60008060008060808587031215613bd557613bd4615020565b5b6000613be3878288016138a1565b9450506020613bf4878288016138a1565b9350506040613c0587828801613ae6565b925050606085013567ffffffffffffffff811115613c2657613c2561501b565b5b613c3287828801613a62565b91505092959194509250565b600080600080600060608688031215613c5a57613c59615020565b5b6000613c68888289016138a1565b955050602086013567ffffffffffffffff811115613c8957613c8861501b565b5b613c95888289016138b6565b9450945050604086013567ffffffffffffffff811115613cb857613cb761501b565b5b613cc4888289016139b8565b92509250509295509295909350565b60008060408385031215613cea57613ce9615020565b5b6000613cf8858286016138a1565b9250506020613d0985828601613a0e565b9150509250929050565b60008060408385031215613d2a57613d29615020565b5b6000613d38858286016138a1565b9250506020613d4985828601613ae6565b9150509250929050565b60008060008060408587031215613d6d57613d6c615020565b5b600085013567ffffffffffffffff811115613d8b57613d8a61501b565b5b613d978782880161390c565b9450945050602085013567ffffffffffffffff811115613dba57613db961501b565b5b613dc6878288016139b8565b925092505092959194509250565b60008060008060008060608789031215613df157613df0615020565b5b600087013567ffffffffffffffff811115613e0f57613e0e61501b565b5b613e1b89828a0161390c565b9650965050602087013567ffffffffffffffff811115613e3e57613e3d61501b565b5b613e4a89828a016139b8565b9450945050604087013567ffffffffffffffff811115613e6d57613e6c61501b565b5b613e7989828a016139b8565b92509250509295509295509295565b60008060008060408587031215613ea257613ea1615020565b5b600085013567ffffffffffffffff811115613ec057613ebf61501b565b5b613ecc87828801613962565b9450945050602085013567ffffffffffffffff811115613eef57613eee61501b565b5b613efb878288016139b8565b925092505092959194509250565b60008060008060008060608789031215613f2657613f25615020565b5b600087013567ffffffffffffffff811115613f4457613f4361501b565b5b613f5089828a016139b8565b9650965050602087013567ffffffffffffffff811115613f7357613f7261501b565b5b613f7f89828a016138b6565b9450945050604087013567ffffffffffffffff811115613fa257613fa161501b565b5b613fae89828a01613962565b92509250509295509295509295565b60008060008060008060608789031215613fda57613fd9615020565b5b600087013567ffffffffffffffff811115613ff857613ff761501b565b5b61400489828a016139b8565b9650965050602087013567ffffffffffffffff8111156140275761402661501b565b5b61403389828a016138b6565b9450945050604087013567ffffffffffffffff8111156140565761405561501b565b5b61406289828a01613a90565b92509250509295509295509295565b60008060006040848603121561408a57614089615020565b5b600061409886828701613a23565b935050602084013567ffffffffffffffff8111156140b9576140b861501b565b5b6140c5868287016139b8565b92509250509250925092565b6000806000806000606086880312156140ed576140ec615020565b5b60006140fb88828901613a23565b955050602086013567ffffffffffffffff81111561411c5761411b61501b565b5b614128888289016139b8565b9450945050604086013567ffffffffffffffff81111561414b5761414a61501b565b5b614157888289016139b8565b92509250509295509295909350565b6000806040838503121561417d5761417c615020565b5b600061418b85828601613a23565b925050602061419c85828601613ae6565b9150509250929050565b6000806000606084860312156141bf576141be615020565b5b60006141cd86828701613a23565b93505060206141de86828701613ae6565b92505060406141ef86828701613ae6565b9150509250925092565b60006020828403121561420f5761420e615020565b5b600061421d84828501613a38565b91505092915050565b60006020828403121561423c5761423b615020565b5b600061424a84828501613a4d565b91505092915050565b6000806000806040858703121561426d5761426c615020565b5b600085013567ffffffffffffffff81111561428b5761428a61501b565b5b61429787828801613a90565b9450945050602085013567ffffffffffffffff8111156142ba576142b961501b565b5b6142c6878288016139b8565b925092505092959194509250565b6000806000604084860312156142ed576142ec615020565b5b600084013567ffffffffffffffff81111561430b5761430a61501b565b5b61431786828701613a90565b9350935050602061432a86828701613ae6565b9150509250925092565b60006020828403121561434a57614349615020565b5b600061435884828501613ae6565b91505092915050565b6000806000806060858703121561437b5761437a615020565b5b600061438987828801613ae6565b945050602061439a878288016138a1565b935050604085013567ffffffffffffffff8111156143bb576143ba61501b565b5b6143c787828801613a90565b925092505092959194509250565b60006143e1838361480a565b60208301905092915050565b6143f681614da1565b82525050565b600061440782614cb6565b6144118185614ce4565b935061441c83614ca6565b8060005b8381101561444d57815161443488826143d5565b975061443f83614cd7565b925050600181019050614420565b5085935050505092915050565b61446381614db3565b82525050565b600061447482614cc1565b61447e8185614cf5565b935061448e818560208601614e2e565b61449781615025565b840191505092915050565b60006144ae8385614d06565b93506144bb838584614e1f565b6144c483615025565b840190509392505050565b60006144da82614ccc565b6144e48185614d06565b93506144f4818560208601614e2e565b6144fd81615025565b840191505092915050565b6000614515602b83614d06565b915061452082615036565b604082019050919050565b6000614538603283614d06565b915061454382615085565b604082019050919050565b600061455b602683614d06565b9150614566826150d4565b604082019050919050565b600061457e601c83614d06565b915061458982615123565b602082019050919050565b60006145a1602483614d06565b91506145ac8261514c565b604082019050919050565b60006145c4602983614d06565b91506145cf8261519b565b604082019050919050565b60006145e7601983614d06565b91506145f2826151ea565b602082019050919050565b600061460a602c83614d06565b915061461582615213565b604082019050919050565b600061462d603883614d06565b915061463882615262565b604082019050919050565b6000614650602a83614d06565b915061465b826152b1565b604082019050919050565b6000614673602983614d06565b915061467e82615300565b604082019050919050565b6000614696602583614d06565b91506146a18261534f565b604082019050919050565b60006146b9602483614d06565b91506146c48261539e565b604082019050919050565b60006146dc602083614d06565b91506146e7826153ed565b602082019050919050565b60006146ff602c83614d06565b915061470a82615416565b604082019050919050565b6000614722602083614d06565b915061472d82615465565b602082019050919050565b6000614745602983614d06565b91506147508261548e565b604082019050919050565b6000614768602f83614d06565b9150614773826154dd565b604082019050919050565b600061478b602183614d06565b91506147968261552c565b604082019050919050565b60006147ae602683614d06565b91506147b98261557b565b604082019050919050565b60006147d1603183614d06565b91506147dc826155ca565b604082019050919050565b60006147f4602c83614d06565b91506147ff82615619565b604082019050919050565b61481381614e15565b82525050565b61482281614e15565b82525050565b600060208201905061483d60008301846143ed565b92915050565b600060808201905061485860008301876143ed565b61486560208301866143ed565b6148726040830185614819565b81810360608301526148848184614469565b905095945050505050565b600060208201905081810360008301526148a981846143fc565b905092915050565b60006020820190506148c6600083018461445a565b92915050565b600060208201905081810360008301526148e78184866144a2565b90509392505050565b6000602082019050818103600083015261490a81846144cf565b905092915050565b6000602082019050818103600083015261492b81614508565b9050919050565b6000602082019050818103600083015261494b8161452b565b9050919050565b6000602082019050818103600083015261496b8161454e565b9050919050565b6000602082019050818103600083015261498b81614571565b9050919050565b600060208201905081810360008301526149ab81614594565b9050919050565b600060208201905081810360008301526149cb816145b7565b9050919050565b600060208201905081810360008301526149eb816145da565b9050919050565b60006020820190508181036000830152614a0b816145fd565b9050919050565b60006020820190508181036000830152614a2b81614620565b9050919050565b60006020820190508181036000830152614a4b81614643565b9050919050565b60006020820190508181036000830152614a6b81614666565b9050919050565b60006020820190508181036000830152614a8b81614689565b9050919050565b60006020820190508181036000830152614aab816146ac565b9050919050565b60006020820190508181036000830152614acb816146cf565b9050919050565b60006020820190508181036000830152614aeb816146f2565b9050919050565b60006020820190508181036000830152614b0b81614715565b9050919050565b60006020820190508181036000830152614b2b81614738565b9050919050565b60006020820190508181036000830152614b4b8161475b565b9050919050565b60006020820190508181036000830152614b6b8161477e565b9050919050565b60006020820190508181036000830152614b8b816147a1565b9050919050565b60006020820190508181036000830152614bab816147c4565b9050919050565b60006020820190508181036000830152614bcb816147e7565b9050919050565b6000602082019050614be76000830184614819565b92915050565b60008083356001602003843603038112614c0a57614c09615007565b5b80840192508235915067ffffffffffffffff821115614c2c57614c2b615002565b5b602083019250600182023603831315614c4857614c47615011565b5b509250929050565b6000614c5a614c6b565b9050614c668282614e93565b919050565b6000604051905090565b600067ffffffffffffffff821115614c9057614c8f614fc9565b5b614c9982615025565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000614d2282614e15565b9150614d2d83614e15565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d6257614d61614f0d565b5b828201905092915050565b6000614d7882614e15565b9150614d8383614e15565b925082821015614d9657614d95614f0d565b5b828203905092915050565b6000614dac82614df5565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614e4c578082015181840152602081019050614e31565b83811115614e5b576000848401525b50505050565b60006002820490506001821680614e7957607f821691505b60208210811415614e8d57614e8c614f3c565b5b50919050565b614e9c82615025565b810181811067ffffffffffffffff82111715614ebb57614eba614fc9565b5b80604052505050565b6000614ecf82614e15565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f0257614f01614f0d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f5f746f20616e64205f746f6b656e4964206172726179206c656e677468206d7560008201527f7374206d617463682e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f5f69647320616e64205f746f206172726179206c656e677468206d757374206d60008201527f617463682e000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f74206f776e65722f6d616e60008201527f6167657200000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5f69647320616e64205f757269206172726179206c656e677468206d7573742060008201527f6d617463682e0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61567181614da1565b811461567c57600080fd5b50565b61568881614db3565b811461569357600080fd5b50565b61569f81614dbf565b81146156aa57600080fd5b50565b6156b681614dc9565b81146156c157600080fd5b50565b6156cd81614e15565b81146156d857600080fd5b5056fea26469706673582212206cca98241f9a7ea7213a69bb2d0f178986f5f26f2208d3b8b8f123cba93e75ed64736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000018496e66696e69747920486561647365742047656e65736973000000000000000000000000000000000000000000000000000000000000000000000000000000034948470000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): Infinity Headset Genesis
Arg [1] : symbol_ (string): IHG

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000018
Arg [3] : 496e66696e69747920486561647365742047656e657369730000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 4948470000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

44196:5907:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37672:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49323:371;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18021:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18817:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18358:393;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38722:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47972:406;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45740:398;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19701:303;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34995:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37993:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20075:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38912:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17715:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45258:191;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17445:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35627:148;;;:::i;:::-;;47366:531;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34526:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48852:303;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18190:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48548:292;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46868:440;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19110:289;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35138:138;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44416:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45461:261;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20297:283;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45045:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48390:146;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19470:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49167:144;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35930:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49706:382;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46156:647;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38267:379;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37672:237;37774:4;37813:35;37798:50;;;:11;:50;;;;:103;;;;37865:36;37889:11;37865:23;:36::i;:::-;37798:103;37791:110;;37672:237;;;:::o;49323:371::-;49416:23;49452:18;49487:3;;:10;;49473:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49452:46;;49563:9;49558:100;49582:3;;:10;;49578:1;:14;49558:100;;;49621:6;:14;49628:3;;49632:1;49628:6;;;;;;;:::i;:::-;;;;;;;;49621:14;;;;;;;;;;;:25;49636:9;49621:25;;;;;;;;;;;;49614:1;49616;49614:4;;;;;;;;:::i;:::-;;;;;;;:32;;;;;49594:3;;;;:::i;:::-;;;49558:100;;;;49685:1;49678:8;;;49323:371;;;;;:::o;18021:100::-;18075:13;18108:5;18101:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18021:100;:::o;18817:221::-;18893:7;18921:16;18929:7;18921;:16::i;:::-;18913:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19006:15;:24;19022:7;19006:24;;;;;;;;;;;;;;;;;;;;;18999:31;;18817:221;;;:::o;18358:393::-;18439:13;18455:23;18470:7;18455:14;:23::i;:::-;18439:39;;18503:5;18497:11;;:2;:11;;;;18489:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;18581:5;18567:19;;:10;:19;;;:58;;;;18590:35;18607:5;18614:10;18590:16;:35::i;:::-;18567:58;18559:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;18722:21;18731:2;18735:7;18722:8;:21::i;:::-;18428:323;18358:393;;:::o;38722:113::-;38783:7;38810:10;:17;;;;38803:24;;38722:113;:::o;47972:406::-;48113:8;;:15;;48099:3;;:10;;:29;48091:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;48190:9;48185:186;48209:3;;:10;;48205:1;:14;48185:186;;;48241:10;48254:3;;48258:1;48254:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;48241:19;;48275:15;48293:8;;48302:1;48293:11;;;;;;;:::i;:::-;;;;;;;;48275:29;;48319:40;48336:5;48343:2;48347:7;48319:40;;;;;;;;;;;;:16;:40::i;:::-;48226:145;;48221:3;;;;:::i;:::-;;;48185:186;;;;47972:406;;;;;:::o;45740:398::-;34882:12;:10;:12::i;:::-;34872:22;;:6;;;;;;;;;;;:22;;;34871:51;;;;34899:9;:23;34909:12;:10;:12::i;:::-;34899:23;;;;;;;;;;;;;;;;;;;;;;;;;34871:51;34863:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;45871:4:::1;;:11;;45857:3;;:10;;:25;45849:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;45941:9;45936:195;45960:3;;:10;;45956:1;:14;45936:195;;;45992:10;46005:3;;46009:1;46005:6;;;;;;;:::i;:::-;;;;;;;;45992:19;;46026:17;46046:4;;46051:1;46046:7;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;46026:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46084:3;46068:9;:13;46078:2;46068:13;;;;;;;;;;;:19;;;;;;;;;;;;:::i;:::-;;46116:2;46107:12;46111:3;46107:12;;;;;;:::i;:::-;;;;;;;;45977:154;;45972:3;;;;:::i;:::-;;;45936:195;;;;45740:398:::0;;;;:::o;19701:303::-;19862:39;19881:10;19893:7;19862:18;:39::i;:::-;19854:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;19968:28;19978:4;19984:2;19988:7;19968:9;:28::i;:::-;19701:303;;;:::o;34995:131::-;34748:12;:10;:12::i;:::-;34738:22;;:6;;;;;;;;;;;:22;;;34730:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35079:4:::1;35060:9;:18;35070:7;35060:18;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;35110:7;35099:19;;;;;;;;;;;;34995:131:::0;:::o;37993:256::-;38090:7;38126:23;38143:5;38126:16;:23::i;:::-;38118:5;:31;38110:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38215:12;:19;38228:5;38215:19;;;;;;;;;;;;;;;:26;38235:5;38215:26;;;;;;;;;;;;38208:33;;37993:256;;;;:::o;20075:151::-;20179:39;20196:4;20202:2;20206:7;20179:39;;;;;;;;;;;;:16;:39::i;:::-;20075:151;;;:::o;38912:233::-;38987:7;39023:30;:28;:30::i;:::-;39015:5;:38;39007:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39120:10;39131:5;39120:17;;;;;;;;:::i;:::-;;;;;;;;;;39113:24;;38912:233;;;:::o;17715:239::-;17787:7;17807:13;17823:7;:16;17831:7;17823:16;;;;;;;;;;;;;;;;;;;;;17807:32;;17875:1;17858:19;;:5;:19;;;;17850:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;17941:5;17934:12;;;17715:239;;;:::o;45258:191::-;34882:12;:10;:12::i;:::-;34872:22;;:6;;;;;;;;;;;:22;;;34871:51;;;;34899:9;:23;34909:12;:10;:12::i;:::-;34899:23;;;;;;;;;;;;;;;;;;;;;;;;;34871:51;34863:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;45407:4:::1;;45390:9;:14;45400:3;45390:14;;;;;;;;;;;:21;;;;;;;:::i;:::-;;45437:3;45427:14;45431:4;;45427:14;;;;;;;:::i;:::-;;;;;;;;45258:191:::0;;;:::o;17445:208::-;17517:7;17562:1;17545:19;;:5;:19;;;;17537:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;17629:9;:16;17639:5;17629:16;;;;;;;;;;;;;;;;17622:23;;17445:208;;;:::o;35627:148::-;34748:12;:10;:12::i;:::-;34738:22;;:6;;;;;;;;;;;:22;;;34730:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35734:1:::1;35697:40;;35718:6;;;;;;;;;;;35697:40;;;;;;;;;;;;35765:1;35748:6;;:19;;;;;;;;;;;;;;;;;;35627:148::o:0;47366:531::-;34882:12;:10;:12::i;:::-;34872:22;;:6;;;;;;;;;;;:22;;;34871:51;;;;34899:9;:23;34909:12;:10;:12::i;:::-;34899:23;;;;;;;;;;;;;;;;;;;;;;;;;34871:51;34863:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;47523:3:::1;;:10;;47509:3;;:10;;:24;47501:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;47608:4;;:11;;47594:3;;:10;;:25;47586:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;47678:9;47673:217;47697:3;;:10;;47693:1;:14;47673:217;;;47731:10;47744:3;;47748:1;47744:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;47731:19;;47765:10;47778:3;;47782:1;47778:6;;;;;;;:::i;:::-;;;;;;;;47765:19;;47799;;47821:4;;47826:1;47821:7;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;47799:29;;;;47857:21;47866:2;47870;47874:3;;47857:8;:21::i;:::-;47714:176;;;;47709:3;;;;:::i;:::-;;;47673:217;;;;47366:531:::0;;;;;;:::o;34526:79::-;34564:7;34591:6;;;;;;;;;;;34584:13;;34526:79;:::o;48852:303::-;34882:12;:10;:12::i;:::-;34872:22;;:6;;;;;;;;;;;:22;;;34871:51;;;;34899:9;:23;34909:12;:10;:12::i;:::-;34899:23;;;;;;;;;;;;;;;;;;;;;;;;;34871:51;34863:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;49045:9:::1;49040:108;49064:3;;:10;;49060:1;:14;49040:108;;;49127:6;;49134:1;49127:9;;;;;;;:::i;:::-;;;;;;;;49096:6;:14;49103:3;;49107:1;49103:6;;;;;;;:::i;:::-;;;;;;;;49096:14;;;;;;;;;;;:28;49111:9;;49121:1;49111:12;;;;;;;:::i;:::-;;;;;;;;49096:28;;;;;;;;;;;:40;;;;49076:3;;;;:::i;:::-;;;49040:108;;;;48852:303:::0;;;;;;:::o;18190:104::-;18246:13;18279:7;18272:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18190:104;:::o;48548:292::-;34882:12;:10;:12::i;:::-;34872:22;;:6;;;;;;;;;;;:22;;;34871:51;;;;34899:9;:23;34909:12;:10;:12::i;:::-;34899:23;;;;;;;;;;;;;;;;;;;;;;;;;34871:51;34863:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;48733:9:::1;48728:105;48752:3;;:10;;48748:1;:14;48728:105;;;48812:6;;48819:1;48812:9;;;;;;;:::i;:::-;;;;;;;;48784:6;:14;48791:3;;48795:1;48791:6;;;;;;;:::i;:::-;;;;;;;;48784:14;;;;;;;;;;;:25;48799:9;48784:25;;;;;;;;;;;:37;;;;48764:3;;;;:::i;:::-;;;48728:105;;;;48548:292:::0;;;;;:::o;46868:440::-;34882:12;:10;:12::i;:::-;34872:22;;:6;;;;;;;;;;;:22;;;34871:51;;;;34899:9;:23;34909:12;:10;:12::i;:::-;34899:23;;;;;;;;;;;;;;;;;;;;;;;;;34871:51;34863:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;47015:3:::1;;:10;;47001:3;;:10;;:24;46993:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;47132:9;47127:174;47151:3;;:10;;47147:1;:14;47127:174;;;47185:10;47198:3;;47202:1;47198:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;47185:19;;47219:10;47232:3;;47236:1;47232:6;;;;;;;:::i;:::-;;;;;;;;47219:19;;47267:22;47276:2;47280;47284:4;;47267:8;:22::i;:::-;47168:133;;47163:3;;;;:::i;:::-;;;47127:174;;;;46868:440:::0;;;;;;:::o;19110:289::-;19225:10;19213:22;;:8;:22;;;;19205:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;19321:8;19278:18;:30;19297:10;19278:30;;;;;;;;;;;;;;;:40;19309:8;19278:40;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;19372:8;19345:46;;19360:10;19345:46;;;19382:8;19345:46;;;;;;:::i;:::-;;;;;;;;19110:289;;:::o;35138:138::-;34748:12;:10;:12::i;:::-;34738:22;;:6;;;;;;;;;;;:22;;;34730:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35225:5:::1;35206:9;:18;35216:7;35206:18;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;35260:7;35246:22;;;;;;;;;;;;35138:138:::0;:::o;44416:43::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45461:261::-;34882:12;:10;:12::i;:::-;34872:22;;:6;;;;;;;;;;;:22;;;34871:51;;;;34899:9;:23;34909:12;:10;:12::i;:::-;34899:23;;;;;;;;;;;;;;;;;;;;;;;;;34871:51;34863:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;45565:9:::1;45560:155;45584:3;;:10;;45580:1;:14;45560:155;;;45616:10;45629:3;;45633:1;45629:6;;;;;;;:::i;:::-;;;;;;;;45616:19;;45666:4;;45650:9;:13;45660:2;45650:13;;;;;;;;;;;:20;;;;;;;:::i;:::-;;45700:2;45690:13;45694:4;;45690:13;;;;;;;:::i;:::-;;;;;;;;45601:114;45596:3;;;;:::i;:::-;;;45560:155;;;;45461:261:::0;;;;:::o;20297:283::-;20429:39;20448:10;20460:7;20429:18;:39::i;:::-;20421:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;20533:39;20547:4;20553:2;20557:7;20566:5;20533:13;:39::i;:::-;20297:283;;;;:::o;45045:201::-;45108:13;45142:12;45150:3;45142:7;:12::i;:::-;45134:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;45224:9;:14;45234:3;45224:14;;;;;;;;;;;45217:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45045:201;;;:::o;48390:146::-;34882:12;:10;:12::i;:::-;34872:22;;:6;;;;;;;;;;;:22;;;34871:51;;;;34899:9;:23;34909:12;:10;:12::i;:::-;34899:23;;;;;;;;;;;;;;;;;;;;;;;;;34871:51;34863:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;48522:6:::1;48497;:11;48504:3;48497:11;;;;;;;;;;;:22;48509:9;48497:22;;;;;;;;;;;:31;;;;48390:146:::0;;;:::o;19470:164::-;19567:4;19591:18;:25;19610:5;19591:25;;;;;;;;;;;;;;;:35;19617:8;19591:35;;;;;;;;;;;;;;;;;;;;;;;;;19584:42;;19470:164;;;;:::o;49167:144::-;49247:14;49281:6;:11;49288:3;49281:11;;;;;;;;;;;:22;49293:9;49281:22;;;;;;;;;;;;49274:29;;49167:144;;;;:::o;35930:244::-;34748:12;:10;:12::i;:::-;34738:22;;:6;;;;;;;;;;;:22;;;34730:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;36039:1:::1;36019:22;;:8;:22;;;;36011:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36129:8;36100:38;;36121:6;;;;;;;;;;;36100:38;;;;;;;;;;;;36158:8;36149:6;;:17;;;;;;;;;;;;;;;;;;35930:244:::0;:::o;49706:382::-;49807:23;49843:18;49878:3;;:10;;49864:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49843:46;;49954:9;49949:103;49973:3;;:10;;49969:1;:14;49949:103;;;50012:6;:14;50019:3;;50023:1;50019:6;;;;;;;:::i;:::-;;;;;;;;50012:14;;;;;;;;;;;:28;50027:9;;50037:1;50027:12;;;;;;;:::i;:::-;;;;;;;;50012:28;;;;;;;;;;;;50005:1;50007;50005:4;;;;;;;;:::i;:::-;;;;;;;:35;;;;;49985:3;;;;:::i;:::-;;;49949:103;;;;50079:1;50072:8;;;49706:382;;;;;;:::o;46156:647::-;34882:12;:10;:12::i;:::-;34872:22;;:6;;;;;;;;;;;:22;;;34871:51;;;;34899:9;:23;34909:12;:10;:12::i;:::-;34899:23;;;;;;;;;;;;;;;;;;;;;;;;;34871:51;34863:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;46275:1:::1;46260:17;;:3;:17;;;;46252:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;46334:12;46342:3;46334:7;:12::i;:::-;46333:13;46325:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;46392:42;46421:1;46425:3;46430;46392:20;:42::i;:::-;46465:1;46447:9;:14;46457:3;46447:14;;;;;;;;;;;;;;;;:19;;;;;;;:::i;:::-;;;;;;;;46492:3;46477:7;:12;46485:3;46477:12;;;;;;;;;;;;:18;;;;;;;;;;;;;;;;;;46523:4;;46506:9;:14;46516:3;46506:14;;;;;;;;;;;:21;;;;;;;:::i;:::-;;46571:3;46566;46545:30;;46562:1;46545:30;;;;;;;;;;;;46601:3;46591:14;46595:4;;46591:14;;;;;;;:::i;:::-;;;;;;;;46640:16;:3;:14;;;:16::i;:::-;46636:160;;;46681:48;46712:1;46716:3;46721;46681:48;;;;;;;;;;;::::0;:22:::1;:48::i;:::-;46673:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;46636:160;46156:647:::0;;;;:::o;38267:379::-;38330:21;38364:14;38381:23;38398:5;38381:16;:23::i;:::-;38364:40;;38415:18;38450:6;38436:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38415:42;;38522:9;38517:93;38541:6;38537:1;:10;38517:93;;;38576:12;:19;38589:5;38576:19;;;;;;;;;;;;;;;:22;38596:1;38576:22;;;;;;;;;;;;38569:1;38571;38569:4;;;;;;;;:::i;:::-;;;;;;;:29;;;;;38549:3;;;;:::i;:::-;;;38517:93;;;;38637:1;38630:8;;;;38267:379;;;:::o;17089:292::-;17191:4;17230:25;17215:40;;;:11;:40;;;;:105;;;;17287:33;17272:48;;;:11;:48;;;;17215:105;:158;;;;17337:36;17361:11;17337:23;:36::i;:::-;17215:158;17208:165;;17089:292;;;:::o;22047:127::-;22112:4;22164:1;22136:30;;:7;:16;22144:7;22136:16;;;;;;;;;;;;;;;;;;;;;:30;;;;22129:37;;22047:127;;;:::o;23688:174::-;23790:2;23763:15;:24;23779:7;23763:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;23846:7;23842:2;23808:46;;23817:23;23832:7;23817:14;:23::i;:::-;23808:46;;;;;;;;;;;;23688:174;;:::o;33006:115::-;33059:15;33102:10;33087:26;;33006:115;:::o;22341:348::-;22434:4;22459:16;22467:7;22459;:16::i;:::-;22451:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22535:13;22551:23;22566:7;22551:14;:23::i;:::-;22535:39;;22604:5;22593:16;;:7;:16;;;:51;;;;22637:7;22613:31;;:20;22625:7;22613:11;:20::i;:::-;:31;;;22593:51;:87;;;;22648:32;22665:5;22672:7;22648:16;:32::i;:::-;22593:87;22585:96;;;22341:348;;;;:::o;23026:544::-;23151:4;23124:31;;:23;23139:7;23124:14;:23::i;:::-;:31;;;23116:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;23234:1;23220:16;;:2;:16;;;;23212:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;23290:39;23311:4;23317:2;23321:7;23290:20;:39::i;:::-;23394:29;23411:1;23415:7;23394:8;:29::i;:::-;23455:1;23436:9;:15;23446:4;23436:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;23484:1;23467:9;:13;23477:2;23467:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;23515:2;23496:7;:16;23504:7;23496:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;23554:7;23550:2;23535:27;;23544:4;23535:27;;;;;;;;;;;;23026:544;;;:::o;21462:272::-;21576:28;21586:4;21592:2;21596:7;21576:9;:28::i;:::-;21623:48;21646:4;21652:2;21656:7;21665:5;21623:22;:48::i;:::-;21615:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;21462:272;;;;:::o;39758:555::-;39868:45;39895:4;39901:2;39905:7;39868:26;:45::i;:::-;39946:1;39930:18;;:4;:18;;;39926:187;;;39965:40;39997:7;39965:31;:40::i;:::-;39926:187;;;40035:2;40027:10;;:4;:10;;;40023:90;;40054:47;40087:4;40093:7;40054:32;:47::i;:::-;40023:90;39926:187;40141:1;40127:16;;:2;:16;;;40123:183;;;40160:45;40197:7;40160:36;:45::i;:::-;40123:183;;;40233:4;40227:10;;:2;:10;;;40223:83;;40254:40;40282:2;40286:7;40254:27;:40::i;:::-;40223:83;40123:183;39758:555;;;:::o;7823:422::-;7883:4;8091:12;8202:7;8190:20;8182:28;;8236:1;8229:4;:8;8222:15;;;7823:422;;;:::o;24427:842::-;24549:4;24575:15;:2;:13;;;:15::i;:::-;24571:691;;;24627:2;24611:36;;;24648:10;24660:4;24666:7;24675:5;24611:70;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;24607:600;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24872:1;24855:6;:13;:18;24851:341;;;24898:60;;;;;;;;;;:::i;:::-;;;;;;;;24851:341;25142:6;25136:13;25127:6;25123:2;25119:15;25112:38;24607:600;24742:45;;;24732:55;;;:6;:55;;;;24725:62;;;;;24571:691;25246:4;25239:11;;24427:842;;;;;;;:::o;15926:158::-;16011:4;15909:10;16050:26;;16035:41;;;:11;:41;;;;16028:48;;15926:158;;;:::o;25882:93::-;;;;:::o;41036:164::-;41140:10;:17;;;;41113:15;:24;41129:7;41113:24;;;;;;;;;;;:44;;;;41168:10;41184:7;41168:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41036:164;:::o;41827:988::-;42093:22;42143:1;42118:22;42135:4;42118:16;:22::i;:::-;:26;;;;:::i;:::-;42093:51;;42155:18;42176:17;:26;42194:7;42176:26;;;;;;;;;;;;42155:47;;42323:14;42309:10;:28;42305:328;;42354:19;42376:12;:18;42389:4;42376:18;;;;;;;;;;;;;;;:34;42395:14;42376:34;;;;;;;;;;;;42354:56;;42460:11;42427:12;:18;42440:4;42427:18;;;;;;;;;;;;;;;:30;42446:10;42427:30;;;;;;;;;;;:44;;;;42577:10;42544:17;:30;42562:11;42544:30;;;;;;;;;;;:43;;;;42339:294;42305:328;42729:17;:26;42747:7;42729:26;;;;;;;;;;;42722:33;;;42773:12;:18;42786:4;42773:18;;;;;;;;;;;;;;;:34;42792:14;42773:34;;;;;;;;;;;42766:41;;;41908:907;;41827:988;;:::o;43110:1079::-;43363:22;43408:1;43388:10;:17;;;;:21;;;;:::i;:::-;43363:46;;43420:18;43441:15;:24;43457:7;43441:24;;;;;;;;;;;;43420:45;;43792:19;43814:10;43825:14;43814:26;;;;;;;;:::i;:::-;;;;;;;;;;43792:48;;43878:11;43853:10;43864;43853:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;43989:10;43958:15;:28;43974:11;43958:28;;;;;;;;;;;:41;;;;44130:15;:24;44146:7;44130:24;;;;;;;;;;;44123:31;;;44165:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43181:1008;;;43110:1079;:::o;40614:221::-;40699:14;40716:20;40733:2;40716:16;:20::i;:::-;40699:37;;40774:7;40747:12;:16;40760:2;40747:16;;;;;;;;;;;;;;;:24;40764:6;40747:24;;;;;;;;;;;:34;;;;40821:6;40792:17;:26;40810:7;40792:26;;;;;;;;;;;:35;;;;40688:147;40614:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;585:568::-;658:8;668:6;718:3;711:4;703:6;699:17;695:27;685:122;;726:79;;:::i;:::-;685:122;839:6;826:20;816:30;;869:18;861:6;858:30;855:117;;;891:79;;:::i;:::-;855:117;1005:4;997:6;993:17;981:29;;1059:3;1051:4;1043:6;1039:17;1029:8;1025:32;1022:41;1019:128;;;1066:79;;:::i;:::-;1019:128;585:568;;;;;:::o;1176:::-;1249:8;1259:6;1309:3;1302:4;1294:6;1290:17;1286:27;1276:122;;1317:79;;:::i;:::-;1276:122;1430:6;1417:20;1407:30;;1460:18;1452:6;1449:30;1446:117;;;1482:79;;:::i;:::-;1446:117;1596:4;1588:6;1584:17;1572:29;;1650:3;1642:4;1634:6;1630:17;1620:8;1616:32;1613:41;1610:128;;;1657:79;;:::i;:::-;1610:128;1176:568;;;;;:::o;1766:580::-;1851:8;1861:6;1911:3;1904:4;1896:6;1892:17;1888:27;1878:122;;1919:79;;:::i;:::-;1878:122;2032:6;2019:20;2009:30;;2062:18;2054:6;2051:30;2048:117;;;2084:79;;:::i;:::-;2048:117;2198:4;2190:6;2186:17;2174:29;;2252:3;2244:4;2236:6;2232:17;2222:8;2218:32;2215:41;2212:128;;;2259:79;;:::i;:::-;2212:128;1766:580;;;;;:::o;2369:568::-;2442:8;2452:6;2502:3;2495:4;2487:6;2483:17;2479:27;2469:122;;2510:79;;:::i;:::-;2469:122;2623:6;2610:20;2600:30;;2653:18;2645:6;2642:30;2639:117;;;2675:79;;:::i;:::-;2639:117;2789:4;2781:6;2777:17;2765:29;;2843:3;2835:4;2827:6;2823:17;2813:8;2809:32;2806:41;2803:128;;;2850:79;;:::i;:::-;2803:128;2369:568;;;;;:::o;2943:133::-;2986:5;3024:6;3011:20;3002:29;;3040:30;3064:5;3040:30;:::i;:::-;2943:133;;;;:::o;3082:139::-;3128:5;3166:6;3153:20;3144:29;;3182:33;3209:5;3182:33;:::i;:::-;3082:139;;;;:::o;3227:137::-;3272:5;3310:6;3297:20;3288:29;;3326:32;3352:5;3326:32;:::i;:::-;3227:137;;;;:::o;3370:141::-;3426:5;3457:6;3451:13;3442:22;;3473:32;3499:5;3473:32;:::i;:::-;3370:141;;;;:::o;3530:338::-;3585:5;3634:3;3627:4;3619:6;3615:17;3611:27;3601:122;;3642:79;;:::i;:::-;3601:122;3759:6;3746:20;3784:78;3858:3;3850:6;3843:4;3835:6;3831:17;3784:78;:::i;:::-;3775:87;;3591:277;3530:338;;;;:::o;3888:553::-;3946:8;3956:6;4006:3;3999:4;3991:6;3987:17;3983:27;3973:122;;4014:79;;:::i;:::-;3973:122;4127:6;4114:20;4104:30;;4157:18;4149:6;4146:30;4143:117;;;4179:79;;:::i;:::-;4143:117;4293:4;4285:6;4281:17;4269:29;;4347:3;4339:4;4331:6;4327:17;4317:8;4313:32;4310:41;4307:128;;;4354:79;;:::i;:::-;4307:128;3888:553;;;;;:::o;4447:139::-;4493:5;4531:6;4518:20;4509:29;;4547:33;4574:5;4547:33;:::i;:::-;4447:139;;;;:::o;4592:329::-;4651:6;4700:2;4688:9;4679:7;4675:23;4671:32;4668:119;;;4706:79;;:::i;:::-;4668:119;4826:1;4851:53;4896:7;4887:6;4876:9;4872:22;4851:53;:::i;:::-;4841:63;;4797:117;4592:329;;;;:::o;4927:474::-;4995:6;5003;5052:2;5040:9;5031:7;5027:23;5023:32;5020:119;;;5058:79;;:::i;:::-;5020:119;5178:1;5203:53;5248:7;5239:6;5228:9;5224:22;5203:53;:::i;:::-;5193:63;;5149:117;5305:2;5331:53;5376:7;5367:6;5356:9;5352:22;5331:53;:::i;:::-;5321:63;;5276:118;4927:474;;;;;:::o;5407:619::-;5484:6;5492;5500;5549:2;5537:9;5528:7;5524:23;5520:32;5517:119;;;5555:79;;:::i;:::-;5517:119;5675:1;5700:53;5745:7;5736:6;5725:9;5721:22;5700:53;:::i;:::-;5690:63;;5646:117;5802:2;5828:53;5873:7;5864:6;5853:9;5849:22;5828:53;:::i;:::-;5818:63;;5773:118;5930:2;5956:53;6001:7;5992:6;5981:9;5977:22;5956:53;:::i;:::-;5946:63;;5901:118;5407:619;;;;;:::o;6032:943::-;6127:6;6135;6143;6151;6200:3;6188:9;6179:7;6175:23;6171:33;6168:120;;;6207:79;;:::i;:::-;6168:120;6327:1;6352:53;6397:7;6388:6;6377:9;6373:22;6352:53;:::i;:::-;6342:63;;6298:117;6454:2;6480:53;6525:7;6516:6;6505:9;6501:22;6480:53;:::i;:::-;6470:63;;6425:118;6582:2;6608:53;6653:7;6644:6;6633:9;6629:22;6608:53;:::i;:::-;6598:63;;6553:118;6738:2;6727:9;6723:18;6710:32;6769:18;6761:6;6758:30;6755:117;;;6791:79;;:::i;:::-;6755:117;6896:62;6950:7;6941:6;6930:9;6926:22;6896:62;:::i;:::-;6886:72;;6681:287;6032:943;;;;;;;:::o;6981:1079::-;7112:6;7120;7128;7136;7144;7193:2;7181:9;7172:7;7168:23;7164:32;7161:119;;;7199:79;;:::i;:::-;7161:119;7319:1;7344:53;7389:7;7380:6;7369:9;7365:22;7344:53;:::i;:::-;7334:63;;7290:117;7474:2;7463:9;7459:18;7446:32;7505:18;7497:6;7494:30;7491:117;;;7527:79;;:::i;:::-;7491:117;7640:80;7712:7;7703:6;7692:9;7688:22;7640:80;:::i;:::-;7622:98;;;;7417:313;7797:2;7786:9;7782:18;7769:32;7828:18;7820:6;7817:30;7814:117;;;7850:79;;:::i;:::-;7814:117;7963:80;8035:7;8026:6;8015:9;8011:22;7963:80;:::i;:::-;7945:98;;;;7740:313;6981:1079;;;;;;;;:::o;8066:468::-;8131:6;8139;8188:2;8176:9;8167:7;8163:23;8159:32;8156:119;;;8194:79;;:::i;:::-;8156:119;8314:1;8339:53;8384:7;8375:6;8364:9;8360:22;8339:53;:::i;:::-;8329:63;;8285:117;8441:2;8467:50;8509:7;8500:6;8489:9;8485:22;8467:50;:::i;:::-;8457:60;;8412:115;8066:468;;;;;:::o;8540:474::-;8608:6;8616;8665:2;8653:9;8644:7;8640:23;8636:32;8633:119;;;8671:79;;:::i;:::-;8633:119;8791:1;8816:53;8861:7;8852:6;8841:9;8837:22;8816:53;:::i;:::-;8806:63;;8762:117;8918:2;8944:53;8989:7;8980:6;8969:9;8965:22;8944:53;:::i;:::-;8934:63;;8889:118;8540:474;;;;;:::o;9020:934::-;9142:6;9150;9158;9166;9215:2;9203:9;9194:7;9190:23;9186:32;9183:119;;;9221:79;;:::i;:::-;9183:119;9369:1;9358:9;9354:17;9341:31;9399:18;9391:6;9388:30;9385:117;;;9421:79;;:::i;:::-;9385:117;9534:80;9606:7;9597:6;9586:9;9582:22;9534:80;:::i;:::-;9516:98;;;;9312:312;9691:2;9680:9;9676:18;9663:32;9722:18;9714:6;9711:30;9708:117;;;9744:79;;:::i;:::-;9708:117;9857:80;9929:7;9920:6;9909:9;9905:22;9857:80;:::i;:::-;9839:98;;;;9634:313;9020:934;;;;;;;:::o;9960:1309::-;10118:6;10126;10134;10142;10150;10158;10207:2;10195:9;10186:7;10182:23;10178:32;10175:119;;;10213:79;;:::i;:::-;10175:119;10361:1;10350:9;10346:17;10333:31;10391:18;10383:6;10380:30;10377:117;;;10413:79;;:::i;:::-;10377:117;10526:80;10598:7;10589:6;10578:9;10574:22;10526:80;:::i;:::-;10508:98;;;;10304:312;10683:2;10672:9;10668:18;10655:32;10714:18;10706:6;10703:30;10700:117;;;10736:79;;:::i;:::-;10700:117;10849:80;10921:7;10912:6;10901:9;10897:22;10849:80;:::i;:::-;10831:98;;;;10626:313;11006:2;10995:9;10991:18;10978:32;11037:18;11029:6;11026:30;11023:117;;;11059:79;;:::i;:::-;11023:117;11172:80;11244:7;11235:6;11224:9;11220:22;11172:80;:::i;:::-;11154:98;;;;10949:313;9960:1309;;;;;;;;:::o;11275:958::-;11409:6;11417;11425;11433;11482:2;11470:9;11461:7;11457:23;11453:32;11450:119;;;11488:79;;:::i;:::-;11450:119;11636:1;11625:9;11621:17;11608:31;11666:18;11658:6;11655:30;11652:117;;;11688:79;;:::i;:::-;11652:117;11801:92;11885:7;11876:6;11865:9;11861:22;11801:92;:::i;:::-;11783:110;;;;11579:324;11970:2;11959:9;11955:18;11942:32;12001:18;11993:6;11990:30;11987:117;;;12023:79;;:::i;:::-;11987:117;12136:80;12208:7;12199:6;12188:9;12184:22;12136:80;:::i;:::-;12118:98;;;;11913:313;11275:958;;;;;;;:::o;12239:1333::-;12409:6;12417;12425;12433;12441;12449;12498:2;12486:9;12477:7;12473:23;12469:32;12466:119;;;12504:79;;:::i;:::-;12466:119;12652:1;12641:9;12637:17;12624:31;12682:18;12674:6;12671:30;12668:117;;;12704:79;;:::i;:::-;12668:117;12817:80;12889:7;12880:6;12869:9;12865:22;12817:80;:::i;:::-;12799:98;;;;12595:312;12974:2;12963:9;12959:18;12946:32;13005:18;12997:6;12994:30;12991:117;;;13027:79;;:::i;:::-;12991:117;13140:80;13212:7;13203:6;13192:9;13188:22;13140:80;:::i;:::-;13122:98;;;;12917:313;13297:2;13286:9;13282:18;13269:32;13328:18;13320:6;13317:30;13314:117;;;13350:79;;:::i;:::-;13314:117;13463:92;13547:7;13538:6;13527:9;13523:22;13463:92;:::i;:::-;13445:110;;;;13240:325;12239:1333;;;;;;;;:::o;13578:1279::-;13721:6;13729;13737;13745;13753;13761;13810:2;13798:9;13789:7;13785:23;13781:32;13778:119;;;13816:79;;:::i;:::-;13778:119;13964:1;13953:9;13949:17;13936:31;13994:18;13986:6;13983:30;13980:117;;;14016:79;;:::i;:::-;13980:117;14129:80;14201:7;14192:6;14181:9;14177:22;14129:80;:::i;:::-;14111:98;;;;13907:312;14286:2;14275:9;14271:18;14258:32;14317:18;14309:6;14306:30;14303:117;;;14339:79;;:::i;:::-;14303:117;14452:80;14524:7;14515:6;14504:9;14500:22;14452:80;:::i;:::-;14434:98;;;;14229:313;14609:2;14598:9;14594:18;14581:32;14640:18;14632:6;14629:30;14626:117;;;14662:79;;:::i;:::-;14626:117;14775:65;14832:7;14823:6;14812:9;14808:22;14775:65;:::i;:::-;14757:83;;;;14552:298;13578:1279;;;;;;;;:::o;14863:704::-;14958:6;14966;14974;15023:2;15011:9;15002:7;14998:23;14994:32;14991:119;;;15029:79;;:::i;:::-;14991:119;15149:1;15174:53;15219:7;15210:6;15199:9;15195:22;15174:53;:::i;:::-;15164:63;;15120:117;15304:2;15293:9;15289:18;15276:32;15335:18;15327:6;15324:30;15321:117;;;15357:79;;:::i;:::-;15321:117;15470:80;15542:7;15533:6;15522:9;15518:22;15470:80;:::i;:::-;15452:98;;;;15247:313;14863:704;;;;;:::o;15573:1079::-;15704:6;15712;15720;15728;15736;15785:2;15773:9;15764:7;15760:23;15756:32;15753:119;;;15791:79;;:::i;:::-;15753:119;15911:1;15936:53;15981:7;15972:6;15961:9;15957:22;15936:53;:::i;:::-;15926:63;;15882:117;16066:2;16055:9;16051:18;16038:32;16097:18;16089:6;16086:30;16083:117;;;16119:79;;:::i;:::-;16083:117;16232:80;16304:7;16295:6;16284:9;16280:22;16232:80;:::i;:::-;16214:98;;;;16009:313;16389:2;16378:9;16374:18;16361:32;16420:18;16412:6;16409:30;16406:117;;;16442:79;;:::i;:::-;16406:117;16555:80;16627:7;16618:6;16607:9;16603:22;16555:80;:::i;:::-;16537:98;;;;16332:313;15573:1079;;;;;;;;:::o;16658:474::-;16726:6;16734;16783:2;16771:9;16762:7;16758:23;16754:32;16751:119;;;16789:79;;:::i;:::-;16751:119;16909:1;16934:53;16979:7;16970:6;16959:9;16955:22;16934:53;:::i;:::-;16924:63;;16880:117;17036:2;17062:53;17107:7;17098:6;17087:9;17083:22;17062:53;:::i;:::-;17052:63;;17007:118;16658:474;;;;;:::o;17138:619::-;17215:6;17223;17231;17280:2;17268:9;17259:7;17255:23;17251:32;17248:119;;;17286:79;;:::i;:::-;17248:119;17406:1;17431:53;17476:7;17467:6;17456:9;17452:22;17431:53;:::i;:::-;17421:63;;17377:117;17533:2;17559:53;17604:7;17595:6;17584:9;17580:22;17559:53;:::i;:::-;17549:63;;17504:118;17661:2;17687:53;17732:7;17723:6;17712:9;17708:22;17687:53;:::i;:::-;17677:63;;17632:118;17138:619;;;;;:::o;17763:327::-;17821:6;17870:2;17858:9;17849:7;17845:23;17841:32;17838:119;;;17876:79;;:::i;:::-;17838:119;17996:1;18021:52;18065:7;18056:6;18045:9;18041:22;18021:52;:::i;:::-;18011:62;;17967:116;17763:327;;;;:::o;18096:349::-;18165:6;18214:2;18202:9;18193:7;18189:23;18185:32;18182:119;;;18220:79;;:::i;:::-;18182:119;18340:1;18365:63;18420:7;18411:6;18400:9;18396:22;18365:63;:::i;:::-;18355:73;;18311:127;18096:349;;;;:::o;18451:904::-;18558:6;18566;18574;18582;18631:2;18619:9;18610:7;18606:23;18602:32;18599:119;;;18637:79;;:::i;:::-;18599:119;18785:1;18774:9;18770:17;18757:31;18815:18;18807:6;18804:30;18801:117;;;18837:79;;:::i;:::-;18801:117;18950:65;19007:7;18998:6;18987:9;18983:22;18950:65;:::i;:::-;18932:83;;;;18728:297;19092:2;19081:9;19077:18;19064:32;19123:18;19115:6;19112:30;19109:117;;;19145:79;;:::i;:::-;19109:117;19258:80;19330:7;19321:6;19310:9;19306:22;19258:80;:::i;:::-;19240:98;;;;19035:313;18451:904;;;;;;;:::o;19361:674::-;19441:6;19449;19457;19506:2;19494:9;19485:7;19481:23;19477:32;19474:119;;;19512:79;;:::i;:::-;19474:119;19660:1;19649:9;19645:17;19632:31;19690:18;19682:6;19679:30;19676:117;;;19712:79;;:::i;:::-;19676:117;19825:65;19882:7;19873:6;19862:9;19858:22;19825:65;:::i;:::-;19807:83;;;;19603:297;19939:2;19965:53;20010:7;20001:6;19990:9;19986:22;19965:53;:::i;:::-;19955:63;;19910:118;19361:674;;;;;:::o;20041:329::-;20100:6;20149:2;20137:9;20128:7;20124:23;20120:32;20117:119;;;20155:79;;:::i;:::-;20117:119;20275:1;20300:53;20345:7;20336:6;20325:9;20321:22;20300:53;:::i;:::-;20290:63;;20246:117;20041:329;;;;:::o;20376:819::-;20465:6;20473;20481;20489;20538:2;20526:9;20517:7;20513:23;20509:32;20506:119;;;20544:79;;:::i;:::-;20506:119;20664:1;20689:53;20734:7;20725:6;20714:9;20710:22;20689:53;:::i;:::-;20679:63;;20635:117;20791:2;20817:53;20862:7;20853:6;20842:9;20838:22;20817:53;:::i;:::-;20807:63;;20762:118;20947:2;20936:9;20932:18;20919:32;20978:18;20970:6;20967:30;20964:117;;;21000:79;;:::i;:::-;20964:117;21113:65;21170:7;21161:6;21150:9;21146:22;21113:65;:::i;:::-;21095:83;;;;20890:298;20376:819;;;;;;;:::o;21201:179::-;21270:10;21291:46;21333:3;21325:6;21291:46;:::i;:::-;21369:4;21364:3;21360:14;21346:28;;21201:179;;;;:::o;21386:118::-;21473:24;21491:5;21473:24;:::i;:::-;21468:3;21461:37;21386:118;;:::o;21540:732::-;21659:3;21688:54;21736:5;21688:54;:::i;:::-;21758:86;21837:6;21832:3;21758:86;:::i;:::-;21751:93;;21868:56;21918:5;21868:56;:::i;:::-;21947:7;21978:1;21963:284;21988:6;21985:1;21982:13;21963:284;;;22064:6;22058:13;22091:63;22150:3;22135:13;22091:63;:::i;:::-;22084:70;;22177:60;22230:6;22177:60;:::i;:::-;22167:70;;22023:224;22010:1;22007;22003:9;21998:14;;21963:284;;;21967:14;22263:3;22256:10;;21664:608;;;21540:732;;;;:::o;22278:109::-;22359:21;22374:5;22359:21;:::i;:::-;22354:3;22347:34;22278:109;;:::o;22393:360::-;22479:3;22507:38;22539:5;22507:38;:::i;:::-;22561:70;22624:6;22619:3;22561:70;:::i;:::-;22554:77;;22640:52;22685:6;22680:3;22673:4;22666:5;22662:16;22640:52;:::i;:::-;22717:29;22739:6;22717:29;:::i;:::-;22712:3;22708:39;22701:46;;22483:270;22393:360;;;;:::o;22783:304::-;22881:3;22902:71;22966:6;22961:3;22902:71;:::i;:::-;22895:78;;22983:43;23019:6;23014:3;23007:5;22983:43;:::i;:::-;23051:29;23073:6;23051:29;:::i;:::-;23046:3;23042:39;23035:46;;22783:304;;;;;:::o;23093:364::-;23181:3;23209:39;23242:5;23209:39;:::i;:::-;23264:71;23328:6;23323:3;23264:71;:::i;:::-;23257:78;;23344:52;23389:6;23384:3;23377:4;23370:5;23366:16;23344:52;:::i;:::-;23421:29;23443:6;23421:29;:::i;:::-;23416:3;23412:39;23405:46;;23185:272;23093:364;;;;:::o;23463:366::-;23605:3;23626:67;23690:2;23685:3;23626:67;:::i;:::-;23619:74;;23702:93;23791:3;23702:93;:::i;:::-;23820:2;23815:3;23811:12;23804:19;;23463:366;;;:::o;23835:::-;23977:3;23998:67;24062:2;24057:3;23998:67;:::i;:::-;23991:74;;24074:93;24163:3;24074:93;:::i;:::-;24192:2;24187:3;24183:12;24176:19;;23835:366;;;:::o;24207:::-;24349:3;24370:67;24434:2;24429:3;24370:67;:::i;:::-;24363:74;;24446:93;24535:3;24446:93;:::i;:::-;24564:2;24559:3;24555:12;24548:19;;24207:366;;;:::o;24579:::-;24721:3;24742:67;24806:2;24801:3;24742:67;:::i;:::-;24735:74;;24818:93;24907:3;24818:93;:::i;:::-;24936:2;24931:3;24927:12;24920:19;;24579:366;;;:::o;24951:::-;25093:3;25114:67;25178:2;25173:3;25114:67;:::i;:::-;25107:74;;25190:93;25279:3;25190:93;:::i;:::-;25308:2;25303:3;25299:12;25292:19;;24951:366;;;:::o;25323:::-;25465:3;25486:67;25550:2;25545:3;25486:67;:::i;:::-;25479:74;;25562:93;25651:3;25562:93;:::i;:::-;25680:2;25675:3;25671:12;25664:19;;25323:366;;;:::o;25695:::-;25837:3;25858:67;25922:2;25917:3;25858:67;:::i;:::-;25851:74;;25934:93;26023:3;25934:93;:::i;:::-;26052:2;26047:3;26043:12;26036:19;;25695:366;;;:::o;26067:::-;26209:3;26230:67;26294:2;26289:3;26230:67;:::i;:::-;26223:74;;26306:93;26395:3;26306:93;:::i;:::-;26424:2;26419:3;26415:12;26408:19;;26067:366;;;:::o;26439:::-;26581:3;26602:67;26666:2;26661:3;26602:67;:::i;:::-;26595:74;;26678:93;26767:3;26678:93;:::i;:::-;26796:2;26791:3;26787:12;26780:19;;26439:366;;;:::o;26811:::-;26953:3;26974:67;27038:2;27033:3;26974:67;:::i;:::-;26967:74;;27050:93;27139:3;27050:93;:::i;:::-;27168:2;27163:3;27159:12;27152:19;;26811:366;;;:::o;27183:::-;27325:3;27346:67;27410:2;27405:3;27346:67;:::i;:::-;27339:74;;27422:93;27511:3;27422:93;:::i;:::-;27540:2;27535:3;27531:12;27524:19;;27183:366;;;:::o;27555:::-;27697:3;27718:67;27782:2;27777:3;27718:67;:::i;:::-;27711:74;;27794:93;27883:3;27794:93;:::i;:::-;27912:2;27907:3;27903:12;27896:19;;27555:366;;;:::o;27927:::-;28069:3;28090:67;28154:2;28149:3;28090:67;:::i;:::-;28083:74;;28166:93;28255:3;28166:93;:::i;:::-;28284:2;28279:3;28275:12;28268:19;;27927:366;;;:::o;28299:::-;28441:3;28462:67;28526:2;28521:3;28462:67;:::i;:::-;28455:74;;28538:93;28627:3;28538:93;:::i;:::-;28656:2;28651:3;28647:12;28640:19;;28299:366;;;:::o;28671:::-;28813:3;28834:67;28898:2;28893:3;28834:67;:::i;:::-;28827:74;;28910:93;28999:3;28910:93;:::i;:::-;29028:2;29023:3;29019:12;29012:19;;28671:366;;;:::o;29043:::-;29185:3;29206:67;29270:2;29265:3;29206:67;:::i;:::-;29199:74;;29282:93;29371:3;29282:93;:::i;:::-;29400:2;29395:3;29391:12;29384:19;;29043:366;;;:::o;29415:::-;29557:3;29578:67;29642:2;29637:3;29578:67;:::i;:::-;29571:74;;29654:93;29743:3;29654:93;:::i;:::-;29772:2;29767:3;29763:12;29756:19;;29415:366;;;:::o;29787:::-;29929:3;29950:67;30014:2;30009:3;29950:67;:::i;:::-;29943:74;;30026:93;30115:3;30026:93;:::i;:::-;30144:2;30139:3;30135:12;30128:19;;29787:366;;;:::o;30159:::-;30301:3;30322:67;30386:2;30381:3;30322:67;:::i;:::-;30315:74;;30398:93;30487:3;30398:93;:::i;:::-;30516:2;30511:3;30507:12;30500:19;;30159:366;;;:::o;30531:::-;30673:3;30694:67;30758:2;30753:3;30694:67;:::i;:::-;30687:74;;30770:93;30859:3;30770:93;:::i;:::-;30888:2;30883:3;30879:12;30872:19;;30531:366;;;:::o;30903:::-;31045:3;31066:67;31130:2;31125:3;31066:67;:::i;:::-;31059:74;;31142:93;31231:3;31142:93;:::i;:::-;31260:2;31255:3;31251:12;31244:19;;30903:366;;;:::o;31275:::-;31417:3;31438:67;31502:2;31497:3;31438:67;:::i;:::-;31431:74;;31514:93;31603:3;31514:93;:::i;:::-;31632:2;31627:3;31623:12;31616:19;;31275:366;;;:::o;31647:108::-;31724:24;31742:5;31724:24;:::i;:::-;31719:3;31712:37;31647:108;;:::o;31761:118::-;31848:24;31866:5;31848:24;:::i;:::-;31843:3;31836:37;31761:118;;:::o;31885:222::-;31978:4;32016:2;32005:9;32001:18;31993:26;;32029:71;32097:1;32086:9;32082:17;32073:6;32029:71;:::i;:::-;31885:222;;;;:::o;32113:640::-;32308:4;32346:3;32335:9;32331:19;32323:27;;32360:71;32428:1;32417:9;32413:17;32404:6;32360:71;:::i;:::-;32441:72;32509:2;32498:9;32494:18;32485:6;32441:72;:::i;:::-;32523;32591:2;32580:9;32576:18;32567:6;32523:72;:::i;:::-;32642:9;32636:4;32632:20;32627:2;32616:9;32612:18;32605:48;32670:76;32741:4;32732:6;32670:76;:::i;:::-;32662:84;;32113:640;;;;;;;:::o;32759:373::-;32902:4;32940:2;32929:9;32925:18;32917:26;;32989:9;32983:4;32979:20;32975:1;32964:9;32960:17;32953:47;33017:108;33120:4;33111:6;33017:108;:::i;:::-;33009:116;;32759:373;;;;:::o;33138:210::-;33225:4;33263:2;33252:9;33248:18;33240:26;;33276:65;33338:1;33327:9;33323:17;33314:6;33276:65;:::i;:::-;33138:210;;;;:::o;33354:333::-;33477:4;33515:2;33504:9;33500:18;33492:26;;33564:9;33558:4;33554:20;33550:1;33539:9;33535:17;33528:47;33592:88;33675:4;33666:6;33658;33592:88;:::i;:::-;33584:96;;33354:333;;;;;:::o;33693:313::-;33806:4;33844:2;33833:9;33829:18;33821:26;;33893:9;33887:4;33883:20;33879:1;33868:9;33864:17;33857:47;33921:78;33994:4;33985:6;33921:78;:::i;:::-;33913:86;;33693:313;;;;:::o;34012:419::-;34178:4;34216:2;34205:9;34201:18;34193:26;;34265:9;34259:4;34255:20;34251:1;34240:9;34236:17;34229:47;34293:131;34419:4;34293:131;:::i;:::-;34285:139;;34012:419;;;:::o;34437:::-;34603:4;34641:2;34630:9;34626:18;34618:26;;34690:9;34684:4;34680:20;34676:1;34665:9;34661:17;34654:47;34718:131;34844:4;34718:131;:::i;:::-;34710:139;;34437:419;;;:::o;34862:::-;35028:4;35066:2;35055:9;35051:18;35043:26;;35115:9;35109:4;35105:20;35101:1;35090:9;35086:17;35079:47;35143:131;35269:4;35143:131;:::i;:::-;35135:139;;34862:419;;;:::o;35287:::-;35453:4;35491:2;35480:9;35476:18;35468:26;;35540:9;35534:4;35530:20;35526:1;35515:9;35511:17;35504:47;35568:131;35694:4;35568:131;:::i;:::-;35560:139;;35287:419;;;:::o;35712:::-;35878:4;35916:2;35905:9;35901:18;35893:26;;35965:9;35959:4;35955:20;35951:1;35940:9;35936:17;35929:47;35993:131;36119:4;35993:131;:::i;:::-;35985:139;;35712:419;;;:::o;36137:::-;36303:4;36341:2;36330:9;36326:18;36318:26;;36390:9;36384:4;36380:20;36376:1;36365:9;36361:17;36354:47;36418:131;36544:4;36418:131;:::i;:::-;36410:139;;36137:419;;;:::o;36562:::-;36728:4;36766:2;36755:9;36751:18;36743:26;;36815:9;36809:4;36805:20;36801:1;36790:9;36786:17;36779:47;36843:131;36969:4;36843:131;:::i;:::-;36835:139;;36562:419;;;:::o;36987:::-;37153:4;37191:2;37180:9;37176:18;37168:26;;37240:9;37234:4;37230:20;37226:1;37215:9;37211:17;37204:47;37268:131;37394:4;37268:131;:::i;:::-;37260:139;;36987:419;;;:::o;37412:::-;37578:4;37616:2;37605:9;37601:18;37593:26;;37665:9;37659:4;37655:20;37651:1;37640:9;37636:17;37629:47;37693:131;37819:4;37693:131;:::i;:::-;37685:139;;37412:419;;;:::o;37837:::-;38003:4;38041:2;38030:9;38026:18;38018:26;;38090:9;38084:4;38080:20;38076:1;38065:9;38061:17;38054:47;38118:131;38244:4;38118:131;:::i;:::-;38110:139;;37837:419;;;:::o;38262:::-;38428:4;38466:2;38455:9;38451:18;38443:26;;38515:9;38509:4;38505:20;38501:1;38490:9;38486:17;38479:47;38543:131;38669:4;38543:131;:::i;:::-;38535:139;;38262:419;;;:::o;38687:::-;38853:4;38891:2;38880:9;38876:18;38868:26;;38940:9;38934:4;38930:20;38926:1;38915:9;38911:17;38904:47;38968:131;39094:4;38968:131;:::i;:::-;38960:139;;38687:419;;;:::o;39112:::-;39278:4;39316:2;39305:9;39301:18;39293:26;;39365:9;39359:4;39355:20;39351:1;39340:9;39336:17;39329:47;39393:131;39519:4;39393:131;:::i;:::-;39385:139;;39112:419;;;:::o;39537:::-;39703:4;39741:2;39730:9;39726:18;39718:26;;39790:9;39784:4;39780:20;39776:1;39765:9;39761:17;39754:47;39818:131;39944:4;39818:131;:::i;:::-;39810:139;;39537:419;;;:::o;39962:::-;40128:4;40166:2;40155:9;40151:18;40143:26;;40215:9;40209:4;40205:20;40201:1;40190:9;40186:17;40179:47;40243:131;40369:4;40243:131;:::i;:::-;40235:139;;39962:419;;;:::o;40387:::-;40553:4;40591:2;40580:9;40576:18;40568:26;;40640:9;40634:4;40630:20;40626:1;40615:9;40611:17;40604:47;40668:131;40794:4;40668:131;:::i;:::-;40660:139;;40387:419;;;:::o;40812:::-;40978:4;41016:2;41005:9;41001:18;40993:26;;41065:9;41059:4;41055:20;41051:1;41040:9;41036:17;41029:47;41093:131;41219:4;41093:131;:::i;:::-;41085:139;;40812:419;;;:::o;41237:::-;41403:4;41441:2;41430:9;41426:18;41418:26;;41490:9;41484:4;41480:20;41476:1;41465:9;41461:17;41454:47;41518:131;41644:4;41518:131;:::i;:::-;41510:139;;41237:419;;;:::o;41662:::-;41828:4;41866:2;41855:9;41851:18;41843:26;;41915:9;41909:4;41905:20;41901:1;41890:9;41886:17;41879:47;41943:131;42069:4;41943:131;:::i;:::-;41935:139;;41662:419;;;:::o;42087:::-;42253:4;42291:2;42280:9;42276:18;42268:26;;42340:9;42334:4;42330:20;42326:1;42315:9;42311:17;42304:47;42368:131;42494:4;42368:131;:::i;:::-;42360:139;;42087:419;;;:::o;42512:::-;42678:4;42716:2;42705:9;42701:18;42693:26;;42765:9;42759:4;42755:20;42751:1;42740:9;42736:17;42729:47;42793:131;42919:4;42793:131;:::i;:::-;42785:139;;42512:419;;;:::o;42937:::-;43103:4;43141:2;43130:9;43126:18;43118:26;;43190:9;43184:4;43180:20;43176:1;43165:9;43161:17;43154:47;43218:131;43344:4;43218:131;:::i;:::-;43210:139;;42937:419;;;:::o;43362:222::-;43455:4;43493:2;43482:9;43478:18;43470:26;;43506:71;43574:1;43563:9;43559:17;43550:6;43506:71;:::i;:::-;43362:222;;;;:::o;43590:725::-;43668:4;43674:6;43730:11;43717:25;43830:1;43824:4;43820:12;43809:8;43793:14;43789:29;43785:48;43765:18;43761:73;43751:168;;43838:79;;:::i;:::-;43751:168;43950:18;43940:8;43936:33;43928:41;;44002:4;43989:18;43979:28;;44030:18;44022:6;44019:30;44016:117;;;44052:79;;:::i;:::-;44016:117;44160:2;44154:4;44150:13;44142:21;;44217:4;44209:6;44205:17;44189:14;44185:38;44179:4;44175:49;44172:136;;;44227:79;;:::i;:::-;44172:136;43681:634;43590:725;;;;;:::o;44321:129::-;44355:6;44382:20;;:::i;:::-;44372:30;;44411:33;44439:4;44431:6;44411:33;:::i;:::-;44321:129;;;:::o;44456:75::-;44489:6;44522:2;44516:9;44506:19;;44456:75;:::o;44537:307::-;44598:4;44688:18;44680:6;44677:30;44674:56;;;44710:18;;:::i;:::-;44674:56;44748:29;44770:6;44748:29;:::i;:::-;44740:37;;44832:4;44826;44822:15;44814:23;;44537:307;;;:::o;44850:132::-;44917:4;44940:3;44932:11;;44970:4;44965:3;44961:14;44953:22;;44850:132;;;:::o;44988:114::-;45055:6;45089:5;45083:12;45073:22;;44988:114;;;:::o;45108:98::-;45159:6;45193:5;45187:12;45177:22;;45108:98;;;:::o;45212:99::-;45264:6;45298:5;45292:12;45282:22;;45212:99;;;:::o;45317:113::-;45387:4;45419;45414:3;45410:14;45402:22;;45317:113;;;:::o;45436:184::-;45535:11;45569:6;45564:3;45557:19;45609:4;45604:3;45600:14;45585:29;;45436:184;;;;:::o;45626:168::-;45709:11;45743:6;45738:3;45731:19;45783:4;45778:3;45774:14;45759:29;;45626:168;;;;:::o;45800:169::-;45884:11;45918:6;45913:3;45906:19;45958:4;45953:3;45949:14;45934:29;;45800:169;;;;:::o;45975:305::-;46015:3;46034:20;46052:1;46034:20;:::i;:::-;46029:25;;46068:20;46086:1;46068:20;:::i;:::-;46063:25;;46222:1;46154:66;46150:74;46147:1;46144:81;46141:107;;;46228:18;;:::i;:::-;46141:107;46272:1;46269;46265:9;46258:16;;45975:305;;;;:::o;46286:191::-;46326:4;46346:20;46364:1;46346:20;:::i;:::-;46341:25;;46380:20;46398:1;46380:20;:::i;:::-;46375:25;;46419:1;46416;46413:8;46410:34;;;46424:18;;:::i;:::-;46410:34;46469:1;46466;46462:9;46454:17;;46286:191;;;;:::o;46483:96::-;46520:7;46549:24;46567:5;46549:24;:::i;:::-;46538:35;;46483:96;;;:::o;46585:90::-;46619:7;46662:5;46655:13;46648:21;46637:32;;46585:90;;;:::o;46681:77::-;46718:7;46747:5;46736:16;;46681:77;;;:::o;46764:149::-;46800:7;46840:66;46833:5;46829:78;46818:89;;46764:149;;;:::o;46919:126::-;46956:7;46996:42;46989:5;46985:54;46974:65;;46919:126;;;:::o;47051:77::-;47088:7;47117:5;47106:16;;47051:77;;;:::o;47134:154::-;47218:6;47213:3;47208;47195:30;47280:1;47271:6;47266:3;47262:16;47255:27;47134:154;;;:::o;47294:307::-;47362:1;47372:113;47386:6;47383:1;47380:13;47372:113;;;47471:1;47466:3;47462:11;47456:18;47452:1;47447:3;47443:11;47436:39;47408:2;47405:1;47401:10;47396:15;;47372:113;;;47503:6;47500:1;47497:13;47494:101;;;47583:1;47574:6;47569:3;47565:16;47558:27;47494:101;47343:258;47294:307;;;:::o;47607:320::-;47651:6;47688:1;47682:4;47678:12;47668:22;;47735:1;47729:4;47725:12;47756:18;47746:81;;47812:4;47804:6;47800:17;47790:27;;47746:81;47874:2;47866:6;47863:14;47843:18;47840:38;47837:84;;;47893:18;;:::i;:::-;47837:84;47658:269;47607:320;;;:::o;47933:281::-;48016:27;48038:4;48016:27;:::i;:::-;48008:6;48004:40;48146:6;48134:10;48131:22;48110:18;48098:10;48095:34;48092:62;48089:88;;;48157:18;;:::i;:::-;48089:88;48197:10;48193:2;48186:22;47976:238;47933:281;;:::o;48220:233::-;48259:3;48282:24;48300:5;48282:24;:::i;:::-;48273:33;;48328:66;48321:5;48318:77;48315:103;;;48398:18;;:::i;:::-;48315:103;48445:1;48438:5;48434:13;48427:20;;48220:233;;;:::o;48459:180::-;48507:77;48504:1;48497:88;48604:4;48601:1;48594:15;48628:4;48625:1;48618:15;48645:180;48693:77;48690:1;48683:88;48790:4;48787:1;48780:15;48814:4;48811:1;48804:15;48831:180;48879:77;48876:1;48869:88;48976:4;48973:1;48966:15;49000:4;48997:1;48990:15;49017:180;49065:77;49062:1;49055:88;49162:4;49159:1;49152:15;49186:4;49183:1;49176:15;49203:180;49251:77;49248:1;49241:88;49348:4;49345:1;49338:15;49372:4;49369:1;49362:15;49389:117;49498:1;49495;49488:12;49512:117;49621:1;49618;49611:12;49635:117;49744:1;49741;49734:12;49758:117;49867:1;49864;49857:12;49881:117;49990:1;49987;49980:12;50004:117;50113:1;50110;50103:12;50127:117;50236:1;50233;50226:12;50250:117;50359:1;50356;50349:12;50373:117;50482:1;50479;50472:12;50496:102;50537:6;50588:2;50584:7;50579:2;50572:5;50568:14;50564:28;50554:38;;50496:102;;;:::o;50604:230::-;50744:34;50740:1;50732:6;50728:14;50721:58;50813:13;50808:2;50800:6;50796:15;50789:38;50604:230;:::o;50840:237::-;50980:34;50976:1;50968:6;50964:14;50957:58;51049:20;51044:2;51036:6;51032:15;51025:45;50840:237;:::o;51083:225::-;51223:34;51219:1;51211:6;51207:14;51200:58;51292:8;51287:2;51279:6;51275:15;51268:33;51083:225;:::o;51314:178::-;51454:30;51450:1;51442:6;51438:14;51431:54;51314:178;:::o;51498:223::-;51638:34;51634:1;51626:6;51622:14;51615:58;51707:6;51702:2;51694:6;51690:15;51683:31;51498:223;:::o;51727:228::-;51867:34;51863:1;51855:6;51851:14;51844:58;51936:11;51931:2;51923:6;51919:15;51912:36;51727:228;:::o;51961:175::-;52101:27;52097:1;52089:6;52085:14;52078:51;51961:175;:::o;52142:231::-;52282:34;52278:1;52270:6;52266:14;52259:58;52351:14;52346:2;52338:6;52334:15;52327:39;52142:231;:::o;52379:243::-;52519:34;52515:1;52507:6;52503:14;52496:58;52588:26;52583:2;52575:6;52571:15;52564:51;52379:243;:::o;52628:229::-;52768:34;52764:1;52756:6;52752:14;52745:58;52837:12;52832:2;52824:6;52820:15;52813:37;52628:229;:::o;52863:228::-;53003:34;52999:1;52991:6;52987:14;52980:58;53072:11;53067:2;53059:6;53055:15;53048:36;52863:228;:::o;53097:224::-;53237:34;53233:1;53225:6;53221:14;53214:58;53306:7;53301:2;53293:6;53289:15;53282:32;53097:224;:::o;53327:223::-;53467:34;53463:1;53455:6;53451:14;53444:58;53536:6;53531:2;53523:6;53519:15;53512:31;53327:223;:::o;53556:182::-;53696:34;53692:1;53684:6;53680:14;53673:58;53556:182;:::o;53744:231::-;53884:34;53880:1;53872:6;53868:14;53861:58;53953:14;53948:2;53940:6;53936:15;53929:39;53744:231;:::o;53981:182::-;54121:34;54117:1;54109:6;54105:14;54098:58;53981:182;:::o;54169:228::-;54309:34;54305:1;54297:6;54293:14;54286:58;54378:11;54373:2;54365:6;54361:15;54354:36;54169:228;:::o;54403:234::-;54543:34;54539:1;54531:6;54527:14;54520:58;54612:17;54607:2;54599:6;54595:15;54588:42;54403:234;:::o;54643:220::-;54783:34;54779:1;54771:6;54767:14;54760:58;54852:3;54847:2;54839:6;54835:15;54828:28;54643:220;:::o;54869:225::-;55009:34;55005:1;54997:6;54993:14;54986:58;55078:8;55073:2;55065:6;55061:15;55054:33;54869:225;:::o;55100:236::-;55240:34;55236:1;55228:6;55224:14;55217:58;55309:19;55304:2;55296:6;55292:15;55285:44;55100:236;:::o;55342:231::-;55482:34;55478:1;55470:6;55466:14;55459:58;55551:14;55546:2;55538:6;55534:15;55527:39;55342:231;:::o;55579:122::-;55652:24;55670:5;55652:24;:::i;:::-;55645:5;55642:35;55632:63;;55691:1;55688;55681:12;55632:63;55579:122;:::o;55707:116::-;55777:21;55792:5;55777:21;:::i;:::-;55770:5;55767:32;55757:60;;55813:1;55810;55803:12;55757:60;55707:116;:::o;55829:122::-;55902:24;55920:5;55902:24;:::i;:::-;55895:5;55892:35;55882:63;;55941:1;55938;55931:12;55882:63;55829:122;:::o;55957:120::-;56029:23;56046:5;56029:23;:::i;:::-;56022:5;56019:34;56009:62;;56067:1;56064;56057:12;56009:62;55957:120;:::o;56083:122::-;56156:24;56174:5;56156:24;:::i;:::-;56149:5;56146:35;56136:63;;56195:1;56192;56185:12;56136:63;56083:122;:::o

Swarm Source

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