ETH Price: $3,488.79 (-0.41%)
Gas: 2 Gwei

Token

decimals (Decimals)
 

Overview

Max Total Supply

61 Decimals

Holders

30

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 Decimals
0x79fccf0b331cad4f00132901d77e9f8988943060
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:
Decimals

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @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;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

contract Decimals is ERC721Enumerable, ReentrancyGuard, Ownable {
    uint16 private claimedCommunityRewards = 0;
    uint16 public MAX_NFT_SUPPLY = 10000;
    uint128 public constant MAX_VALUE = 1000000000000000000;

    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }

    function getFirst(uint256 tokenId) public pure returns (string memory) {
        return pluck(tokenId, "FIRST");
    }

    function getSecond(uint256 tokenId) public pure returns (string memory) {
        return pluck(tokenId, "SECOND");
    }

    function getThird(uint256 tokenId) public pure returns (string memory) {
        return pluck(tokenId, "THIRD");
    }

    function getFourth(uint256 tokenId) public pure returns (string memory) {
        return pluck(tokenId, "FOURTH");
    }

    function getFifth(uint256 tokenId) public pure returns (string memory) {
        return pluck(tokenId, "FIFTH");
    }

    function getSixth(uint256 tokenId) public pure returns (string memory) {
        return pluck(tokenId, "SIXTH");
    }

    function getSeventh(uint256 tokenId) public pure returns (string memory) {
        return pluck(tokenId, "SEVENTH");
    }

    function getEight(uint256 tokenId) public pure returns (string memory) {
        return pluck(tokenId, "EIGHTH");
    }

    function pluck(uint256 tokenId, string memory keyPrefix) internal pure returns (string memory) {
        uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId))));
        uint256 luck = rand % 21;
        uint256 value = rand % MAX_VALUE;

        if (luck >= 19) {
            if (luck == 19) {
                value = SafeMath.add(value, SafeMath.div(MAX_VALUE - value, 2));
            } else {
                value = SafeMath.div(MAX_VALUE - value, 2);
            }
        }

        uint256 numbers = MAX_VALUE / 10;
        string memory output = "0.";
        while (SafeMath.div(value, numbers) < 1) {
            numbers = SafeMath.div(numbers, 10);
            output = string(abi.encodePacked(output, "0"));
        }
        return string(abi.encodePacked(output, toString(value)));
    }

    function tokenURI(uint256 tokenId) public pure override returns (string memory) {
        string[17] memory parts;
        parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350" style="background-color:11ee11"><style>.base {font-size: 20px;}</style><text x="10" y="40" class="base">';

        parts[1] = getFirst(tokenId);
        parts[2] = '</text><text x="10" y="80" class="base">';

        parts[3] = getSecond(tokenId);
        parts[4] = '</text><text x="10" y="120" class="base">';

        parts[5] = getThird(tokenId);
        parts[6] = '</text><text x="10" y="160" class="base">';

        parts[7] = getFourth(tokenId);
        parts[8] = '</text><text x="10" y="200" class="base">';

        parts[9] = getFifth(tokenId);
        parts[10] = '</text><text x="10" y="240" class="base">';

        parts[11] = getSixth(tokenId);
        parts[12] = '</text><text x="10" y="280" class="base">';

        parts[13] = getSeventh(tokenId);
        parts[14] = '</text><text x="10" y="320" class="base">';

        parts[15] = getEight(tokenId);
        parts[16] = "</text></svg>";

        string memory output = string(
            abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8])
        );
        output = string(
            abi.encodePacked(
                output,
                parts[9],
                parts[10],
                parts[11],
                parts[12],
                parts[13],
                parts[14],
                parts[15],
                parts[16]
            )
        );

        string memory json = Base64.encode(
            bytes(
                string(
                    abi.encodePacked(
                        '{"name": "Decimals #',
                        toString(tokenId),
                        '", "description": "Decimals can be anything.", "image": "data:image/svg+xml;base64,',
                        Base64.encode(bytes(output)),
                        '"}'
                    )
                )
            )
        );
        output = string(abi.encodePacked("data:application/json;base64,", json));

        return output;
    }

    function mint(uint256 numberOfNfts) public nonReentrant {
        require(numberOfNfts > 0, "numberOfNfts must be more than 0");
        require(numberOfNfts <= 3, "You may not buy more than 3 NFTs at once");
        require(SafeMath.add(numberOfNfts, SafeMath.sub(totalSupply(),claimedCommunityRewards)) <= 8888, "Exceeds MAX_NFT_SUPPLY");

        for (uint i = 0; i < numberOfNfts; i++) {
            uint mintIndex = SafeMath.sub(totalSupply(),claimedCommunityRewards);
            _safeMint(_msgSender(), mintIndex);
            totalSupply();
        }
    }

    function claimCommunityRewards(uint256[] calldata tokenIds) public onlyOwner {
        for (uint256 i = 0; i < tokenIds.length; i++) {
            require(tokenIds[i] > 8888 && tokenIds[i] < 10000, "Token ID invalid");
            claimedCommunityRewards++;
            _safeMint(_msgSender(), tokenIds[i]);
        }
    }

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

    constructor() ERC721("decimals", "Decimals") Ownable() {}
}

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_NFT_SUPPLY","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_VALUE","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claimCommunityRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getEight","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFifth","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFirst","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFourth","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSecond","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSeventh","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSixth","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getThird","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfNfts","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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"}]

