ETH Price: $2,380.49 (-0.12%)
Gas: 4.57 Gwei

Token

Crypto OGs (COG)
 

Overview

Max Total Supply

0 COG

Holders

32

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
unchainedninjavault.eth
Balance
1 COG
0x9e53563dbfea80b39bf683b7d52df449a2b247e7
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:
CryptoOGs

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/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/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/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/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/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;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

// File: @openzeppelin/contracts/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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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



pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

// File: @openzeppelin/contracts/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/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}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

// File: contracts/CryptoOGs.sol

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.4;


interface IERC20 {
  function currentSupply() external view returns (uint);
  function balanceOf(address tokenOwner) external view returns (uint balance);
  function allowance(address tokenOwner, address spender) external view returns (uint remaining);
  function transfer(address to, uint tokens) external returns (bool success);
  function approve(address spender, uint tokens) external returns (bool success);
  function transferFrom(address from, address to, uint tokens) external returns (bool success);

  event Transfer(address indexed from, address indexed to, uint tokens);
  event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}

interface ApproveAndCallFallBack {
  function receiveApproval(address from, uint256 tokens, address token, bytes memory data) external;
}

contract CryptoOGs is ERC721 {

    event Mint(uint indexed _tokenId, string _tokenURI);

    address public ownerAddress = 0x88B0CdF5700Fc0293B265eA6904205E3F1576069; // The only address allowed to mint
    uint public maxSupply = 50; // Maximum tokens that can be minted
    uint public currentSupply = 0; // This is our mint counter as well
    mapping(uint => string) public tokenURIs; // Metadata location for each token, updatable by owner

    constructor() payable ERC721("Crypto OGs", "COG") {
    }

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

    function mint(string calldata _tokenURI) external onlyOwner {
        require(currentSupply < maxSupply, "maxSupply of mints already reached");
        _mint(msg.sender, currentSupply);
        tokenURIs[currentSupply] = _tokenURI;
        emit Mint(currentSupply, _tokenURI);
        currentSupply += 1; // Increment the counter
    }

    /**
     * @dev Returns a URI for a given token ID's metadata
     */
    function tokenURI(uint256 _tokenId) public view override returns (string memory) {
        return tokenURIs[_tokenId];
        // return string(abi.encodePacked(_baseTokenURI, Strings.toString(_tokenId)));
    }

    /**
     * @dev Updates the token URI for an existing token.
     */
    function changeTokenURI(uint _tokenId, string memory _tokenURI) public onlyOwner {
        tokenURIs[_tokenId] = _tokenURI;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","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":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_tokenURI","type":"string"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"changeTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenURIs","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040527388b0cdf5700fc0293b265ea6904205e3f1576069600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550603260075560006008556040518060400160405280600a81526020017f43727970746f204f4773000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f434f4700000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000e792919062000109565b5080600190805190602001906200010092919062000109565b5050506200021e565b8280546200011790620001b9565b90600052602060002090601f0160209004810192826200013b576000855562000187565b82601f106200015657805160ff191683800117855562000187565b8280016001018555821562000187579182015b828111156200018657825182559160200191906001019062000169565b5b5090506200019691906200019a565b5090565b5b80821115620001b55760008160009055506001016200019b565b5090565b60006002820490506001821680620001d257607f821691505b60208210811415620001e957620001e8620001ef565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612ab0806200022e6000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c8063771282f6116100ad578063b88d4fde11610071578063b88d4fde1461031a578063c87b56dd14610336578063d5abeb0114610366578063d85d3d2714610384578063e985e9c5146103a057610121565b8063771282f6146102885780637fb3a9a2146102a65780638f84aa09146102c257806395d89b41146102e0578063a22cb465146102fe57610121565b806323b872dd116100f457806323b872dd146101c057806342842e0e146101dc5780636352211e146101f85780636c8b703f1461022857806370a082311461025857610121565b806301ffc9a71461012657806306fdde0314610156578063081812fc14610174578063095ea7b3146101a4575b600080fd5b610140600480360381019061013b9190611c65565b6103d0565b60405161014d91906120b9565b60405180910390f35b61015e6104b2565b60405161016b91906120f8565b60405180910390f35b61018e60048036038101906101899190611cfc565b610544565b60405161019b9190612052565b60405180910390f35b6101be60048036038101906101b99190611c29565b6105c9565b005b6101da60048036038101906101d59190611b23565b6106e1565b005b6101f660048036038101906101f19190611b23565b610741565b005b610212600480360381019061020d9190611cfc565b610761565b60405161021f9190612052565b60405180910390f35b610242600480360381019061023d9190611cfc565b610813565b60405161024f91906120f8565b60405180910390f35b610272600480360381019061026d9190611abe565b6108b3565b60405161027f91906122fa565b60405180910390f35b61029061096b565b60405161029d91906122fa565b60405180910390f35b6102c060048036038101906102bb9190611d25565b610971565b005b6102ca610a2d565b6040516102d79190612052565b60405180910390f35b6102e8610a53565b6040516102f591906120f8565b60405180910390f35b61031860048036038101906103139190611bed565b610ae5565b005b610334600480360381019061032f9190611b72565b610c66565b005b610350600480360381019061034b9190611cfc565b610cc8565b60405161035d91906120f8565b60405180910390f35b61036e610d6d565b60405161037b91906122fa565b60405180910390f35b61039e60048036038101906103999190611cb7565b610d73565b005b6103ba60048036038101906103b59190611ae7565b610ed4565b6040516103c791906120b9565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061049b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104ab57506104aa82610f68565b5b9050919050565b6060600080546104c190612514565b80601f01602080910402602001604051908101604052809291908181526020018280546104ed90612514565b801561053a5780601f1061050f5761010080835404028352916020019161053a565b820191906000526020600020905b81548152906001019060200180831161051d57829003601f168201915b5050505050905090565b600061054f82610fd2565b61058e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105859061223a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105d482610761565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063c9061229a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661066461103e565b73ffffffffffffffffffffffffffffffffffffffff16148061069357506106928161068d61103e565b610ed4565b5b6106d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c9906121ba565b60405180910390fd5b6106dc8383611046565b505050565b6106f26106ec61103e565b826110ff565b610731576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610728906122ba565b60405180910390fd5b61073c8383836111dd565b505050565b61075c83838360405180602001604052806000815250610c66565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561080a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610801906121fa565b60405180910390fd5b80915050919050565b6009602052806000526040600020600091509050805461083290612514565b80601f016020809104026020016040519081016040528092919081815260200182805461085e90612514565b80156108ab5780601f10610880576101008083540402835291602001916108ab565b820191906000526020600020905b81548152906001019060200180831161088e57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091b906121da565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60085481565b3373ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f89061225a565b60405180910390fd5b80600960008481526020019081526020016000209080519060200190610a28929190611812565b505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060018054610a6290612514565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8e90612514565b8015610adb5780601f10610ab057610100808354040283529160200191610adb565b820191906000526020600020905b815481529060010190602001808311610abe57829003601f168201915b5050505050905090565b610aed61103e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b529061217a565b60405180910390fd5b8060056000610b6861103e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610c1561103e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610c5a91906120b9565b60405180910390a35050565b610c77610c7161103e565b836110ff565b610cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cad906122ba565b60405180910390fd5b610cc284848484611439565b50505050565b6060600960008381526020019081526020016000208054610ce890612514565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1490612514565b8015610d615780601f10610d3657610100808354040283529160200191610d61565b820191906000526020600020905b815481529060010190602001808311610d4457829003601f168201915b50505050509050919050565b60075481565b3373ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfa9061225a565b60405180910390fd5b60075460085410610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e40906122da565b60405180910390fd5b610e5533600854611495565b81816009600060085481526020019081526020016000209190610e79929190611898565b506008547f07554a03a62c3cb37a877bd179226e5626e1158ca4f7d1e2306683ed4a41e4dd8383604051610eae9291906120d4565b60405180910390a2600160086000828254610ec991906123d4565b925050819055505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166110b983610761565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061110a82610fd2565b611149576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111409061219a565b60405180910390fd5b600061115483610761565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806111c357508373ffffffffffffffffffffffffffffffffffffffff166111ab84610544565b73ffffffffffffffffffffffffffffffffffffffff16145b806111d457506111d38185610ed4565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166111fd82610761565b73ffffffffffffffffffffffffffffffffffffffff1614611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124a9061227a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba9061215a565b60405180910390fd5b6112ce838383611663565b6112d9600082611046565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611329919061242a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461138091906123d4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6114448484846111dd565b61145084848484611668565b61148f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114869061211a565b60405180910390fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fc9061221a565b60405180910390fd5b61150e81610fd2565b1561154e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115459061213a565b60405180910390fd5b61155a60008383611663565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115aa91906123d4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b60006116898473ffffffffffffffffffffffffffffffffffffffff166117ff565b156117f2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026116b261103e565b8786866040518563ffffffff1660e01b81526004016116d4949392919061206d565b602060405180830381600087803b1580156116ee57600080fd5b505af192505050801561171f57506040513d601f19601f8201168201806040525081019061171c9190611c8e565b60015b6117a2573d806000811461174f576040519150601f19603f3d011682016040523d82523d6000602084013e611754565b606091505b5060008151141561179a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117919061211a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506117f7565b600190505b949350505050565b600080823b905060008111915050919050565b82805461181e90612514565b90600052602060002090601f0160209004810192826118405760008555611887565b82601f1061185957805160ff1916838001178555611887565b82800160010185558215611887579182015b8281111561188657825182559160200191906001019061186b565b5b509050611894919061191e565b5090565b8280546118a490612514565b90600052602060002090601f0160209004810192826118c6576000855561190d565b82601f106118df57803560ff191683800117855561190d565b8280016001018555821561190d579182015b8281111561190c5782358255916020019190600101906118f1565b5b50905061191a919061191e565b5090565b5b8082111561193757600081600090555060010161191f565b5090565b600061194e6119498461233a565b612315565b90508281526020810184848401111561196657600080fd5b6119718482856124d2565b509392505050565b600061198c6119878461236b565b612315565b9050828152602081018484840111156119a457600080fd5b6119af8482856124d2565b509392505050565b6000813590506119c681612a1e565b92915050565b6000813590506119db81612a35565b92915050565b6000813590506119f081612a4c565b92915050565b600081519050611a0581612a4c565b92915050565b600082601f830112611a1c57600080fd5b8135611a2c84826020860161193b565b91505092915050565b60008083601f840112611a4757600080fd5b8235905067ffffffffffffffff811115611a6057600080fd5b602083019150836001820283011115611a7857600080fd5b9250929050565b600082601f830112611a9057600080fd5b8135611aa0848260208601611979565b91505092915050565b600081359050611ab881612a63565b92915050565b600060208284031215611ad057600080fd5b6000611ade848285016119b7565b91505092915050565b60008060408385031215611afa57600080fd5b6000611b08858286016119b7565b9250506020611b19858286016119b7565b9150509250929050565b600080600060608486031215611b3857600080fd5b6000611b46868287016119b7565b9350506020611b57868287016119b7565b9250506040611b6886828701611aa9565b9150509250925092565b60008060008060808587031215611b8857600080fd5b6000611b96878288016119b7565b9450506020611ba7878288016119b7565b9350506040611bb887828801611aa9565b925050606085013567ffffffffffffffff811115611bd557600080fd5b611be187828801611a0b565b91505092959194509250565b60008060408385031215611c0057600080fd5b6000611c0e858286016119b7565b9250506020611c1f858286016119cc565b9150509250929050565b60008060408385031215611c3c57600080fd5b6000611c4a858286016119b7565b9250506020611c5b85828601611aa9565b9150509250929050565b600060208284031215611c7757600080fd5b6000611c85848285016119e1565b91505092915050565b600060208284031215611ca057600080fd5b6000611cae848285016119f6565b91505092915050565b60008060208385031215611cca57600080fd5b600083013567ffffffffffffffff811115611ce457600080fd5b611cf085828601611a35565b92509250509250929050565b600060208284031215611d0e57600080fd5b6000611d1c84828501611aa9565b91505092915050565b60008060408385031215611d3857600080fd5b6000611d4685828601611aa9565b925050602083013567ffffffffffffffff811115611d6357600080fd5b611d6f85828601611a7f565b9150509250929050565b611d828161245e565b82525050565b611d9181612470565b82525050565b6000611da28261239c565b611dac81856123b2565b9350611dbc8185602086016124e1565b611dc581612604565b840191505092915050565b6000611ddc83856123c3565b9350611de98385846124d2565b611df283612604565b840190509392505050565b6000611e08826123a7565b611e1281856123c3565b9350611e228185602086016124e1565b611e2b81612604565b840191505092915050565b6000611e436032836123c3565b9150611e4e82612615565b604082019050919050565b6000611e66601c836123c3565b9150611e7182612664565b602082019050919050565b6000611e896024836123c3565b9150611e948261268d565b604082019050919050565b6000611eac6019836123c3565b9150611eb7826126dc565b602082019050919050565b6000611ecf602c836123c3565b9150611eda82612705565b604082019050919050565b6000611ef26038836123c3565b9150611efd82612754565b604082019050919050565b6000611f15602a836123c3565b9150611f20826127a3565b604082019050919050565b6000611f386029836123c3565b9150611f43826127f2565b604082019050919050565b6000611f5b6020836123c3565b9150611f6682612841565b602082019050919050565b6000611f7e602c836123c3565b9150611f898261286a565b604082019050919050565b6000611fa16020836123c3565b9150611fac826128b9565b602082019050919050565b6000611fc46029836123c3565b9150611fcf826128e2565b604082019050919050565b6000611fe76021836123c3565b9150611ff282612931565b604082019050919050565b600061200a6031836123c3565b915061201582612980565b604082019050919050565b600061202d6022836123c3565b9150612038826129cf565b604082019050919050565b61204c816124c8565b82525050565b60006020820190506120676000830184611d79565b92915050565b60006080820190506120826000830187611d79565b61208f6020830186611d79565b61209c6040830185612043565b81810360608301526120ae8184611d97565b905095945050505050565b60006020820190506120ce6000830184611d88565b92915050565b600060208201905081810360008301526120ef818486611dd0565b90509392505050565b600060208201905081810360008301526121128184611dfd565b905092915050565b6000602082019050818103600083015261213381611e36565b9050919050565b6000602082019050818103600083015261215381611e59565b9050919050565b6000602082019050818103600083015261217381611e7c565b9050919050565b6000602082019050818103600083015261219381611e9f565b9050919050565b600060208201905081810360008301526121b381611ec2565b9050919050565b600060208201905081810360008301526121d381611ee5565b9050919050565b600060208201905081810360008301526121f381611f08565b9050919050565b6000602082019050818103600083015261221381611f2b565b9050919050565b6000602082019050818103600083015261223381611f4e565b9050919050565b6000602082019050818103600083015261225381611f71565b9050919050565b6000602082019050818103600083015261227381611f94565b9050919050565b6000602082019050818103600083015261229381611fb7565b9050919050565b600060208201905081810360008301526122b381611fda565b9050919050565b600060208201905081810360008301526122d381611ffd565b9050919050565b600060208201905081810360008301526122f381612020565b9050919050565b600060208201905061230f6000830184612043565b92915050565b600061231f612330565b905061232b8282612546565b919050565b6000604051905090565b600067ffffffffffffffff821115612355576123546125d5565b5b61235e82612604565b9050602081019050919050565b600067ffffffffffffffff821115612386576123856125d5565b5b61238f82612604565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b60006123df826124c8565b91506123ea836124c8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561241f5761241e612577565b5b828201905092915050565b6000612435826124c8565b9150612440836124c8565b92508282101561245357612452612577565b5b828203905092915050565b6000612469826124a8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156124ff5780820151818401526020810190506124e4565b8381111561250e576000848401525b50505050565b6000600282049050600182168061252c57607f821691505b602082108114156125405761253f6125a6565b5b50919050565b61254f82612604565b810181811067ffffffffffffffff8211171561256e5761256d6125d5565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f6d6178537570706c79206f66206d696e747320616c726561647920726561636860008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b612a278161245e565b8114612a3257600080fd5b50565b612a3e81612470565b8114612a4957600080fd5b50565b612a558161247c565b8114612a6057600080fd5b50565b612a6c816124c8565b8114612a7757600080fd5b5056fea2646970667358221220ecbb6e06418cf0a3f35ab33a5bf6266c75ed1afaf5a9280c647b05273b754bef64736f6c63430008040033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101215760003560e01c8063771282f6116100ad578063b88d4fde11610071578063b88d4fde1461031a578063c87b56dd14610336578063d5abeb0114610366578063d85d3d2714610384578063e985e9c5146103a057610121565b8063771282f6146102885780637fb3a9a2146102a65780638f84aa09146102c257806395d89b41146102e0578063a22cb465146102fe57610121565b806323b872dd116100f457806323b872dd146101c057806342842e0e146101dc5780636352211e146101f85780636c8b703f1461022857806370a082311461025857610121565b806301ffc9a71461012657806306fdde0314610156578063081812fc14610174578063095ea7b3146101a4575b600080fd5b610140600480360381019061013b9190611c65565b6103d0565b60405161014d91906120b9565b60405180910390f35b61015e6104b2565b60405161016b91906120f8565b60405180910390f35b61018e60048036038101906101899190611cfc565b610544565b60405161019b9190612052565b60405180910390f35b6101be60048036038101906101b99190611c29565b6105c9565b005b6101da60048036038101906101d59190611b23565b6106e1565b005b6101f660048036038101906101f19190611b23565b610741565b005b610212600480360381019061020d9190611cfc565b610761565b60405161021f9190612052565b60405180910390f35b610242600480360381019061023d9190611cfc565b610813565b60405161024f91906120f8565b60405180910390f35b610272600480360381019061026d9190611abe565b6108b3565b60405161027f91906122fa565b60405180910390f35b61029061096b565b60405161029d91906122fa565b60405180910390f35b6102c060048036038101906102bb9190611d25565b610971565b005b6102ca610a2d565b6040516102d79190612052565b60405180910390f35b6102e8610a53565b6040516102f591906120f8565b60405180910390f35b61031860048036038101906103139190611bed565b610ae5565b005b610334600480360381019061032f9190611b72565b610c66565b005b610350600480360381019061034b9190611cfc565b610cc8565b60405161035d91906120f8565b60405180910390f35b61036e610d6d565b60405161037b91906122fa565b60405180910390f35b61039e60048036038101906103999190611cb7565b610d73565b005b6103ba60048036038101906103b59190611ae7565b610ed4565b6040516103c791906120b9565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061049b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104ab57506104aa82610f68565b5b9050919050565b6060600080546104c190612514565b80601f01602080910402602001604051908101604052809291908181526020018280546104ed90612514565b801561053a5780601f1061050f5761010080835404028352916020019161053a565b820191906000526020600020905b81548152906001019060200180831161051d57829003601f168201915b5050505050905090565b600061054f82610fd2565b61058e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105859061223a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105d482610761565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063c9061229a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661066461103e565b73ffffffffffffffffffffffffffffffffffffffff16148061069357506106928161068d61103e565b610ed4565b5b6106d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c9906121ba565b60405180910390fd5b6106dc8383611046565b505050565b6106f26106ec61103e565b826110ff565b610731576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610728906122ba565b60405180910390fd5b61073c8383836111dd565b505050565b61075c83838360405180602001604052806000815250610c66565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561080a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610801906121fa565b60405180910390fd5b80915050919050565b6009602052806000526040600020600091509050805461083290612514565b80601f016020809104026020016040519081016040528092919081815260200182805461085e90612514565b80156108ab5780601f10610880576101008083540402835291602001916108ab565b820191906000526020600020905b81548152906001019060200180831161088e57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610924576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091b906121da565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60085481565b3373ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f89061225a565b60405180910390fd5b80600960008481526020019081526020016000209080519060200190610a28929190611812565b505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060018054610a6290612514565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8e90612514565b8015610adb5780601f10610ab057610100808354040283529160200191610adb565b820191906000526020600020905b815481529060010190602001808311610abe57829003601f168201915b5050505050905090565b610aed61103e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b529061217a565b60405180910390fd5b8060056000610b6861103e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610c1561103e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610c5a91906120b9565b60405180910390a35050565b610c77610c7161103e565b836110ff565b610cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cad906122ba565b60405180910390fd5b610cc284848484611439565b50505050565b6060600960008381526020019081526020016000208054610ce890612514565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1490612514565b8015610d615780601f10610d3657610100808354040283529160200191610d61565b820191906000526020600020905b815481529060010190602001808311610d4457829003601f168201915b50505050509050919050565b60075481565b3373ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfa9061225a565b60405180910390fd5b60075460085410610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e40906122da565b60405180910390fd5b610e5533600854611495565b81816009600060085481526020019081526020016000209190610e79929190611898565b506008547f07554a03a62c3cb37a877bd179226e5626e1158ca4f7d1e2306683ed4a41e4dd8383604051610eae9291906120d4565b60405180910390a2600160086000828254610ec991906123d4565b925050819055505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166110b983610761565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061110a82610fd2565b611149576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111409061219a565b60405180910390fd5b600061115483610761565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806111c357508373ffffffffffffffffffffffffffffffffffffffff166111ab84610544565b73ffffffffffffffffffffffffffffffffffffffff16145b806111d457506111d38185610ed4565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166111fd82610761565b73ffffffffffffffffffffffffffffffffffffffff1614611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124a9061227a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba9061215a565b60405180910390fd5b6112ce838383611663565b6112d9600082611046565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611329919061242a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461138091906123d4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6114448484846111dd565b61145084848484611668565b61148f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114869061211a565b60405180910390fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fc9061221a565b60405180910390fd5b61150e81610fd2565b1561154e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115459061213a565b60405180910390fd5b61155a60008383611663565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115aa91906123d4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b60006116898473ffffffffffffffffffffffffffffffffffffffff166117ff565b156117f2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026116b261103e565b8786866040518563ffffffff1660e01b81526004016116d4949392919061206d565b602060405180830381600087803b1580156116ee57600080fd5b505af192505050801561171f57506040513d601f19601f8201168201806040525081019061171c9190611c8e565b60015b6117a2573d806000811461174f576040519150601f19603f3d011682016040523d82523d6000602084013e611754565b606091505b5060008151141561179a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117919061211a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506117f7565b600190505b949350505050565b600080823b905060008111915050919050565b82805461181e90612514565b90600052602060002090601f0160209004810192826118405760008555611887565b82601f1061185957805160ff1916838001178555611887565b82800160010185558215611887579182015b8281111561188657825182559160200191906001019061186b565b5b509050611894919061191e565b5090565b8280546118a490612514565b90600052602060002090601f0160209004810192826118c6576000855561190d565b82601f106118df57803560ff191683800117855561190d565b8280016001018555821561190d579182015b8281111561190c5782358255916020019190600101906118f1565b5b50905061191a919061191e565b5090565b5b8082111561193757600081600090555060010161191f565b5090565b600061194e6119498461233a565b612315565b90508281526020810184848401111561196657600080fd5b6119718482856124d2565b509392505050565b600061198c6119878461236b565b612315565b9050828152602081018484840111156119a457600080fd5b6119af8482856124d2565b509392505050565b6000813590506119c681612a1e565b92915050565b6000813590506119db81612a35565b92915050565b6000813590506119f081612a4c565b92915050565b600081519050611a0581612a4c565b92915050565b600082601f830112611a1c57600080fd5b8135611a2c84826020860161193b565b91505092915050565b60008083601f840112611a4757600080fd5b8235905067ffffffffffffffff811115611a6057600080fd5b602083019150836001820283011115611a7857600080fd5b9250929050565b600082601f830112611a9057600080fd5b8135611aa0848260208601611979565b91505092915050565b600081359050611ab881612a63565b92915050565b600060208284031215611ad057600080fd5b6000611ade848285016119b7565b91505092915050565b60008060408385031215611afa57600080fd5b6000611b08858286016119b7565b9250506020611b19858286016119b7565b9150509250929050565b600080600060608486031215611b3857600080fd5b6000611b46868287016119b7565b9350506020611b57868287016119b7565b9250506040611b6886828701611aa9565b9150509250925092565b60008060008060808587031215611b8857600080fd5b6000611b96878288016119b7565b9450506020611ba7878288016119b7565b9350506040611bb887828801611aa9565b925050606085013567ffffffffffffffff811115611bd557600080fd5b611be187828801611a0b565b91505092959194509250565b60008060408385031215611c0057600080fd5b6000611c0e858286016119b7565b9250506020611c1f858286016119cc565b9150509250929050565b60008060408385031215611c3c57600080fd5b6000611c4a858286016119b7565b9250506020611c5b85828601611aa9565b9150509250929050565b600060208284031215611c7757600080fd5b6000611c85848285016119e1565b91505092915050565b600060208284031215611ca057600080fd5b6000611cae848285016119f6565b91505092915050565b60008060208385031215611cca57600080fd5b600083013567ffffffffffffffff811115611ce457600080fd5b611cf085828601611a35565b92509250509250929050565b600060208284031215611d0e57600080fd5b6000611d1c84828501611aa9565b91505092915050565b60008060408385031215611d3857600080fd5b6000611d4685828601611aa9565b925050602083013567ffffffffffffffff811115611d6357600080fd5b611d6f85828601611a7f565b9150509250929050565b611d828161245e565b82525050565b611d9181612470565b82525050565b6000611da28261239c565b611dac81856123b2565b9350611dbc8185602086016124e1565b611dc581612604565b840191505092915050565b6000611ddc83856123c3565b9350611de98385846124d2565b611df283612604565b840190509392505050565b6000611e08826123a7565b611e1281856123c3565b9350611e228185602086016124e1565b611e2b81612604565b840191505092915050565b6000611e436032836123c3565b9150611e4e82612615565b604082019050919050565b6000611e66601c836123c3565b9150611e7182612664565b602082019050919050565b6000611e896024836123c3565b9150611e948261268d565b604082019050919050565b6000611eac6019836123c3565b9150611eb7826126dc565b602082019050919050565b6000611ecf602c836123c3565b9150611eda82612705565b604082019050919050565b6000611ef26038836123c3565b9150611efd82612754565b604082019050919050565b6000611f15602a836123c3565b9150611f20826127a3565b604082019050919050565b6000611f386029836123c3565b9150611f43826127f2565b604082019050919050565b6000611f5b6020836123c3565b9150611f6682612841565b602082019050919050565b6000611f7e602c836123c3565b9150611f898261286a565b604082019050919050565b6000611fa16020836123c3565b9150611fac826128b9565b602082019050919050565b6000611fc46029836123c3565b9150611fcf826128e2565b604082019050919050565b6000611fe76021836123c3565b9150611ff282612931565b604082019050919050565b600061200a6031836123c3565b915061201582612980565b604082019050919050565b600061202d6022836123c3565b9150612038826129cf565b604082019050919050565b61204c816124c8565b82525050565b60006020820190506120676000830184611d79565b92915050565b60006080820190506120826000830187611d79565b61208f6020830186611d79565b61209c6040830185612043565b81810360608301526120ae8184611d97565b905095945050505050565b60006020820190506120ce6000830184611d88565b92915050565b600060208201905081810360008301526120ef818486611dd0565b90509392505050565b600060208201905081810360008301526121128184611dfd565b905092915050565b6000602082019050818103600083015261213381611e36565b9050919050565b6000602082019050818103600083015261215381611e59565b9050919050565b6000602082019050818103600083015261217381611e7c565b9050919050565b6000602082019050818103600083015261219381611e9f565b9050919050565b600060208201905081810360008301526121b381611ec2565b9050919050565b600060208201905081810360008301526121d381611ee5565b9050919050565b600060208201905081810360008301526121f381611f08565b9050919050565b6000602082019050818103600083015261221381611f2b565b9050919050565b6000602082019050818103600083015261223381611f4e565b9050919050565b6000602082019050818103600083015261225381611f71565b9050919050565b6000602082019050818103600083015261227381611f94565b9050919050565b6000602082019050818103600083015261229381611fb7565b9050919050565b600060208201905081810360008301526122b381611fda565b9050919050565b600060208201905081810360008301526122d381611ffd565b9050919050565b600060208201905081810360008301526122f381612020565b9050919050565b600060208201905061230f6000830184612043565b92915050565b600061231f612330565b905061232b8282612546565b919050565b6000604051905090565b600067ffffffffffffffff821115612355576123546125d5565b5b61235e82612604565b9050602081019050919050565b600067ffffffffffffffff821115612386576123856125d5565b5b61238f82612604565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b60006123df826124c8565b91506123ea836124c8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561241f5761241e612577565b5b828201905092915050565b6000612435826124c8565b9150612440836124c8565b92508282101561245357612452612577565b5b828203905092915050565b6000612469826124a8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156124ff5780820151818401526020810190506124e4565b8381111561250e576000848401525b50505050565b6000600282049050600182168061252c57607f821691505b602082108114156125405761253f6125a6565b5b50919050565b61254f82612604565b810181811067ffffffffffffffff8211171561256e5761256d6125d5565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f6d6178537570706c79206f66206d696e747320616c726561647920726561636860008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b612a278161245e565b8114612a3257600080fd5b50565b612a3e81612470565b8114612a4957600080fd5b50565b612a558161247c565b8114612a6057600080fd5b50565b612a6c816124c8565b8114612a7757600080fd5b5056fea2646970667358221220ecbb6e06418cf0a3f35ab33a5bf6266c75ed1afaf5a9280c647b05273b754bef64736f6c63430008040033

Deployed Bytecode Sourcemap

33299:1600:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20566:292;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21498:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22958:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22495:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23848:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24224:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21192:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33654:40;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20922:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33582:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34765:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33397:72;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21667:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23251:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24446:285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34467:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33512:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34041:341;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23617:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20566:292;20668:4;20707:25;20692:40;;;:11;:40;;;;:105;;;;20764:33;20749:48;;;:11;:48;;;;20692:105;:158;;;;20814:36;20838:11;20814:23;:36::i;:::-;20692:158;20685:165;;20566:292;;;:::o;21498:100::-;21552:13;21585:5;21578:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21498:100;:::o;22958:221::-;23034:7;23062:16;23070:7;23062;:16::i;:::-;23054:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23147:15;:24;23163:7;23147:24;;;;;;;;;;;;;;;;;;;;;23140:31;;22958:221;;;:::o;22495:397::-;22576:13;22592:23;22607:7;22592:14;:23::i;:::-;22576:39;;22640:5;22634:11;;:2;:11;;;;22626:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22720:5;22704:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22729:37;22746:5;22753:12;:10;:12::i;:::-;22729:16;:37::i;:::-;22704:62;22696:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;22863:21;22872:2;22876:7;22863:8;:21::i;:::-;22495:397;;;:::o;23848:305::-;24009:41;24028:12;:10;:12::i;:::-;24042:7;24009:18;:41::i;:::-;24001:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24117:28;24127:4;24133:2;24137:7;24117:9;:28::i;:::-;23848:305;;;:::o;24224:151::-;24328:39;24345:4;24351:2;24355:7;24328:39;;;;;;;;;;;;:16;:39::i;:::-;24224:151;;;:::o;21192:239::-;21264:7;21284:13;21300:7;:16;21308:7;21300:16;;;;;;;;;;;;;;;;;;;;;21284:32;;21352:1;21335:19;;:5;:19;;;;21327:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21418:5;21411:12;;;21192:239;;;:::o;33654:40::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20922:208::-;20994:7;21039:1;21022:19;;:5;:19;;;;21014:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21106:9;:16;21116:5;21106:16;;;;;;;;;;;;;;;;21099:23;;20922:208;;;:::o;33582:29::-;;;;:::o;34765:131::-;33966:10;33950:26;;:12;;;;;;;;;;;:26;;;33942:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;34879:9:::1;34857;:19;34867:8;34857:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;34765:131:::0;;:::o;33397:72::-;;;;;;;;;;;;;:::o;21667:104::-;21723:13;21756:7;21749:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21667:104;:::o;23251:295::-;23366:12;:10;:12::i;:::-;23354:24;;:8;:24;;;;23346:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23466:8;23421:18;:32;23440:12;:10;:12::i;:::-;23421:32;;;;;;;;;;;;;;;:42;23454:8;23421:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23519:8;23490:48;;23505:12;:10;:12::i;:::-;23490:48;;;23529:8;23490:48;;;;;;:::i;:::-;;;;;;;;23251:295;;:::o;24446:285::-;24578:41;24597:12;:10;:12::i;:::-;24611:7;24578:18;:41::i;:::-;24570:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24684:39;24698:4;24704:2;24708:7;24717:5;24684:13;:39::i;:::-;24446:285;;;;:::o;34467:214::-;34533:13;34566:9;:19;34576:8;34566:19;;;;;;;;;;;34559:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34467:214;;;:::o;33512:26::-;;;;:::o;34041:341::-;33966:10;33950:26;;:12;;;;;;;;;;;:26;;;33942:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;34136:9:::1;;34120:13;;:25;34112:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;34195:32;34201:10;34213:13;;34195:5;:32::i;:::-;34265:9;;34238;:24;34248:13;;34238:24;;;;;;;;;;;:36;;;;;;;:::i;:::-;;34295:13;;34290:30;34310:9;;34290:30;;;;;;;:::i;:::-;;;;;;;;34348:1;34331:13;;:18;;;;;;;:::i;:::-;;;;;;;;34041:341:::0;;:::o;23617:164::-;23714:4;23738:18;:25;23757:5;23738:25;;;;;;;;;;;;;;;:35;23764:8;23738:35;;;;;;;;;;;;;;;;;;;;;;;;;23731:42;;23617:164;;;;:::o;19064:157::-;19149:4;19188:25;19173:40;;;:11;:40;;;;19166:47;;19064:157;;;:::o;26198:127::-;26263:4;26315:1;26287:30;;:7;:16;26295:7;26287:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26280:37;;26198:127;;;:::o;15854:98::-;15907:7;15934:10;15927:17;;15854:98;:::o;30075:174::-;30177:2;30150:15;:24;30166:7;30150:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30233:7;30229:2;30195:46;;30204:23;30219:7;30204:14;:23::i;:::-;30195:46;;;;;;;;;;;;30075:174;;:::o;26492:348::-;26585:4;26610:16;26618:7;26610;:16::i;:::-;26602:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26686:13;26702:23;26717:7;26702:14;:23::i;:::-;26686:39;;26755:5;26744:16;;:7;:16;;;:51;;;;26788:7;26764:31;;:20;26776:7;26764:11;:20::i;:::-;:31;;;26744:51;:87;;;;26799:32;26816:5;26823:7;26799:16;:32::i;:::-;26744:87;26736:96;;;26492:348;;;;:::o;29413:544::-;29538:4;29511:31;;:23;29526:7;29511:14;:23::i;:::-;:31;;;29503:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29621:1;29607:16;;:2;:16;;;;29599:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29677:39;29698:4;29704:2;29708:7;29677:20;:39::i;:::-;29781:29;29798:1;29802:7;29781:8;:29::i;:::-;29842:1;29823:9;:15;29833:4;29823:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29871:1;29854:9;:13;29864:2;29854:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29902:2;29883:7;:16;29891:7;29883:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29941:7;29937:2;29922:27;;29931:4;29922:27;;;;;;;;;;;;29413:544;;;:::o;25613:272::-;25727:28;25737:4;25743:2;25747:7;25727:9;:28::i;:::-;25774:48;25797:4;25803:2;25807:7;25816:5;25774:22;:48::i;:::-;25766:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25613:272;;;;:::o;28105:382::-;28199:1;28185:16;;:2;:16;;;;28177:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28258:16;28266:7;28258;:16::i;:::-;28257:17;28249:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28320:45;28349:1;28353:2;28357:7;28320:20;:45::i;:::-;28395:1;28378:9;:13;28388:2;28378:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28426:2;28407:7;:16;28415:7;28407:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28471:7;28467:2;28446:33;;28463:1;28446:33;;;;;;;;;;;;28105:382;;:::o;32270:93::-;;;;:::o;30814:843::-;30935:4;30961:15;:2;:13;;;:15::i;:::-;30957:693;;;31013:2;30997:36;;;31034:12;:10;:12::i;:::-;31048:4;31054:7;31063:5;30997:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30993:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31260:1;31243:6;:13;:18;31239:341;;;31286:60;;;;;;;;;;:::i;:::-;;;;;;;;31239:341;31530:6;31524:13;31515:6;31511:2;31507:15;31500:38;30993:602;31130:45;;;31120:55;;;:6;:55;;;;31113:62;;;;;30957:693;31634:4;31627:11;;30814:843;;;;;;;:::o;7971:422::-;8031:4;8239:12;8350:7;8338:20;8330:28;;8384:1;8377:4;:8;8370:15;;;7971:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:352::-;1643:8;1653:6;1703:3;1696:4;1688:6;1684:17;1680:27;1670:2;;1721:1;1718;1711:12;1670:2;1757:6;1744:20;1734:30;;1787:18;1779:6;1776:30;1773:2;;;1819:1;1816;1809:12;1773:2;1856:4;1848:6;1844:17;1832:29;;1910:3;1902:4;1894:6;1890:17;1880:8;1876:32;1873:41;1870:2;;;1927:1;1924;1917:12;1870:2;1660:277;;;;;:::o;1957:273::-;2013:5;2062:3;2055:4;2047:6;2043:17;2039:27;2029:2;;2080:1;2077;2070:12;2029:2;2120:6;2107:20;2145:79;2220:3;2212:6;2205:4;2197:6;2193:17;2145:79;:::i;:::-;2136:88;;2019:211;;;;;:::o;2236:139::-;2282:5;2320:6;2307:20;2298:29;;2336:33;2363:5;2336:33;:::i;:::-;2288:87;;;;:::o;2381:262::-;2440:6;2489:2;2477:9;2468:7;2464:23;2460:32;2457:2;;;2505:1;2502;2495:12;2457:2;2548:1;2573:53;2618:7;2609:6;2598:9;2594:22;2573:53;:::i;:::-;2563:63;;2519:117;2447:196;;;;:::o;2649:407::-;2717:6;2725;2774:2;2762:9;2753:7;2749:23;2745:32;2742:2;;;2790:1;2787;2780:12;2742:2;2833:1;2858:53;2903:7;2894:6;2883:9;2879:22;2858:53;:::i;:::-;2848:63;;2804:117;2960:2;2986:53;3031:7;3022:6;3011:9;3007:22;2986:53;:::i;:::-;2976:63;;2931:118;2732:324;;;;;:::o;3062:552::-;3139:6;3147;3155;3204:2;3192:9;3183:7;3179:23;3175:32;3172:2;;;3220:1;3217;3210:12;3172:2;3263:1;3288:53;3333:7;3324:6;3313:9;3309:22;3288:53;:::i;:::-;3278:63;;3234:117;3390:2;3416:53;3461:7;3452:6;3441:9;3437:22;3416:53;:::i;:::-;3406:63;;3361:118;3518:2;3544:53;3589:7;3580:6;3569:9;3565:22;3544:53;:::i;:::-;3534:63;;3489:118;3162:452;;;;;:::o;3620:809::-;3715:6;3723;3731;3739;3788:3;3776:9;3767:7;3763:23;3759:33;3756:2;;;3805:1;3802;3795:12;3756:2;3848:1;3873:53;3918:7;3909:6;3898:9;3894:22;3873:53;:::i;:::-;3863:63;;3819:117;3975:2;4001:53;4046:7;4037:6;4026:9;4022:22;4001:53;:::i;:::-;3991:63;;3946:118;4103:2;4129:53;4174:7;4165:6;4154:9;4150:22;4129:53;:::i;:::-;4119:63;;4074:118;4259:2;4248:9;4244:18;4231:32;4290:18;4282:6;4279:30;4276:2;;;4322:1;4319;4312:12;4276:2;4350:62;4404:7;4395:6;4384:9;4380:22;4350:62;:::i;:::-;4340:72;;4202:220;3746:683;;;;;;;:::o;4435:401::-;4500:6;4508;4557:2;4545:9;4536:7;4532:23;4528:32;4525:2;;;4573:1;4570;4563:12;4525:2;4616:1;4641:53;4686:7;4677:6;4666:9;4662:22;4641:53;:::i;:::-;4631:63;;4587:117;4743:2;4769:50;4811:7;4802:6;4791:9;4787:22;4769:50;:::i;:::-;4759:60;;4714:115;4515:321;;;;;:::o;4842:407::-;4910:6;4918;4967:2;4955:9;4946:7;4942:23;4938:32;4935:2;;;4983:1;4980;4973:12;4935:2;5026:1;5051:53;5096:7;5087:6;5076:9;5072:22;5051:53;:::i;:::-;5041:63;;4997:117;5153:2;5179:53;5224:7;5215:6;5204:9;5200:22;5179:53;:::i;:::-;5169:63;;5124:118;4925:324;;;;;:::o;5255:260::-;5313:6;5362:2;5350:9;5341:7;5337:23;5333:32;5330:2;;;5378:1;5375;5368:12;5330:2;5421:1;5446:52;5490:7;5481:6;5470:9;5466:22;5446:52;:::i;:::-;5436:62;;5392:116;5320:195;;;;:::o;5521:282::-;5590:6;5639:2;5627:9;5618:7;5614:23;5610:32;5607:2;;;5655:1;5652;5645:12;5607:2;5698:1;5723:63;5778:7;5769:6;5758:9;5754:22;5723:63;:::i;:::-;5713:73;;5669:127;5597:206;;;;:::o;5809:395::-;5880:6;5888;5937:2;5925:9;5916:7;5912:23;5908:32;5905:2;;;5953:1;5950;5943:12;5905:2;6024:1;6013:9;6009:17;5996:31;6054:18;6046:6;6043:30;6040:2;;;6086:1;6083;6076:12;6040:2;6122:65;6179:7;6170:6;6159:9;6155:22;6122:65;:::i;:::-;6104:83;;;;5967:230;5895:309;;;;;:::o;6210:262::-;6269:6;6318:2;6306:9;6297:7;6293:23;6289:32;6286:2;;;6334:1;6331;6324:12;6286:2;6377:1;6402:53;6447:7;6438:6;6427:9;6423:22;6402:53;:::i;:::-;6392:63;;6348:117;6276:196;;;;:::o;6478:520::-;6556:6;6564;6613:2;6601:9;6592:7;6588:23;6584:32;6581:2;;;6629:1;6626;6619:12;6581:2;6672:1;6697:53;6742:7;6733:6;6722:9;6718:22;6697:53;:::i;:::-;6687:63;;6643:117;6827:2;6816:9;6812:18;6799:32;6858:18;6850:6;6847:30;6844:2;;;6890:1;6887;6880:12;6844:2;6918:63;6973:7;6964:6;6953:9;6949:22;6918:63;:::i;:::-;6908:73;;6770:221;6571:427;;;;;:::o;7004:118::-;7091:24;7109:5;7091:24;:::i;:::-;7086:3;7079:37;7069:53;;:::o;7128:109::-;7209:21;7224:5;7209:21;:::i;:::-;7204:3;7197:34;7187:50;;:::o;7243:360::-;7329:3;7357:38;7389:5;7357:38;:::i;:::-;7411:70;7474:6;7469:3;7411:70;:::i;:::-;7404:77;;7490:52;7535:6;7530:3;7523:4;7516:5;7512:16;7490:52;:::i;:::-;7567:29;7589:6;7567:29;:::i;:::-;7562:3;7558:39;7551:46;;7333:270;;;;;:::o;7633:304::-;7731:3;7752:71;7816:6;7811:3;7752:71;:::i;:::-;7745:78;;7833:43;7869:6;7864:3;7857:5;7833:43;:::i;:::-;7901:29;7923:6;7901:29;:::i;:::-;7896:3;7892:39;7885:46;;7735:202;;;;;:::o;7943:364::-;8031:3;8059:39;8092:5;8059:39;:::i;:::-;8114:71;8178:6;8173:3;8114:71;:::i;:::-;8107:78;;8194:52;8239:6;8234:3;8227:4;8220:5;8216:16;8194:52;:::i;:::-;8271:29;8293:6;8271:29;:::i;:::-;8266:3;8262:39;8255:46;;8035:272;;;;;:::o;8313:366::-;8455:3;8476:67;8540:2;8535:3;8476:67;:::i;:::-;8469:74;;8552:93;8641:3;8552:93;:::i;:::-;8670:2;8665:3;8661:12;8654:19;;8459:220;;;:::o;8685:366::-;8827:3;8848:67;8912:2;8907:3;8848:67;:::i;:::-;8841:74;;8924:93;9013:3;8924:93;:::i;:::-;9042:2;9037:3;9033:12;9026:19;;8831:220;;;:::o;9057:366::-;9199:3;9220:67;9284:2;9279:3;9220:67;:::i;:::-;9213:74;;9296:93;9385:3;9296:93;:::i;:::-;9414:2;9409:3;9405:12;9398:19;;9203:220;;;:::o;9429:366::-;9571:3;9592:67;9656:2;9651:3;9592:67;:::i;:::-;9585:74;;9668:93;9757:3;9668:93;:::i;:::-;9786:2;9781:3;9777:12;9770:19;;9575:220;;;:::o;9801:366::-;9943:3;9964:67;10028:2;10023:3;9964:67;:::i;:::-;9957:74;;10040:93;10129:3;10040:93;:::i;:::-;10158:2;10153:3;10149:12;10142:19;;9947:220;;;:::o;10173:366::-;10315:3;10336:67;10400:2;10395:3;10336:67;:::i;:::-;10329:74;;10412:93;10501:3;10412:93;:::i;:::-;10530:2;10525:3;10521:12;10514:19;;10319:220;;;:::o;10545:366::-;10687:3;10708:67;10772:2;10767:3;10708:67;:::i;:::-;10701:74;;10784:93;10873:3;10784:93;:::i;:::-;10902:2;10897:3;10893:12;10886:19;;10691:220;;;:::o;10917:366::-;11059:3;11080:67;11144:2;11139:3;11080:67;:::i;:::-;11073:74;;11156:93;11245:3;11156:93;:::i;:::-;11274:2;11269:3;11265:12;11258:19;;11063:220;;;:::o;11289:366::-;11431:3;11452:67;11516:2;11511:3;11452:67;:::i;:::-;11445:74;;11528:93;11617:3;11528:93;:::i;:::-;11646:2;11641:3;11637:12;11630:19;;11435:220;;;:::o;11661:366::-;11803:3;11824:67;11888:2;11883:3;11824:67;:::i;:::-;11817:74;;11900:93;11989:3;11900:93;:::i;:::-;12018:2;12013:3;12009:12;12002:19;;11807:220;;;:::o;12033:366::-;12175:3;12196:67;12260:2;12255:3;12196:67;:::i;:::-;12189:74;;12272:93;12361:3;12272:93;:::i;:::-;12390:2;12385:3;12381:12;12374:19;;12179:220;;;:::o;12405:366::-;12547:3;12568:67;12632:2;12627:3;12568:67;:::i;:::-;12561:74;;12644:93;12733:3;12644:93;:::i;:::-;12762:2;12757:3;12753:12;12746:19;;12551:220;;;:::o;12777:366::-;12919:3;12940:67;13004:2;12999:3;12940:67;:::i;:::-;12933:74;;13016:93;13105:3;13016:93;:::i;:::-;13134:2;13129:3;13125:12;13118:19;;12923:220;;;:::o;13149:366::-;13291:3;13312:67;13376:2;13371:3;13312:67;:::i;:::-;13305:74;;13388:93;13477:3;13388:93;:::i;:::-;13506:2;13501:3;13497:12;13490:19;;13295:220;;;:::o;13521:366::-;13663:3;13684:67;13748:2;13743:3;13684:67;:::i;:::-;13677:74;;13760:93;13849:3;13760:93;:::i;:::-;13878:2;13873:3;13869:12;13862:19;;13667:220;;;:::o;13893:118::-;13980:24;13998:5;13980:24;:::i;:::-;13975:3;13968:37;13958:53;;:::o;14017:222::-;14110:4;14148:2;14137:9;14133:18;14125:26;;14161:71;14229:1;14218:9;14214:17;14205:6;14161:71;:::i;:::-;14115:124;;;;:::o;14245:640::-;14440:4;14478:3;14467:9;14463:19;14455:27;;14492:71;14560:1;14549:9;14545:17;14536:6;14492:71;:::i;:::-;14573:72;14641:2;14630:9;14626:18;14617:6;14573:72;:::i;:::-;14655;14723:2;14712:9;14708:18;14699:6;14655:72;:::i;:::-;14774:9;14768:4;14764:20;14759:2;14748:9;14744:18;14737:48;14802:76;14873:4;14864:6;14802:76;:::i;:::-;14794:84;;14445:440;;;;;;;:::o;14891:210::-;14978:4;15016:2;15005:9;15001:18;14993:26;;15029:65;15091:1;15080:9;15076:17;15067:6;15029:65;:::i;:::-;14983:118;;;;:::o;15107:333::-;15230:4;15268:2;15257:9;15253:18;15245:26;;15317:9;15311:4;15307:20;15303:1;15292:9;15288:17;15281:47;15345:88;15428:4;15419:6;15411;15345:88;:::i;:::-;15337:96;;15235:205;;;;;:::o;15446:313::-;15559:4;15597:2;15586:9;15582:18;15574:26;;15646:9;15640:4;15636:20;15632:1;15621:9;15617:17;15610:47;15674:78;15747:4;15738:6;15674:78;:::i;:::-;15666:86;;15564:195;;;;:::o;15765:419::-;15931:4;15969:2;15958:9;15954:18;15946:26;;16018:9;16012:4;16008:20;16004:1;15993:9;15989:17;15982:47;16046:131;16172:4;16046:131;:::i;:::-;16038:139;;15936:248;;;:::o;16190:419::-;16356:4;16394:2;16383:9;16379:18;16371:26;;16443:9;16437:4;16433:20;16429:1;16418:9;16414:17;16407:47;16471:131;16597:4;16471:131;:::i;:::-;16463:139;;16361:248;;;:::o;16615:419::-;16781:4;16819:2;16808:9;16804:18;16796:26;;16868:9;16862:4;16858:20;16854:1;16843:9;16839:17;16832:47;16896:131;17022:4;16896:131;:::i;:::-;16888:139;;16786:248;;;:::o;17040:419::-;17206:4;17244:2;17233:9;17229:18;17221:26;;17293:9;17287:4;17283:20;17279:1;17268:9;17264:17;17257:47;17321:131;17447:4;17321:131;:::i;:::-;17313:139;;17211:248;;;:::o;17465:419::-;17631:4;17669:2;17658:9;17654:18;17646:26;;17718:9;17712:4;17708:20;17704:1;17693:9;17689:17;17682:47;17746:131;17872:4;17746:131;:::i;:::-;17738:139;;17636:248;;;:::o;17890:419::-;18056:4;18094:2;18083:9;18079:18;18071:26;;18143:9;18137:4;18133:20;18129:1;18118:9;18114:17;18107:47;18171:131;18297:4;18171:131;:::i;:::-;18163:139;;18061:248;;;:::o;18315:419::-;18481:4;18519:2;18508:9;18504:18;18496:26;;18568:9;18562:4;18558:20;18554:1;18543:9;18539:17;18532:47;18596:131;18722:4;18596:131;:::i;:::-;18588:139;;18486:248;;;:::o;18740:419::-;18906:4;18944:2;18933:9;18929:18;18921:26;;18993:9;18987:4;18983:20;18979:1;18968:9;18964:17;18957:47;19021:131;19147:4;19021:131;:::i;:::-;19013:139;;18911:248;;;:::o;19165:419::-;19331:4;19369:2;19358:9;19354:18;19346:26;;19418:9;19412:4;19408:20;19404:1;19393:9;19389:17;19382:47;19446:131;19572:4;19446:131;:::i;:::-;19438:139;;19336:248;;;:::o;19590:419::-;19756:4;19794:2;19783:9;19779:18;19771:26;;19843:9;19837:4;19833:20;19829:1;19818:9;19814:17;19807:47;19871:131;19997:4;19871:131;:::i;:::-;19863:139;;19761:248;;;:::o;20015:419::-;20181:4;20219:2;20208:9;20204:18;20196:26;;20268:9;20262:4;20258:20;20254:1;20243:9;20239:17;20232:47;20296:131;20422:4;20296:131;:::i;:::-;20288:139;;20186:248;;;:::o;20440:419::-;20606:4;20644:2;20633:9;20629:18;20621:26;;20693:9;20687:4;20683:20;20679:1;20668:9;20664:17;20657:47;20721:131;20847:4;20721:131;:::i;:::-;20713:139;;20611:248;;;:::o;20865:419::-;21031:4;21069:2;21058:9;21054:18;21046:26;;21118:9;21112:4;21108:20;21104:1;21093:9;21089:17;21082:47;21146:131;21272:4;21146:131;:::i;:::-;21138:139;;21036:248;;;:::o;21290:419::-;21456:4;21494:2;21483:9;21479:18;21471:26;;21543:9;21537:4;21533:20;21529:1;21518:9;21514:17;21507:47;21571:131;21697:4;21571:131;:::i;:::-;21563:139;;21461:248;;;:::o;21715:419::-;21881:4;21919:2;21908:9;21904:18;21896:26;;21968:9;21962:4;21958:20;21954:1;21943:9;21939:17;21932:47;21996:131;22122:4;21996:131;:::i;:::-;21988:139;;21886:248;;;:::o;22140:222::-;22233:4;22271:2;22260:9;22256:18;22248:26;;22284:71;22352:1;22341:9;22337:17;22328:6;22284:71;:::i;:::-;22238:124;;;;:::o;22368:129::-;22402:6;22429:20;;:::i;:::-;22419:30;;22458:33;22486:4;22478:6;22458:33;:::i;:::-;22409:88;;;:::o;22503:75::-;22536:6;22569:2;22563:9;22553:19;;22543:35;:::o;22584:307::-;22645:4;22735:18;22727:6;22724:30;22721:2;;;22757:18;;:::i;:::-;22721:2;22795:29;22817:6;22795:29;:::i;:::-;22787:37;;22879:4;22873;22869:15;22861:23;;22650:241;;;:::o;22897:308::-;22959:4;23049:18;23041:6;23038:30;23035:2;;;23071:18;;:::i;:::-;23035:2;23109:29;23131:6;23109:29;:::i;:::-;23101:37;;23193:4;23187;23183:15;23175:23;;22964:241;;;:::o;23211:98::-;23262:6;23296:5;23290:12;23280:22;;23269:40;;;:::o;23315:99::-;23367:6;23401:5;23395:12;23385:22;;23374:40;;;:::o;23420:168::-;23503:11;23537:6;23532:3;23525:19;23577:4;23572:3;23568:14;23553:29;;23515:73;;;;:::o;23594:169::-;23678:11;23712:6;23707:3;23700:19;23752:4;23747:3;23743:14;23728:29;;23690:73;;;;:::o;23769:305::-;23809:3;23828:20;23846:1;23828:20;:::i;:::-;23823:25;;23862:20;23880:1;23862:20;:::i;:::-;23857:25;;24016:1;23948:66;23944:74;23941:1;23938:81;23935:2;;;24022:18;;:::i;:::-;23935:2;24066:1;24063;24059:9;24052:16;;23813:261;;;;:::o;24080:191::-;24120:4;24140:20;24158:1;24140:20;:::i;:::-;24135:25;;24174:20;24192:1;24174:20;:::i;:::-;24169:25;;24213:1;24210;24207:8;24204:2;;;24218:18;;:::i;:::-;24204:2;24263:1;24260;24256:9;24248:17;;24125:146;;;;:::o;24277:96::-;24314:7;24343:24;24361:5;24343:24;:::i;:::-;24332:35;;24322:51;;;:::o;24379:90::-;24413:7;24456:5;24449:13;24442:21;24431:32;;24421:48;;;:::o;24475:149::-;24511:7;24551:66;24544:5;24540:78;24529:89;;24519:105;;;:::o;24630:126::-;24667:7;24707:42;24700:5;24696:54;24685:65;;24675:81;;;:::o;24762:77::-;24799:7;24828:5;24817:16;;24807:32;;;:::o;24845:154::-;24929:6;24924:3;24919;24906:30;24991:1;24982:6;24977:3;24973:16;24966:27;24896:103;;;:::o;25005:307::-;25073:1;25083:113;25097:6;25094:1;25091:13;25083:113;;;25182:1;25177:3;25173:11;25167:18;25163:1;25158:3;25154:11;25147:39;25119:2;25116:1;25112:10;25107:15;;25083:113;;;25214:6;25211:1;25208:13;25205:2;;;25294:1;25285:6;25280:3;25276:16;25269:27;25205:2;25054:258;;;;:::o;25318:320::-;25362:6;25399:1;25393:4;25389:12;25379:22;;25446:1;25440:4;25436:12;25467:18;25457:2;;25523:4;25515:6;25511:17;25501:27;;25457:2;25585;25577:6;25574:14;25554:18;25551:38;25548:2;;;25604:18;;:::i;:::-;25548:2;25369:269;;;;:::o;25644:281::-;25727:27;25749:4;25727:27;:::i;:::-;25719:6;25715:40;25857:6;25845:10;25842:22;25821:18;25809:10;25806:34;25803:62;25800:2;;;25868:18;;:::i;:::-;25800:2;25908:10;25904:2;25897:22;25687:238;;;:::o;25931:180::-;25979:77;25976:1;25969:88;26076:4;26073:1;26066:15;26100:4;26097:1;26090:15;26117:180;26165:77;26162:1;26155:88;26262:4;26259:1;26252:15;26286:4;26283:1;26276:15;26303:180;26351:77;26348:1;26341:88;26448:4;26445:1;26438:15;26472:4;26469:1;26462:15;26489:102;26530:6;26581:2;26577:7;26572:2;26565:5;26561:14;26557:28;26547:38;;26537:54;;;:::o;26597:237::-;26737:34;26733:1;26725:6;26721:14;26714:58;26806:20;26801:2;26793:6;26789:15;26782:45;26703:131;:::o;26840:178::-;26980:30;26976:1;26968:6;26964:14;26957:54;26946:72;:::o;27024:223::-;27164:34;27160:1;27152:6;27148:14;27141:58;27233:6;27228:2;27220:6;27216:15;27209:31;27130:117;:::o;27253:175::-;27393:27;27389:1;27381:6;27377:14;27370:51;27359:69;:::o;27434:231::-;27574:34;27570:1;27562:6;27558:14;27551:58;27643:14;27638:2;27630:6;27626:15;27619:39;27540:125;:::o;27671:243::-;27811:34;27807:1;27799:6;27795:14;27788:58;27880:26;27875:2;27867:6;27863:15;27856:51;27777:137;:::o;27920:229::-;28060:34;28056:1;28048:6;28044:14;28037:58;28129:12;28124:2;28116:6;28112:15;28105:37;28026:123;:::o;28155:228::-;28295:34;28291:1;28283:6;28279:14;28272:58;28364:11;28359:2;28351:6;28347:15;28340:36;28261:122;:::o;28389:182::-;28529:34;28525:1;28517:6;28513:14;28506:58;28495:76;:::o;28577:231::-;28717:34;28713:1;28705:6;28701:14;28694:58;28786:14;28781:2;28773:6;28769:15;28762:39;28683:125;:::o;28814:182::-;28954:34;28950:1;28942:6;28938:14;28931:58;28920:76;:::o;29002:228::-;29142:34;29138:1;29130:6;29126:14;29119:58;29211:11;29206:2;29198:6;29194:15;29187:36;29108:122;:::o;29236:220::-;29376:34;29372:1;29364:6;29360:14;29353:58;29445:3;29440:2;29432:6;29428:15;29421:28;29342:114;:::o;29462:236::-;29602:34;29598:1;29590:6;29586:14;29579:58;29671:19;29666:2;29658:6;29654:15;29647:44;29568:130;:::o;29704:221::-;29844:34;29840:1;29832:6;29828:14;29821:58;29913:4;29908:2;29900:6;29896:15;29889:29;29810:115;:::o;29931:122::-;30004:24;30022:5;30004:24;:::i;:::-;29997:5;29994:35;29984:2;;30043:1;30040;30033:12;29984:2;29974:79;:::o;30059:116::-;30129:21;30144:5;30129:21;:::i;:::-;30122:5;30119:32;30109:2;;30165:1;30162;30155:12;30109:2;30099:76;:::o;30181:120::-;30253:23;30270:5;30253:23;:::i;:::-;30246:5;30243:34;30233:2;;30291:1;30288;30281:12;30233:2;30223:78;:::o;30307:122::-;30380:24;30398:5;30380:24;:::i;:::-;30373:5;30370:35;30360:2;;30419:1;30416;30409:12;30360:2;30350:79;:::o

Swarm Source

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