ETH Price: $3,335.09 (-4.25%)
Gas: 4 Gwei

Token

Munie (MNI)
 

Overview

Max Total Supply

0 MNI

Holders

25

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
206 MNI
0x6a9c80da002b4594000a822b8984c1a46b5b6f91
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:
Munie

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


// File: contracts/utils/Counters.sol

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

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

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

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

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


// File: contracts/utils/Strings.sol

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

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

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

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

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


// File: contracts/utils/Context.sol

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

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


// File: contracts/access/Ownable.sol

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

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

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

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

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

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

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

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


// File: contracts/utils/Address.sol

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    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: contracts/token/ERC721/IERC721Receiver.sol

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


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

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


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

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


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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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


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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


// File: contracts/token/ERC721/extensions/ERC721URIStorage.sol

/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

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

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}


// File: contracts/munie.sol
// Munie contract

contract Munie is ERC721, ERC721URIStorage, Ownable {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;
    mapping(string => uint8) hashes;
    
    constructor() ERC721("Munie", "MNI") {}

    function mintItem(address recipient, string memory hash, string memory metadata)
        public
        onlyOwner
        returns (uint256)
    {
        require(hashes[hash] != 1);
        hashes[hash] = 1;
        _tokenIdCounter.increment();
        uint256 newItemId = _tokenIdCounter.current();
        _mint(recipient, newItemId);
        _setTokenURI(newItemId, metadata);
        return newItemId;
    }

    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"string","name":"hash","type":"string"},{"internalType":"string","name":"metadata","type":"string"}],"name":"mintItem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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"}]

