ETH Price: $3,959.49 (+1.74%)

Token

BearTings (BEART)
 

Overview

Max Total Supply

5,000 BEART

Holders

2,010

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 BEART
0x074083df5e5291b20145d532bfe1426ec5648f92
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:
BearTings

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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;

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: contracts/BearTings.sol

//SPDX-License-Identifier: BearTings
pragma solidity ^0.8.15;

// ----------------------------------------------------------------------------
// 'BearTings' NFT contract on mainnet

// BearTings.sol
// ----------------------------------------------------------------------------




contract BearTings is ERC721, Ownable {
    uint256 private nextTokenId = 1;
    
    //0: mint closed
    //1: private mode (freeMinters only)
    //2: public (limited to maxMintsPerWallet)
    uint8 public mintMode = 0; //0=closed; 1=private; 2=public
    string baseExtension = ".json";
    string baseURI = "ipfs://QmVo7AsLgP3tnLvoSgC2v2tUeg47VQEo57acsEfSvpJRe2/";
    
    uint256 public mintCost = 0; //mint price per NFT

    uint16 public maxSupply = 5000;
    
    //unit8 is max 256!
    mapping (address => uint16) public freeMinters; //remaining freeMints per address
    mapping (address => uint16) private minters; //counts of mints done by a address
    uint16 public maxMintsPerWallet = 1; //only applicable for non-freeMinters 

    //ERC2981
    bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;
    address private royalties_recipient;
    uint96 private royalties_basepoints;
    
    constructor() ERC721("BearTings", "BEART") {
        setRoyalties(msg.sender, 1000);
    }


    function cost(address account, uint16 nfts) public view returns (uint256) {
        //free for owner
        if (msg.sender == owner()) {
            return 0;
        }

        //freeMinters
        uint16 freeMints = freeMinters[account];

        //deduct freemints
        if(freeMints >= nfts) {
            return 0;
        } else {
            return mintCost * (nfts - freeMints);
        }
    }

    function mintsLeft(address account) public view returns (uint16) { 
        if (mintMode==1) {
            return freeMinters[account];
        } else if (mintMode==2) {
            if(freeMinters[account]>0) { //in case it has freeMints left, he can get them
                return freeMinters[account];
            } else { //in case it has no freeMints left
                if(minters[account] >= maxMintsPerWallet) { //if we have allready more minted in mode 1 than we can in total
                    return 0;
                } else {
                    return maxMintsPerWallet - minters[account];
                }
            }
        } else { //mint mode 0
            return 0;
        }

    }

    //mint (option 1) max ammount to sender address
    function mint() public payable { 
        require(mintMode > 0, "ERROR: Minting closed.");
        uint16 _mintsLeft = mintsLeft(msg.sender);
        require(_mintsLeft > 0, "ERROR: No mints left for you");        
        mint(_mintsLeft);
    }
    
    //mint (option 2) to sender address
    function mint(uint16 _mintAmount) public payable { 
        require(mintMode > 0, "ERROR: Minting closed.");
        require(_mintAmount <= mintsLeft(msg.sender), "ERROR: Too many mints requested");        
        
        //check if we got enough payment
        if (mintCost > 0) {
          require(msg.value >= cost(msg.sender, _mintAmount), "ERROR: Not enough value sent to cover cost. call cost function to assess the costs.");
        }

        doMint(msg.sender, _mintAmount);
    }

    //mint to a specific address
    function doMint(address to, uint16 _mintAmount) private { 
        require(_mintAmount > 0, "ERROR: Mint amount must be > 0");
        require(nextTokenId-1 + _mintAmount <= maxSupply, "ERROR: Collection is fully minted!");
    
        for (uint16 i = 1; i <= _mintAmount; i++) {
            _safeMint(to, nextTokenId);
            nextTokenId++; //increase nextTokenId counter
            //if it is a freemint, decrease free mint counter for the receiver
            if(freeMinters[to] > 0) {
                freeMinters[to]--;
            }
            minters[to] = minters[to]+1;
        }
    }
    
  
    //Owner can mint over this function
    function mintByOwner(address to, uint16 mintAmount) public onlyOwner { 
        doMint(to, mintAmount);
    }

    //ERC2981 Interface
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount) {
        return (royalties_recipient, _salePrice * royalties_basepoints / 10000);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721) returns (bool) {
        if(interfaceId == _INTERFACE_ID_ERC2981) {
            return true;
        }
        return super.supportsInterface(interfaceId);
    } 

     function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }     
    
    function tokenURI(uint256 _tokenId) public view override(ERC721) returns (string memory) {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
        
        return string(abi.encodePacked(_baseURI(), Strings.toString(_tokenId), baseExtension));

    }

     //from ERC721Enumerable; returns the current supply
    function totalSupply() public view returns (uint256) {
        return nextTokenId-1;
    }
    
    function walletOfOwner(address _owner) public view returns (uint256[] memory){
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        uint256 counter = 0;
        for (uint256 i=1; i < nextTokenId; i++) {
            if(_exists(i) && ownerOf(i)==_owner)
            tokenIds[counter++] = i;
        }
        return tokenIds;
    }

    function setBaseURI(string memory newbaseURI) public onlyOwner {
        baseURI = newbaseURI;
    }
    
    function setExtension(string memory newbaseExtension) public onlyOwner {
        baseExtension = newbaseExtension;
    }
    
    function setMintCost(uint256 _mintCost) public onlyOwner {
        mintCost = _mintCost;
    }

    //set contract wide Royalties for ERC2981 Interface
    function setRoyalties(address _recipient, uint96 _basepoints) public onlyOwner {
        require(_basepoints<=10000, "Royalties: basepoint max is 10000 for 100% royalties");
          royalties_recipient = _recipient;
          royalties_basepoints = _basepoints;
    }
    
    
    function setMaxMintsPerWallet(uint16 _newMaxMintAmount) public onlyOwner {
        maxMintsPerWallet = _newMaxMintAmount;
    }
    
    function setMaxSupply(uint16 _maxSupply) public onlyOwner {
        maxSupply = _maxSupply;
    }

    //0: mint closed
    //1: private mode (freeMinters only)
    //2: public (limited to maxMintsPerWallet)
    function setMintMode(uint8 _mintMode) public onlyOwner {
        mintMode = _mintMode;
    }

    
    function setFreeMinters(address[] memory accounts, uint16 amount) external onlyOwner {
        uint256 length = accounts.length;

        for (uint256 i = 0; i < length; i++) {
            freeMinters[accounts[i]] = amount;
        }
    }

   /*function freeMinter(address _account) public view returns (uint16){
        return freeMinters[_account];
    }*/    
   function minter(address _account) public view returns (uint16){
        return minters[_account];
    }

   /* function setFreeMinters2(address[] memory accounts, uint16[] memory amounts) external onlyOwner {
        uint256 length = accounts.length;
        uint256 length2 = amounts.length;
        require(length == length2, "ERROR: Both arrays need to have the the same lenght!");

        for (uint i = 0; i < length; i++) {
            freeMinters[accounts[i]] = amounts[i];
        }
    }*/


    function withdraw() public payable onlyOwner {
        (bool os, ) = payable(owner()).call{value: address(this).balance}("");
        require(os);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint16","name":"nfts","type":"uint16"}],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMinters","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"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":"maxMintsPerWallet","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_mintAmount","type":"uint16"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16","name":"mintAmount","type":"uint16"}],"name":"mintByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintMode","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"minter","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"mintsLeft","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newbaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newbaseExtension","type":"string"}],"name":"setExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint16","name":"amount","type":"uint16"}],"name":"setFreeMinters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_newMaxMintAmount","type":"uint16"}],"name":"setMaxMintsPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_maxSupply","type":"uint16"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintCost","type":"uint256"}],"name":"setMintCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintMode","type":"uint8"}],"name":"setMintMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint96","name":"_basepoints","type":"uint96"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60016007556008805460ff1916905560c06040526005608090815264173539b7b760d91b60a0526009906200003590826200034c565b506040518060600160405280603681526020016200320260369139600a906200005f90826200034c565b506000600b55600c805461ffff1990811661138817909155600f805490911660011790553480156200009057600080fd5b50604051806040016040528060098152602001684265617254696e677360b81b81525060405180604001604052806005815260200164109150549560da1b8152508160009081620000e291906200034c565b506001620000f182826200034c565b5050506200010e620001086200012260201b60201c565b62000126565b6200011c336103e862000178565b62000418565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6006546001600160a01b03163314620001d85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b612710816001600160601b031611156200025b5760405162461bcd60e51b815260206004820152603460248201527f526f79616c746965733a2062617365706f696e74206d6178206973203130303060448201527f3020666f72203130302520726f79616c746965730000000000000000000000006064820152608401620001cf565b600f80546001600160a01b03909316620100000262010000600160b01b031990931692909217909155601080546001600160601b039092166001600160601b0319909216919091179055565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620002d257607f821691505b602082108103620002f357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200034757600081815260208120601f850160051c81016020861015620003225750805b601f850160051c820191505b8181101562000343578281556001016200032e565b5050505b505050565b81516001600160401b03811115620003685762000368620002a7565b6200038081620003798454620002bd565b84620002f9565b602080601f831160018114620003b857600084156200039f5750858301515b600019600386901b1c1916600185901b17855562000343565b600085815260208120601f198616915b82811015620003e957888601518255948401946001909101908401620003c8565b5085821015620004085787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612dda80620004286000396000f3fe6080604052600436106102a05760003560e01c806372131db31161016e578063bdb4b848116100cb578063d5abeb011161007f578063f2fde38b11610064578063f2fde38b14610783578063f516a2e6146107a3578063f8b08712146107be57600080fd5b8063d5abeb011461071f578063e985e9c51461073a57600080fd5b8063c67c8902116100b0578063c67c8902146106bf578063c8494888146106df578063c87b56dd146106ff57600080fd5b8063bdb4b84814610689578063c21b471b1461069f57600080fd5b80638545f4ea1161012257806395d89b411161010757806395d89b4114610634578063a22cb46514610649578063b88d4fde1461066957600080fd5b80638545f4ea146105f65780638da5cb5b1461061657600080fd5b80637e2285aa116101535780637e2285aa1461059657806380de2c27146105b657806382b239a4146105d657600080fd5b806372131db31461054a578063788c59991461056a57600080fd5b80632a55205a1161021c578063438b6300116101d05780636352211e116101b55780636352211e146104f557806370a0823114610515578063715018a61461053557600080fd5b8063438b6300146104a857806355f804b3146104d557600080fd5b80633dd08c38116102015780633dd08c381461041b5780633fc250fc1461046857806342842e0e1461048857600080fd5b80632a55205a146103d45780633ccfd60b1461041357600080fd5b8063095ea7b31161027357806318160ddd1161025857806318160ddd1461037e57806323b872dd146103a157806323cf0a22146103c157600080fd5b8063095ea7b3146103565780631249c58b1461037657600080fd5b806301ffc9a7146102a557806306421c2f146102da57806306fdde03146102fc578063081812fc1461031e575b600080fd5b3480156102b157600080fd5b506102c56102c03660046124fb565b6107ef565b60405190151581526020015b60405180910390f35b3480156102e657600080fd5b506102fa6102f5366004612531565b610839565b005b34801561030857600080fd5b5061031161089e565b6040516102d191906125a4565b34801561032a57600080fd5b5061033e6103393660046125b7565b610930565b6040516001600160a01b0390911681526020016102d1565b34801561036257600080fd5b506102fa6103713660046125e7565b6109c5565b6102fa610af6565b34801561038a57600080fd5b50610393610bb5565b6040519081526020016102d1565b3480156103ad57600080fd5b506102fa6103bc366004612611565b610bcb565b6102fa6103cf366004612531565b610c52565b3480156103e057600080fd5b506103f46103ef36600461264d565b610dbb565b604080516001600160a01b0390931683526020830191909152016102d1565b6102fa610e08565b34801561042757600080fd5b5061045561043636600461266f565b6001600160a01b03166000908152600e602052604090205461ffff1690565b60405161ffff90911681526020016102d1565b34801561047457600080fd5b506102fa6104833660046126d1565b610ec1565b34801561049457600080fd5b506102fa6104a3366004612611565b610f88565b3480156104b457600080fd5b506104c86104c336600461266f565b610fa3565b6040516102d19190612790565b3480156104e157600080fd5b506102fa6104f036600461282c565b611093565b34801561050157600080fd5b5061033e6105103660046125b7565b6110eb565b34801561052157600080fd5b5061039361053036600461266f565b611176565b34801561054157600080fd5b506102fa611210565b34801561055657600080fd5b506102fa610565366004612875565b611264565b34801561057657600080fd5b506008546105849060ff1681565b60405160ff90911681526020016102d1565b3480156105a257600080fd5b506102fa6105b136600461282c565b6112c2565b3480156105c257600080fd5b506104556105d136600461266f565b611316565b3480156105e257600080fd5b506103936105f1366004612898565b611400565b34801561060257600080fd5b506102fa6106113660046125b7565b611480565b34801561062257600080fd5b506006546001600160a01b031661033e565b34801561064057600080fd5b506103116114cd565b34801561065557600080fd5b506102fa6106643660046128cb565b6114dc565b34801561067557600080fd5b506102fa610684366004612907565b6114e7565b34801561069557600080fd5b50610393600b5481565b3480156106ab57600080fd5b506102fa6106ba366004612983565b61156f565b3480156106cb57600080fd5b506102fa6106da366004612898565b6116a9565b3480156106eb57600080fd5b506102fa6106fa366004612531565b6116fb565b34801561070b57600080fd5b5061031161071a3660046125b7565b61175b565b34801561072b57600080fd5b50600c546104559061ffff1681565b34801561074657600080fd5b506102c56107553660046129c0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561078f57600080fd5b506102fa61079e36600461266f565b611823565b3480156107af57600080fd5b50600f546104559061ffff1681565b3480156107ca57600080fd5b506104556107d936600461266f565b600d6020526000908152604090205461ffff1681565b60007fd5aadfa6000000000000000000000000000000000000000000000000000000006001600160e01b031983160161082a57506001919050565b610833826118f0565b92915050565b6006546001600160a01b031633146108865760405162461bcd60e51b81526020600482018190526024820152600080516020612d8583398151915260448201526064015b60405180910390fd5b600c805461ffff191661ffff92909216919091179055565b6060600080546108ad906129ea565b80601f01602080910402602001604051908101604052809291908181526020018280546108d9906129ea565b80156109265780601f106108fb57610100808354040283529160200191610926565b820191906000526020600020905b81548152906001019060200180831161090957829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109a95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161087d565b506000908152600460205260409020546001600160a01b031690565b60006109d0826110eb565b9050806001600160a01b0316836001600160a01b031603610a595760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161087d565b336001600160a01b0382161480610a755750610a758133610755565b610ae75760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161087d565b610af1838361198b565b505050565b60085460ff16610b485760405162461bcd60e51b815260206004820152601660248201527f4552524f523a204d696e74696e6720636c6f7365642e00000000000000000000604482015260640161087d565b6000610b5333611316565b905060008161ffff1611610ba95760405162461bcd60e51b815260206004820152601c60248201527f4552524f523a204e6f206d696e7473206c65667420666f7220796f7500000000604482015260640161087d565b610bb281610c52565b50565b60006001600754610bc69190612a3a565b905090565b610bd53382611a06565b610c475760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161087d565b610af1838383611afc565b60085460ff16610ca45760405162461bcd60e51b815260206004820152601660248201527f4552524f523a204d696e74696e6720636c6f7365642e00000000000000000000604482015260640161087d565b610cad33611316565b61ffff168161ffff161115610d045760405162461bcd60e51b815260206004820152601f60248201527f4552524f523a20546f6f206d616e79206d696e74732072657175657374656400604482015260640161087d565b600b5415610db157610d163382611400565b341015610db15760405162461bcd60e51b815260206004820152605360248201527f4552524f523a204e6f7420656e6f7567682076616c75652073656e7420746f2060448201527f636f76657220636f73742e2063616c6c20636f73742066756e6374696f6e207460648201527f6f206173736573732074686520636f7374732e00000000000000000000000000608482015260a40161087d565b610bb23382611cd6565b600f546010546000918291620100009091046001600160a01b03169061271090610df3906bffffffffffffffffffffffff1686612a51565b610dfd9190612a86565b915091509250929050565b6006546001600160a01b03163314610e505760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b6000610e646006546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610eae576040519150601f19603f3d011682016040523d82523d6000602084013e610eb3565b606091505b5050905080610bb257600080fd5b6006546001600160a01b03163314610f095760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b815160005b81811015610f825782600d6000868481518110610f2d57610f2d612a9a565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055508080610f7a90612ab0565b915050610f0e565b50505050565b610af1838383604051806020016040528060008152506114e7565b60606000610fb083611176565b905060008167ffffffffffffffff811115610fcd57610fcd61268a565b604051908082528060200260200182016040528015610ff6578160200160208202803683370190505b509050600060015b600754811015611089576000818152600260205260409020546001600160a01b0316151580156110475750856001600160a01b031661103c826110eb565b6001600160a01b0316145b156110775780838361105881612ab0565b94508151811061106a5761106a612a9a565b6020026020010181815250505b8061108181612ab0565b915050610ffe565b5090949350505050565b6006546001600160a01b031633146110db5760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b600a6110e78282612b17565b5050565b6000818152600260205260408120546001600160a01b0316806108335760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161087d565b60006001600160a01b0382166111f45760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161087d565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146112585760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b6112626000611ec3565b565b6006546001600160a01b031633146112ac5760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b6008805460ff191660ff92909216919091179055565b6006546001600160a01b0316331461130a5760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b60096110e78282612b17565b60085460009060ff1660010361134657506001600160a01b03166000908152600d602052604090205461ffff1690565b60085460ff166002036113f3576001600160a01b0382166000908152600d602052604090205461ffff161561139557506001600160a01b03166000908152600d602052604090205461ffff1690565b600f546001600160a01b0383166000908152600e602052604090205461ffff9182169116106113c657506000919050565b6001600160a01b0382166000908152600e6020526040902054600f546108339161ffff9081169116612bd7565b506000919050565b919050565b60006114146006546001600160a01b031690565b6001600160a01b0316330361142b57506000610833565b6001600160a01b0383166000908152600d602052604090205461ffff908116908316811061145d576000915050610833565b6114678184612bd7565b61ffff16600b546114789190612a51565b949350505050565b6006546001600160a01b031633146114c85760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b600b55565b6060600180546108ad906129ea565b6110e7338383611f22565b6114f13383611a06565b6115635760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161087d565b610f8284848484611ff0565b6006546001600160a01b031633146115b75760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b612710816bffffffffffffffffffffffff16111561163d5760405162461bcd60e51b815260206004820152603460248201527f526f79616c746965733a2062617365706f696e74206d6178206973203130303060448201527f3020666f72203130302520726f79616c74696573000000000000000000000000606482015260840161087d565b600f80546001600160a01b0390931662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff90931692909217909155601080546bffffffffffffffffffffffff9092166bffffffffffffffffffffffff19909216919091179055565b6006546001600160a01b031633146116f15760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b6110e78282611cd6565b6006546001600160a01b031633146117435760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b600f805461ffff191661ffff92909216919091179055565b6000818152600260205260409020546060906001600160a01b03166117e85760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606482015260840161087d565b6117f061206e565b6117f98361207d565b600960405160200161180d93929190612bfa565b6040516020818303038152906040529050919050565b6006546001600160a01b0316331461186b5760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b6001600160a01b0381166118e75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161087d565b610bb281611ec3565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061195357506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061083357507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610833565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03841690811790915581906119cd826110eb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611a7f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161087d565b6000611a8a836110eb565b9050806001600160a01b0316846001600160a01b03161480611ad157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806114785750836001600160a01b0316611aea84610930565b6001600160a01b031614949350505050565b826001600160a01b0316611b0f826110eb565b6001600160a01b031614611b8b5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161087d565b6001600160a01b038216611c065760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161087d565b611c1160008261198b565b6001600160a01b0383166000908152600360205260408120805460019290611c3a908490612a3a565b90915550506001600160a01b0382166000908152600360205260408120805460019290611c68908490612c9a565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008161ffff1611611d2a5760405162461bcd60e51b815260206004820152601e60248201527f4552524f523a204d696e7420616d6f756e74206d757374206265203e20300000604482015260640161087d565b600c5460075461ffff91821691831690611d4690600190612a3a565b611d509190612c9a565b1115611dc45760405162461bcd60e51b815260206004820152602260248201527f4552524f523a20436f6c6c656374696f6e2069732066756c6c79206d696e746560448201527f6421000000000000000000000000000000000000000000000000000000000000606482015260840161087d565b60015b8161ffff168161ffff1611610af157611de2836007546121b2565b60078054906000611df283612ab0565b90915550506001600160a01b0383166000908152600d602052604090205461ffff1615611e5d576001600160a01b0383166000908152600d60205260408120805461ffff1691611e4183612cb2565b91906101000a81548161ffff021916908361ffff160217905550505b6001600160a01b0383166000908152600e6020526040902054611e859061ffff166001612cd0565b6001600160a01b0384166000908152600e60205260409020805461ffff191661ffff9290921691909117905580611ebb81612cf6565b915050611dc7565b600680546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603611f835760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161087d565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611ffb848484611afc565b612007848484846121cc565b610f825760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161087d565b6060600a80546108ad906129ea565b6060816000036120c057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156120ea57806120d481612ab0565b91506120e39050600a83612a86565b91506120c4565b60008167ffffffffffffffff8111156121055761210561268a565b6040519080825280601f01601f19166020018201604052801561212f576020820181803683370190505b5090505b841561147857612144600183612a3a565b9150612151600a86612d17565b61215c906030612c9a565b60f81b81838151811061217157612171612a9a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506121ab600a86612a86565b9450612133565b6110e7828260405180602001604052806000815250612318565b60006001600160a01b0384163b1561230d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612210903390899088908890600401612d2b565b6020604051808303816000875af192505050801561224b575060408051601f3d908101601f1916820190925261224891810190612d67565b60015b6122f3573d808015612279576040519150601f19603f3d011682016040523d82523d6000602084013e61227e565b606091505b5080516000036122eb5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161087d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611478565b506001949350505050565b6123228383612396565b61232f60008484846121cc565b610af15760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161087d565b6001600160a01b0382166123ec5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161087d565b6000818152600260205260409020546001600160a01b0316156124515760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161087d565b6001600160a01b038216600090815260036020526040812080546001929061247a908490612c9a565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b031981168114610bb257600080fd5b60006020828403121561250d57600080fd5b8135612518816124e5565b9392505050565b803561ffff811681146113fb57600080fd5b60006020828403121561254357600080fd5b6125188261251f565b60005b8381101561256757818101518382015260200161254f565b83811115610f825750506000910152565b6000815180845261259081602086016020860161254c565b601f01601f19169290920160200192915050565b6020815260006125186020830184612578565b6000602082840312156125c957600080fd5b5035919050565b80356001600160a01b03811681146113fb57600080fd5b600080604083850312156125fa57600080fd5b612603836125d0565b946020939093013593505050565b60008060006060848603121561262657600080fd5b61262f846125d0565b925061263d602085016125d0565b9150604084013590509250925092565b6000806040838503121561266057600080fd5b50508035926020909101359150565b60006020828403121561268157600080fd5b612518826125d0565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156126c9576126c961268a565b604052919050565b600080604083850312156126e457600080fd5b823567ffffffffffffffff808211156126fc57600080fd5b818501915085601f83011261271057600080fd5b81356020828211156127245761272461268a565b8160051b92506127358184016126a0565b828152928401810192818101908985111561274f57600080fd5b948201945b8486101561277457612765866125d0565b82529482019490820190612754565b9650612783905087820161251f565b9450505050509250929050565b6020808252825182820181905260009190848201906040850190845b818110156127c8578351835292840192918401916001016127ac565b50909695505050505050565b600067ffffffffffffffff8311156127ee576127ee61268a565b612801601f8401601f19166020016126a0565b905082815283838301111561281557600080fd5b828260208301376000602084830101529392505050565b60006020828403121561283e57600080fd5b813567ffffffffffffffff81111561285557600080fd5b8201601f8101841361286657600080fd5b611478848235602084016127d4565b60006020828403121561288757600080fd5b813560ff8116811461251857600080fd5b600080604083850312156128ab57600080fd5b6128b4836125d0565b91506128c26020840161251f565b90509250929050565b600080604083850312156128de57600080fd5b6128e7836125d0565b9150602083013580151581146128fc57600080fd5b809150509250929050565b6000806000806080858703121561291d57600080fd5b612926856125d0565b9350612934602086016125d0565b925060408501359150606085013567ffffffffffffffff81111561295757600080fd5b8501601f8101871361296857600080fd5b612977878235602084016127d4565b91505092959194509250565b6000806040838503121561299657600080fd5b61299f836125d0565b915060208301356bffffffffffffffffffffffff811681146128fc57600080fd5b600080604083850312156129d357600080fd5b6129dc836125d0565b91506128c2602084016125d0565b600181811c908216806129fe57607f821691505b602082108103612a1e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082821015612a4c57612a4c612a24565b500390565b6000816000190483118215151615612a6b57612a6b612a24565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612a9557612a95612a70565b500490565b634e487b7160e01b600052603260045260246000fd5b600060018201612ac257612ac2612a24565b5060010190565b601f821115610af157600081815260208120601f850160051c81016020861015612af05750805b601f850160051c820191505b81811015612b0f57828155600101612afc565b505050505050565b815167ffffffffffffffff811115612b3157612b3161268a565b612b4581612b3f84546129ea565b84612ac9565b602080601f831160018114612b7a5760008415612b625750858301515b600019600386901b1c1916600185901b178555612b0f565b600085815260208120601f198616915b82811015612ba957888601518255948401946001909101908401612b8a565b5085821015612bc75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600061ffff83811690831681811015612bf257612bf2612a24565b039392505050565b600084516020612c0d8285838a0161254c565b855191840191612c208184848a0161254c565b8554920191600090612c31816129ea565b60018281168015612c495760018114612c5e57612c8a565b60ff1984168752821515830287019450612c8a565b896000528560002060005b84811015612c8257815489820152908301908701612c69565b505082870194505b50929a9950505050505050505050565b60008219821115612cad57612cad612a24565b500190565b600061ffff821680612cc657612cc6612a24565b6000190192915050565b600061ffff808316818516808303821115612ced57612ced612a24565b01949350505050565b600061ffff808316818103612d0d57612d0d612a24565b6001019392505050565b600082612d2657612d26612a70565b500690565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612d5d6080830184612578565b9695505050505050565b600060208284031215612d7957600080fd5b8151612518816124e556fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122051f0e24aceabcb3725df0249c87e0f5e143fb7223b119792254f582c2edf340c64736f6c634300080f0033697066733a2f2f516d566f3741734c675033746e4c766f5367433276327455656734375651456f353761637345665376704a5265322f

