ETH Price: $3,289.03 (+1.21%)
Gas: 2 Gwei

Token

FrenDAO Griffin (FRENG)
 

Overview

Max Total Supply

176 FRENG

Holders

125

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
suckmyfeet.eth
Balance
2 FRENG
0xe56a354b83a748a2aaa6b8fdaa293d9f891bd388
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:
FrenDAOGriffin

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-06
*/

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


// OpenZeppelin Contracts v4.4.0 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @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: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @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 {
        _setApprovalForAll(_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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @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/FrenDAOGriffin.sol

//Contract based on https://docs.openzeppelin.com/contracts/3.x/erc721

pragma solidity ^0.8.0;




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

    uint256 public constant MAX_GRIFFIN_PURCHASE = 3;
    uint256 public constant MAX_SUPPLY = 3000;
    string public constant GRIFFIN_URI = "https://gateway.pinata.cloud/ipfs/QmPk4AwMjrmKJtmXvQbmzDdiCg1JL4ECe6gbHziWHMNwUf";

    uint256 public griffinPrice = 0.11 ether;

    address treasury = 0xd26c75c33F8818900Fa9136D8387382a5bc1B5E9;

    uint256 public saleStartTime = type(uint256).max;

    Counters.Counter private _tokenIds;    

    mapping(address => uint256) public mintedPerAccount;

    constructor(uint256 startTime) Ownable() ERC721("FrenDAO Griffin", "FRENG") {
        saleStartTime = startTime; 
    }

    function withdraw() external onlyOwner {
        require(payable(treasury).send(address(this).balance));
    }

    function setOhmGriffinPrice(uint256 newGriffinPrice) external onlyOwner {
        griffinPrice = newGriffinPrice;
    }

    function setSaleStartTime(uint256 startTime) external onlyOwner {
        saleStartTime = startTime;
    }

    function mintNFT(uint256 numberOfTokens) external payable {
        require(block.timestamp >= saleStartTime, "Sale must be active to mint an Griffin");
        require(block.timestamp <= saleStartTime + 7 days, "Sale has ended");

        require(numberOfTokens > 0, "Cant mint 0");
        require(mintedPerAccount[msg.sender]+numberOfTokens <= MAX_GRIFFIN_PURCHASE, "Past account limit");
        require(msg.value == griffinPrice * numberOfTokens, "Ether value sent is not correct");
        
        for(uint i = 0; i < numberOfTokens; i++) {
            _mintNFT(msg.sender);
        }
    } 

    function totalSupply() external view returns (uint256) {
        return _tokenIds.current();
    }

    function _mintNFT(address to) internal {
        require(_tokenIds.current() < MAX_SUPPLY, "MAX_SUPPLY");
        mintedPerAccount[to]++;
        uint256 newItemId = _tokenIds.current(); 
        _tokenIds.increment(); 
        _mint(to, newItemId);
    } 

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"startTime","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"GRIFFIN_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_GRIFFIN_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"griffinPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedPerAccount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newGriffinPrice","type":"uint256"}],"name":"setOhmGriffinPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startTime","type":"uint256"}],"name":"setSaleStartTime","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052670186cc6acd4b000060075573d26c75c33f8818900fa9136d8387382a5bc1b5e9600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6009553480156200009657600080fd5b506040516200370e3803806200370e8339818101604052810190620000bc919062000348565b6040518060400160405280600f81526020017f4672656e44414f204772696666696e00000000000000000000000000000000008152506040518060400160405280600581526020017f4652454e4700000000000000000000000000000000000000000000000000000081525081600090805190602001906200014092919062000258565b5080600190805190602001906200015992919062000258565b5050506200017c620001706200018a60201b60201c565b6200019260201b60201c565b8060098190555050620003df565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200026690620003a9565b90600052602060002090601f0160209004810192826200028a5760008555620002d6565b82601f10620002a557805160ff1916838001178555620002d6565b82800160010185558215620002d6579182015b82811115620002d5578251825591602001919060010190620002b8565b5b509050620002e59190620002e9565b5090565b5b8082111562000304576000816000905550600101620002ea565b5090565b600080fd5b6000819050919050565b62000322816200030d565b81146200032e57600080fd5b50565b600081519050620003428162000317565b92915050565b60006020828403121562000361576200036062000308565b5b6000620003718482850162000331565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003c257607f821691505b60208210811415620003d957620003d86200037a565b5b50919050565b61331f80620003ef6000396000f3fe60806040526004361061019c5760003560e01c806370a08231116100ec578063a22cb4651161008a578063c87b56dd11610064578063c87b56dd14610595578063e985e9c5146105d2578063eaa5032d1461060f578063f2fde38b146106385761019c565b8063a22cb46514610518578063b88d4fde14610541578063c212a1c91461056a5761019c565b80638da5cb5b116100c65780638da5cb5b1461047b57806392642744146104a657806395d89b41146104c25780639c2bed97146104ed5761019c565b806370a08231146103fc578063715018a6146104395780638b8a4d68146104505761019c565b806323b872dd116101595780633ccfd60b116101335780633ccfd60b1461035657806342842e0e1461036d578063525f8a5c146103965780636352211e146103bf5761019c565b806323b872dd146102c557806323f54f37146102ee57806332cb6b0c1461032b5761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b31461024657806318160ddd1461026f5780631cbaee2d1461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190611f6c565b610661565b6040516101d59190611fb4565b60405180910390f35b3480156101ea57600080fd5b506101f3610743565b6040516102009190612068565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b91906120c0565b6107d5565b60405161023d919061212e565b60405180910390f35b34801561025257600080fd5b5061026d60048036038101906102689190612175565b61085a565b005b34801561027b57600080fd5b50610284610972565b60405161029191906121c4565b60405180910390f35b3480156102a657600080fd5b506102af610983565b6040516102bc91906121c4565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e791906121df565b610989565b005b3480156102fa57600080fd5b5061031560048036038101906103109190612232565b6109e9565b60405161032291906121c4565b60405180910390f35b34801561033757600080fd5b50610340610a01565b60405161034d91906121c4565b60405180910390f35b34801561036257600080fd5b5061036b610a07565b005b34801561037957600080fd5b50610394600480360381019061038f91906121df565b610ae5565b005b3480156103a257600080fd5b506103bd60048036038101906103b891906120c0565b610b05565b005b3480156103cb57600080fd5b506103e660048036038101906103e191906120c0565b610b8b565b6040516103f3919061212e565b60405180910390f35b34801561040857600080fd5b50610423600480360381019061041e9190612232565b610c3d565b60405161043091906121c4565b60405180910390f35b34801561044557600080fd5b5061044e610cf5565b005b34801561045c57600080fd5b50610465610d7d565b60405161047291906121c4565b60405180910390f35b34801561048757600080fd5b50610490610d83565b60405161049d919061212e565b60405180910390f35b6104c060048036038101906104bb91906120c0565b610dad565b005b3480156104ce57600080fd5b506104d7610f90565b6040516104e49190612068565b60405180910390f35b3480156104f957600080fd5b50610502611022565b60405161050f9190612068565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a919061228b565b61103e565b005b34801561054d57600080fd5b5061056860048036038101906105639190612400565b611054565b005b34801561057657600080fd5b5061057f6110b6565b60405161058c91906121c4565b60405180910390f35b3480156105a157600080fd5b506105bc60048036038101906105b791906120c0565b6110bb565b6040516105c99190612068565b60405180910390f35b3480156105de57600080fd5b506105f960048036038101906105f49190612483565b611114565b6040516106069190611fb4565b60405180910390f35b34801561061b57600080fd5b50610636600480360381019061063191906120c0565b6111a8565b005b34801561064457600080fd5b5061065f600480360381019061065a9190612232565b61122e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061072c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061073c575061073b82611326565b5b9050919050565b606060008054610752906124f2565b80601f016020809104026020016040519081016040528092919081815260200182805461077e906124f2565b80156107cb5780601f106107a0576101008083540402835291602001916107cb565b820191906000526020600020905b8154815290600101906020018083116107ae57829003601f168201915b5050505050905090565b60006107e082611390565b61081f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081690612596565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061086582610b8b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cd90612628565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108f56113fc565b73ffffffffffffffffffffffffffffffffffffffff16148061092457506109238161091e6113fc565b611114565b5b610963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095a906126ba565b60405180910390fd5b61096d8383611404565b505050565b600061097e600a6114bd565b905090565b60095481565b61099a6109946113fc565b826114cb565b6109d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d09061274c565b60405180910390fd5b6109e48383836115a9565b505050565b600b6020528060005260406000206000915090505481565b610bb881565b610a0f6113fc565b73ffffffffffffffffffffffffffffffffffffffff16610a2d610d83565b73ffffffffffffffffffffffffffffffffffffffff1614610a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7a906127b8565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610ae357600080fd5b565b610b0083838360405180602001604052806000815250611054565b505050565b610b0d6113fc565b73ffffffffffffffffffffffffffffffffffffffff16610b2b610d83565b73ffffffffffffffffffffffffffffffffffffffff1614610b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b78906127b8565b60405180910390fd5b8060098190555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2b9061284a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca5906128dc565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610cfd6113fc565b73ffffffffffffffffffffffffffffffffffffffff16610d1b610d83565b73ffffffffffffffffffffffffffffffffffffffff1614610d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d68906127b8565b60405180910390fd5b610d7b6000611805565b565b60075481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600954421015610df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de99061296e565b60405180910390fd5b62093a80600954610e0391906129bd565b421115610e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3c90612a5f565b60405180910390fd5b60008111610e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7f90612acb565b60405180910390fd5b600381600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ed591906129bd565b1115610f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0d90612b37565b60405180910390fd5b80600754610f249190612b57565b3414610f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5c90612bfd565b60405180910390fd5b60005b81811015610f8c57610f79336118cb565b8080610f8490612c1d565b915050610f68565b5050565b606060018054610f9f906124f2565b80601f0160208091040260200160405190810160405280929190818152602001828054610fcb906124f2565b80156110185780601f10610fed57610100808354040283529160200191611018565b820191906000526020600020905b815481529060010190602001808311610ffb57829003601f168201915b5050505050905090565b60405180608001604052806050815260200161329a6050913981565b6110506110496113fc565b8383611993565b5050565b61106561105f6113fc565b836114cb565b6110a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109b9061274c565b60405180910390fd5b6110b084848484611b00565b50505050565b600381565b60606110c682611390565b611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc90612cd8565b60405180910390fd5b61110d611b5c565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111b06113fc565b73ffffffffffffffffffffffffffffffffffffffff166111ce610d83565b73ffffffffffffffffffffffffffffffffffffffff1614611224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121b906127b8565b60405180910390fd5b8060078190555050565b6112366113fc565b73ffffffffffffffffffffffffffffffffffffffff16611254610d83565b73ffffffffffffffffffffffffffffffffffffffff16146112aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a1906127b8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561131a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131190612d6a565b60405180910390fd5b61132381611805565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661147783610b8b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60006114d682611390565b611515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150c90612dfc565b60405180910390fd5b600061152083610b8b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061158f57508373ffffffffffffffffffffffffffffffffffffffff16611577846107d5565b73ffffffffffffffffffffffffffffffffffffffff16145b806115a0575061159f8185611114565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166115c982610b8b565b73ffffffffffffffffffffffffffffffffffffffff161461161f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161690612e8e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561168f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168690612f20565b60405180910390fd5b61169a838383611b7c565b6116a5600082611404565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116f59190612f40565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461174c91906129bd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b610bb86118d8600a6114bd565b10611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190f90612fc0565b60405180910390fd5b600b60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061196890612c1d565b91905055506000611979600a6114bd565b9050611985600a611b81565b61198f8282611b97565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f99061302c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611af39190611fb4565b60405180910390a3505050565b611b0b8484846115a9565b611b1784848484611d65565b611b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4d906130be565b60405180910390fd5b50505050565b606060405180608001604052806050815260200161329a60509139905090565b505050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfe9061312a565b60405180910390fd5b611c1081611390565b15611c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4790613196565b60405180910390fd5b611c5c60008383611b7c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cac91906129bd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000611d868473ffffffffffffffffffffffffffffffffffffffff16611eed565b15611ee0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611daf6113fc565b8786866040518563ffffffff1660e01b8152600401611dd1949392919061320b565b6020604051808303816000875af1925050508015611e0d57506040513d601f19601f82011682018060405250810190611e0a919061326c565b60015b611e90573d8060008114611e3d576040519150601f19603f3d011682016040523d82523d6000602084013e611e42565b606091505b50600081511415611e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7f906130be565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611ee5565b600190505b949350505050565b600080823b905060008111915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611f4981611f14565b8114611f5457600080fd5b50565b600081359050611f6681611f40565b92915050565b600060208284031215611f8257611f81611f0a565b5b6000611f9084828501611f57565b91505092915050565b60008115159050919050565b611fae81611f99565b82525050565b6000602082019050611fc96000830184611fa5565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612009578082015181840152602081019050611fee565b83811115612018576000848401525b50505050565b6000601f19601f8301169050919050565b600061203a82611fcf565b6120448185611fda565b9350612054818560208601611feb565b61205d8161201e565b840191505092915050565b60006020820190508181036000830152612082818461202f565b905092915050565b6000819050919050565b61209d8161208a565b81146120a857600080fd5b50565b6000813590506120ba81612094565b92915050565b6000602082840312156120d6576120d5611f0a565b5b60006120e4848285016120ab565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612118826120ed565b9050919050565b6121288161210d565b82525050565b6000602082019050612143600083018461211f565b92915050565b6121528161210d565b811461215d57600080fd5b50565b60008135905061216f81612149565b92915050565b6000806040838503121561218c5761218b611f0a565b5b600061219a85828601612160565b92505060206121ab858286016120ab565b9150509250929050565b6121be8161208a565b82525050565b60006020820190506121d960008301846121b5565b92915050565b6000806000606084860312156121f8576121f7611f0a565b5b600061220686828701612160565b935050602061221786828701612160565b9250506040612228868287016120ab565b9150509250925092565b60006020828403121561224857612247611f0a565b5b600061225684828501612160565b91505092915050565b61226881611f99565b811461227357600080fd5b50565b6000813590506122858161225f565b92915050565b600080604083850312156122a2576122a1611f0a565b5b60006122b085828601612160565b92505060206122c185828601612276565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61230d8261201e565b810181811067ffffffffffffffff8211171561232c5761232b6122d5565b5b80604052505050565b600061233f611f00565b905061234b8282612304565b919050565b600067ffffffffffffffff82111561236b5761236a6122d5565b5b6123748261201e565b9050602081019050919050565b82818337600083830152505050565b60006123a361239e84612350565b612335565b9050828152602081018484840111156123bf576123be6122d0565b5b6123ca848285612381565b509392505050565b600082601f8301126123e7576123e66122cb565b5b81356123f7848260208601612390565b91505092915050565b6000806000806080858703121561241a57612419611f0a565b5b600061242887828801612160565b945050602061243987828801612160565b935050604061244a878288016120ab565b925050606085013567ffffffffffffffff81111561246b5761246a611f0f565b5b612477878288016123d2565b91505092959194509250565b6000806040838503121561249a57612499611f0a565b5b60006124a885828601612160565b92505060206124b985828601612160565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061250a57607f821691505b6020821081141561251e5761251d6124c3565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612580602c83611fda565b915061258b82612524565b604082019050919050565b600060208201905081810360008301526125af81612573565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612612602183611fda565b915061261d826125b6565b604082019050919050565b6000602082019050818103600083015261264181612605565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006126a4603883611fda565b91506126af82612648565b604082019050919050565b600060208201905081810360008301526126d381612697565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000612736603183611fda565b9150612741826126da565b604082019050919050565b6000602082019050818103600083015261276581612729565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006127a2602083611fda565b91506127ad8261276c565b602082019050919050565b600060208201905081810360008301526127d181612795565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000612834602983611fda565b915061283f826127d8565b604082019050919050565b6000602082019050818103600083015261286381612827565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006128c6602a83611fda565b91506128d18261286a565b604082019050919050565b600060208201905081810360008301526128f5816128b9565b9050919050565b7f53616c65206d7573742062652061637469766520746f206d696e7420616e204760008201527f72696666696e0000000000000000000000000000000000000000000000000000602082015250565b6000612958602683611fda565b9150612963826128fc565b604082019050919050565b600060208201905081810360008301526129878161294b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006129c88261208a565b91506129d38361208a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612a0857612a0761298e565b5b828201905092915050565b7f53616c652068617320656e646564000000000000000000000000000000000000600082015250565b6000612a49600e83611fda565b9150612a5482612a13565b602082019050919050565b60006020820190508181036000830152612a7881612a3c565b9050919050565b7f43616e74206d696e742030000000000000000000000000000000000000000000600082015250565b6000612ab5600b83611fda565b9150612ac082612a7f565b602082019050919050565b60006020820190508181036000830152612ae481612aa8565b9050919050565b7f50617374206163636f756e74206c696d69740000000000000000000000000000600082015250565b6000612b21601283611fda565b9150612b2c82612aeb565b602082019050919050565b60006020820190508181036000830152612b5081612b14565b9050919050565b6000612b628261208a565b9150612b6d8361208a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612ba657612ba561298e565b5b828202905092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000612be7601f83611fda565b9150612bf282612bb1565b602082019050919050565b60006020820190508181036000830152612c1681612bda565b9050919050565b6000612c288261208a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612c5b57612c5a61298e565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000612cc2602f83611fda565b9150612ccd82612c66565b604082019050919050565b60006020820190508181036000830152612cf181612cb5565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612d54602683611fda565b9150612d5f82612cf8565b604082019050919050565b60006020820190508181036000830152612d8381612d47565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612de6602c83611fda565b9150612df182612d8a565b604082019050919050565b60006020820190508181036000830152612e1581612dd9565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000612e78602983611fda565b9150612e8382612e1c565b604082019050919050565b60006020820190508181036000830152612ea781612e6b565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612f0a602483611fda565b9150612f1582612eae565b604082019050919050565b60006020820190508181036000830152612f3981612efd565b9050919050565b6000612f4b8261208a565b9150612f568361208a565b925082821015612f6957612f6861298e565b5b828203905092915050565b7f4d41585f535550504c5900000000000000000000000000000000000000000000600082015250565b6000612faa600a83611fda565b9150612fb582612f74565b602082019050919050565b60006020820190508181036000830152612fd981612f9d565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613016601983611fda565b915061302182612fe0565b602082019050919050565b6000602082019050818103600083015261304581613009565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006130a8603283611fda565b91506130b38261304c565b604082019050919050565b600060208201905081810360008301526130d78161309b565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613114602083611fda565b915061311f826130de565b602082019050919050565b6000602082019050818103600083015261314381613107565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613180601c83611fda565b915061318b8261314a565b602082019050919050565b600060208201905081810360008301526131af81613173565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006131dd826131b6565b6131e781856131c1565b93506131f7818560208601611feb565b6132008161201e565b840191505092915050565b6000608082019050613220600083018761211f565b61322d602083018661211f565b61323a60408301856121b5565b818103606083015261324c81846131d2565b905095945050505050565b60008151905061326681611f40565b92915050565b60006020828403121561328257613281611f0a565b5b600061329084828501613257565b9150509291505056fe68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d506b3441774d6a726d4b4a746d587651626d7a4464694367314a4c34454365366762487a6957484d4e775566a26469706673582212203465d3fe465cabf0948411c426443cac9730bbec603ab412f779ee85261dd8cf64736f6c634300080a00330000000000000000000000000000000000000000000000000000000061ae80d8