60806040523480156200001157600080fd5b506040518060400160405280600581526020017f4d756e69650000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4d4e490000000000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620001a6565b508060019080519060200190620000af929190620001a6565b505050620000d2620000c6620000d860201b60201c565b620000e060201b60201c565b620002bb565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001b49062000256565b90600052602060002090601f016020900481019282620001d8576000855562000224565b82601f10620001f357805160ff191683800117855562000224565b8280016001018555821562000224579182015b828111156200022357825182559160200191906001019062000206565b5b50905062000233919062000237565b5090565b5b808211156200025257600081600090555060010162000238565b5090565b600060028204905060018216806200026f57607f821691505b602082108114156200028657620002856200028c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61308480620002cb6000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c8063715018a6116100a2578063a22cb46511610071578063a22cb465146102b8578063b88d4fde146102d4578063c87b56dd146102f0578063e985e9c514610320578063f2fde38b146103505761010b565b8063715018a6146102425780638da5cb5b1461024c57806395d89b411461026a5780639ada3797146102885761010b565b806323b872dd116100de57806323b872dd146101aa57806342842e0e146101c65780636352211e146101e257806370a08231146102125761010b565b806301ffc9a71461011057806306fdde0314610140578063081812fc1461015e578063095ea7b31461018e575b600080fd5b61012a6004803603810190610125919061201c565b61036c565b604051610137919061247f565b60405180910390f35b61014861044e565b604051610155919061249a565b60405180910390f35b6101786004803603810190610173919061206e565b6104e0565b6040516101859190612418565b60405180910390f35b6101a860048036038101906101a39190611fe0565b610565565b005b6101c460048036038101906101bf9190611e5b565b61067d565b005b6101e060048036038101906101db9190611e5b565b6106dd565b005b6101fc60048036038101906101f7919061206e565b6106fd565b6040516102099190612418565b60405180910390f35b61022c60048036038101906102279190611df6565b6107af565b60405161023991906126fc565b60405180910390f35b61024a610867565b005b6102546108ef565b6040516102619190612418565b60405180910390f35b610272610919565b60405161027f919061249a565b60405180910390f35b6102a2600480360381019061029d9190611f61565b6109ab565b6040516102af91906126fc565b60405180910390f35b6102d260048036038101906102cd9190611f25565b610ad4565b005b6102ee60048036038101906102e99190611eaa565b610c55565b005b61030a6004803603810190610305919061206e565b610cb7565b604051610317919061249a565b60405180910390f35b61033a60048036038101906103359190611e1f565b610cc9565b604051610347919061247f565b60405180910390f35b61036a60048036038101906103659190611df6565b610d5d565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061043757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610447575061044682610e55565b5b9050919050565b60606000805461045d90612952565b80601f016020809104026020016040519081016040528092919081815260200182805461048990612952565b80156104d65780601f106104ab576101008083540402835291602001916104d6565b820191906000526020600020905b8154815290600101906020018083116104b957829003601f168201915b5050505050905090565b60006104eb82610ebf565b61052a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105219061263c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610570826106fd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156105e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d8906126bc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610600610f2b565b73ffffffffffffffffffffffffffffffffffffffff16148061062f575061062e81610629610f2b565b610cc9565b5b61066e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106659061257c565b60405180910390fd5b6106788383610f33565b505050565b61068e610688610f2b565b82610fec565b6106cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c4906126dc565b60405180910390fd5b6106d88383836110ca565b505050565b6106f883838360405180602001604052806000815250610c55565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156107a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079d906125bc565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610820576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108179061259c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61086f610f2b565b73ffffffffffffffffffffffffffffffffffffffff1661088d6108ef565b73ffffffffffffffffffffffffffffffffffffffff16146108e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108da9061265c565b60405180910390fd5b6108ed6000611326565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461092890612952565b80601f016020809104026020016040519081016040528092919081815260200182805461095490612952565b80156109a15780601f10610976576101008083540402835291602001916109a1565b820191906000526020600020905b81548152906001019060200180831161098457829003601f168201915b5050505050905090565b60006109b5610f2b565b73ffffffffffffffffffffffffffffffffffffffff166109d36108ef565b73ffffffffffffffffffffffffffffffffffffffff1614610a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a209061265c565b60405180910390fd5b6001600984604051610a3b91906123dd565b908152602001604051809103902060009054906101000a900460ff1660ff161415610a6557600080fd5b6001600984604051610a7791906123dd565b908152602001604051809103902060006101000a81548160ff021916908360ff160217905550610aa760086113ec565b6000610ab36008611402565b9050610abf8582611410565b610ac981846115de565b809150509392505050565b610adc610f2b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b419061253c565b60405180910390fd5b8060056000610b57610f2b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610c04610f2b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610c49919061247f565b60405180910390a35050565b610c66610c60610f2b565b83610fec565b610ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9c906126dc565b60405180910390fd5b610cb184848484611652565b50505050565b6060610cc2826116ae565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610d65610f2b565b73ffffffffffffffffffffffffffffffffffffffff16610d836108ef565b73ffffffffffffffffffffffffffffffffffffffff1614610dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd09061265c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e40906124dc565b60405180910390fd5b610e5281611326565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610fa6836106fd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610ff782610ebf565b611036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102d9061255c565b60405180910390fd5b6000611041836106fd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806110b057508373ffffffffffffffffffffffffffffffffffffffff16611098846104e0565b73ffffffffffffffffffffffffffffffffffffffff16145b806110c157506110c08185610cc9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166110ea826106fd565b73ffffffffffffffffffffffffffffffffffffffff1614611140576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111379061267c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a79061251c565b60405180910390fd5b6111bb838383611800565b6111c6600082610f33565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112169190612868565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461126d91906127e1565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611480576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611477906125fc565b60405180910390fd5b61148981610ebf565b156114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c0906124fc565b60405180910390fd5b6114d560008383611800565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461152591906127e1565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6115e782610ebf565b611626576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161d906125dc565b60405180910390fd5b8060066000848152602001908152602001600020908051906020019061164d929190611c1a565b505050565b61165d8484846110ca565b61166984848484611805565b6116a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169f906124bc565b60405180910390fd5b50505050565b60606116b982610ebf565b6116f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ef9061261c565b60405180910390fd5b600060066000848152602001908152602001600020805461171890612952565b80601f016020809104026020016040519081016040528092919081815260200182805461174490612952565b80156117915780601f1061176657610100808354040283529160200191611791565b820191906000526020600020905b81548152906001019060200180831161177457829003601f168201915b5050505050905060006117a261199c565b90506000815114156117b85781925050506117fb565b6000825111156117ed5780826040516020016117d59291906123f4565b604051602081830303815290604052925050506117fb565b6117f6846119b3565b925050505b919050565b505050565b60006118268473ffffffffffffffffffffffffffffffffffffffff16611a5a565b1561198f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261184f610f2b565b8786866040518563ffffffff1660e01b81526004016118719493929190612433565b602060405180830381600087803b15801561188b57600080fd5b505af19250505080156118bc57506040513d601f19601f820116820180604052508101906118b99190612045565b60015b61193f573d80600081146118ec576040519150601f19603f3d011682016040523d82523d6000602084013e6118f1565b606091505b50600081511415611937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192e906124bc565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611994565b600190505b949350505050565b606060405180602001604052806000815250905090565b60606119be82610ebf565b6119fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f49061269c565b60405180910390fd5b6000611a0761199c565b90506000815111611a275760405180602001604052806000815250611a52565b80611a3184611a6d565b604051602001611a429291906123f4565b6040516020818303038152906040525b915050919050565b600080823b905060008111915050919050565b60606000821415611ab5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611c15565b600082905060005b60008214611ae7578080611ad0906129b5565b915050600a82611ae09190612837565b9150611abd565b60008167ffffffffffffffff811115611b29577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611b5b5781602001600182028036833780820191505090505b5090505b60008514611c0e57600182611b749190612868565b9150600a85611b8391906129fe565b6030611b8f91906127e1565b60f81b818381518110611bcb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611c079190612837565b9450611b5f565b8093505050505b919050565b828054611c2690612952565b90600052602060002090601f016020900481019282611c485760008555611c8f565b82601f10611c6157805160ff1916838001178555611c8f565b82800160010185558215611c8f579182015b82811115611c8e578251825591602001919060010190611c73565b5b509050611c9c9190611ca0565b5090565b5b80821115611cb9576000816000905550600101611ca1565b5090565b6000611cd0611ccb8461273c565b612717565b905082815260208101848484011115611ce857600080fd5b611cf3848285612910565b509392505050565b6000611d0e611d098461276d565b612717565b905082815260208101848484011115611d2657600080fd5b611d31848285612910565b509392505050565b600081359050611d4881612ff2565b92915050565b600081359050611d5d81613009565b92915050565b600081359050611d7281613020565b92915050565b600081519050611d8781613020565b92915050565b600082601f830112611d9e57600080fd5b8135611dae848260208601611cbd565b91505092915050565b600082601f830112611dc857600080fd5b8135611dd8848260208601611cfb565b91505092915050565b600081359050611df081613037565b92915050565b600060208284031215611e0857600080fd5b6000611e1684828501611d39565b91505092915050565b60008060408385031215611e3257600080fd5b6000611e4085828601611d39565b9250506020611e5185828601611d39565b9150509250929050565b600080600060608486031215611e7057600080fd5b6000611e7e86828701611d39565b9350506020611e8f86828701611d39565b9250506040611ea086828701611de1565b9150509250925092565b60008060008060808587031215611ec057600080fd5b6000611ece87828801611d39565b9450506020611edf87828801611d39565b9350506040611ef087828801611de1565b925050606085013567ffffffffffffffff811115611f0d57600080fd5b611f1987828801611d8d565b91505092959194509250565b60008060408385031215611f3857600080fd5b6000611f4685828601611d39565b9250506020611f5785828601611d4e565b9150509250929050565b600080600060608486031215611f7657600080fd5b6000611f8486828701611d39565b935050602084013567ffffffffffffffff811115611fa157600080fd5b611fad86828701611db7565b925050604084013567ffffffffffffffff811115611fca57600080fd5b611fd686828701611db7565b9150509250925092565b60008060408385031215611ff357600080fd5b600061200185828601611d39565b925050602061201285828601611de1565b9150509250929050565b60006020828403121561202e57600080fd5b600061203c84828501611d63565b91505092915050565b60006020828403121561205757600080fd5b600061206584828501611d78565b91505092915050565b60006020828403121561208057600080fd5b600061208e84828501611de1565b91505092915050565b6120a08161289c565b82525050565b6120af816128ae565b82525050565b60006120c08261279e565b6120ca81856127b4565b93506120da81856020860161291f565b6120e381612aeb565b840191505092915050565b60006120f9826127a9565b61210381856127c5565b935061211381856020860161291f565b61211c81612aeb565b840191505092915050565b6000612132826127a9565b61213c81856127d6565b935061214c81856020860161291f565b80840191505092915050565b60006121656032836127c5565b915061217082612afc565b604082019050919050565b60006121886026836127c5565b915061219382612b4b565b604082019050919050565b60006121ab601c836127c5565b91506121b682612b9a565b602082019050919050565b60006121ce6024836127c5565b91506121d982612bc3565b604082019050919050565b60006121f16019836127c5565b91506121fc82612c12565b602082019050919050565b6000612214602c836127c5565b915061221f82612c3b565b604082019050919050565b60006122376038836127c5565b915061224282612c8a565b604082019050919050565b600061225a602a836127c5565b915061226582612cd9565b604082019050919050565b600061227d6029836127c5565b915061228882612d28565b604082019050919050565b60006122a0602e836127c5565b91506122ab82612d77565b604082019050919050565b60006122c36020836127c5565b91506122ce82612dc6565b602082019050919050565b60006122e66031836127c5565b91506122f182612def565b604082019050919050565b6000612309602c836127c5565b915061231482612e3e565b604082019050919050565b600061232c6020836127c5565b915061233782612e8d565b602082019050919050565b600061234f6029836127c5565b915061235a82612eb6565b604082019050919050565b6000612372602f836127c5565b915061237d82612f05565b604082019050919050565b60006123956021836127c5565b91506123a082612f54565b604082019050919050565b60006123b86031836127c5565b91506123c382612fa3565b604082019050919050565b6123d781612906565b82525050565b60006123e98284612127565b915081905092915050565b60006124008285612127565b915061240c8284612127565b91508190509392505050565b600060208201905061242d6000830184612097565b92915050565b60006080820190506124486000830187612097565b6124556020830186612097565b61246260408301856123ce565b818103606083015261247481846120b5565b905095945050505050565b600060208201905061249460008301846120a6565b92915050565b600060208201905081810360008301526124b481846120ee565b905092915050565b600060208201905081810360008301526124d581612158565b9050919050565b600060208201905081810360008301526124f58161217b565b9050919050565b600060208201905081810360008301526125158161219e565b9050919050565b60006020820190508181036000830152612535816121c1565b9050919050565b60006020820190508181036000830152612555816121e4565b9050919050565b6000602082019050818103600083015261257581612207565b9050919050565b600060208201905081810360008301526125958161222a565b9050919050565b600060208201905081810360008301526125b58161224d565b9050919050565b600060208201905081810360008301526125d581612270565b9050919050565b600060208201905081810360008301526125f581612293565b9050919050565b60006020820190508181036000830152612615816122b6565b9050919050565b60006020820190508181036000830152612635816122d9565b9050919050565b60006020820190508181036000830152612655816122fc565b9050919050565b600060208201905081810360008301526126758161231f565b9050919050565b6000602082019050818103600083015261269581612342565b9050919050565b600060208201905081810360008301526126b581612365565b9050919050565b600060208201905081810360008301526126d581612388565b9050919050565b600060208201905081810360008301526126f5816123ab565b9050919050565b600060208201905061271160008301846123ce565b92915050565b6000612721612732565b905061272d8282612984565b919050565b6000604051905090565b600067ffffffffffffffff82111561275757612756612abc565b5b61276082612aeb565b9050602081019050919050565b600067ffffffffffffffff82111561278857612787612abc565b5b61279182612aeb565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006127ec82612906565b91506127f783612906565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561282c5761282b612a2f565b5b828201905092915050565b600061284282612906565b915061284d83612906565b92508261285d5761285c612a5e565b5b828204905092915050565b600061287382612906565b915061287e83612906565b92508282101561289157612890612a2f565b5b828203905092915050565b60006128a7826128e6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561293d578082015181840152602081019050612922565b8381111561294c576000848401525b50505050565b6000600282049050600182168061296a57607f821691505b6020821081141561297e5761297d612a8d565b5b50919050565b61298d82612aeb565b810181811067ffffffffffffffff821117156129ac576129ab612abc565b5b80604052505050565b60006129c082612906565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156129f3576129f2612a2f565b5b600182019050919050565b6000612a0982612906565b9150612a1483612906565b925082612a2457612a23612a5e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b612ffb8161289c565b811461300657600080fd5b50565b613012816128ae565b811461301d57600080fd5b50565b613029816128ba565b811461303457600080fd5b50565b61304081612906565b811461304b57600080fd5b5056fea2646970667358221220beaedf7f172f9c3a7a50fd6ab5cdd7b0f36d1b6bd939ff8d9649048177fba62164736f6c63430008020033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061010b5760003560e01c8063715018a6116100a2578063a22cb46511610071578063a22cb465146102b8578063b88d4fde146102d4578063c87b56dd146102f0578063e985e9c514610320578063f2fde38b146103505761010b565b8063715018a6146102425780638da5cb5b1461024c57806395d89b411461026a5780639ada3797146102885761010b565b806323b872dd116100de57806323b872dd146101aa57806342842e0e146101c65780636352211e146101e257806370a08231146102125761010b565b806301ffc9a71461011057806306fdde0314610140578063081812fc1461015e578063095ea7b31461018e575b600080fd5b61012a6004803603810190610125919061201c565b61036c565b604051610137919061247f565b60405180910390f35b61014861044e565b604051610155919061249a565b60405180910390f35b6101786004803603810190610173919061206e565b6104e0565b6040516101859190612418565b60405180910390f35b6101a860048036038101906101a39190611fe0565b610565565b005b6101c460048036038101906101bf9190611e5b565b61067d565b005b6101e060048036038101906101db9190611e5b565b6106dd565b005b6101fc60048036038101906101f7919061206e565b6106fd565b6040516102099190612418565b60405180910390f35b61022c60048036038101906102279190611df6565b6107af565b60405161023991906126fc565b60405180910390f35b61024a610867565b005b6102546108ef565b6040516102619190612418565b60405180910390f35b610272610919565b60405161027f919061249a565b60405180910390f35b6102a2600480360381019061029d9190611f61565b6109ab565b6040516102af91906126fc565b60405180910390f35b6102d260048036038101906102cd9190611f25565b610ad4565b005b6102ee60048036038101906102e99190611eaa565b610c55565b005b61030a6004803603810190610305919061206e565b610cb7565b604051610317919061249a565b60405180910390f35b61033a60048036038101906103359190611e1f565b610cc9565b604051610347919061247f565b60405180910390f35b61036a60048036038101906103659190611df6565b610d5d565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061043757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610447575061044682610e55565b5b9050919050565b60606000805461045d90612952565b80601f016020809104026020016040519081016040528092919081815260200182805461048990612952565b80156104d65780601f106104ab576101008083540402835291602001916104d6565b820191906000526020600020905b8154815290600101906020018083116104b957829003601f168201915b5050505050905090565b60006104eb82610ebf565b61052a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105219061263c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610570826106fd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156105e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d8906126bc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610600610f2b565b73ffffffffffffffffffffffffffffffffffffffff16148061062f575061062e81610629610f2b565b610cc9565b5b61066e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106659061257c565b60405180910390fd5b6106788383610f33565b505050565b61068e610688610f2b565b82610fec565b6106cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c4906126dc565b60405180910390fd5b6106d88383836110ca565b505050565b6106f883838360405180602001604052806000815250610c55565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156107a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079d906125bc565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610820576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108179061259c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61086f610f2b565b73ffffffffffffffffffffffffffffffffffffffff1661088d6108ef565b73ffffffffffffffffffffffffffffffffffffffff16146108e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108da9061265c565b60405180910390fd5b6108ed6000611326565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461092890612952565b80601f016020809104026020016040519081016040528092919081815260200182805461095490612952565b80156109a15780601f10610976576101008083540402835291602001916109a1565b820191906000526020600020905b81548152906001019060200180831161098457829003601f168201915b5050505050905090565b60006109b5610f2b565b73ffffffffffffffffffffffffffffffffffffffff166109d36108ef565b73ffffffffffffffffffffffffffffffffffffffff1614610a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a209061265c565b60405180910390fd5b6001600984604051610a3b91906123dd565b908152602001604051809103902060009054906101000a900460ff1660ff161415610a6557600080fd5b6001600984604051610a7791906123dd565b908152602001604051809103902060006101000a81548160ff021916908360ff160217905550610aa760086113ec565b6000610ab36008611402565b9050610abf8582611410565b610ac981846115de565b809150509392505050565b610adc610f2b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b419061253c565b60405180910390fd5b8060056000610b57610f2b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610c04610f2b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610c49919061247f565b60405180910390a35050565b610c66610c60610f2b565b83610fec565b610ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9c906126dc565b60405180910390fd5b610cb184848484611652565b50505050565b6060610cc2826116ae565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610d65610f2b565b73ffffffffffffffffffffffffffffffffffffffff16610d836108ef565b73ffffffffffffffffffffffffffffffffffffffff1614610dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd09061265c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e40906124dc565b60405180910390fd5b610e5281611326565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610fa6836106fd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610ff782610ebf565b611036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102d9061255c565b60405180910390fd5b6000611041836106fd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806110b057508373ffffffffffffffffffffffffffffffffffffffff16611098846104e0565b73ffffffffffffffffffffffffffffffffffffffff16145b806110c157506110c08185610cc9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166110ea826106fd565b73ffffffffffffffffffffffffffffffffffffffff1614611140576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111379061267c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a79061251c565b60405180910390fd5b6111bb838383611800565b6111c6600082610f33565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112169190612868565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461126d91906127e1565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611480576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611477906125fc565b60405180910390fd5b61148981610ebf565b156114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c0906124fc565b60405180910390fd5b6114d560008383611800565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461152591906127e1565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6115e782610ebf565b611626576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161d906125dc565b60405180910390fd5b8060066000848152602001908152602001600020908051906020019061164d929190611c1a565b505050565b61165d8484846110ca565b61166984848484611805565b6116a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169f906124bc565b60405180910390fd5b50505050565b60606116b982610ebf565b6116f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ef9061261c565b60405180910390fd5b600060066000848152602001908152602001600020805461171890612952565b80601f016020809104026020016040519081016040528092919081815260200182805461174490612952565b80156117915780601f1061176657610100808354040283529160200191611791565b820191906000526020600020905b81548152906001019060200180831161177457829003601f168201915b5050505050905060006117a261199c565b90506000815114156117b85781925050506117fb565b6000825111156117ed5780826040516020016117d59291906123f4565b604051602081830303815290604052925050506117fb565b6117f6846119b3565b925050505b919050565b505050565b60006118268473ffffffffffffffffffffffffffffffffffffffff16611a5a565b1561198f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261184f610f2b565b8786866040518563ffffffff1660e01b81526004016118719493929190612433565b602060405180830381600087803b15801561188b57600080fd5b505af19250505080156118bc57506040513d601f19601f820116820180604052508101906118b99190612045565b60015b61193f573d80600081146118ec576040519150601f19603f3d011682016040523d82523d6000602084013e6118f1565b606091505b50600081511415611937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192e906124bc565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611994565b600190505b949350505050565b606060405180602001604052806000815250905090565b60606119be82610ebf565b6119fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f49061269c565b60405180910390fd5b6000611a0761199c565b90506000815111611a275760405180602001604052806000815250611a52565b80611a3184611a6d565b604051602001611a429291906123f4565b6040516020818303038152906040525b915050919050565b600080823b905060008111915050919050565b60606000821415611ab5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611c15565b600082905060005b60008214611ae7578080611ad0906129b5565b915050600a82611ae09190612837565b9150611abd565b60008167ffffffffffffffff811115611b29577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611b5b5781602001600182028036833780820191505090505b5090505b60008514611c0e57600182611b749190612868565b9150600a85611b8391906129fe565b6030611b8f91906127e1565b60f81b818381518110611bcb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611c079190612837565b9450611b5f565b8093505050505b919050565b828054611c2690612952565b90600052602060002090601f016020900481019282611c485760008555611c8f565b82601f10611c6157805160ff1916838001178555611c8f565b82800160010185558215611c8f579182015b82811115611c8e578251825591602001919060010190611c73565b5b509050611c9c9190611ca0565b5090565b5b80821115611cb9576000816000905550600101611ca1565b5090565b6000611cd0611ccb8461273c565b612717565b905082815260208101848484011115611ce857600080fd5b611cf3848285612910565b509392505050565b6000611d0e611d098461276d565b612717565b905082815260208101848484011115611d2657600080fd5b611d31848285612910565b509392505050565b600081359050611d4881612ff2565b92915050565b600081359050611d5d81613009565b92915050565b600081359050611d7281613020565b92915050565b600081519050611d8781613020565b92915050565b600082601f830112611d9e57600080fd5b8135611dae848260208601611cbd565b91505092915050565b600082601f830112611dc857600080fd5b8135611dd8848260208601611cfb565b91505092915050565b600081359050611df081613037565b92915050565b600060208284031215611e0857600080fd5b6000611e1684828501611d39565b91505092915050565b60008060408385031215611e3257600080fd5b6000611e4085828601611d39565b9250506020611e5185828601611d39565b9150509250929050565b600080600060608486031215611e7057600080fd5b6000611e7e86828701611d39565b9350506020611e8f86828701611d39565b9250506040611ea086828701611de1565b9150509250925092565b60008060008060808587031215611ec057600080fd5b6000611ece87828801611d39565b9450506020611edf87828801611d39565b9350506040611ef087828801611de1565b925050606085013567ffffffffffffffff811115611f0d57600080fd5b611f1987828801611d8d565b91505092959194509250565b60008060408385031215611f3857600080fd5b6000611f4685828601611d39565b9250506020611f5785828601611d4e565b9150509250929050565b600080600060608486031215611f7657600080fd5b6000611f8486828701611d39565b935050602084013567ffffffffffffffff811115611fa157600080fd5b611fad86828701611db7565b925050604084013567ffffffffffffffff811115611fca57600080fd5b611fd686828701611db7565b9150509250925092565b60008060408385031215611ff357600080fd5b600061200185828601611d39565b925050602061201285828601611de1565b9150509250929050565b60006020828403121561202e57600080fd5b600061203c84828501611d63565b91505092915050565b60006020828403121561205757600080fd5b600061206584828501611d78565b91505092915050565b60006020828403121561208057600080fd5b600061208e84828501611de1565b91505092915050565b6120a08161289c565b82525050565b6120af816128ae565b82525050565b60006120c08261279e565b6120ca81856127b4565b93506120da81856020860161291f565b6120e381612aeb565b840191505092915050565b60006120f9826127a9565b61210381856127c5565b935061211381856020860161291f565b61211c81612aeb565b840191505092915050565b6000612132826127a9565b61213c81856127d6565b935061214c81856020860161291f565b80840191505092915050565b60006121656032836127c5565b915061217082612afc565b604082019050919050565b60006121886026836127c5565b915061219382612b4b565b604082019050919050565b60006121ab601c836127c5565b91506121b682612b9a565b602082019050919050565b60006121ce6024836127c5565b91506121d982612bc3565b604082019050919050565b60006121f16019836127c5565b91506121fc82612c12565b602082019050919050565b6000612214602c836127c5565b915061221f82612c3b565b604082019050919050565b60006122376038836127c5565b915061224282612c8a565b604082019050919050565b600061225a602a836127c5565b915061226582612cd9565b604082019050919050565b600061227d6029836127c5565b915061228882612d28565b604082019050919050565b60006122a0602e836127c5565b91506122ab82612d77565b604082019050919050565b60006122c36020836127c5565b91506122ce82612dc6565b602082019050919050565b60006122e66031836127c5565b91506122f182612def565b604082019050919050565b6000612309602c836127c5565b915061231482612e3e565b604082019050919050565b600061232c6020836127c5565b915061233782612e8d565b602082019050919050565b600061234f6029836127c5565b915061235a82612eb6565b604082019050919050565b6000612372602f836127c5565b915061237d82612f05565b604082019050919050565b60006123956021836127c5565b91506123a082612f54565b604082019050919050565b60006123b86031836127c5565b91506123c382612fa3565b604082019050919050565b6123d781612906565b82525050565b60006123e98284612127565b915081905092915050565b60006124008285612127565b915061240c8284612127565b91508190509392505050565b600060208201905061242d6000830184612097565b92915050565b60006080820190506124486000830187612097565b6124556020830186612097565b61246260408301856123ce565b818103606083015261247481846120b5565b905095945050505050565b600060208201905061249460008301846120a6565b92915050565b600060208201905081810360008301526124b481846120ee565b905092915050565b600060208201905081810360008301526124d581612158565b9050919050565b600060208201905081810360008301526124f58161217b565b9050919050565b600060208201905081810360008301526125158161219e565b9050919050565b60006020820190508181036000830152612535816121c1565b9050919050565b60006020820190508181036000830152612555816121e4565b9050919050565b6000602082019050818103600083015261257581612207565b9050919050565b600060208201905081810360008301526125958161222a565b9050919050565b600060208201905081810360008301526125b58161224d565b9050919050565b600060208201905081810360008301526125d581612270565b9050919050565b600060208201905081810360008301526125f581612293565b9050919050565b60006020820190508181036000830152612615816122b6565b9050919050565b60006020820190508181036000830152612635816122d9565b9050919050565b60006020820190508181036000830152612655816122fc565b9050919050565b600060208201905081810360008301526126758161231f565b9050919050565b6000602082019050818103600083015261269581612342565b9050919050565b600060208201905081810360008301526126b581612365565b9050919050565b600060208201905081810360008301526126d581612388565b9050919050565b600060208201905081810360008301526126f5816123ab565b9050919050565b600060208201905061271160008301846123ce565b92915050565b6000612721612732565b905061272d8282612984565b919050565b6000604051905090565b600067ffffffffffffffff82111561275757612756612abc565b5b61276082612aeb565b9050602081019050919050565b600067ffffffffffffffff82111561278857612787612abc565b5b61279182612aeb565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006127ec82612906565b91506127f783612906565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561282c5761282b612a2f565b5b828201905092915050565b600061284282612906565b915061284d83612906565b92508261285d5761285c612a5e565b5b828204905092915050565b600061287382612906565b915061287e83612906565b92508282101561289157612890612a2f565b5b828203905092915050565b60006128a7826128e6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561293d578082015181840152602081019050612922565b8381111561294c576000848401525b50505050565b6000600282049050600182168061296a57607f821691505b6020821081141561297e5761297d612a8d565b5b50919050565b61298d82612aeb565b810181811067ffffffffffffffff821117156129ac576129ab612abc565b5b80604052505050565b60006129c082612906565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156129f3576129f2612a2f565b5b600182019050919050565b6000612a0982612906565b9150612a1483612906565b925082612a2457612a23612a5e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b612ffb8161289c565b811461300657600080fd5b50565b613012816128ae565b811461301d57600080fd5b50565b613029816128ba565b811461303457600080fd5b50565b61304081612906565b811461304b57600080fd5b5056fea2646970667358221220beaedf7f172f9c3a7a50fd6ab5cdd7b0f36d1b6bd939ff8d9649048177fba62164736f6c63430008020033