Deployed Bytecode

0x6080604052600436106102a05760003560e01c806372131db31161016e578063bdb4b848116100cb578063d5abeb011161007f578063f2fde38b11610064578063f2fde38b14610783578063f516a2e6146107a3578063f8b08712146107be57600080fd5b8063d5abeb011461071f578063e985e9c51461073a57600080fd5b8063c67c8902116100b0578063c67c8902146106bf578063c8494888146106df578063c87b56dd146106ff57600080fd5b8063bdb4b84814610689578063c21b471b1461069f57600080fd5b80638545f4ea1161012257806395d89b411161010757806395d89b4114610634578063a22cb46514610649578063b88d4fde1461066957600080fd5b80638545f4ea146105f65780638da5cb5b1461061657600080fd5b80637e2285aa116101535780637e2285aa1461059657806380de2c27146105b657806382b239a4146105d657600080fd5b806372131db31461054a578063788c59991461056a57600080fd5b80632a55205a1161021c578063438b6300116101d05780636352211e116101b55780636352211e146104f557806370a0823114610515578063715018a61461053557600080fd5b8063438b6300146104a857806355f804b3146104d557600080fd5b80633dd08c38116102015780633dd08c381461041b5780633fc250fc1461046857806342842e0e1461048857600080fd5b80632a55205a146103d45780633ccfd60b1461041357600080fd5b8063095ea7b31161027357806318160ddd1161025857806318160ddd1461037e57806323b872dd146103a157806323cf0a22146103c157600080fd5b8063095ea7b3146103565780631249c58b1461037657600080fd5b806301ffc9a7146102a557806306421c2f146102da57806306fdde03146102fc578063081812fc1461031e575b600080fd5b3480156102b157600080fd5b506102c56102c03660046124fb565b6107ef565b60405190151581526020015b60405180910390f35b3480156102e657600080fd5b506102fa6102f5366004612531565b610839565b005b34801561030857600080fd5b5061031161089e565b6040516102d191906125a4565b34801561032a57600080fd5b5061033e6103393660046125b7565b610930565b6040516001600160a01b0390911681526020016102d1565b34801561036257600080fd5b506102fa6103713660046125e7565b6109c5565b6102fa610af6565b34801561038a57600080fd5b50610393610bb5565b6040519081526020016102d1565b3480156103ad57600080fd5b506102fa6103bc366004612611565b610bcb565b6102fa6103cf366004612531565b610c52565b3480156103e057600080fd5b506103f46103ef36600461264d565b610dbb565b604080516001600160a01b0390931683526020830191909152016102d1565b6102fa610e08565b34801561042757600080fd5b5061045561043636600461266f565b6001600160a01b03166000908152600e602052604090205461ffff1690565b60405161ffff90911681526020016102d1565b34801561047457600080fd5b506102fa6104833660046126d1565b610ec1565b34801561049457600080fd5b506102fa6104a3366004612611565b610f88565b3480156104b457600080fd5b506104c86104c336600461266f565b610fa3565b6040516102d19190612790565b3480156104e157600080fd5b506102fa6104f036600461282c565b611093565b34801561050157600080fd5b5061033e6105103660046125b7565b6110eb565b34801561052157600080fd5b5061039361053036600461266f565b611176565b34801561054157600080fd5b506102fa611210565b34801561055657600080fd5b506102fa610565366004612875565b611264565b34801561057657600080fd5b506008546105849060ff1681565b60405160ff90911681526020016102d1565b3480156105a257600080fd5b506102fa6105b136600461282c565b6112c2565b3480156105c257600080fd5b506104556105d136600461266f565b611316565b3480156105e257600080fd5b506103936105f1366004612898565b611400565b34801561060257600080fd5b506102fa6106113660046125b7565b611480565b34801561062257600080fd5b506006546001600160a01b031661033e565b34801561064057600080fd5b506103116114cd565b34801561065557600080fd5b506102fa6106643660046128cb565b6114dc565b34801561067557600080fd5b506102fa610684366004612907565b6114e7565b34801561069557600080fd5b50610393600b5481565b3480156106ab57600080fd5b506102fa6106ba366004612983565b61156f565b3480156106cb57600080fd5b506102fa6106da366004612898565b6116a9565b3480156106eb57600080fd5b506102fa6106fa366004612531565b6116fb565b34801561070b57600080fd5b5061031161071a3660046125b7565b61175b565b34801561072b57600080fd5b50600c546104559061ffff1681565b34801561074657600080fd5b506102c56107553660046129c0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561078f57600080fd5b506102fa61079e36600461266f565b611823565b3480156107af57600080fd5b50600f546104559061ffff1681565b3480156107ca57600080fd5b506104556107d936600461266f565b600d6020526000908152604090205461ffff1681565b60007fd5aadfa6000000000000000000000000000000000000000000000000000000006001600160e01b031983160161082a57506001919050565b610833826118f0565b92915050565b6006546001600160a01b031633146108865760405162461bcd60e51b81526020600482018190526024820152600080516020612d8583398151915260448201526064015b60405180910390fd5b600c805461ffff191661ffff92909216919091179055565b6060600080546108ad906129ea565b80601f01602080910402602001604051908101604052809291908181526020018280546108d9906129ea565b80156109265780601f106108fb57610100808354040283529160200191610926565b820191906000526020600020905b81548152906001019060200180831161090957829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109a95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161087d565b506000908152600460205260409020546001600160a01b031690565b60006109d0826110eb565b9050806001600160a01b0316836001600160a01b031603610a595760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161087d565b336001600160a01b0382161480610a755750610a758133610755565b610ae75760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161087d565b610af1838361198b565b505050565b60085460ff16610b485760405162461bcd60e51b815260206004820152601660248201527f4552524f523a204d696e74696e6720636c6f7365642e00000000000000000000604482015260640161087d565b6000610b5333611316565b905060008161ffff1611610ba95760405162461bcd60e51b815260206004820152601c60248201527f4552524f523a204e6f206d696e7473206c65667420666f7220796f7500000000604482015260640161087d565b610bb281610c52565b50565b60006001600754610bc69190612a3a565b905090565b610bd53382611a06565b610c475760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161087d565b610af1838383611afc565b60085460ff16610ca45760405162461bcd60e51b815260206004820152601660248201527f4552524f523a204d696e74696e6720636c6f7365642e00000000000000000000604482015260640161087d565b610cad33611316565b61ffff168161ffff161115610d045760405162461bcd60e51b815260206004820152601f60248201527f4552524f523a20546f6f206d616e79206d696e74732072657175657374656400604482015260640161087d565b600b5415610db157610d163382611400565b341015610db15760405162461bcd60e51b815260206004820152605360248201527f4552524f523a204e6f7420656e6f7567682076616c75652073656e7420746f2060448201527f636f76657220636f73742e2063616c6c20636f73742066756e6374696f6e207460648201527f6f206173736573732074686520636f7374732e00000000000000000000000000608482015260a40161087d565b610bb23382611cd6565b600f546010546000918291620100009091046001600160a01b03169061271090610df3906bffffffffffffffffffffffff1686612a51565b610dfd9190612a86565b915091509250929050565b6006546001600160a01b03163314610e505760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b6000610e646006546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610eae576040519150601f19603f3d011682016040523d82523d6000602084013e610eb3565b606091505b5050905080610bb257600080fd5b6006546001600160a01b03163314610f095760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b815160005b81811015610f825782600d6000868481518110610f2d57610f2d612a9a565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055508080610f7a90612ab0565b915050610f0e565b50505050565b610af1838383604051806020016040528060008152506114e7565b60606000610fb083611176565b905060008167ffffffffffffffff811115610fcd57610fcd61268a565b604051908082528060200260200182016040528015610ff6578160200160208202803683370190505b509050600060015b600754811015611089576000818152600260205260409020546001600160a01b0316151580156110475750856001600160a01b031661103c826110eb565b6001600160a01b0316145b156110775780838361105881612ab0565b94508151811061106a5761106a612a9a565b6020026020010181815250505b8061108181612ab0565b915050610ffe565b5090949350505050565b6006546001600160a01b031633146110db5760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b600a6110e78282612b17565b5050565b6000818152600260205260408120546001600160a01b0316806108335760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161087d565b60006001600160a01b0382166111f45760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161087d565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146112585760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b6112626000611ec3565b565b6006546001600160a01b031633146112ac5760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b6008805460ff191660ff92909216919091179055565b6006546001600160a01b0316331461130a5760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b60096110e78282612b17565b60085460009060ff1660010361134657506001600160a01b03166000908152600d602052604090205461ffff1690565b60085460ff166002036113f3576001600160a01b0382166000908152600d602052604090205461ffff161561139557506001600160a01b03166000908152600d602052604090205461ffff1690565b600f546001600160a01b0383166000908152600e602052604090205461ffff9182169116106113c657506000919050565b6001600160a01b0382166000908152600e6020526040902054600f546108339161ffff9081169116612bd7565b506000919050565b919050565b60006114146006546001600160a01b031690565b6001600160a01b0316330361142b57506000610833565b6001600160a01b0383166000908152600d602052604090205461ffff908116908316811061145d576000915050610833565b6114678184612bd7565b61ffff16600b546114789190612a51565b949350505050565b6006546001600160a01b031633146114c85760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b600b55565b6060600180546108ad906129ea565b6110e7338383611f22565b6114f13383611a06565b6115635760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161087d565b610f8284848484611ff0565b6006546001600160a01b031633146115b75760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b612710816bffffffffffffffffffffffff16111561163d5760405162461bcd60e51b815260206004820152603460248201527f526f79616c746965733a2062617365706f696e74206d6178206973203130303060448201527f3020666f72203130302520726f79616c74696573000000000000000000000000606482015260840161087d565b600f80546001600160a01b0390931662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff90931692909217909155601080546bffffffffffffffffffffffff9092166bffffffffffffffffffffffff19909216919091179055565b6006546001600160a01b031633146116f15760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b6110e78282611cd6565b6006546001600160a01b031633146117435760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b600f805461ffff191661ffff92909216919091179055565b6000818152600260205260409020546060906001600160a01b03166117e85760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606482015260840161087d565b6117f061206e565b6117f98361207d565b600960405160200161180d93929190612bfa565b6040516020818303038152906040529050919050565b6006546001600160a01b0316331461186b5760405162461bcd60e51b81526020600482018190526024820152600080516020612d85833981519152604482015260640161087d565b6001600160a01b0381166118e75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161087d565b610bb281611ec3565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061195357506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061083357507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610833565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03841690811790915581906119cd826110eb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611a7f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161087d565b6000611a8a836110eb565b9050806001600160a01b0316846001600160a01b03161480611ad157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806114785750836001600160a01b0316611aea84610930565b6001600160a01b031614949350505050565b826001600160a01b0316611b0f826110eb565b6001600160a01b031614611b8b5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161087d565b6001600160a01b038216611c065760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161087d565b611c1160008261198b565b6001600160a01b0383166000908152600360205260408120805460019290611c3a908490612a3a565b90915550506001600160a01b0382166000908152600360205260408120805460019290611c68908490612c9a565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008161ffff1611611d2a5760405162461bcd60e51b815260206004820152601e60248201527f4552524f523a204d696e7420616d6f756e74206d757374206265203e20300000604482015260640161087d565b600c5460075461ffff91821691831690611d4690600190612a3a565b611d509190612c9a565b1115611dc45760405162461bcd60e51b815260206004820152602260248201527f4552524f523a20436f6c6c656374696f6e2069732066756c6c79206d696e746560448201527f6421000000000000000000000000000000000000000000000000000000000000606482015260840161087d565b60015b8161ffff168161ffff1611610af157611de2836007546121b2565b60078054906000611df283612ab0565b90915550506001600160a01b0383166000908152600d602052604090205461ffff1615611e5d576001600160a01b0383166000908152600d60205260408120805461ffff1691611e4183612cb2565b91906101000a81548161ffff021916908361ffff160217905550505b6001600160a01b0383166000908152600e6020526040902054611e859061ffff166001612cd0565b6001600160a01b0384166000908152600e60205260409020805461ffff191661ffff9290921691909117905580611ebb81612cf6565b915050611dc7565b600680546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603611f835760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161087d565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611ffb848484611afc565b612007848484846121cc565b610f825760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161087d565b6060600a80546108ad906129ea565b6060816000036120c057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156120ea57806120d481612ab0565b91506120e39050600a83612a86565b91506120c4565b60008167ffffffffffffffff8111156121055761210561268a565b6040519080825280601f01601f19166020018201604052801561212f576020820181803683370190505b5090505b841561147857612144600183612a3a565b9150612151600a86612d17565b61215c906030612c9a565b60f81b81838151811061217157612171612a9a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506121ab600a86612a86565b9450612133565b6110e7828260405180602001604052806000815250612318565b60006001600160a01b0384163b1561230d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612210903390899088908890600401612d2b565b6020604051808303816000875af192505050801561224b575060408051601f3d908101601f1916820190925261224891810190612d67565b60015b6122f3573d808015612279576040519150601f19603f3d011682016040523d82523d6000602084013e61227e565b606091505b5080516000036122eb5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161087d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611478565b506001949350505050565b6123228383612396565b61232f60008484846121cc565b610af15760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840161087d565b6001600160a01b0382166123ec5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161087d565b6000818152600260205260409020546001600160a01b0316156124515760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161087d565b6001600160a01b038216600090815260036020526040812080546001929061247a908490612c9a565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b031981168114610bb257600080fd5b60006020828403121561250d57600080fd5b8135612518816124e5565b9392505050565b803561ffff811681146113fb57600080fd5b60006020828403121561254357600080fd5b6125188261251f565b60005b8381101561256757818101518382015260200161254f565b83811115610f825750506000910152565b6000815180845261259081602086016020860161254c565b601f01601f19169290920160200192915050565b6020815260006125186020830184612578565b6000602082840312156125c957600080fd5b5035919050565b80356001600160a01b03811681146113fb57600080fd5b600080604083850312156125fa57600080fd5b612603836125d0565b946020939093013593505050565b60008060006060848603121561262657600080fd5b61262f846125d0565b925061263d602085016125d0565b9150604084013590509250925092565b6000806040838503121561266057600080fd5b50508035926020909101359150565b60006020828403121561268157600080fd5b612518826125d0565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156126c9576126c961268a565b604052919050565b600080604083850312156126e457600080fd5b823567ffffffffffffffff808211156126fc57600080fd5b818501915085601f83011261271057600080fd5b81356020828211156127245761272461268a565b8160051b92506127358184016126a0565b828152928401810192818101908985111561274f57600080fd5b948201945b8486101561277457612765866125d0565b82529482019490820190612754565b9650612783905087820161251f565b9450505050509250929050565b6020808252825182820181905260009190848201906040850190845b818110156127c8578351835292840192918401916001016127ac565b50909695505050505050565b600067ffffffffffffffff8311156127ee576127ee61268a565b612801601f8401601f19166020016126a0565b905082815283838301111561281557600080fd5b828260208301376000602084830101529392505050565b60006020828403121561283e57600080fd5b813567ffffffffffffffff81111561285557600080fd5b8201601f8101841361286657600080fd5b611478848235602084016127d4565b60006020828403121561288757600080fd5b813560ff8116811461251857600080fd5b600080604083850312156128ab57600080fd5b6128b4836125d0565b91506128c26020840161251f565b90509250929050565b600080604083850312156128de57600080fd5b6128e7836125d0565b9150602083013580151581146128fc57600080fd5b809150509250929050565b6000806000806080858703121561291d57600080fd5b612926856125d0565b9350612934602086016125d0565b925060408501359150606085013567ffffffffffffffff81111561295757600080fd5b8501601f8101871361296857600080fd5b612977878235602084016127d4565b91505092959194509250565b6000806040838503121561299657600080fd5b61299f836125d0565b915060208301356bffffffffffffffffffffffff811681146128fc57600080fd5b600080604083850312156129d357600080fd5b6129dc836125d0565b91506128c2602084016125d0565b600181811c908216806129fe57607f821691505b602082108103612a1e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082821015612a4c57612a4c612a24565b500390565b6000816000190483118215151615612a6b57612a6b612a24565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612a9557612a95612a70565b500490565b634e487b7160e01b600052603260045260246000fd5b600060018201612ac257612ac2612a24565b5060010190565b601f821115610af157600081815260208120601f850160051c81016020861015612af05750805b601f850160051c820191505b81811015612b0f57828155600101612afc565b505050505050565b815167ffffffffffffffff811115612b3157612b3161268a565b612b4581612b3f84546129ea565b84612ac9565b602080601f831160018114612b7a5760008415612b625750858301515b600019600386901b1c1916600185901b178555612b0f565b600085815260208120601f198616915b82811015612ba957888601518255948401946001909101908401612b8a565b5085821015612bc75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600061ffff83811690831681811015612bf257612bf2612a24565b039392505050565b600084516020612c0d8285838a0161254c565b855191840191612c208184848a0161254c565b8554920191600090612c31816129ea565b60018281168015612c495760018114612c5e57612c8a565b60ff1984168752821515830287019450612c8a565b896000528560002060005b84811015612c8257815489820152908301908701612c69565b505082870194505b50929a9950505050505050505050565b60008219821115612cad57612cad612a24565b500190565b600061ffff821680612cc657612cc6612a24565b6000190192915050565b600061ffff808316818516808303821115612ced57612ced612a24565b01949350505050565b600061ffff808316818103612d0d57612d0d612a24565b6001019392505050565b600082612d2657612d26612a70565b500690565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612d5d6080830184612578565b9695505050505050565b600060208284031215612d7957600080fd5b8151612518816124e556fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122051f0e24aceabcb3725df0249c87e0f5e143fb7223b119792254f582c2edf340c64736f6c634300080f0033