Deployed Bytecode

0x60806040526004361061019c5760003560e01c806370a08231116100ec578063a22cb4651161008a578063c87b56dd11610064578063c87b56dd14610595578063e985e9c5146105d2578063eaa5032d1461060f578063f2fde38b146106385761019c565b8063a22cb46514610518578063b88d4fde14610541578063c212a1c91461056a5761019c565b80638da5cb5b116100c65780638da5cb5b1461047b57806392642744146104a657806395d89b41146104c25780639c2bed97146104ed5761019c565b806370a08231146103fc578063715018a6146104395780638b8a4d68146104505761019c565b806323b872dd116101595780633ccfd60b116101335780633ccfd60b1461035657806342842e0e1461036d578063525f8a5c146103965780636352211e146103bf5761019c565b806323b872dd146102c557806323f54f37146102ee57806332cb6b0c1461032b5761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b31461024657806318160ddd1461026f5780631cbaee2d1461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190611f6c565b610661565b6040516101d59190611fb4565b60405180910390f35b3480156101ea57600080fd5b506101f3610743565b6040516102009190612068565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b91906120c0565b6107d5565b60405161023d919061212e565b60405180910390f35b34801561025257600080fd5b5061026d60048036038101906102689190612175565b61085a565b005b34801561027b57600080fd5b50610284610972565b60405161029191906121c4565b60405180910390f35b3480156102a657600080fd5b506102af610983565b6040516102bc91906121c4565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e791906121df565b610989565b005b3480156102fa57600080fd5b5061031560048036038101906103109190612232565b6109e9565b60405161032291906121c4565b60405180910390f35b34801561033757600080fd5b50610340610a01565b60405161034d91906121c4565b60405180910390f35b34801561036257600080fd5b5061036b610a07565b005b34801561037957600080fd5b50610394600480360381019061038f91906121df565b610ae5565b005b3480156103a257600080fd5b506103bd60048036038101906103b891906120c0565b610b05565b005b3480156103cb57600080fd5b506103e660048036038101906103e191906120c0565b610b8b565b6040516103f3919061212e565b60405180910390f35b34801561040857600080fd5b50610423600480360381019061041e9190612232565b610c3d565b60405161043091906121c4565b60405180910390f35b34801561044557600080fd5b5061044e610cf5565b005b34801561045c57600080fd5b50610465610d7d565b60405161047291906121c4565b60405180910390f35b34801561048757600080fd5b50610490610d83565b60405161049d919061212e565b60405180910390f35b6104c060048036038101906104bb91906120c0565b610dad565b005b3480156104ce57600080fd5b506104d7610f90565b6040516104e49190612068565b60405180910390f35b3480156104f957600080fd5b50610502611022565b60405161050f9190612068565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a919061228b565b61103e565b005b34801561054d57600080fd5b5061056860048036038101906105639190612400565b611054565b005b34801561057657600080fd5b5061057f6110b6565b60405161058c91906121c4565b60405180910390f35b3480156105a157600080fd5b506105bc60048036038101906105b791906120c0565b6110bb565b6040516105c99190612068565b60405180910390f35b3480156105de57600080fd5b506105f960048036038101906105f49190612483565b611114565b6040516106069190611fb4565b60405180910390f35b34801561061b57600080fd5b50610636600480360381019061063191906120c0565b6111a8565b005b34801561064457600080fd5b5061065f600480360381019061065a9190612232565b61122e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061072c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061073c575061073b82611326565b5b9050919050565b606060008054610752906124f2565b80601f016020809104026020016040519081016040528092919081815260200182805461077e906124f2565b80156107cb5780601f106107a0576101008083540402835291602001916107cb565b820191906000526020600020905b8154815290600101906020018083116107ae57829003601f168201915b5050505050905090565b60006107e082611390565b61081f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081690612596565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061086582610b8b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cd90612628565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108f56113fc565b73ffffffffffffffffffffffffffffffffffffffff16148061092457506109238161091e6113fc565b611114565b5b610963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095a906126ba565b60405180910390fd5b61096d8383611404565b505050565b600061097e600a6114bd565b905090565b60095481565b61099a6109946113fc565b826114cb565b6109d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d09061274c565b60405180910390fd5b6109e48383836115a9565b505050565b600b6020528060005260406000206000915090505481565b610bb881565b610a0f6113fc565b73ffffffffffffffffffffffffffffffffffffffff16610a2d610d83565b73ffffffffffffffffffffffffffffffffffffffff1614610a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7a906127b8565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610ae357600080fd5b565b610b0083838360405180602001604052806000815250611054565b505050565b610b0d6113fc565b73ffffffffffffffffffffffffffffffffffffffff16610b2b610d83565b73ffffffffffffffffffffffffffffffffffffffff1614610b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b78906127b8565b60405180910390fd5b8060098190555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2b9061284a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca5906128dc565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610cfd6113fc565b73ffffffffffffffffffffffffffffffffffffffff16610d1b610d83565b73ffffffffffffffffffffffffffffffffffffffff1614610d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d68906127b8565b60405180910390fd5b610d7b6000611805565b565b60075481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600954421015610df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de99061296e565b60405180910390fd5b62093a80600954610e0391906129bd565b421115610e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3c90612a5f565b60405180910390fd5b60008111610e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7f90612acb565b60405180910390fd5b600381600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ed591906129bd565b1115610f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0d90612b37565b60405180910390fd5b80600754610f249190612b57565b3414610f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5c90612bfd565b60405180910390fd5b60005b81811015610f8c57610f79336118cb565b8080610f8490612c1d565b915050610f68565b5050565b606060018054610f9f906124f2565b80601f0160208091040260200160405190810160405280929190818152602001828054610fcb906124f2565b80156110185780601f10610fed57610100808354040283529160200191611018565b820191906000526020600020905b815481529060010190602001808311610ffb57829003601f168201915b5050505050905090565b60405180608001604052806050815260200161329a6050913981565b6110506110496113fc565b8383611993565b5050565b61106561105f6113fc565b836114cb565b6110a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109b9061274c565b60405180910390fd5b6110b084848484611b00565b50505050565b600381565b60606110c682611390565b611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc90612cd8565b60405180910390fd5b61110d611b5c565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111b06113fc565b73ffffffffffffffffffffffffffffffffffffffff166111ce610d83565b73ffffffffffffffffffffffffffffffffffffffff1614611224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121b906127b8565b60405180910390fd5b8060078190555050565b6112366113fc565b73ffffffffffffffffffffffffffffffffffffffff16611254610d83565b73ffffffffffffffffffffffffffffffffffffffff16146112aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a1906127b8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561131a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131190612d6a565b60405180910390fd5b61132381611805565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661147783610b8b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60006114d682611390565b611515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150c90612dfc565b60405180910390fd5b600061152083610b8b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061158f57508373ffffffffffffffffffffffffffffffffffffffff16611577846107d5565b73ffffffffffffffffffffffffffffffffffffffff16145b806115a0575061159f8185611114565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166115c982610b8b565b73ffffffffffffffffffffffffffffffffffffffff161461161f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161690612e8e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561168f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168690612f20565b60405180910390fd5b61169a838383611b7c565b6116a5600082611404565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116f59190612f40565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461174c91906129bd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b610bb86118d8600a6114bd565b10611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190f90612fc0565b60405180910390fd5b600b60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061196890612c1d565b91905055506000611979600a6114bd565b9050611985600a611b81565b61198f8282611b97565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f99061302c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611af39190611fb4565b60405180910390a3505050565b611b0b8484846115a9565b611b1784848484611d65565b611b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4d906130be565b60405180910390fd5b50505050565b606060405180608001604052806050815260200161329a60509139905090565b505050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfe9061312a565b60405180910390fd5b611c1081611390565b15611c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4790613196565b60405180910390fd5b611c5c60008383611b7c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cac91906129bd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000611d868473ffffffffffffffffffffffffffffffffffffffff16611eed565b15611ee0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611daf6113fc565b8786866040518563ffffffff1660e01b8152600401611dd1949392919061320b565b6020604051808303816000875af1925050508015611e0d57506040513d601f19601f82011682018060405250810190611e0a919061326c565b60015b611e90573d8060008114611e3d576040519150601f19603f3d011682016040523d82523d6000602084013e611e42565b606091505b50600081511415611e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7f906130be565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611ee5565b600190505b949350505050565b600080823b905060008111915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611f4981611f14565b8114611f5457600080fd5b50565b600081359050611f6681611f40565b92915050565b600060208284031215611f8257611f81611f0a565b5b6000611f9084828501611f57565b91505092915050565b60008115159050919050565b611fae81611f99565b82525050565b6000602082019050611fc96000830184611fa5565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612009578082015181840152602081019050611fee565b83811115612018576000848401525b50505050565b6000601f19601f8301169050919050565b600061203a82611fcf565b6120448185611fda565b9350612054818560208601611feb565b61205d8161201e565b840191505092915050565b60006020820190508181036000830152612082818461202f565b905092915050565b6000819050919050565b61209d8161208a565b81146120a857600080fd5b50565b6000813590506120ba81612094565b92915050565b6000602082840312156120d6576120d5611f0a565b5b60006120e4848285016120ab565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612118826120ed565b9050919050565b6121288161210d565b82525050565b6000602082019050612143600083018461211f565b92915050565b6121528161210d565b811461215d57600080fd5b50565b60008135905061216f81612149565b92915050565b6000806040838503121561218c5761218b611f0a565b5b600061219a85828601612160565b92505060206121ab858286016120ab565b9150509250929050565b6121be8161208a565b82525050565b60006020820190506121d960008301846121b5565b92915050565b6000806000606084860312156121f8576121f7611f0a565b5b600061220686828701612160565b935050602061221786828701612160565b9250506040612228868287016120ab565b9150509250925092565b60006020828403121561224857612247611f0a565b5b600061225684828501612160565b91505092915050565b61226881611f99565b811461227357600080fd5b50565b6000813590506122858161225f565b92915050565b600080604083850312156122a2576122a1611f0a565b5b60006122b085828601612160565b92505060206122c185828601612276565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61230d8261201e565b810181811067ffffffffffffffff8211171561232c5761232b6122d5565b5b80604052505050565b600061233f611f00565b905061234b8282612304565b919050565b600067ffffffffffffffff82111561236b5761236a6122d5565b5b6123748261201e565b9050602081019050919050565b82818337600083830152505050565b60006123a361239e84612350565b612335565b9050828152602081018484840111156123bf576123be6122d0565b5b6123ca848285612381565b509392505050565b600082601f8301126123e7576123e66122cb565b5b81356123f7848260208601612390565b91505092915050565b6000806000806080858703121561241a57612419611f0a565b5b600061242887828801612160565b945050602061243987828801612160565b935050604061244a878288016120ab565b925050606085013567ffffffffffffffff81111561246b5761246a611f0f565b5b612477878288016123d2565b91505092959194509250565b6000806040838503121561249a57612499611f0a565b5b60006124a885828601612160565b92505060206124b985828601612160565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061250a57607f821691505b6020821081141561251e5761251d6124c3565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612580602c83611fda565b915061258b82612524565b604082019050919050565b600060208201905081810360008301526125af81612573565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612612602183611fda565b915061261d826125b6565b604082019050919050565b6000602082019050818103600083015261264181612605565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006126a4603883611fda565b91506126af82612648565b604082019050919050565b600060208201905081810360008301526126d381612697565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000612736603183611fda565b9150612741826126da565b604082019050919050565b6000602082019050818103600083015261276581612729565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006127a2602083611fda565b91506127ad8261276c565b602082019050919050565b600060208201905081810360008301526127d181612795565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000612834602983611fda565b915061283f826127d8565b604082019050919050565b6000602082019050818103600083015261286381612827565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006128c6602a83611fda565b91506128d18261286a565b604082019050919050565b600060208201905081810360008301526128f5816128b9565b9050919050565b7f53616c65206d7573742062652061637469766520746f206d696e7420616e204760008201527f72696666696e0000000000000000000000000000000000000000000000000000602082015250565b6000612958602683611fda565b9150612963826128fc565b604082019050919050565b600060208201905081810360008301526129878161294b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006129c88261208a565b91506129d38361208a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612a0857612a0761298e565b5b828201905092915050565b7f53616c652068617320656e646564000000000000000000000000000000000000600082015250565b6000612a49600e83611fda565b9150612a5482612a13565b602082019050919050565b60006020820190508181036000830152612a7881612a3c565b9050919050565b7f43616e74206d696e742030000000000000000000000000000000000000000000600082015250565b6000612ab5600b83611fda565b9150612ac082612a7f565b602082019050919050565b60006020820190508181036000830152612ae481612aa8565b9050919050565b7f50617374206163636f756e74206c696d69740000000000000000000000000000600082015250565b6000612b21601283611fda565b9150612b2c82612aeb565b602082019050919050565b60006020820190508181036000830152612b5081612b14565b9050919050565b6000612b628261208a565b9150612b6d8361208a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612ba657612ba561298e565b5b828202905092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000612be7601f83611fda565b9150612bf282612bb1565b602082019050919050565b60006020820190508181036000830152612c1681612bda565b9050919050565b6000612c288261208a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612c5b57612c5a61298e565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000612cc2602f83611fda565b9150612ccd82612c66565b604082019050919050565b60006020820190508181036000830152612cf181612cb5565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612d54602683611fda565b9150612d5f82612cf8565b604082019050919050565b60006020820190508181036000830152612d8381612d47565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612de6602c83611fda565b9150612df182612d8a565b604082019050919050565b60006020820190508181036000830152612e1581612dd9565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000612e78602983611fda565b9150612e8382612e1c565b604082019050919050565b60006020820190508181036000830152612ea781612e6b565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612f0a602483611fda565b9150612f1582612eae565b604082019050919050565b60006020820190508181036000830152612f3981612efd565b9050919050565b6000612f4b8261208a565b9150612f568361208a565b925082821015612f6957612f6861298e565b5b828203905092915050565b7f4d41585f535550504c5900000000000000000000000000000000000000000000600082015250565b6000612faa600a83611fda565b9150612fb582612f74565b602082019050919050565b60006020820190508181036000830152612fd981612f9d565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613016601983611fda565b915061302182612fe0565b602082019050919050565b6000602082019050818103600083015261304581613009565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006130a8603283611fda565b91506130b38261304c565b604082019050919050565b600060208201905081810360008301526130d78161309b565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613114602083611fda565b915061311f826130de565b602082019050919050565b6000602082019050818103600083015261314381613107565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613180601c83611fda565b915061318b8261314a565b602082019050919050565b600060208201905081810360008301526131af81613173565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006131dd826131b6565b6131e781856131c1565b93506131f7818560208601611feb565b6132008161201e565b840191505092915050565b6000608082019050613220600083018761211f565b61322d602083018661211f565b61323a60408301856121b5565b818103606083015261324c81846131d2565b905095945050505050565b60008151905061326681611f40565b92915050565b60006020828403121561328257613281611f0a565b5b600061329084828501613257565b9150509291505056fe68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d506b3441774d6a726d4b4a746d587651626d7a4464694367314a4c34454365366762487a6957484d4e775566a26469706673582212203465d3fe465cabf0948411c426443cac9730bbec603ab412f779ee85261dd8cf64736f6c634300080a0033

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