60806040526000600b60146101000a81548161ffff021916908361ffff160217905550612710600b60166101000a81548161ffff021916908361ffff1602179055503480156200004e57600080fd5b506040518060400160405280600881526020017f646563696d616c730000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f446563696d616c730000000000000000000000000000000000000000000000008152508160009080519060200190620000d3929190620001eb565b508060019080519060200190620000ec929190620001eb565b5050506001600a81905550620001176200010b6200011d60201b60201c565b6200012560201b60201c565b62000300565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001f9906200029b565b90600052602060002090601f0160209004810192826200021d576000855562000269565b82601f106200023857805160ff191683800117855562000269565b8280016001018555821562000269579182015b82811115620002685782518255916020019190600101906200024b565b5b5090506200027891906200027c565b5090565b5b80821115620002975760008160009055506001016200027d565b5090565b60006002820490506001821680620002b457607f821691505b60208210811415620002cb57620002ca620002d1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614c5680620003106000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c8063715018a61161010f578063a22cb465116100a2578063c87b56dd11610071578063c87b56dd146105dc578063e985e9c51461060c578063f2fde38b1461063c578063fa7f71b114610658576101e5565b8063a22cb4651461056a578063b030431c14610586578063b5077f44146105a2578063b88d4fde146105c0576101e5565b80639347e43f116100de5780639347e43f146104d057806395d89b41146105005780639ec29b821461051e578063a0712d681461054e576101e5565b8063715018a6146104485780638aa001fc146104525780638c921d06146104825780638da5cb5b146104b2576101e5565b806323b872dd116101875780634f6ccce7116101565780634f6ccce7146103885780636352211e146103b8578063667386f7146103e857806370a0823114610418576101e5565b806323b872dd146102f05780632f745c591461030c57806342842e0e1461033c57806342d9d87614610358576101e5565b8063081812fc116101c3578063081812fc14610256578063095ea7b3146102865780630b2503a6146102a257806318160ddd146102d2576101e5565b806301ffc9a7146101ea578063063bde241461021a57806306fdde0314610238575b600080fd5b61020460048036038101906101ff91906133bb565b610688565b6040516102119190613a8b565b60405180910390f35b610222610702565b60405161022f9190613d88565b60405180910390f35b61024061070e565b60405161024d9190613aa6565b60405180910390f35b610270600480360381019061026b9190613415565b6107a0565b60405161027d9190613a24565b60405180910390f35b6102a0600480360381019061029b919061332e565b610825565b005b6102bc60048036038101906102b79190613415565b61093d565b6040516102c99190613aa6565b60405180910390f35b6102da610985565b6040516102e79190613dbe565b60405180910390f35b61030a60048036038101906103059190613218565b610992565b005b6103266004803603810190610321919061332e565b6109f2565b6040516103339190613dbe565b60405180910390f35b61035660048036038101906103519190613218565b610a97565b005b610372600480360381019061036d9190613415565b610ab7565b60405161037f9190613aa6565b60405180910390f35b6103a2600480360381019061039d9190613415565b610aff565b6040516103af9190613dbe565b60405180910390f35b6103d260048036038101906103cd9190613415565b610b70565b6040516103df9190613a24565b60405180910390f35b61040260048036038101906103fd9190613415565b610c22565b60405161040f9190613aa6565b60405180910390f35b610432600480360381019061042d91906131ab565b610c6a565b60405161043f9190613dbe565b60405180910390f35b610450610d22565b005b61046c60048036038101906104679190613415565b610daa565b6040516104799190613aa6565b60405180910390f35b61049c60048036038101906104979190613415565b610df2565b6040516104a99190613aa6565b60405180910390f35b6104ba610e3a565b6040516104c79190613a24565b60405180910390f35b6104ea60048036038101906104e59190613415565b610e64565b6040516104f79190613aa6565b60405180910390f35b610508610eac565b6040516105159190613aa6565b60405180910390f35b61053860048036038101906105339190613415565b610f3e565b6040516105459190613aa6565b60405180910390f35b61056860048036038101906105639190613415565b610f86565b005b610584600480360381019061057f91906132ee565b61113b565b005b6105a0600480360381019061059b919061336e565b6112bc565b005b6105aa611446565b6040516105b79190613da3565b60405180910390f35b6105da60048036038101906105d5919061326b565b61145a565b005b6105f660048036038101906105f19190613415565b6114bc565b6040516106039190613aa6565b60405180910390f35b610626600480360381019061062191906131d8565b611a52565b6040516106339190613a8b565b60405180910390f35b610656600480360381019061065191906131ab565b611ae6565b005b610672600480360381019061066d9190613415565b611bde565b60405161067f9190613aa6565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106fb57506106fa82611c26565b5b9050919050565b670de0b6b3a764000081565b60606000805461071d90614098565b80601f016020809104026020016040519081016040528092919081815260200182805461074990614098565b80156107965780601f1061076b57610100808354040283529160200191610796565b820191906000526020600020905b81548152906001019060200180831161077957829003601f168201915b5050505050905090565b60006107ab82611d08565b6107ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e190613c88565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061083082610b70565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089890613d08565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108c0611d74565b73ffffffffffffffffffffffffffffffffffffffff1614806108ef57506108ee816108e9611d74565b611a52565b5b61092e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092590613c08565b60405180910390fd5b6109388383611d7c565b505050565b606061097e826040518060400160405280600581526020017f4649465448000000000000000000000000000000000000000000000000000000815250611e35565b9050919050565b6000600880549050905090565b6109a361099d611d74565b82612010565b6109e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d990613d28565b60405180910390fd5b6109ed8383836120ee565b505050565b60006109fd83610c6a565b8210610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590613ac8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ab28383836040518060200160405280600081525061145a565b505050565b6060610af8826040518060400160405280600581526020017f5349585448000000000000000000000000000000000000000000000000000000815250611e35565b9050919050565b6000610b09610985565b8210610b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4190613d48565b60405180910390fd5b60088281548110610b5e57610b5d61425c565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1090613c48565b60405180910390fd5b80915050919050565b6060610c63826040518060400160405280600581526020017f4649525354000000000000000000000000000000000000000000000000000000815250611e35565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd290613c28565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d2a611d74565b73ffffffffffffffffffffffffffffffffffffffff16610d48610e3a565b73ffffffffffffffffffffffffffffffffffffffff1614610d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9590613ca8565b60405180910390fd5b610da8600061234a565b565b6060610deb826040518060400160405280600681526020017f5345434f4e440000000000000000000000000000000000000000000000000000815250611e35565b9050919050565b6060610e33826040518060400160405280600781526020017f534556454e544800000000000000000000000000000000000000000000000000815250611e35565b9050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060610ea5826040518060400160405280600681526020017f4549474854480000000000000000000000000000000000000000000000000000815250611e35565b9050919050565b606060018054610ebb90614098565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee790614098565b8015610f345780601f10610f0957610100808354040283529160200191610f34565b820191906000526020600020905b815481529060010190602001808311610f1757829003601f168201915b5050505050905090565b6060610f7f826040518060400160405280600681526020017f464f555254480000000000000000000000000000000000000000000000000000815250611e35565b9050919050565b6002600a541415610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc390613d68565b60405180910390fd5b6002600a8190555060008111611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e90613bc8565b60405180910390fd5b600381111561105b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105290613b68565b60405180910390fd5b6122b861108c8261108761106d610985565b600b60149054906101000a900461ffff1661ffff16612410565b612426565b11156110cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c490613b48565b60405180910390fd5b60005b8181101561112f5760006110ff6110e5610985565b600b60149054906101000a900461ffff1661ffff16612410565b905061111261110c611d74565b8261243c565b61111a610985565b5050808061112790614126565b9150506110d0565b506001600a8190555050565b611143611d74565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a890613ba8565b60405180910390fd5b80600560006111be611d74565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661126b611d74565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112b09190613a8b565b60405180910390a35050565b6112c4611d74565b73ffffffffffffffffffffffffffffffffffffffff166112e2610e3a565b73ffffffffffffffffffffffffffffffffffffffff1614611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f90613ca8565b60405180910390fd5b60005b82829050811015611441576122b883838381811061135c5761135b61425c565b5b9050602002013511801561138a57506127108383838181106113815761138061425c565b5b90506020020135105b6113c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c090613cc8565b60405180910390fd5b600b601481819054906101000a900461ffff16809291906113e9906140fb565b91906101000a81548161ffff021916908361ffff1602179055505061142e61140f611d74565b8484848181106114225761142161425c565b5b9050602002013561243c565b808061143990614126565b91505061133b565b505050565b600b60169054906101000a900461ffff1681565b61146b611465611d74565b83612010565b6114aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a190613d28565b60405180910390fd5b6114b68484848461245a565b50505050565b60606114c6613054565b60405180610100016040528060ca8152602001614aee60ca9139816000601181106114f4576114f361425c565b5b602002018190525061150583610c22565b816001601181106115195761151861425c565b5b6020020181905250604051806060016040528060288152602001614a74602891398160026011811061154e5761154d61425c565b5b602002018190525061155f83610daa565b816003601181106115735761157261425c565b5b6020020181905250604051806060016040528060298152602001614a4b60299139816004601181106115a8576115a761425c565b5b60200201819052506115b983611bde565b816005601181106115cd576115cc61425c565b5b6020020181905250604051806060016040528060298152602001614a2260299139816006601181106116025761160161425c565b5b602002018190525061161383610f3e565b816007601181106116275761162661425c565b5b6020020181905250604051806060016040528060298152602001614a9c602991398160086011811061165c5761165b61425c565b5b602002018190525061166d8361093d565b816009601181106116815761168061425c565b5b6020020181905250604051806060016040528060298152602001614ac56029913981600a601181106116b6576116b561425c565b5b60200201819052506116c783610ab7565b81600b601181106116db576116da61425c565b5b6020020181905250604051806060016040528060298152602001614bf86029913981600c601181106117105761170f61425c565b5b602002018190525061172183610df2565b81600d601181106117355761173461425c565b5b60200201819052506040518060600160405280602981526020016149f96029913981600e6011811061176a5761176961425c565b5b602002018190525061177b83610e64565b81600f6011811061178f5761178e61425c565b5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e00000000000000000000000000000000000000815250816010601181106117e1576117e061425c565b5b60200201819052506000816000601181106117ff576117fe61425c565b5b6020020151826001601181106118185761181761425c565b5b6020020151836002601181106118315761183061425c565b5b60200201518460036011811061184a5761184961425c565b5b6020020151856004601181106118635761186261425c565b5b60200201518660056011811061187c5761187b61425c565b5b6020020151876006601181106118955761189461425c565b5b6020020151886007601181106118ae576118ad61425c565b5b6020020151896008601181106118c7576118c661425c565b5b60200201516040516020016118e49998979695949392919061391c565b6040516020818303038152906040529050808260096011811061190a5761190961425c565b5b602002015183600a601181106119235761192261425c565b5b602002015184600b6011811061193c5761193b61425c565b5b602002015185600c601181106119555761195461425c565b5b602002015186600d6011811061196e5761196d61425c565b5b602002015187600e601181106119875761198661425c565b5b602002015188600f601181106119a05761199f61425c565b5b6020020151896010601181106119b9576119b861425c565b5b60200201516040516020016119d69998979695949392919061391c565b60405160208183030381529060405290506000611a236119f5866124b6565b6119fe84612617565b604051602001611a0f9291906139bd565b604051602081830303815290604052612617565b905080604051602001611a369190613a02565b6040516020818303038152906040529150819350505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611aee611d74565b73ffffffffffffffffffffffffffffffffffffffff16611b0c610e3a565b73ffffffffffffffffffffffffffffffffffffffff1614611b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5990613ca8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc990613b08565b60405180910390fd5b611bdb8161234a565b50565b6060611c1f826040518060400160405280600581526020017f5448495244000000000000000000000000000000000000000000000000000000815250611e35565b9050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cf157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d015750611d00826127af565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611def83610b70565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60606000611e6b83611e46866124b6565b604051602001611e579291906138f8565b604051602081830303815290604052612819565b90506000601582611e7c919061416f565b90506000670de0b6b3a76400006fffffffffffffffffffffffffffffffff1683611ea6919061416f565b905060138210611f2d576013821415611ef957611ef281611eed83670de0b6b3a76400006fffffffffffffffffffffffffffffffff16611ee69190613f84565b600261284c565b612426565b9050611f2c565b611f2981670de0b6b3a76400006fffffffffffffffffffffffffffffffff16611f229190613f84565b600261284c565b90505b5b6000600a670de0b6b3a7640000611f449190613ec8565b6fffffffffffffffffffffffffffffffff16905060006040518060400160405280600281526020017f302e00000000000000000000000000000000000000000000000000000000000081525090505b6001611f9f848461284c565b1015611fd957611fb082600a61284c565b915080604051602001611fc3919061399b565b6040516020818303038152906040529050611f93565b80611fe3846124b6565b604051602001611ff49291906138f8565b6040516020818303038152906040529550505050505092915050565b600061201b82611d08565b61205a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205190613be8565b60405180910390fd5b600061206583610b70565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120d457508373ffffffffffffffffffffffffffffffffffffffff166120bc846107a0565b73ffffffffffffffffffffffffffffffffffffffff16145b806120e557506120e48185611a52565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661210e82610b70565b73ffffffffffffffffffffffffffffffffffffffff1614612164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215b90613ce8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cb90613b88565b60405180910390fd5b6121df838383612862565b6121ea600082611d7c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461223a9190613f84565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122919190613e72565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000818361241e9190613f84565b905092915050565b600081836124349190613e72565b905092915050565b612456828260405180602001604052806000815250612976565b5050565b6124658484846120ee565b612471848484846129d1565b6124b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a790613ae8565b60405180910390fd5b50505050565b606060008214156124fe576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612612565b600082905060005b6000821461253057808061251990614126565b915050600a826125299190613ef9565b9150612506565b60008167ffffffffffffffff81111561254c5761254b61428b565b5b6040519080825280601f01601f19166020018201604052801561257e5781602001600182028036833780820191505090505b5090505b6000851461260b576001826125979190613f84565b9150600a856125a6919061416f565b60306125b29190613e72565b60f81b8183815181106125c8576125c761425c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126049190613ef9565b9450612582565b8093505050505b919050565b6060600082519050600081141561264057604051806020016040528060008152509150506127aa565b600060036002836126519190613e72565b61265b9190613ef9565b60046126679190613f2a565b905060006020826126789190613e72565b67ffffffffffffffff8111156126915761269061428b565b5b6040519080825280601f01601f1916602001820160405280156126c35781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001614bb8604091399050600181016020830160005b868110156127675760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b905080845260048401935050506126ee565b50600386066001811461278157600281146127915761279c565b613d3d60f01b600283035261279c565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008160405160200161282c91906138e1565b6040516020818303038152906040528051906020012060001c9050919050565b6000818361285a9190613ef9565b905092915050565b61286d838383612b68565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128b0576128ab81612b6d565b6128ef565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146128ee576128ed8382612bb6565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129325761292d81612d23565b612971565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146129705761296f8282612df4565b5b5b505050565b6129808383612e73565b61298d60008484846129d1565b6129cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c390613ae8565b60405180910390fd5b505050565b60006129f28473ffffffffffffffffffffffffffffffffffffffff16613041565b15612b5b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a1b611d74565b8786866040518563ffffffff1660e01b8152600401612a3d9493929190613a3f565b602060405180830381600087803b158015612a5757600080fd5b505af1925050508015612a8857506040513d601f19601f82011682018060405250810190612a8591906133e8565b60015b612b0b573d8060008114612ab8576040519150601f19603f3d011682016040523d82523d6000602084013e612abd565b606091505b50600081511415612b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afa90613ae8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b60565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612bc384610c6a565b612bcd9190613f84565b9050600060076000848152602001908152602001600020549050818114612cb2576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612d379190613f84565b9050600060096000848152602001908152602001600020549050600060088381548110612d6757612d6661425c565b5b906000526020600020015490508060088381548110612d8957612d8861425c565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612dd857612dd761422d565b5b6001900381819060005260206000200160009055905550505050565b6000612dff83610c6a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eda90613c68565b60405180910390fd5b612eec81611d08565b15612f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2390613b28565b60405180910390fd5b612f3860008383612862565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f889190613e72565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518061022001604052806011905b60608152602001906001900390816130645790505090565b600061308f61308a84613dfe565b613dd9565b9050828152602081018484840111156130ab576130aa6142c9565b5b6130b6848285614056565b509392505050565b6000813590506130cd8161499c565b92915050565b60008083601f8401126130e9576130e86142bf565b5b8235905067ffffffffffffffff811115613106576131056142ba565b5b602083019150836020820283011115613122576131216142c4565b5b9250929050565b600081359050613138816149b3565b92915050565b60008135905061314d816149ca565b92915050565b600081519050613162816149ca565b92915050565b600082601f83011261317d5761317c6142bf565b5b813561318d84826020860161307c565b91505092915050565b6000813590506131a5816149e1565b92915050565b6000602082840312156131c1576131c06142d3565b5b60006131cf848285016130be565b91505092915050565b600080604083850312156131ef576131ee6142d3565b5b60006131fd858286016130be565b925050602061320e858286016130be565b9150509250929050565b600080600060608486031215613231576132306142d3565b5b600061323f868287016130be565b9350506020613250868287016130be565b925050604061326186828701613196565b9150509250925092565b60008060008060808587031215613285576132846142d3565b5b6000613293878288016130be565b94505060206132a4878288016130be565b93505060406132b587828801613196565b925050606085013567ffffffffffffffff8111156132d6576132d56142ce565b5b6132e287828801613168565b91505092959194509250565b60008060408385031215613305576133046142d3565b5b6000613313858286016130be565b925050602061332485828601613129565b9150509250929050565b60008060408385031215613345576133446142d3565b5b6000613353858286016130be565b925050602061336485828601613196565b9150509250929050565b60008060208385031215613385576133846142d3565b5b600083013567ffffffffffffffff8111156133a3576133a26142ce565b5b6133af858286016130d3565b92509250509250929050565b6000602082840312156133d1576133d06142d3565b5b60006133df8482850161313e565b91505092915050565b6000602082840312156133fe576133fd6142d3565b5b600061340c84828501613153565b91505092915050565b60006020828403121561342b5761342a6142d3565b5b600061343984828501613196565b91505092915050565b61344b81613fb8565b82525050565b61345a81613fca565b82525050565b600061346b82613e2f565b6134758185613e45565b9350613485818560208601614065565b61348e816142d8565b840191505092915050565b60006134a482613e3a565b6134ae8185613e56565b93506134be818560208601614065565b6134c7816142d8565b840191505092915050565b60006134dd82613e3a565b6134e78185613e67565b93506134f7818560208601614065565b80840191505092915050565b6000613510600183613e67565b915061351b826142e9565b600182019050919050565b6000613533601483613e67565b915061353e82614312565b601482019050919050565b6000613556602b83613e56565b91506135618261433b565b604082019050919050565b6000613579603283613e56565b91506135848261438a565b604082019050919050565b600061359c602683613e56565b91506135a7826143d9565b604082019050919050565b60006135bf601c83613e56565b91506135ca82614428565b602082019050919050565b60006135e2601683613e56565b91506135ed82614451565b602082019050919050565b6000613605602883613e56565b91506136108261447a565b604082019050919050565b6000613628602483613e56565b9150613633826144c9565b604082019050919050565b600061364b601983613e56565b915061365682614518565b602082019050919050565b600061366e602083613e56565b915061367982614541565b602082019050919050565b6000613691602c83613e56565b915061369c8261456a565b604082019050919050565b60006136b4603883613e56565b91506136bf826145b9565b604082019050919050565b60006136d7602a83613e56565b91506136e282614608565b604082019050919050565b60006136fa602983613e56565b915061370582614657565b604082019050919050565b600061371d600283613e67565b9150613728826146a6565b600282019050919050565b6000613740602083613e56565b915061374b826146cf565b602082019050919050565b6000613763602c83613e56565b915061376e826146f8565b604082019050919050565b6000613786602083613e56565b915061379182614747565b602082019050919050565b60006137a9601083613e56565b91506137b482614770565b602082019050919050565b60006137cc602983613e56565b91506137d782614799565b604082019050919050565b60006137ef602183613e56565b91506137fa826147e8565b604082019050919050565b6000613812601d83613e67565b915061381d82614837565b601d82019050919050565b6000613835603183613e56565b915061384082614860565b604082019050919050565b6000613858602c83613e56565b9150613863826148af565b604082019050919050565b600061387b605383613e67565b9150613886826148fe565b605382019050919050565b600061389e601f83613e56565b91506138a982614973565b602082019050919050565b6138bd81614002565b82525050565b6138cc8161401e565b82525050565b6138db8161404c565b82525050565b60006138ed82846134d2565b915081905092915050565b600061390482856134d2565b915061391082846134d2565b91508190509392505050565b6000613928828c6134d2565b9150613934828b6134d2565b9150613940828a6134d2565b915061394c82896134d2565b915061395882886134d2565b915061396482876134d2565b915061397082866134d2565b915061397c82856134d2565b915061398882846134d2565b91508190509a9950505050505050505050565b60006139a782846134d2565b91506139b282613503565b915081905092915050565b60006139c882613526565b91506139d482856134d2565b91506139df8261386e565b91506139eb82846134d2565b91506139f682613710565b91508190509392505050565b6000613a0d82613805565b9150613a1982846134d2565b915081905092915050565b6000602082019050613a396000830184613442565b92915050565b6000608082019050613a546000830187613442565b613a616020830186613442565b613a6e60408301856138d2565b8181036060830152613a808184613460565b905095945050505050565b6000602082019050613aa06000830184613451565b92915050565b60006020820190508181036000830152613ac08184613499565b905092915050565b60006020820190508181036000830152613ae181613549565b9050919050565b60006020820190508181036000830152613b018161356c565b9050919050565b60006020820190508181036000830152613b218161358f565b9050919050565b60006020820190508181036000830152613b41816135b2565b9050919050565b60006020820190508181036000830152613b61816135d5565b9050919050565b60006020820190508181036000830152613b81816135f8565b9050919050565b60006020820190508181036000830152613ba18161361b565b9050919050565b60006020820190508181036000830152613bc18161363e565b9050919050565b60006020820190508181036000830152613be181613661565b9050919050565b60006020820190508181036000830152613c0181613684565b9050919050565b60006020820190508181036000830152613c21816136a7565b9050919050565b60006020820190508181036000830152613c41816136ca565b9050919050565b60006020820190508181036000830152613c61816136ed565b9050919050565b60006020820190508181036000830152613c8181613733565b9050919050565b60006020820190508181036000830152613ca181613756565b9050919050565b60006020820190508181036000830152613cc181613779565b9050919050565b60006020820190508181036000830152613ce18161379c565b9050919050565b60006020820190508181036000830152613d01816137bf565b9050919050565b60006020820190508181036000830152613d21816137e2565b9050919050565b60006020820190508181036000830152613d4181613828565b9050919050565b60006020820190508181036000830152613d618161384b565b9050919050565b60006020820190508181036000830152613d8181613891565b9050919050565b6000602082019050613d9d60008301846138b4565b92915050565b6000602082019050613db860008301846138c3565b92915050565b6000602082019050613dd360008301846138d2565b92915050565b6000613de3613df4565b9050613def82826140ca565b919050565b6000604051905090565b600067ffffffffffffffff821115613e1957613e1861428b565b5b613e22826142d8565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613e7d8261404c565b9150613e888361404c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ebd57613ebc6141a0565b5b828201905092915050565b6000613ed382614002565b9150613ede83614002565b925082613eee57613eed6141cf565b5b828204905092915050565b6000613f048261404c565b9150613f0f8361404c565b925082613f1f57613f1e6141cf565b5b828204905092915050565b6000613f358261404c565b9150613f408361404c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f7957613f786141a0565b5b828202905092915050565b6000613f8f8261404c565b9150613f9a8361404c565b925082821015613fad57613fac6141a0565b5b828203905092915050565b6000613fc38261402c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614083578082015181840152602081019050614068565b83811115614092576000848401525b50505050565b600060028204905060018216806140b057607f821691505b602082108114156140c4576140c36141fe565b5b50919050565b6140d3826142d8565b810181811067ffffffffffffffff821117156140f2576140f161428b565b5b80604052505050565b60006141068261401e565b915061ffff82141561411b5761411a6141a0565b5b600182019050919050565b60006141318261404c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614164576141636141a0565b5b600182019050919050565b600061417a8261404c565b91506141858361404c565b925082614195576141946141cf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f3000000000000000000000000000000000000000000000000000000000000000600082015250565b7f7b226e616d65223a2022446563696d616c732023000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f45786365656473204d41585f4e46545f535550504c5900000000000000000000600082015250565b7f596f75206d6179206e6f7420627579206d6f7265207468616e2033204e46547360008201527f206174206f6e6365000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f6e756d6265724f664e667473206d757374206265206d6f7265207468616e2030600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f222c20226465736372697074696f6e223a2022446563696d616c732063616e2060008201527f626520616e797468696e672e222c2022696d616765223a2022646174613a696d60208201527f6167652f7376672b786d6c3b6261736536342c00000000000000000000000000604082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6149a581613fb8565b81146149b057600080fd5b50565b6149bc81613fca565b81146149c757600080fd5b50565b6149d381613fd6565b81146149de57600080fd5b50565b6149ea8161404c565b81146149f557600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d223332302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223230302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223234302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d22302030203335302033353022207374796c653d226261636b67726f756e642d636f6c6f723a313165653131223e3c7374796c653e2e62617365207b666f6e742d73697a653a20323070783b7d3c2f7374796c653e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d223238302220636c6173733d2262617365223ea264697066735822122072495aba3f587feaeae619986fadc98e69fd1f7212c5910960f604e9423d1a9e64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c8063715018a61161010f578063a22cb465116100a2578063c87b56dd11610071578063c87b56dd146105dc578063e985e9c51461060c578063f2fde38b1461063c578063fa7f71b114610658576101e5565b8063a22cb4651461056a578063b030431c14610586578063b5077f44146105a2578063b88d4fde146105c0576101e5565b80639347e43f116100de5780639347e43f146104d057806395d89b41146105005780639ec29b821461051e578063a0712d681461054e576101e5565b8063715018a6146104485780638aa001fc146104525780638c921d06146104825780638da5cb5b146104b2576101e5565b806323b872dd116101875780634f6ccce7116101565780634f6ccce7146103885780636352211e146103b8578063667386f7146103e857806370a0823114610418576101e5565b806323b872dd146102f05780632f745c591461030c57806342842e0e1461033c57806342d9d87614610358576101e5565b8063081812fc116101c3578063081812fc14610256578063095ea7b3146102865780630b2503a6146102a257806318160ddd146102d2576101e5565b806301ffc9a7146101ea578063063bde241461021a57806306fdde0314610238575b600080fd5b61020460048036038101906101ff91906133bb565b610688565b6040516102119190613a8b565b60405180910390f35b610222610702565b60405161022f9190613d88565b60405180910390f35b61024061070e565b60405161024d9190613aa6565b60405180910390f35b610270600480360381019061026b9190613415565b6107a0565b60405161027d9190613a24565b60405180910390f35b6102a0600480360381019061029b919061332e565b610825565b005b6102bc60048036038101906102b79190613415565b61093d565b6040516102c99190613aa6565b60405180910390f35b6102da610985565b6040516102e79190613dbe565b60405180910390f35b61030a60048036038101906103059190613218565b610992565b005b6103266004803603810190610321919061332e565b6109f2565b6040516103339190613dbe565b60405180910390f35b61035660048036038101906103519190613218565b610a97565b005b610372600480360381019061036d9190613415565b610ab7565b60405161037f9190613aa6565b60405180910390f35b6103a2600480360381019061039d9190613415565b610aff565b6040516103af9190613dbe565b60405180910390f35b6103d260048036038101906103cd9190613415565b610b70565b6040516103df9190613a24565b60405180910390f35b61040260048036038101906103fd9190613415565b610c22565b60405161040f9190613aa6565b60405180910390f35b610432600480360381019061042d91906131ab565b610c6a565b60405161043f9190613dbe565b60405180910390f35b610450610d22565b005b61046c60048036038101906104679190613415565b610daa565b6040516104799190613aa6565b60405180910390f35b61049c60048036038101906104979190613415565b610df2565b6040516104a99190613aa6565b60405180910390f35b6104ba610e3a565b6040516104c79190613a24565b60405180910390f35b6104ea60048036038101906104e59190613415565b610e64565b6040516104f79190613aa6565b60405180910390f35b610508610eac565b6040516105159190613aa6565b60405180910390f35b61053860048036038101906105339190613415565b610f3e565b6040516105459190613aa6565b60405180910390f35b61056860048036038101906105639190613415565b610f86565b005b610584600480360381019061057f91906132ee565b61113b565b005b6105a0600480360381019061059b919061336e565b6112bc565b005b6105aa611446565b6040516105b79190613da3565b60405180910390f35b6105da60048036038101906105d5919061326b565b61145a565b005b6105f660048036038101906105f19190613415565b6114bc565b6040516106039190613aa6565b60405180910390f35b610626600480360381019061062191906131d8565b611a52565b6040516106339190613a8b565b60405180910390f35b610656600480360381019061065191906131ab565b611ae6565b005b610672600480360381019061066d9190613415565b611bde565b60405161067f9190613aa6565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106fb57506106fa82611c26565b5b9050919050565b670de0b6b3a764000081565b60606000805461071d90614098565b80601f016020809104026020016040519081016040528092919081815260200182805461074990614098565b80156107965780601f1061076b57610100808354040283529160200191610796565b820191906000526020600020905b81548152906001019060200180831161077957829003601f168201915b5050505050905090565b60006107ab82611d08565b6107ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e190613c88565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061083082610b70565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089890613d08565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108c0611d74565b73ffffffffffffffffffffffffffffffffffffffff1614806108ef57506108ee816108e9611d74565b611a52565b5b61092e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092590613c08565b60405180910390fd5b6109388383611d7c565b505050565b606061097e826040518060400160405280600581526020017f4649465448000000000000000000000000000000000000000000000000000000815250611e35565b9050919050565b6000600880549050905090565b6109a361099d611d74565b82612010565b6109e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d990613d28565b60405180910390fd5b6109ed8383836120ee565b505050565b60006109fd83610c6a565b8210610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590613ac8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ab28383836040518060200160405280600081525061145a565b505050565b6060610af8826040518060400160405280600581526020017f5349585448000000000000000000000000000000000000000000000000000000815250611e35565b9050919050565b6000610b09610985565b8210610b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4190613d48565b60405180910390fd5b60088281548110610b5e57610b5d61425c565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1090613c48565b60405180910390fd5b80915050919050565b6060610c63826040518060400160405280600581526020017f4649525354000000000000000000000000000000000000000000000000000000815250611e35565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd290613c28565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d2a611d74565b73ffffffffffffffffffffffffffffffffffffffff16610d48610e3a565b73ffffffffffffffffffffffffffffffffffffffff1614610d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9590613ca8565b60405180910390fd5b610da8600061234a565b565b6060610deb826040518060400160405280600681526020017f5345434f4e440000000000000000000000000000000000000000000000000000815250611e35565b9050919050565b6060610e33826040518060400160405280600781526020017f534556454e544800000000000000000000000000000000000000000000000000815250611e35565b9050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060610ea5826040518060400160405280600681526020017f4549474854480000000000000000000000000000000000000000000000000000815250611e35565b9050919050565b606060018054610ebb90614098565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee790614098565b8015610f345780601f10610f0957610100808354040283529160200191610f34565b820191906000526020600020905b815481529060010190602001808311610f1757829003601f168201915b5050505050905090565b6060610f7f826040518060400160405280600681526020017f464f555254480000000000000000000000000000000000000000000000000000815250611e35565b9050919050565b6002600a541415610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc390613d68565b60405180910390fd5b6002600a8190555060008111611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e90613bc8565b60405180910390fd5b600381111561105b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105290613b68565b60405180910390fd5b6122b861108c8261108761106d610985565b600b60149054906101000a900461ffff1661ffff16612410565b612426565b11156110cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c490613b48565b60405180910390fd5b60005b8181101561112f5760006110ff6110e5610985565b600b60149054906101000a900461ffff1661ffff16612410565b905061111261110c611d74565b8261243c565b61111a610985565b5050808061112790614126565b9150506110d0565b506001600a8190555050565b611143611d74565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a890613ba8565b60405180910390fd5b80600560006111be611d74565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661126b611d74565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112b09190613a8b565b60405180910390a35050565b6112c4611d74565b73ffffffffffffffffffffffffffffffffffffffff166112e2610e3a565b73ffffffffffffffffffffffffffffffffffffffff1614611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f90613ca8565b60405180910390fd5b60005b82829050811015611441576122b883838381811061135c5761135b61425c565b5b9050602002013511801561138a57506127108383838181106113815761138061425c565b5b90506020020135105b6113c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c090613cc8565b60405180910390fd5b600b601481819054906101000a900461ffff16809291906113e9906140fb565b91906101000a81548161ffff021916908361ffff1602179055505061142e61140f611d74565b8484848181106114225761142161425c565b5b9050602002013561243c565b808061143990614126565b91505061133b565b505050565b600b60169054906101000a900461ffff1681565b61146b611465611d74565b83612010565b6114aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a190613d28565b60405180910390fd5b6114b68484848461245a565b50505050565b60606114c6613054565b60405180610100016040528060ca8152602001614aee60ca9139816000601181106114f4576114f361425c565b5b602002018190525061150583610c22565b816001601181106115195761151861425c565b5b6020020181905250604051806060016040528060288152602001614a74602891398160026011811061154e5761154d61425c565b5b602002018190525061155f83610daa565b816003601181106115735761157261425c565b5b6020020181905250604051806060016040528060298152602001614a4b60299139816004601181106115a8576115a761425c565b5b60200201819052506115b983611bde565b816005601181106115cd576115cc61425c565b5b6020020181905250604051806060016040528060298152602001614a2260299139816006601181106116025761160161425c565b5b602002018190525061161383610f3e565b816007601181106116275761162661425c565b5b6020020181905250604051806060016040528060298152602001614a9c602991398160086011811061165c5761165b61425c565b5b602002018190525061166d8361093d565b816009601181106116815761168061425c565b5b6020020181905250604051806060016040528060298152602001614ac56029913981600a601181106116b6576116b561425c565b5b60200201819052506116c783610ab7565b81600b601181106116db576116da61425c565b5b6020020181905250604051806060016040528060298152602001614bf86029913981600c601181106117105761170f61425c565b5b602002018190525061172183610df2565b81600d601181106117355761173461425c565b5b60200201819052506040518060600160405280602981526020016149f96029913981600e6011811061176a5761176961425c565b5b602002018190525061177b83610e64565b81600f6011811061178f5761178e61425c565b5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e00000000000000000000000000000000000000815250816010601181106117e1576117e061425c565b5b60200201819052506000816000601181106117ff576117fe61425c565b5b6020020151826001601181106118185761181761425c565b5b6020020151836002601181106118315761183061425c565b5b60200201518460036011811061184a5761184961425c565b5b6020020151856004601181106118635761186261425c565b5b60200201518660056011811061187c5761187b61425c565b5b6020020151876006601181106118955761189461425c565b5b6020020151886007601181106118ae576118ad61425c565b5b6020020151896008601181106118c7576118c661425c565b5b60200201516040516020016118e49998979695949392919061391c565b6040516020818303038152906040529050808260096011811061190a5761190961425c565b5b602002015183600a601181106119235761192261425c565b5b602002015184600b6011811061193c5761193b61425c565b5b602002015185600c601181106119555761195461425c565b5b602002015186600d6011811061196e5761196d61425c565b5b602002015187600e601181106119875761198661425c565b5b602002015188600f601181106119a05761199f61425c565b5b6020020151896010601181106119b9576119b861425c565b5b60200201516040516020016119d69998979695949392919061391c565b60405160208183030381529060405290506000611a236119f5866124b6565b6119fe84612617565b604051602001611a0f9291906139bd565b604051602081830303815290604052612617565b905080604051602001611a369190613a02565b6040516020818303038152906040529150819350505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611aee611d74565b73ffffffffffffffffffffffffffffffffffffffff16611b0c610e3a565b73ffffffffffffffffffffffffffffffffffffffff1614611b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5990613ca8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc990613b08565b60405180910390fd5b611bdb8161234a565b50565b6060611c1f826040518060400160405280600581526020017f5448495244000000000000000000000000000000000000000000000000000000815250611e35565b9050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cf157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d015750611d00826127af565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611def83610b70565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60606000611e6b83611e46866124b6565b604051602001611e579291906138f8565b604051602081830303815290604052612819565b90506000601582611e7c919061416f565b90506000670de0b6b3a76400006fffffffffffffffffffffffffffffffff1683611ea6919061416f565b905060138210611f2d576013821415611ef957611ef281611eed83670de0b6b3a76400006fffffffffffffffffffffffffffffffff16611ee69190613f84565b600261284c565b612426565b9050611f2c565b611f2981670de0b6b3a76400006fffffffffffffffffffffffffffffffff16611f229190613f84565b600261284c565b90505b5b6000600a670de0b6b3a7640000611f449190613ec8565b6fffffffffffffffffffffffffffffffff16905060006040518060400160405280600281526020017f302e00000000000000000000000000000000000000000000000000000000000081525090505b6001611f9f848461284c565b1015611fd957611fb082600a61284c565b915080604051602001611fc3919061399b565b6040516020818303038152906040529050611f93565b80611fe3846124b6565b604051602001611ff49291906138f8565b6040516020818303038152906040529550505050505092915050565b600061201b82611d08565b61205a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205190613be8565b60405180910390fd5b600061206583610b70565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120d457508373ffffffffffffffffffffffffffffffffffffffff166120bc846107a0565b73ffffffffffffffffffffffffffffffffffffffff16145b806120e557506120e48185611a52565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661210e82610b70565b73ffffffffffffffffffffffffffffffffffffffff1614612164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215b90613ce8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cb90613b88565b60405180910390fd5b6121df838383612862565b6121ea600082611d7c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461223a9190613f84565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122919190613e72565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000818361241e9190613f84565b905092915050565b600081836124349190613e72565b905092915050565b612456828260405180602001604052806000815250612976565b5050565b6124658484846120ee565b612471848484846129d1565b6124b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a790613ae8565b60405180910390fd5b50505050565b606060008214156124fe576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612612565b600082905060005b6000821461253057808061251990614126565b915050600a826125299190613ef9565b9150612506565b60008167ffffffffffffffff81111561254c5761254b61428b565b5b6040519080825280601f01601f19166020018201604052801561257e5781602001600182028036833780820191505090505b5090505b6000851461260b576001826125979190613f84565b9150600a856125a6919061416f565b60306125b29190613e72565b60f81b8183815181106125c8576125c761425c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126049190613ef9565b9450612582565b8093505050505b919050565b6060600082519050600081141561264057604051806020016040528060008152509150506127aa565b600060036002836126519190613e72565b61265b9190613ef9565b60046126679190613f2a565b905060006020826126789190613e72565b67ffffffffffffffff8111156126915761269061428b565b5b6040519080825280601f01601f1916602001820160405280156126c35781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001614bb8604091399050600181016020830160005b868110156127675760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b905080845260048401935050506126ee565b50600386066001811461278157600281146127915761279c565b613d3d60f01b600283035261279c565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008160405160200161282c91906138e1565b6040516020818303038152906040528051906020012060001c9050919050565b6000818361285a9190613ef9565b905092915050565b61286d838383612b68565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128b0576128ab81612b6d565b6128ef565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146128ee576128ed8382612bb6565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129325761292d81612d23565b612971565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146129705761296f8282612df4565b5b5b505050565b6129808383612e73565b61298d60008484846129d1565b6129cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c390613ae8565b60405180910390fd5b505050565b60006129f28473ffffffffffffffffffffffffffffffffffffffff16613041565b15612b5b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a1b611d74565b8786866040518563ffffffff1660e01b8152600401612a3d9493929190613a3f565b602060405180830381600087803b158015612a5757600080fd5b505af1925050508015612a8857506040513d601f19601f82011682018060405250810190612a8591906133e8565b60015b612b0b573d8060008114612ab8576040519150601f19603f3d011682016040523d82523d6000602084013e612abd565b606091505b50600081511415612b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afa90613ae8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b60565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612bc384610c6a565b612bcd9190613f84565b9050600060076000848152602001908152602001600020549050818114612cb2576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612d379190613f84565b9050600060096000848152602001908152602001600020549050600060088381548110612d6757612d6661425c565b5b906000526020600020015490508060088381548110612d8957612d8861425c565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612dd857612dd761422d565b5b6001900381819060005260206000200160009055905550505050565b6000612dff83610c6a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eda90613c68565b60405180910390fd5b612eec81611d08565b15612f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2390613b28565b60405180910390fd5b612f3860008383612862565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f889190613e72565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518061022001604052806011905b60608152602001906001900390816130645790505090565b600061308f61308a84613dfe565b613dd9565b9050828152602081018484840111156130ab576130aa6142c9565b5b6130b6848285614056565b509392505050565b6000813590506130cd8161499c565b92915050565b60008083601f8401126130e9576130e86142bf565b5b8235905067ffffffffffffffff811115613106576131056142ba565b5b602083019150836020820283011115613122576131216142c4565b5b9250929050565b600081359050613138816149b3565b92915050565b60008135905061314d816149ca565b92915050565b600081519050613162816149ca565b92915050565b600082601f83011261317d5761317c6142bf565b5b813561318d84826020860161307c565b91505092915050565b6000813590506131a5816149e1565b92915050565b6000602082840312156131c1576131c06142d3565b5b60006131cf848285016130be565b91505092915050565b600080604083850312156131ef576131ee6142d3565b5b60006131fd858286016130be565b925050602061320e858286016130be565b9150509250929050565b600080600060608486031215613231576132306142d3565b5b600061323f868287016130be565b9350506020613250868287016130be565b925050604061326186828701613196565b9150509250925092565b60008060008060808587031215613285576132846142d3565b5b6000613293878288016130be565b94505060206132a4878288016130be565b93505060406132b587828801613196565b925050606085013567ffffffffffffffff8111156132d6576132d56142ce565b5b6132e287828801613168565b91505092959194509250565b60008060408385031215613305576133046142d3565b5b6000613313858286016130be565b925050602061332485828601613129565b9150509250929050565b60008060408385031215613345576133446142d3565b5b6000613353858286016130be565b925050602061336485828601613196565b9150509250929050565b60008060208385031215613385576133846142d3565b5b600083013567ffffffffffffffff8111156133a3576133a26142ce565b5b6133af858286016130d3565b92509250509250929050565b6000602082840312156133d1576133d06142d3565b5b60006133df8482850161313e565b91505092915050565b6000602082840312156133fe576133fd6142d3565b5b600061340c84828501613153565b91505092915050565b60006020828403121561342b5761342a6142d3565b5b600061343984828501613196565b91505092915050565b61344b81613fb8565b82525050565b61345a81613fca565b82525050565b600061346b82613e2f565b6134758185613e45565b9350613485818560208601614065565b61348e816142d8565b840191505092915050565b60006134a482613e3a565b6134ae8185613e56565b93506134be818560208601614065565b6134c7816142d8565b840191505092915050565b60006134dd82613e3a565b6134e78185613e67565b93506134f7818560208601614065565b80840191505092915050565b6000613510600183613e67565b915061351b826142e9565b600182019050919050565b6000613533601483613e67565b915061353e82614312565b601482019050919050565b6000613556602b83613e56565b91506135618261433b565b604082019050919050565b6000613579603283613e56565b91506135848261438a565b604082019050919050565b600061359c602683613e56565b91506135a7826143d9565b604082019050919050565b60006135bf601c83613e56565b91506135ca82614428565b602082019050919050565b60006135e2601683613e56565b91506135ed82614451565b602082019050919050565b6000613605602883613e56565b91506136108261447a565b604082019050919050565b6000613628602483613e56565b9150613633826144c9565b604082019050919050565b600061364b601983613e56565b915061365682614518565b602082019050919050565b600061366e602083613e56565b915061367982614541565b602082019050919050565b6000613691602c83613e56565b915061369c8261456a565b604082019050919050565b60006136b4603883613e56565b91506136bf826145b9565b604082019050919050565b60006136d7602a83613e56565b91506136e282614608565b604082019050919050565b60006136fa602983613e56565b915061370582614657565b604082019050919050565b600061371d600283613e67565b9150613728826146a6565b600282019050919050565b6000613740602083613e56565b915061374b826146cf565b602082019050919050565b6000613763602c83613e56565b915061376e826146f8565b604082019050919050565b6000613786602083613e56565b915061379182614747565b602082019050919050565b60006137a9601083613e56565b91506137b482614770565b602082019050919050565b60006137cc602983613e56565b91506137d782614799565b604082019050919050565b60006137ef602183613e56565b91506137fa826147e8565b604082019050919050565b6000613812601d83613e67565b915061381d82614837565b601d82019050919050565b6000613835603183613e56565b915061384082614860565b604082019050919050565b6000613858602c83613e56565b9150613863826148af565b604082019050919050565b600061387b605383613e67565b9150613886826148fe565b605382019050919050565b600061389e601f83613e56565b91506138a982614973565b602082019050919050565b6138bd81614002565b82525050565b6138cc8161401e565b82525050565b6138db8161404c565b82525050565b60006138ed82846134d2565b915081905092915050565b600061390482856134d2565b915061391082846134d2565b91508190509392505050565b6000613928828c6134d2565b9150613934828b6134d2565b9150613940828a6134d2565b915061394c82896134d2565b915061395882886134d2565b915061396482876134d2565b915061397082866134d2565b915061397c82856134d2565b915061398882846134d2565b91508190509a9950505050505050505050565b60006139a782846134d2565b91506139b282613503565b915081905092915050565b60006139c882613526565b91506139d482856134d2565b91506139df8261386e565b91506139eb82846134d2565b91506139f682613710565b91508190509392505050565b6000613a0d82613805565b9150613a1982846134d2565b915081905092915050565b6000602082019050613a396000830184613442565b92915050565b6000608082019050613a546000830187613442565b613a616020830186613442565b613a6e60408301856138d2565b8181036060830152613a808184613460565b905095945050505050565b6000602082019050613aa06000830184613451565b92915050565b60006020820190508181036000830152613ac08184613499565b905092915050565b60006020820190508181036000830152613ae181613549565b9050919050565b60006020820190508181036000830152613b018161356c565b9050919050565b60006020820190508181036000830152613b218161358f565b9050919050565b60006020820190508181036000830152613b41816135b2565b9050919050565b60006020820190508181036000830152613b61816135d5565b9050919050565b60006020820190508181036000830152613b81816135f8565b9050919050565b60006020820190508181036000830152613ba18161361b565b9050919050565b60006020820190508181036000830152613bc18161363e565b9050919050565b60006020820190508181036000830152613be181613661565b9050919050565b60006020820190508181036000830152613c0181613684565b9050919050565b60006020820190508181036000830152613c21816136a7565b9050919050565b60006020820190508181036000830152613c41816136ca565b9050919050565b60006020820190508181036000830152613c61816136ed565b9050919050565b60006020820190508181036000830152613c8181613733565b9050919050565b60006020820190508181036000830152613ca181613756565b9050919050565b60006020820190508181036000830152613cc181613779565b9050919050565b60006020820190508181036000830152613ce18161379c565b9050919050565b60006020820190508181036000830152613d01816137bf565b9050919050565b60006020820190508181036000830152613d21816137e2565b9050919050565b60006020820190508181036000830152613d4181613828565b9050919050565b60006020820190508181036000830152613d618161384b565b9050919050565b60006020820190508181036000830152613d8181613891565b9050919050565b6000602082019050613d9d60008301846138b4565b92915050565b6000602082019050613db860008301846138c3565b92915050565b6000602082019050613dd360008301846138d2565b92915050565b6000613de3613df4565b9050613def82826140ca565b919050565b6000604051905090565b600067ffffffffffffffff821115613e1957613e1861428b565b5b613e22826142d8565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613e7d8261404c565b9150613e888361404c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ebd57613ebc6141a0565b5b828201905092915050565b6000613ed382614002565b9150613ede83614002565b925082613eee57613eed6141cf565b5b828204905092915050565b6000613f048261404c565b9150613f0f8361404c565b925082613f1f57613f1e6141cf565b5b828204905092915050565b6000613f358261404c565b9150613f408361404c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f7957613f786141a0565b5b828202905092915050565b6000613f8f8261404c565b9150613f9a8361404c565b925082821015613fad57613fac6141a0565b5b828203905092915050565b6000613fc38261402c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614083578082015181840152602081019050614068565b83811115614092576000848401525b50505050565b600060028204905060018216806140b057607f821691505b602082108114156140c4576140c36141fe565b5b50919050565b6140d3826142d8565b810181811067ffffffffffffffff821117156140f2576140f161428b565b5b80604052505050565b60006141068261401e565b915061ffff82141561411b5761411a6141a0565b5b600182019050919050565b60006141318261404c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614164576141636141a0565b5b600182019050919050565b600061417a8261404c565b91506141858361404c565b925082614195576141946141cf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f3000000000000000000000000000000000000000000000000000000000000000600082015250565b7f7b226e616d65223a2022446563696d616c732023000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f45786365656473204d41585f4e46545f535550504c5900000000000000000000600082015250565b7f596f75206d6179206e6f7420627579206d6f7265207468616e2033204e46547360008201527f206174206f6e6365000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f6e756d6265724f664e667473206d757374206265206d6f7265207468616e2030600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f222c20226465736372697074696f6e223a2022446563696d616c732063616e2060008201527f626520616e797468696e672e222c2022696d616765223a2022646174613a696d60208201527f6167652f7376672b786d6c3b6261736536342c00000000000000000000000000604082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6149a581613fb8565b81146149b057600080fd5b50565b6149bc81613fca565b81146149c757600080fd5b50565b6149d381613fd6565b81146149de57600080fd5b50565b6149ea8161404c565b81146149f557600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d223332302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223230302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223234302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d22302030203335302033353022207374796c653d226261636b67726f756e642d636f6c6f723a313165653131223e3c7374796c653e2e62617365207b666f6e742d73697a653a20323070783b7d3c2f7374796c653e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d223238302220636c6173733d2262617365223ea264697066735822122072495aba3f587feaeae619986fadc98e69fd1f7212c5910960f604e9423d1a9e64736f6c63430008070033