Deployed Bytecode Sourcemap

38124:7634:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42263:250;;;;;;;;;;-1:-1:-1;42263:250:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;42263:250:0;;;;;;;;44375:99;;;;;;;;;;-1:-1:-1;44375:99:0;;;;;:::i;:::-;;:::i;:::-;;25622:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27182:221::-;;;;;;;;;;-1:-1:-1;27182:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2091:55:1;;;2073:74;;2061:2;2046:18;27182:221:0;1927:226:1;26705:411:0;;;;;;;;;;-1:-1:-1;26705:411:0;;;;;:::i;:::-;;:::i;40379:251::-;;;:::i;43008:92::-;;;;;;;;;;;;;:::i;:::-;;;2764:25:1;;;2752:2;2737:18;43008:92:0;2618:177:1;27932:339:0;;;;;;;;;;-1:-1:-1;27932:339:0;;;;;:::i;:::-;;:::i;40683:502::-;;;;;;:::i;:::-;;:::i;42042:213::-;;;;;;;;;;-1:-1:-1;42042:213:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3578:55:1;;;3560:74;;3665:2;3650:18;;3643:34;;;;3533:18;42042:213:0;3386:297:1;45600:155:0;;;:::i;45080:105::-;;;;;;;;;;-1:-1:-1;45080:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;45160:17:0;45135:6;45160:17;;;:7;:17;;;;;;;;;45080:105;;;;4053:6:1;4041:19;;;4023:38;;4011:2;3996:18;45080:105:0;3879:188:1;44702:245:0;;;;;;;;;;-1:-1:-1;44702:245:0;;;;;:::i;:::-;;:::i;28342:185::-;;;;;;;;;;-1:-1:-1;28342:185:0;;;;;:::i;:::-;;:::i;43112:414::-;;;;;;;;;;-1:-1:-1;43112:414:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;43534:102::-;;;;;;;;;;-1:-1:-1;43534:102:0;;;;;:::i;:::-;;:::i;25316:239::-;;;;;;;;;;-1:-1:-1;25316:239:0;;;;;:::i;:::-;;:::i;25046:208::-;;;;;;;;;;-1:-1:-1;25046:208:0;;;;;:::i;:::-;;:::i;4889:103::-;;;;;;;;;;;;;:::i;44594:94::-;;;;;;;;;;-1:-1:-1;44594:94:0;;;;;:::i;:::-;;:::i;38325:25::-;;;;;;;;;;-1:-1:-1;38325:25:0;;;;;;;;;;;7523:4:1;7511:17;;;7493:36;;7481:2;7466:18;38325:25:0;7351:184:1;43648:122:0;;;;;;;;;;-1:-1:-1;43648:122:0;;;;;:::i;:::-;;:::i;39594:724::-;;;;;;;;;;-1:-1:-1;39594:724:0;;;;;:::i;:::-;;:::i;39165:421::-;;;;;;;;;;-1:-1:-1;39165:421:0;;;;;:::i;:::-;;:::i;43782:96::-;;;;;;;;;;-1:-1:-1;43782:96:0;;;;;:::i;:::-;;:::i;4238:87::-;;;;;;;;;;-1:-1:-1;4311:6:0;;-1:-1:-1;;;;;4311:6:0;4238:87;;25791:104;;;;;;;;;;;;;:::i;27475:155::-;;;;;;;;;;-1:-1:-1;27475:155:0;;;;;:::i;:::-;;:::i;28598:328::-;;;;;;;;;;-1:-1:-1;28598:328:0;;;;;:::i;:::-;;:::i;38512:27::-;;;;;;;;;;;;;;;;43943:273;;;;;;;;;;-1:-1:-1;43943:273:0;;;;;:::i;:::-;;:::i;41898:111::-;;;;;;;;;;-1:-1:-1;41898:111:0;;;;;:::i;:::-;;:::i;44234:129::-;;;;;;;;;;-1:-1:-1;44234:129:0;;;;;:::i;:::-;;:::i;42648:294::-;;;;;;;;;;-1:-1:-1;42648:294:0;;;;;:::i;:::-;;:::i;38569:30::-;;;;;;;;;;-1:-1:-1;38569:30:0;;;;;;;;27701:164;;;;;;;;;;-1:-1:-1;27701:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;27822:25:0;;;27798:4;27822:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27701:164;5147:201;;;;;;;;;;-1:-1:-1;5147:201:0;;;;;:::i;:::-;;:::i;38810:35::-;;;;;;;;;;-1:-1:-1;38810:35:0;;;;;;;;38637:46;;;;;;;;;;-1:-1:-1;38637:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42263:250;42356:4;42376:36;-1:-1:-1;;;;;;42376:36:0;;;42373:79;;-1:-1:-1;42436:4:0;;42263:250;-1:-1:-1;42263:250:0:o;42373:79::-;42469:36;42493:11;42469:23;:36::i;:::-;42462:43;42263:250;-1:-1:-1;;42263:250:0:o;44375:99::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;9665:2:1;4450:68:0;;;9647:21:1;;;9684:18;;;9677:30;-1:-1:-1;;;;;;;;;;;9723:18:1;;;9716:62;9795:18;;4450:68:0;;;;;;;;;44444:9:::1;:22:::0;;-1:-1:-1;;44444:22:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;44375:99::o;25622:100::-;25676:13;25709:5;25702:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25622:100;:::o;27182:221::-;27258:7;30525:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30525:16:0;27278:73;;;;-1:-1:-1;;;27278:73:0;;10468:2:1;27278:73:0;;;10450:21:1;10507:2;10487:18;;;10480:30;10546:34;10526:18;;;10519:62;-1:-1:-1;;;10597:18:1;;;10590:42;10649:19;;27278:73:0;10266:408:1;27278:73:0;-1:-1:-1;27371:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27371:24:0;;27182:221::o;26705:411::-;26786:13;26802:23;26817:7;26802:14;:23::i;:::-;26786:39;;26850:5;-1:-1:-1;;;;;26844:11:0;:2;-1:-1:-1;;;;;26844:11:0;;26836:57;;;;-1:-1:-1;;;26836:57:0;;10881:2:1;26836:57:0;;;10863:21:1;10920:2;10900:18;;;10893:30;10959:34;10939:18;;;10932:62;11030:3;11010:18;;;11003:31;11051:19;;26836:57:0;10679:397:1;26836:57:0;2989:10;-1:-1:-1;;;;;26928:21:0;;;;:62;;-1:-1:-1;26953:37:0;26970:5;2989:10;27701:164;:::i;26953:37::-;26906:168;;;;-1:-1:-1;;;26906:168:0;;11283:2:1;26906:168:0;;;11265:21:1;11322:2;11302:18;;;11295:30;11361:34;11341:18;;;11334:62;11432:26;11412:18;;;11405:54;11476:19;;26906:168:0;11081:420:1;26906:168:0;27087:21;27096:2;27100:7;27087:8;:21::i;:::-;26775:341;26705:411;;:::o;40379:251::-;40430:8;;;;40422:47;;;;-1:-1:-1;;;40422:47:0;;11708:2:1;40422:47:0;;;11690:21:1;11747:2;11727:18;;;11720:30;11786:24;11766:18;;;11759:52;11828:18;;40422:47:0;11506:346:1;40422:47:0;40480:17;40500:21;40510:10;40500:9;:21::i;:::-;40480:41;;40553:1;40540:10;:14;;;40532:55;;;;-1:-1:-1;;;40532:55:0;;12059:2:1;40532:55:0;;;12041:21:1;12098:2;12078:18;;;12071:30;12137;12117:18;;;12110:58;12185:18;;40532:55:0;11857:352:1;40532:55:0;40606:16;40611:10;40606:4;:16::i;:::-;40410:220;40379:251::o;43008:92::-;43052:7;43091:1;43079:11;;:13;;;;:::i;:::-;43072:20;;43008:92;:::o;27932:339::-;28127:41;2989:10;28160:7;28127:18;:41::i;:::-;28119:103;;;;-1:-1:-1;;;28119:103:0;;12735:2:1;28119:103:0;;;12717:21:1;12774:2;12754:18;;;12747:30;12813:34;12793:18;;;12786:62;12884:19;12864:18;;;12857:47;12921:19;;28119:103:0;12533:413:1;28119:103:0;28235:28;28245:4;28251:2;28255:7;28235:9;:28::i;40683:502::-;40752:8;;;;40744:47;;;;-1:-1:-1;;;40744:47:0;;11708:2:1;40744:47:0;;;11690:21:1;11747:2;11727:18;;;11720:30;11786:24;11766:18;;;11759:52;11828:18;;40744:47:0;11506:346:1;40744:47:0;40825:21;40835:10;40825:9;:21::i;:::-;40810:36;;:11;:36;;;;40802:80;;;;-1:-1:-1;;;40802:80:0;;13153:2:1;40802:80:0;;;13135:21:1;13192:2;13172:18;;;13165:30;13231:33;13211:18;;;13204:61;13282:18;;40802:80:0;12951:355:1;40802:80:0;40957:8;;:12;40953:181;;41005:29;41010:10;41022:11;41005:4;:29::i;:::-;40992:9;:42;;40984:138;;;;-1:-1:-1;;;40984:138:0;;13513:2:1;40984:138:0;;;13495:21:1;13552:2;13532:18;;;13525:30;13591:34;13571:18;;;13564:62;13662:34;13642:18;;;13635:62;13734:21;13713:19;;;13706:50;13773:19;;40984:138:0;13311:487:1;40984:138:0;41146:31;41153:10;41165:11;41146:6;:31::i;42042:213::-;42184:19;;42218:20;;42124:16;;;;42184:19;;;;-1:-1:-1;;;;;42184:19:0;;42241:5;;42205:33;;42218:20;;42205:10;:33;:::i;:::-;:41;;;;:::i;:::-;42176:71;;;;42042:213;;;;;:::o;45600:155::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;9665:2:1;4450:68:0;;;9647:21:1;;;9684:18;;;9677:30;-1:-1:-1;;;;;;;;;;;9723:18:1;;;9716:62;9795:18;;4450:68:0;9463:356:1;4450:68:0;45657:7:::1;45678;4311:6:::0;;-1:-1:-1;;;;;4311:6:0;;4238:87;45678:7:::1;-1:-1:-1::0;;;;;45670:21:0::1;45699;45670:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45656:69;;;45744:2;45736:11;;;::::0;::::1;44702:245:::0;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;9665:2:1;4450:68:0;;;9647:21:1;;;9684:18;;;9677:30;-1:-1:-1;;;;;;;;;;;9723:18:1;;;9716:62;9795:18;;4450:68:0;9463:356:1;4450:68:0;44815:15;;44798:14:::1;44843:97;44867:6;44863:1;:10;44843:97;;;44922:6;44895:11;:24;44907:8;44916:1;44907:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;44895:24:0::1;-1:-1:-1::0;;;;;44895:24:0::1;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;44875:3;;;;;:::i;:::-;;;;44843:97;;;;44787:160;44702:245:::0;;:::o;28342:185::-;28480:39;28497:4;28503:2;28507:7;28480:39;;;;;;;;;;;;:16;:39::i;43112:414::-;43172:16;43200:23;43226:17;43236:6;43226:9;:17::i;:::-;43200:43;;43254:25;43296:15;43282:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43282:30:0;-1:-1:-1;43254:58:0;-1:-1:-1;43323:15:0;43368:1;43353:140;43375:11;;43371:1;:15;43353:140;;;30501:4;30525:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30525:16:0;:30;;43411:32;;;;;43437:6;-1:-1:-1;;;;;43425:18:0;:10;43433:1;43425:7;:10::i;:::-;-1:-1:-1;;;;;43425:18:0;;43411:32;43408:73;;;43480:1;43458:8;43467:9;;;;:::i;:::-;;;43458:19;;;;;;;;:::i;:::-;;;;;;:23;;;;;43408:73;43388:3;;;;:::i;:::-;;;;43353:140;;;-1:-1:-1;43510:8:0;;43112:414;-1:-1:-1;;;;43112:414:0:o;43534:102::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;9665:2:1;4450:68:0;;;9647:21:1;;;9684:18;;;9677:30;-1:-1:-1;;;;;;;;;;;9723:18:1;;;9716:62;9795:18;;4450:68:0;9463:356:1;4450:68:0;43608:7:::1;:20;43618:10:::0;43608:7;:20:::1;:::i;:::-;;43534:102:::0;:::o;25316:239::-;25388:7;25424:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25424:16:0;;25451:73;;;;-1:-1:-1;;;25451:73:0;;17235:2:1;25451:73:0;;;17217:21:1;17274:2;17254:18;;;17247:30;17313:34;17293:18;;;17286:62;17384:11;17364:18;;;17357:39;17413:19;;25451:73:0;17033:405:1;25046:208:0;25118:7;-1:-1:-1;;;;;25146:19:0;;25138:74;;;;-1:-1:-1;;;25138:74:0;;17645:2:1;25138:74:0;;;17627:21:1;17684:2;17664:18;;;17657:30;17723:34;17703:18;;;17696:62;17794:12;17774:18;;;17767:40;17824:19;;25138:74:0;17443:406:1;25138:74:0;-1:-1:-1;;;;;;25230:16:0;;;;;:9;:16;;;;;;;25046:208::o;4889:103::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;9665:2:1;4450:68:0;;;9647:21:1;;;9684:18;;;9677:30;-1:-1:-1;;;;;;;;;;;9723:18:1;;;9716:62;9795:18;;4450:68:0;9463:356:1;4450:68:0;4954:30:::1;4981:1;4954:18;:30::i;:::-;4889:103::o:0;44594:94::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;9665:2:1;4450:68:0;;;9647:21:1;;;9684:18;;;9677:30;-1:-1:-1;;;;;;;;;;;9723:18:1;;;9716:62;9795:18;;4450:68:0;9463:356:1;4450:68:0;44660:8:::1;:20:::0;;-1:-1:-1;;44660:20:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;44594:94::o;43648:122::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;9665:2:1;4450:68:0;;;9647:21:1;;;9684:18;;;9677:30;-1:-1:-1;;;;;;;;;;;9723:18:1;;;9716:62;9795:18;;4450:68:0;9463:356:1;4450:68:0;43730:13:::1;:32;43746:16:::0;43730:13;:32:::1;:::i;39594:724::-:0;39675:8;;39651:6;;39675:8;;;:11;39671:638;;-1:-1:-1;;;;;;39710:20:0;;;;;:11;:20;;;;;;;;;39594:724::o;39671:638::-;39752:8;;;;39762:1;39752:11;39748:561;;-1:-1:-1;;;;;39783:20:0;;39804:1;39783:20;;;:11;:20;;;;;;;;:22;39780:463;;-1:-1:-1;;;;;;39882:20:0;;;;;:11;:20;;;;;;;;;39594:724::o;39780:463::-;40001:17;;-1:-1:-1;;;;;39981:16:0;;40001:17;39981:16;;;:7;:16;;;;;;40001:17;;;;39981:16;;:37;39978:250;;-1:-1:-1;40115:1:0;;39594:724;-1:-1:-1;39594:724:0:o;39978:250::-;-1:-1:-1;;;;;40192:16:0;;;;;;:7;:16;;;;;;40172:17;;:36;;40192:16;;;;;40172:17;:36;:::i;39748:561::-;-1:-1:-1;40296:1:0;;39594:724;-1:-1:-1;39594:724:0:o;39748:561::-;39594:724;;;:::o;39165:421::-;39230:7;39294;4311:6;;-1:-1:-1;;;;;4311:6:0;;4238:87;39294:7;-1:-1:-1;;;;;39280:21:0;:10;:21;39276:62;;-1:-1:-1;39325:1:0;39318:8;;39276:62;-1:-1:-1;;;;;39392:20:0;;39373:16;39392:20;;;:11;:20;;;;;;;;;;;39456:17;;;;39453:126;;39497:1;39490:8;;;;;39453:126;39550:16;39557:9;39550:4;:16;:::i;:::-;39538:29;;:8;;:29;;;;:::i;:::-;39531:36;39165:421;-1:-1:-1;;;;39165:421:0:o;43782:96::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;9665:2:1;4450:68:0;;;9647:21:1;;;9684:18;;;9677:30;-1:-1:-1;;;;;;;;;;;9723:18:1;;;9716:62;9795:18;;4450:68:0;9463:356:1;4450:68:0;43850:8:::1;:20:::0;43782:96::o;25791:104::-;25847:13;25880:7;25873:14;;;;;:::i;27475:155::-;27570:52;2989:10;27603:8;27613;27570:18;:52::i;28598:328::-;28773:41;2989:10;28806:7;28773:18;:41::i;:::-;28765:103;;;;-1:-1:-1;;;28765:103:0;;12735:2:1;28765:103:0;;;12717:21:1;12774:2;12754:18;;;12747:30;12813:34;12793:18;;;12786:62;12884:19;12864:18;;;12857:47;12921:19;;28765:103:0;12533:413:1;28765:103:0;28879:39;28893:4;28899:2;28903:7;28912:5;28879:13;:39::i;43943:273::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;9665:2:1;4450:68:0;;;9647:21:1;;;9684:18;;;9677:30;-1:-1:-1;;;;;;;;;;;9723:18:1;;;9716:62;9795:18;;4450:68:0;9463:356:1;4450:68:0;44054:5:::1;44041:11;:18;;;;44033:83;;;::::0;-1:-1:-1;;;44033:83:0;;18278:2:1;44033:83:0::1;::::0;::::1;18260:21:1::0;18317:2;18297:18;;;18290:30;18356:34;18336:18;;;18329:62;18427:22;18407:18;;;18400:50;18467:19;;44033:83:0::1;18076:416:1::0;44033:83:0::1;44129:19;:32:::0;;-1:-1:-1;;;;;44129:32:0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;44174:20:::1;:34:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;44174:34:0;;::::1;::::0;;;::::1;::::0;;43943:273::o;41898:111::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;9665:2:1;4450:68:0;;;9647:21:1;;;9684:18;;;9677:30;-1:-1:-1;;;;;;;;;;;9723:18:1;;;9716:62;9795:18;;4450:68:0;9463:356:1;4450:68:0;41979:22:::1;41986:2;41990:10;41979:6;:22::i;44234:129::-:0;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;9665:2:1;4450:68:0;;;9647:21:1;;;9684:18;;;9677:30;-1:-1:-1;;;;;;;;;;;9723:18:1;;;9716:62;9795:18;;4450:68:0;9463:356:1;4450:68:0;44318:17:::1;:37:::0;;-1:-1:-1;;44318:37:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;44234:129::o;42648:294::-;30501:4;30525:16;;;:7;:16;;;;;;42722:13;;-1:-1:-1;;;;;30525:16:0;42748:77;;;;-1:-1:-1;;;42748:77:0;;18699:2:1;42748:77:0;;;18681:21:1;18738:2;18718:18;;;18711:30;18777:34;18757:18;;;18750:62;18848:17;18828:18;;;18821:45;18883:19;;42748:77:0;18497:411:1;42748:77:0;42877:10;:8;:10::i;:::-;42889:26;42906:8;42889:16;:26::i;:::-;42917:13;42860:71;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42846:86;;42648:294;;;:::o;5147:201::-;4311:6;;-1:-1:-1;;;;;4311:6:0;2989:10;4458:23;4450:68;;;;-1:-1:-1;;;4450:68:0;;9665:2:1;4450:68:0;;;9647:21:1;;;9684:18;;;9677:30;-1:-1:-1;;;;;;;;;;;9723:18:1;;;9716:62;9795:18;;4450:68:0;9463:356:1;4450:68:0;-1:-1:-1;;;;;5236:22:0;::::1;5228:73;;;::::0;-1:-1:-1;;;5228:73:0;;20350:2:1;5228:73:0::1;::::0;::::1;20332:21:1::0;20389:2;20369:18;;;20362:30;20428:34;20408:18;;;20401:62;20499:8;20479:18;;;20472:36;20525:19;;5228:73:0::1;20148:402:1::0;5228:73:0::1;5312:28;5331:8;5312:18;:28::i;24677:305::-:0;24779:4;-1:-1:-1;;;;;;24816:40:0;;24831:25;24816:40;;:105;;-1:-1:-1;;;;;;;24873:48:0;;24888:33;24873:48;24816:105;:158;;;-1:-1:-1;17381:25:0;-1:-1:-1;;;;;;17366:40:0;;;24938:36;17257:157;34582:174;34657:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;34657:29:0;-1:-1:-1;;;;;34657:29:0;;;;;;;;:24;;34711:23;34657:24;34711:14;:23::i;:::-;-1:-1:-1;;;;;34702:46:0;;;;;;;;;;;34582:174;;:::o;30730:348::-;30823:4;30525:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30525:16:0;30840:73;;;;-1:-1:-1;;;30840:73:0;;20757:2:1;30840:73:0;;;20739:21:1;20796:2;20776:18;;;20769:30;20835:34;20815:18;;;20808:62;-1:-1:-1;;;20886:18:1;;;20879:42;20938:19;;30840:73:0;20555:408:1;30840:73:0;30924:13;30940:23;30955:7;30940:14;:23::i;:::-;30924:39;;30993:5;-1:-1:-1;;;;;30982:16:0;:7;-1:-1:-1;;;;;30982:16:0;;:52;;;-1:-1:-1;;;;;;27822:25:0;;;27798:4;27822:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;31002:32;30982:87;;;;31062:7;-1:-1:-1;;;;;31038:31:0;:20;31050:7;31038:11;:20::i;:::-;-1:-1:-1;;;;;31038:31:0;;30974:96;30730:348;-1:-1:-1;;;;30730:348:0:o;33839:625::-;33998:4;-1:-1:-1;;;;;33971:31:0;:23;33986:7;33971:14;:23::i;:::-;-1:-1:-1;;;;;33971:31:0;;33963:81;;;;-1:-1:-1;;;33963:81:0;;21170:2:1;33963:81:0;;;21152:21:1;21209:2;21189:18;;;21182:30;21248:34;21228:18;;;21221:62;21319:7;21299:18;;;21292:35;21344:19;;33963:81:0;20968:401:1;33963:81:0;-1:-1:-1;;;;;34063:16:0;;34055:65;;;;-1:-1:-1;;;34055:65:0;;21576:2:1;34055:65:0;;;21558:21:1;21615:2;21595:18;;;21588:30;21654:34;21634:18;;;21627:62;21725:6;21705:18;;;21698:34;21749:19;;34055:65:0;21374:400:1;34055:65:0;34237:29;34254:1;34258:7;34237:8;:29::i;:::-;-1:-1:-1;;;;;34279:15:0;;;;;;:9;:15;;;;;:20;;34298:1;;34279:15;:20;;34298:1;;34279:20;:::i;:::-;;;;-1:-1:-1;;;;;;;34310:13:0;;;;;;:9;:13;;;;;:18;;34327:1;;34310:13;:18;;34327:1;;34310:18;:::i;:::-;;;;-1:-1:-1;;34339:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;34339:21:0;-1:-1:-1;;;;;34339:21:0;;;;;;;;;34378:27;;34339:16;;34378:27;;;;;;;26775:341;26705:411;;:::o;41227:614::-;41317:1;41303:11;:15;;;41295:58;;;;-1:-1:-1;;;41295:58:0;;22114:2:1;41295:58:0;;;22096:21:1;22153:2;22133:18;;;22126:30;22192:32;22172:18;;;22165:60;22242:18;;41295:58:0;21912:354:1;41295:58:0;41403:9;;41372:11;;41403:9;;;;;41372:27;;;:13;;41403:9;;41372:13;:::i;:::-;:27;;;;:::i;:::-;:40;;41364:87;;;;-1:-1:-1;;;41364:87:0;;22473:2:1;41364:87:0;;;22455:21:1;22512:2;22492:18;;;22485:30;22551:34;22531:18;;;22524:62;22622:4;22602:18;;;22595:32;22644:19;;41364:87:0;22271:398:1;41364:87:0;41484:1;41468:366;41492:11;41487:16;;:1;:16;;;41468:366;;41525:26;41535:2;41539:11;;41525:9;:26::i;:::-;41566:11;:13;;;:11;:13;;;:::i;:::-;;;;-1:-1:-1;;;;;;;41708:15:0;;41726:1;41708:15;;;:11;:15;;;;;;;;:19;41705:76;;-1:-1:-1;;;;;41748:15:0;;;;;;:11;:15;;;;;:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;41705:76;-1:-1:-1;;;;;41809:11:0;;;;;;:7;:11;;;;;;:13;;:11;;;:13;:::i;:::-;-1:-1:-1;;;;;41795:11:0;;;;;;:7;:11;;;;;:27;;-1:-1:-1;;41795:27:0;;;;;;;;;;;;41505:3;;;;:::i;:::-;;;;41468:366;;5508:191;5601:6;;;-1:-1:-1;;;;;5618:17:0;;;-1:-1:-1;;5618:17:0;;;;;;;5651:40;;5601:6;;;5618:17;5601:6;;5651:40;;5582:16;;5651:40;5571:128;5508:191;:::o;34898:315::-;35053:8;-1:-1:-1;;;;;35044:17:0;:5;-1:-1:-1;;;;;35044:17:0;;35036:55;;;;-1:-1:-1;;;35036:55:0;;23493:2:1;35036:55:0;;;23475:21:1;23532:2;23512:18;;;23505:30;23571:27;23551:18;;;23544:55;23616:18;;35036:55:0;23291:349:1;35036:55:0;-1:-1:-1;;;;;35102:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;35102:46:0;;;;;;;;;;35164:41;;586::1;;;35164::0;;559:18:1;35164:41:0;;;;;;;34898:315;;;:::o;29808:::-;29965:28;29975:4;29981:2;29985:7;29965:9;:28::i;:::-;30012:48;30035:4;30041:2;30045:7;30054:5;30012:22;:48::i;:::-;30004:111;;;;-1:-1:-1;;;30004:111:0;;23847:2:1;30004:111:0;;;23829:21:1;23886:2;23866:18;;;23859:30;23925:34;23905:18;;;23898:62;-1:-1:-1;;;23976:18:1;;;23969:48;24034:19;;30004:111:0;23645:414:1;42523:108:0;42583:13;42616:7;42609:14;;;;;:::i;418:723::-;474:13;695:5;704:1;695:10;691:53;;-1:-1:-1;;722:10:0;;;;;;;;;;;;;;;;;;418:723::o;691:53::-;769:5;754:12;810:78;817:9;;810:78;;843:8;;;;:::i;:::-;;-1:-1:-1;866:10:0;;-1:-1:-1;874:2:0;866:10;;:::i;:::-;;;810:78;;;898:19;930:6;920:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;920:17:0;;898:39;;948:154;955:10;;948:154;;982:11;992:1;982:11;;:::i;:::-;;-1:-1:-1;1051:10:0;1059:2;1051:5;:10;:::i;:::-;1038:24;;:2;:24;:::i;:::-;1025:39;;1008:6;1015;1008:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;1079:11:0;1088:2;1079:11;;:::i;:::-;;;948:154;;31420:110;31496:26;31506:2;31510:7;31496:26;;;;;;;;;;;;:9;:26::i;35778:799::-;35933:4;-1:-1:-1;;;;;35954:13:0;;7287:19;:23;35950:620;;35990:72;;-1:-1:-1;;;35990:72:0;;-1:-1:-1;;;;;35990:36:0;;;;;:72;;2989:10;;36041:4;;36047:7;;36056:5;;35990:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35990:72:0;;;;;;;;-1:-1:-1;;35990:72:0;;;;;;;;;;;;:::i;:::-;;;35986:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36232:6;:13;36249:1;36232:18;36228:272;;36275:60;;-1:-1:-1;;;36275:60:0;;23847:2:1;36275:60:0;;;23829:21:1;23886:2;23866:18;;;23859:30;23925:34;23905:18;;;23898:62;-1:-1:-1;;;23976:18:1;;;23969:48;24034:19;;36275:60:0;23645:414:1;36228:272:0;36450:6;36444:13;36435:6;36431:2;36427:15;36420:38;35986:529;-1:-1:-1;;;;;;36113:51:0;-1:-1:-1;;;36113:51:0;;-1:-1:-1;36106:58:0;;35950:620;-1:-1:-1;36554:4:0;35778:799;;;;;;:::o;31757:321::-;31887:18;31893:2;31897:7;31887:5;:18::i;:::-;31938:54;31969:1;31973:2;31977:7;31986:5;31938:22;:54::i;:::-;31916:154;;;;-1:-1:-1;;;31916:154:0;;23847:2:1;31916:154:0;;;23829:21:1;23886:2;23866:18;;;23859:30;23925:34;23905:18;;;23898:62;-1:-1:-1;;;23976:18:1;;;23969:48;24034:19;;31916:154:0;23645:414:1;32414:439:0;-1:-1:-1;;;;;32494:16:0;;32486:61;;;;-1:-1:-1;;;32486:61:0;;25154:2:1;32486:61:0;;;25136:21:1;;;25173:18;;;25166:30;25232:34;25212:18;;;25205:62;25284:18;;32486:61:0;24952:356:1;32486:61:0;30501:4;30525:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30525:16:0;:30;32558:58;;;;-1:-1:-1;;;32558:58:0;;25515:2:1;32558:58:0;;;25497:21:1;25554:2;25534:18;;;25527:30;25593;25573:18;;;25566:58;25641:18;;32558:58:0;25313:352:1;32558:58:0;-1:-1:-1;;;;;32687:13:0;;;;;;:9;:13;;;;;:18;;32704:1;;32687:13;:18;;32704:1;;32687:18;:::i;:::-;;;;-1:-1:-1;;32716:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;32716:21:0;-1:-1:-1;;;;;32716:21:0;;;;;;;;32755:33;;32716:16;;;32755:33;;32716:16;;32755:33;43608:20:::1;43534:102:::0;:::o;14:177:1:-;-1:-1:-1;;;;;;92:5:1;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;:::-;430:5;196:245;-1:-1:-1;;;196:245:1:o;638:159::-;705:20;;765:6;754:18;;744:29;;734:57;;787:1;784;777:12;802:184;860:6;913:2;901:9;892:7;888:23;884:32;881:52;;;929:1;926;919:12;881:52;952:28;970:9;952:28;:::i;991:258::-;1063:1;1073:113;1087:6;1084:1;1081:13;1073:113;;;1163:11;;;1157:18;1144:11;;;1137:39;1109:2;1102:10;1073:113;;;1204:6;1201:1;1198:13;1195:48;;;-1:-1:-1;;1239:1:1;1221:16;;1214:27;991:258::o;1254:::-;1296:3;1334:5;1328:12;1361:6;1356:3;1349:19;1377:63;1433:6;1426:4;1421:3;1417:14;1410:4;1403:5;1399:16;1377:63;:::i;:::-;1494:2;1473:15;-1:-1:-1;;1469:29:1;1460:39;;;;1501:4;1456:50;;1254:258;-1:-1:-1;;1254:258:1:o;1517:220::-;1666:2;1655:9;1648:21;1629:4;1686:45;1727:2;1716:9;1712:18;1704:6;1686:45;:::i;1742:180::-;1801:6;1854:2;1842:9;1833:7;1829:23;1825:32;1822:52;;;1870:1;1867;1860:12;1822:52;-1:-1:-1;1893:23:1;;1742:180;-1:-1:-1;1742:180:1:o;2158:196::-;2226:20;;-1:-1:-1;;;;;2275:54:1;;2265:65;;2255:93;;2344:1;2341;2334:12;2359:254;2427:6;2435;2488:2;2476:9;2467:7;2463:23;2459:32;2456:52;;;2504:1;2501;2494:12;2456:52;2527:29;2546:9;2527:29;:::i;:::-;2517:39;2603:2;2588:18;;;;2575:32;;-1:-1:-1;;;2359:254:1:o;2800:328::-;2877:6;2885;2893;2946:2;2934:9;2925:7;2921:23;2917:32;2914:52;;;2962:1;2959;2952:12;2914:52;2985:29;3004:9;2985:29;:::i;:::-;2975:39;;3033:38;3067:2;3056:9;3052:18;3033:38;:::i;:::-;3023:48;;3118:2;3107:9;3103:18;3090:32;3080:42;;2800:328;;;;;:::o;3133:248::-;3201:6;3209;3262:2;3250:9;3241:7;3237:23;3233:32;3230:52;;;3278:1;3275;3268:12;3230:52;-1:-1:-1;;3301:23:1;;;3371:2;3356:18;;;3343:32;;-1:-1:-1;3133:248:1:o;3688:186::-;3747:6;3800:2;3788:9;3779:7;3775:23;3771:32;3768:52;;;3816:1;3813;3806:12;3768:52;3839:29;3858:9;3839:29;:::i;4072:184::-;-1:-1:-1;;;4121:1:1;4114:88;4221:4;4218:1;4211:15;4245:4;4242:1;4235:15;4261:275;4332:2;4326:9;4397:2;4378:13;;-1:-1:-1;;4374:27:1;4362:40;;4432:18;4417:34;;4453:22;;;4414:62;4411:88;;;4479:18;;:::i;:::-;4515:2;4508:22;4261:275;;-1:-1:-1;4261:275:1:o;4541:1026::-;4633:6;4641;4694:2;4682:9;4673:7;4669:23;4665:32;4662:52;;;4710:1;4707;4700:12;4662:52;4750:9;4737:23;4779:18;4820:2;4812:6;4809:14;4806:34;;;4836:1;4833;4826:12;4806:34;4874:6;4863:9;4859:22;4849:32;;4919:7;4912:4;4908:2;4904:13;4900:27;4890:55;;4941:1;4938;4931:12;4890:55;4977:2;4964:16;4999:4;5022:2;5018;5015:10;5012:36;;;5028:18;;:::i;:::-;5074:2;5071:1;5067:10;5057:20;;5097:28;5121:2;5117;5113:11;5097:28;:::i;:::-;5159:15;;;5229:11;;;5225:20;;;5190:12;;;;5257:19;;;5254:39;;;5289:1;5286;5279:12;5254:39;5313:11;;;;5333:148;5349:6;5344:3;5341:15;5333:148;;;5415:23;5434:3;5415:23;:::i;:::-;5403:36;;5366:12;;;;5459;;;;5333:148;;;5500:5;-1:-1:-1;5524:37:1;;-1:-1:-1;5542:18:1;;;5524:37;:::i;:::-;5514:47;;;;;;4541:1026;;;;;:::o;5572:632::-;5743:2;5795:21;;;5865:13;;5768:18;;;5887:22;;;5714:4;;5743:2;5966:15;;;;5940:2;5925:18;;;5714:4;6009:169;6023:6;6020:1;6017:13;6009:169;;;6084:13;;6072:26;;6153:15;;;;6118:12;;;;6045:1;6038:9;6009:169;;;-1:-1:-1;6195:3:1;;5572:632;-1:-1:-1;;;;;;5572:632:1:o;6209:407::-;6274:5;6308:18;6300:6;6297:30;6294:56;;;6330:18;;:::i;:::-;6368:57;6413:2;6392:15;;-1:-1:-1;;6388:29:1;6419:4;6384:40;6368:57;:::i;:::-;6359:66;;6448:6;6441:5;6434:21;6488:3;6479:6;6474:3;6470:16;6467:25;6464:45;;;6505:1;6502;6495:12;6464:45;6554:6;6549:3;6542:4;6535:5;6531:16;6518:43;6608:1;6601:4;6592:6;6585:5;6581:18;6577:29;6570:40;6209:407;;;;;:::o;6621:451::-;6690:6;6743:2;6731:9;6722:7;6718:23;6714:32;6711:52;;;6759:1;6756;6749:12;6711:52;6799:9;6786:23;6832:18;6824:6;6821:30;6818:50;;;6864:1;6861;6854:12;6818:50;6887:22;;6940:4;6932:13;;6928:27;-1:-1:-1;6918:55:1;;6969:1;6966;6959:12;6918:55;6992:74;7058:7;7053:2;7040:16;7035:2;7031;7027:11;6992:74;:::i;7077:269::-;7134:6;7187:2;7175:9;7166:7;7162:23;7158:32;7155:52;;;7203:1;7200;7193:12;7155:52;7242:9;7229:23;7292:4;7285:5;7281:16;7274:5;7271:27;7261:55;;7312:1;7309;7302:12;7540:258;7607:6;7615;7668:2;7656:9;7647:7;7643:23;7639:32;7636:52;;;7684:1;7681;7674:12;7636:52;7707:29;7726:9;7707:29;:::i;:::-;7697:39;;7755:37;7788:2;7777:9;7773:18;7755:37;:::i;:::-;7745:47;;7540:258;;;;;:::o;7803:347::-;7868:6;7876;7929:2;7917:9;7908:7;7904:23;7900:32;7897:52;;;7945:1;7942;7935:12;7897:52;7968:29;7987:9;7968:29;:::i;:::-;7958:39;;8047:2;8036:9;8032:18;8019:32;8094:5;8087:13;8080:21;8073:5;8070:32;8060:60;;8116:1;8113;8106:12;8060:60;8139:5;8129:15;;;7803:347;;;;;:::o;8155:667::-;8250:6;8258;8266;8274;8327:3;8315:9;8306:7;8302:23;8298:33;8295:53;;;8344:1;8341;8334:12;8295:53;8367:29;8386:9;8367:29;:::i;:::-;8357:39;;8415:38;8449:2;8438:9;8434:18;8415:38;:::i;:::-;8405:48;;8500:2;8489:9;8485:18;8472:32;8462:42;;8555:2;8544:9;8540:18;8527:32;8582:18;8574:6;8571:30;8568:50;;;8614:1;8611;8604:12;8568:50;8637:22;;8690:4;8682:13;;8678:27;-1:-1:-1;8668:55:1;;8719:1;8716;8709:12;8668:55;8742:74;8808:7;8803:2;8790:16;8785:2;8781;8777:11;8742:74;:::i;:::-;8732:84;;;8155:667;;;;;;;:::o;8827:366::-;8894:6;8902;8955:2;8943:9;8934:7;8930:23;8926:32;8923:52;;;8971:1;8968;8961:12;8923:52;8994:29;9013:9;8994:29;:::i;:::-;8984:39;;9073:2;9062:9;9058:18;9045:32;9117:26;9110:5;9106:38;9099:5;9096:49;9086:77;;9159:1;9156;9149:12;9198:260;9266:6;9274;9327:2;9315:9;9306:7;9302:23;9298:32;9295:52;;;9343:1;9340;9333:12;9295:52;9366:29;9385:9;9366:29;:::i;:::-;9356:39;;9414:38;9448:2;9437:9;9433:18;9414:38;:::i;9824:437::-;9903:1;9899:12;;;;9946;;;9967:61;;10021:4;10013:6;10009:17;9999:27;;9967:61;10074:2;10066:6;10063:14;10043:18;10040:38;10037:218;;-1:-1:-1;;;10108:1:1;10101:88;10212:4;10209:1;10202:15;10240:4;10237:1;10230:15;10037:218;;9824:437;;;:::o;12214:184::-;-1:-1:-1;;;12263:1:1;12256:88;12363:4;12360:1;12353:15;12387:4;12384:1;12377:15;12403:125;12443:4;12471:1;12468;12465:8;12462:34;;;12476:18;;:::i;:::-;-1:-1:-1;12513:9:1;;12403:125::o;13803:168::-;13843:7;13909:1;13905;13901:6;13897:14;13894:1;13891:21;13886:1;13879:9;13872:17;13868:45;13865:71;;;13916:18;;:::i;:::-;-1:-1:-1;13956:9:1;;13803:168::o;13976:184::-;-1:-1:-1;;;14025:1:1;14018:88;14125:4;14122:1;14115:15;14149:4;14146:1;14139:15;14165:120;14205:1;14231;14221:35;;14236:18;;:::i;:::-;-1:-1:-1;14270:9:1;;14165:120::o;14500:184::-;-1:-1:-1;;;14549:1:1;14542:88;14649:4;14646:1;14639:15;14673:4;14670:1;14663:15;14689:135;14728:3;14749:17;;;14746:43;;14769:18;;:::i;:::-;-1:-1:-1;14816:1:1;14805:13;;14689:135::o;14955:545::-;15057:2;15052:3;15049:11;15046:448;;;15093:1;15118:5;15114:2;15107:17;15163:4;15159:2;15149:19;15233:2;15221:10;15217:19;15214:1;15210:27;15204:4;15200:38;15269:4;15257:10;15254:20;15251:47;;;-1:-1:-1;15292:4:1;15251:47;15347:2;15342:3;15338:12;15335:1;15331:20;15325:4;15321:31;15311:41;;15402:82;15420:2;15413:5;15410:13;15402:82;;;15465:17;;;15446:1;15435:13;15402:82;;;15406:3;;;14955:545;;;:::o;15676:1352::-;15802:3;15796:10;15829:18;15821:6;15818:30;15815:56;;;15851:18;;:::i;:::-;15880:97;15970:6;15930:38;15962:4;15956:11;15930:38;:::i;:::-;15924:4;15880:97;:::i;:::-;16032:4;;16096:2;16085:14;;16113:1;16108:663;;;;16815:1;16832:6;16829:89;;;-1:-1:-1;16884:19:1;;;16878:26;16829:89;-1:-1:-1;;15633:1:1;15629:11;;;15625:24;15621:29;15611:40;15657:1;15653:11;;;15608:57;16931:81;;16078:944;;16108:663;14902:1;14895:14;;;14939:4;14926:18;;-1:-1:-1;;16144:20:1;;;16262:236;16276:7;16273:1;16270:14;16262:236;;;16365:19;;;16359:26;16344:42;;16457:27;;;;16425:1;16413:14;;;;16292:19;;16262:236;;;16266:3;16526:6;16517:7;16514:19;16511:201;;;16587:19;;;16581:26;-1:-1:-1;;16670:1:1;16666:14;;;16682:3;16662:24;16658:37;16654:42;16639:58;16624:74;;16511:201;-1:-1:-1;;;;;16758:1:1;16742:14;;;16738:22;16725:36;;-1:-1:-1;15676:1352:1:o;17854:217::-;17893:4;17922:6;17978:10;;;;17948;;18000:12;;;17997:38;;;18015:18;;:::i;:::-;18052:13;;17854:217;-1:-1:-1;;;17854:217:1:o;18913:1230::-;19137:3;19175:6;19169:13;19201:4;19214:51;19258:6;19253:3;19248:2;19240:6;19236:15;19214:51;:::i;:::-;19328:13;;19287:16;;;;19350:55;19328:13;19287:16;19372:15;;;19350:55;:::i;:::-;19494:13;;19427:20;;;19467:1;;19532:36;19494:13;19532:36;:::i;:::-;19587:1;19604:18;;;19631:141;;;;19786:1;19781:337;;;;19597:521;;19631:141;-1:-1:-1;;19666:24:1;;19652:39;;19743:16;;19736:24;19722:39;;19711:51;;;-1:-1:-1;19631:141:1;;19781:337;19812:6;19809:1;19802:17;19860:2;19857:1;19847:16;19885:1;19899:169;19913:8;19910:1;19907:15;19899:169;;;19995:14;;19980:13;;;19973:37;20038:16;;;;19930:10;;19899:169;;;19903:3;;20099:8;20092:5;20088:20;20081:27;;19597:521;-1:-1:-1;20134:3:1;;18913:1230;-1:-1:-1;;;;;;;;;;18913:1230:1:o;21779:128::-;21819:3;21850:1;21846:6;21843:1;21840:13;21837:39;;;21856:18;;:::i;:::-;-1:-1:-1;21892:9:1;;21779:128::o;22674:181::-;22712:3;22756:6;22749:5;22745:18;22782:7;22772:41;;22793:18;;:::i;:::-;-1:-1:-1;;22829:20:1;;22674:181;-1:-1:-1;;22674:181:1:o;22860:224::-;22899:3;22927:6;22960:2;22957:1;22953:10;22990:2;22987:1;22983:10;23021:3;23017:2;23013:12;23008:3;23005:21;23002:47;;;23029:18;;:::i;:::-;23065:13;;22860:224;-1:-1:-1;;;;22860:224:1:o;23089:197::-;23127:3;23155:6;23196:2;23189:5;23185:14;23223:2;23214:7;23211:15;23208:41;;23229:18;;:::i;:::-;23278:1;23265:15;;23089:197;-1:-1:-1;;;23089:197:1:o;24064:112::-;24096:1;24122;24112:35;;24127:18;;:::i;:::-;-1:-1:-1;24161:9:1;;24064:112::o;24181:512::-;24375:4;-1:-1:-1;;;;;24485:2:1;24477:6;24473:15;24462:9;24455:34;24537:2;24529:6;24525:15;24520:2;24509:9;24505:18;24498:43;;24577:6;24572:2;24561:9;24557:18;24550:34;24620:3;24615:2;24604:9;24600:18;24593:31;24641:46;24682:3;24671:9;24667:19;24659:6;24641:46;:::i;:::-;24633:54;24181:512;-1:-1:-1;;;;;;24181:512:1:o;24698:249::-;24767:6;24820:2;24808:9;24799:7;24795:23;24791:32;24788:52;;;24836:1;24833;24826:12;24788:52;24868:9;24862:16;24887:30;24911:5;24887:30;:::i

Swarm Source

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