0000000000000000000000000000000000000000000000000000000061ae80d8

-----Decoded View---------------
Arg [0] : startTime (uint256): 1638826200

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000061ae80d8


Deployed Bytecode Sourcemap

37795:2440:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25207:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26152:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27711:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27234:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39519:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38244:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28461:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38348:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37949:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38537:112;;;;;;;;;;;;;:::i;:::-;;28871:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38786:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25846:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25576:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6195:103;;;;;;;;;;;;;:::i;:::-;;38125:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5544:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38902:608;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26321:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37997:119;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28004:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29127:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37894:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39897:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28230:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38657:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6453:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25207:305;25309:4;25361:25;25346:40;;;:11;:40;;;;:105;;;;25418:33;25403:48;;;:11;:48;;;;25346:105;:158;;;;25468:36;25492:11;25468:23;:36::i;:::-;25346:158;25326:178;;25207:305;;;:::o;26152:100::-;26206:13;26239:5;26232:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26152:100;:::o;27711:221::-;27787:7;27815:16;27823:7;27815;:16::i;:::-;27807:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27900:15;:24;27916:7;27900:24;;;;;;;;;;;;;;;;;;;;;27893:31;;27711:221;;;:::o;27234:411::-;27315:13;27331:23;27346:7;27331:14;:23::i;:::-;27315:39;;27379:5;27373:11;;:2;:11;;;;27365:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27473:5;27457:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27482:37;27499:5;27506:12;:10;:12::i;:::-;27482:16;:37::i;:::-;27457:62;27435:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27616:21;27625:2;27629:7;27616:8;:21::i;:::-;27304:341;27234:411;;:::o;39519:100::-;39565:7;39592:19;:9;:17;:19::i;:::-;39585:26;;39519:100;:::o;38244:48::-;;;;:::o;28461:339::-;28656:41;28675:12;:10;:12::i;:::-;28689:7;28656:18;:41::i;:::-;28648:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28764:28;28774:4;28780:2;28784:7;28764:9;:28::i;:::-;28461:339;;;:::o;38348:51::-;;;;;;;;;;;;;;;;;:::o;37949:41::-;37986:4;37949:41;:::o;38537:112::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38603:8:::1;;;;;;;;;;;38595:22;;:45;38618:21;38595:45;;;;;;;;;;;;;;;;;;;;;;;38587:54;;;::::0;::::1;;38537:112::o:0;28871:185::-;29009:39;29026:4;29032:2;29036:7;29009:39;;;;;;;;;;;;:16;:39::i;:::-;28871:185;;;:::o;38786:108::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38877:9:::1;38861:13;:25;;;;38786:108:::0;:::o;25846:239::-;25918:7;25938:13;25954:7;:16;25962:7;25954:16;;;;;;;;;;;;;;;;;;;;;25938:32;;26006:1;25989:19;;:5;:19;;;;25981:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26072:5;26065:12;;;25846:239;;;:::o;25576:208::-;25648:7;25693:1;25676:19;;:5;:19;;;;25668:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25760:9;:16;25770:5;25760:16;;;;;;;;;;;;;;;;25753:23;;25576:208;;;:::o;6195:103::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6260:30:::1;6287:1;6260:18;:30::i;:::-;6195:103::o:0;38125:40::-;;;;:::o;5544:87::-;5590:7;5617:6;;;;;;;;;;;5610:13;;5544:87;:::o;38902:608::-;38998:13;;38979:15;:32;;38971:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;39108:6;39092:13;;:22;;;;:::i;:::-;39073:15;:41;;39065:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39171:1;39154:14;:18;39146:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;37941:1;39236:14;39207:16;:28;39224:10;39207:28;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;:67;;39199:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;39344:14;39329:12;;:29;;;;:::i;:::-;39316:9;:42;39308:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;39419:6;39415:88;39435:14;39431:1;:18;39415:88;;;39471:20;39480:10;39471:8;:20::i;:::-;39451:3;;;;;:::i;:::-;;;;39415:88;;;;38902:608;:::o;26321:104::-;26377:13;26410:7;26403:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26321:104;:::o;37997:119::-;;;;;;;;;;;;;;;;;;;:::o;28004:155::-;28099:52;28118:12;:10;:12::i;:::-;28132:8;28142;28099:18;:52::i;:::-;28004:155;;:::o;29127:328::-;29302:41;29321:12;:10;:12::i;:::-;29335:7;29302:18;:41::i;:::-;29294:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29408:39;29422:4;29428:2;29432:7;29441:5;29408:13;:39::i;:::-;29127:328;;;;:::o;37894:48::-;37941:1;37894:48;:::o;39897:211::-;39970:13;40004:16;40012:7;40004;:16::i;:::-;39996:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;40090:10;:8;:10::i;:::-;40083:17;;39897:211;;;:::o;28230:164::-;28327:4;28351:18;:25;28370:5;28351:25;;;;;;;;;;;;;;;:35;28377:8;28351:35;;;;;;;;;;;;;;;;;;;;;;;;;28344:42;;28230:164;;;;:::o;38657:121::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38755:15:::1;38740:12;:30;;;;38657:121:::0;:::o;6453:201::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6562:1:::1;6542:22;;:8;:22;;;;6534:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6618:28;6637:8;6618:18;:28::i;:::-;6453:201:::0;:::o;17976:157::-;18061:4;18100:25;18085:40;;;:11;:40;;;;18078:47;;17976:157;;;:::o;30965:127::-;31030:4;31082:1;31054:30;;:7;:16;31062:7;31054:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31047:37;;30965:127;;;:::o;4268:98::-;4321:7;4348:10;4341:17;;4268:98;:::o;34947:174::-;35049:2;35022:15;:24;35038:7;35022:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35105:7;35101:2;35067:46;;35076:23;35091:7;35076:14;:23::i;:::-;35067:46;;;;;;;;;;;;34947:174;;:::o;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;31259:348::-;31352:4;31377:16;31385:7;31377;:16::i;:::-;31369:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31453:13;31469:23;31484:7;31469:14;:23::i;:::-;31453:39;;31522:5;31511:16;;:7;:16;;;:51;;;;31555:7;31531:31;;:20;31543:7;31531:11;:20::i;:::-;:31;;;31511:51;:87;;;;31566:32;31583:5;31590:7;31566:16;:32::i;:::-;31511:87;31503:96;;;31259:348;;;;:::o;34251:578::-;34410:4;34383:31;;:23;34398:7;34383:14;:23::i;:::-;:31;;;34375:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34493:1;34479:16;;:2;:16;;;;34471:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34549:39;34570:4;34576:2;34580:7;34549:20;:39::i;:::-;34653:29;34670:1;34674:7;34653:8;:29::i;:::-;34714:1;34695:9;:15;34705:4;34695:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34743:1;34726:9;:13;34736:2;34726:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34774:2;34755:7;:16;34763:7;34755:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34813:7;34809:2;34794:27;;34803:4;34794:27;;;;;;;;;;;;34251:578;;;:::o;6814:191::-;6888:16;6907:6;;;;;;;;;;;6888:25;;6933:8;6924:6;;:17;;;;;;;;;;;;;;;;;;6988:8;6957:40;;6978:8;6957:40;;;;;;;;;;;;6877:128;6814:191;:::o;39627:261::-;37986:4;39685:19;:9;:17;:19::i;:::-;:32;39677:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;39743:16;:20;39760:2;39743:20;;;;;;;;;;;;;;;;:22;;;;;;;;;:::i;:::-;;;;;;39776:17;39796:19;:9;:17;:19::i;:::-;39776:39;;39827:21;:9;:19;:21::i;:::-;39860:20;39866:2;39870:9;39860:5;:20::i;:::-;39666:222;39627:261;:::o;35263:315::-;35418:8;35409:17;;:5;:17;;;;35401:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;35505:8;35467:18;:25;35486:5;35467:25;;;;;;;;;;;;;;;:35;35493:8;35467:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;35551:8;35529:41;;35544:5;35529:41;;;35561:8;35529:41;;;;;;:::i;:::-;;;;;;;;35263:315;;;:::o;30337:::-;30494:28;30504:4;30510:2;30514:7;30494:9;:28::i;:::-;30541:48;30564:4;30570:2;30574:7;30583:5;30541:22;:48::i;:::-;30533:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30337:315;;;;:::o;40120:112::-;40180:13;40213:11;;;;;;;;;;;;;;;;;40206:18;;40120:112;:::o;37514:126::-;;;;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;32943:382::-;33037:1;33023:16;;:2;:16;;;;33015:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33096:16;33104:7;33096;:16::i;:::-;33095:17;33087:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33158:45;33187:1;33191:2;33195:7;33158:20;:45::i;:::-;33233:1;33216:9;:13;33226:2;33216:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33264:2;33245:7;:16;33253:7;33245:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33309:7;33305:2;33284:33;;33301:1;33284:33;;;;;;;;;;;;32943:382;;:::o;36143:799::-;36298:4;36319:15;:2;:13;;;:15::i;:::-;36315:620;;;36371:2;36355:36;;;36392:12;:10;:12::i;:::-;36406:4;36412:7;36421:5;36355:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36351:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36614:1;36597:6;:13;:18;36593:272;;;36640:60;;;;;;;;;;:::i;:::-;;;;;;;;36593:272;36815:6;36809:13;36800:6;36796:2;36792:15;36785:38;36351:529;36488:41;;;36478:51;;;:6;:51;;;;36471:58;;;;;36315:620;36919:4;36912:11;;36143:799;;;;;;;:::o;7832:387::-;7892:4;8100:12;8167:7;8155:20;8147:28;;8210:1;8203:4;:8;8196:15;;;7832:387;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:116::-;6320:21;6335:5;6320:21;:::i;:::-;6313:5;6310:32;6300:60;;6356:1;6353;6346:12;6300:60;6250:116;:::o;6372:133::-;6415:5;6453:6;6440:20;6431:29;;6469:30;6493:5;6469:30;:::i;:::-;6372:133;;;;:::o;6511:468::-;6576:6;6584;6633:2;6621:9;6612:7;6608:23;6604:32;6601:119;;;6639:79;;:::i;:::-;6601:119;6759:1;6784:53;6829:7;6820:6;6809:9;6805:22;6784:53;:::i;:::-;6774:63;;6730:117;6886:2;6912:50;6954:7;6945:6;6934:9;6930:22;6912:50;:::i;:::-;6902:60;;6857:115;6511:468;;;;;:::o;6985:117::-;7094:1;7091;7084:12;7108:117;7217:1;7214;7207:12;7231:180;7279:77;7276:1;7269:88;7376:4;7373:1;7366:15;7400:4;7397:1;7390:15;7417:281;7500:27;7522:4;7500:27;:::i;:::-;7492:6;7488:40;7630:6;7618:10;7615:22;7594:18;7582:10;7579:34;7576:62;7573:88;;;7641:18;;:::i;:::-;7573:88;7681:10;7677:2;7670:22;7460:238;7417:281;;:::o;7704:129::-;7738:6;7765:20;;:::i;:::-;7755:30;;7794:33;7822:4;7814:6;7794:33;:::i;:::-;7704:129;;;:::o;7839:307::-;7900:4;7990:18;7982:6;7979:30;7976:56;;;8012:18;;:::i;:::-;7976:56;8050:29;8072:6;8050:29;:::i;:::-;8042:37;;8134:4;8128;8124:15;8116:23;;7839:307;;;:::o;8152:154::-;8236:6;8231:3;8226;8213:30;8298:1;8289:6;8284:3;8280:16;8273:27;8152:154;;;:::o;8312:410::-;8389:5;8414:65;8430:48;8471:6;8430:48;:::i;:::-;8414:65;:::i;:::-;8405:74;;8502:6;8495:5;8488:21;8540:4;8533:5;8529:16;8578:3;8569:6;8564:3;8560:16;8557:25;8554:112;;;8585:79;;:::i;:::-;8554:112;8675:41;8709:6;8704:3;8699;8675:41;:::i;:::-;8395:327;8312:410;;;;;:::o;8741:338::-;8796:5;8845:3;8838:4;8830:6;8826:17;8822:27;8812:122;;8853:79;;:::i;:::-;8812:122;8970:6;8957:20;8995:78;9069:3;9061:6;9054:4;9046:6;9042:17;8995:78;:::i;:::-;8986:87;;8802:277;8741:338;;;;:::o;9085:943::-;9180:6;9188;9196;9204;9253:3;9241:9;9232:7;9228:23;9224:33;9221:120;;;9260:79;;:::i;:::-;9221:120;9380:1;9405:53;9450:7;9441:6;9430:9;9426:22;9405:53;:::i;:::-;9395:63;;9351:117;9507:2;9533:53;9578:7;9569:6;9558:9;9554:22;9533:53;:::i;:::-;9523:63;;9478:118;9635:2;9661:53;9706:7;9697:6;9686:9;9682:22;9661:53;:::i;:::-;9651:63;;9606:118;9791:2;9780:9;9776:18;9763:32;9822:18;9814:6;9811:30;9808:117;;;9844:79;;:::i;:::-;9808:117;9949:62;10003:7;9994:6;9983:9;9979:22;9949:62;:::i;:::-;9939:72;;9734:287;9085:943;;;;;;;:::o;10034:474::-;10102:6;10110;10159:2;10147:9;10138:7;10134:23;10130:32;10127:119;;;10165:79;;:::i;:::-;10127:119;10285:1;10310:53;10355:7;10346:6;10335:9;10331:22;10310:53;:::i;:::-;10300:63;;10256:117;10412:2;10438:53;10483:7;10474:6;10463:9;10459:22;10438:53;:::i;:::-;10428:63;;10383:118;10034:474;;;;;:::o;10514:180::-;10562:77;10559:1;10552:88;10659:4;10656:1;10649:15;10683:4;10680:1;10673:15;10700:320;10744:6;10781:1;10775:4;10771:12;10761:22;;10828:1;10822:4;10818:12;10849:18;10839:81;;10905:4;10897:6;10893:17;10883:27;;10839:81;10967:2;10959:6;10956:14;10936:18;10933:38;10930:84;;;10986:18;;:::i;:::-;10930:84;10751:269;10700:320;;;:::o;11026:231::-;11166:34;11162:1;11154:6;11150:14;11143:58;11235:14;11230:2;11222:6;11218:15;11211:39;11026:231;:::o;11263:366::-;11405:3;11426:67;11490:2;11485:3;11426:67;:::i;:::-;11419:74;;11502:93;11591:3;11502:93;:::i;:::-;11620:2;11615:3;11611:12;11604:19;;11263:366;;;:::o;11635:419::-;11801:4;11839:2;11828:9;11824:18;11816:26;;11888:9;11882:4;11878:20;11874:1;11863:9;11859:17;11852:47;11916:131;12042:4;11916:131;:::i;:::-;11908:139;;11635:419;;;:::o;12060:220::-;12200:34;12196:1;12188:6;12184:14;12177:58;12269:3;12264:2;12256:6;12252:15;12245:28;12060:220;:::o;12286:366::-;12428:3;12449:67;12513:2;12508:3;12449:67;:::i;:::-;12442:74;;12525:93;12614:3;12525:93;:::i;:::-;12643:2;12638:3;12634:12;12627:19;;12286:366;;;:::o;12658:419::-;12824:4;12862:2;12851:9;12847:18;12839:26;;12911:9;12905:4;12901:20;12897:1;12886:9;12882:17;12875:47;12939:131;13065:4;12939:131;:::i;:::-;12931:139;;12658:419;;;:::o;13083:243::-;13223:34;13219:1;13211:6;13207:14;13200:58;13292:26;13287:2;13279:6;13275:15;13268:51;13083:243;:::o;13332:366::-;13474:3;13495:67;13559:2;13554:3;13495:67;:::i;:::-;13488:74;;13571:93;13660:3;13571:93;:::i;:::-;13689:2;13684:3;13680:12;13673:19;;13332:366;;;:::o;13704:419::-;13870:4;13908:2;13897:9;13893:18;13885:26;;13957:9;13951:4;13947:20;13943:1;13932:9;13928:17;13921:47;13985:131;14111:4;13985:131;:::i;:::-;13977:139;;13704:419;;;:::o;14129:236::-;14269:34;14265:1;14257:6;14253:14;14246:58;14338:19;14333:2;14325:6;14321:15;14314:44;14129:236;:::o;14371:366::-;14513:3;14534:67;14598:2;14593:3;14534:67;:::i;:::-;14527:74;;14610:93;14699:3;14610:93;:::i;:::-;14728:2;14723:3;14719:12;14712:19;;14371:366;;;:::o;14743:419::-;14909:4;14947:2;14936:9;14932:18;14924:26;;14996:9;14990:4;14986:20;14982:1;14971:9;14967:17;14960:47;15024:131;15150:4;15024:131;:::i;:::-;15016:139;;14743:419;;;:::o;15168:182::-;15308:34;15304:1;15296:6;15292:14;15285:58;15168:182;:::o;15356:366::-;15498:3;15519:67;15583:2;15578:3;15519:67;:::i;:::-;15512:74;;15595:93;15684:3;15595:93;:::i;:::-;15713:2;15708:3;15704:12;15697:19;;15356:366;;;:::o;15728:419::-;15894:4;15932:2;15921:9;15917:18;15909:26;;15981:9;15975:4;15971:20;15967:1;15956:9;15952:17;15945:47;16009:131;16135:4;16009:131;:::i;:::-;16001:139;;15728:419;;;:::o;16153:228::-;16293:34;16289:1;16281:6;16277:14;16270:58;16362:11;16357:2;16349:6;16345:15;16338:36;16153:228;:::o;16387:366::-;16529:3;16550:67;16614:2;16609:3;16550:67;:::i;:::-;16543:74;;16626:93;16715:3;16626:93;:::i;:::-;16744:2;16739:3;16735:12;16728:19;;16387:366;;;:::o;16759:419::-;16925:4;16963:2;16952:9;16948:18;16940:26;;17012:9;17006:4;17002:20;16998:1;16987:9;16983:17;16976:47;17040:131;17166:4;17040:131;:::i;:::-;17032:139;;16759:419;;;:::o;17184:229::-;17324:34;17320:1;17312:6;17308:14;17301:58;17393:12;17388:2;17380:6;17376:15;17369:37;17184:229;:::o;17419:366::-;17561:3;17582:67;17646:2;17641:3;17582:67;:::i;:::-;17575:74;;17658:93;17747:3;17658:93;:::i;:::-;17776:2;17771:3;17767:12;17760:19;;17419:366;;;:::o;17791:419::-;17957:4;17995:2;17984:9;17980:18;17972:26;;18044:9;18038:4;18034:20;18030:1;18019:9;18015:17;18008:47;18072:131;18198:4;18072:131;:::i;:::-;18064:139;;17791:419;;;:::o;18216:225::-;18356:34;18352:1;18344:6;18340:14;18333:58;18425:8;18420:2;18412:6;18408:15;18401:33;18216:225;:::o;18447:366::-;18589:3;18610:67;18674:2;18669:3;18610:67;:::i;:::-;18603:74;;18686:93;18775:3;18686:93;:::i;:::-;18804:2;18799:3;18795:12;18788:19;;18447:366;;;:::o;18819:419::-;18985:4;19023:2;19012:9;19008:18;19000:26;;19072:9;19066:4;19062:20;19058:1;19047:9;19043:17;19036:47;19100:131;19226:4;19100:131;:::i;:::-;19092:139;;18819:419;;;:::o;19244:180::-;19292:77;19289:1;19282:88;19389:4;19386:1;19379:15;19413:4;19410:1;19403:15;19430:305;19470:3;19489:20;19507:1;19489:20;:::i;:::-;19484:25;;19523:20;19541:1;19523:20;:::i;:::-;19518:25;;19677:1;19609:66;19605:74;19602:1;19599:81;19596:107;;;19683:18;;:::i;:::-;19596:107;19727:1;19724;19720:9;19713:16;;19430:305;;;;:::o;19741:164::-;19881:16;19877:1;19869:6;19865:14;19858:40;19741:164;:::o;19911:366::-;20053:3;20074:67;20138:2;20133:3;20074:67;:::i;:::-;20067:74;;20150:93;20239:3;20150:93;:::i;:::-;20268:2;20263:3;20259:12;20252:19;;19911:366;;;:::o;20283:419::-;20449:4;20487:2;20476:9;20472:18;20464:26;;20536:9;20530:4;20526:20;20522:1;20511:9;20507:17;20500:47;20564:131;20690:4;20564:131;:::i;:::-;20556:139;;20283:419;;;:::o;20708:161::-;20848:13;20844:1;20836:6;20832:14;20825:37;20708:161;:::o;20875:366::-;21017:3;21038:67;21102:2;21097:3;21038:67;:::i;:::-;21031:74;;21114:93;21203:3;21114:93;:::i;:::-;21232:2;21227:3;21223:12;21216:19;;20875:366;;;:::o;21247:419::-;21413:4;21451:2;21440:9;21436:18;21428:26;;21500:9;21494:4;21490:20;21486:1;21475:9;21471:17;21464:47;21528:131;21654:4;21528:131;:::i;:::-;21520:139;;21247:419;;;:::o;21672:168::-;21812:20;21808:1;21800:6;21796:14;21789:44;21672:168;:::o;21846:366::-;21988:3;22009:67;22073:2;22068:3;22009:67;:::i;:::-;22002:74;;22085:93;22174:3;22085:93;:::i;:::-;22203:2;22198:3;22194:12;22187:19;;21846:366;;;:::o;22218:419::-;22384:4;22422:2;22411:9;22407:18;22399:26;;22471:9;22465:4;22461:20;22457:1;22446:9;22442:17;22435:47;22499:131;22625:4;22499:131;:::i;:::-;22491:139;;22218:419;;;:::o;22643:348::-;22683:7;22706:20;22724:1;22706:20;:::i;:::-;22701:25;;22740:20;22758:1;22740:20;:::i;:::-;22735:25;;22928:1;22860:66;22856:74;22853:1;22850:81;22845:1;22838:9;22831:17;22827:105;22824:131;;;22935:18;;:::i;:::-;22824:131;22983:1;22980;22976:9;22965:20;;22643:348;;;;:::o;22997:181::-;23137:33;23133:1;23125:6;23121:14;23114:57;22997:181;:::o;23184:366::-;23326:3;23347:67;23411:2;23406:3;23347:67;:::i;:::-;23340:74;;23423:93;23512:3;23423:93;:::i;:::-;23541:2;23536:3;23532:12;23525:19;;23184:366;;;:::o;23556:419::-;23722:4;23760:2;23749:9;23745:18;23737:26;;23809:9;23803:4;23799:20;23795:1;23784:9;23780:17;23773:47;23837:131;23963:4;23837:131;:::i;:::-;23829:139;;23556:419;;;:::o;23981:233::-;24020:3;24043:24;24061:5;24043:24;:::i;:::-;24034:33;;24089:66;24082:5;24079:77;24076:103;;;24159:18;;:::i;:::-;24076:103;24206:1;24199:5;24195:13;24188:20;;23981:233;;;:::o;24220:234::-;24360:34;24356:1;24348:6;24344:14;24337:58;24429:17;24424:2;24416:6;24412:15;24405:42;24220:234;:::o;24460:366::-;24602:3;24623:67;24687:2;24682:3;24623:67;:::i;:::-;24616:74;;24699:93;24788:3;24699:93;:::i;:::-;24817:2;24812:3;24808:12;24801:19;;24460:366;;;:::o;24832:419::-;24998:4;25036:2;25025:9;25021:18;25013:26;;25085:9;25079:4;25075:20;25071:1;25060:9;25056:17;25049:47;25113:131;25239:4;25113:131;:::i;:::-;25105:139;;24832:419;;;:::o;25257:225::-;25397:34;25393:1;25385:6;25381:14;25374:58;25466:8;25461:2;25453:6;25449:15;25442:33;25257:225;:::o;25488:366::-;25630:3;25651:67;25715:2;25710:3;25651:67;:::i;:::-;25644:74;;25727:93;25816:3;25727:93;:::i;:::-;25845:2;25840:3;25836:12;25829:19;;25488:366;;;:::o;25860:419::-;26026:4;26064:2;26053:9;26049:18;26041:26;;26113:9;26107:4;26103:20;26099:1;26088:9;26084:17;26077:47;26141:131;26267:4;26141:131;:::i;:::-;26133:139;;25860:419;;;:::o;26285:231::-;26425:34;26421:1;26413:6;26409:14;26402:58;26494:14;26489:2;26481:6;26477:15;26470:39;26285:231;:::o;26522:366::-;26664:3;26685:67;26749:2;26744:3;26685:67;:::i;:::-;26678:74;;26761:93;26850:3;26761:93;:::i;:::-;26879:2;26874:3;26870:12;26863:19;;26522:366;;;:::o;26894:419::-;27060:4;27098:2;27087:9;27083:18;27075:26;;27147:9;27141:4;27137:20;27133:1;27122:9;27118:17;27111:47;27175:131;27301:4;27175:131;:::i;:::-;27167:139;;26894:419;;;:::o;27319:228::-;27459:34;27455:1;27447:6;27443:14;27436:58;27528:11;27523:2;27515:6;27511:15;27504:36;27319:228;:::o;27553:366::-;27695:3;27716:67;27780:2;27775:3;27716:67;:::i;:::-;27709:74;;27792:93;27881:3;27792:93;:::i;:::-;27910:2;27905:3;27901:12;27894:19;;27553:366;;;:::o;27925:419::-;28091:4;28129:2;28118:9;28114:18;28106:26;;28178:9;28172:4;28168:20;28164:1;28153:9;28149:17;28142:47;28206:131;28332:4;28206:131;:::i;:::-;28198:139;;27925:419;;;:::o;28350:223::-;28490:34;28486:1;28478:6;28474:14;28467:58;28559:6;28554:2;28546:6;28542:15;28535:31;28350:223;:::o;28579:366::-;28721:3;28742:67;28806:2;28801:3;28742:67;:::i;:::-;28735:74;;28818:93;28907:3;28818:93;:::i;:::-;28936:2;28931:3;28927:12;28920:19;;28579:366;;;:::o;28951:419::-;29117:4;29155:2;29144:9;29140:18;29132:26;;29204:9;29198:4;29194:20;29190:1;29179:9;29175:17;29168:47;29232:131;29358:4;29232:131;:::i;:::-;29224:139;;28951:419;;;:::o;29376:191::-;29416:4;29436:20;29454:1;29436:20;:::i;:::-;29431:25;;29470:20;29488:1;29470:20;:::i;:::-;29465:25;;29509:1;29506;29503:8;29500:34;;;29514:18;;:::i;:::-;29500:34;29559:1;29556;29552:9;29544:17;;29376:191;;;;:::o;29573:160::-;29713:12;29709:1;29701:6;29697:14;29690:36;29573:160;:::o;29739:366::-;29881:3;29902:67;29966:2;29961:3;29902:67;:::i;:::-;29895:74;;29978:93;30067:3;29978:93;:::i;:::-;30096:2;30091:3;30087:12;30080:19;;29739:366;;;:::o;30111:419::-;30277:4;30315:2;30304:9;30300:18;30292:26;;30364:9;30358:4;30354:20;30350:1;30339:9;30335:17;30328:47;30392:131;30518:4;30392:131;:::i;:::-;30384:139;;30111:419;;;:::o;30536:175::-;30676:27;30672:1;30664:6;30660:14;30653:51;30536:175;:::o;30717:366::-;30859:3;30880:67;30944:2;30939:3;30880:67;:::i;:::-;30873:74;;30956:93;31045:3;30956:93;:::i;:::-;31074:2;31069:3;31065:12;31058:19;;30717:366;;;:::o;31089:419::-;31255:4;31293:2;31282:9;31278:18;31270:26;;31342:9;31336:4;31332:20;31328:1;31317:9;31313:17;31306:47;31370:131;31496:4;31370:131;:::i;:::-;31362:139;;31089:419;;;:::o;31514:237::-;31654:34;31650:1;31642:6;31638:14;31631:58;31723:20;31718:2;31710:6;31706:15;31699:45;31514:237;:::o;31757:366::-;31899:3;31920:67;31984:2;31979:3;31920:67;:::i;:::-;31913:74;;31996:93;32085:3;31996:93;:::i;:::-;32114:2;32109:3;32105:12;32098:19;;31757:366;;;:::o;32129:419::-;32295:4;32333:2;32322:9;32318:18;32310:26;;32382:9;32376:4;32372:20;32368:1;32357:9;32353:17;32346:47;32410:131;32536:4;32410:131;:::i;:::-;32402:139;;32129:419;;;:::o;32554:182::-;32694:34;32690:1;32682:6;32678:14;32671:58;32554:182;:::o;32742:366::-;32884:3;32905:67;32969:2;32964:3;32905:67;:::i;:::-;32898:74;;32981:93;33070:3;32981:93;:::i;:::-;33099:2;33094:3;33090:12;33083:19;;32742:366;;;:::o;33114:419::-;33280:4;33318:2;33307:9;33303:18;33295:26;;33367:9;33361:4;33357:20;33353:1;33342:9;33338:17;33331:47;33395:131;33521:4;33395:131;:::i;:::-;33387:139;;33114:419;;;:::o;33539:178::-;33679:30;33675:1;33667:6;33663:14;33656:54;33539:178;:::o;33723:366::-;33865:3;33886:67;33950:2;33945:3;33886:67;:::i;:::-;33879:74;;33962:93;34051:3;33962:93;:::i;:::-;34080:2;34075:3;34071:12;34064:19;;33723:366;;;:::o;34095:419::-;34261:4;34299:2;34288:9;34284:18;34276:26;;34348:9;34342:4;34338:20;34334:1;34323:9;34319:17;34312:47;34376:131;34502:4;34376:131;:::i;:::-;34368:139;;34095:419;;;:::o;34520:98::-;34571:6;34605:5;34599:12;34589:22;;34520:98;;;:::o;34624:168::-;34707:11;34741:6;34736:3;34729:19;34781:4;34776:3;34772:14;34757:29;;34624:168;;;;:::o;34798:360::-;34884:3;34912:38;34944:5;34912:38;:::i;:::-;34966:70;35029:6;35024:3;34966:70;:::i;:::-;34959:77;;35045:52;35090:6;35085:3;35078:4;35071:5;35067:16;35045:52;:::i;:::-;35122:29;35144:6;35122:29;:::i;:::-;35117:3;35113:39;35106:46;;34888:270;34798:360;;;;:::o;35164:640::-;35359:4;35397:3;35386:9;35382:19;35374:27;;35411:71;35479:1;35468:9;35464:17;35455:6;35411:71;:::i;:::-;35492:72;35560:2;35549:9;35545:18;35536:6;35492:72;:::i;:::-;35574;35642:2;35631:9;35627:18;35618:6;35574:72;:::i;:::-;35693:9;35687:4;35683:20;35678:2;35667:9;35663:18;35656:48;35721:76;35792:4;35783:6;35721:76;:::i;:::-;35713:84;;35164:640;;;;;;;:::o;35810:141::-;35866:5;35897:6;35891:13;35882:22;;35913:32;35939:5;35913:32;:::i;:::-;35810:141;;;;:::o;35957:349::-;36026:6;36075:2;36063:9;36054:7;36050:23;36046:32;36043:119;;;36081:79;;:::i;:::-;36043:119;36201:1;36226:63;36281:7;36272:6;36261:9;36257:22;36226:63;:::i;:::-;36216:73;;36172:127;35957:349;;;;:::o

Swarm Source

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