Deployed Bytecode Sourcemap

51452:6067:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33652:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51615:55;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20784:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22343:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21866:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52341:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34292:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23233:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33960:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23643:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52469:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34482:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20478:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51825:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20208:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41361:94;;;:::i;:::-;;51953:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52597:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40710:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52729:121;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20953:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52211:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56000:574;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22636:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56582:329;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51572:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23899:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53710:2282;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23002:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41610:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52083:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33652:224;33754:4;33793:35;33778:50;;;:11;:50;;;;:90;;;;33832:36;33856:11;33832:23;:36::i;:::-;33778:90;33771:97;;33652:224;;;:::o;51615:55::-;51651:19;51615:55;:::o;20784:100::-;20838:13;20871:5;20864:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20784:100;:::o;22343:221::-;22419:7;22447:16;22455:7;22447;:16::i;:::-;22439:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22532:15;:24;22548:7;22532:24;;;;;;;;;;;;;;;;;;;;;22525:31;;22343:221;;;:::o;21866:411::-;21947:13;21963:23;21978:7;21963:14;:23::i;:::-;21947:39;;22011:5;22005:11;;:2;:11;;;;21997:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22105:5;22089:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22114:37;22131:5;22138:12;:10;:12::i;:::-;22114:16;:37::i;:::-;22089:62;22067:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22248:21;22257:2;22261:7;22248:8;:21::i;:::-;21936:341;21866:411;;:::o;52341:120::-;52397:13;52430:23;52436:7;52430:23;;;;;;;;;;;;;;;;;:5;:23::i;:::-;52423:30;;52341:120;;;:::o;34292:113::-;34353:7;34380:10;:17;;;;34373:24;;34292:113;:::o;23233:339::-;23428:41;23447:12;:10;:12::i;:::-;23461:7;23428:18;:41::i;:::-;23420:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23536:28;23546:4;23552:2;23556:7;23536:9;:28::i;:::-;23233:339;;;:::o;33960:256::-;34057:7;34093:23;34110:5;34093:16;:23::i;:::-;34085:5;:31;34077:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34182:12;:19;34195:5;34182:19;;;;;;;;;;;;;;;:26;34202:5;34182:26;;;;;;;;;;;;34175:33;;33960:256;;;;:::o;23643:185::-;23781:39;23798:4;23804:2;23808:7;23781:39;;;;;;;;;;;;:16;:39::i;:::-;23643:185;;;:::o;52469:120::-;52525:13;52558:23;52564:7;52558:23;;;;;;;;;;;;;;;;;:5;:23::i;:::-;52551:30;;52469:120;;;:::o;34482:233::-;34557:7;34593:30;:28;:30::i;:::-;34585:5;:38;34577:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;34690:10;34701:5;34690:17;;;;;;;;:::i;:::-;;;;;;;;;;34683:24;;34482:233;;;:::o;20478:239::-;20550:7;20570:13;20586:7;:16;20594:7;20586:16;;;;;;;;;;;;;;;;;;;;;20570:32;;20638:1;20621:19;;:5;:19;;;;20613:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20704:5;20697:12;;;20478:239;;;:::o;51825:120::-;51881:13;51914:23;51920:7;51914:23;;;;;;;;;;;;;;;;;:5;:23::i;:::-;51907:30;;51825:120;;;:::o;20208:208::-;20280:7;20325:1;20308:19;;:5;:19;;;;20300:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20392:9;:16;20402:5;20392:16;;;;;;;;;;;;;;;;20385:23;;20208:208;;;:::o;41361:94::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41426:21:::1;41444:1;41426:9;:21::i;:::-;41361:94::o:0;51953:122::-;52010:13;52043:24;52049:7;52043:24;;;;;;;;;;;;;;;;;:5;:24::i;:::-;52036:31;;51953:122;;;:::o;52597:124::-;52655:13;52688:25;52694:7;52688:25;;;;;;;;;;;;;;;;;:5;:25::i;:::-;52681:32;;52597:124;;;:::o;40710:87::-;40756:7;40783:6;;;;;;;;;;;40776:13;;40710:87;:::o;52729:121::-;52785:13;52818:24;52824:7;52818:24;;;;;;;;;;;;;;;;;:5;:24::i;:::-;52811:31;;52729:121;;;:::o;20953:104::-;21009:13;21042:7;21035:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20953:104;:::o;52211:122::-;52268:13;52301:24;52307:7;52301:24;;;;;;;;;;;;;;;;;:5;:24::i;:::-;52294:31;;52211:122;;;:::o;56000:574::-;50507:1;51103:7;;:19;;51095:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;50507:1;51236:7;:18;;;;56090:1:::1;56075:12;:16;56067:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;56163:1;56147:12;:17;;56139:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;56311:4;56228:79;56241:12;56255:51;56268:13;:11;:13::i;:::-;56282:23;;;;;;;;;;;56255:51;;:12;:51::i;:::-;56228:12;:79::i;:::-;:87;;56220:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;56360:6;56355:212;56376:12;56372:1;:16;56355:212;;;56410:14;56427:51;56440:13;:11;:13::i;:::-;56454:23;;;;;;;;;;;56427:51;;:12;:51::i;:::-;56410:68;;56493:34;56503:12;:10;:12::i;:::-;56517:9;56493;:34::i;:::-;56542:13;:11;:13::i;:::-;;56395:172;56390:3;;;;;:::i;:::-;;;;56355:212;;;;50463:1:::0;51415:7;:22;;;;56000:574;:::o;22636:295::-;22751:12;:10;:12::i;:::-;22739:24;;:8;:24;;;;22731:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22851:8;22806:18;:32;22825:12;:10;:12::i;:::-;22806:32;;;;;;;;;;;;;;;:42;22839:8;22806:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;22904:8;22875:48;;22890:12;:10;:12::i;:::-;22875:48;;;22914:8;22875:48;;;;;;:::i;:::-;;;;;;;;22636:295;;:::o;56582:329::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56675:9:::1;56670:234;56694:8;;:15;;56690:1;:19;56670:234;;;56753:4;56739:8;;56748:1;56739:11;;;;;;;:::i;:::-;;;;;;;;:18;:41;;;;;56775:5;56761:8;;56770:1;56761:11;;;;;;;:::i;:::-;;;;;;;;:19;56739:41;56731:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;56816:23;;:25;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;56856:36;56866:12;:10;:12::i;:::-;56880:8;;56889:1;56880:11;;;;;;;:::i;:::-;;;;;;;;56856:9;:36::i;:::-;56711:3;;;;;:::i;:::-;;;;56670:234;;;;56582:329:::0;;:::o;51572:36::-;;;;;;;;;;;;;:::o;23899:328::-;24074:41;24093:12;:10;:12::i;:::-;24107:7;24074:18;:41::i;:::-;24066:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24180:39;24194:4;24200:2;24204:7;24213:5;24180:13;:39::i;:::-;23899:328;;;;:::o;53710:2282::-;53775:13;53801:23;;:::i;:::-;53835:215;;;;;;;;;;;;;;;;;:5;53841:1;53835:8;;;;;;;:::i;:::-;;;;;:215;;;;54074:17;54083:7;54074:8;:17::i;:::-;54063:5;54069:1;54063:8;;;;;;;:::i;:::-;;;;;:28;;;;54102:53;;;;;;;;;;;;;;;;;:5;54108:1;54102:8;;;;;;;:::i;:::-;;;;;:53;;;;54179:18;54189:7;54179:9;:18::i;:::-;54168:5;54174:1;54168:8;;;;;;;:::i;:::-;;;;;:29;;;;54208:54;;;;;;;;;;;;;;;;;:5;54214:1;54208:8;;;;;;;:::i;:::-;;;;;:54;;;;54286:17;54295:7;54286:8;:17::i;:::-;54275:5;54281:1;54275:8;;;;;;;:::i;:::-;;;;;:28;;;;54314:54;;;;;;;;;;;;;;;;;:5;54320:1;54314:8;;;;;;;:::i;:::-;;;;;:54;;;;54392:18;54402:7;54392:9;:18::i;:::-;54381:5;54387:1;54381:8;;;;;;;:::i;:::-;;;;;:29;;;;54421:54;;;;;;;;;;;;;;;;;:5;54427:1;54421:8;;;;;;;:::i;:::-;;;;;:54;;;;54499:17;54508:7;54499:8;:17::i;:::-;54488:5;54494:1;54488:8;;;;;;;:::i;:::-;;;;;:28;;;;54527:55;;;;;;;;;;;;;;;;;:5;54533:2;54527:9;;;;;;;:::i;:::-;;;;;:55;;;;54607:17;54616:7;54607:8;:17::i;:::-;54595:5;54601:2;54595:9;;;;;;;:::i;:::-;;;;;:29;;;;54635:55;;;;;;;;;;;;;;;;;:5;54641:2;54635:9;;;;;;;:::i;:::-;;;;;:55;;;;54715:19;54726:7;54715:10;:19::i;:::-;54703:5;54709:2;54703:9;;;;;;;:::i;:::-;;;;;:31;;;;54745:55;;;;;;;;;;;;;;;;;:5;54751:2;54745:9;;;;;;;:::i;:::-;;;;;:55;;;;54825:17;54834:7;54825:8;:17::i;:::-;54813:5;54819:2;54813:9;;;;;;;:::i;:::-;;;;;:29;;;;54853:27;;;;;;;;;;;;;;;;;:5;54859:2;54853:9;;;;;;;:::i;:::-;;;;;:27;;;;54893:20;54954:5;54960:1;54954:8;;;;;;;:::i;:::-;;;;;;54964:5;54970:1;54964:8;;;;;;;:::i;:::-;;;;;;54974:5;54980:1;54974:8;;;;;;;:::i;:::-;;;;;;54984:5;54990:1;54984:8;;;;;;;:::i;:::-;;;;;;54994:5;55000:1;54994:8;;;;;;;:::i;:::-;;;;;;55004:5;55010:1;55004:8;;;;;;;:::i;:::-;;;;;;55014:5;55020:1;55014:8;;;;;;;:::i;:::-;;;;;;55024:5;55030:1;55024:8;;;;;;;:::i;:::-;;;;;;55034:5;55040:1;55034:8;;;;;;;:::i;:::-;;;;;;54937:106;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54893:161;;55130:6;55155:5;55161:1;55155:8;;;;;;;:::i;:::-;;;;;;55182:5;55188:2;55182:9;;;;;;;:::i;:::-;;;;;;55210:5;55216:2;55210:9;;;;;;;:::i;:::-;;;;;;55238:5;55244:2;55238:9;;;;;;;:::i;:::-;;;;;;55266:5;55272:2;55266:9;;;;;;;:::i;:::-;;;;;;55294:5;55300:2;55294:9;;;;;;;:::i;:::-;;;;;;55322:5;55328:2;55322:9;;;;;;;:::i;:::-;;;;;;55350:5;55356:2;55350:9;;;;;;;:::i;:::-;;;;;;55095:279;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55065:320;;55398:18;55419:456;55592:17;55601:7;55592:8;:17::i;:::-;55748:28;55768:6;55748:13;:28::i;:::-;55500:330;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55419:13;:456::i;:::-;55398:477;;55952:4;55902:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;55886:72;;55978:6;55971:13;;;;;53710:2282;;;:::o;23002:164::-;23099:4;23123:18;:25;23142:5;23123:25;;;;;;;;;;;;;;;:35;23149:8;23123:35;;;;;;;;;;;;;;;;;;;;;;;;;23116:42;;23002:164;;;;:::o;41610:192::-;40941:12;:10;:12::i;:::-;40930:23;;:7;:5;:7::i;:::-;:23;;;40922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41719:1:::1;41699:22;;:8;:22;;;;41691:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41775:19;41785:8;41775:9;:19::i;:::-;41610:192:::0;:::o;52083:120::-;52139:13;52172:23;52178:7;52172:23;;;;;;;;;;;;;;;;;:5;:23::i;:::-;52165:30;;52083:120;;;:::o;19839:305::-;19941:4;19993:25;19978:40;;;:11;:40;;;;:105;;;;20050:33;20035:48;;;:11;:48;;;;19978:105;:158;;;;20100:36;20124:11;20100:23;:36::i;:::-;19978:158;19958:178;;19839:305;;;:::o;25737:127::-;25802:4;25854:1;25826:30;;:7;:16;25834:7;25826:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25819:37;;25737:127;;;:::o;600:98::-;653:7;680:10;673:17;;600:98;:::o;29719:174::-;29821:2;29794:15;:24;29810:7;29794:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29877:7;29873:2;29839:46;;29848:23;29863:7;29848:14;:23::i;:::-;29839:46;;;;;;;;;;;;29719:174;;:::o;52858:844::-;52938:13;52964:12;52979:62;53010:9;53021:17;53030:7;53021:8;:17::i;:::-;52993:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52979:6;:62::i;:::-;52964:77;;53052:12;53074:2;53067:4;:9;;;;:::i;:::-;53052:24;;53087:13;51651:19;53103:16;;:4;:16;;;;:::i;:::-;53087:32;;53144:2;53136:4;:10;53132:239;;53175:2;53167:4;:10;53163:197;;;53206:55;53219:5;53226:34;53251:5;51651:19;53239:17;;;;;;:::i;:::-;53258:1;53226:12;:34::i;:::-;53206:12;:55::i;:::-;53198:63;;53163:197;;;53310:34;53335:5;51651:19;53323:17;;;;;;:::i;:::-;53342:1;53310:12;:34::i;:::-;53302:42;;53163:197;53132:239;53383:15;53413:2;51651:19;53401:14;;;;:::i;:::-;53383:32;;;;53426:20;:27;;;;;;;;;;;;;;;;;;;53464:164;53502:1;53471:28;53484:5;53491:7;53471:12;:28::i;:::-;:32;53464:164;;;53530:25;53543:7;53552:2;53530:12;:25::i;:::-;53520:35;;53603:6;53586:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;53570:46;;53464:164;;;53669:6;53677:15;53686:5;53677:8;:15::i;:::-;53652:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53638:56;;;;;;;52858:844;;;;:::o;26031:348::-;26124:4;26149:16;26157:7;26149;:16::i;:::-;26141:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26225:13;26241:23;26256:7;26241:14;:23::i;:::-;26225:39;;26294:5;26283:16;;:7;:16;;;:51;;;;26327:7;26303:31;;:20;26315:7;26303:11;:20::i;:::-;:31;;;26283:51;:87;;;;26338:32;26355:5;26362:7;26338:16;:32::i;:::-;26283:87;26275:96;;;26031:348;;;;:::o;29023:578::-;29182:4;29155:31;;:23;29170:7;29155:14;:23::i;:::-;:31;;;29147:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29265:1;29251:16;;:2;:16;;;;29243:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29321:39;29342:4;29348:2;29352:7;29321:20;:39::i;:::-;29425:29;29442:1;29446:7;29425:8;:29::i;:::-;29486:1;29467:9;:15;29477:4;29467:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29515:1;29498:9;:13;29508:2;29498:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29546:2;29527:7;:16;29535:7;29527:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29585:7;29581:2;29566:27;;29575:4;29566:27;;;;;;;;;;;;29023:578;;;:::o;41810:173::-;41866:16;41885:6;;;;;;;;;;;41866:25;;41911:8;41902:6;;:17;;;;;;;;;;;;;;;;;;41966:8;41935:40;;41956:8;41935:40;;;;;;;;;;;;41855:128;41810:173;:::o;45072:98::-;45130:7;45161:1;45157;:5;;;;:::i;:::-;45150:12;;45072:98;;;;:::o;44691:::-;44749:7;44780:1;44776;:5;;;;:::i;:::-;44769:12;;44691:98;;;;:::o;26721:110::-;26797:26;26807:2;26811:7;26797:26;;;;;;;;;;;;:9;:26::i;:::-;26721:110;;:::o;25109:315::-;25266:28;25276:4;25282:2;25286:7;25266:9;:28::i;:::-;25313:48;25336:4;25342:2;25346:7;25355:5;25313:22;:48::i;:::-;25305:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25109:315;;;;:::o;56919:532::-;56975:13;57014:1;57005:5;:10;57001:53;;;57032:10;;;;;;;;;;;;;;;;;;;;;57001:53;57064:12;57079:5;57064:20;;57095:14;57120:78;57135:1;57127:4;:9;57120:78;;57153:8;;;;;:::i;:::-;;;;57184:2;57176:10;;;;;:::i;:::-;;;57120:78;;;57208:19;57240:6;57230:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57208:39;;57258:154;57274:1;57265:5;:10;57258:154;;57302:1;57292:11;;;;;:::i;:::-;;;57369:2;57361:5;:10;;;;:::i;:::-;57348:2;:24;;;;:::i;:::-;57335:39;;57318:6;57325;57318:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;57398:2;57389:11;;;;;:::i;:::-;;;57258:154;;;57436:6;57422:21;;;;;56919:532;;;;:::o;57870:1607::-;57928:13;57954:11;57968:4;:11;57954:25;;58001:1;57994:3;:8;57990:23;;;58004:9;;;;;;;;;;;;;;;;;57990:23;58065:18;58103:1;58098;58092:3;:7;;;;:::i;:::-;58091:13;;;;:::i;:::-;58086:1;:19;;;;:::i;:::-;58065:40;;58163:19;58208:2;58195:10;:15;;;;:::i;:::-;58185:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58163:48;;58224:18;58245:5;;;;;;;;;;;;;;;;;58224:26;;58314:1;58307:5;58303:13;58359:2;58351:6;58347:15;58410:1;58378:777;58433:3;58430:1;58427:10;58378:777;;;58488:1;58485;58481:9;58476:14;;58546:8;58541:1;58535:4;58531:12;58525:19;58521:34;58626:4;58618:5;58614:2;58610:14;58606:25;58596:8;58592:40;58586:47;58665:3;58662:1;58658:11;58651:18;;58756:4;58747;58739:5;58735:2;58731:14;58727:25;58717:8;58713:40;58707:47;58703:58;58698:3;58694:68;58687:75;;58794:3;58791:1;58787:11;58780:18;;58884:4;58875;58867:5;58864:1;58860:13;58856:24;58846:8;58842:39;58836:46;58832:57;58827:3;58823:67;58816:74;;58922:3;58919:1;58915:11;58908:18;;59004:4;58995;58988:5;58984:16;58974:8;58970:31;58964:38;58960:49;58955:3;58951:59;58944:66;;59044:3;59039;59035:13;59028:20;;59086:3;59075:9;59068:22;59138:1;59127:9;59123:17;59110:30;;58457:698;;58378:777;;;58382:44;59187:1;59182:3;59178:11;59208:1;59203:84;;;;59306:1;59301:82;;;;59171:212;;59203:84;59264:6;59259:3;59255:16;59251:1;59240:9;59236:17;59229:43;59203:84;;59301:82;59362:4;59357:3;59353:14;59349:1;59338:9;59334:17;59327:41;59171:212;;59414:10;59406:6;59399:26;58272:1164;;59462:6;59448:21;;;;;;57870:1607;;;;:::o;3124:157::-;3209:4;3248:25;3233:40;;;:11;:40;;;;3226:47;;3124:157;;;:::o;51679:138::-;51739:7;51801:5;51784:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;51774:34;;;;;;51766:43;;51759:50;;51679:138;;;:::o;45828:98::-;45886:7;45917:1;45913;:5;;;;:::i;:::-;45906:12;;45828:98;;;;:::o;35328:589::-;35472:45;35499:4;35505:2;35509:7;35472:26;:45::i;:::-;35550:1;35534:18;;:4;:18;;;35530:187;;;35569:40;35601:7;35569:31;:40::i;:::-;35530:187;;;35639:2;35631:10;;:4;:10;;;35627:90;;35658:47;35691:4;35697:7;35658:32;:47::i;:::-;35627:90;35530:187;35745:1;35731:16;;:2;:16;;;35727:183;;;35764:45;35801:7;35764:36;:45::i;:::-;35727:183;;;35837:4;35831:10;;:2;:10;;;35827:83;;35858:40;35886:2;35890:7;35858:27;:40::i;:::-;35827:83;35727:183;35328:589;;;:::o;27058:321::-;27188:18;27194:2;27198:7;27188:5;:18::i;:::-;27239:54;27270:1;27274:2;27278:7;27287:5;27239:22;:54::i;:::-;27217:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27058:321;;;:::o;30458:799::-;30613:4;30634:15;:2;:13;;;:15::i;:::-;30630:620;;;30686:2;30670:36;;;30707:12;:10;:12::i;:::-;30721:4;30727:7;30736:5;30670:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30666:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30929:1;30912:6;:13;:18;30908:272;;;30955:60;;;;;;;;;;:::i;:::-;;;;;;;;30908:272;31130:6;31124:13;31115:6;31111:2;31107:15;31100:38;30666:529;30803:41;;;30793:51;;;:6;:51;;;;30786:58;;;;;30630:620;31234:4;31227:11;;30458:799;;;;;;;:::o;31829:126::-;;;;:::o;36640:164::-;36744:10;:17;;;;36717:15;:24;36733:7;36717:24;;;;;;;;;;;:44;;;;36772:10;36788:7;36772:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36640:164;:::o;37431:988::-;37697:22;37747:1;37722:22;37739:4;37722:16;:22::i;:::-;:26;;;;:::i;:::-;37697:51;;37759:18;37780:17;:26;37798:7;37780:26;;;;;;;;;;;;37759:47;;37927:14;37913:10;:28;37909:328;;37958:19;37980:12;:18;37993:4;37980:18;;;;;;;;;;;;;;;:34;37999:14;37980:34;;;;;;;;;;;;37958:56;;38064:11;38031:12;:18;38044:4;38031:18;;;;;;;;;;;;;;;:30;38050:10;38031:30;;;;;;;;;;;:44;;;;38181:10;38148:17;:30;38166:11;38148:30;;;;;;;;;;;:43;;;;37943:294;37909:328;38333:17;:26;38351:7;38333:26;;;;;;;;;;;38326:33;;;38377:12;:18;38390:4;38377:18;;;;;;;;;;;;;;;:34;38396:14;38377:34;;;;;;;;;;;38370:41;;;37512:907;;37431:988;;:::o;38714:1079::-;38967:22;39012:1;38992:10;:17;;;;:21;;;;:::i;:::-;38967:46;;39024:18;39045:15;:24;39061:7;39045:24;;;;;;;;;;;;39024:45;;39396:19;39418:10;39429:14;39418:26;;;;;;;;:::i;:::-;;;;;;;;;;39396:48;;39482:11;39457:10;39468;39457:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;39593:10;39562:15;:28;39578:11;39562:28;;;;;;;;;;;:41;;;;39734:15;:24;39750:7;39734:24;;;;;;;;;;;39727:31;;;39769:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38785:1008;;;38714:1079;:::o;36218:221::-;36303:14;36320:20;36337:2;36320:16;:20::i;:::-;36303:37;;36378:7;36351:12;:16;36364:2;36351:16;;;;;;;;;;;;;;;:24;36368:6;36351:24;;;;;;;;;;;:34;;;;36425:6;36396:17;:26;36414:7;36396:26;;;;;;;;;;;:35;;;;36292:147;36218:221;;:::o;27715:382::-;27809:1;27795:16;;:2;:16;;;;27787:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27868:16;27876:7;27868;:16::i;:::-;27867:17;27859:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27930:45;27959:1;27963:2;27967:7;27930:20;:45::i;:::-;28005:1;27988:9;:13;27998:2;27988:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28036:2;28017:7;:16;28025:7;28017:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28081:7;28077:2;28056:33;;28073:1;28056:33;;;;;;;;;;;;27715:382;;:::o;9296:387::-;9356:4;9564:12;9631:7;9619:20;9611:28;;9674:1;9667:4;:8;9660:15;;;9296:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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;1159:133::-;1202:5;1240:6;1227:20;1218:29;;1256:30;1280:5;1256:30;:::i;:::-;1159:133;;;;:::o;1298:137::-;1343:5;1381:6;1368:20;1359:29;;1397:32;1423:5;1397:32;:::i;:::-;1298:137;;;;:::o;1441:141::-;1497:5;1528:6;1522:13;1513:22;;1544:32;1570:5;1544:32;:::i;:::-;1441:141;;;;:::o;1601:338::-;1656:5;1705:3;1698:4;1690:6;1686:17;1682:27;1672:122;;1713:79;;:::i;:::-;1672:122;1830:6;1817:20;1855:78;1929:3;1921:6;1914:4;1906:6;1902:17;1855:78;:::i;:::-;1846:87;;1662:277;1601:338;;;;:::o;1945:139::-;1991:5;2029:6;2016:20;2007:29;;2045:33;2072:5;2045:33;:::i;:::-;1945:139;;;;:::o;2090:329::-;2149:6;2198:2;2186:9;2177:7;2173:23;2169:32;2166:119;;;2204:79;;:::i;:::-;2166:119;2324:1;2349:53;2394:7;2385:6;2374:9;2370:22;2349:53;:::i;:::-;2339:63;;2295:117;2090:329;;;;:::o;2425:474::-;2493:6;2501;2550:2;2538:9;2529:7;2525:23;2521:32;2518:119;;;2556:79;;:::i;:::-;2518:119;2676:1;2701:53;2746:7;2737:6;2726:9;2722:22;2701:53;:::i;:::-;2691:63;;2647:117;2803:2;2829:53;2874:7;2865:6;2854:9;2850:22;2829:53;:::i;:::-;2819:63;;2774:118;2425:474;;;;;:::o;2905:619::-;2982:6;2990;2998;3047:2;3035:9;3026:7;3022:23;3018:32;3015:119;;;3053:79;;:::i;:::-;3015:119;3173:1;3198:53;3243:7;3234:6;3223:9;3219:22;3198:53;:::i;:::-;3188:63;;3144:117;3300:2;3326:53;3371:7;3362:6;3351:9;3347:22;3326:53;:::i;:::-;3316:63;;3271:118;3428:2;3454:53;3499:7;3490:6;3479:9;3475:22;3454:53;:::i;:::-;3444:63;;3399:118;2905:619;;;;;:::o;3530:943::-;3625:6;3633;3641;3649;3698:3;3686:9;3677:7;3673:23;3669:33;3666:120;;;3705:79;;:::i;:::-;3666:120;3825:1;3850:53;3895:7;3886:6;3875:9;3871:22;3850:53;:::i;:::-;3840:63;;3796:117;3952:2;3978:53;4023:7;4014:6;4003:9;3999:22;3978:53;:::i;:::-;3968:63;;3923:118;4080:2;4106:53;4151:7;4142:6;4131:9;4127:22;4106:53;:::i;:::-;4096:63;;4051:118;4236:2;4225:9;4221:18;4208:32;4267:18;4259:6;4256:30;4253:117;;;4289:79;;:::i;:::-;4253:117;4394:62;4448:7;4439:6;4428:9;4424:22;4394:62;:::i;:::-;4384:72;;4179:287;3530:943;;;;;;;:::o;4479:468::-;4544:6;4552;4601:2;4589:9;4580:7;4576:23;4572:32;4569:119;;;4607:79;;:::i;:::-;4569:119;4727:1;4752:53;4797:7;4788:6;4777:9;4773:22;4752:53;:::i;:::-;4742:63;;4698:117;4854:2;4880:50;4922:7;4913:6;4902:9;4898:22;4880:50;:::i;:::-;4870:60;;4825:115;4479:468;;;;;:::o;4953:474::-;5021:6;5029;5078:2;5066:9;5057:7;5053:23;5049:32;5046:119;;;5084:79;;:::i;:::-;5046:119;5204:1;5229:53;5274:7;5265:6;5254:9;5250:22;5229:53;:::i;:::-;5219:63;;5175:117;5331:2;5357:53;5402:7;5393:6;5382:9;5378:22;5357:53;:::i;:::-;5347:63;;5302:118;4953:474;;;;;:::o;5433:559::-;5519:6;5527;5576:2;5564:9;5555:7;5551:23;5547:32;5544:119;;;5582:79;;:::i;:::-;5544:119;5730:1;5719:9;5715:17;5702:31;5760:18;5752:6;5749:30;5746:117;;;5782:79;;:::i;:::-;5746:117;5895:80;5967:7;5958:6;5947:9;5943:22;5895:80;:::i;:::-;5877:98;;;;5673:312;5433:559;;;;;:::o;5998:327::-;6056:6;6105:2;6093:9;6084:7;6080:23;6076:32;6073:119;;;6111:79;;:::i;:::-;6073:119;6231:1;6256:52;6300:7;6291:6;6280:9;6276:22;6256:52;:::i;:::-;6246:62;;6202:116;5998:327;;;;:::o;6331:349::-;6400:6;6449:2;6437:9;6428:7;6424:23;6420:32;6417:119;;;6455:79;;:::i;:::-;6417:119;6575:1;6600:63;6655:7;6646:6;6635:9;6631:22;6600:63;:::i;:::-;6590:73;;6546:127;6331:349;;;;:::o;6686:329::-;6745:6;6794:2;6782:9;6773:7;6769:23;6765:32;6762:119;;;6800:79;;:::i;:::-;6762:119;6920:1;6945:53;6990:7;6981:6;6970:9;6966:22;6945:53;:::i;:::-;6935:63;;6891:117;6686:329;;;;:::o;7021:118::-;7108:24;7126:5;7108:24;:::i;:::-;7103:3;7096:37;7021:118;;:::o;7145:109::-;7226:21;7241:5;7226:21;:::i;:::-;7221:3;7214:34;7145:109;;:::o;7260:360::-;7346:3;7374:38;7406:5;7374:38;:::i;:::-;7428:70;7491:6;7486:3;7428:70;:::i;:::-;7421:77;;7507:52;7552:6;7547:3;7540:4;7533:5;7529:16;7507:52;:::i;:::-;7584:29;7606:6;7584:29;:::i;:::-;7579:3;7575:39;7568:46;;7350:270;7260:360;;;;:::o;7626:364::-;7714:3;7742:39;7775:5;7742:39;:::i;:::-;7797:71;7861:6;7856:3;7797:71;:::i;:::-;7790:78;;7877:52;7922:6;7917:3;7910:4;7903:5;7899:16;7877:52;:::i;:::-;7954:29;7976:6;7954:29;:::i;:::-;7949:3;7945:39;7938:46;;7718:272;7626:364;;;;:::o;7996:377::-;8102:3;8130:39;8163:5;8130:39;:::i;:::-;8185:89;8267:6;8262:3;8185:89;:::i;:::-;8178:96;;8283:52;8328:6;8323:3;8316:4;8309:5;8305:16;8283:52;:::i;:::-;8360:6;8355:3;8351:16;8344:23;;8106:267;7996:377;;;;:::o;8379:400::-;8539:3;8560:84;8642:1;8637:3;8560:84;:::i;:::-;8553:91;;8653:93;8742:3;8653:93;:::i;:::-;8771:1;8766:3;8762:11;8755:18;;8379:400;;;:::o;8785:402::-;8945:3;8966:85;9048:2;9043:3;8966:85;:::i;:::-;8959:92;;9060:93;9149:3;9060:93;:::i;:::-;9178:2;9173:3;9169:12;9162:19;;8785:402;;;:::o;9193:366::-;9335:3;9356:67;9420:2;9415:3;9356:67;:::i;:::-;9349:74;;9432:93;9521:3;9432:93;:::i;:::-;9550:2;9545:3;9541:12;9534:19;;9193:366;;;:::o;9565:::-;9707:3;9728:67;9792:2;9787:3;9728:67;:::i;:::-;9721:74;;9804:93;9893:3;9804:93;:::i;:::-;9922:2;9917:3;9913:12;9906:19;;9565:366;;;:::o;9937:::-;10079:3;10100:67;10164:2;10159:3;10100:67;:::i;:::-;10093:74;;10176:93;10265:3;10176:93;:::i;:::-;10294:2;10289:3;10285:12;10278:19;;9937:366;;;:::o;10309:::-;10451:3;10472:67;10536:2;10531:3;10472:67;:::i;:::-;10465:74;;10548:93;10637:3;10548:93;:::i;:::-;10666:2;10661:3;10657:12;10650:19;;10309:366;;;:::o;10681:::-;10823:3;10844:67;10908:2;10903:3;10844:67;:::i;:::-;10837:74;;10920:93;11009:3;10920:93;:::i;:::-;11038:2;11033:3;11029:12;11022:19;;10681:366;;;:::o;11053:::-;11195:3;11216:67;11280:2;11275:3;11216:67;:::i;:::-;11209:74;;11292:93;11381:3;11292:93;:::i;:::-;11410:2;11405:3;11401:12;11394:19;;11053:366;;;:::o;11425:::-;11567:3;11588:67;11652:2;11647:3;11588:67;:::i;:::-;11581:74;;11664:93;11753:3;11664:93;:::i;:::-;11782:2;11777:3;11773:12;11766:19;;11425:366;;;:::o;11797:::-;11939:3;11960:67;12024:2;12019:3;11960:67;:::i;:::-;11953:74;;12036:93;12125:3;12036:93;:::i;:::-;12154:2;12149:3;12145:12;12138:19;;11797:366;;;:::o;12169:::-;12311:3;12332:67;12396:2;12391:3;12332:67;:::i;:::-;12325:74;;12408:93;12497:3;12408:93;:::i;:::-;12526:2;12521:3;12517:12;12510:19;;12169:366;;;:::o;12541:::-;12683:3;12704:67;12768:2;12763:3;12704:67;:::i;:::-;12697:74;;12780:93;12869:3;12780:93;:::i;:::-;12898:2;12893:3;12889:12;12882:19;;12541:366;;;:::o;12913:::-;13055:3;13076:67;13140:2;13135:3;13076:67;:::i;:::-;13069:74;;13152:93;13241:3;13152:93;:::i;:::-;13270:2;13265:3;13261:12;13254:19;;12913:366;;;:::o;13285:::-;13427:3;13448:67;13512:2;13507:3;13448:67;:::i;:::-;13441:74;;13524:93;13613:3;13524:93;:::i;:::-;13642:2;13637:3;13633:12;13626:19;;13285:366;;;:::o;13657:::-;13799:3;13820:67;13884:2;13879:3;13820:67;:::i;:::-;13813:74;;13896:93;13985:3;13896:93;:::i;:::-;14014:2;14009:3;14005:12;13998:19;;13657:366;;;:::o;14029:400::-;14189:3;14210:84;14292:1;14287:3;14210:84;:::i;:::-;14203:91;;14303:93;14392:3;14303:93;:::i;:::-;14421:1;14416:3;14412:11;14405:18;;14029:400;;;:::o;14435:366::-;14577:3;14598:67;14662:2;14657:3;14598:67;:::i;:::-;14591:74;;14674:93;14763:3;14674:93;:::i;:::-;14792:2;14787:3;14783:12;14776:19;;14435:366;;;:::o;14807:::-;14949:3;14970:67;15034:2;15029:3;14970:67;:::i;:::-;14963:74;;15046:93;15135:3;15046:93;:::i;:::-;15164:2;15159:3;15155:12;15148:19;;14807:366;;;:::o;15179:::-;15321:3;15342:67;15406:2;15401:3;15342:67;:::i;:::-;15335:74;;15418:93;15507:3;15418:93;:::i;:::-;15536:2;15531:3;15527:12;15520:19;;15179:366;;;:::o;15551:::-;15693:3;15714:67;15778:2;15773:3;15714:67;:::i;:::-;15707:74;;15790:93;15879:3;15790:93;:::i;:::-;15908:2;15903:3;15899:12;15892:19;;15551:366;;;:::o;15923:::-;16065:3;16086:67;16150:2;16145:3;16086:67;:::i;:::-;16079:74;;16162:93;16251:3;16162:93;:::i;:::-;16280:2;16275:3;16271:12;16264:19;;15923:366;;;:::o;16295:::-;16437:3;16458:67;16522:2;16517:3;16458:67;:::i;:::-;16451:74;;16534:93;16623:3;16534:93;:::i;:::-;16652:2;16647:3;16643:12;16636:19;;16295:366;;;:::o;16667:402::-;16827:3;16848:85;16930:2;16925:3;16848:85;:::i;:::-;16841:92;;16942:93;17031:3;16942:93;:::i;:::-;17060:2;17055:3;17051:12;17044:19;;16667:402;;;:::o;17075:366::-;17217:3;17238:67;17302:2;17297:3;17238:67;:::i;:::-;17231:74;;17314:93;17403:3;17314:93;:::i;:::-;17432:2;17427:3;17423:12;17416:19;;17075:366;;;:::o;17447:::-;17589:3;17610:67;17674:2;17669:3;17610:67;:::i;:::-;17603:74;;17686:93;17775:3;17686:93;:::i;:::-;17804:2;17799:3;17795:12;17788:19;;17447:366;;;:::o;17819:402::-;17979:3;18000:85;18082:2;18077:3;18000:85;:::i;:::-;17993:92;;18094:93;18183:3;18094:93;:::i;:::-;18212:2;18207:3;18203:12;18196:19;;17819:402;;;:::o;18227:366::-;18369:3;18390:67;18454:2;18449:3;18390:67;:::i;:::-;18383:74;;18466:93;18555:3;18466:93;:::i;:::-;18584:2;18579:3;18575:12;18568:19;;18227:366;;;:::o;18599:118::-;18686:24;18704:5;18686:24;:::i;:::-;18681:3;18674:37;18599:118;;:::o;18723:115::-;18808:23;18825:5;18808:23;:::i;:::-;18803:3;18796:36;18723:115;;:::o;18844:118::-;18931:24;18949:5;18931:24;:::i;:::-;18926:3;18919:37;18844:118;;:::o;18968:275::-;19100:3;19122:95;19213:3;19204:6;19122:95;:::i;:::-;19115:102;;19234:3;19227:10;;18968:275;;;;:::o;19249:435::-;19429:3;19451:95;19542:3;19533:6;19451:95;:::i;:::-;19444:102;;19563:95;19654:3;19645:6;19563:95;:::i;:::-;19556:102;;19675:3;19668:10;;19249:435;;;;;:::o;19690:1555::-;20206:3;20228:95;20319:3;20310:6;20228:95;:::i;:::-;20221:102;;20340:95;20431:3;20422:6;20340:95;:::i;:::-;20333:102;;20452:95;20543:3;20534:6;20452:95;:::i;:::-;20445:102;;20564:95;20655:3;20646:6;20564:95;:::i;:::-;20557:102;;20676:95;20767:3;20758:6;20676:95;:::i;:::-;20669:102;;20788:95;20879:3;20870:6;20788:95;:::i;:::-;20781:102;;20900:95;20991:3;20982:6;20900:95;:::i;:::-;20893:102;;21012:95;21103:3;21094:6;21012:95;:::i;:::-;21005:102;;21124:95;21215:3;21206:6;21124:95;:::i;:::-;21117:102;;21236:3;21229:10;;19690:1555;;;;;;;;;;;;:::o;21251:541::-;21484:3;21506:95;21597:3;21588:6;21506:95;:::i;:::-;21499:102;;21618:148;21762:3;21618:148;:::i;:::-;21611:155;;21783:3;21776:10;;21251:541;;;;:::o;21798:1233::-;22281:3;22303:148;22447:3;22303:148;:::i;:::-;22296:155;;22468:95;22559:3;22550:6;22468:95;:::i;:::-;22461:102;;22580:148;22724:3;22580:148;:::i;:::-;22573:155;;22745:95;22836:3;22827:6;22745:95;:::i;:::-;22738:102;;22857:148;23001:3;22857:148;:::i;:::-;22850:155;;23022:3;23015:10;;21798:1233;;;;;:::o;23037:541::-;23270:3;23292:148;23436:3;23292:148;:::i;:::-;23285:155;;23457:95;23548:3;23539:6;23457:95;:::i;:::-;23450:102;;23569:3;23562:10;;23037:541;;;;:::o;23584:222::-;23677:4;23715:2;23704:9;23700:18;23692:26;;23728:71;23796:1;23785:9;23781:17;23772:6;23728:71;:::i;:::-;23584:222;;;;:::o;23812:640::-;24007:4;24045:3;24034:9;24030:19;24022:27;;24059:71;24127:1;24116:9;24112:17;24103:6;24059:71;:::i;:::-;24140:72;24208:2;24197:9;24193:18;24184:6;24140:72;:::i;:::-;24222;24290:2;24279:9;24275:18;24266:6;24222:72;:::i;:::-;24341:9;24335:4;24331:20;24326:2;24315:9;24311:18;24304:48;24369:76;24440:4;24431:6;24369:76;:::i;:::-;24361:84;;23812:640;;;;;;;:::o;24458:210::-;24545:4;24583:2;24572:9;24568:18;24560:26;;24596:65;24658:1;24647:9;24643:17;24634:6;24596:65;:::i;:::-;24458:210;;;;:::o;24674:313::-;24787:4;24825:2;24814:9;24810:18;24802:26;;24874:9;24868:4;24864:20;24860:1;24849:9;24845:17;24838:47;24902:78;24975:4;24966:6;24902:78;:::i;:::-;24894:86;;24674:313;;;;:::o;24993:419::-;25159:4;25197:2;25186:9;25182:18;25174:26;;25246:9;25240:4;25236:20;25232:1;25221:9;25217:17;25210:47;25274:131;25400:4;25274:131;:::i;:::-;25266:139;;24993:419;;;:::o;25418:::-;25584:4;25622:2;25611:9;25607:18;25599:26;;25671:9;25665:4;25661:20;25657:1;25646:9;25642:17;25635:47;25699:131;25825:4;25699:131;:::i;:::-;25691:139;;25418:419;;;:::o;25843:::-;26009:4;26047:2;26036:9;26032:18;26024:26;;26096:9;26090:4;26086:20;26082:1;26071:9;26067:17;26060:47;26124:131;26250:4;26124:131;:::i;:::-;26116:139;;25843:419;;;:::o;26268:::-;26434:4;26472:2;26461:9;26457:18;26449:26;;26521:9;26515:4;26511:20;26507:1;26496:9;26492:17;26485:47;26549:131;26675:4;26549:131;:::i;:::-;26541:139;;26268:419;;;:::o;26693:::-;26859:4;26897:2;26886:9;26882:18;26874:26;;26946:9;26940:4;26936:20;26932:1;26921:9;26917:17;26910:47;26974:131;27100:4;26974:131;:::i;:::-;26966:139;;26693:419;;;:::o;27118:::-;27284:4;27322:2;27311:9;27307:18;27299:26;;27371:9;27365:4;27361:20;27357:1;27346:9;27342:17;27335:47;27399:131;27525:4;27399:131;:::i;:::-;27391:139;;27118:419;;;:::o;27543:::-;27709:4;27747:2;27736:9;27732:18;27724:26;;27796:9;27790:4;27786:20;27782:1;27771:9;27767:17;27760:47;27824:131;27950:4;27824:131;:::i;:::-;27816:139;;27543:419;;;:::o;27968:::-;28134:4;28172:2;28161:9;28157:18;28149:26;;28221:9;28215:4;28211:20;28207:1;28196:9;28192:17;28185:47;28249:131;28375:4;28249:131;:::i;:::-;28241:139;;27968:419;;;:::o;28393:::-;28559:4;28597:2;28586:9;28582:18;28574:26;;28646:9;28640:4;28636:20;28632:1;28621:9;28617:17;28610:47;28674:131;28800:4;28674:131;:::i;:::-;28666:139;;28393:419;;;:::o;28818:::-;28984:4;29022:2;29011:9;29007:18;28999:26;;29071:9;29065:4;29061:20;29057:1;29046:9;29042:17;29035:47;29099:131;29225:4;29099:131;:::i;:::-;29091:139;;28818:419;;;:::o;29243:::-;29409:4;29447:2;29436:9;29432:18;29424:26;;29496:9;29490:4;29486:20;29482:1;29471:9;29467:17;29460:47;29524:131;29650:4;29524:131;:::i;:::-;29516:139;;29243:419;;;:::o;29668:::-;29834:4;29872:2;29861:9;29857:18;29849:26;;29921:9;29915:4;29911:20;29907:1;29896:9;29892:17;29885:47;29949:131;30075:4;29949:131;:::i;:::-;29941:139;;29668:419;;;:::o;30093:::-;30259:4;30297:2;30286:9;30282:18;30274:26;;30346:9;30340:4;30336:20;30332:1;30321:9;30317:17;30310:47;30374:131;30500:4;30374:131;:::i;:::-;30366:139;;30093:419;;;:::o;30518:::-;30684:4;30722:2;30711:9;30707:18;30699:26;;30771:9;30765:4;30761:20;30757:1;30746:9;30742:17;30735:47;30799:131;30925:4;30799:131;:::i;:::-;30791:139;;30518:419;;;:::o;30943:::-;31109:4;31147:2;31136:9;31132:18;31124:26;;31196:9;31190:4;31186:20;31182:1;31171:9;31167:17;31160:47;31224:131;31350:4;31224:131;:::i;:::-;31216:139;;30943:419;;;:::o;31368:::-;31534:4;31572:2;31561:9;31557:18;31549:26;;31621:9;31615:4;31611:20;31607:1;31596:9;31592:17;31585:47;31649:131;31775:4;31649:131;:::i;:::-;31641:139;;31368:419;;;:::o;31793:::-;31959:4;31997:2;31986:9;31982:18;31974:26;;32046:9;32040:4;32036:20;32032:1;32021:9;32017:17;32010:47;32074:131;32200:4;32074:131;:::i;:::-;32066:139;;31793:419;;;:::o;32218:::-;32384:4;32422:2;32411:9;32407:18;32399:26;;32471:9;32465:4;32461:20;32457:1;32446:9;32442:17;32435:47;32499:131;32625:4;32499:131;:::i;:::-;32491:139;;32218:419;;;:::o;32643:::-;32809:4;32847:2;32836:9;32832:18;32824:26;;32896:9;32890:4;32886:20;32882:1;32871:9;32867:17;32860:47;32924:131;33050:4;32924:131;:::i;:::-;32916:139;;32643:419;;;:::o;33068:::-;33234:4;33272:2;33261:9;33257:18;33249:26;;33321:9;33315:4;33311:20;33307:1;33296:9;33292:17;33285:47;33349:131;33475:4;33349:131;:::i;:::-;33341:139;;33068:419;;;:::o;33493:::-;33659:4;33697:2;33686:9;33682:18;33674:26;;33746:9;33740:4;33736:20;33732:1;33721:9;33717:17;33710:47;33774:131;33900:4;33774:131;:::i;:::-;33766:139;;33493:419;;;:::o;33918:::-;34084:4;34122:2;34111:9;34107:18;34099:26;;34171:9;34165:4;34161:20;34157:1;34146:9;34142:17;34135:47;34199:131;34325:4;34199:131;:::i;:::-;34191:139;;33918:419;;;:::o;34343:222::-;34436:4;34474:2;34463:9;34459:18;34451:26;;34487:71;34555:1;34544:9;34540:17;34531:6;34487:71;:::i;:::-;34343:222;;;;:::o;34571:218::-;34662:4;34700:2;34689:9;34685:18;34677:26;;34713:69;34779:1;34768:9;34764:17;34755:6;34713:69;:::i;:::-;34571:218;;;;:::o;34795:222::-;34888:4;34926:2;34915:9;34911:18;34903:26;;34939:71;35007:1;34996:9;34992:17;34983:6;34939:71;:::i;:::-;34795:222;;;;:::o;35023:129::-;35057:6;35084:20;;:::i;:::-;35074:30;;35113:33;35141:4;35133:6;35113:33;:::i;:::-;35023:129;;;:::o;35158:75::-;35191:6;35224:2;35218:9;35208:19;;35158:75;:::o;35239:307::-;35300:4;35390:18;35382:6;35379:30;35376:56;;;35412:18;;:::i;:::-;35376:56;35450:29;35472:6;35450:29;:::i;:::-;35442:37;;35534:4;35528;35524:15;35516:23;;35239:307;;;:::o;35552:98::-;35603:6;35637:5;35631:12;35621:22;;35552:98;;;:::o;35656:99::-;35708:6;35742:5;35736:12;35726:22;;35656:99;;;:::o;35761:168::-;35844:11;35878:6;35873:3;35866:19;35918:4;35913:3;35909:14;35894:29;;35761:168;;;;:::o;35935:169::-;36019:11;36053:6;36048:3;36041:19;36093:4;36088:3;36084:14;36069:29;;35935:169;;;;:::o;36110:148::-;36212:11;36249:3;36234:18;;36110:148;;;;:::o;36264:305::-;36304:3;36323:20;36341:1;36323:20;:::i;:::-;36318:25;;36357:20;36375:1;36357:20;:::i;:::-;36352:25;;36511:1;36443:66;36439:74;36436:1;36433:81;36430:107;;;36517:18;;:::i;:::-;36430:107;36561:1;36558;36554:9;36547:16;;36264:305;;;;:::o;36575:185::-;36615:1;36632:20;36650:1;36632:20;:::i;:::-;36627:25;;36666:20;36684:1;36666:20;:::i;:::-;36661:25;;36705:1;36695:35;;36710:18;;:::i;:::-;36695:35;36752:1;36749;36745:9;36740:14;;36575:185;;;;:::o;36766:::-;36806:1;36823:20;36841:1;36823:20;:::i;:::-;36818:25;;36857:20;36875:1;36857:20;:::i;:::-;36852:25;;36896:1;36886:35;;36901:18;;:::i;:::-;36886:35;36943:1;36940;36936:9;36931:14;;36766:185;;;;:::o;36957:348::-;36997:7;37020:20;37038:1;37020:20;:::i;:::-;37015:25;;37054:20;37072:1;37054:20;:::i;:::-;37049:25;;37242:1;37174:66;37170:74;37167:1;37164:81;37159:1;37152:9;37145:17;37141:105;37138:131;;;37249:18;;:::i;:::-;37138:131;37297:1;37294;37290:9;37279:20;;36957:348;;;;:::o;37311:191::-;37351:4;37371:20;37389:1;37371:20;:::i;:::-;37366:25;;37405:20;37423:1;37405:20;:::i;:::-;37400:25;;37444:1;37441;37438:8;37435:34;;;37449:18;;:::i;:::-;37435:34;37494:1;37491;37487:9;37479:17;;37311:191;;;;:::o;37508:96::-;37545:7;37574:24;37592:5;37574:24;:::i;:::-;37563:35;;37508:96;;;:::o;37610:90::-;37644:7;37687:5;37680:13;37673:21;37662:32;;37610:90;;;:::o;37706:149::-;37742:7;37782:66;37775:5;37771:78;37760:89;;37706:149;;;:::o;37861:118::-;37898:7;37938:34;37931:5;37927:46;37916:57;;37861:118;;;:::o;37985:89::-;38021:7;38061:6;38054:5;38050:18;38039:29;;37985:89;;;:::o;38080:126::-;38117:7;38157:42;38150:5;38146:54;38135:65;;38080:126;;;:::o;38212:77::-;38249:7;38278:5;38267:16;;38212:77;;;:::o;38295:154::-;38379:6;38374:3;38369;38356:30;38441:1;38432:6;38427:3;38423:16;38416:27;38295:154;;;:::o;38455:307::-;38523:1;38533:113;38547:6;38544:1;38541:13;38533:113;;;38632:1;38627:3;38623:11;38617:18;38613:1;38608:3;38604:11;38597:39;38569:2;38566:1;38562:10;38557:15;;38533:113;;;38664:6;38661:1;38658:13;38655:101;;;38744:1;38735:6;38730:3;38726:16;38719:27;38655:101;38504:258;38455:307;;;:::o;38768:320::-;38812:6;38849:1;38843:4;38839:12;38829:22;;38896:1;38890:4;38886:12;38917:18;38907:81;;38973:4;38965:6;38961:17;38951:27;;38907:81;39035:2;39027:6;39024:14;39004:18;39001:38;38998:84;;;39054:18;;:::i;:::-;38998:84;38819:269;38768:320;;;:::o;39094:281::-;39177:27;39199:4;39177:27;:::i;:::-;39169:6;39165:40;39307:6;39295:10;39292:22;39271:18;39259:10;39256:34;39253:62;39250:88;;;39318:18;;:::i;:::-;39250:88;39358:10;39354:2;39347:22;39137:238;39094:281;;:::o;39381:171::-;39419:3;39442:23;39459:5;39442:23;:::i;:::-;39433:32;;39487:6;39480:5;39477:17;39474:43;;;39497:18;;:::i;:::-;39474:43;39544:1;39537:5;39533:13;39526:20;;39381:171;;;:::o;39558:233::-;39597:3;39620:24;39638:5;39620:24;:::i;:::-;39611:33;;39666:66;39659:5;39656:77;39653:103;;;39736:18;;:::i;:::-;39653:103;39783:1;39776:5;39772:13;39765:20;;39558:233;;;:::o;39797:176::-;39829:1;39846:20;39864:1;39846:20;:::i;:::-;39841:25;;39880:20;39898:1;39880:20;:::i;:::-;39875:25;;39919:1;39909:35;;39924:18;;:::i;:::-;39909:35;39965:1;39962;39958:9;39953:14;;39797:176;;;;:::o;39979:180::-;40027:77;40024:1;40017:88;40124:4;40121:1;40114:15;40148:4;40145:1;40138:15;40165:180;40213:77;40210:1;40203:88;40310:4;40307:1;40300:15;40334:4;40331:1;40324:15;40351:180;40399:77;40396:1;40389:88;40496:4;40493:1;40486:15;40520:4;40517:1;40510:15;40537:180;40585:77;40582:1;40575:88;40682:4;40679:1;40672:15;40706:4;40703:1;40696:15;40723:180;40771:77;40768:1;40761:88;40868:4;40865:1;40858:15;40892:4;40889:1;40882:15;40909:180;40957:77;40954:1;40947:88;41054:4;41051:1;41044:15;41078:4;41075:1;41068:15;41095:117;41204:1;41201;41194:12;41218:117;41327:1;41324;41317:12;41341:117;41450:1;41447;41440:12;41464:117;41573:1;41570;41563:12;41587:117;41696:1;41693;41686:12;41710:117;41819:1;41816;41809:12;41833:102;41874:6;41925:2;41921:7;41916:2;41909:5;41905:14;41901:28;41891:38;;41833:102;;;:::o;41941:151::-;42081:3;42077:1;42069:6;42065:14;42058:27;41941:151;:::o;42098:214::-;42238:66;42234:1;42226:6;42222:14;42215:90;42098:214;:::o;42318:230::-;42458:34;42454:1;42446:6;42442:14;42435:58;42527:13;42522:2;42514:6;42510:15;42503:38;42318:230;:::o;42554:237::-;42694:34;42690:1;42682:6;42678:14;42671:58;42763:20;42758:2;42750:6;42746:15;42739:45;42554:237;:::o;42797:225::-;42937:34;42933:1;42925:6;42921:14;42914:58;43006:8;43001:2;42993:6;42989:15;42982:33;42797:225;:::o;43028:178::-;43168:30;43164:1;43156:6;43152:14;43145:54;43028:178;:::o;43212:172::-;43352:24;43348:1;43340:6;43336:14;43329:48;43212:172;:::o;43390:227::-;43530:34;43526:1;43518:6;43514:14;43507:58;43599:10;43594:2;43586:6;43582:15;43575:35;43390:227;:::o;43623:223::-;43763:34;43759:1;43751:6;43747:14;43740:58;43832:6;43827:2;43819:6;43815:15;43808:31;43623:223;:::o;43852:175::-;43992:27;43988:1;43980:6;43976:14;43969:51;43852:175;:::o;44033:182::-;44173:34;44169:1;44161:6;44157:14;44150:58;44033:182;:::o;44221:231::-;44361:34;44357:1;44349:6;44345:14;44338:58;44430:14;44425:2;44417:6;44413:15;44406:39;44221:231;:::o;44458:243::-;44598:34;44594:1;44586:6;44582:14;44575:58;44667:26;44662:2;44654:6;44650:15;44643:51;44458:243;:::o;44707:229::-;44847:34;44843:1;44835:6;44831:14;44824:58;44916:12;44911:2;44903:6;44899:15;44892:37;44707:229;:::o;44942:228::-;45082:34;45078:1;45070:6;45066:14;45059:58;45151:11;45146:2;45138:6;45134:15;45127:36;44942:228;:::o;45176:214::-;45316:66;45312:1;45304:6;45300:14;45293:90;45176:214;:::o;45396:182::-;45536:34;45532:1;45524:6;45520:14;45513:58;45396:182;:::o;45584:231::-;45724:34;45720:1;45712:6;45708:14;45701:58;45793:14;45788:2;45780:6;45776:15;45769:39;45584:231;:::o;45821:182::-;45961:34;45957:1;45949:6;45945:14;45938:58;45821:182;:::o;46009:166::-;46149:18;46145:1;46137:6;46133:14;46126:42;46009:166;:::o;46181:228::-;46321:34;46317:1;46309:6;46305:14;46298:58;46390:11;46385:2;46377:6;46373:15;46366:36;46181:228;:::o;46415:220::-;46555:34;46551:1;46543:6;46539:14;46532:58;46624:3;46619:2;46611:6;46607:15;46600:28;46415:220;:::o;46641:179::-;46781:31;46777:1;46769:6;46765:14;46758:55;46641:179;:::o;46826:236::-;46966:34;46962:1;46954:6;46950:14;46943:58;47035:19;47030:2;47022:6;47018:15;47011:44;46826:236;:::o;47068:231::-;47208:34;47204:1;47196:6;47192:14;47185:58;47277:14;47272:2;47264:6;47260:15;47253:39;47068:231;:::o;47305:371::-;47445:66;47441:1;47433:6;47429:14;47422:90;47546:66;47541:2;47533:6;47529:15;47522:91;47647:21;47642:2;47634:6;47630:15;47623:46;47305:371;:::o;47682:181::-;47822:33;47818:1;47810:6;47806:14;47799:57;47682:181;:::o;47869:122::-;47942:24;47960:5;47942:24;:::i;:::-;47935:5;47932:35;47922:63;;47981:1;47978;47971:12;47922:63;47869:122;:::o;47997:116::-;48067:21;48082:5;48067:21;:::i;:::-;48060:5;48057:32;48047:60;;48103:1;48100;48093:12;48047:60;47997:116;:::o;48119:120::-;48191:23;48208:5;48191:23;:::i;:::-;48184:5;48181:34;48171:62;;48229:1;48226;48219:12;48171:62;48119:120;:::o;48245:122::-;48318:24;48336:5;48318:24;:::i;:::-;48311:5;48308:35;48298:63;;48357:1;48354;48347:12;48298:63;48245:122;:::o

Swarm Source

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