Deployed Bytecode Sourcemap

37953:994:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23898:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24843:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26402:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25925:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27292:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27702:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24537:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24267:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5854:94;;;:::i;:::-;;5203:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25012:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38194:423;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26695:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27958:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38748:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27061:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6103:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23898:305;24000:4;24052:25;24037:40;;;:11;:40;;;;:105;;;;24109:33;24094:48;;;:11;:48;;;;24037:105;:158;;;;24159:36;24183:11;24159:23;:36::i;:::-;24037:158;24017:178;;23898:305;;;:::o;24843:100::-;24897:13;24930:5;24923:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24843:100;:::o;26402:221::-;26478:7;26506:16;26514:7;26506;:16::i;:::-;26498:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26591:15;:24;26607:7;26591:24;;;;;;;;;;;;;;;;;;;;;26584:31;;26402:221;;;:::o;25925:411::-;26006:13;26022:23;26037:7;26022:14;:23::i;:::-;26006:39;;26070:5;26064:11;;:2;:11;;;;26056:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26164:5;26148:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26173:37;26190:5;26197:12;:10;:12::i;:::-;26173:16;:37::i;:::-;26148:62;26126:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26307:21;26316:2;26320:7;26307:8;:21::i;:::-;25925:411;;;:::o;27292:339::-;27487:41;27506:12;:10;:12::i;:::-;27520:7;27487:18;:41::i;:::-;27479:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27595:28;27605:4;27611:2;27615:7;27595:9;:28::i;:::-;27292:339;;;:::o;27702:185::-;27840:39;27857:4;27863:2;27867:7;27840:39;;;;;;;;;;;;:16;:39::i;:::-;27702:185;;;:::o;24537:239::-;24609:7;24629:13;24645:7;:16;24653:7;24645:16;;;;;;;;;;;;;;;;;;;;;24629:32;;24697:1;24680:19;;:5;:19;;;;24672:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24763:5;24756:12;;;24537:239;;;:::o;24267:208::-;24339:7;24384:1;24367:19;;:5;:19;;;;24359:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24451:9;:16;24461:5;24451:16;;;;;;;;;;;;;;;;24444:23;;24267:208;;;:::o;5854:94::-;5434:12;:10;:12::i;:::-;5423:23;;:7;:5;:7::i;:::-;:23;;;5415:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5919:21:::1;5937:1;5919:9;:21::i;:::-;5854:94::o:0;5203:87::-;5249:7;5276:6;;;;;;;;;;;5269:13;;5203:87;:::o;25012:104::-;25068:13;25101:7;25094:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25012:104;:::o;38194:423::-;38328:7;5434:12;:10;:12::i;:::-;5423:23;;:7;:5;:7::i;:::-;:23;;;5415:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38377:1:::1;38361:6;38368:4;38361:12;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:17;;;;38353:26;;;::::0;::::1;;38405:1;38390:6;38397:4;38390:12;;;;;;:::i;:::-;;;;;;;;;;;;;;:16;;;;;;;;;;;;;;;;;;38417:27;:15;:25;:27::i;:::-;38455:17;38475:25;:15;:23;:25::i;:::-;38455:45;;38511:27;38517:9;38528;38511:5;:27::i;:::-;38549:33;38562:9;38573:8;38549:12;:33::i;:::-;38600:9;38593:16;;;38194:423:::0;;;;;:::o;26695:295::-;26810:12;:10;:12::i;:::-;26798:24;;:8;:24;;;;26790:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;26910:8;26865:18;:32;26884:12;:10;:12::i;:::-;26865:32;;;;;;;;;;;;;;;:42;26898:8;26865:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;26963:8;26934:48;;26949:12;:10;:12::i;:::-;26934:48;;;26973:8;26934:48;;;;;;:::i;:::-;;;;;;;;26695:295;;:::o;27958:328::-;28133:41;28152:12;:10;:12::i;:::-;28166:7;28133:18;:41::i;:::-;28125:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28239:39;28253:4;28259:2;28263:7;28272:5;28239:13;:39::i;:::-;27958:328;;;;:::o;38748:196::-;38875:13;38913:23;38928:7;38913:14;:23::i;:::-;38906:30;;38748:196;;;:::o;27061:164::-;27158:4;27182:18;:25;27201:5;27182:25;;;;;;;;;;;;;;;:35;27208:8;27182:35;;;;;;;;;;;;;;;;;;;;;;;;;27175:42;;27061:164;;;;:::o;6103:192::-;5434:12;:10;:12::i;:::-;5423:23;;:7;:5;:7::i;:::-;:23;;;5415:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6212:1:::1;6192:22;;:8;:22;;;;6184:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6268:19;6278:8;6268:9;:19::i;:::-;6103:192:::0;:::o;17015:157::-;17100:4;17139:25;17124:40;;;:11;:40;;;;17117:47;;17015:157;;;:::o;29796:127::-;29861:4;29913:1;29885:30;;:7;:16;29893:7;29885:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29878:37;;29796:127;;;:::o;4036:98::-;4089:7;4116:10;4109:17;;4036:98;:::o;33778:174::-;33880:2;33853:15;:24;33869:7;33853:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33936:7;33932:2;33898:46;;33907:23;33922:7;33907:14;:23::i;:::-;33898:46;;;;;;;;;;;;33778:174;;:::o;30090:348::-;30183:4;30208:16;30216:7;30208;:16::i;:::-;30200:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30284:13;30300:23;30315:7;30300:14;:23::i;:::-;30284:39;;30353:5;30342:16;;:7;:16;;;:51;;;;30386:7;30362:31;;:20;30374:7;30362:11;:20::i;:::-;:31;;;30342:51;:87;;;;30397:32;30414:5;30421:7;30397:16;:32::i;:::-;30342:87;30334:96;;;30090:348;;;;:::o;33082:578::-;33241:4;33214:31;;:23;33229:7;33214:14;:23::i;:::-;:31;;;33206:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33324:1;33310:16;;:2;:16;;;;33302:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33380:39;33401:4;33407:2;33411:7;33380:20;:39::i;:::-;33484:29;33501:1;33505:7;33484:8;:29::i;:::-;33545:1;33526:9;:15;33536:4;33526:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33574:1;33557:9;:13;33567:2;33557:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33605:2;33586:7;:16;33594:7;33586:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33644:7;33640:2;33625:27;;33634:4;33625:27;;;;;;;;;;;;33082:578;;;:::o;6303:173::-;6359:16;6378:6;;;;;;;;;;;6359:25;;6404:8;6395:6;;:17;;;;;;;;;;;;;;;;;;6459:8;6428:40;;6449:8;6428:40;;;;;;;;;;;;6303:173;;:::o;956:127::-;1063:1;1045:7;:14;;;:19;;;;;;;;;;;956:127;:::o;834:114::-;899:7;926;:14;;;919:21;;834:114;;;:::o;31774:382::-;31868:1;31854:16;;:2;:16;;;;31846:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31927:16;31935:7;31927;:16::i;:::-;31926:17;31918:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31989:45;32018:1;32022:2;32026:7;31989:20;:45::i;:::-;32064:1;32047:9;:13;32057:2;32047:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32095:2;32076:7;:16;32084:7;32076:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32140:7;32136:2;32115:33;;32132:1;32115:33;;;;;;;;;;;;31774:382;;:::o;37241:217::-;37341:16;37349:7;37341;:16::i;:::-;37333:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;37441:9;37419:10;:19;37430:7;37419:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;37241:217;;:::o;29168:315::-;29325:28;29335:4;29341:2;29345:7;29325:9;:28::i;:::-;29372:48;29395:4;29401:2;29405:7;29414:5;29372:22;:48::i;:::-;29364:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29168:315;;;;:::o;36406:679::-;36479:13;36513:16;36521:7;36513;:16::i;:::-;36505:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;36596:23;36622:10;:19;36633:7;36622:19;;;;;;;;;;;36596:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36652:18;36673:10;:8;:10::i;:::-;36652:31;;36781:1;36765:4;36759:18;:23;36755:72;;;36806:9;36799:16;;;;;;36755:72;36957:1;36937:9;36931:23;:27;36927:108;;;37006:4;37012:9;36989:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36975:48;;;;;;36927:108;37054:23;37069:7;37054:14;:23::i;:::-;37047:30;;;;36406:679;;;;:::o;35888:126::-;;;;:::o;34517:799::-;34672:4;34693:15;:2;:13;;;:15::i;:::-;34689:620;;;34745:2;34729:36;;;34766:12;:10;:12::i;:::-;34780:4;34786:7;34795:5;34729:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34725:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34988:1;34971:6;:13;:18;34967:272;;;35014:60;;;;;;;;;;:::i;:::-;;;;;;;;34967:272;35189:6;35183:13;35174:6;35170:2;35166:15;35159:38;34725:529;34862:41;;;34852:51;;;:6;:51;;;;34845:58;;;;;34689:620;35293:4;35286:11;;34517:799;;;;;;;:::o;25769:94::-;25820:13;25846:9;;;;;;;;;;;;;;25769:94;:::o;25187:334::-;25260:13;25294:16;25302:7;25294;:16::i;:::-;25286:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;25375:21;25399:10;:8;:10::i;:::-;25375:34;;25451:1;25433:7;25427:21;:25;:86;;;;;;;;;;;;;;;;;25479:7;25488:18;:7;:16;:18::i;:::-;25462:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25427:86;25420:93;;;25187:334;;;:::o;7206:387::-;7266:4;7474:12;7541:7;7529:20;7521:28;;7584:1;7577:4;:8;7570:15;;;7206:387;;;:::o;1695:723::-;1751:13;1981:1;1972:5;:10;1968:53;;;1999:10;;;;;;;;;;;;;;;;;;;;;1968:53;2031:12;2046:5;2031:20;;2062:14;2087:78;2102:1;2094:4;:9;2087:78;;2120:8;;;;;:::i;:::-;;;;2151:2;2143:10;;;;;:::i;:::-;;;2087:78;;;2175:19;2207:6;2197:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2175:39;;2225:154;2241:1;2232:5;:10;2225:154;;2269:1;2259:11;;;;;:::i;:::-;;;2336:2;2328:5;:10;;;;:::i;:::-;2315:2;:24;;;;:::i;:::-;2302:39;;2285:6;2292;2285:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;2365:2;2356:11;;;;;:::i;:::-;;;2225:154;;;2403:6;2389:21;;;;;1695:723;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;;;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;;;;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;;;;;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;;;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:778::-;;;;4632:2;4620:9;4611:7;4607:23;4603:32;4600:2;;;4648:1;4645;4638:12;4600:2;4691:1;4716:53;4761:7;4752:6;4741:9;4737:22;4716:53;:::i;:::-;4706:63;;4662:117;4846:2;4835:9;4831:18;4818:32;4877:18;4869:6;4866:30;4863:2;;;4909:1;4906;4899:12;4863:2;4937:63;4992:7;4983:6;4972:9;4968:22;4937:63;:::i;:::-;4927:73;;4789:221;5077:2;5066:9;5062:18;5049:32;5108:18;5100:6;5097:30;5094:2;;;5140:1;5137;5130:12;5094:2;5168:63;5223:7;5214:6;5203:9;5199:22;5168:63;:::i;:::-;5158:73;;5020:221;4590:658;;;;;:::o;5254:407::-;;;5379:2;5367:9;5358:7;5354:23;5350:32;5347:2;;;5395:1;5392;5385:12;5347:2;5438:1;5463:53;5508:7;5499:6;5488:9;5484:22;5463:53;:::i;:::-;5453:63;;5409:117;5565:2;5591:53;5636:7;5627:6;5616:9;5612:22;5591:53;:::i;:::-;5581:63;;5536:118;5337:324;;;;;:::o;5667:260::-;;5774:2;5762:9;5753:7;5749:23;5745:32;5742:2;;;5790:1;5787;5780:12;5742:2;5833:1;5858:52;5902:7;5893:6;5882:9;5878:22;5858:52;:::i;:::-;5848:62;;5804:116;5732:195;;;;:::o;5933:282::-;;6051:2;6039:9;6030:7;6026:23;6022:32;6019:2;;;6067:1;6064;6057:12;6019:2;6110:1;6135:63;6190:7;6181:6;6170:9;6166:22;6135:63;:::i;:::-;6125:73;;6081:127;6009:206;;;;:::o;6221:262::-;;6329:2;6317:9;6308:7;6304:23;6300:32;6297:2;;;6345:1;6342;6335:12;6297:2;6388:1;6413:53;6458:7;6449:6;6438:9;6434:22;6413:53;:::i;:::-;6403:63;;6359:117;6287:196;;;;:::o;6489:118::-;6576:24;6594:5;6576:24;:::i;:::-;6571:3;6564:37;6554:53;;:::o;6613:109::-;6694:21;6709:5;6694:21;:::i;:::-;6689:3;6682:34;6672:50;;:::o;6728:360::-;;6842:38;6874:5;6842:38;:::i;:::-;6896:70;6959:6;6954:3;6896:70;:::i;:::-;6889:77;;6975:52;7020:6;7015:3;7008:4;7001:5;6997:16;6975:52;:::i;:::-;7052:29;7074:6;7052:29;:::i;:::-;7047:3;7043:39;7036:46;;6818:270;;;;;:::o;7094:364::-;;7210:39;7243:5;7210:39;:::i;:::-;7265:71;7329:6;7324:3;7265:71;:::i;:::-;7258:78;;7345:52;7390:6;7385:3;7378:4;7371:5;7367:16;7345:52;:::i;:::-;7422:29;7444:6;7422:29;:::i;:::-;7417:3;7413:39;7406:46;;7186:272;;;;;:::o;7464:377::-;;7598:39;7631:5;7598:39;:::i;:::-;7653:89;7735:6;7730:3;7653:89;:::i;:::-;7646:96;;7751:52;7796:6;7791:3;7784:4;7777:5;7773:16;7751:52;:::i;:::-;7828:6;7823:3;7819:16;7812:23;;7574:267;;;;;:::o;7847:366::-;;8010:67;8074:2;8069:3;8010:67;:::i;:::-;8003:74;;8086:93;8175:3;8086:93;:::i;:::-;8204:2;8199:3;8195:12;8188:19;;7993:220;;;:::o;8219:366::-;;8382:67;8446:2;8441:3;8382:67;:::i;:::-;8375:74;;8458:93;8547:3;8458:93;:::i;:::-;8576:2;8571:3;8567:12;8560:19;;8365:220;;;:::o;8591:366::-;;8754:67;8818:2;8813:3;8754:67;:::i;:::-;8747:74;;8830:93;8919:3;8830:93;:::i;:::-;8948:2;8943:3;8939:12;8932:19;;8737:220;;;:::o;8963:366::-;;9126:67;9190:2;9185:3;9126:67;:::i;:::-;9119:74;;9202:93;9291:3;9202:93;:::i;:::-;9320:2;9315:3;9311:12;9304:19;;9109:220;;;:::o;9335:366::-;;9498:67;9562:2;9557:3;9498:67;:::i;:::-;9491:74;;9574:93;9663:3;9574:93;:::i;:::-;9692:2;9687:3;9683:12;9676:19;;9481:220;;;:::o;9707:366::-;;9870:67;9934:2;9929:3;9870:67;:::i;:::-;9863:74;;9946:93;10035:3;9946:93;:::i;:::-;10064:2;10059:3;10055:12;10048:19;;9853:220;;;:::o;10079:366::-;;10242:67;10306:2;10301:3;10242:67;:::i;:::-;10235:74;;10318:93;10407:3;10318:93;:::i;:::-;10436:2;10431:3;10427:12;10420:19;;10225:220;;;:::o;10451:366::-;;10614:67;10678:2;10673:3;10614:67;:::i;:::-;10607:74;;10690:93;10779:3;10690:93;:::i;:::-;10808:2;10803:3;10799:12;10792:19;;10597:220;;;:::o;10823:366::-;;10986:67;11050:2;11045:3;10986:67;:::i;:::-;10979:74;;11062:93;11151:3;11062:93;:::i;:::-;11180:2;11175:3;11171:12;11164:19;;10969:220;;;:::o;11195:366::-;;11358:67;11422:2;11417:3;11358:67;:::i;:::-;11351:74;;11434:93;11523:3;11434:93;:::i;:::-;11552:2;11547:3;11543:12;11536:19;;11341:220;;;:::o;11567:366::-;;11730:67;11794:2;11789:3;11730:67;:::i;:::-;11723:74;;11806:93;11895:3;11806:93;:::i;:::-;11924:2;11919:3;11915:12;11908:19;;11713:220;;;:::o;11939:366::-;;12102:67;12166:2;12161:3;12102:67;:::i;:::-;12095:74;;12178:93;12267:3;12178:93;:::i;:::-;12296:2;12291:3;12287:12;12280:19;;12085:220;;;:::o;12311:366::-;;12474:67;12538:2;12533:3;12474:67;:::i;:::-;12467:74;;12550:93;12639:3;12550:93;:::i;:::-;12668:2;12663:3;12659:12;12652:19;;12457:220;;;:::o;12683:366::-;;12846:67;12910:2;12905:3;12846:67;:::i;:::-;12839:74;;12922:93;13011:3;12922:93;:::i;:::-;13040:2;13035:3;13031:12;13024:19;;12829:220;;;:::o;13055:366::-;;13218:67;13282:2;13277:3;13218:67;:::i;:::-;13211:74;;13294:93;13383:3;13294:93;:::i;:::-;13412:2;13407:3;13403:12;13396:19;;13201:220;;;:::o;13427:366::-;;13590:67;13654:2;13649:3;13590:67;:::i;:::-;13583:74;;13666:93;13755:3;13666:93;:::i;:::-;13784:2;13779:3;13775:12;13768:19;;13573:220;;;:::o;13799:366::-;;13962:67;14026:2;14021:3;13962:67;:::i;:::-;13955:74;;14038:93;14127:3;14038:93;:::i;:::-;14156:2;14151:3;14147:12;14140:19;;13945:220;;;:::o;14171:366::-;;14334:67;14398:2;14393:3;14334:67;:::i;:::-;14327:74;;14410:93;14499:3;14410:93;:::i;:::-;14528:2;14523:3;14519:12;14512:19;;14317:220;;;:::o;14543:118::-;14630:24;14648:5;14630:24;:::i;:::-;14625:3;14618:37;14608:53;;:::o;14667:275::-;;14821:95;14912:3;14903:6;14821:95;:::i;:::-;14814:102;;14933:3;14926:10;;14803:139;;;;:::o;14948:435::-;;15150:95;15241:3;15232:6;15150:95;:::i;:::-;15143:102;;15262:95;15353:3;15344:6;15262:95;:::i;:::-;15255:102;;15374:3;15367:10;;15132:251;;;;;:::o;15389:222::-;;15520:2;15509:9;15505:18;15497:26;;15533:71;15601:1;15590:9;15586:17;15577:6;15533:71;:::i;:::-;15487:124;;;;:::o;15617:640::-;;15850:3;15839:9;15835:19;15827:27;;15864:71;15932:1;15921:9;15917:17;15908:6;15864:71;:::i;:::-;15945:72;16013:2;16002:9;15998:18;15989:6;15945:72;:::i;:::-;16027;16095:2;16084:9;16080:18;16071:6;16027:72;:::i;:::-;16146:9;16140:4;16136:20;16131:2;16120:9;16116:18;16109:48;16174:76;16245:4;16236:6;16174:76;:::i;:::-;16166:84;;15817:440;;;;;;;:::o;16263:210::-;;16388:2;16377:9;16373:18;16365:26;;16401:65;16463:1;16452:9;16448:17;16439:6;16401:65;:::i;:::-;16355:118;;;;:::o;16479:313::-;;16630:2;16619:9;16615:18;16607:26;;16679:9;16673:4;16669:20;16665:1;16654:9;16650:17;16643:47;16707:78;16780:4;16771:6;16707:78;:::i;:::-;16699:86;;16597:195;;;;:::o;16798:419::-;;17002:2;16991:9;16987:18;16979:26;;17051:9;17045:4;17041:20;17037:1;17026:9;17022:17;17015:47;17079:131;17205:4;17079:131;:::i;:::-;17071:139;;16969:248;;;:::o;17223:419::-;;17427:2;17416:9;17412:18;17404:26;;17476:9;17470:4;17466:20;17462:1;17451:9;17447:17;17440:47;17504:131;17630:4;17504:131;:::i;:::-;17496:139;;17394:248;;;:::o;17648:419::-;;17852:2;17841:9;17837:18;17829:26;;17901:9;17895:4;17891:20;17887:1;17876:9;17872:17;17865:47;17929:131;18055:4;17929:131;:::i;:::-;17921:139;;17819:248;;;:::o;18073:419::-;;18277:2;18266:9;18262:18;18254:26;;18326:9;18320:4;18316:20;18312:1;18301:9;18297:17;18290:47;18354:131;18480:4;18354:131;:::i;:::-;18346:139;;18244:248;;;:::o;18498:419::-;;18702:2;18691:9;18687:18;18679:26;;18751:9;18745:4;18741:20;18737:1;18726:9;18722:17;18715:47;18779:131;18905:4;18779:131;:::i;:::-;18771:139;;18669:248;;;:::o;18923:419::-;;19127:2;19116:9;19112:18;19104:26;;19176:9;19170:4;19166:20;19162:1;19151:9;19147:17;19140:47;19204:131;19330:4;19204:131;:::i;:::-;19196:139;;19094:248;;;:::o;19348:419::-;;19552:2;19541:9;19537:18;19529:26;;19601:9;19595:4;19591:20;19587:1;19576:9;19572:17;19565:47;19629:131;19755:4;19629:131;:::i;:::-;19621:139;;19519:248;;;:::o;19773:419::-;;19977:2;19966:9;19962:18;19954:26;;20026:9;20020:4;20016:20;20012:1;20001:9;19997:17;19990:47;20054:131;20180:4;20054:131;:::i;:::-;20046:139;;19944:248;;;:::o;20198:419::-;;20402:2;20391:9;20387:18;20379:26;;20451:9;20445:4;20441:20;20437:1;20426:9;20422:17;20415:47;20479:131;20605:4;20479:131;:::i;:::-;20471:139;;20369:248;;;:::o;20623:419::-;;20827:2;20816:9;20812:18;20804:26;;20876:9;20870:4;20866:20;20862:1;20851:9;20847:17;20840:47;20904:131;21030:4;20904:131;:::i;:::-;20896:139;;20794:248;;;:::o;21048:419::-;;21252:2;21241:9;21237:18;21229:26;;21301:9;21295:4;21291:20;21287:1;21276:9;21272:17;21265:47;21329:131;21455:4;21329:131;:::i;:::-;21321:139;;21219:248;;;:::o;21473:419::-;;21677:2;21666:9;21662:18;21654:26;;21726:9;21720:4;21716:20;21712:1;21701:9;21697:17;21690:47;21754:131;21880:4;21754:131;:::i;:::-;21746:139;;21644:248;;;:::o;21898:419::-;;22102:2;22091:9;22087:18;22079:26;;22151:9;22145:4;22141:20;22137:1;22126:9;22122:17;22115:47;22179:131;22305:4;22179:131;:::i;:::-;22171:139;;22069:248;;;:::o;22323:419::-;;22527:2;22516:9;22512:18;22504:26;;22576:9;22570:4;22566:20;22562:1;22551:9;22547:17;22540:47;22604:131;22730:4;22604:131;:::i;:::-;22596:139;;22494:248;;;:::o;22748:419::-;;22952:2;22941:9;22937:18;22929:26;;23001:9;22995:4;22991:20;22987:1;22976:9;22972:17;22965:47;23029:131;23155:4;23029:131;:::i;:::-;23021:139;;22919:248;;;:::o;23173:419::-;;23377:2;23366:9;23362:18;23354:26;;23426:9;23420:4;23416:20;23412:1;23401:9;23397:17;23390:47;23454:131;23580:4;23454:131;:::i;:::-;23446:139;;23344:248;;;:::o;23598:419::-;;23802:2;23791:9;23787:18;23779:26;;23851:9;23845:4;23841:20;23837:1;23826:9;23822:17;23815:47;23879:131;24005:4;23879:131;:::i;:::-;23871:139;;23769:248;;;:::o;24023:419::-;;24227:2;24216:9;24212:18;24204:26;;24276:9;24270:4;24266:20;24262:1;24251:9;24247:17;24240:47;24304:131;24430:4;24304:131;:::i;:::-;24296:139;;24194:248;;;:::o;24448:222::-;;24579:2;24568:9;24564:18;24556:26;;24592:71;24660:1;24649:9;24645:17;24636:6;24592:71;:::i;:::-;24546:124;;;;:::o;24676:129::-;;24737:20;;:::i;:::-;24727:30;;24766:33;24794:4;24786:6;24766:33;:::i;:::-;24717:88;;;:::o;24811:75::-;;24877:2;24871:9;24861:19;;24851:35;:::o;24892:307::-;;25043:18;25035:6;25032:30;25029:2;;;25065:18;;:::i;:::-;25029:2;25103:29;25125:6;25103:29;:::i;:::-;25095:37;;25187:4;25181;25177:15;25169:23;;24958:241;;;:::o;25205:308::-;;25357:18;25349:6;25346:30;25343:2;;;25379:18;;:::i;:::-;25343:2;25417:29;25439:6;25417:29;:::i;:::-;25409:37;;25501:4;25495;25491:15;25483:23;;25272:241;;;:::o;25519:98::-;;25604:5;25598:12;25588:22;;25577:40;;;:::o;25623:99::-;;25709:5;25703:12;25693:22;;25682:40;;;:::o;25728:168::-;;25845:6;25840:3;25833:19;25885:4;25880:3;25876:14;25861:29;;25823:73;;;;:::o;25902:169::-;;26020:6;26015:3;26008:19;26060:4;26055:3;26051:14;26036:29;;25998:73;;;;:::o;26077:148::-;;26216:3;26201:18;;26191:34;;;;:::o;26231:305::-;;26290:20;26308:1;26290:20;:::i;:::-;26285:25;;26324:20;26342:1;26324:20;:::i;:::-;26319:25;;26478:1;26410:66;26406:74;26403:1;26400:81;26397:2;;;26484:18;;:::i;:::-;26397:2;26528:1;26525;26521:9;26514:16;;26275:261;;;;:::o;26542:185::-;;26599:20;26617:1;26599:20;:::i;:::-;26594:25;;26633:20;26651:1;26633:20;:::i;:::-;26628:25;;26672:1;26662:2;;26677:18;;:::i;:::-;26662:2;26719:1;26716;26712:9;26707:14;;26584:143;;;;:::o;26733:191::-;;26793:20;26811:1;26793:20;:::i;:::-;26788:25;;26827:20;26845:1;26827:20;:::i;:::-;26822:25;;26866:1;26863;26860:8;26857:2;;;26871:18;;:::i;:::-;26857:2;26916:1;26913;26909:9;26901:17;;26778:146;;;;:::o;26930:96::-;;26996:24;27014:5;26996:24;:::i;:::-;26985:35;;26975:51;;;:::o;27032:90::-;;27109:5;27102:13;27095:21;27084:32;;27074:48;;;:::o;27128:149::-;;27204:66;27197:5;27193:78;27182:89;;27172:105;;;:::o;27283:126::-;;27360:42;27353:5;27349:54;27338:65;;27328:81;;;:::o;27415:77::-;;27481:5;27470:16;;27460:32;;;:::o;27498:154::-;27582:6;27577:3;27572;27559:30;27644:1;27635:6;27630:3;27626:16;27619:27;27549:103;;;:::o;27658:307::-;27726:1;27736:113;27750:6;27747:1;27744:13;27736:113;;;27835:1;27830:3;27826:11;27820:18;27816:1;27811:3;27807:11;27800:39;27772:2;27769:1;27765:10;27760:15;;27736:113;;;27867:6;27864:1;27861:13;27858:2;;;27947:1;27938:6;27933:3;27929:16;27922:27;27858:2;27707:258;;;;:::o;27971:320::-;;28052:1;28046:4;28042:12;28032:22;;28099:1;28093:4;28089:12;28120:18;28110:2;;28176:4;28168:6;28164:17;28154:27;;28110:2;28238;28230:6;28227:14;28207:18;28204:38;28201:2;;;28257:18;;:::i;:::-;28201:2;28022:269;;;;:::o;28297:281::-;28380:27;28402:4;28380:27;:::i;:::-;28372:6;28368:40;28510:6;28498:10;28495:22;28474:18;28462:10;28459:34;28456:62;28453:2;;;28521:18;;:::i;:::-;28453:2;28561:10;28557:2;28550:22;28340:238;;;:::o;28584:233::-;;28646:24;28664:5;28646:24;:::i;:::-;28637:33;;28692:66;28685:5;28682:77;28679:2;;;28762:18;;:::i;:::-;28679:2;28809:1;28802:5;28798:13;28791:20;;28627:190;;;:::o;28823:176::-;;28872:20;28890:1;28872:20;:::i;:::-;28867:25;;28906:20;28924:1;28906:20;:::i;:::-;28901:25;;28945:1;28935:2;;28950:18;;:::i;:::-;28935:2;28991:1;28988;28984:9;28979:14;;28857:142;;;;:::o;29005:180::-;29053:77;29050:1;29043:88;29150:4;29147:1;29140:15;29174:4;29171:1;29164:15;29191:180;29239:77;29236:1;29229:88;29336:4;29333:1;29326:15;29360:4;29357:1;29350:15;29377:180;29425:77;29422:1;29415:88;29522:4;29519:1;29512:15;29546:4;29543:1;29536:15;29563:180;29611:77;29608:1;29601:88;29708:4;29705:1;29698:15;29732:4;29729:1;29722:15;29749:102;;29841:2;29837:7;29832:2;29825:5;29821:14;29817:28;29807:38;;29797:54;;;:::o;29857:237::-;29997:34;29993:1;29985:6;29981:14;29974:58;30066:20;30061:2;30053:6;30049:15;30042:45;29963:131;:::o;30100:225::-;30240:34;30236:1;30228:6;30224:14;30217:58;30309:8;30304:2;30296:6;30292:15;30285:33;30206:119;:::o;30331:178::-;30471:30;30467:1;30459:6;30455:14;30448:54;30437:72;:::o;30515:223::-;30655:34;30651:1;30643:6;30639:14;30632:58;30724:6;30719:2;30711:6;30707:15;30700:31;30621:117;:::o;30744:175::-;30884:27;30880:1;30872:6;30868:14;30861:51;30850:69;:::o;30925:231::-;31065:34;31061:1;31053:6;31049:14;31042:58;31134:14;31129:2;31121:6;31117:15;31110:39;31031:125;:::o;31162:243::-;31302:34;31298:1;31290:6;31286:14;31279:58;31371:26;31366:2;31358:6;31354:15;31347:51;31268:137;:::o;31411:229::-;31551:34;31547:1;31539:6;31535:14;31528:58;31620:12;31615:2;31607:6;31603:15;31596:37;31517:123;:::o;31646:228::-;31786:34;31782:1;31774:6;31770:14;31763:58;31855:11;31850:2;31842:6;31838:15;31831:36;31752:122;:::o;31880:233::-;32020:34;32016:1;32008:6;32004:14;31997:58;32089:16;32084:2;32076:6;32072:15;32065:41;31986:127;:::o;32119:182::-;32259:34;32255:1;32247:6;32243:14;32236:58;32225:76;:::o;32307:236::-;32447:34;32443:1;32435:6;32431:14;32424:58;32516:19;32511:2;32503:6;32499:15;32492:44;32413:130;:::o;32549:231::-;32689:34;32685:1;32677:6;32673:14;32666:58;32758:14;32753:2;32745:6;32741:15;32734:39;32655:125;:::o;32786:182::-;32926:34;32922:1;32914:6;32910:14;32903:58;32892:76;:::o;32974:228::-;33114:34;33110:1;33102:6;33098:14;33091:58;33183:11;33178:2;33170:6;33166:15;33159:36;33080:122;:::o;33208:234::-;33348:34;33344:1;33336:6;33332:14;33325:58;33417:17;33412:2;33404:6;33400:15;33393:42;33314:128;:::o;33448:220::-;33588:34;33584:1;33576:6;33572:14;33565:58;33657:3;33652:2;33644:6;33640:15;33633:28;33554:114;:::o;33674:236::-;33814:34;33810:1;33802:6;33798:14;33791:58;33883:19;33878:2;33870:6;33866:15;33859:44;33780:130;:::o;33916:122::-;33989:24;34007:5;33989:24;:::i;:::-;33982:5;33979:35;33969:2;;34028:1;34025;34018:12;33969:2;33959:79;:::o;34044:116::-;34114:21;34129:5;34114:21;:::i;:::-;34107:5;34104:32;34094:2;;34150:1;34147;34140:12;34094:2;34084:76;:::o;34166:120::-;34238:23;34255:5;34238:23;:::i;:::-;34231:5;34228:34;34218:2;;34276:1;34273;34266:12;34218:2;34208:78;:::o;34292:122::-;34365:24;34383:5;34365:24;:::i;:::-;34358:5;34355:35;34345:2;;34404:1;34401;34394:12;34345:2;34335:79;:::o

Swarm Source

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