ETH Price: $3,695.92 (+1.16%)

Token

ERC-20: Shroomates (SHROOM)
 

Overview

Max Total Supply

7,777 SHROOM

Holders

831

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
13 SHROOM
0xac417ad8e646a696b250b51767026924522f208c
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:
Shroomates

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-19
*/

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: ERC721A.sol



pragma solidity ^0.8.0;









/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
    Context,
    ERC165,
    IERC721,
    IERC721Metadata,
    IERC721Enumerable
{
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 private currentIndex = 0;

    uint256 internal immutable collectionSize;
    uint256 internal immutable maxBatchSize;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) private _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // 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
     * `maxBatchSize` refers to how much a minter can mint at a time.
     * `collectionSize_` refers to how many tokens are in the collection.
     */
    constructor(
        string memory name_,
        string memory symbol_,
        uint256 maxBatchSize_,
        uint256 collectionSize_
    ) {
        require(
            collectionSize_ > 0,
            "ERC721A: collection must have a nonzero supply"
        );
        require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
        _name = name_;
        _symbol = symbol_;
        maxBatchSize = maxBatchSize_;
        collectionSize = collectionSize_;
    }

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

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert("ERC721A: unable to get token of owner by index");
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(
            owner != address(0),
            "ERC721A: number minted query for the zero address"
        );
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

        uint256 lowestTokenToCheck;
        if (tokenId >= maxBatchSize) {
            lowestTokenToCheck = tokenId - maxBatchSize + 1;
        }

        for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }

        revert("ERC721A: unable to determine the owner of token");
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @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(), ".json"))
                : "";
    }

    /**
     * @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 override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, "ERC721A: approval to current owner");

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        override
    {
        require(operator != _msgSender(), "ERC721A: 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 {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721A: 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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, "");
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - there must be `quantity` tokens remaining unminted in the total collection.
     * - `to` cannot be the zero address.
     * - `quantity` cannot be larger than the max batch size.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), "ERC721A: mint to the zero address");
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), "ERC721A: token already minted");
        require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            require(
                _checkOnERC721Received(address(0), to, updatedIndex, _data),
                "ERC721A: transfer to non ERC721Receiver implementer"
            );
            updatedIndex++;
        }

        currentIndex = updatedIndex;
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(
            isApprovedOrOwner,
            "ERC721A: transfer caller is not owner nor approved"
        );

        require(
            prevOwnership.addr == from,
            "ERC721A: transfer from incorrect owner"
        );
        require(to != address(0), "ERC721A: transfer to the zero address");

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        _addressData[from].balance -= 1;
        _addressData[to].balance += 1;
        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(
                    prevOwnership.addr,
                    prevOwnership.startTimestamp
                );
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

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

    uint256 public nextOwnerToExplicitlySet = 0;

    /**
     * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
     */
    function _setOwnersExplicit(uint256 quantity) internal {
        uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
        require(quantity > 0, "quantity must be nonzero");
        uint256 endIndex = oldNextOwnerToSet + quantity - 1;
        if (endIndex > collectionSize - 1) {
            endIndex = collectionSize - 1;
        }
        // We know if the last one in the group exists, all in the group exist, due to serial ordering.
        require(_exists(endIndex), "not enough minted yet for this cleanup");
        for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
            if (_ownerships[i].addr == address(0)) {
                TokenOwnership memory ownership = ownershipOf(i);
                _ownerships[i] = TokenOwnership(
                    ownership.addr,
                    ownership.startTimestamp
                );
            }
        }
        nextOwnerToExplicitlySet = endIndex + 1;
    }

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}
// File: Shroomates.sol



pragma solidity ^0.8.0;

//@@@@@@@*..,@@@@@@@@@@@@@@@@@@....*.@@@@@@@@**@*@@@@@@@@@@@@..*@@,,@(..@@@@@@
//@&..............@@@@......@@@......@%@@@@@.........@@@@@@@..............@@@@
//@@......#.......@%@@@....../@......@%@@@@@.........@@@@@@@*......@@%....@%@@
//@@,,,,,@@&@@@@@@@@@@@.@#...........@%@@@@....@.%@..@%@@@@@@.....@@@@...@@%@@
//@@*&***@%@(***,,@@@@@,,,,,,,,,,,,,@@%@@@#,@,,@@@,@,,@@@@@@@,*,*********%@&@@
//@@/(%///@@@/////@@@@@@///&////****@@@@@@/*////*/////@@&@@@@///////////@@@@@@
//@@/&///////////&@&@@@//////@#////(@@@@@/////@#(/@/////@@@@@/@////@//////@@@@
//@@@@(//////////@@%@@@%//////@@@///@@@@@//%///(@@@/////#@@@@////@@@@/////@@@@
//@@@@@@/&@@#/@@@%@@@@@@@@@@/@%@@@/@@@%@@@@&@@@&%@@@@(@@&%@@@@///@@@@@//@@%@@@
//@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@(@%@@@@@@@@@%@@@@@@&@&@@@@@@@@%@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@(.......@@@@@@@@@@@....%...*@@@@@@@...........@@@@**@@...........@@@@
//@@@@(..%...@@@@@@@@@@@.........@@@@@@@@@.....@.....@@@*,@@...........@@@@
//@@@@..,....*@@@@@@@@@@@...@.(.*.@&@@@@@@....#@....(.@@@,@(.....@@.(.%@@@@
//@@@@%,,,,,,@@@@@@@@@@@,,,,@@@@,,,@@@@@@@,,,,,,,,,,,*@@**@%,,..,.,,,@@&@@@
//@@@@*******@%@@@@@@@@***(**/****(**&@@@@****@/@&&****@@@@@@@@&/,,,,,,@@@@
//@@@@@(@////(/&@/@@@@@////**%*******@@@@@@***#@@*&***%@@@@@@@@@@****%*@&@@
//@@@@%/////@/////(@&@%/////(@@@//////@@@@///////////@#@@@@///////////@@%@@
//@@@@//%@(//////@@%@@@@@#//@@%@@/#@/@@@@@//@%/(/@@@/@%@/@@///////&@/@@&@@@
//@@@@@@@@@@@@@@//@@@@@@@@/@%@@@@@@/@@@@@@@@@@@@/(%@@@@@/,@%/@@@//@@%@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@/@%@@@@@@@@@@@@@@@@@@@@@@@@
//%%%%%%%%%%%%%%%&%%%%&&&&&&%%&&&&&&&&&&&&%&&&&&&&&%&&&&&&%&%&&&&&&&&&&&&&&&%&&&%%
//%&%%%%%%%%%%%%%%%%%%&%%%%&&%&%@@&@@%&&&&&&&&&&%%%%%%%%&%%&&&&&&&&&&&&&&%%%%%%&&%
//%%%%%%%%%%%%%%%%%%%%%%@@@%   &@@@@@     @@@@ .&&%%%&&%%%%%&&%&&&%&%%&%%&%%%%&%%&
//%%%%%%%%%%%%%%%%%%,    @@@/   *@@@@@     @@@#   @.   @&&%%&%&%%%&%%%%%%%%%%&&%%%
//%%%%%%%%%%%%%%& &@@. ...@@@@....@@@@@.     .@   @@.   @@@.&&%%&%%&&%&&&&&&&%%%%%
//%%%%%%%%%%%%@@@&.(@@.....@@@@@....@@@@,........  .@.  .@@@. %%&&%&%%&&&&&&%%%%%%
//%%%%%%&%%%&  ,@@@@@@*.....@@@@@(...#@@@@@#.........@#  &@@@   (%&&&%&%%%%%%%%%%%
//%%%%%%%%%&. ...@@@@@@....,*@@@@@@*...#@@@@@@@.......,#. @@@@    @@%%%%%%%%%%%%%%
//%%%%%%%%%@@,.....@@@%%%%&%%%&%%%%&%%%%@&@@@@@@@@(........@@@.   #@@&%%%%%%%%%%%%
//&&&&&%%%%@@@,....@&%%%&%%%%%%%%%%%%%%%%%%%%@@@@@@@@&......@@@    @@& #%%%%%%%%%%
//%%%%%%%%%@@@@,..,%&%%%%&%%%%%&%&%%&%%&%%%%&%%&%@@@@@@@....%@@,.  @@&  &%%%%%%%%%
//&&%%%%%%%&@@@@...@&%%%%%%&%&%%&%%%&%%%%%%%%&%%%%%&@@@@@#..*@@...,@@    @%%%%%%%%
//%&%&%%%%%%%@@@@...@&%&%&%&*&%%*&%&%%%%%@%&%%%%%%%%%&&@@@@..@#...@@    @@@%%%%%%%
//%%%%%%%%%%%%@@@,....%&%&%/ #%%%,,,,,,*,/,&%&%%%%&%%%%%@@@@.@*..@..  *@@@ @%%%%%%
//%%%%%%%%%%%%%%@(......&&*%&/,,,,  (  ,,,,((,%%%%&&%%%%&%(@@@&......@@@  @@%%%%%%
//%%%%%%%%%%%%%%%%(....@&*&%,,,,,,(&&/,*#/  //%&(@%%&&%%%%%@@@@*....@@   @@@%%%%%%
//*#%&&%%%%%%%%%%%%%%,..,@%(,,,,,@@@@*.#/ %//,#./%%%%%%%%%%%#@@@...(@@  @@,%%%%%%%
//#/****/**%%%%%%%%%%%%%( *.(,,,,,(%(@@*/////,&,@&&%%&&%%%%%&.@@@..(@@ /@. @%%%%%%
//////*****///%&%%%%%%.%@%*,,,,,,,,,***////,,&&&&&%&%&&%%%%%%.,@@@.,@% &@ @%%%%%%%
//////********//////&,,   ,,,,,,,,&/*.&&%/,&%%/%%&&&&%&&%&%&(..%@@,.@,  /%%%%%%%%%
///////%***///***/(,,,,,,,,,,,,,,,***////,% .&@@.@@@@@@@@@@@&...@@/.@  %%%%%%%%%%%
///////**#**%%***%,,,%.#&&/,,,,,,***#    *%%%&*@@.*@@/...,@@@#..%@& .%%%%%%%%%%%%%
//((/////*(///**,,,,,, (&&,,,,,/  .&. %@%@&  .&%%%%%%&@#. .@@@. #%%%%%%%%%%%%%%%%%
//(***////**.@&,#,,,,,,,%..*,*/%@##. . ,.@%%****/******&%%%%%%%%%%%%%&#**(&/*&&&#*
///********/%/@*%.,,.&,,#* (,,,/@@**///*,//%/(*******%**/*&%%%%%%&%***//**////////
/////******@.%&@/,,.%*,,,,,*%#,***/////*,///(********///////*****************(/***
//&#//**********/(./*,,,,/@&,,,**//////,,**//////////////*****************//(((/**
///**/////////*****&#& #,,,,,,*//(////,,&***/*///////*********//////***////(((///*
//***//****(((//****    &,,/*& %@*  @,,&********//*******(#**//********//(((((//**
//***/*****/((((/%(*****/&#&/*%@@%@ %,**********//*******//*************/((((//***
///*******/(((((((//*******(,,,,*,&%//#%********////((////**************(((*******
///******//((((((((((///******///////(//#//((////////******************/((********




interface IGnarCoin {
    function burn(address _from, uint256 _amount) external;

    function updateReward(address _from, address _to) external;
}

contract Shroomates is ERC721A, Ownable, ReentrancyGuard {
    using Strings for uint256;
    using Address for address;

    string private baseURI;
    uint256 public maxSupply = 7777;
    uint256 public maxBuyable = 7700;
    uint256 public immutable maxPerAddressDuringMint;
    uint256 public price;

    uint256 public buffer;

    mapping(address => uint256) public genBalance;
    struct ShroomData {
        string name;
    }

    modifier ShroomOwner(uint256 ShroomId) {
        require(
            ownerOf(ShroomId) == msg.sender,
            "Cannot interact with a ShroomMate you do not own"
        );
        _;
    }

    IGnarCoin public GnarCoin;

    uint256 public constant NAME_CHANGE_PRICE = 150 ether;

    mapping(uint256 => ShroomData) public shroomData;

    event NameChanged(uint256 ShroomId, string ShroomName);

    constructor(
        string memory name,
        string memory symbol,
        uint256 maxBatchSize_,
        uint256 collectionSize_,
        uint256 mintPrice_
    )
        //double check with gnar on these settings
        ERC721A(name, symbol, maxBatchSize_, collectionSize_)
    {
        maxPerAddressDuringMint = maxBatchSize_;
        price = mintPrice_;
    }

    function changeName(uint256 ShroomId, string memory newName)
        external
        ShroomOwner(ShroomId)
    {
        bytes memory n = bytes(newName);
        require(n.length > 0 && n.length < 25, "Invalid name length");
        require(
            sha256(n) != sha256(bytes(shroomData[ShroomId].name)),
            "New name is same as current name"
        );

        // GnarCoin.burn(msg.sender, NAME_CHANGE_PRICE);
        shroomData[ShroomId].name = newName;
        emit NameChanged(ShroomId, newName);
    }

    function setGnarCoin(address GnarCoinAddress) external onlyOwner {
        GnarCoin = IGnarCoin(GnarCoinAddress);
    }

    function mint(uint256 numberOfMints) public payable {
        uint256 maxSupplyBuff = maxBuyable + buffer;
        require(
            totalSupply() + numberOfMints <= maxSupplyBuff,
            "Purchase would exceed max supply of ShroomMate"
        );
        //this line will make sure the user cannot buy anymore than {maxBatchSize_}
        require(
            numberMinted(msg.sender) + numberOfMints <= maxPerAddressDuringMint,
            "Limit number of mints to an amount set on contract configuration"
        );
        require(
            msg.value >= price * numberOfMints,
            "Ether value sent is below the price"
        );
        _safeMint(msg.sender, numberOfMints);
        genBalance[msg.sender]++;
    }

    function gift(uint256 numberOfMints, address _to) public onlyOwner {
        require(
            totalSupply() + numberOfMints <= maxSupply,
            "Purchase would exceed max supply of ShroomMate"
        );
        buffer++;
        _safeMint(_to, numberOfMints);
        genBalance[msg.sender]++;
    }

    function walletOfOwner(address owner)
        external
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(owner);
        uint256[] memory tokensId = new uint256[](tokenCount);
        for (uint256 i; i < tokenCount; i++) {
            tokensId[i] = tokenOfOwnerByIndex(owner, i);
        }
        return tokensId;
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        if (tokenId < maxSupply) {
            GnarCoin.updateReward(from, to);
            genBalance[from]--;
            genBalance[to]++;
        }
        ERC721A.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public override {
        if (tokenId < maxSupply) {
            GnarCoin.updateReward(from, to);
            genBalance[from]--;
            genBalance[to]++;
        }
        ERC721A.safeTransferFrom(from, to, tokenId, data);
    }

    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    function setPrice(uint256 newPrice) public onlyOwner {
        price = newPrice;
    }

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

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

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"maxBatchSize_","type":"uint256"},{"internalType":"uint256","name":"collectionSize_","type":"uint256"},{"internalType":"uint256","name":"mintPrice_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"ShroomId","type":"uint256"},{"indexed":false,"internalType":"string","name":"ShroomName","type":"string"}],"name":"NameChanged","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":"GnarCoin","outputs":[{"internalType":"contract IGnarCoin","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NAME_CHANGE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buffer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ShroomId","type":"uint256"},{"internalType":"string","name":"newName","type":"string"}],"name":"changeName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"genBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMints","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressDuringMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMints","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"GnarCoinAddress","type":"address"}],"name":"setGnarCoin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"shroomData","outputs":[{"internalType":"string","name":"name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e0604052600080556000600755611e61600b55611e14600c553480156200002657600080fd5b506040516200592d3803806200592d83398181016040528101906200004c91906200036b565b848484846000811162000096576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200008d9062000511565b60405180910390fd5b60008211620000dc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000d390620004ef565b60405180910390fd5b8360019080519060200190620000f492919062000232565b5082600290805190602001906200010d92919062000232565b508160a0818152505080608081815250505050505062000142620001366200016460201b60201c565b6200016c60201b60201c565b60016009819055508260c0818152505080600d81905550505050505062000699565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200024090620005eb565b90600052602060002090601f016020900481019282620002645760008555620002b0565b82601f106200027f57805160ff1916838001178555620002b0565b82800160010185558215620002b0579182015b82811115620002af57825182559160200191906001019062000292565b5b509050620002bf9190620002c3565b5090565b5b80821115620002de576000816000905550600101620002c4565b5090565b6000620002f9620002f38462000567565b62000533565b9050828152602081018484840111156200031257600080fd5b6200031f848285620005b5565b509392505050565b600082601f8301126200033957600080fd5b81516200034b848260208601620002e2565b91505092915050565b60008151905062000365816200067f565b92915050565b600080600080600060a086880312156200038457600080fd5b600086015167ffffffffffffffff8111156200039f57600080fd5b620003ad8882890162000327565b955050602086015167ffffffffffffffff811115620003cb57600080fd5b620003d98882890162000327565b9450506040620003ec8882890162000354565b9350506060620003ff8882890162000354565b9250506080620004128882890162000354565b9150509295509295909350565b60006200042e6027836200059a565b91507f455243373231413a206d61782062617463682073697a65206d7573742062652060008301527f6e6f6e7a65726f000000000000000000000000000000000000000000000000006020830152604082019050919050565b600062000496602e836200059a565b91507f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008301527f6e6f6e7a65726f20737570706c790000000000000000000000000000000000006020830152604082019050919050565b600060208201905081810360008301526200050a816200041f565b9050919050565b600060208201905081810360008301526200052c8162000487565b9050919050565b6000604051905081810181811067ffffffffffffffff821117156200055d576200055c62000650565b5b8060405250919050565b600067ffffffffffffffff82111562000585576200058462000650565b5b601f19601f8301169050602081019050919050565b600082825260208201905092915050565b6000819050919050565b60005b83811015620005d5578082015181840152602081019050620005b8565b83811115620005e5576000848401525b50505050565b600060028204905060018216806200060457607f821691505b602082108114156200061b576200061a62000621565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200068a81620005ab565b81146200069657600080fd5b50565b60805160a05160c051615252620006db6000396000818161171c01526118f10152600081816123340152818161235d0152612fc50152600050506152526000f3fe6080604052600436106102255760003560e01c806383a076be11610123578063b88d4fde116100ab578063d7224ba01161006f578063d7224ba01461081e578063dc33e68114610849578063e985e9c514610886578063edaafe20146108c3578063f2fde38b146108ee57610225565b8063b88d4fde14610739578063c1bb13f714610762578063c39cbef11461078d578063c87b56dd146107b6578063d5abeb01146107f357610225565b806395d89b41116100f257806395d89b4114610673578063a035b1fe1461069e578063a0712d68146106c9578063a22cb465146106e5578063a9fc729d1461070e57610225565b806383a076be146105cb5780638bc35c2f146105f45780638da5cb5b1461061f57806391b7f5ed1461064a57610225565b806342842e0e116101b15780636352211e116101755780636352211e146104d457806370a0823114610511578063715018a61461054e5780637ff768af1461056557806383151727146105a257610225565b806342842e0e146103dd578063438b6300146104065780634f6ccce71461044357806354b6f1611461048057806355f804b3146104ab57610225565b806318160ddd116101f857806318160ddd146102f857806323b872dd146103235780632ea003af1461034c5780632f745c59146103895780633ccfd60b146103c657610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190613994565b610917565b60405161025e9190614847565b60405180910390f35b34801561027357600080fd5b5061027c610a61565b604051610289919061487d565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613a27565b610af3565b6040516102c69190614795565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f1919061392f565b610b78565b005b34801561030457600080fd5b5061030d610c91565b60405161031a9190614bff565b60405180910390f35b34801561032f57600080fd5b5061034a60048036038101906103459190613829565b610c9a565b005b34801561035857600080fd5b50610373600480360381019061036e9190613a27565b610dee565b604051610380919061487d565b60405180910390f35b34801561039557600080fd5b506103b060048036038101906103ab919061392f565b610e94565b6040516103bd9190614bff565b60405180910390f35b3480156103d257600080fd5b506103db611092565b005b3480156103e957600080fd5b5061040460048036038101906103ff9190613829565b61115d565b005b34801561041257600080fd5b5061042d600480360381019061042891906137c4565b61117d565b60405161043a9190614825565b60405180910390f35b34801561044f57600080fd5b5061046a60048036038101906104659190613a27565b611277565b6040516104779190614bff565b60405180910390f35b34801561048c57600080fd5b506104956112ca565b6040516104a29190614bff565b60405180910390f35b3480156104b757600080fd5b506104d260048036038101906104cd91906139e6565b6112d7565b005b3480156104e057600080fd5b506104fb60048036038101906104f69190613a27565b61136d565b6040516105089190614795565b60405180910390f35b34801561051d57600080fd5b50610538600480360381019061053391906137c4565b611383565b6040516105459190614bff565b60405180910390f35b34801561055a57600080fd5b5061056361146c565b005b34801561057157600080fd5b5061058c600480360381019061058791906137c4565b6114f4565b6040516105999190614bff565b60405180910390f35b3480156105ae57600080fd5b506105c960048036038101906105c491906137c4565b61150c565b005b3480156105d757600080fd5b506105f260048036038101906105ed9190613a50565b6115cc565b005b34801561060057600080fd5b5061060961171a565b6040516106169190614bff565b60405180910390f35b34801561062b57600080fd5b5061063461173e565b6040516106419190614795565b60405180910390f35b34801561065657600080fd5b50610671600480360381019061066c9190613a27565b611768565b005b34801561067f57600080fd5b506106886117ee565b604051610695919061487d565b60405180910390f35b3480156106aa57600080fd5b506106b3611880565b6040516106c09190614bff565b60405180910390f35b6106e360048036038101906106de9190613a27565b611886565b005b3480156106f157600080fd5b5061070c600480360381019061070791906138f3565b611a18565b005b34801561071a57600080fd5b50610723611b99565b6040516107309190614bff565b60405180910390f35b34801561074557600080fd5b50610760600480360381019061075b9190613878565b611b9f565b005b34801561076e57600080fd5b50610777611cf5565b6040516107849190614862565b60405180910390f35b34801561079957600080fd5b506107b460048036038101906107af9190613a8c565b611d1b565b005b3480156107c257600080fd5b506107dd60048036038101906107d89190613a27565b611f48565b6040516107ea919061487d565b60405180910390f35b3480156107ff57600080fd5b50610808611fef565b6040516108159190614bff565b60405180910390f35b34801561082a57600080fd5b50610833611ff5565b6040516108409190614bff565b60405180910390f35b34801561085557600080fd5b50610870600480360381019061086b91906137c4565b611ffb565b60405161087d9190614bff565b60405180910390f35b34801561089257600080fd5b506108ad60048036038101906108a891906137ed565b61200d565b6040516108ba9190614847565b60405180910390f35b3480156108cf57600080fd5b506108d86120a1565b6040516108e59190614bff565b60405180910390f35b3480156108fa57600080fd5b50610915600480360381019061091091906137c4565b6120a7565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109e257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a4a57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a5a5750610a598261219f565b5b9050919050565b606060018054610a7090615030565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9c90615030565b8015610ae95780601f10610abe57610100808354040283529160200191610ae9565b820191906000526020600020905b815481529060010190602001808311610acc57829003601f168201915b5050505050905090565b6000610afe82612209565b610b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3490614b9f565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b838261136d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610beb90614adf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c13612216565b73ffffffffffffffffffffffffffffffffffffffff161480610c425750610c4181610c3c612216565b61200d565b5b610c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c789061499f565b60405180910390fd5b610c8c83838361221e565b505050565b60008054905090565b600b54811015610dde57601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d230af3a84846040518363ffffffff1660e01b8152600401610d019291906147b0565b600060405180830381600087803b158015610d1b57600080fd5b505af1158015610d2f573d6000803e3d6000fd5b50505050600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610d8390615006565b9190505550600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610dd890615062565b91905055505b610de98383836122d0565b505050565b6011602052806000526040600020600091509050806000018054610e1190615030565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3d90615030565b8015610e8a5780601f10610e5f57610100808354040283529160200191610e8a565b820191906000526020600020905b815481529060010190602001808311610e6d57829003601f168201915b5050505050905081565b6000610e9f83611383565b8210610ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed79061489f565b60405180910390fd5b6000610eea610c91565b905060008060005b83811015611050576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610fe457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561103c578684141561102d57819550505050505061108c565b838061103890615062565b9450505b50808061104890615062565b915050610ef2565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108390614b5f565b60405180910390fd5b92915050565b61109a612216565b73ffffffffffffffffffffffffffffffffffffffff166110b861173e565b73ffffffffffffffffffffffffffffffffffffffff161461110e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110590614a1f565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611159573d6000803e3d6000fd5b5050565b61117883838360405180602001604052806000815250611b9f565b505050565b6060600061118a83611383565b905060008167ffffffffffffffff8111156111ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156111fc5781602001602082028036833780820191505090505b50905060005b8281101561126c576112148582610e94565b82828151811061124d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061126490615062565b915050611202565b508092505050919050565b6000611281610c91565b82106112c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b99061491f565b60405180910390fd5b819050919050565b680821ab0d441498000081565b6112df612216565b73ffffffffffffffffffffffffffffffffffffffff166112fd61173e565b73ffffffffffffffffffffffffffffffffffffffff1614611353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134a90614a1f565b60405180910390fd5b80600a9080519060200190611369929190613599565b5050565b6000611378826122e0565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113eb906149df565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611474612216565b73ffffffffffffffffffffffffffffffffffffffff1661149261173e565b73ffffffffffffffffffffffffffffffffffffffff16146114e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114df90614a1f565b60405180910390fd5b6114f260006124e3565b565b600f6020528060005260406000206000915090505481565b611514612216565b73ffffffffffffffffffffffffffffffffffffffff1661153261173e565b73ffffffffffffffffffffffffffffffffffffffff1614611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157f90614a1f565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6115d4612216565b73ffffffffffffffffffffffffffffffffffffffff166115f261173e565b73ffffffffffffffffffffffffffffffffffffffff1614611648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163f90614a1f565b60405180910390fd5b600b5482611654610c91565b61165e9190614dbd565b111561169f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611696906148bf565b60405180910390fd5b600e60008154809291906116b290615062565b91905055506116c181836125a9565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061171190615062565b91905055505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611770612216565b73ffffffffffffffffffffffffffffffffffffffff1661178e61173e565b73ffffffffffffffffffffffffffffffffffffffff16146117e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117db90614a1f565b60405180910390fd5b80600d8190555050565b6060600280546117fd90615030565b80601f016020809104026020016040519081016040528092919081815260200182805461182990615030565b80156118765780601f1061184b57610100808354040283529160200191611876565b820191906000526020600020905b81548152906001019060200180831161185957829003601f168201915b5050505050905090565b600d5481565b6000600e54600c546118989190614dbd565b905080826118a4610c91565b6118ae9190614dbd565b11156118ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e6906148bf565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008261191a33611ffb565b6119249190614dbd565b1115611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195c9061495f565b60405180910390fd5b81600d546119739190614e44565b3410156119b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ac906149bf565b60405180910390fd5b6119bf33836125a9565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611a0f90615062565b91905055505050565b611a20612216565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8590614a5f565b60405180910390fd5b8060066000611a9b612216565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b48612216565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b8d9190614847565b60405180910390a35050565b600c5481565b600b54821015611ce357601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d230af3a85856040518363ffffffff1660e01b8152600401611c069291906147b0565b600060405180830381600087803b158015611c2057600080fd5b505af1158015611c34573d6000803e3d6000fd5b50505050600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611c8890615006565b9190505550600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611cdd90615062565b91905055505b611cef848484846125c7565b50505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b813373ffffffffffffffffffffffffffffffffffffffff16611d3c8261136d565b73ffffffffffffffffffffffffffffffffffffffff1614611d92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8990614abf565b60405180910390fd5b600082905060008151118015611da9575060198151105b611de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddf90614a9f565b60405180910390fd5b600260116000868152602001908152602001600020600001604051611e0d919061474f565b602060405180830381855afa158015611e2a573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611e4d919061396b565b600282604051611e5d9190614738565b602060405180830381855afa158015611e7a573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611e9d919061396b565b1415611ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed590614bdf565b60405180910390fd5b82601160008681526020019081526020016000206000019080519060200190611f08929190613599565b507f8edfa912e70e283a8ef6d6f52cd1faef9690ff989eff2f11a134e8478ba7b28b8484604051611f3a929190614c1a565b60405180910390a150505050565b6060611f5382612209565b611f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8990614a3f565b60405180910390fd5b6000611f9c612623565b90506000815111611fbc5760405180602001604052806000815250611fe7565b80611fc6846126b5565b604051602001611fd7929190614766565b6040516020818303038152906040525b915050919050565b600b5481565b60075481565b600061200682612862565b9050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e5481565b6120af612216565b73ffffffffffffffffffffffffffffffffffffffff166120cd61173e565b73ffffffffffffffffffffffffffffffffffffffff1614612123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211a90614a1f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218a906148df565b60405180910390fd5b61219c816124e3565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6122db83838361294b565b505050565b6122e861361f565b6122f182612209565b612330576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612327906148ff565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106123945760017f0000000000000000000000000000000000000000000000000000000000000000846123879190614ed2565b6123919190614dbd565b90505b60008390505b8181106124a2576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461248e578093505050506124de565b50808061249a90615006565b91505061239a565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d590614b7f565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125c3828260405180602001604052806000815250612f04565b5050565b6125d284848461294b565b6125de848484846133e3565b61261d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261490614aff565b60405180910390fd5b50505050565b6060600a805461263290615030565b80601f016020809104026020016040519081016040528092919081815260200182805461265e90615030565b80156126ab5780601f10612680576101008083540402835291602001916126ab565b820191906000526020600020905b81548152906001019060200180831161268e57829003601f168201915b5050505050905090565b606060008214156126fd576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061285d565b600082905060005b6000821461272f57808061271890615062565b915050600a826127289190614e13565b9150612705565b60008167ffffffffffffffff811115612771577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127a35781602001600182028036833780820191505090505b5090505b60008514612856576001826127bc9190614ed2565b9150600a856127cb91906150ab565b60306127d79190614dbd565b60f81b818381518110612813577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561284f9190614e13565b94506127a7565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ca9061497f565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6000612956826122e0565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661297d612216565b73ffffffffffffffffffffffffffffffffffffffff1614806129d957506129a2612216565b73ffffffffffffffffffffffffffffffffffffffff166129c184610af3565b73ffffffffffffffffffffffffffffffffffffffff16145b806129f557506129f482600001516129ef612216565b61200d565b5b905080612a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2e90614a7f565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa0906149ff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b109061493f565b60405180910390fd5b612b26858585600161357a565b612b36600084846000015161221e565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612ba49190614e9e565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612c489190614d77565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612d4e9190614dbd565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612e9457612dc481612209565b15612e93576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612efc8686866001613580565b505050505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7190614b3f565b60405180910390fd5b612f8381612209565b15612fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fba90614b1f565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115613026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301d90614bbf565b60405180910390fd5b613033600085838661357a565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516131309190614d77565b6fffffffffffffffffffffffffffffffff1681526020018583602001516131579190614d77565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156133c657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461336660008884886133e3565b6133a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339c90614aff565b60405180910390fd5b81806133b090615062565b92505080806133be90615062565b9150506132f5565b50806000819055506133db6000878588613580565b505050505050565b60006134048473ffffffffffffffffffffffffffffffffffffffff16613586565b1561356d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261342d612216565b8786866040518563ffffffff1660e01b815260040161344f94939291906147d9565b602060405180830381600087803b15801561346957600080fd5b505af192505050801561349a57506040513d601f19601f8201168201806040525081019061349791906139bd565b60015b61351d573d80600081146134ca576040519150601f19603f3d011682016040523d82523d6000602084013e6134cf565b606091505b50600081511415613515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350c90614aff565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613572565b600190505b949350505050565b50505050565b50505050565b600080823b905060008111915050919050565b8280546135a590615030565b90600052602060002090601f0160209004810192826135c7576000855561360e565b82601f106135e057805160ff191683800117855561360e565b8280016001018555821561360e579182015b8281111561360d5782518255916020019190600101906135f2565b5b50905061361b9190613659565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b8082111561367257600081600090555060010161365a565b5090565b600061368961368484614c7b565b614c4a565b9050828152602081018484840111156136a157600080fd5b6136ac848285614fc4565b509392505050565b60006136c76136c284614cab565b614c4a565b9050828152602081018484840111156136df57600080fd5b6136ea848285614fc4565b509392505050565b600081359050613701816151a9565b92915050565b600081359050613716816151c0565b92915050565b60008151905061372b816151d7565b92915050565b600081359050613740816151ee565b92915050565b600081519050613755816151ee565b92915050565b600082601f83011261376c57600080fd5b813561377c848260208601613676565b91505092915050565b600082601f83011261379657600080fd5b81356137a68482602086016136b4565b91505092915050565b6000813590506137be81615205565b92915050565b6000602082840312156137d657600080fd5b60006137e4848285016136f2565b91505092915050565b6000806040838503121561380057600080fd5b600061380e858286016136f2565b925050602061381f858286016136f2565b9150509250929050565b60008060006060848603121561383e57600080fd5b600061384c868287016136f2565b935050602061385d868287016136f2565b925050604061386e868287016137af565b9150509250925092565b6000806000806080858703121561388e57600080fd5b600061389c878288016136f2565b94505060206138ad878288016136f2565b93505060406138be878288016137af565b925050606085013567ffffffffffffffff8111156138db57600080fd5b6138e78782880161375b565b91505092959194509250565b6000806040838503121561390657600080fd5b6000613914858286016136f2565b925050602061392585828601613707565b9150509250929050565b6000806040838503121561394257600080fd5b6000613950858286016136f2565b9250506020613961858286016137af565b9150509250929050565b60006020828403121561397d57600080fd5b600061398b8482850161371c565b91505092915050565b6000602082840312156139a657600080fd5b60006139b484828501613731565b91505092915050565b6000602082840312156139cf57600080fd5b60006139dd84828501613746565b91505092915050565b6000602082840312156139f857600080fd5b600082013567ffffffffffffffff811115613a1257600080fd5b613a1e84828501613785565b91505092915050565b600060208284031215613a3957600080fd5b6000613a47848285016137af565b91505092915050565b60008060408385031215613a6357600080fd5b6000613a71858286016137af565b9250506020613a82858286016136f2565b9150509250929050565b60008060408385031215613a9f57600080fd5b6000613aad858286016137af565b925050602083013567ffffffffffffffff811115613aca57600080fd5b613ad685828601613785565b9150509250929050565b6000613aec838361471a565b60208301905092915050565b613b0181614f06565b82525050565b6000613b1282614d00565b613b1c8185614d2e565b9350613b2783614cdb565b8060005b83811015613b58578151613b3f8882613ae0565b9750613b4a83614d21565b925050600181019050613b2b565b5085935050505092915050565b613b6e81614f18565b82525050565b6000613b7f82614d0b565b613b898185614d3f565b9350613b99818560208601614fd3565b613ba281615198565b840191505092915050565b6000613bb882614d0b565b613bc28185614d50565b9350613bd2818560208601614fd3565b80840191505092915050565b60008154613beb81615030565b613bf58186614d50565b94506001821660008114613c105760018114613c2157613c54565b60ff19831686528186019350613c54565b613c2a85614ceb565b60005b83811015613c4c57815481890152600182019150602081019050613c2d565b838801955050505b50505092915050565b613c6681614fa0565b82525050565b6000613c7782614d16565b613c818185614d5b565b9350613c91818560208601614fd3565b613c9a81615198565b840191505092915050565b6000613cb082614d16565b613cba8185614d6c565b9350613cca818560208601614fd3565b80840191505092915050565b6000613ce3602283614d5b565b91507f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d49602e83614d5b565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f66205368726f6f6d4d6174650000000000000000000000000000000000006020830152604082019050919050565b6000613daf602683614d5b565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e15602a83614d5b565b91507f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008301527f74656e7420746f6b656e000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e7b602383614d5b565b91507f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008301527f6e647300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ee1602583614d5b565b91507f455243373231413a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f47604083614d5b565b91507f4c696d6974206e756d626572206f66206d696e747320746f20616e20616d6f7560008301527f6e7420736574206f6e20636f6e747261637420636f6e66696775726174696f6e6020830152604082019050919050565b6000613fad603183614d5b565b91507f455243373231413a206e756d626572206d696e74656420717565727920666f7260008301527f20746865207a65726f20616464726573730000000000000000000000000000006020830152604082019050919050565b6000614013603983614d5b565b91507f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006020830152604082019050919050565b6000614079602383614d5b565b91507f45746865722076616c75652073656e742069732062656c6f772074686520707260008301527f69636500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140df602b83614d5b565b91507f455243373231413a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b6000614145602683614d5b565b91507f455243373231413a207472616e736665722066726f6d20696e636f727265637460008301527f206f776e657200000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141ab600583614d6c565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b60006141eb602083614d5b565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061422b602f83614d5b565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614291601a83614d5b565b91507f455243373231413a20617070726f766520746f2063616c6c65720000000000006000830152602082019050919050565b60006142d1603283614d5b565b91507f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b6000614337601383614d5b565b91507f496e76616c6964206e616d65206c656e677468000000000000000000000000006000830152602082019050919050565b6000614377603083614d5b565b91507f43616e6e6f7420696e74657261637420776974682061205368726f6f6d4d617460008301527f6520796f7520646f206e6f74206f776e000000000000000000000000000000006020830152604082019050919050565b60006143dd602283614d5b565b91507f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008301527f65720000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614443603383614d5b565b91507f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008301527f6563656976657220696d706c656d656e746572000000000000000000000000006020830152604082019050919050565b60006144a9601d83614d5b565b91507f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006000830152602082019050919050565b60006144e9602183614d5b565b91507f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061454f602e83614d5b565b91507f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008301527f6f776e657220627920696e6465780000000000000000000000000000000000006020830152604082019050919050565b60006145b5602f83614d5b565b91507f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008301527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061461b602d83614d5b565b91507f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008301527f78697374656e7420746f6b656e000000000000000000000000000000000000006020830152604082019050919050565b6000614681602283614d5b565b91507f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008301527f67680000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146e7602083614d5b565b91507f4e6577206e616d652069732073616d652061732063757272656e74206e616d656000830152602082019050919050565b61472381614f96565b82525050565b61473281614f96565b82525050565b60006147448284613bad565b915081905092915050565b600061475b8284613bde565b915081905092915050565b60006147728285613ca5565b915061477e8284613ca5565b91506147898261419e565b91508190509392505050565b60006020820190506147aa6000830184613af8565b92915050565b60006040820190506147c56000830185613af8565b6147d26020830184613af8565b9392505050565b60006080820190506147ee6000830187613af8565b6147fb6020830186613af8565b6148086040830185614729565b818103606083015261481a8184613b74565b905095945050505050565b6000602082019050818103600083015261483f8184613b07565b905092915050565b600060208201905061485c6000830184613b65565b92915050565b60006020820190506148776000830184613c5d565b92915050565b600060208201905081810360008301526148978184613c6c565b905092915050565b600060208201905081810360008301526148b881613cd6565b9050919050565b600060208201905081810360008301526148d881613d3c565b9050919050565b600060208201905081810360008301526148f881613da2565b9050919050565b6000602082019050818103600083015261491881613e08565b9050919050565b6000602082019050818103600083015261493881613e6e565b9050919050565b6000602082019050818103600083015261495881613ed4565b9050919050565b6000602082019050818103600083015261497881613f3a565b9050919050565b6000602082019050818103600083015261499881613fa0565b9050919050565b600060208201905081810360008301526149b881614006565b9050919050565b600060208201905081810360008301526149d88161406c565b9050919050565b600060208201905081810360008301526149f8816140d2565b9050919050565b60006020820190508181036000830152614a1881614138565b9050919050565b60006020820190508181036000830152614a38816141de565b9050919050565b60006020820190508181036000830152614a588161421e565b9050919050565b60006020820190508181036000830152614a7881614284565b9050919050565b60006020820190508181036000830152614a98816142c4565b9050919050565b60006020820190508181036000830152614ab88161432a565b9050919050565b60006020820190508181036000830152614ad88161436a565b9050919050565b60006020820190508181036000830152614af8816143d0565b9050919050565b60006020820190508181036000830152614b1881614436565b9050919050565b60006020820190508181036000830152614b388161449c565b9050919050565b60006020820190508181036000830152614b58816144dc565b9050919050565b60006020820190508181036000830152614b7881614542565b9050919050565b60006020820190508181036000830152614b98816145a8565b9050919050565b60006020820190508181036000830152614bb88161460e565b9050919050565b60006020820190508181036000830152614bd881614674565b9050919050565b60006020820190508181036000830152614bf8816146da565b9050919050565b6000602082019050614c146000830184614729565b92915050565b6000604082019050614c2f6000830185614729565b8181036020830152614c418184613c6c565b90509392505050565b6000604051905081810181811067ffffffffffffffff82111715614c7157614c70615169565b5b8060405250919050565b600067ffffffffffffffff821115614c9657614c95615169565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614cc657614cc5615169565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d8282614f5a565b9150614d8d83614f5a565b9250826fffffffffffffffffffffffffffffffff03821115614db257614db16150dc565b5b828201905092915050565b6000614dc882614f96565b9150614dd383614f96565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614e0857614e076150dc565b5b828201905092915050565b6000614e1e82614f96565b9150614e2983614f96565b925082614e3957614e3861510b565b5b828204905092915050565b6000614e4f82614f96565b9150614e5a83614f96565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e9357614e926150dc565b5b828202905092915050565b6000614ea982614f5a565b9150614eb483614f5a565b925082821015614ec757614ec66150dc565b5b828203905092915050565b6000614edd82614f96565b9150614ee883614f96565b925082821015614efb57614efa6150dc565b5b828203905092915050565b6000614f1182614f76565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614fab82614fb2565b9050919050565b6000614fbd82614f76565b9050919050565b82818337600083830152505050565b60005b83811015614ff1578082015181840152602081019050614fd6565b83811115615000576000848401525b50505050565b600061501182614f96565b91506000821415615025576150246150dc565b5b600182039050919050565b6000600282049050600182168061504857607f821691505b6020821081141561505c5761505b61513a565b5b50919050565b600061506d82614f96565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156150a05761509f6150dc565b5b600182019050919050565b60006150b682614f96565b91506150c183614f96565b9250826150d1576150d061510b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6151b281614f06565b81146151bd57600080fd5b50565b6151c981614f18565b81146151d457600080fd5b50565b6151e081614f24565b81146151eb57600080fd5b50565b6151f781614f2e565b811461520257600080fd5b50565b61520e81614f96565b811461521957600080fd5b5056fea264697066735822122011e0f65502bdebaa0a22eb69ff084bcd8beb06b5f8db19d52146a90e9e3ff14c64736f6c6343000800003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000000001e61000000000000000000000000000000000000000000000000007c585087238000000000000000000000000000000000000000000000000000000000000000000a5368726f6f6d617465730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065348524f4f4d0000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102255760003560e01c806383a076be11610123578063b88d4fde116100ab578063d7224ba01161006f578063d7224ba01461081e578063dc33e68114610849578063e985e9c514610886578063edaafe20146108c3578063f2fde38b146108ee57610225565b8063b88d4fde14610739578063c1bb13f714610762578063c39cbef11461078d578063c87b56dd146107b6578063d5abeb01146107f357610225565b806395d89b41116100f257806395d89b4114610673578063a035b1fe1461069e578063a0712d68146106c9578063a22cb465146106e5578063a9fc729d1461070e57610225565b806383a076be146105cb5780638bc35c2f146105f45780638da5cb5b1461061f57806391b7f5ed1461064a57610225565b806342842e0e116101b15780636352211e116101755780636352211e146104d457806370a0823114610511578063715018a61461054e5780637ff768af1461056557806383151727146105a257610225565b806342842e0e146103dd578063438b6300146104065780634f6ccce71461044357806354b6f1611461048057806355f804b3146104ab57610225565b806318160ddd116101f857806318160ddd146102f857806323b872dd146103235780632ea003af1461034c5780632f745c59146103895780633ccfd60b146103c657610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190613994565b610917565b60405161025e9190614847565b60405180910390f35b34801561027357600080fd5b5061027c610a61565b604051610289919061487d565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613a27565b610af3565b6040516102c69190614795565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f1919061392f565b610b78565b005b34801561030457600080fd5b5061030d610c91565b60405161031a9190614bff565b60405180910390f35b34801561032f57600080fd5b5061034a60048036038101906103459190613829565b610c9a565b005b34801561035857600080fd5b50610373600480360381019061036e9190613a27565b610dee565b604051610380919061487d565b60405180910390f35b34801561039557600080fd5b506103b060048036038101906103ab919061392f565b610e94565b6040516103bd9190614bff565b60405180910390f35b3480156103d257600080fd5b506103db611092565b005b3480156103e957600080fd5b5061040460048036038101906103ff9190613829565b61115d565b005b34801561041257600080fd5b5061042d600480360381019061042891906137c4565b61117d565b60405161043a9190614825565b60405180910390f35b34801561044f57600080fd5b5061046a60048036038101906104659190613a27565b611277565b6040516104779190614bff565b60405180910390f35b34801561048c57600080fd5b506104956112ca565b6040516104a29190614bff565b60405180910390f35b3480156104b757600080fd5b506104d260048036038101906104cd91906139e6565b6112d7565b005b3480156104e057600080fd5b506104fb60048036038101906104f69190613a27565b61136d565b6040516105089190614795565b60405180910390f35b34801561051d57600080fd5b50610538600480360381019061053391906137c4565b611383565b6040516105459190614bff565b60405180910390f35b34801561055a57600080fd5b5061056361146c565b005b34801561057157600080fd5b5061058c600480360381019061058791906137c4565b6114f4565b6040516105999190614bff565b60405180910390f35b3480156105ae57600080fd5b506105c960048036038101906105c491906137c4565b61150c565b005b3480156105d757600080fd5b506105f260048036038101906105ed9190613a50565b6115cc565b005b34801561060057600080fd5b5061060961171a565b6040516106169190614bff565b60405180910390f35b34801561062b57600080fd5b5061063461173e565b6040516106419190614795565b60405180910390f35b34801561065657600080fd5b50610671600480360381019061066c9190613a27565b611768565b005b34801561067f57600080fd5b506106886117ee565b604051610695919061487d565b60405180910390f35b3480156106aa57600080fd5b506106b3611880565b6040516106c09190614bff565b60405180910390f35b6106e360048036038101906106de9190613a27565b611886565b005b3480156106f157600080fd5b5061070c600480360381019061070791906138f3565b611a18565b005b34801561071a57600080fd5b50610723611b99565b6040516107309190614bff565b60405180910390f35b34801561074557600080fd5b50610760600480360381019061075b9190613878565b611b9f565b005b34801561076e57600080fd5b50610777611cf5565b6040516107849190614862565b60405180910390f35b34801561079957600080fd5b506107b460048036038101906107af9190613a8c565b611d1b565b005b3480156107c257600080fd5b506107dd60048036038101906107d89190613a27565b611f48565b6040516107ea919061487d565b60405180910390f35b3480156107ff57600080fd5b50610808611fef565b6040516108159190614bff565b60405180910390f35b34801561082a57600080fd5b50610833611ff5565b6040516108409190614bff565b60405180910390f35b34801561085557600080fd5b50610870600480360381019061086b91906137c4565b611ffb565b60405161087d9190614bff565b60405180910390f35b34801561089257600080fd5b506108ad60048036038101906108a891906137ed565b61200d565b6040516108ba9190614847565b60405180910390f35b3480156108cf57600080fd5b506108d86120a1565b6040516108e59190614bff565b60405180910390f35b3480156108fa57600080fd5b50610915600480360381019061091091906137c4565b6120a7565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109e257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a4a57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a5a5750610a598261219f565b5b9050919050565b606060018054610a7090615030565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9c90615030565b8015610ae95780601f10610abe57610100808354040283529160200191610ae9565b820191906000526020600020905b815481529060010190602001808311610acc57829003601f168201915b5050505050905090565b6000610afe82612209565b610b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3490614b9f565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b838261136d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610beb90614adf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c13612216565b73ffffffffffffffffffffffffffffffffffffffff161480610c425750610c4181610c3c612216565b61200d565b5b610c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c789061499f565b60405180910390fd5b610c8c83838361221e565b505050565b60008054905090565b600b54811015610dde57601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d230af3a84846040518363ffffffff1660e01b8152600401610d019291906147b0565b600060405180830381600087803b158015610d1b57600080fd5b505af1158015610d2f573d6000803e3d6000fd5b50505050600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610d8390615006565b9190505550600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610dd890615062565b91905055505b610de98383836122d0565b505050565b6011602052806000526040600020600091509050806000018054610e1190615030565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3d90615030565b8015610e8a5780601f10610e5f57610100808354040283529160200191610e8a565b820191906000526020600020905b815481529060010190602001808311610e6d57829003601f168201915b5050505050905081565b6000610e9f83611383565b8210610ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed79061489f565b60405180910390fd5b6000610eea610c91565b905060008060005b83811015611050576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610fe457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561103c578684141561102d57819550505050505061108c565b838061103890615062565b9450505b50808061104890615062565b915050610ef2565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108390614b5f565b60405180910390fd5b92915050565b61109a612216565b73ffffffffffffffffffffffffffffffffffffffff166110b861173e565b73ffffffffffffffffffffffffffffffffffffffff161461110e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110590614a1f565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611159573d6000803e3d6000fd5b5050565b61117883838360405180602001604052806000815250611b9f565b505050565b6060600061118a83611383565b905060008167ffffffffffffffff8111156111ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156111fc5781602001602082028036833780820191505090505b50905060005b8281101561126c576112148582610e94565b82828151811061124d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061126490615062565b915050611202565b508092505050919050565b6000611281610c91565b82106112c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b99061491f565b60405180910390fd5b819050919050565b680821ab0d441498000081565b6112df612216565b73ffffffffffffffffffffffffffffffffffffffff166112fd61173e565b73ffffffffffffffffffffffffffffffffffffffff1614611353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134a90614a1f565b60405180910390fd5b80600a9080519060200190611369929190613599565b5050565b6000611378826122e0565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113eb906149df565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611474612216565b73ffffffffffffffffffffffffffffffffffffffff1661149261173e565b73ffffffffffffffffffffffffffffffffffffffff16146114e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114df90614a1f565b60405180910390fd5b6114f260006124e3565b565b600f6020528060005260406000206000915090505481565b611514612216565b73ffffffffffffffffffffffffffffffffffffffff1661153261173e565b73ffffffffffffffffffffffffffffffffffffffff1614611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157f90614a1f565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6115d4612216565b73ffffffffffffffffffffffffffffffffffffffff166115f261173e565b73ffffffffffffffffffffffffffffffffffffffff1614611648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163f90614a1f565b60405180910390fd5b600b5482611654610c91565b61165e9190614dbd565b111561169f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611696906148bf565b60405180910390fd5b600e60008154809291906116b290615062565b91905055506116c181836125a9565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061171190615062565b91905055505050565b7f000000000000000000000000000000000000000000000000000000000000000d81565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611770612216565b73ffffffffffffffffffffffffffffffffffffffff1661178e61173e565b73ffffffffffffffffffffffffffffffffffffffff16146117e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117db90614a1f565b60405180910390fd5b80600d8190555050565b6060600280546117fd90615030565b80601f016020809104026020016040519081016040528092919081815260200182805461182990615030565b80156118765780601f1061184b57610100808354040283529160200191611876565b820191906000526020600020905b81548152906001019060200180831161185957829003601f168201915b5050505050905090565b600d5481565b6000600e54600c546118989190614dbd565b905080826118a4610c91565b6118ae9190614dbd565b11156118ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e6906148bf565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000d8261191a33611ffb565b6119249190614dbd565b1115611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195c9061495f565b60405180910390fd5b81600d546119739190614e44565b3410156119b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ac906149bf565b60405180910390fd5b6119bf33836125a9565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611a0f90615062565b91905055505050565b611a20612216565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8590614a5f565b60405180910390fd5b8060066000611a9b612216565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b48612216565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b8d9190614847565b60405180910390a35050565b600c5481565b600b54821015611ce357601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d230af3a85856040518363ffffffff1660e01b8152600401611c069291906147b0565b600060405180830381600087803b158015611c2057600080fd5b505af1158015611c34573d6000803e3d6000fd5b50505050600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611c8890615006565b9190505550600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611cdd90615062565b91905055505b611cef848484846125c7565b50505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b813373ffffffffffffffffffffffffffffffffffffffff16611d3c8261136d565b73ffffffffffffffffffffffffffffffffffffffff1614611d92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8990614abf565b60405180910390fd5b600082905060008151118015611da9575060198151105b611de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddf90614a9f565b60405180910390fd5b600260116000868152602001908152602001600020600001604051611e0d919061474f565b602060405180830381855afa158015611e2a573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611e4d919061396b565b600282604051611e5d9190614738565b602060405180830381855afa158015611e7a573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611e9d919061396b565b1415611ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed590614bdf565b60405180910390fd5b82601160008681526020019081526020016000206000019080519060200190611f08929190613599565b507f8edfa912e70e283a8ef6d6f52cd1faef9690ff989eff2f11a134e8478ba7b28b8484604051611f3a929190614c1a565b60405180910390a150505050565b6060611f5382612209565b611f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8990614a3f565b60405180910390fd5b6000611f9c612623565b90506000815111611fbc5760405180602001604052806000815250611fe7565b80611fc6846126b5565b604051602001611fd7929190614766565b6040516020818303038152906040525b915050919050565b600b5481565b60075481565b600061200682612862565b9050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e5481565b6120af612216565b73ffffffffffffffffffffffffffffffffffffffff166120cd61173e565b73ffffffffffffffffffffffffffffffffffffffff1614612123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211a90614a1f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218a906148df565b60405180910390fd5b61219c816124e3565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6122db83838361294b565b505050565b6122e861361f565b6122f182612209565b612330576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612327906148ff565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000d83106123945760017f000000000000000000000000000000000000000000000000000000000000000d846123879190614ed2565b6123919190614dbd565b90505b60008390505b8181106124a2576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461248e578093505050506124de565b50808061249a90615006565b91505061239a565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d590614b7f565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125c3828260405180602001604052806000815250612f04565b5050565b6125d284848461294b565b6125de848484846133e3565b61261d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261490614aff565b60405180910390fd5b50505050565b6060600a805461263290615030565b80601f016020809104026020016040519081016040528092919081815260200182805461265e90615030565b80156126ab5780601f10612680576101008083540402835291602001916126ab565b820191906000526020600020905b81548152906001019060200180831161268e57829003601f168201915b5050505050905090565b606060008214156126fd576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061285d565b600082905060005b6000821461272f57808061271890615062565b915050600a826127289190614e13565b9150612705565b60008167ffffffffffffffff811115612771577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127a35781602001600182028036833780820191505090505b5090505b60008514612856576001826127bc9190614ed2565b9150600a856127cb91906150ab565b60306127d79190614dbd565b60f81b818381518110612813577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561284f9190614e13565b94506127a7565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ca9061497f565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6000612956826122e0565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661297d612216565b73ffffffffffffffffffffffffffffffffffffffff1614806129d957506129a2612216565b73ffffffffffffffffffffffffffffffffffffffff166129c184610af3565b73ffffffffffffffffffffffffffffffffffffffff16145b806129f557506129f482600001516129ef612216565b61200d565b5b905080612a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2e90614a7f565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa0906149ff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b109061493f565b60405180910390fd5b612b26858585600161357a565b612b36600084846000015161221e565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612ba49190614e9e565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612c489190614d77565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612d4e9190614dbd565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612e9457612dc481612209565b15612e93576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612efc8686866001613580565b505050505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7190614b3f565b60405180910390fd5b612f8381612209565b15612fc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fba90614b1f565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000d831115613026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301d90614bbf565b60405180910390fd5b613033600085838661357a565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516131309190614d77565b6fffffffffffffffffffffffffffffffff1681526020018583602001516131579190614d77565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156133c657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461336660008884886133e3565b6133a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339c90614aff565b60405180910390fd5b81806133b090615062565b92505080806133be90615062565b9150506132f5565b50806000819055506133db6000878588613580565b505050505050565b60006134048473ffffffffffffffffffffffffffffffffffffffff16613586565b1561356d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261342d612216565b8786866040518563ffffffff1660e01b815260040161344f94939291906147d9565b602060405180830381600087803b15801561346957600080fd5b505af192505050801561349a57506040513d601f19601f8201168201806040525081019061349791906139bd565b60015b61351d573d80600081146134ca576040519150601f19603f3d011682016040523d82523d6000602084013e6134cf565b606091505b50600081511415613515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350c90614aff565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613572565b600190505b949350505050565b50505050565b50505050565b600080823b905060008111915050919050565b8280546135a590615030565b90600052602060002090601f0160209004810192826135c7576000855561360e565b82601f106135e057805160ff191683800117855561360e565b8280016001018555821561360e579182015b8281111561360d5782518255916020019190600101906135f2565b5b50905061361b9190613659565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b8082111561367257600081600090555060010161365a565b5090565b600061368961368484614c7b565b614c4a565b9050828152602081018484840111156136a157600080fd5b6136ac848285614fc4565b509392505050565b60006136c76136c284614cab565b614c4a565b9050828152602081018484840111156136df57600080fd5b6136ea848285614fc4565b509392505050565b600081359050613701816151a9565b92915050565b600081359050613716816151c0565b92915050565b60008151905061372b816151d7565b92915050565b600081359050613740816151ee565b92915050565b600081519050613755816151ee565b92915050565b600082601f83011261376c57600080fd5b813561377c848260208601613676565b91505092915050565b600082601f83011261379657600080fd5b81356137a68482602086016136b4565b91505092915050565b6000813590506137be81615205565b92915050565b6000602082840312156137d657600080fd5b60006137e4848285016136f2565b91505092915050565b6000806040838503121561380057600080fd5b600061380e858286016136f2565b925050602061381f858286016136f2565b9150509250929050565b60008060006060848603121561383e57600080fd5b600061384c868287016136f2565b935050602061385d868287016136f2565b925050604061386e868287016137af565b9150509250925092565b6000806000806080858703121561388e57600080fd5b600061389c878288016136f2565b94505060206138ad878288016136f2565b93505060406138be878288016137af565b925050606085013567ffffffffffffffff8111156138db57600080fd5b6138e78782880161375b565b91505092959194509250565b6000806040838503121561390657600080fd5b6000613914858286016136f2565b925050602061392585828601613707565b9150509250929050565b6000806040838503121561394257600080fd5b6000613950858286016136f2565b9250506020613961858286016137af565b9150509250929050565b60006020828403121561397d57600080fd5b600061398b8482850161371c565b91505092915050565b6000602082840312156139a657600080fd5b60006139b484828501613731565b91505092915050565b6000602082840312156139cf57600080fd5b60006139dd84828501613746565b91505092915050565b6000602082840312156139f857600080fd5b600082013567ffffffffffffffff811115613a1257600080fd5b613a1e84828501613785565b91505092915050565b600060208284031215613a3957600080fd5b6000613a47848285016137af565b91505092915050565b60008060408385031215613a6357600080fd5b6000613a71858286016137af565b9250506020613a82858286016136f2565b9150509250929050565b60008060408385031215613a9f57600080fd5b6000613aad858286016137af565b925050602083013567ffffffffffffffff811115613aca57600080fd5b613ad685828601613785565b9150509250929050565b6000613aec838361471a565b60208301905092915050565b613b0181614f06565b82525050565b6000613b1282614d00565b613b1c8185614d2e565b9350613b2783614cdb565b8060005b83811015613b58578151613b3f8882613ae0565b9750613b4a83614d21565b925050600181019050613b2b565b5085935050505092915050565b613b6e81614f18565b82525050565b6000613b7f82614d0b565b613b898185614d3f565b9350613b99818560208601614fd3565b613ba281615198565b840191505092915050565b6000613bb882614d0b565b613bc28185614d50565b9350613bd2818560208601614fd3565b80840191505092915050565b60008154613beb81615030565b613bf58186614d50565b94506001821660008114613c105760018114613c2157613c54565b60ff19831686528186019350613c54565b613c2a85614ceb565b60005b83811015613c4c57815481890152600182019150602081019050613c2d565b838801955050505b50505092915050565b613c6681614fa0565b82525050565b6000613c7782614d16565b613c818185614d5b565b9350613c91818560208601614fd3565b613c9a81615198565b840191505092915050565b6000613cb082614d16565b613cba8185614d6c565b9350613cca818560208601614fd3565b80840191505092915050565b6000613ce3602283614d5b565b91507f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d49602e83614d5b565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f66205368726f6f6d4d6174650000000000000000000000000000000000006020830152604082019050919050565b6000613daf602683614d5b565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e15602a83614d5b565b91507f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008301527f74656e7420746f6b656e000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e7b602383614d5b565b91507f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008301527f6e647300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ee1602583614d5b565b91507f455243373231413a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f47604083614d5b565b91507f4c696d6974206e756d626572206f66206d696e747320746f20616e20616d6f7560008301527f6e7420736574206f6e20636f6e747261637420636f6e66696775726174696f6e6020830152604082019050919050565b6000613fad603183614d5b565b91507f455243373231413a206e756d626572206d696e74656420717565727920666f7260008301527f20746865207a65726f20616464726573730000000000000000000000000000006020830152604082019050919050565b6000614013603983614d5b565b91507f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006020830152604082019050919050565b6000614079602383614d5b565b91507f45746865722076616c75652073656e742069732062656c6f772074686520707260008301527f69636500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140df602b83614d5b565b91507f455243373231413a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b6000614145602683614d5b565b91507f455243373231413a207472616e736665722066726f6d20696e636f727265637460008301527f206f776e657200000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141ab600583614d6c565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b60006141eb602083614d5b565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061422b602f83614d5b565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614291601a83614d5b565b91507f455243373231413a20617070726f766520746f2063616c6c65720000000000006000830152602082019050919050565b60006142d1603283614d5b565b91507f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b6000614337601383614d5b565b91507f496e76616c6964206e616d65206c656e677468000000000000000000000000006000830152602082019050919050565b6000614377603083614d5b565b91507f43616e6e6f7420696e74657261637420776974682061205368726f6f6d4d617460008301527f6520796f7520646f206e6f74206f776e000000000000000000000000000000006020830152604082019050919050565b60006143dd602283614d5b565b91507f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008301527f65720000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614443603383614d5b565b91507f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008301527f6563656976657220696d706c656d656e746572000000000000000000000000006020830152604082019050919050565b60006144a9601d83614d5b565b91507f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006000830152602082019050919050565b60006144e9602183614d5b565b91507f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061454f602e83614d5b565b91507f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008301527f6f776e657220627920696e6465780000000000000000000000000000000000006020830152604082019050919050565b60006145b5602f83614d5b565b91507f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008301527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061461b602d83614d5b565b91507f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008301527f78697374656e7420746f6b656e000000000000000000000000000000000000006020830152604082019050919050565b6000614681602283614d5b565b91507f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008301527f67680000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146e7602083614d5b565b91507f4e6577206e616d652069732073616d652061732063757272656e74206e616d656000830152602082019050919050565b61472381614f96565b82525050565b61473281614f96565b82525050565b60006147448284613bad565b915081905092915050565b600061475b8284613bde565b915081905092915050565b60006147728285613ca5565b915061477e8284613ca5565b91506147898261419e565b91508190509392505050565b60006020820190506147aa6000830184613af8565b92915050565b60006040820190506147c56000830185613af8565b6147d26020830184613af8565b9392505050565b60006080820190506147ee6000830187613af8565b6147fb6020830186613af8565b6148086040830185614729565b818103606083015261481a8184613b74565b905095945050505050565b6000602082019050818103600083015261483f8184613b07565b905092915050565b600060208201905061485c6000830184613b65565b92915050565b60006020820190506148776000830184613c5d565b92915050565b600060208201905081810360008301526148978184613c6c565b905092915050565b600060208201905081810360008301526148b881613cd6565b9050919050565b600060208201905081810360008301526148d881613d3c565b9050919050565b600060208201905081810360008301526148f881613da2565b9050919050565b6000602082019050818103600083015261491881613e08565b9050919050565b6000602082019050818103600083015261493881613e6e565b9050919050565b6000602082019050818103600083015261495881613ed4565b9050919050565b6000602082019050818103600083015261497881613f3a565b9050919050565b6000602082019050818103600083015261499881613fa0565b9050919050565b600060208201905081810360008301526149b881614006565b9050919050565b600060208201905081810360008301526149d88161406c565b9050919050565b600060208201905081810360008301526149f8816140d2565b9050919050565b60006020820190508181036000830152614a1881614138565b9050919050565b60006020820190508181036000830152614a38816141de565b9050919050565b60006020820190508181036000830152614a588161421e565b9050919050565b60006020820190508181036000830152614a7881614284565b9050919050565b60006020820190508181036000830152614a98816142c4565b9050919050565b60006020820190508181036000830152614ab88161432a565b9050919050565b60006020820190508181036000830152614ad88161436a565b9050919050565b60006020820190508181036000830152614af8816143d0565b9050919050565b60006020820190508181036000830152614b1881614436565b9050919050565b60006020820190508181036000830152614b388161449c565b9050919050565b60006020820190508181036000830152614b58816144dc565b9050919050565b60006020820190508181036000830152614b7881614542565b9050919050565b60006020820190508181036000830152614b98816145a8565b9050919050565b60006020820190508181036000830152614bb88161460e565b9050919050565b60006020820190508181036000830152614bd881614674565b9050919050565b60006020820190508181036000830152614bf8816146da565b9050919050565b6000602082019050614c146000830184614729565b92915050565b6000604082019050614c2f6000830185614729565b8181036020830152614c418184613c6c565b90509392505050565b6000604051905081810181811067ffffffffffffffff82111715614c7157614c70615169565b5b8060405250919050565b600067ffffffffffffffff821115614c9657614c95615169565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614cc657614cc5615169565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d8282614f5a565b9150614d8d83614f5a565b9250826fffffffffffffffffffffffffffffffff03821115614db257614db16150dc565b5b828201905092915050565b6000614dc882614f96565b9150614dd383614f96565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614e0857614e076150dc565b5b828201905092915050565b6000614e1e82614f96565b9150614e2983614f96565b925082614e3957614e3861510b565b5b828204905092915050565b6000614e4f82614f96565b9150614e5a83614f96565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e9357614e926150dc565b5b828202905092915050565b6000614ea982614f5a565b9150614eb483614f5a565b925082821015614ec757614ec66150dc565b5b828203905092915050565b6000614edd82614f96565b9150614ee883614f96565b925082821015614efb57614efa6150dc565b5b828203905092915050565b6000614f1182614f76565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614fab82614fb2565b9050919050565b6000614fbd82614f76565b9050919050565b82818337600083830152505050565b60005b83811015614ff1578082015181840152602081019050614fd6565b83811115615000576000848401525b50505050565b600061501182614f96565b91506000821415615025576150246150dc565b5b600182039050919050565b6000600282049050600182168061504857607f821691505b6020821081141561505c5761505b61513a565b5b50919050565b600061506d82614f96565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156150a05761509f6150dc565b5b600182019050919050565b60006150b682614f96565b91506150c183614f96565b9250826150d1576150d061510b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6151b281614f06565b81146151bd57600080fd5b50565b6151c981614f18565b81146151d457600080fd5b50565b6151e081614f24565b81146151eb57600080fd5b50565b6151f781614f2e565b811461520257600080fd5b50565b61520e81614f96565b811461521957600080fd5b5056fea264697066735822122011e0f65502bdebaa0a22eb69ff084bcd8beb06b5f8db19d52146a90e9e3ff14c64736f6c63430008000033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000000001e61000000000000000000000000000000000000000000000000007c585087238000000000000000000000000000000000000000000000000000000000000000000a5368726f6f6d617465730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065348524f4f4d0000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Shroomates
Arg [1] : symbol (string): SHROOM
Arg [2] : maxBatchSize_ (uint256): 13
Arg [3] : collectionSize_ (uint256): 7777
Arg [4] : mintPrice_ (uint256): 35000000000000000

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [3] : 0000000000000000000000000000000000000000000000000000000000001e61
Arg [4] : 000000000000000000000000000000000000000000000000007c585087238000
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [6] : 5368726f6f6d6174657300000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [8] : 5348524f4f4d0000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

48867:4699:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30282:422;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32243:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33947:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33468:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28638:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52281:330;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49628:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29346:864;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52999:143;;;;;;;;;;;;;:::i;:::-;;35215:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51899:374;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28815:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49566:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53246:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32052:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30768:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7489:103;;;;;;;;;;;;;:::i;:::-;;49217:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50680:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51573:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49103:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6838:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53150:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32412:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49158:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50809:756;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34311:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49064:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52619:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49532:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50137:535;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32587:477;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49026:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40352:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53450:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34693:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49187:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7747:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30282:422;30429:4;30486:25;30471:40;;;:11;:40;;;;:105;;;;30543:33;30528:48;;;:11;:48;;;;30471:105;:172;;;;30608:35;30593:50;;;:11;:50;;;;30471:172;:225;;;;30660:36;30684:11;30660:23;:36::i;:::-;30471:225;30451:245;;30282:422;;;:::o;32243:100::-;32297:13;32330:5;32323:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32243:100;:::o;33947:292::-;34051:7;34098:16;34106:7;34098;:16::i;:::-;34076:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;34207:15;:24;34223:7;34207:24;;;;;;;;;;;;;;;;;;;;;34200:31;;33947:292;;;:::o;33468:413::-;33541:13;33557:24;33573:7;33557:15;:24::i;:::-;33541:40;;33606:5;33600:11;;:2;:11;;;;33592:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33701:5;33685:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;33710:37;33727:5;33734:12;:10;:12::i;:::-;33710:16;:37::i;:::-;33685:62;33663:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;33845:28;33854:2;33858:7;33867:5;33845:8;:28::i;:::-;33468:413;;;:::o;28638:100::-;28691:7;28718:12;;28711:19;;28638:100;:::o;52281:330::-;52421:9;;52411:7;:19;52407:147;;;52447:8;;;;;;;;;;;:21;;;52469:4;52475:2;52447:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52493:10;:16;52504:4;52493:16;;;;;;;;;;;;;;;;:18;;;;;;;;;:::i;:::-;;;;;;52526:10;:14;52537:2;52526:14;;;;;;;;;;;;;;;;:16;;;;;;;;;:::i;:::-;;;;;;52407:147;52564:39;52585:4;52591:2;52595:7;52564:20;:39::i;:::-;52281:330;;;:::o;49628:48::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29346:864::-;29471:7;29512:16;29522:5;29512:9;:16::i;:::-;29504:5;:24;29496:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;29578:22;29603:13;:11;:13::i;:::-;29578:38;;29627:19;29661:25;29715:9;29710:426;29734:14;29730:1;:18;29710:426;;;29770:31;29804:11;:14;29816:1;29804:14;;;;;;;;;;;29770:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29863:1;29837:28;;:9;:14;;;:28;;;29833:103;;29906:9;:14;;;29886:34;;29833:103;29975:5;29954:26;;:17;:26;;;29950:175;;;30020:5;30005:11;:20;30001:77;;;30057:1;30050:8;;;;;;;;;30001:77;30096:13;;;;;:::i;:::-;;;;29950:175;29710:426;29750:3;;;;;:::i;:::-;;;;29710:426;;;;30146:56;;;;;;;;;;:::i;:::-;;;;;;;;29346:864;;;;;:::o;52999:143::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53047:15:::1;53065:21;53047:39;;53105:10;53097:28;;:37;53126:7;53097:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;7129:1;52999:143::o:0;35215:177::-;35345:39;35362:4;35368:2;35372:7;35345:39;;;;;;;;;;;;:16;:39::i;:::-;35215:177;;;:::o;51899:374::-;51987:16;52021:18;52042:16;52052:5;52042:9;:16::i;:::-;52021:37;;52069:25;52111:10;52097:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52069:53;;52138:9;52133:107;52153:10;52149:1;:14;52133:107;;;52199:29;52219:5;52226:1;52199:19;:29::i;:::-;52185:8;52194:1;52185:11;;;;;;;;;;;;;;;;;;;;;:43;;;;;52165:3;;;;;:::i;:::-;;;;52133:107;;;;52257:8;52250:15;;;;51899:374;;;:::o;28815:228::-;28918:7;28959:13;:11;:13::i;:::-;28951:5;:21;28943:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;29030:5;29023:12;;28815:228;;;:::o;49566:53::-;49610:9;49566:53;:::o;53246:88::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53323:3:::1;53313:7;:13;;;;;;;;;;;;:::i;:::-;;53246:88:::0;:::o;32052:124::-;32116:7;32143:20;32155:7;32143:11;:20::i;:::-;:25;;;32136:32;;32052:124;;;:::o;30768:258::-;30832:7;30891:1;30874:19;;:5;:19;;;;30852:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;30990:12;:19;31003:5;30990:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;30982:36;;30975:43;;30768:258;;;:::o;7489:103::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7554:30:::1;7581:1;7554:18;:30::i;:::-;7489:103::o:0;49217:45::-;;;;;;;;;;;;;;;;;:::o;50680:121::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50777:15:::1;50756:8;;:37;;;;;;;;;;;;;;;;;;50680:121:::0;:::o;51573:318::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51706:9:::1;;51689:13;51673;:11;:13::i;:::-;:29;;;;:::i;:::-;:42;;51651:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;51800:6;;:8;;;;;;;;;:::i;:::-;;;;;;51819:29;51829:3;51834:13;51819:9;:29::i;:::-;51859:10;:22;51870:10;51859:22;;;;;;;;;;;;;;;;:24;;;;;;;;;:::i;:::-;;;;;;51573:318:::0;;:::o;49103:48::-;;;:::o;6838:87::-;6884:7;6911:6;;;;;;;;;;;6904:13;;6838:87;:::o;53150:88::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53222:8:::1;53214:5;:16;;;;53150:88:::0;:::o;32412:104::-;32468:13;32501:7;32494:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32412:104;:::o;49158:20::-;;;;:::o;50809:756::-;50872:21;50909:6;;50896:10;;:19;;;;:::i;:::-;50872:43;;50981:13;50964;50948;:11;:13::i;:::-;:29;;;;:::i;:::-;:46;;50926:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;51230:23;51213:13;51186:24;51199:10;51186:12;:24::i;:::-;:40;;;;:::i;:::-;:67;;51164:181;;;;;;;;;;;;:::i;:::-;;;;;;;;;51399:13;51391:5;;:21;;;;:::i;:::-;51378:9;:34;;51356:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;51486:36;51496:10;51508:13;51486:9;:36::i;:::-;51533:10;:22;51544:10;51533:22;;;;;;;;;;;;;;;;:24;;;;;;;;;:::i;:::-;;;;;;50809:756;;:::o;34311:311::-;34441:12;:10;:12::i;:::-;34429:24;;:8;:24;;;;34421:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;34542:8;34497:18;:32;34516:12;:10;:12::i;:::-;34497:32;;;;;;;;;;;;;;;:42;34530:8;34497:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34595:8;34566:48;;34581:12;:10;:12::i;:::-;34566:48;;;34605:8;34566:48;;;;;;:::i;:::-;;;;;;;;34311:311;;:::o;49064:32::-;;;;:::o;52619:372::-;52791:9;;52781:7;:19;52777:147;;;52817:8;;;;;;;;;;;:21;;;52839:4;52845:2;52817:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52863:10;:16;52874:4;52863:16;;;;;;;;;;;;;;;;:18;;;;;;;;;:::i;:::-;;;;;;52896:10;:14;52907:2;52896:14;;;;;;;;;;;;;;;;:16;;;;;;;;;:::i;:::-;;;;;;52777:147;52934:49;52959:4;52965:2;52969:7;52978:4;52934:24;:49::i;:::-;52619:372;;;;:::o;49532:25::-;;;;;;;;;;;;;:::o;50137:535::-;50237:8;49418:10;49397:31;;:17;49405:8;49397:7;:17::i;:::-;:31;;;49375:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;50263:14:::1;50286:7;50263:31;;50324:1;50313;:8;:12;:29;;;;;50340:2;50329:1;:8;:13;50313:29;50305:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;50412:40;50425:10;:20;50436:8;50425:20;;;;;;;;;;;:25;;50412:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50399:9;50406:1;50399:9;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;50377:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;50611:7;50583:10;:20;50594:8;50583:20;;;;;;;;;;;:25;;:35;;;;;;;;;;;;:::i;:::-;;50634:30;50646:8;50656:7;50634:30;;;;;;;:::i;:::-;;;;;;;;49515:1;50137:535:::0;;;:::o;32587:477::-;32705:13;32758:16;32766:7;32758;:16::i;:::-;32736:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;32862:21;32886:10;:8;:10::i;:::-;32862:34;;32951:1;32933:7;32927:21;:25;:129;;;;;;;;;;;;;;;;;32996:7;33005:18;:7;:16;:18::i;:::-;32979:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32927:129;32907:149;;;32587:477;;;:::o;49026:31::-;;;;:::o;40352:43::-;;;;:::o;53450:113::-;53508:7;53535:20;53549:5;53535:13;:20::i;:::-;53528:27;;53450:113;;;:::o;34693:214::-;34835:4;34864:18;:25;34883:5;34864:25;;;;;;;;;;;;;;;:35;34890:8;34864:35;;;;;;;;;;;;;;;;;;;;;;;;;34857:42;;34693:214;;;;:::o;49187:21::-;;;;:::o;7747:201::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7856:1:::1;7836:22;;:8;:22;;;;7828:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7912:28;7931:8;7912:18;:28::i;:::-;7747:201:::0;:::o;19270:157::-;19355:4;19394:25;19379:40;;;:11;:40;;;;19372:47;;19270:157;;;:::o;36081:111::-;36138:4;36172:12;;36162:7;:22;36155:29;;36081:111;;;:::o;5562:98::-;5615:7;5642:10;5635:17;;5562:98;:::o;40148:196::-;40290:2;40263:15;:24;40279:7;40263:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40328:7;40324:2;40308:28;;40317:5;40308:28;;;;;;;;;;;;40148:196;;;:::o;34974:170::-;35108:28;35118:4;35124:2;35128:7;35108:9;:28::i;:::-;34974:170;;;:::o;31308:682::-;31396:21;;:::i;:::-;31443:16;31451:7;31443;:16::i;:::-;31435:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;31519:26;31571:12;31560:7;:23;31556:103;;31646:1;31631:12;31621:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;31600:47;;31556:103;31676:12;31691:7;31676:22;;31671:242;31708:18;31700:4;:26;31671:242;;31751:31;31785:11;:17;31797:4;31785:17;;;;;;;;;;;31751:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31847:1;31821:28;;:9;:14;;;:28;;;31817:85;;31877:9;31870:16;;;;;;;31817:85;31671:242;31728:6;;;;;:::i;:::-;;;;31671:242;;;;31925:57;;;;;;;;;;:::i;:::-;;;;;;;;31308:682;;;;:::o;8108:191::-;8182:16;8201:6;;;;;;;;;;;8182:25;;8227:8;8218:6;;:17;;;;;;;;;;;;;;;;;;8282:8;8251:40;;8272:8;8251:40;;;;;;;;;;;;8108:191;;:::o;36200:104::-;36269:27;36279:2;36283:8;36269:27;;;;;;;;;;;;:9;:27::i;:::-;36200:104;;:::o;35463:363::-;35630:28;35640:4;35646:2;35650:7;35630:9;:28::i;:::-;35691:48;35714:4;35720:2;35724:7;35733:5;35691:22;:48::i;:::-;35669:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;35463:363;;;;:::o;53342:100::-;53394:13;53427:7;53420:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53342:100;:::o;3124:723::-;3180:13;3410:1;3401:5;:10;3397:53;;;3428:10;;;;;;;;;;;;;;;;;;;;;3397:53;3460:12;3475:5;3460:20;;3491:14;3516:78;3531:1;3523:4;:9;3516:78;;3549:8;;;;;:::i;:::-;;;;3580:2;3572:10;;;;;:::i;:::-;;;3516:78;;;3604:19;3636:6;3626:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3604:39;;3654:154;3670:1;3661:5;:10;3654:154;;3698:1;3688:11;;;;;:::i;:::-;;;3765:2;3757:5;:10;;;;:::i;:::-;3744:2;:24;;;;:::i;:::-;3731:39;;3714:6;3721;3714:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;3794:2;3785:11;;;;;:::i;:::-;;;3654:154;;;3832:6;3818:21;;;;;3124:723;;;;:::o;31034:266::-;31095:7;31154:1;31137:19;;:5;:19;;;;31115:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;31259:12;:19;31272:5;31259:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;31251:41;;31244:48;;31034:266;;;:::o;38321:1709::-;38436:35;38474:20;38486:7;38474:11;:20::i;:::-;38436:58;;38507:22;38549:13;:18;;;38533:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;38608:12;:10;:12::i;:::-;38584:36;;:20;38596:7;38584:11;:20::i;:::-;:36;;;38533:87;:154;;;;38637:50;38654:13;:18;;;38674:12;:10;:12::i;:::-;38637:16;:50::i;:::-;38533:154;38507:181;;38723:17;38701:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;38875:4;38853:26;;:13;:18;;;:26;;;38831:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;38978:1;38964:16;;:2;:16;;;;38956:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;39035:43;39057:4;39063:2;39067:7;39076:1;39035:21;:43::i;:::-;39143:49;39160:1;39164:7;39173:13;:18;;;39143:8;:49::i;:::-;39235:1;39205:12;:18;39218:4;39205:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;39275:1;39247:12;:16;39260:2;39247:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;39310:43;;;;;;;;39325:2;39310:43;;;;;;39336:15;39310:43;;;;;39287:11;:20;39299:7;39287:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39593:19;39625:1;39615:7;:11;;;;:::i;:::-;39593:33;;39682:1;39641:43;;:11;:24;39653:11;39641:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;39637:288;;;39705:20;39713:11;39705:7;:20::i;:::-;39701:213;;;39773:125;;;;;;;;39810:13;:18;;;39773:125;;;;;;39851:13;:28;;;39773:125;;;;;39746:11;:24;39758:11;39746:24;;;;;;;;;;;:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39701:213;39637:288;39961:7;39957:2;39942:27;;39951:4;39942:27;;;;;;;;;;;;39980:42;40001:4;40007:2;40011:7;40020:1;39980:20;:42::i;:::-;38321:1709;;;;;;:::o;36667:1400::-;36790:20;36813:12;;36790:35;;36858:1;36844:16;;:2;:16;;;;36836:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;37043:21;37051:12;37043:7;:21::i;:::-;37042:22;37034:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;37129:12;37117:8;:24;;37109:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;37193:61;37223:1;37227:2;37231:12;37245:8;37193:21;:61::i;:::-;37267:30;37300:12;:16;37313:2;37300:16;;;;;;;;;;;;;;;37267:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37346:135;;;;;;;;37402:8;37372:11;:19;;;:39;;;;:::i;:::-;37346:135;;;;;;37461:8;37426:11;:24;;;:44;;;;:::i;:::-;37346:135;;;;;37327:12;:16;37340:2;37327:16;;;;;;;;;;;;;;;:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37520:43;;;;;;;;37535:2;37520:43;;;;;;37546:15;37520:43;;;;;37492:11;:25;37504:12;37492:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37576:20;37599:12;37576:35;;37629:9;37624:325;37648:8;37644:1;:12;37624:325;;;37708:12;37704:2;37683:38;;37700:1;37683:38;;;;;;;;;;;;37762:59;37793:1;37797:2;37801:12;37815:5;37762:22;:59::i;:::-;37736:172;;;;;;;;;;;;:::i;:::-;;;;;;;;;37923:14;;;;;:::i;:::-;;;;37658:3;;;;;:::i;:::-;;;;37624:325;;;;37976:12;37961;:27;;;;37999:60;38028:1;38032:2;38036:12;38050:8;37999:20;:60::i;:::-;36667:1400;;;;;;:::o;42023:985::-;42178:4;42199:15;:2;:13;;;:15::i;:::-;42195:806;;;42268:2;42252:36;;;42311:12;:10;:12::i;:::-;42346:4;42373:7;42403:5;42252:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42231:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42631:1;42614:6;:13;:18;42610:321;;;42657:109;;;;;;;;;;:::i;:::-;;;;;;;;42610:321;42881:6;42875:13;42866:6;42862:2;42858:15;42851:38;42231:715;42501:45;;;42491:55;;;:6;:55;;;;42484:62;;;;;42195:806;42985:4;42978:11;;42023:985;;;;;;;:::o;43496:159::-;;;;;:::o;44067:158::-;;;;;:::o;9126:387::-;9186:4;9394:12;9461:7;9449:20;9441:28;;9504:1;9497:4;:8;9490:15;;;9126:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:143::-;;1077:6;1071:13;1062:22;;1093:33;1120:5;1093:33;:::i;:::-;1052:80;;;;:::o;1138:137::-;;1221:6;1208:20;1199:29;;1237:32;1263:5;1237:32;:::i;:::-;1189:86;;;;:::o;1281:141::-;;1368:6;1362:13;1353:22;;1384:32;1410:5;1384:32;:::i;:::-;1343:79;;;;:::o;1441:271::-;;1545:3;1538:4;1530:6;1526:17;1522:27;1512:2;;1563:1;1560;1553:12;1512:2;1603:6;1590:20;1628:78;1702:3;1694:6;1687:4;1679:6;1675:17;1628:78;:::i;:::-;1619:87;;1502:210;;;;;:::o;1732:273::-;;1837:3;1830:4;1822:6;1818:17;1814:27;1804:2;;1855:1;1852;1845:12;1804:2;1895:6;1882:20;1920:79;1995:3;1987:6;1980:4;1972:6;1968:17;1920:79;:::i;:::-;1911:88;;1794:211;;;;;:::o;2011:139::-;;2095:6;2082:20;2073:29;;2111:33;2138:5;2111:33;:::i;:::-;2063:87;;;;:::o;2156:262::-;;2264:2;2252:9;2243:7;2239:23;2235:32;2232:2;;;2280:1;2277;2270:12;2232:2;2323:1;2348:53;2393:7;2384:6;2373:9;2369:22;2348:53;:::i;:::-;2338:63;;2294:117;2222:196;;;;:::o;2424:407::-;;;2549:2;2537:9;2528:7;2524:23;2520:32;2517:2;;;2565:1;2562;2555:12;2517:2;2608:1;2633:53;2678:7;2669:6;2658:9;2654:22;2633:53;:::i;:::-;2623:63;;2579:117;2735:2;2761:53;2806:7;2797:6;2786:9;2782:22;2761:53;:::i;:::-;2751:63;;2706:118;2507:324;;;;;:::o;2837:552::-;;;;2979:2;2967:9;2958:7;2954:23;2950:32;2947:2;;;2995:1;2992;2985:12;2947:2;3038:1;3063:53;3108:7;3099:6;3088:9;3084:22;3063:53;:::i;:::-;3053:63;;3009:117;3165:2;3191:53;3236:7;3227:6;3216:9;3212:22;3191:53;:::i;:::-;3181:63;;3136:118;3293:2;3319:53;3364:7;3355:6;3344:9;3340:22;3319:53;:::i;:::-;3309:63;;3264:118;2937:452;;;;;:::o;3395:809::-;;;;;3563:3;3551:9;3542:7;3538:23;3534:33;3531:2;;;3580:1;3577;3570:12;3531:2;3623:1;3648:53;3693:7;3684:6;3673:9;3669:22;3648:53;:::i;:::-;3638:63;;3594:117;3750:2;3776:53;3821:7;3812:6;3801:9;3797:22;3776:53;:::i;:::-;3766:63;;3721:118;3878:2;3904:53;3949:7;3940:6;3929:9;3925:22;3904:53;:::i;:::-;3894:63;;3849:118;4034:2;4023:9;4019:18;4006:32;4065:18;4057:6;4054:30;4051:2;;;4097:1;4094;4087:12;4051:2;4125:62;4179:7;4170:6;4159:9;4155:22;4125:62;:::i;:::-;4115:72;;3977:220;3521:683;;;;;;;:::o;4210:401::-;;;4332:2;4320:9;4311:7;4307:23;4303:32;4300:2;;;4348:1;4345;4338:12;4300:2;4391:1;4416:53;4461:7;4452:6;4441:9;4437:22;4416:53;:::i;:::-;4406:63;;4362:117;4518:2;4544:50;4586:7;4577:6;4566:9;4562:22;4544:50;:::i;:::-;4534:60;;4489:115;4290:321;;;;;:::o;4617:407::-;;;4742:2;4730:9;4721:7;4717:23;4713:32;4710:2;;;4758:1;4755;4748:12;4710:2;4801:1;4826:53;4871:7;4862:6;4851:9;4847:22;4826:53;:::i;:::-;4816:63;;4772:117;4928:2;4954:53;4999:7;4990:6;4979:9;4975:22;4954:53;:::i;:::-;4944:63;;4899:118;4700:324;;;;;:::o;5030:284::-;;5149:2;5137:9;5128:7;5124:23;5120:32;5117:2;;;5165:1;5162;5155:12;5117:2;5208:1;5233:64;5289:7;5280:6;5269:9;5265:22;5233:64;:::i;:::-;5223:74;;5179:128;5107:207;;;;:::o;5320:260::-;;5427:2;5415:9;5406:7;5402:23;5398:32;5395:2;;;5443:1;5440;5433:12;5395:2;5486:1;5511:52;5555:7;5546:6;5535:9;5531:22;5511:52;:::i;:::-;5501:62;;5457:116;5385:195;;;;:::o;5586:282::-;;5704:2;5692:9;5683:7;5679:23;5675:32;5672:2;;;5720:1;5717;5710:12;5672:2;5763:1;5788:63;5843:7;5834:6;5823:9;5819:22;5788:63;:::i;:::-;5778:73;;5734:127;5662:206;;;;:::o;5874:375::-;;5992:2;5980:9;5971:7;5967:23;5963:32;5960:2;;;6008:1;6005;5998:12;5960:2;6079:1;6068:9;6064:17;6051:31;6109:18;6101:6;6098:30;6095:2;;;6141:1;6138;6131:12;6095:2;6169:63;6224:7;6215:6;6204:9;6200:22;6169:63;:::i;:::-;6159:73;;6022:220;5950:299;;;;:::o;6255:262::-;;6363:2;6351:9;6342:7;6338:23;6334:32;6331:2;;;6379:1;6376;6369:12;6331:2;6422:1;6447:53;6492:7;6483:6;6472:9;6468:22;6447:53;:::i;:::-;6437:63;;6393:117;6321:196;;;;:::o;6523:407::-;;;6648:2;6636:9;6627:7;6623:23;6619:32;6616:2;;;6664:1;6661;6654:12;6616:2;6707:1;6732:53;6777:7;6768:6;6757:9;6753:22;6732:53;:::i;:::-;6722:63;;6678:117;6834:2;6860:53;6905:7;6896:6;6885:9;6881:22;6860:53;:::i;:::-;6850:63;;6805:118;6606:324;;;;;:::o;6936:520::-;;;7071:2;7059:9;7050:7;7046:23;7042:32;7039:2;;;7087:1;7084;7077:12;7039:2;7130:1;7155:53;7200:7;7191:6;7180:9;7176:22;7155:53;:::i;:::-;7145:63;;7101:117;7285:2;7274:9;7270:18;7257:32;7316:18;7308:6;7305:30;7302:2;;;7348:1;7345;7338:12;7302:2;7376:63;7431:7;7422:6;7411:9;7407:22;7376:63;:::i;:::-;7366:73;;7228:221;7029:427;;;;;:::o;7462:179::-;;7552:46;7594:3;7586:6;7552:46;:::i;:::-;7630:4;7625:3;7621:14;7607:28;;7542:99;;;;:::o;7647:118::-;7734:24;7752:5;7734:24;:::i;:::-;7729:3;7722:37;7712:53;;:::o;7801:732::-;;7949:54;7997:5;7949:54;:::i;:::-;8019:86;8098:6;8093:3;8019:86;:::i;:::-;8012:93;;8129:56;8179:5;8129:56;:::i;:::-;8208:7;8239:1;8224:284;8249:6;8246:1;8243:13;8224:284;;;8325:6;8319:13;8352:63;8411:3;8396:13;8352:63;:::i;:::-;8345:70;;8438:60;8491:6;8438:60;:::i;:::-;8428:70;;8284:224;8271:1;8268;8264:9;8259:14;;8224:284;;;8228:14;8524:3;8517:10;;7925:608;;;;;;;:::o;8539:109::-;8620:21;8635:5;8620:21;:::i;:::-;8615:3;8608:34;8598:50;;:::o;8654:360::-;;8768:38;8800:5;8768:38;:::i;:::-;8822:70;8885:6;8880:3;8822:70;:::i;:::-;8815:77;;8901:52;8946:6;8941:3;8934:4;8927:5;8923:16;8901:52;:::i;:::-;8978:29;9000:6;8978:29;:::i;:::-;8973:3;8969:39;8962:46;;8744:270;;;;;:::o;9020:373::-;;9152:38;9184:5;9152:38;:::i;:::-;9206:88;9287:6;9282:3;9206:88;:::i;:::-;9199:95;;9303:52;9348:6;9343:3;9336:4;9329:5;9325:16;9303:52;:::i;:::-;9380:6;9375:3;9371:16;9364:23;;9128:265;;;;;:::o;9421:849::-;;9563:5;9557:12;9592:36;9618:9;9592:36;:::i;:::-;9644:88;9725:6;9720:3;9644:88;:::i;:::-;9637:95;;9763:1;9752:9;9748:17;9779:1;9774:137;;;;9925:1;9920:344;;;;9741:523;;9774:137;9858:4;9854:9;9843;9839:25;9834:3;9827:38;9894:6;9889:3;9885:16;9878:23;;9774:137;;9920:344;9987:41;10022:5;9987:41;:::i;:::-;10050:1;10064:154;10078:6;10075:1;10072:13;10064:154;;;10152:7;10146:14;10142:1;10137:3;10133:11;10126:35;10202:1;10193:7;10189:15;10178:26;;10100:4;10097:1;10093:12;10088:17;;10064:154;;;10247:6;10242:3;10238:16;10231:23;;9927:337;;9741:523;;9530:740;;;;;;:::o;10276:167::-;10381:55;10430:5;10381:55;:::i;:::-;10376:3;10369:68;10359:84;;:::o;10449:364::-;;10565:39;10598:5;10565:39;:::i;:::-;10620:71;10684:6;10679:3;10620:71;:::i;:::-;10613:78;;10700:52;10745:6;10740:3;10733:4;10726:5;10722:16;10700:52;:::i;:::-;10777:29;10799:6;10777:29;:::i;:::-;10772:3;10768:39;10761:46;;10541:272;;;;;:::o;10819:377::-;;10953:39;10986:5;10953:39;:::i;:::-;11008:89;11090:6;11085:3;11008:89;:::i;:::-;11001:96;;11106:52;11151:6;11146:3;11139:4;11132:5;11128:16;11106:52;:::i;:::-;11183:6;11178:3;11174:16;11167:23;;10929:267;;;;;:::o;11202:366::-;;11365:67;11429:2;11424:3;11365:67;:::i;:::-;11358:74;;11462:34;11458:1;11453:3;11449:11;11442:55;11528:4;11523:2;11518:3;11514:12;11507:26;11559:2;11554:3;11550:12;11543:19;;11348:220;;;:::o;11574:378::-;;11737:67;11801:2;11796:3;11737:67;:::i;:::-;11730:74;;11834:34;11830:1;11825:3;11821:11;11814:55;11900:16;11895:2;11890:3;11886:12;11879:38;11943:2;11938:3;11934:12;11927:19;;11720:232;;;:::o;11958:370::-;;12121:67;12185:2;12180:3;12121:67;:::i;:::-;12114:74;;12218:34;12214:1;12209:3;12205:11;12198:55;12284:8;12279:2;12274:3;12270:12;12263:30;12319:2;12314:3;12310:12;12303:19;;12104:224;;;:::o;12334:374::-;;12497:67;12561:2;12556:3;12497:67;:::i;:::-;12490:74;;12594:34;12590:1;12585:3;12581:11;12574:55;12660:12;12655:2;12650:3;12646:12;12639:34;12699:2;12694:3;12690:12;12683:19;;12480:228;;;:::o;12714:367::-;;12877:67;12941:2;12936:3;12877:67;:::i;:::-;12870:74;;12974:34;12970:1;12965:3;12961:11;12954:55;13040:5;13035:2;13030:3;13026:12;13019:27;13072:2;13067:3;13063:12;13056:19;;12860:221;;;:::o;13087:369::-;;13250:67;13314:2;13309:3;13250:67;:::i;:::-;13243:74;;13347:34;13343:1;13338:3;13334:11;13327:55;13413:7;13408:2;13403:3;13399:12;13392:29;13447:2;13442:3;13438:12;13431:19;;13233:223;;;:::o;13462:396::-;;13625:67;13689:2;13684:3;13625:67;:::i;:::-;13618:74;;13722:34;13718:1;13713:3;13709:11;13702:55;13788:34;13783:2;13778:3;13774:12;13767:56;13849:2;13844:3;13840:12;13833:19;;13608:250;;;:::o;13864:381::-;;14027:67;14091:2;14086:3;14027:67;:::i;:::-;14020:74;;14124:34;14120:1;14115:3;14111:11;14104:55;14190:19;14185:2;14180:3;14176:12;14169:41;14236:2;14231:3;14227:12;14220:19;;14010:235;;;:::o;14251:389::-;;14414:67;14478:2;14473:3;14414:67;:::i;:::-;14407:74;;14511:34;14507:1;14502:3;14498:11;14491:55;14577:27;14572:2;14567:3;14563:12;14556:49;14631:2;14626:3;14622:12;14615:19;;14397:243;;;:::o;14646:367::-;;14809:67;14873:2;14868:3;14809:67;:::i;:::-;14802:74;;14906:34;14902:1;14897:3;14893:11;14886:55;14972:5;14967:2;14962:3;14958:12;14951:27;15004:2;14999:3;14995:12;14988:19;;14792:221;;;:::o;15019:375::-;;15182:67;15246:2;15241:3;15182:67;:::i;:::-;15175:74;;15279:34;15275:1;15270:3;15266:11;15259:55;15345:13;15340:2;15335:3;15331:12;15324:35;15385:2;15380:3;15376:12;15369:19;;15165:229;;;:::o;15400:370::-;;15563:67;15627:2;15622:3;15563:67;:::i;:::-;15556:74;;15660:34;15656:1;15651:3;15647:11;15640:55;15726:8;15721:2;15716:3;15712:12;15705:30;15761:2;15756:3;15752:12;15745:19;;15546:224;;;:::o;15776:337::-;;15957:84;16039:1;16034:3;15957:84;:::i;:::-;15950:91;;16071:7;16067:1;16062:3;16058:11;16051:28;16105:1;16100:3;16096:11;16089:18;;15940:173;;;:::o;16119:330::-;;16282:67;16346:2;16341:3;16282:67;:::i;:::-;16275:74;;16379:34;16375:1;16370:3;16366:11;16359:55;16440:2;16435:3;16431:12;16424:19;;16265:184;;;:::o;16455:379::-;;16618:67;16682:2;16677:3;16618:67;:::i;:::-;16611:74;;16715:34;16711:1;16706:3;16702:11;16695:55;16781:17;16776:2;16771:3;16767:12;16760:39;16825:2;16820:3;16816:12;16809:19;;16601:233;;;:::o;16840:324::-;;17003:67;17067:2;17062:3;17003:67;:::i;:::-;16996:74;;17100:28;17096:1;17091:3;17087:11;17080:49;17155:2;17150:3;17146:12;17139:19;;16986:178;;;:::o;17170:382::-;;17333:67;17397:2;17392:3;17333:67;:::i;:::-;17326:74;;17430:34;17426:1;17421:3;17417:11;17410:55;17496:20;17491:2;17486:3;17482:12;17475:42;17543:2;17538:3;17534:12;17527:19;;17316:236;;;:::o;17558:317::-;;17721:67;17785:2;17780:3;17721:67;:::i;:::-;17714:74;;17818:21;17814:1;17809:3;17805:11;17798:42;17866:2;17861:3;17857:12;17850:19;;17704:171;;;:::o;17881:380::-;;18044:67;18108:2;18103:3;18044:67;:::i;:::-;18037:74;;18141:34;18137:1;18132:3;18128:11;18121:55;18207:18;18202:2;18197:3;18193:12;18186:40;18252:2;18247:3;18243:12;18236:19;;18027:234;;;:::o;18267:366::-;;18430:67;18494:2;18489:3;18430:67;:::i;:::-;18423:74;;18527:34;18523:1;18518:3;18514:11;18507:55;18593:4;18588:2;18583:3;18579:12;18572:26;18624:2;18619:3;18615:12;18608:19;;18413:220;;;:::o;18639:383::-;;18802:67;18866:2;18861:3;18802:67;:::i;:::-;18795:74;;18899:34;18895:1;18890:3;18886:11;18879:55;18965:21;18960:2;18955:3;18951:12;18944:43;19013:2;19008:3;19004:12;18997:19;;18785:237;;;:::o;19028:327::-;;19191:67;19255:2;19250:3;19191:67;:::i;:::-;19184:74;;19288:31;19284:1;19279:3;19275:11;19268:52;19346:2;19341:3;19337:12;19330:19;;19174:181;;;:::o;19361:365::-;;19524:67;19588:2;19583:3;19524:67;:::i;:::-;19517:74;;19621:34;19617:1;19612:3;19608:11;19601:55;19687:3;19682:2;19677:3;19673:12;19666:25;19717:2;19712:3;19708:12;19701:19;;19507:219;;;:::o;19732:378::-;;19895:67;19959:2;19954:3;19895:67;:::i;:::-;19888:74;;19992:34;19988:1;19983:3;19979:11;19972:55;20058:16;20053:2;20048:3;20044:12;20037:38;20101:2;20096:3;20092:12;20085:19;;19878:232;;;:::o;20116:379::-;;20279:67;20343:2;20338:3;20279:67;:::i;:::-;20272:74;;20376:34;20372:1;20367:3;20363:11;20356:55;20442:17;20437:2;20432:3;20428:12;20421:39;20486:2;20481:3;20477:12;20470:19;;20262:233;;;:::o;20501:377::-;;20664:67;20728:2;20723:3;20664:67;:::i;:::-;20657:74;;20761:34;20757:1;20752:3;20748:11;20741:55;20827:15;20822:2;20817:3;20813:12;20806:37;20869:2;20864:3;20860:12;20853:19;;20647:231;;;:::o;20884:366::-;;21047:67;21111:2;21106:3;21047:67;:::i;:::-;21040:74;;21144:34;21140:1;21135:3;21131:11;21124:55;21210:4;21205:2;21200:3;21196:12;21189:26;21241:2;21236:3;21232:12;21225:19;;21030:220;;;:::o;21256:330::-;;21419:67;21483:2;21478:3;21419:67;:::i;:::-;21412:74;;21516:34;21512:1;21507:3;21503:11;21496:55;21577:2;21572:3;21568:12;21561:19;;21402:184;;;:::o;21592:108::-;21669:24;21687:5;21669:24;:::i;:::-;21664:3;21657:37;21647:53;;:::o;21706:118::-;21793:24;21811:5;21793:24;:::i;:::-;21788:3;21781:37;21771:53;;:::o;21830:271::-;;21982:93;22071:3;22062:6;21982:93;:::i;:::-;21975:100;;22092:3;22085:10;;21964:137;;;;:::o;22107:273::-;;22260:94;22350:3;22341:6;22260:94;:::i;:::-;22253:101;;22371:3;22364:10;;22242:138;;;;:::o;22386:701::-;;22689:95;22780:3;22771:6;22689:95;:::i;:::-;22682:102;;22801:95;22892:3;22883:6;22801:95;:::i;:::-;22794:102;;22913:148;23057:3;22913:148;:::i;:::-;22906:155;;23078:3;23071:10;;22671:416;;;;;:::o;23093:222::-;;23224:2;23213:9;23209:18;23201:26;;23237:71;23305:1;23294:9;23290:17;23281:6;23237:71;:::i;:::-;23191:124;;;;:::o;23321:332::-;;23480:2;23469:9;23465:18;23457:26;;23493:71;23561:1;23550:9;23546:17;23537:6;23493:71;:::i;:::-;23574:72;23642:2;23631:9;23627:18;23618:6;23574:72;:::i;:::-;23447:206;;;;;:::o;23659:640::-;;23892:3;23881:9;23877:19;23869:27;;23906:71;23974:1;23963:9;23959:17;23950:6;23906:71;:::i;:::-;23987:72;24055:2;24044:9;24040:18;24031:6;23987:72;:::i;:::-;24069;24137:2;24126:9;24122:18;24113:6;24069:72;:::i;:::-;24188:9;24182:4;24178:20;24173:2;24162:9;24158:18;24151:48;24216:76;24287:4;24278:6;24216:76;:::i;:::-;24208:84;;23859:440;;;;;;;:::o;24305:373::-;;24486:2;24475:9;24471:18;24463:26;;24535:9;24529:4;24525:20;24521:1;24510:9;24506:17;24499:47;24563:108;24666:4;24657:6;24563:108;:::i;:::-;24555:116;;24453:225;;;;:::o;24684:210::-;;24809:2;24798:9;24794:18;24786:26;;24822:65;24884:1;24873:9;24869:17;24860:6;24822:65;:::i;:::-;24776:118;;;;:::o;24900:258::-;;25049:2;25038:9;25034:18;25026:26;;25062:89;25148:1;25137:9;25133:17;25124:6;25062:89;:::i;:::-;25016:142;;;;:::o;25164:313::-;;25315:2;25304:9;25300:18;25292:26;;25364:9;25358:4;25354:20;25350:1;25339:9;25335:17;25328:47;25392:78;25465:4;25456:6;25392:78;:::i;:::-;25384:86;;25282:195;;;;:::o;25483:419::-;;25687:2;25676:9;25672:18;25664:26;;25736:9;25730:4;25726:20;25722:1;25711:9;25707:17;25700:47;25764:131;25890:4;25764:131;:::i;:::-;25756:139;;25654:248;;;:::o;25908:419::-;;26112:2;26101:9;26097:18;26089:26;;26161:9;26155:4;26151:20;26147:1;26136:9;26132:17;26125:47;26189:131;26315:4;26189:131;:::i;:::-;26181:139;;26079:248;;;:::o;26333:419::-;;26537:2;26526:9;26522:18;26514:26;;26586:9;26580:4;26576:20;26572:1;26561:9;26557:17;26550:47;26614:131;26740:4;26614:131;:::i;:::-;26606:139;;26504:248;;;:::o;26758:419::-;;26962:2;26951:9;26947:18;26939:26;;27011:9;27005:4;27001:20;26997:1;26986:9;26982:17;26975:47;27039:131;27165:4;27039:131;:::i;:::-;27031:139;;26929:248;;;:::o;27183:419::-;;27387:2;27376:9;27372:18;27364:26;;27436:9;27430:4;27426:20;27422:1;27411:9;27407:17;27400:47;27464:131;27590:4;27464:131;:::i;:::-;27456:139;;27354:248;;;:::o;27608:419::-;;27812:2;27801:9;27797:18;27789:26;;27861:9;27855:4;27851:20;27847:1;27836:9;27832:17;27825:47;27889:131;28015:4;27889:131;:::i;:::-;27881:139;;27779:248;;;:::o;28033:419::-;;28237:2;28226:9;28222:18;28214:26;;28286:9;28280:4;28276:20;28272:1;28261:9;28257:17;28250:47;28314:131;28440:4;28314:131;:::i;:::-;28306:139;;28204:248;;;:::o;28458:419::-;;28662:2;28651:9;28647:18;28639:26;;28711:9;28705:4;28701:20;28697:1;28686:9;28682:17;28675:47;28739:131;28865:4;28739:131;:::i;:::-;28731:139;;28629:248;;;:::o;28883:419::-;;29087:2;29076:9;29072:18;29064:26;;29136:9;29130:4;29126:20;29122:1;29111:9;29107:17;29100:47;29164:131;29290:4;29164:131;:::i;:::-;29156:139;;29054:248;;;:::o;29308:419::-;;29512:2;29501:9;29497:18;29489:26;;29561:9;29555:4;29551:20;29547:1;29536:9;29532:17;29525:47;29589:131;29715:4;29589:131;:::i;:::-;29581:139;;29479:248;;;:::o;29733:419::-;;29937:2;29926:9;29922:18;29914:26;;29986:9;29980:4;29976:20;29972:1;29961:9;29957:17;29950:47;30014:131;30140:4;30014:131;:::i;:::-;30006:139;;29904:248;;;:::o;30158:419::-;;30362:2;30351:9;30347:18;30339:26;;30411:9;30405:4;30401:20;30397:1;30386:9;30382:17;30375:47;30439:131;30565:4;30439:131;:::i;:::-;30431:139;;30329:248;;;:::o;30583:419::-;;30787:2;30776:9;30772:18;30764:26;;30836:9;30830:4;30826:20;30822:1;30811:9;30807:17;30800:47;30864:131;30990:4;30864:131;:::i;:::-;30856:139;;30754:248;;;:::o;31008:419::-;;31212:2;31201:9;31197:18;31189:26;;31261:9;31255:4;31251:20;31247:1;31236:9;31232:17;31225:47;31289:131;31415:4;31289:131;:::i;:::-;31281:139;;31179:248;;;:::o;31433:419::-;;31637:2;31626:9;31622:18;31614:26;;31686:9;31680:4;31676:20;31672:1;31661:9;31657:17;31650:47;31714:131;31840:4;31714:131;:::i;:::-;31706:139;;31604:248;;;:::o;31858:419::-;;32062:2;32051:9;32047:18;32039:26;;32111:9;32105:4;32101:20;32097:1;32086:9;32082:17;32075:47;32139:131;32265:4;32139:131;:::i;:::-;32131:139;;32029:248;;;:::o;32283:419::-;;32487:2;32476:9;32472:18;32464:26;;32536:9;32530:4;32526:20;32522:1;32511:9;32507:17;32500:47;32564:131;32690:4;32564:131;:::i;:::-;32556:139;;32454:248;;;:::o;32708:419::-;;32912:2;32901:9;32897:18;32889:26;;32961:9;32955:4;32951:20;32947:1;32936:9;32932:17;32925:47;32989:131;33115:4;32989:131;:::i;:::-;32981:139;;32879:248;;;:::o;33133:419::-;;33337:2;33326:9;33322:18;33314:26;;33386:9;33380:4;33376:20;33372:1;33361:9;33357:17;33350:47;33414:131;33540:4;33414:131;:::i;:::-;33406:139;;33304:248;;;:::o;33558:419::-;;33762:2;33751:9;33747:18;33739:26;;33811:9;33805:4;33801:20;33797:1;33786:9;33782:17;33775:47;33839:131;33965:4;33839:131;:::i;:::-;33831:139;;33729:248;;;:::o;33983:419::-;;34187:2;34176:9;34172:18;34164:26;;34236:9;34230:4;34226:20;34222:1;34211:9;34207:17;34200:47;34264:131;34390:4;34264:131;:::i;:::-;34256:139;;34154:248;;;:::o;34408:419::-;;34612:2;34601:9;34597:18;34589:26;;34661:9;34655:4;34651:20;34647:1;34636:9;34632:17;34625:47;34689:131;34815:4;34689:131;:::i;:::-;34681:139;;34579:248;;;:::o;34833:419::-;;35037:2;35026:9;35022:18;35014:26;;35086:9;35080:4;35076:20;35072:1;35061:9;35057:17;35050:47;35114:131;35240:4;35114:131;:::i;:::-;35106:139;;35004:248;;;:::o;35258:419::-;;35462:2;35451:9;35447:18;35439:26;;35511:9;35505:4;35501:20;35497:1;35486:9;35482:17;35475:47;35539:131;35665:4;35539:131;:::i;:::-;35531:139;;35429:248;;;:::o;35683:419::-;;35887:2;35876:9;35872:18;35864:26;;35936:9;35930:4;35926:20;35922:1;35911:9;35907:17;35900:47;35964:131;36090:4;35964:131;:::i;:::-;35956:139;;35854:248;;;:::o;36108:419::-;;36312:2;36301:9;36297:18;36289:26;;36361:9;36355:4;36351:20;36347:1;36336:9;36332:17;36325:47;36389:131;36515:4;36389:131;:::i;:::-;36381:139;;36279:248;;;:::o;36533:419::-;;36737:2;36726:9;36722:18;36714:26;;36786:9;36780:4;36776:20;36772:1;36761:9;36757:17;36750:47;36814:131;36940:4;36814:131;:::i;:::-;36806:139;;36704:248;;;:::o;36958:222::-;;37089:2;37078:9;37074:18;37066:26;;37102:71;37170:1;37159:9;37155:17;37146:6;37102:71;:::i;:::-;37056:124;;;;:::o;37186:423::-;;37365:2;37354:9;37350:18;37342:26;;37378:71;37446:1;37435:9;37431:17;37422:6;37378:71;:::i;:::-;37496:9;37490:4;37486:20;37481:2;37470:9;37466:18;37459:48;37524:78;37597:4;37588:6;37524:78;:::i;:::-;37516:86;;37332:277;;;;;:::o;37615:283::-;;37681:2;37675:9;37665:19;;37723:4;37715:6;37711:17;37830:6;37818:10;37815:22;37794:18;37782:10;37779:34;37776:62;37773:2;;;37841:18;;:::i;:::-;37773:2;37881:10;37877:2;37870:22;37655:243;;;;:::o;37904:331::-;;38055:18;38047:6;38044:30;38041:2;;;38077:18;;:::i;:::-;38041:2;38162:4;38158:9;38151:4;38143:6;38139:17;38135:33;38127:41;;38223:4;38217;38213:15;38205:23;;37970:265;;;:::o;38241:332::-;;38393:18;38385:6;38382:30;38379:2;;;38415:18;;:::i;:::-;38379:2;38500:4;38496:9;38489:4;38481:6;38477:17;38473:33;38465:41;;38561:4;38555;38551:15;38543:23;;38308:265;;;:::o;38579:132::-;;38669:3;38661:11;;38699:4;38694:3;38690:14;38682:22;;38651:60;;;:::o;38717:144::-;;38792:3;38784:11;;38815:3;38812:1;38805:14;38849:4;38846:1;38836:18;38828:26;;38774:87;;;:::o;38867:114::-;;38968:5;38962:12;38952:22;;38941:40;;;:::o;38987:98::-;;39072:5;39066:12;39056:22;;39045:40;;;:::o;39091:99::-;;39177:5;39171:12;39161:22;;39150:40;;;:::o;39196:113::-;;39298:4;39293:3;39289:14;39281:22;;39271:38;;;:::o;39315:184::-;;39448:6;39443:3;39436:19;39488:4;39483:3;39479:14;39464:29;;39426:73;;;;:::o;39505:168::-;;39622:6;39617:3;39610:19;39662:4;39657:3;39653:14;39638:29;;39600:73;;;;:::o;39679:147::-;;39817:3;39802:18;;39792:34;;;;:::o;39832:169::-;;39950:6;39945:3;39938:19;39990:4;39985:3;39981:14;39966:29;;39928:73;;;;:::o;40007:148::-;;40146:3;40131:18;;40121:34;;;;:::o;40161:273::-;;40220:20;40238:1;40220:20;:::i;:::-;40215:25;;40254:20;40272:1;40254:20;:::i;:::-;40249:25;;40376:1;40340:34;40336:42;40333:1;40330:49;40327:2;;;40382:18;;:::i;:::-;40327:2;40426:1;40423;40419:9;40412:16;;40205:229;;;;:::o;40440:305::-;;40499:20;40517:1;40499:20;:::i;:::-;40494:25;;40533:20;40551:1;40533:20;:::i;:::-;40528:25;;40687:1;40619:66;40615:74;40612:1;40609:81;40606:2;;;40693:18;;:::i;:::-;40606:2;40737:1;40734;40730:9;40723:16;;40484:261;;;;:::o;40751:185::-;;40808:20;40826:1;40808:20;:::i;:::-;40803:25;;40842:20;40860:1;40842:20;:::i;:::-;40837:25;;40881:1;40871:2;;40886:18;;:::i;:::-;40871:2;40928:1;40925;40921:9;40916:14;;40793:143;;;;:::o;40942:348::-;;41005:20;41023:1;41005:20;:::i;:::-;41000:25;;41039:20;41057:1;41039:20;:::i;:::-;41034:25;;41227:1;41159:66;41155:74;41152:1;41149:81;41144:1;41137:9;41130:17;41126:105;41123:2;;;41234:18;;:::i;:::-;41123:2;41282:1;41279;41275:9;41264:20;;40990:300;;;;:::o;41296:191::-;;41356:20;41374:1;41356:20;:::i;:::-;41351:25;;41390:20;41408:1;41390:20;:::i;:::-;41385:25;;41429:1;41426;41423:8;41420:2;;;41434:18;;:::i;:::-;41420:2;41479:1;41476;41472:9;41464:17;;41341:146;;;;:::o;41493:191::-;;41553:20;41571:1;41553:20;:::i;:::-;41548:25;;41587:20;41605:1;41587:20;:::i;:::-;41582:25;;41626:1;41623;41620:8;41617:2;;;41631:18;;:::i;:::-;41617:2;41676:1;41673;41669:9;41661:17;;41538:146;;;;:::o;41690:96::-;;41756:24;41774:5;41756:24;:::i;:::-;41745:35;;41735:51;;;:::o;41792:90::-;;41869:5;41862:13;41855:21;41844:32;;41834:48;;;:::o;41888:77::-;;41954:5;41943:16;;41933:32;;;:::o;41971:149::-;;42047:66;42040:5;42036:78;42025:89;;42015:105;;;:::o;42126:118::-;;42203:34;42196:5;42192:46;42181:57;;42171:73;;;:::o;42250:126::-;;42327:42;42320:5;42316:54;42305:65;;42295:81;;;:::o;42382:77::-;;42448:5;42437:16;;42427:32;;;:::o;42465:162::-;;42566:55;42615:5;42566:55;:::i;:::-;42553:68;;42543:84;;;:::o;42633:131::-;;42734:24;42752:5;42734:24;:::i;:::-;42721:37;;42711:53;;;:::o;42770:154::-;42854:6;42849:3;42844;42831:30;42916:1;42907:6;42902:3;42898:16;42891:27;42821:103;;;:::o;42930:307::-;42998:1;43008:113;43022:6;43019:1;43016:13;43008:113;;;43107:1;43102:3;43098:11;43092:18;43088:1;43083:3;43079:11;43072:39;43044:2;43041:1;43037:10;43032:15;;43008:113;;;43139:6;43136:1;43133:13;43130:2;;;43219:1;43210:6;43205:3;43201:16;43194:27;43130:2;42979:258;;;;:::o;43243:171::-;;43305:24;43323:5;43305:24;:::i;:::-;43296:33;;43351:4;43344:5;43341:15;43338:2;;;43359:18;;:::i;:::-;43338:2;43406:1;43399:5;43395:13;43388:20;;43286:128;;;:::o;43420:320::-;;43501:1;43495:4;43491:12;43481:22;;43548:1;43542:4;43538:12;43569:18;43559:2;;43625:4;43617:6;43613:17;43603:27;;43559:2;43687;43679:6;43676:14;43656:18;43653:38;43650:2;;;43706:18;;:::i;:::-;43650:2;43471:269;;;;:::o;43746:233::-;;43808:24;43826:5;43808:24;:::i;:::-;43799:33;;43854:66;43847:5;43844:77;43841:2;;;43924:18;;:::i;:::-;43841:2;43971:1;43964:5;43960:13;43953:20;;43789:190;;;:::o;43985:176::-;;44034:20;44052:1;44034:20;:::i;:::-;44029:25;;44068:20;44086:1;44068:20;:::i;:::-;44063:25;;44107:1;44097:2;;44112:18;;:::i;:::-;44097:2;44153:1;44150;44146:9;44141:14;;44019:142;;;;:::o;44167:180::-;44215:77;44212:1;44205:88;44312:4;44309:1;44302:15;44336:4;44333:1;44326:15;44353:180;44401:77;44398:1;44391:88;44498:4;44495:1;44488:15;44522:4;44519:1;44512:15;44539:180;44587:77;44584:1;44577:88;44684:4;44681:1;44674:15;44708:4;44705:1;44698:15;44725:180;44773:77;44770:1;44763:88;44870:4;44867:1;44860:15;44894:4;44891:1;44884:15;44911:102;;45003:2;44999:7;44994:2;44987:5;44983:14;44979:28;44969:38;;44959:54;;;:::o;45019:122::-;45092:24;45110:5;45092:24;:::i;:::-;45085:5;45082:35;45072:2;;45131:1;45128;45121:12;45072:2;45062:79;:::o;45147:116::-;45217:21;45232:5;45217:21;:::i;:::-;45210:5;45207:32;45197:2;;45253:1;45250;45243:12;45197:2;45187:76;:::o;45269:122::-;45342:24;45360:5;45342:24;:::i;:::-;45335:5;45332:35;45322:2;;45381:1;45378;45371:12;45322:2;45312:79;:::o;45397:120::-;45469:23;45486:5;45469:23;:::i;:::-;45462:5;45459:34;45449:2;;45507:1;45504;45497:12;45449:2;45439:78;:::o;45523:122::-;45596:24;45614:5;45596:24;:::i;:::-;45589:5;45586:35;45576:2;;45635:1;45632;45625:12;45576:2;45566:79;:::o

Swarm Source

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