ETH Price: $3,339.94 (+2.46%)
Gas: 1 Gwei

Token

BrainBuddies (BB)
 

Overview

Max Total Supply

878 BB

Holders

154

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
donjovani.eth
Balance
1 BB
0x494a7a4c5710f620b816110adb23a9fafbfd7478
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:
Brainbuddy

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-27
*/

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

/*
.______   .______          ___       __  .__   __.    .______    __    __   _______   _______  ____    ____ 
|   _  \  |   _  \        /   \     |  | |  \ |  |    |   _  \  |  |  |  | |       \ |       \ \   \  /   / 
|  |_)  | |  |_)  |      /  ^  \    |  | |   \|  |    |  |_)  | |  |  |  | |  .--.  ||  .--.  | \   \/   /  
|   _  <  |      /      /  /_\  \   |  | |  . `  |    |   _  <  |  |  |  | |  |  |  ||  |  |  |  \_    _/   
|  |_)  | |  |\  \----./  _____  \  |  | |  |\   |    |  |_)  | |  `--'  | |  '--'  ||  '--'  |    |  |     
|______/  | _| `._____/__/     \__\ |__| |__| \__|    |______/   \______/  |_______/ |_______/     |__|     
                                                                                                            

// File @openzeppelin/contracts/utils/introspection/[email protected]

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


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

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


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

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/utils/[email protected]


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

pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]


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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


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

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


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

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


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

pragma solidity ^0.8.0;


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

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

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}


// File @openzeppelin/contracts/utils/math/[email protected]


// OpenZeppelin Contracts v4.4.0 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


// File @openzeppelin/contracts/access/[email protected]


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/security/[email protected]


// OpenZeppelin Contracts v4.4.0 (security/Pausable.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}


// File @openzeppelin/contracts/security/[email protected]


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

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


interface ILOBE {
    function burn(address from, uint256 amount) external;
    function mint(address to, uint256 amount) external;
}

interface IStakingToken {
    function update(address from, address to) external;
}

// File contracts/Brainbuddy.sol

pragma solidity ^0.8.4;






contract Brainbuddy is ERC721Enumerable, ReentrancyGuard, Ownable, Pausable {
    using SafeMath for uint256;
    using Strings for uint256;

    struct BrainBuddyInfo {
        string name;
        string description;
    }

    mapping(uint256 => BrainBuddyInfo) public buddyInfo;

    uint256 public RESERVE_NFT = 100;     // Expected to use last 100 tokenIDs.
    uint256 public LOBE_Mint_NFT = 2310;
    uint256 public ETH_Mint_NFT = 7590;
    uint256 public constant MAX_NFT = 10000;

    uint256 public LOBE_PRICE = 3000 ether;
    uint256 public ETH_PRICE = 0.02 ether;
    uint256 public VIP_ETH_PRICE = 0.01 ether;
    uint256 public UPDATE_NAME_PRICE = 2000 ether;
    uint256 public UPDATE_DESCRIPTION_PRICE = 2000 ether;

    uint256 public PURCHASE_LIMIT = 50;

    uint256 public totalLOBEMinted;
    uint256 public totalETHMinted;
    uint256 public totalReserveClaimed;
    uint256 public publicMintPosition;

    string public baseURI;
    string public blindURI;

    bool public isPublicSaleActive;
    bool public isReveal;

    ILOBE public LOBEContract;
    IStakingToken public stakingTokenContract;

    mapping(address => uint256) public publicSaleClaimed;

    mapping(address => uint256[]) public giveaway;

    mapping(address => bool) public isVIP;

    address public communityTreasuryWallet;
    address public LOBELiquidityWallet;

    event UpdateName(uint256 indexed tokenId, string name);
    event UpdateDescription(uint256 indexed tokenId, string description);

    constructor(address _community, address _liquidity, address _LOBE) ERC721("BrainBuddies", "BB") {
        communityTreasuryWallet = _community;
        LOBELiquidityWallet = _liquidity;
        LOBEContract = ILOBE(_LOBE);
    }    

    // Function to start main sale
    function changePublicSaleStatus(bool _status) external onlyOwner {
        isPublicSaleActive = _status;
    }    

    // Function to reveal all NFTs
    function changeRevealStatus(bool _status) external onlyOwner {
        isReveal = _status;
    }  

    // Function to change LOBE mint price
    function changeLOBEPrice(uint256 amount) external onlyOwner {
        LOBE_PRICE = amount;
    }   

    // Function to change ETH mint price
    function changeETHPrice(uint256 amount) external onlyOwner {
        ETH_PRICE = amount;
    }    

    // Function to change VIP ETH mint price
    function changeVIPETHPrice(uint256 amount) external onlyOwner {
        VIP_ETH_PRICE = amount;
    } 

    // Function to change UPDATE name and description price
    function changeUpdateNameAndDescriptionPrice(uint256 _name, uint256 _description) external onlyOwner {
        UPDATE_NAME_PRICE = _name;
        UPDATE_DESCRIPTION_PRICE = _description;
    } 

    // Function to change max mint per wallet
    function changePurchaseLimit(uint256 amount) external onlyOwner {
        PURCHASE_LIMIT = amount;
    }   

    // Function to change LOBE mint to giveway
    function changeLOBEToGiveway(uint256 amount) external onlyOwner {
        require(totalLOBEMinted.add(amount) <= LOBE_Mint_NFT, "Amount exceed available.");
        LOBE_Mint_NFT = LOBE_Mint_NFT.sub(amount);
        RESERVE_NFT = RESERVE_NFT.add(amount);
    } 

    // Function to change ETH mint to giveway
    function changeETHToGiveway(uint256 amount) external onlyOwner {
        require(totalETHMinted.add(amount) <= ETH_Mint_NFT, "Amount exceed available.");
        ETH_Mint_NFT = ETH_Mint_NFT.sub(amount);
        RESERVE_NFT = RESERVE_NFT.add(amount);
    } 
    
    // Function VIP access to to addresses
    function giveVIPAccess(address[] memory _addresses) external onlyOwner {
        for (uint256 i = 0; i < _addresses.length; i++) {
            isVIP[_addresses[i]] = true;
        }
    }

    // Function to set giveaway users
    function setGiveawayUsers(address[] memory _to, uint256[] memory _tokenIds) external onlyOwner {
        require(_to.length == _tokenIds.length, "array size mismatch");
        for(uint256 i = 0; i < _to.length; i++) {
            require(_tokenIds[i] >= MAX_NFT - RESERVE_NFT, "Giveaway tokenID must be set from Reserved IDs which are lastest");            
            giveaway[_to[i]].push(_tokenIds[i]);
        }
    }

    // Function to set $LOBE and future staking token address
    function setContractAddresses(address _lobe, address _stakingToken) external onlyOwner {
        LOBEContract = ILOBE(_lobe);
        stakingTokenContract = IStakingToken(_stakingToken);
    }
    
    // Function to set Base and Blind URI
    function setURIs(string memory _blindURI, string memory _URI) external onlyOwner {
        blindURI = _blindURI;
        baseURI = _URI;        
    }

    // Function to update name
    function updateName(uint256 tokenId, string calldata name) external  {
        require(ownerOf(tokenId) == msg.sender, "Caller must be token owner");
        require(address(LOBEContract) != address(0), "No token contract set");

        bytes memory n = bytes(name);
        require(n.length > 0 && n.length < 25, "Invalid name length");
        require(
        sha256(n) != sha256(bytes(buddyInfo[tokenId].name)),
        "New name is same as current name"
        );

        LOBEContract.burn(msg.sender, UPDATE_NAME_PRICE);
        LOBEContract.mint(LOBELiquidityWallet, UPDATE_NAME_PRICE.div(100).mul(30));
        buddyInfo[tokenId].name = name;
        emit UpdateName(tokenId, name);
    }

    // Function to update description
    function updateDescription(uint256 tokenId, string calldata description) external  {
        require(ownerOf(tokenId) == msg.sender, "Caller must be token owner");
        require(address(LOBEContract) != address(0), "No token contract set");

        bytes memory d = bytes(description);
        require(d.length > 0 && d.length < 280, "Invalid description length");
        require(
            sha256(bytes(d)) != sha256(bytes(buddyInfo[tokenId].description)),
            "New description is same as current description"
        );

        LOBEContract.burn(msg.sender, UPDATE_DESCRIPTION_PRICE);
        LOBEContract.mint(LOBELiquidityWallet, UPDATE_DESCRIPTION_PRICE.div(100).mul(30));
        buddyInfo[tokenId].description = description;
        emit UpdateDescription(tokenId, description);
    }

    //Function to withdraw collected amount during minting by the owner
    function withdraw(address _to, uint256 _amount) external onlyOwner {
        uint256 balance = address(this).balance;
        require(balance >= _amount, "Balance should atleast equal to amount");
        payable(_to).transfer(_amount);
    }    

    // Function to mint using LOBE
    function mintWithLOBE(uint256 _numOfTokens) public whenNotPaused nonReentrant {
        require(address(LOBEContract) != address(0), "No token contract set");
        require(isPublicSaleActive==true, "Sale Not Active");        
        require(totalLOBEMinted.add(_numOfTokens) <= LOBE_Mint_NFT, "Purchase would exceed max LOBE mint NFTs");
        LOBEContract.burn(msg.sender, _numOfTokens.mul(LOBE_PRICE));
        LOBEContract.mint(LOBELiquidityWallet, _numOfTokens.mul(LOBE_PRICE).div(100).mul(30));
        for(uint256 i = 0; i < _numOfTokens; i++) {
            _mint(msg.sender, publicMintPosition);
            publicMintPosition = publicMintPosition.add(1);
        }
        totalLOBEMinted = totalLOBEMinted.add(_numOfTokens);        
    }

    // Function to adjust public mint position
    function updatePublicMintPosition (uint256 pos) external onlyOwner {
        publicMintPosition = pos;
    }

    // Function to mint using ETH
    function mintWithETH(uint256 _numOfTokens) public payable whenNotPaused nonReentrant {
        require(isPublicSaleActive==true, "Sale Not Active");
        require(publicSaleClaimed[msg.sender].add(_numOfTokens) <= PURCHASE_LIMIT, 
            "Above Sale Purchase Limit");
        require(totalETHMinted.add(_numOfTokens) <= ETH_Mint_NFT, "Purchase would exceed max ETH mint NFTs");
        if (isVIP[msg.sender]){
            require(VIP_ETH_PRICE.mul(_numOfTokens) == msg.value, "Invalid Amount");
        } else {
            require(ETH_PRICE.mul(_numOfTokens) == msg.value, "Invalid Amount");
        }
        for(uint256 i = 0; i < _numOfTokens; i++) {
            _mint(msg.sender, publicMintPosition);
            publicMintPosition = publicMintPosition.add(1);
        }
        totalETHMinted = totalETHMinted.add(_numOfTokens);
        publicSaleClaimed[msg.sender] = publicSaleClaimed[msg.sender].add(_numOfTokens);
    }

    // Function to claim giveaway
    function claimGiveaway() external whenNotPaused nonReentrant {
        for(uint256 i=0; i < giveaway[msg.sender].length; i++) {            
            _safeMint(msg.sender, giveaway[msg.sender][i]);
            totalReserveClaimed = totalReserveClaimed.add(1);
        }
    }

    // Function to airdrop unclaimed
    function airdropNFT(address _to, uint256[] memory _tokenIds) external onlyOwner {
        for(uint256 i=0; i < _tokenIds.length; i++) {            
            require(_tokenIds[i] >= MAX_NFT - RESERVE_NFT, "Airdrop tokenID must be set from Reserved IDs which are lastest");
            _safeMint(_to, _tokenIds[i]);
            totalReserveClaimed = totalReserveClaimed.add(1);
        }
    }

    // Function to migrate from past contract
    function mirrorDropNFT(address[] memory _to, uint256[] memory _tokenIds) external onlyOwner {
        uint256 holderIndex = 0;
        for(uint256 i = 0; i < _tokenIds.length; i++) {      
            if (_tokenIds[i] == 11111111){
                holderIndex ++;
            } else {                
                _safeMint(_to[holderIndex], _tokenIds[i]);
            }            
        }
    }
    
    // Function to get token URI of given token ID
    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
        if (!isReveal) {
            return string(abi.encodePacked(blindURI, _tokenId.toString()));
        } else {
            return string(abi.encodePacked(baseURI, _tokenId.toString()));
        }
    }    

    // Function to list own NFTs 
    function listMyNFTs(address _owner) public view returns(uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);

        if (tokenCount == 0) {
            return new uint256[](0);
    	}
    	else {
    		uint256[] memory tokensId = new uint256[](tokenCount);
            for(uint256 i = 0; i < tokenCount; i++){
                tokensId[i] = tokenOfOwnerByIndex(_owner, i);
            }
            return tokensId;
    	}        
    }

    // Function to get ETH mint price
    function getETHmintPrice() public view returns(uint256) {
        return isVIP[msg.sender] ? VIP_ETH_PRICE : ETH_PRICE;
    }

    // Function to pause 
    function pause() external onlyOwner {
        _pause();
    }

    // Function to unpause 
    function unpause() external onlyOwner {
        _unpause();
    }

    function transferFrom(address from, address to, uint256 tokenId)
        public        
        override(ERC721)
        nonReentrant
    {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        if (address(stakingTokenContract) != address(0)) {
            stakingTokenContract.update(from, to);
        }

        ERC721.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override(ERC721)
        nonReentrant
    {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        if (address(stakingTokenContract) != address(0)) {
            stakingTokenContract.update(from, to);
        }

        ERC721.safeTransferFrom(from, to, tokenId, data);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_community","type":"address"},{"internalType":"address","name":"_liquidity","type":"address"},{"internalType":"address","name":"_LOBE","type":"address"}],"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"description","type":"string"}],"name":"UpdateDescription","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"UpdateName","type":"event"},{"inputs":[],"name":"ETH_Mint_NFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ETH_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOBEContract","outputs":[{"internalType":"contract ILOBE","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOBELiquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOBE_Mint_NFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOBE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PURCHASE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVE_NFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPDATE_DESCRIPTION_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPDATE_NAME_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VIP_ETH_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"airdropNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blindURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"buddyInfo","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"changeETHPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"changeETHToGiveway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"changeLOBEPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"changeLOBEToGiveway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"changePublicSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"changePurchaseLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"changeRevealStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_name","type":"uint256"},{"internalType":"uint256","name":"_description","type":"uint256"}],"name":"changeUpdateNameAndDescriptionPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"changeVIPETHPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimGiveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"communityTreasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getETHmintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"giveVIPAccess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"giveaway","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isReveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isVIP","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"listMyNFTs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numOfTokens","type":"uint256"}],"name":"mintWithETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numOfTokens","type":"uint256"}],"name":"mintWithLOBE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"mirrorDropNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintPosition","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicSaleClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lobe","type":"address"},{"internalType":"address","name":"_stakingToken","type":"address"}],"name":"setContractAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"setGiveawayUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_blindURI","type":"string"},{"internalType":"string","name":"_URI","type":"string"}],"name":"setURIs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingTokenContract","outputs":[{"internalType":"contract IStakingToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalETHMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLOBEMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReserveClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"description","type":"string"}],"name":"updateDescription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"name","type":"string"}],"name":"updateName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pos","type":"uint256"}],"name":"updatePublicMintPosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526064600d55610906600e55611da6600f5568a2a15d09519be0000060105566470de4df820000601155662386f26fc10000601255686c6b935b8bbd400000601355686c6b935b8bbd40000060145560326015553480156200006457600080fd5b50604051620048b2380380620048b2833981016040819052620000879162000275565b604080518082018252600c81526b427261696e4275646469657360a01b602080830191825283518085019094526002845261212160f11b908401528151919291620000d591600091620001b2565b508051620000eb906001906020840190620001b2565b50506001600a5550620000fe3362000160565b600b805460ff60a01b19169055602180546001600160a01b039485166001600160a01b031991821617909155602280549385169390911692909217909155601c805491909216620100000262010000600160b01b0319909116179055620002fc565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001c090620002bf565b90600052602060002090601f016020900481019282620001e457600085556200022f565b82601f10620001ff57805160ff19168380011785556200022f565b828001600101855582156200022f579182015b828111156200022f57825182559160200191906001019062000212565b506200023d92915062000241565b5090565b5b808211156200023d576000815560010162000242565b80516001600160a01b03811681146200027057600080fd5b919050565b6000806000606084860312156200028b57600080fd5b620002968462000258565b9250620002a66020850162000258565b9150620002b66040850162000258565b90509250925092565b600181811c90821680620002d457607f821691505b60208210811415620002f657634e487b7160e01b600052602260045260246000fd5b50919050565b6145a6806200030c6000396000f3fe60806040526004361061041b5760003560e01c8063715018a61161021e578063c87b56dd11610123578063e985e9c5116100ab578063f3fef3a31161007a578063f3fef3a314610c11578063f4201c3c14610c31578063f72e2d0d14610c60578063f76fccca14610c80578063fae4c7f914610ca057600080fd5b8063e985e9c514610b7d578063eff9553714610bc6578063f14cdf6e14610bdb578063f2fde38b14610bf157600080fd5b8063d3c553ad116100f2578063d3c553ad14610ada578063d42e591b14610b07578063d75e611014610b27578063e365eca614610b3d578063e825417414610b5d57600080fd5b8063c87b56dd14610a57578063cd931e4014610a77578063d28a1f1d14610a97578063d3bfe07714610aad57600080fd5b806398e90184116101a6578063b19ec5e211610175578063b19ec5e2146109cb578063b88d4fde146109eb578063bf5f559714610a0b578063bfecf89514610a2b578063c14e851314610a4157600080fd5b806398e9018414610947578063a22cb4651461095d578063a29fb1fd1461097d578063ac32be601461099d57600080fd5b80638832bc29116101ed5780638832bc29146108c85780638d007f69146108de5780638da5cb5b146108f4578063949028a71461091257806395d89b411461093257600080fd5b8063715018a61461085857806373da60ad1461086d5780638456cb5914610893578063881b884a146108a857600080fd5b806342842e0e116103245780635c7b9f89116102ac5780636352211e1161027b5780636352211e146107d75780636aa605f6146107f75780636c0360eb1461080d5780636fdaddf11461082257806370a082311461083857600080fd5b80635c7b9f89146107775780635c975abb1461078d5780635db62358146107ac5780635f36fa26146107c157600080fd5b8063530e3b52116102f3578063530e3b52146106e157806353e76f2c14610701578063560c155f1461072157806358689219146107375780635ad710021461075757600080fd5b806342842e0e1461066c5780634af9bc101461068c5780634d78a0f7146106a15780634f6ccce7146106c157600080fd5b80631ae56350116103a75780632ee75a40116103765780632ee75a40146105e15780632f745c59146105f7578063376ea8e3146106175780633f4ba83a14610637578063401463531461064c57600080fd5b80631ae56350146105745780631e84c4131461059457806323b872dd146105ae5780632c3b372e146105ce57600080fd5b8063095ea7b3116103ee578063095ea7b3146104dd57806314dee4b3146104ff578063173ac3df1461051f57806318160ddd1461053f578063185c6a6e1461055457600080fd5b806301ffc9a714610420578063050225ea1461045557806306fdde0314610483578063081812fc146104a5575b600080fd5b34801561042c57600080fd5b5061044061043b366004613eef565b610cbf565b60405190151581526020015b60405180910390f35b34801561046157600080fd5b50610475610470366004613e02565b610cea565b60405190815260200161044c565b34801561048f57600080fd5b50610498610d1b565b60405161044c91906141fc565b3480156104b157600080fd5b506104c56104c0366004613f83565b610dad565b6040516001600160a01b03909116815260200161044c565b3480156104e957600080fd5b506104fd6104f8366004613e02565b610e47565b005b34801561050b57600080fd5b506104fd61051a366004613f9c565b610f5d565b34801561052b57600080fd5b50601d546104c5906001600160a01b031681565b34801561054b57600080fd5b50600854610475565b34801561056057600080fd5b506021546104c5906001600160a01b031681565b34801561058057600080fd5b506104fd61058f366004613d8a565b611302565b3480156105a057600080fd5b50601c546104409060ff1681565b3480156105ba57600080fd5b506104fd6105c9366004613cd2565b61141b565b6104fd6105dc366004613f83565b6114f8565b3480156105ed57600080fd5b5061047560135481565b34801561060357600080fd5b50610475610612366004613e02565b61179f565b34801561062357600080fd5b506104fd610632366004613e2c565b611835565b34801561064357600080fd5b506104fd6118cb565b34801561065857600080fd5b506104fd610667366004613f83565b6118ff565b34801561067857600080fd5b506104fd610687366004613cd2565b61192e565b34801561069857600080fd5b506104fd611949565b3480156106ad57600080fd5b506104fd6106bc366004614018565b611a17565b3480156106cd57600080fd5b506104756106dc366004613f83565b611a4c565b3480156106ed57600080fd5b506104fd6106fc366004613f83565b611adf565b34801561070d57600080fd5b506104fd61071c366004613f9c565b611b0e565b34801561072d57600080fd5b50610475600e5481565b34801561074357600080fd5b506104fd610752366004613ebb565b611e73565b34801561076357600080fd5b506104fd610772366004613f83565b611eb0565b34801561078357600080fd5b5061047560125481565b34801561079957600080fd5b50600b54600160a01b900460ff16610440565b3480156107b857600080fd5b50610475611f56565b3480156107cd57600080fd5b5061047560185481565b3480156107e357600080fd5b506104c56107f2366004613f83565b611f7a565b34801561080357600080fd5b5061047560165481565b34801561081957600080fd5b50610498611ff1565b34801561082e57600080fd5b5061047561271081565b34801561084457600080fd5b50610475610853366004613c84565b61207f565b34801561086457600080fd5b506104fd612106565b34801561087957600080fd5b50601c546104c5906201000090046001600160a01b031681565b34801561089f57600080fd5b506104fd61213a565b3480156108b457600080fd5b506104fd6108c3366004613e61565b61216c565b3480156108d457600080fd5b5061047560115481565b3480156108ea57600080fd5b50610475600d5481565b34801561090057600080fd5b50600b546001600160a01b03166104c5565b34801561091e57600080fd5b506104fd61092d366004613ebb565b612309565b34801561093e57600080fd5b5061049861234d565b34801561095357600080fd5b5061047560145481565b34801561096957600080fd5b506104fd610978366004613dd8565b61235c565b34801561098957600080fd5b506104fd610998366004613f83565b612367565b3480156109a957600080fd5b506109bd6109b8366004613f83565b612396565b60405161044c92919061420f565b3480156109d757600080fd5b506104fd6109e6366004613f83565b6124c2565b3480156109f757600080fd5b506104fd610a06366004613d0e565b6124f1565b348015610a1757600080fd5b506104fd610a26366004613f83565b6125d0565b348015610a3757600080fd5b50610475600f5481565b348015610a4d57600080fd5b5061047560195481565b348015610a6357600080fd5b50610498610a72366004613f83565b612894565b348015610a8357600080fd5b506104fd610a92366004613c9f565b612964565b348015610aa357600080fd5b5061047560175481565b348015610ab957600080fd5b50610acd610ac8366004613c84565b6129c8565b60405161044c9190614189565b348015610ae657600080fd5b50610475610af5366004613c84565b601e6020526000908152604090205481565b348015610b1357600080fd5b506104fd610b22366004613e61565b612a87565b348015610b3357600080fd5b5061047560155481565b348015610b4957600080fd5b506104fd610b58366004613f83565b612b3b565b348015610b6957600080fd5b506104fd610b78366004613f29565b612bdb565b348015610b8957600080fd5b50610440610b98366004613c9f565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610bd257600080fd5b50610498612c2c565b348015610be757600080fd5b5061047560105481565b348015610bfd57600080fd5b506104fd610c0c366004613c84565b612c39565b348015610c1d57600080fd5b506104fd610c2c366004613e02565b612cd4565b348015610c3d57600080fd5b50610440610c4c366004613c84565b602080526000908152604090205460ff1681565b348015610c6c57600080fd5b506022546104c5906001600160a01b031681565b348015610c8c57600080fd5b506104fd610c9b366004613f83565b612d94565b348015610cac57600080fd5b50601c5461044090610100900460ff1681565b60006001600160e01b0319821663780e9d6360e01b1480610ce45750610ce482612dc3565b92915050565b601f6020528160005260406000208181548110610d0657600080fd5b90600052602060002001600091509150505481565b606060008054610d2a90614488565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5690614488565b8015610da35780601f10610d7857610100808354040283529160200191610da3565b820191906000526020600020905b815481529060010190602001808311610d8657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610e2b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610e5282611f7a565b9050806001600160a01b0316836001600160a01b03161415610ec05760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610e22565b336001600160a01b0382161480610edc5750610edc8133610b98565b610f4e5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610e22565b610f588383612e13565b505050565b33610f6784611f7a565b6001600160a01b031614610fbd5760405162461bcd60e51b815260206004820152601a60248201527f43616c6c6572206d75737420626520746f6b656e206f776e65720000000000006044820152606401610e22565b601c546201000090046001600160a01b0316610feb5760405162461bcd60e51b8152600401610e22906142b9565b600082828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050825192935050501580159061103857506101188151105b6110845760405162461bcd60e51b815260206004820152601a60248201527f496e76616c6964206465736372697074696f6e206c656e6774680000000000006044820152606401610e22565b6002600c60008681526020019081526020016000206001016040516110a9919061411b565b602060405180830381855afa1580156110c6573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906110e99190613ed6565b6002826040516110f991906140ff565b602060405180830381855afa158015611116573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906111399190613ed6565b141561119e5760405162461bcd60e51b815260206004820152602e60248201527f4e6577206465736372697074696f6e2069732073616d6520617320637572726560448201526d373a103232b9b1b934b83a34b7b760911b6064820152608401610e22565b601c54601454604051632770a7eb60e21b81523360048201526024810191909152620100009091046001600160a01b031690639dc29fac90604401600060405180830381600087803b1580156111f357600080fd5b505af1158015611207573d6000803e3d6000fd5b5050601c546022546014546001600160a01b0362010000909304831694506340c10f19935091169061124790601e90611241906064612e81565b90612e94565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561128d57600080fd5b505af11580156112a1573d6000803e3d6000fd5b5050506000858152600c602052604090206112c1915060010184846139ff565b50837fa5eb4fe2f21ddb28c752c9927387264d67ce06b0ce619ad8b4b06d8dfe94834784846040516112f49291906141cd565b60405180910390a250505050565b600b546001600160a01b0316331461132c5760405162461bcd60e51b8152600401610e22906142e8565b60005b8151811015610f5857600d5461134790612710614445565b8282815181106113595761135961452e565b602002602001015110156113d55760405162461bcd60e51b815260206004820152603f60248201527f41697264726f7020746f6b656e4944206d757374206265207365742066726f6d60448201527f2052657365727665642049447320776869636820617265206c617374657374006064820152608401610e22565b6113f8838383815181106113eb576113eb61452e565b6020026020010151612ea0565b601854611406906001612eba565b60185580611413816144bd565b91505061132f565b6002600a54141561143e5760405162461bcd60e51b8152600401610e229061436e565b6002600a5561144e335b82612ec6565b61146a5760405162461bcd60e51b8152600401610e229061431d565b601d546001600160a01b0316156114e357601d5460405163c640752d60e01b81526001600160a01b03858116600483015284811660248301529091169063c640752d90604401600060405180830381600087803b1580156114ca57600080fd5b505af11580156114de573d6000803e3d6000fd5b505050505b6114ee838383612fbd565b50506001600a5550565b600b54600160a01b900460ff16156115225760405162461bcd60e51b8152600401610e229061428f565b6002600a5414156115455760405162461bcd60e51b8152600401610e229061436e565b6002600a55601c5460ff1615156001146115935760405162461bcd60e51b815260206004820152600f60248201526e53616c65204e6f742041637469766560881b6044820152606401610e22565b601554336000908152601e60205260409020546115b09083612eba565b11156115fe5760405162461bcd60e51b815260206004820152601960248201527f41626f76652053616c65205075726368617365204c696d6974000000000000006044820152606401610e22565b600f5460175461160e9083612eba565b111561166c5760405162461bcd60e51b815260206004820152602760248201527f507572636861736520776f756c6420657863656564206d617820455448206d696044820152666e74204e46547360c81b6064820152608401610e22565b33600090815260208052604090205460ff16156116d55760125434906116929083612e94565b146116d05760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908105b5bdd5b9d60921b6044820152606401610e22565b611722565b60115434906116e49083612e94565b146117225760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908105b5bdd5b9d60921b6044820152606401610e22565b60005b8181101561175c5761173933601954612fed565b601954611747906001612eba565b60195580611754816144bd565b915050611725565b5060175461176a9082612eba565b601755336000908152601e60205260409020546117879082612eba565b336000908152601e6020526040902055506001600a55565b60006117aa8361207f565b821061180c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610e22565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600b546001600160a01b0316331461185f5760405162461bcd60e51b8152600401610e22906142e8565b60005b81518110156118c7576001602060008484815181106118835761188361452e565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806118bf816144bd565b915050611862565b5050565b600b546001600160a01b031633146118f55760405162461bcd60e51b8152600401610e22906142e8565b6118fd61313b565b565b600b546001600160a01b031633146119295760405162461bcd60e51b8152600401610e22906142e8565b601555565b610f58838383604051806020016040528060008152506124f1565b600b54600160a01b900460ff16156119735760405162461bcd60e51b8152600401610e229061428f565b6002600a5414156119965760405162461bcd60e51b8152600401610e229061436e565b6002600a5560005b336000908152601f6020526040902054811015611a0f57336000818152601f6020526040902080546119ec929190849081106119dc576119dc61452e565b9060005260206000200154612ea0565b6018546119fa906001612eba565b60185580611a07816144bd565b91505061199e565b506001600a55565b600b546001600160a01b03163314611a415760405162461bcd60e51b8152600401610e22906142e8565b601391909155601455565b6000611a5760085490565b8210611aba5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610e22565b60088281548110611acd57611acd61452e565b90600052602060002001549050919050565b600b546001600160a01b03163314611b095760405162461bcd60e51b8152600401610e22906142e8565b601155565b33611b1884611f7a565b6001600160a01b031614611b6e5760405162461bcd60e51b815260206004820152601a60248201527f43616c6c6572206d75737420626520746f6b656e206f776e65720000000000006044820152606401610e22565b601c546201000090046001600160a01b0316611b9c5760405162461bcd60e51b8152600401610e22906142b9565b600082828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508251929350505015801590611be8575060198151105b611c2a5760405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840dcc2daca40d8cadccee8d606b1b6044820152606401610e22565b6000848152600c6020526040908190209051600291611c489161411b565b602060405180830381855afa158015611c65573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611c889190613ed6565b600282604051611c9891906140ff565b602060405180830381855afa158015611cb5573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611cd89190613ed6565b1415611d265760405162461bcd60e51b815260206004820181905260248201527f4e6577206e616d652069732073616d652061732063757272656e74206e616d656044820152606401610e22565b601c54601354604051632770a7eb60e21b81523360048201526024810191909152620100009091046001600160a01b031690639dc29fac90604401600060405180830381600087803b158015611d7b57600080fd5b505af1158015611d8f573d6000803e3d6000fd5b5050601c546022546013546001600160a01b0362010000909304831694506340c10f199350911690611dc990601e90611241906064612e81565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611e0f57600080fd5b505af1158015611e23573d6000803e3d6000fd5b5050506000858152600c60205260409020611e40915084846139ff565b50837fac2072268d18e10aecad35c0c04acd66330b2571a8ff403e3c702d77d3bab13484846040516112f49291906141cd565b600b546001600160a01b03163314611e9d5760405162461bcd60e51b8152600401610e22906142e8565b601c805460ff1916911515919091179055565b600b546001600160a01b03163314611eda5760405162461bcd60e51b8152600401610e22906142e8565b600f54601754611eea9083612eba565b1115611f335760405162461bcd60e51b815260206004820152601860248201527720b6b7bab73a1032bc31b2b2b21030bb30b4b630b136329760411b6044820152606401610e22565b600f54611f4090826131d8565b600f55600d54611f509082612eba565b600d5550565b33600090815260208052604081205460ff16611f73575060115490565b5060125490565b6000818152600260205260408120546001600160a01b031680610ce45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610e22565b601a8054611ffe90614488565b80601f016020809104026020016040519081016040528092919081815260200182805461202a90614488565b80156120775780601f1061204c57610100808354040283529160200191612077565b820191906000526020600020905b81548152906001019060200180831161205a57829003601f168201915b505050505081565b60006001600160a01b0382166120ea5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610e22565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146121305760405162461bcd60e51b8152600401610e22906142e8565b6118fd60006131e4565b600b546001600160a01b031633146121645760405162461bcd60e51b8152600401610e22906142e8565b6118fd613236565b600b546001600160a01b031633146121965760405162461bcd60e51b8152600401610e22906142e8565b80518251146121dd5760405162461bcd60e51b81526020600482015260136024820152720c2e4e4c2f240e6d2f4ca40dad2e6dac2e8c6d606b1b6044820152606401610e22565b60005b8251811015610f5857600d546121f890612710614445565b82828151811061220a5761220a61452e565b60200260200101511015612288576040805162461bcd60e51b81526020600482015260248101919091527f476976656177617920746f6b656e4944206d757374206265207365742066726f60448201527f6d2052657365727665642049447320776869636820617265206c6173746573746064820152608401610e22565b601f600084838151811061229e5761229e61452e565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208282815181106122d8576122d861452e565b6020908102919091018101518254600181018455600093845291909220015580612301816144bd565b9150506121e0565b600b546001600160a01b031633146123335760405162461bcd60e51b8152600401610e22906142e8565b601c80549115156101000261ff0019909216919091179055565b606060018054610d2a90614488565b6118c733838361329b565b600b546001600160a01b031633146123915760405162461bcd60e51b8152600401610e22906142e8565b601255565b600c602052600090815260409020805481906123b190614488565b80601f01602080910402602001604051908101604052809291908181526020018280546123dd90614488565b801561242a5780601f106123ff5761010080835404028352916020019161242a565b820191906000526020600020905b81548152906001019060200180831161240d57829003601f168201915b50505050509080600101805461243f90614488565b80601f016020809104026020016040519081016040528092919081815260200182805461246b90614488565b80156124b85780601f1061248d576101008083540402835291602001916124b8565b820191906000526020600020905b81548152906001019060200180831161249b57829003601f168201915b5050505050905082565b600b546001600160a01b031633146124ec5760405162461bcd60e51b8152600401610e22906142e8565b601055565b6002600a5414156125145760405162461bcd60e51b8152600401610e229061436e565b6002600a55612524335b83612ec6565b6125405760405162461bcd60e51b8152600401610e229061431d565b601d546001600160a01b0316156125b957601d5460405163c640752d60e01b81526001600160a01b03868116600483015285811660248301529091169063c640752d90604401600060405180830381600087803b1580156125a057600080fd5b505af11580156125b4573d6000803e3d6000fd5b505050505b6125c58484848461336a565b50506001600a555050565b600b54600160a01b900460ff16156125fa5760405162461bcd60e51b8152600401610e229061428f565b6002600a54141561261d5760405162461bcd60e51b8152600401610e229061436e565b6002600a55601c546201000090046001600160a01b03166126505760405162461bcd60e51b8152600401610e22906142b9565b601c5460ff1615156001146126995760405162461bcd60e51b815260206004820152600f60248201526e53616c65204e6f742041637469766560881b6044820152606401610e22565b600e546016546126a99083612eba565b11156127085760405162461bcd60e51b815260206004820152602860248201527f507572636861736520776f756c6420657863656564206d6178204c4f4245206d604482015267696e74204e46547360c01b6064820152608401610e22565b601c60029054906101000a90046001600160a01b03166001600160a01b0316639dc29fac3361274260105485612e9490919063ffffffff16565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561278857600080fd5b505af115801561279c573d6000803e3d6000fd5b5050601c546022546010546001600160a01b0362010000909304831694506340c10f1993509116906127e390601e90611241906064906127dd908990612e94565b90612e81565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561282957600080fd5b505af115801561283d573d6000803e3d6000fd5b5050505060005b8181101561287b5761285833601954612fed565b601954612866906001612eba565b60195580612873816144bd565b915050612844565b506016546128899082612eba565b601655506001600a55565b6000818152600260205260409020546060906001600160a01b03166129135760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610e22565b601c54610100900460ff1661295457601b61292d8361339b565b60405160200161293e929190614127565b6040516020818303038152906040529050919050565b601a61292d8361339b565b919050565b600b546001600160a01b0316331461298e5760405162461bcd60e51b8152600401610e22906142e8565b601c805462010000600160b01b031916620100006001600160a01b0394851602179055601d80546001600160a01b03191691909216179055565b606060006129d58361207f565b9050806129f65760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff811115612a1157612a11614544565b604051908082528060200260200182016040528015612a3a578160200160208202803683370190505b50905060005b828110156129ee57612a52858261179f565b828281518110612a6457612a6461452e565b602090810291909101015280612a79816144bd565b915050612a40565b50919050565b600b546001600160a01b03163314612ab15760405162461bcd60e51b8152600401610e22906142e8565b6000805b8251811015612b3557828181518110612ad057612ad061452e565b602002602001015162a98ac71415612af45781612aec816144bd565b925050612b23565b612b23848381518110612b0957612b0961452e565b60200260200101518483815181106113eb576113eb61452e565b80612b2d816144bd565b915050612ab5565b50505050565b600b546001600160a01b03163314612b655760405162461bcd60e51b8152600401610e22906142e8565b600e54601654612b759083612eba565b1115612bbe5760405162461bcd60e51b815260206004820152601860248201527720b6b7bab73a1032bc31b2b2b21030bb30b4b630b136329760411b6044820152606401610e22565b600e54612bcb90826131d8565b600e55600d54611f509082612eba565b600b546001600160a01b03163314612c055760405162461bcd60e51b8152600401610e22906142e8565b8151612c1890601b906020850190613a83565b508051610f5890601a906020840190613a83565b601b8054611ffe90614488565b600b546001600160a01b03163314612c635760405162461bcd60e51b8152600401610e22906142e8565b6001600160a01b038116612cc85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e22565b612cd1816131e4565b50565b600b546001600160a01b03163314612cfe5760405162461bcd60e51b8152600401610e22906142e8565b4781811015612d5e5760405162461bcd60e51b815260206004820152602660248201527f42616c616e63652073686f756c642061746c6561737420657175616c20746f20604482015265185b5bdd5b9d60d21b6064820152608401610e22565b6040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015612b35573d6000803e3d6000fd5b600b546001600160a01b03163314612dbe5760405162461bcd60e51b8152600401610e22906142e8565b601955565b60006001600160e01b031982166380ac58cd60e01b1480612df457506001600160e01b03198216635b5e139f60e01b145b80610ce457506301ffc9a760e01b6001600160e01b0319831614610ce4565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612e4882611f7a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612e8d8284614412565b9392505050565b6000612e8d8284614426565b6118c7828260405180602001604052806000815250613499565b6000612e8d82846143fa565b6000818152600260205260408120546001600160a01b0316612f3f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610e22565b6000612f4a83611f7a565b9050806001600160a01b0316846001600160a01b03161480612f855750836001600160a01b0316612f7a84610dad565b6001600160a01b0316145b80612fb557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b612fc633611448565b612fe25760405162461bcd60e51b8152600401610e229061431d565b610f588383836134cc565b6001600160a01b0382166130435760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610e22565b6000818152600260205260409020546001600160a01b0316156130a85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610e22565b6130b460008383613677565b6001600160a01b03821660009081526003602052604081208054600192906130dd9084906143fa565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600b54600160a01b900460ff1661318b5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610e22565b600b805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000612e8d8284614445565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600b54600160a01b900460ff16156132605760405162461bcd60e51b8152600401610e229061428f565b600b805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586131bb3390565b816001600160a01b0316836001600160a01b031614156132fd5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610e22565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6133733361251e565b61338f5760405162461bcd60e51b8152600401610e229061431d565b612b358484848461372f565b6060816133bf5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156133e957806133d3816144bd565b91506133e29050600a83614412565b91506133c3565b60008167ffffffffffffffff81111561340457613404614544565b6040519080825280601f01601f19166020018201604052801561342e576020820181803683370190505b5090505b8415612fb557613443600183614445565b9150613450600a866144d8565b61345b9060306143fa565b60f81b8183815181106134705761347061452e565b60200101906001600160f81b031916908160001a905350613492600a86614412565b9450613432565b6134a38383612fed565b6134b06000848484613762565b610f585760405162461bcd60e51b8152600401610e229061423d565b826001600160a01b03166134df82611f7a565b6001600160a01b0316146135475760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610e22565b6001600160a01b0382166135a95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610e22565b6135b4838383613677565b6135bf600082612e13565b6001600160a01b03831660009081526003602052604081208054600192906135e8908490614445565b90915550506001600160a01b03821660009081526003602052604081208054600192906136169084906143fa565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0383166136d2576136cd81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6136f5565b816001600160a01b0316836001600160a01b0316146136f5576136f5838261386f565b6001600160a01b03821661370c57610f588161390c565b826001600160a01b0316826001600160a01b031614610f5857610f5882826139bb565b61373a8484846134cc565b61374684848484613762565b612b355760405162461bcd60e51b8152600401610e229061423d565b60006001600160a01b0384163b1561386457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906137a690339089908890889060040161414c565b602060405180830381600087803b1580156137c057600080fd5b505af19250505080156137f0575060408051601f3d908101601f191682019092526137ed91810190613f0c565b60015b61384a573d80801561381e576040519150601f19603f3d011682016040523d82523d6000602084013e613823565b606091505b5080516138425760405162461bcd60e51b8152600401610e229061423d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612fb5565b506001949350505050565b6000600161387c8461207f565b6138869190614445565b6000838152600760205260409020549091508082146138d9576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061391e90600190614445565b600083815260096020526040812054600880549394509092849081106139465761394661452e565b9060005260206000200154905080600883815481106139675761396761452e565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061399f5761399f614518565b6001900381819060005260206000200160009055905550505050565b60006139c68361207f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054613a0b90614488565b90600052602060002090601f016020900481019282613a2d5760008555613a73565b82601f10613a465782800160ff19823516178555613a73565b82800160010185558215613a73579182015b82811115613a73578235825591602001919060010190613a58565b50613a7f929150613af7565b5090565b828054613a8f90614488565b90600052602060002090601f016020900481019282613ab15760008555613a73565b82601f10613aca57805160ff1916838001178555613a73565b82800160010185558215613a73579182015b82811115613a73578251825591602001919060010190613adc565b5b80821115613a7f5760008155600101613af8565b600067ffffffffffffffff831115613b2657613b26614544565b613b39601f8401601f19166020016143a5565b9050828152838383011115613b4d57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461295f57600080fd5b600082601f830112613b8c57600080fd5b81356020613ba1613b9c836143d6565b6143a5565b80838252828201915082860187848660051b8901011115613bc157600080fd5b60005b85811015613be757613bd582613b64565b84529284019290840190600101613bc4565b5090979650505050505050565b600082601f830112613c0557600080fd5b81356020613c15613b9c836143d6565b80838252828201915082860187848660051b8901011115613c3557600080fd5b60005b85811015613be757813584529284019290840190600101613c38565b8035801515811461295f57600080fd5b600082601f830112613c7557600080fd5b612e8d83833560208501613b0c565b600060208284031215613c9657600080fd5b612e8d82613b64565b60008060408385031215613cb257600080fd5b613cbb83613b64565b9150613cc960208401613b64565b90509250929050565b600080600060608486031215613ce757600080fd5b613cf084613b64565b9250613cfe60208501613b64565b9150604084013590509250925092565b60008060008060808587031215613d2457600080fd5b613d2d85613b64565b9350613d3b60208601613b64565b925060408501359150606085013567ffffffffffffffff811115613d5e57600080fd5b8501601f81018713613d6f57600080fd5b613d7e87823560208401613b0c565b91505092959194509250565b60008060408385031215613d9d57600080fd5b613da683613b64565b9150602083013567ffffffffffffffff811115613dc257600080fd5b613dce85828601613bf4565b9150509250929050565b60008060408385031215613deb57600080fd5b613df483613b64565b9150613cc960208401613c54565b60008060408385031215613e1557600080fd5b613e1e83613b64565b946020939093013593505050565b600060208284031215613e3e57600080fd5b813567ffffffffffffffff811115613e5557600080fd5b612fb584828501613b7b565b60008060408385031215613e7457600080fd5b823567ffffffffffffffff80821115613e8c57600080fd5b613e9886838701613b7b565b93506020850135915080821115613eae57600080fd5b50613dce85828601613bf4565b600060208284031215613ecd57600080fd5b612e8d82613c54565b600060208284031215613ee857600080fd5b5051919050565b600060208284031215613f0157600080fd5b8135612e8d8161455a565b600060208284031215613f1e57600080fd5b8151612e8d8161455a565b60008060408385031215613f3c57600080fd5b823567ffffffffffffffff80821115613f5457600080fd5b613f6086838701613c64565b93506020850135915080821115613f7657600080fd5b50613dce85828601613c64565b600060208284031215613f9557600080fd5b5035919050565b600080600060408486031215613fb157600080fd5b83359250602084013567ffffffffffffffff80821115613fd057600080fd5b818601915086601f830112613fe457600080fd5b813581811115613ff357600080fd5b87602082850101111561400557600080fd5b6020830194508093505050509250925092565b6000806040838503121561402b57600080fd5b50508035926020909101359150565b6000815180845261405281602086016020860161445c565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061408057607f831692505b60208084108214156140a257634e487b7160e01b600052602260045260246000fd5b8180156140b657600181146140c7576140f3565b60ff198616895284890196506140f3565b876000528160002060005b868110156140eb5781548b8201529085019083016140d2565b505084890196505b50505050505092915050565b6000825161411181846020870161445c565b9190910192915050565b6000612e8d8284614066565b60006141338285614066565b835161414381836020880161445c565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061417f9083018461403a565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156141c1578351835292840192918401916001016141a5565b50909695505050505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b602081526000612e8d602083018461403a565b604081526000614222604083018561403a565b8281036020840152614234818561403a565b95945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b602080825260159082015274139bc81d1bdad95b8818dbdb9d1c9858dd081cd95d605a1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156143ce576143ce614544565b604052919050565b600067ffffffffffffffff8211156143f0576143f0614544565b5060051b60200190565b6000821982111561440d5761440d6144ec565b500190565b60008261442157614421614502565b500490565b6000816000190483118215151615614440576144406144ec565b500290565b600082821015614457576144576144ec565b500390565b60005b8381101561447757818101518382015260200161445f565b83811115612b355750506000910152565b600181811c9082168061449c57607f821691505b60208210811415612a8157634e487b7160e01b600052602260045260246000fd5b60006000198214156144d1576144d16144ec565b5060010190565b6000826144e7576144e7614502565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114612cd157600080fdfea2646970667358221220aa72f62b8de9231e06140e5ce603ac20513d774213b1ff97a0d48d7ba6fbf99c64736f6c63430008070033000000000000000000000000f57ce00effd8eceb57ce9398edfe4815978709a90000000000000000000000009765d4aa7d34f2c8ae5a311b83f0ce08373a8ef6000000000000000000000000991f09114a025398b448de8511a7e816320d36b1

Deployed Bytecode

0x60806040526004361061041b5760003560e01c8063715018a61161021e578063c87b56dd11610123578063e985e9c5116100ab578063f3fef3a31161007a578063f3fef3a314610c11578063f4201c3c14610c31578063f72e2d0d14610c60578063f76fccca14610c80578063fae4c7f914610ca057600080fd5b8063e985e9c514610b7d578063eff9553714610bc6578063f14cdf6e14610bdb578063f2fde38b14610bf157600080fd5b8063d3c553ad116100f2578063d3c553ad14610ada578063d42e591b14610b07578063d75e611014610b27578063e365eca614610b3d578063e825417414610b5d57600080fd5b8063c87b56dd14610a57578063cd931e4014610a77578063d28a1f1d14610a97578063d3bfe07714610aad57600080fd5b806398e90184116101a6578063b19ec5e211610175578063b19ec5e2146109cb578063b88d4fde146109eb578063bf5f559714610a0b578063bfecf89514610a2b578063c14e851314610a4157600080fd5b806398e9018414610947578063a22cb4651461095d578063a29fb1fd1461097d578063ac32be601461099d57600080fd5b80638832bc29116101ed5780638832bc29146108c85780638d007f69146108de5780638da5cb5b146108f4578063949028a71461091257806395d89b411461093257600080fd5b8063715018a61461085857806373da60ad1461086d5780638456cb5914610893578063881b884a146108a857600080fd5b806342842e0e116103245780635c7b9f89116102ac5780636352211e1161027b5780636352211e146107d75780636aa605f6146107f75780636c0360eb1461080d5780636fdaddf11461082257806370a082311461083857600080fd5b80635c7b9f89146107775780635c975abb1461078d5780635db62358146107ac5780635f36fa26146107c157600080fd5b8063530e3b52116102f3578063530e3b52146106e157806353e76f2c14610701578063560c155f1461072157806358689219146107375780635ad710021461075757600080fd5b806342842e0e1461066c5780634af9bc101461068c5780634d78a0f7146106a15780634f6ccce7146106c157600080fd5b80631ae56350116103a75780632ee75a40116103765780632ee75a40146105e15780632f745c59146105f7578063376ea8e3146106175780633f4ba83a14610637578063401463531461064c57600080fd5b80631ae56350146105745780631e84c4131461059457806323b872dd146105ae5780632c3b372e146105ce57600080fd5b8063095ea7b3116103ee578063095ea7b3146104dd57806314dee4b3146104ff578063173ac3df1461051f57806318160ddd1461053f578063185c6a6e1461055457600080fd5b806301ffc9a714610420578063050225ea1461045557806306fdde0314610483578063081812fc146104a5575b600080fd5b34801561042c57600080fd5b5061044061043b366004613eef565b610cbf565b60405190151581526020015b60405180910390f35b34801561046157600080fd5b50610475610470366004613e02565b610cea565b60405190815260200161044c565b34801561048f57600080fd5b50610498610d1b565b60405161044c91906141fc565b3480156104b157600080fd5b506104c56104c0366004613f83565b610dad565b6040516001600160a01b03909116815260200161044c565b3480156104e957600080fd5b506104fd6104f8366004613e02565b610e47565b005b34801561050b57600080fd5b506104fd61051a366004613f9c565b610f5d565b34801561052b57600080fd5b50601d546104c5906001600160a01b031681565b34801561054b57600080fd5b50600854610475565b34801561056057600080fd5b506021546104c5906001600160a01b031681565b34801561058057600080fd5b506104fd61058f366004613d8a565b611302565b3480156105a057600080fd5b50601c546104409060ff1681565b3480156105ba57600080fd5b506104fd6105c9366004613cd2565b61141b565b6104fd6105dc366004613f83565b6114f8565b3480156105ed57600080fd5b5061047560135481565b34801561060357600080fd5b50610475610612366004613e02565b61179f565b34801561062357600080fd5b506104fd610632366004613e2c565b611835565b34801561064357600080fd5b506104fd6118cb565b34801561065857600080fd5b506104fd610667366004613f83565b6118ff565b34801561067857600080fd5b506104fd610687366004613cd2565b61192e565b34801561069857600080fd5b506104fd611949565b3480156106ad57600080fd5b506104fd6106bc366004614018565b611a17565b3480156106cd57600080fd5b506104756106dc366004613f83565b611a4c565b3480156106ed57600080fd5b506104fd6106fc366004613f83565b611adf565b34801561070d57600080fd5b506104fd61071c366004613f9c565b611b0e565b34801561072d57600080fd5b50610475600e5481565b34801561074357600080fd5b506104fd610752366004613ebb565b611e73565b34801561076357600080fd5b506104fd610772366004613f83565b611eb0565b34801561078357600080fd5b5061047560125481565b34801561079957600080fd5b50600b54600160a01b900460ff16610440565b3480156107b857600080fd5b50610475611f56565b3480156107cd57600080fd5b5061047560185481565b3480156107e357600080fd5b506104c56107f2366004613f83565b611f7a565b34801561080357600080fd5b5061047560165481565b34801561081957600080fd5b50610498611ff1565b34801561082e57600080fd5b5061047561271081565b34801561084457600080fd5b50610475610853366004613c84565b61207f565b34801561086457600080fd5b506104fd612106565b34801561087957600080fd5b50601c546104c5906201000090046001600160a01b031681565b34801561089f57600080fd5b506104fd61213a565b3480156108b457600080fd5b506104fd6108c3366004613e61565b61216c565b3480156108d457600080fd5b5061047560115481565b3480156108ea57600080fd5b50610475600d5481565b34801561090057600080fd5b50600b546001600160a01b03166104c5565b34801561091e57600080fd5b506104fd61092d366004613ebb565b612309565b34801561093e57600080fd5b5061049861234d565b34801561095357600080fd5b5061047560145481565b34801561096957600080fd5b506104fd610978366004613dd8565b61235c565b34801561098957600080fd5b506104fd610998366004613f83565b612367565b3480156109a957600080fd5b506109bd6109b8366004613f83565b612396565b60405161044c92919061420f565b3480156109d757600080fd5b506104fd6109e6366004613f83565b6124c2565b3480156109f757600080fd5b506104fd610a06366004613d0e565b6124f1565b348015610a1757600080fd5b506104fd610a26366004613f83565b6125d0565b348015610a3757600080fd5b50610475600f5481565b348015610a4d57600080fd5b5061047560195481565b348015610a6357600080fd5b50610498610a72366004613f83565b612894565b348015610a8357600080fd5b506104fd610a92366004613c9f565b612964565b348015610aa357600080fd5b5061047560175481565b348015610ab957600080fd5b50610acd610ac8366004613c84565b6129c8565b60405161044c9190614189565b348015610ae657600080fd5b50610475610af5366004613c84565b601e6020526000908152604090205481565b348015610b1357600080fd5b506104fd610b22366004613e61565b612a87565b348015610b3357600080fd5b5061047560155481565b348015610b4957600080fd5b506104fd610b58366004613f83565b612b3b565b348015610b6957600080fd5b506104fd610b78366004613f29565b612bdb565b348015610b8957600080fd5b50610440610b98366004613c9f565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610bd257600080fd5b50610498612c2c565b348015610be757600080fd5b5061047560105481565b348015610bfd57600080fd5b506104fd610c0c366004613c84565b612c39565b348015610c1d57600080fd5b506104fd610c2c366004613e02565b612cd4565b348015610c3d57600080fd5b50610440610c4c366004613c84565b602080526000908152604090205460ff1681565b348015610c6c57600080fd5b506022546104c5906001600160a01b031681565b348015610c8c57600080fd5b506104fd610c9b366004613f83565b612d94565b348015610cac57600080fd5b50601c5461044090610100900460ff1681565b60006001600160e01b0319821663780e9d6360e01b1480610ce45750610ce482612dc3565b92915050565b601f6020528160005260406000208181548110610d0657600080fd5b90600052602060002001600091509150505481565b606060008054610d2a90614488565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5690614488565b8015610da35780601f10610d7857610100808354040283529160200191610da3565b820191906000526020600020905b815481529060010190602001808311610d8657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610e2b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610e5282611f7a565b9050806001600160a01b0316836001600160a01b03161415610ec05760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610e22565b336001600160a01b0382161480610edc5750610edc8133610b98565b610f4e5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610e22565b610f588383612e13565b505050565b33610f6784611f7a565b6001600160a01b031614610fbd5760405162461bcd60e51b815260206004820152601a60248201527f43616c6c6572206d75737420626520746f6b656e206f776e65720000000000006044820152606401610e22565b601c546201000090046001600160a01b0316610feb5760405162461bcd60e51b8152600401610e22906142b9565b600082828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050825192935050501580159061103857506101188151105b6110845760405162461bcd60e51b815260206004820152601a60248201527f496e76616c6964206465736372697074696f6e206c656e6774680000000000006044820152606401610e22565b6002600c60008681526020019081526020016000206001016040516110a9919061411b565b602060405180830381855afa1580156110c6573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906110e99190613ed6565b6002826040516110f991906140ff565b602060405180830381855afa158015611116573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906111399190613ed6565b141561119e5760405162461bcd60e51b815260206004820152602e60248201527f4e6577206465736372697074696f6e2069732073616d6520617320637572726560448201526d373a103232b9b1b934b83a34b7b760911b6064820152608401610e22565b601c54601454604051632770a7eb60e21b81523360048201526024810191909152620100009091046001600160a01b031690639dc29fac90604401600060405180830381600087803b1580156111f357600080fd5b505af1158015611207573d6000803e3d6000fd5b5050601c546022546014546001600160a01b0362010000909304831694506340c10f19935091169061124790601e90611241906064612e81565b90612e94565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561128d57600080fd5b505af11580156112a1573d6000803e3d6000fd5b5050506000858152600c602052604090206112c1915060010184846139ff565b50837fa5eb4fe2f21ddb28c752c9927387264d67ce06b0ce619ad8b4b06d8dfe94834784846040516112f49291906141cd565b60405180910390a250505050565b600b546001600160a01b0316331461132c5760405162461bcd60e51b8152600401610e22906142e8565b60005b8151811015610f5857600d5461134790612710614445565b8282815181106113595761135961452e565b602002602001015110156113d55760405162461bcd60e51b815260206004820152603f60248201527f41697264726f7020746f6b656e4944206d757374206265207365742066726f6d60448201527f2052657365727665642049447320776869636820617265206c617374657374006064820152608401610e22565b6113f8838383815181106113eb576113eb61452e565b6020026020010151612ea0565b601854611406906001612eba565b60185580611413816144bd565b91505061132f565b6002600a54141561143e5760405162461bcd60e51b8152600401610e229061436e565b6002600a5561144e335b82612ec6565b61146a5760405162461bcd60e51b8152600401610e229061431d565b601d546001600160a01b0316156114e357601d5460405163c640752d60e01b81526001600160a01b03858116600483015284811660248301529091169063c640752d90604401600060405180830381600087803b1580156114ca57600080fd5b505af11580156114de573d6000803e3d6000fd5b505050505b6114ee838383612fbd565b50506001600a5550565b600b54600160a01b900460ff16156115225760405162461bcd60e51b8152600401610e229061428f565b6002600a5414156115455760405162461bcd60e51b8152600401610e229061436e565b6002600a55601c5460ff1615156001146115935760405162461bcd60e51b815260206004820152600f60248201526e53616c65204e6f742041637469766560881b6044820152606401610e22565b601554336000908152601e60205260409020546115b09083612eba565b11156115fe5760405162461bcd60e51b815260206004820152601960248201527f41626f76652053616c65205075726368617365204c696d6974000000000000006044820152606401610e22565b600f5460175461160e9083612eba565b111561166c5760405162461bcd60e51b815260206004820152602760248201527f507572636861736520776f756c6420657863656564206d617820455448206d696044820152666e74204e46547360c81b6064820152608401610e22565b33600090815260208052604090205460ff16156116d55760125434906116929083612e94565b146116d05760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908105b5bdd5b9d60921b6044820152606401610e22565b611722565b60115434906116e49083612e94565b146117225760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908105b5bdd5b9d60921b6044820152606401610e22565b60005b8181101561175c5761173933601954612fed565b601954611747906001612eba565b60195580611754816144bd565b915050611725565b5060175461176a9082612eba565b601755336000908152601e60205260409020546117879082612eba565b336000908152601e6020526040902055506001600a55565b60006117aa8361207f565b821061180c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610e22565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600b546001600160a01b0316331461185f5760405162461bcd60e51b8152600401610e22906142e8565b60005b81518110156118c7576001602060008484815181106118835761188361452e565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806118bf816144bd565b915050611862565b5050565b600b546001600160a01b031633146118f55760405162461bcd60e51b8152600401610e22906142e8565b6118fd61313b565b565b600b546001600160a01b031633146119295760405162461bcd60e51b8152600401610e22906142e8565b601555565b610f58838383604051806020016040528060008152506124f1565b600b54600160a01b900460ff16156119735760405162461bcd60e51b8152600401610e229061428f565b6002600a5414156119965760405162461bcd60e51b8152600401610e229061436e565b6002600a5560005b336000908152601f6020526040902054811015611a0f57336000818152601f6020526040902080546119ec929190849081106119dc576119dc61452e565b9060005260206000200154612ea0565b6018546119fa906001612eba565b60185580611a07816144bd565b91505061199e565b506001600a55565b600b546001600160a01b03163314611a415760405162461bcd60e51b8152600401610e22906142e8565b601391909155601455565b6000611a5760085490565b8210611aba5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610e22565b60088281548110611acd57611acd61452e565b90600052602060002001549050919050565b600b546001600160a01b03163314611b095760405162461bcd60e51b8152600401610e22906142e8565b601155565b33611b1884611f7a565b6001600160a01b031614611b6e5760405162461bcd60e51b815260206004820152601a60248201527f43616c6c6572206d75737420626520746f6b656e206f776e65720000000000006044820152606401610e22565b601c546201000090046001600160a01b0316611b9c5760405162461bcd60e51b8152600401610e22906142b9565b600082828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508251929350505015801590611be8575060198151105b611c2a5760405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840dcc2daca40d8cadccee8d606b1b6044820152606401610e22565b6000848152600c6020526040908190209051600291611c489161411b565b602060405180830381855afa158015611c65573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611c889190613ed6565b600282604051611c9891906140ff565b602060405180830381855afa158015611cb5573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611cd89190613ed6565b1415611d265760405162461bcd60e51b815260206004820181905260248201527f4e6577206e616d652069732073616d652061732063757272656e74206e616d656044820152606401610e22565b601c54601354604051632770a7eb60e21b81523360048201526024810191909152620100009091046001600160a01b031690639dc29fac90604401600060405180830381600087803b158015611d7b57600080fd5b505af1158015611d8f573d6000803e3d6000fd5b5050601c546022546013546001600160a01b0362010000909304831694506340c10f199350911690611dc990601e90611241906064612e81565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611e0f57600080fd5b505af1158015611e23573d6000803e3d6000fd5b5050506000858152600c60205260409020611e40915084846139ff565b50837fac2072268d18e10aecad35c0c04acd66330b2571a8ff403e3c702d77d3bab13484846040516112f49291906141cd565b600b546001600160a01b03163314611e9d5760405162461bcd60e51b8152600401610e22906142e8565b601c805460ff1916911515919091179055565b600b546001600160a01b03163314611eda5760405162461bcd60e51b8152600401610e22906142e8565b600f54601754611eea9083612eba565b1115611f335760405162461bcd60e51b815260206004820152601860248201527720b6b7bab73a1032bc31b2b2b21030bb30b4b630b136329760411b6044820152606401610e22565b600f54611f4090826131d8565b600f55600d54611f509082612eba565b600d5550565b33600090815260208052604081205460ff16611f73575060115490565b5060125490565b6000818152600260205260408120546001600160a01b031680610ce45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610e22565b601a8054611ffe90614488565b80601f016020809104026020016040519081016040528092919081815260200182805461202a90614488565b80156120775780601f1061204c57610100808354040283529160200191612077565b820191906000526020600020905b81548152906001019060200180831161205a57829003601f168201915b505050505081565b60006001600160a01b0382166120ea5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610e22565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146121305760405162461bcd60e51b8152600401610e22906142e8565b6118fd60006131e4565b600b546001600160a01b031633146121645760405162461bcd60e51b8152600401610e22906142e8565b6118fd613236565b600b546001600160a01b031633146121965760405162461bcd60e51b8152600401610e22906142e8565b80518251146121dd5760405162461bcd60e51b81526020600482015260136024820152720c2e4e4c2f240e6d2f4ca40dad2e6dac2e8c6d606b1b6044820152606401610e22565b60005b8251811015610f5857600d546121f890612710614445565b82828151811061220a5761220a61452e565b60200260200101511015612288576040805162461bcd60e51b81526020600482015260248101919091527f476976656177617920746f6b656e4944206d757374206265207365742066726f60448201527f6d2052657365727665642049447320776869636820617265206c6173746573746064820152608401610e22565b601f600084838151811061229e5761229e61452e565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208282815181106122d8576122d861452e565b6020908102919091018101518254600181018455600093845291909220015580612301816144bd565b9150506121e0565b600b546001600160a01b031633146123335760405162461bcd60e51b8152600401610e22906142e8565b601c80549115156101000261ff0019909216919091179055565b606060018054610d2a90614488565b6118c733838361329b565b600b546001600160a01b031633146123915760405162461bcd60e51b8152600401610e22906142e8565b601255565b600c602052600090815260409020805481906123b190614488565b80601f01602080910402602001604051908101604052809291908181526020018280546123dd90614488565b801561242a5780601f106123ff5761010080835404028352916020019161242a565b820191906000526020600020905b81548152906001019060200180831161240d57829003601f168201915b50505050509080600101805461243f90614488565b80601f016020809104026020016040519081016040528092919081815260200182805461246b90614488565b80156124b85780601f1061248d576101008083540402835291602001916124b8565b820191906000526020600020905b81548152906001019060200180831161249b57829003601f168201915b5050505050905082565b600b546001600160a01b031633146124ec5760405162461bcd60e51b8152600401610e22906142e8565b601055565b6002600a5414156125145760405162461bcd60e51b8152600401610e229061436e565b6002600a55612524335b83612ec6565b6125405760405162461bcd60e51b8152600401610e229061431d565b601d546001600160a01b0316156125b957601d5460405163c640752d60e01b81526001600160a01b03868116600483015285811660248301529091169063c640752d90604401600060405180830381600087803b1580156125a057600080fd5b505af11580156125b4573d6000803e3d6000fd5b505050505b6125c58484848461336a565b50506001600a555050565b600b54600160a01b900460ff16156125fa5760405162461bcd60e51b8152600401610e229061428f565b6002600a54141561261d5760405162461bcd60e51b8152600401610e229061436e565b6002600a55601c546201000090046001600160a01b03166126505760405162461bcd60e51b8152600401610e22906142b9565b601c5460ff1615156001146126995760405162461bcd60e51b815260206004820152600f60248201526e53616c65204e6f742041637469766560881b6044820152606401610e22565b600e546016546126a99083612eba565b11156127085760405162461bcd60e51b815260206004820152602860248201527f507572636861736520776f756c6420657863656564206d6178204c4f4245206d604482015267696e74204e46547360c01b6064820152608401610e22565b601c60029054906101000a90046001600160a01b03166001600160a01b0316639dc29fac3361274260105485612e9490919063ffffffff16565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561278857600080fd5b505af115801561279c573d6000803e3d6000fd5b5050601c546022546010546001600160a01b0362010000909304831694506340c10f1993509116906127e390601e90611241906064906127dd908990612e94565b90612e81565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561282957600080fd5b505af115801561283d573d6000803e3d6000fd5b5050505060005b8181101561287b5761285833601954612fed565b601954612866906001612eba565b60195580612873816144bd565b915050612844565b506016546128899082612eba565b601655506001600a55565b6000818152600260205260409020546060906001600160a01b03166129135760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610e22565b601c54610100900460ff1661295457601b61292d8361339b565b60405160200161293e929190614127565b6040516020818303038152906040529050919050565b601a61292d8361339b565b919050565b600b546001600160a01b0316331461298e5760405162461bcd60e51b8152600401610e22906142e8565b601c805462010000600160b01b031916620100006001600160a01b0394851602179055601d80546001600160a01b03191691909216179055565b606060006129d58361207f565b9050806129f65760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff811115612a1157612a11614544565b604051908082528060200260200182016040528015612a3a578160200160208202803683370190505b50905060005b828110156129ee57612a52858261179f565b828281518110612a6457612a6461452e565b602090810291909101015280612a79816144bd565b915050612a40565b50919050565b600b546001600160a01b03163314612ab15760405162461bcd60e51b8152600401610e22906142e8565b6000805b8251811015612b3557828181518110612ad057612ad061452e565b602002602001015162a98ac71415612af45781612aec816144bd565b925050612b23565b612b23848381518110612b0957612b0961452e565b60200260200101518483815181106113eb576113eb61452e565b80612b2d816144bd565b915050612ab5565b50505050565b600b546001600160a01b03163314612b655760405162461bcd60e51b8152600401610e22906142e8565b600e54601654612b759083612eba565b1115612bbe5760405162461bcd60e51b815260206004820152601860248201527720b6b7bab73a1032bc31b2b2b21030bb30b4b630b136329760411b6044820152606401610e22565b600e54612bcb90826131d8565b600e55600d54611f509082612eba565b600b546001600160a01b03163314612c055760405162461bcd60e51b8152600401610e22906142e8565b8151612c1890601b906020850190613a83565b508051610f5890601a906020840190613a83565b601b8054611ffe90614488565b600b546001600160a01b03163314612c635760405162461bcd60e51b8152600401610e22906142e8565b6001600160a01b038116612cc85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e22565b612cd1816131e4565b50565b600b546001600160a01b03163314612cfe5760405162461bcd60e51b8152600401610e22906142e8565b4781811015612d5e5760405162461bcd60e51b815260206004820152602660248201527f42616c616e63652073686f756c642061746c6561737420657175616c20746f20604482015265185b5bdd5b9d60d21b6064820152608401610e22565b6040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015612b35573d6000803e3d6000fd5b600b546001600160a01b03163314612dbe5760405162461bcd60e51b8152600401610e22906142e8565b601955565b60006001600160e01b031982166380ac58cd60e01b1480612df457506001600160e01b03198216635b5e139f60e01b145b80610ce457506301ffc9a760e01b6001600160e01b0319831614610ce4565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612e4882611f7a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612e8d8284614412565b9392505050565b6000612e8d8284614426565b6118c7828260405180602001604052806000815250613499565b6000612e8d82846143fa565b6000818152600260205260408120546001600160a01b0316612f3f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610e22565b6000612f4a83611f7a565b9050806001600160a01b0316846001600160a01b03161480612f855750836001600160a01b0316612f7a84610dad565b6001600160a01b0316145b80612fb557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b612fc633611448565b612fe25760405162461bcd60e51b8152600401610e229061431d565b610f588383836134cc565b6001600160a01b0382166130435760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610e22565b6000818152600260205260409020546001600160a01b0316156130a85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610e22565b6130b460008383613677565b6001600160a01b03821660009081526003602052604081208054600192906130dd9084906143fa565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600b54600160a01b900460ff1661318b5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610e22565b600b805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000612e8d8284614445565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600b54600160a01b900460ff16156132605760405162461bcd60e51b8152600401610e229061428f565b600b805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586131bb3390565b816001600160a01b0316836001600160a01b031614156132fd5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610e22565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6133733361251e565b61338f5760405162461bcd60e51b8152600401610e229061431d565b612b358484848461372f565b6060816133bf5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156133e957806133d3816144bd565b91506133e29050600a83614412565b91506133c3565b60008167ffffffffffffffff81111561340457613404614544565b6040519080825280601f01601f19166020018201604052801561342e576020820181803683370190505b5090505b8415612fb557613443600183614445565b9150613450600a866144d8565b61345b9060306143fa565b60f81b8183815181106134705761347061452e565b60200101906001600160f81b031916908160001a905350613492600a86614412565b9450613432565b6134a38383612fed565b6134b06000848484613762565b610f585760405162461bcd60e51b8152600401610e229061423d565b826001600160a01b03166134df82611f7a565b6001600160a01b0316146135475760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610e22565b6001600160a01b0382166135a95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610e22565b6135b4838383613677565b6135bf600082612e13565b6001600160a01b03831660009081526003602052604081208054600192906135e8908490614445565b90915550506001600160a01b03821660009081526003602052604081208054600192906136169084906143fa565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0383166136d2576136cd81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6136f5565b816001600160a01b0316836001600160a01b0316146136f5576136f5838261386f565b6001600160a01b03821661370c57610f588161390c565b826001600160a01b0316826001600160a01b031614610f5857610f5882826139bb565b61373a8484846134cc565b61374684848484613762565b612b355760405162461bcd60e51b8152600401610e229061423d565b60006001600160a01b0384163b1561386457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906137a690339089908890889060040161414c565b602060405180830381600087803b1580156137c057600080fd5b505af19250505080156137f0575060408051601f3d908101601f191682019092526137ed91810190613f0c565b60015b61384a573d80801561381e576040519150601f19603f3d011682016040523d82523d6000602084013e613823565b606091505b5080516138425760405162461bcd60e51b8152600401610e229061423d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612fb5565b506001949350505050565b6000600161387c8461207f565b6138869190614445565b6000838152600760205260409020549091508082146138d9576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061391e90600190614445565b600083815260096020526040812054600880549394509092849081106139465761394661452e565b9060005260206000200154905080600883815481106139675761396761452e565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061399f5761399f614518565b6001900381819060005260206000200160009055905550505050565b60006139c68361207f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054613a0b90614488565b90600052602060002090601f016020900481019282613a2d5760008555613a73565b82601f10613a465782800160ff19823516178555613a73565b82800160010185558215613a73579182015b82811115613a73578235825591602001919060010190613a58565b50613a7f929150613af7565b5090565b828054613a8f90614488565b90600052602060002090601f016020900481019282613ab15760008555613a73565b82601f10613aca57805160ff1916838001178555613a73565b82800160010185558215613a73579182015b82811115613a73578251825591602001919060010190613adc565b5b80821115613a7f5760008155600101613af8565b600067ffffffffffffffff831115613b2657613b26614544565b613b39601f8401601f19166020016143a5565b9050828152838383011115613b4d57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461295f57600080fd5b600082601f830112613b8c57600080fd5b81356020613ba1613b9c836143d6565b6143a5565b80838252828201915082860187848660051b8901011115613bc157600080fd5b60005b85811015613be757613bd582613b64565b84529284019290840190600101613bc4565b5090979650505050505050565b600082601f830112613c0557600080fd5b81356020613c15613b9c836143d6565b80838252828201915082860187848660051b8901011115613c3557600080fd5b60005b85811015613be757813584529284019290840190600101613c38565b8035801515811461295f57600080fd5b600082601f830112613c7557600080fd5b612e8d83833560208501613b0c565b600060208284031215613c9657600080fd5b612e8d82613b64565b60008060408385031215613cb257600080fd5b613cbb83613b64565b9150613cc960208401613b64565b90509250929050565b600080600060608486031215613ce757600080fd5b613cf084613b64565b9250613cfe60208501613b64565b9150604084013590509250925092565b60008060008060808587031215613d2457600080fd5b613d2d85613b64565b9350613d3b60208601613b64565b925060408501359150606085013567ffffffffffffffff811115613d5e57600080fd5b8501601f81018713613d6f57600080fd5b613d7e87823560208401613b0c565b91505092959194509250565b60008060408385031215613d9d57600080fd5b613da683613b64565b9150602083013567ffffffffffffffff811115613dc257600080fd5b613dce85828601613bf4565b9150509250929050565b60008060408385031215613deb57600080fd5b613df483613b64565b9150613cc960208401613c54565b60008060408385031215613e1557600080fd5b613e1e83613b64565b946020939093013593505050565b600060208284031215613e3e57600080fd5b813567ffffffffffffffff811115613e5557600080fd5b612fb584828501613b7b565b60008060408385031215613e7457600080fd5b823567ffffffffffffffff80821115613e8c57600080fd5b613e9886838701613b7b565b93506020850135915080821115613eae57600080fd5b50613dce85828601613bf4565b600060208284031215613ecd57600080fd5b612e8d82613c54565b600060208284031215613ee857600080fd5b5051919050565b600060208284031215613f0157600080fd5b8135612e8d8161455a565b600060208284031215613f1e57600080fd5b8151612e8d8161455a565b60008060408385031215613f3c57600080fd5b823567ffffffffffffffff80821115613f5457600080fd5b613f6086838701613c64565b93506020850135915080821115613f7657600080fd5b50613dce85828601613c64565b600060208284031215613f9557600080fd5b5035919050565b600080600060408486031215613fb157600080fd5b83359250602084013567ffffffffffffffff80821115613fd057600080fd5b818601915086601f830112613fe457600080fd5b813581811115613ff357600080fd5b87602082850101111561400557600080fd5b6020830194508093505050509250925092565b6000806040838503121561402b57600080fd5b50508035926020909101359150565b6000815180845261405281602086016020860161445c565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061408057607f831692505b60208084108214156140a257634e487b7160e01b600052602260045260246000fd5b8180156140b657600181146140c7576140f3565b60ff198616895284890196506140f3565b876000528160002060005b868110156140eb5781548b8201529085019083016140d2565b505084890196505b50505050505092915050565b6000825161411181846020870161445c565b9190910192915050565b6000612e8d8284614066565b60006141338285614066565b835161414381836020880161445c565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061417f9083018461403a565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156141c1578351835292840192918401916001016141a5565b50909695505050505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b602081526000612e8d602083018461403a565b604081526000614222604083018561403a565b8281036020840152614234818561403a565b95945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b602080825260159082015274139bc81d1bdad95b8818dbdb9d1c9858dd081cd95d605a1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156143ce576143ce614544565b604052919050565b600067ffffffffffffffff8211156143f0576143f0614544565b5060051b60200190565b6000821982111561440d5761440d6144ec565b500190565b60008261442157614421614502565b500490565b6000816000190483118215151615614440576144406144ec565b500290565b600082821015614457576144576144ec565b500390565b60005b8381101561447757818101518382015260200161445f565b83811115612b355750506000910152565b600181811c9082168061449c57607f821691505b60208210811415612a8157634e487b7160e01b600052602260045260246000fd5b60006000198214156144d1576144d16144ec565b5060010190565b6000826144e7576144e7614502565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114612cd157600080fdfea2646970667358221220aa72f62b8de9231e06140e5ce603ac20513d774213b1ff97a0d48d7ba6fbf99c64736f6c63430008070033

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

000000000000000000000000f57ce00effd8eceb57ce9398edfe4815978709a90000000000000000000000009765d4aa7d34f2c8ae5a311b83f0ce08373a8ef6000000000000000000000000991f09114a025398b448de8511a7e816320d36b1

-----Decoded View---------------
Arg [0] : _community (address): 0xF57Ce00efFD8eceB57Ce9398edFe4815978709A9
Arg [1] : _liquidity (address): 0x9765d4Aa7D34F2C8ae5A311b83F0CE08373a8EF6
Arg [2] : _LOBE (address): 0x991F09114a025398b448DE8511A7E816320d36B1

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000f57ce00effd8eceb57ce9398edfe4815978709a9
Arg [1] : 0000000000000000000000009765d4aa7d34f2c8ae5a311b83f0ce08373a8ef6
Arg [2] : 000000000000000000000000991f09114a025398b448de8511a7e816320d36b1


Deployed Bytecode Sourcemap

57802:12242:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36688:224;;;;;;;;;;-1:-1:-1;36688:224:0;;;;;:::i;:::-;;:::i;:::-;;;12456:14:1;;12449:22;12431:41;;12419:2;12404:18;36688:224:0;;;;;;;;59030:45;;;;;;;;;;-1:-1:-1;59030:45:0;;;;;:::i;:::-;;:::i;:::-;;;28362:25:1;;;28350:2;28335:18;59030:45:0;28216:177:1;23097:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24656:221::-;;;;;;;;;;-1:-1:-1;24656:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10529:32:1;;;10511:51;;10499:2;10484:18;24656:221:0;10365:203:1;24179:411:0;;;;;;;;;;-1:-1:-1;24179:411:0;;;;;:::i;:::-;;:::i;:::-;;63419:821;;;;;;;;;;-1:-1:-1;63419:821:0;;;;;:::i;:::-;;:::i;58919:41::-;;;;;;;;;;-1:-1:-1;58919:41:0;;;;-1:-1:-1;;;;;58919:41:0;;;37328:113;;;;;;;;;;-1:-1:-1;37416:10:0;:17;37328:113;;59130:38;;;;;;;;;;-1:-1:-1;59130:38:0;;;;-1:-1:-1;;;;;59130:38:0;;;66911:400;;;;;;;;;;-1:-1:-1;66911:400:0;;;;;:::i;:::-;;:::i;58821:30::-;;;;;;;;;;-1:-1:-1;58821:30:0;;;;;;;;69128:440;;;;;;;;;;-1:-1:-1;69128:440:0;;;;;:::i;:::-;;:::i;65588:952::-;;;;;;:::i;:::-;;:::i;58450:45::-;;;;;;;;;;;;;;;;36996:256;;;;;;;;;;-1:-1:-1;36996:256:0;;;;;:::i;:::-;;:::i;61477:191::-;;;;;;;;;;-1:-1:-1;61477:191:0;;;;;:::i;:::-;;:::i;69053:67::-;;;;;;;;;;;;;:::i;60676:106::-;;;;;;;;;;-1:-1:-1;60676:106:0;;;;;:::i;:::-;;:::i;25816:185::-;;;;;;;;;;-1:-1:-1;25816:185:0;;;;;:::i;:::-;;:::i;66583:282::-;;;;;;;;;;;;;:::i;60425:195::-;;;;;;;;;;-1:-1:-1;60425:195:0;;;;;:::i;:::-;;:::i;37518:233::-;;;;;;;;;;-1:-1:-1;37518:233:0;;;;;:::i;:::-;;:::i;60098:96::-;;;;;;;;;;-1:-1:-1;60098:96:0;;;;;:::i;:::-;;:::i;62658:714::-;;;;;;;;;;-1:-1:-1;62658:714:0;;;;;:::i;:::-;;:::i;58182:35::-;;;;;;;;;;;;;;;;59636:112;;;;;;;;;;-1:-1:-1;59636:112:0;;;;;:::i;:::-;;:::i;61161:259::-;;;;;;;;;;-1:-1:-1;61161:259:0;;;;;:::i;:::-;;:::i;58402:41::-;;;;;;;;;;;;;;;;53545:86;;;;;;;;;;-1:-1:-1;53616:7:0;;-1:-1:-1;;;53616:7:0;;;;53545:86;;68791:127;;;;;;;;;;;;;:::i;58679:34::-;;;;;;;;;;;;;;;;22791:239;;;;;;;;;;-1:-1:-1;22791:239:0;;;;;:::i;:::-;;:::i;58606:30::-;;;;;;;;;;;;;;;;58762:21;;;;;;;;;;;;;:::i;58265:39::-;;;;;;;;;;;;58299:5;58265:39;;22521:208;;;;;;;;;;-1:-1:-1;22521:208:0;;;;;:::i;:::-;;:::i;51590:103::-;;;;;;;;;;;;;:::i;58887:25::-;;;;;;;;;;-1:-1:-1;58887:25:0;;;;;;;-1:-1:-1;;;;;58887:25:0;;;68953:63;;;;;;;;;;;;;:::i;61715:429::-;;;;;;;;;;-1:-1:-1;61715:429:0;;;;;:::i;:::-;;:::i;58358:37::-;;;;;;;;;;;;;;;;58101:32;;;;;;;;;;;;;;;;50939:87;;;;;;;;;;-1:-1:-1;51012:6:0;;-1:-1:-1;;;;;51012:6:0;50939:87;;59796:98;;;;;;;;;;-1:-1:-1;59796:98:0;;;;;:::i;:::-;;:::i;23266:104::-;;;;;;;;;;;;;:::i;58502:52::-;;;;;;;;;;;;;;;;24949:155;;;;;;;;;;-1:-1:-1;24949:155:0;;;;;:::i;:::-;;:::i;60252:103::-;;;;;;;;;;-1:-1:-1;60252:103:0;;;;;:::i;:::-;;:::i;58041:51::-;;;;;;;;;;-1:-1:-1;58041:51:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;59947:98::-;;;;;;;;;;-1:-1:-1;59947:98:0;;;;;:::i;:::-;;:::i;69576:465::-;;;;;;;;;;-1:-1:-1;69576:465:0;;;;;:::i;:::-;;:::i;64615:764::-;;;;;;;;;;-1:-1:-1;64615:764:0;;;;;:::i;:::-;;:::i;58224:34::-;;;;;;;;;;;;;;;;58720:33;;;;;;;;;;;;;;;;67840:393;;;;;;;;;;-1:-1:-1;67840:393:0;;;;;:::i;:::-;;:::i;62215:195::-;;;;;;;;;;-1:-1:-1;62215:195:0;;;;;:::i;:::-;;:::i;58643:29::-;;;;;;;;;;;;;;;;68280:464;;;;;;;;;;-1:-1:-1;68280:464:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;58969:52::-;;;;;;;;;;-1:-1:-1;58969:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;67366:410;;;;;;;;;;-1:-1:-1;67366:410:0;;;;;:::i;:::-;;:::i;58563:34::-;;;;;;;;;;;;;;;;60841:264;;;;;;;;;;-1:-1:-1;60841:264:0;;;;;:::i;:::-;;:::i;62465:153::-;;;;;;;;;;-1:-1:-1;62465:153:0;;;;;:::i;:::-;;:::i;25175:164::-;;;;;;;;;;-1:-1:-1;25175:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;25296:25:0;;;25272:4;25296:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25175:164;58790:22;;;;;;;;;;;;;:::i;58313:38::-;;;;;;;;;;;;;;;;51848:201;;;;;;;;;;-1:-1:-1;51848:201:0;;;;;:::i;:::-;;:::i;64321:246::-;;;;;;;;;;-1:-1:-1;64321:246:0;;;;;:::i;:::-;;:::i;59084:37::-;;;;;;;;;;-1:-1:-1;59084:37:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;59175:34;;;;;;;;;;-1:-1:-1;59175:34:0;;;;-1:-1:-1;;;;;59175:34:0;;;65435:110;;;;;;;;;;-1:-1:-1;65435:110:0;;;;;:::i;:::-;;:::i;58858:20::-;;;;;;;;;;-1:-1:-1;58858:20:0;;;;;;;;;;;36688:224;36790:4;-1:-1:-1;;;;;;36814:50:0;;-1:-1:-1;;;36814:50:0;;:90;;;36868:36;36892:11;36868:23;:36::i;:::-;36807:97;36688:224;-1:-1:-1;;36688:224:0:o;59030:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23097:100::-;23151:13;23184:5;23177:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23097:100;:::o;24656:221::-;24732:7;27999:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27999:16:0;24752:73;;;;-1:-1:-1;;;24752:73:0;;22566:2:1;24752:73:0;;;22548:21:1;22605:2;22585:18;;;22578:30;22644:34;22624:18;;;22617:62;-1:-1:-1;;;22695:18:1;;;22688:42;22747:19;;24752:73:0;;;;;;;;;-1:-1:-1;24845:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24845:24:0;;24656:221::o;24179:411::-;24260:13;24276:23;24291:7;24276:14;:23::i;:::-;24260:39;;24324:5;-1:-1:-1;;;;;24318:11:0;:2;-1:-1:-1;;;;;24318:11:0;;;24310:57;;;;-1:-1:-1;;;24310:57:0;;24598:2:1;24310:57:0;;;24580:21:1;24637:2;24617:18;;;24610:30;24676:34;24656:18;;;24649:62;-1:-1:-1;;;24727:18:1;;;24720:31;24768:19;;24310:57:0;24396:397:1;24310:57:0;17453:10;-1:-1:-1;;;;;24402:21:0;;;;:62;;-1:-1:-1;24427:37:0;24444:5;17453:10;25175:164;:::i;24427:37::-;24380:168;;;;-1:-1:-1;;;24380:168:0;;19414:2:1;24380:168:0;;;19396:21:1;19453:2;19433:18;;;19426:30;19492:34;19472:18;;;19465:62;19563:26;19543:18;;;19536:54;19607:19;;24380:168:0;19212:420:1;24380:168:0;24561:21;24570:2;24574:7;24561:8;:21::i;:::-;24249:341;24179:411;;:::o;63419:821::-;63541:10;63521:16;63529:7;63521;:16::i;:::-;-1:-1:-1;;;;;63521:30:0;;63513:69;;;;-1:-1:-1;;;63513:69:0;;16430:2:1;63513:69:0;;;16412:21:1;16469:2;16449:18;;;16442:30;16508:28;16488:18;;;16481:56;16554:18;;63513:69:0;16228:350:1;63513:69:0;63609:12;;;;;-1:-1:-1;;;;;63609:12:0;63593:69;;;;-1:-1:-1;;;63593:69:0;;;;;;;:::i;:::-;63675:14;63698:11;;63675:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63729:8:0;;63675:35;;-1:-1:-1;;;63729:12:0;;;;:30;;;63756:3;63745:1;:8;:14;63729:30;63721:69;;;;-1:-1:-1;;;63721:69:0;;25766:2:1;63721:69:0;;;25748:21:1;25805:2;25785:18;;;25778:30;25844:28;25824:18;;;25817:56;25890:18;;63721:69:0;25564:350:1;63721:69:0;63843:45;63856:9;:18;63866:7;63856:18;;;;;;;;;;;:30;;63843:45;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63823:16;63836:1;63823:16;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:65;;63801:161;;;;-1:-1:-1;;;63801:161:0;;17128:2:1;63801:161:0;;;17110:21:1;17167:2;17147:18;;;17140:30;17206:34;17186:18;;;17179:62;-1:-1:-1;;;17257:18:1;;;17250:44;17311:19;;63801:161:0;16926:410:1;63801:161:0;63975:12;;64005:24;;63975:55;;-1:-1:-1;;;63975:55:0;;63993:10;63975:55;;;11549:51:1;11616:18;;;11609:34;;;;63975:12:0;;;;-1:-1:-1;;;;;63975:12:0;;:17;;11522:18:1;;63975:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64041:12:0;;64059:19;;64080:24;;-1:-1:-1;;;;;64041:12:0;;;;;;;-1:-1:-1;64041:17:0;;-1:-1:-1;64059:19:0;;;64080:41;;64118:2;;64080:33;;64109:3;64080:28;:33::i;:::-;:37;;:41::i;:::-;64041:81;;-1:-1:-1;;;;;;64041:81:0;;;;;;;-1:-1:-1;;;;;11567:32:1;;;64041:81:0;;;11549:51:1;11616:18;;;11609:34;11522:18;;64041:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64133:18:0;;;;:9;:18;;;;;:44;;-1:-1:-1;64133:30:0;;64166:11;;64133:44;:::i;:::-;;64211:7;64193:39;64220:11;;64193:39;;;;;;;:::i;:::-;;;;;;;;63502:738;63419:821;;;:::o;66911:400::-;51012:6;;-1:-1:-1;;;;;51012:6:0;17453:10;51159:23;51151:68;;;;-1:-1:-1;;;51151:68:0;;;;;;;:::i;:::-;67006:9:::1;67002:302;67023:9;:16;67019:1;:20;67002:302;;;67107:11;::::0;67097:21:::1;::::0;58299:5:::1;67097:21;:::i;:::-;67081:9;67091:1;67081:12;;;;;;;;:::i;:::-;;;;;;;:37;;67073:113;;;::::0;-1:-1:-1;;;67073:113:0;;22979:2:1;67073:113:0::1;::::0;::::1;22961:21:1::0;23018:2;22998:18;;;22991:30;23057:34;23037:18;;;23030:62;23128:33;23108:18;;;23101:61;23179:19;;67073:113:0::1;22777:427:1::0;67073:113:0::1;67201:28;67211:3;67216:9;67226:1;67216:12;;;;;;;;:::i;:::-;;;;;;;67201:9;:28::i;:::-;67266:19;::::0;:26:::1;::::0;67290:1:::1;67266:23;:26::i;:::-;67244:19;:48:::0;67041:3;::::1;::::0;::::1;:::i;:::-;;;;67002:302;;69128:440:::0;56551:1;57149:7;;:19;;57141:63;;;;-1:-1:-1;;;57141:63:0;;;;;;;:::i;:::-;56551:1;57282:7;:18;69289:41:::1;17453:10:::0;69308:12:::1;69322:7;69289:18;:41::i;:::-;69281:103;;;;-1:-1:-1::0;;;69281:103:0::1;;;;;;;:::i;:::-;69409:20;::::0;-1:-1:-1;;;;;69409:20:0::1;69401:43:::0;69397:113:::1;;69461:20;::::0;:37:::1;::::0;-1:-1:-1;;;69461:37:0;;-1:-1:-1;;;;;10803:15:1;;;69461:37:0::1;::::0;::::1;10785:34:1::0;10855:15;;;10835:18;;;10828:43;69461:20:0;;::::1;::::0;:27:::1;::::0;10720:18:1;;69461:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;69397:113;69522:38;69542:4;69548:2;69552:7;69522:19;:38::i;:::-;-1:-1:-1::0;;56507:1:0;57461:7;:22;-1:-1:-1;69128:440:0:o;65588:952::-;53616:7;;-1:-1:-1;;;53616:7:0;;;;53870:9;53862:38;;;;-1:-1:-1;;;53862:38:0;;;;;;;:::i;:::-;56551:1:::1;57149:7;;:19;;57141:63;;;;-1:-1:-1::0;;;57141:63:0::1;;;;;;;:::i;:::-;56551:1;57282:7;:18:::0;65692::::2;::::0;::::2;;:24;;:18:::0;:24:::2;65684:52;;;::::0;-1:-1:-1;;;65684:52:0;;15729:2:1;65684:52:0::2;::::0;::::2;15711:21:1::0;15768:2;15748:18;;;15741:30;-1:-1:-1;;;15787:18:1;;;15780:45;15842:18;;65684:52:0::2;15527:339:1::0;65684:52:0::2;65806:14;::::0;65773:10:::2;65755:29;::::0;;;:17:::2;:29;::::0;;;;;:47:::2;::::0;65789:12;65755:33:::2;:47::i;:::-;:65;;65747:117;;;::::0;-1:-1:-1;;;65747:117:0;;18715:2:1;65747:117:0::2;::::0;::::2;18697:21:1::0;18754:2;18734:18;;;18727:30;18793:27;18773:18;;;18766:55;18838:18;;65747:117:0::2;18513:349:1::0;65747:117:0::2;65919:12;::::0;65883:14:::2;::::0;:32:::2;::::0;65902:12;65883:18:::2;:32::i;:::-;:48;;65875:100;;;::::0;-1:-1:-1;;;65875:100:0;;26882:2:1;65875:100:0::2;::::0;::::2;26864:21:1::0;26921:2;26901:18;;;26894:30;26960:34;26940:18;;;26933:62;-1:-1:-1;;;27011:18:1;;;27004:37;27058:19;;65875:100:0::2;26680:403:1::0;65875:100:0::2;65996:10;65990:17;::::0;;;:5:::2;:17:::0;;;;;;::::2;;65986:220;;;66031:13;::::0;66066:9:::2;::::0;66031:31:::2;::::0;66049:12;66031:17:::2;:31::i;:::-;:44;66023:71;;;::::0;-1:-1:-1;;;66023:71:0;;16785:2:1;66023:71:0::2;::::0;::::2;16767:21:1::0;16824:2;16804:18;;;16797:30;-1:-1:-1;;;16843:18:1;;;16836:44;16897:18;;66023:71:0::2;16583:338:1::0;66023:71:0::2;65986:220;;;66135:9;::::0;66166::::2;::::0;66135:27:::2;::::0;66149:12;66135:13:::2;:27::i;:::-;:40;66127:67;;;::::0;-1:-1:-1;;;66127:67:0;;16785:2:1;66127:67:0::2;::::0;::::2;16767:21:1::0;16824:2;16804:18;;;16797:30;-1:-1:-1;;;16843:18:1;;;16836:44;16897:18;;66127:67:0::2;16583:338:1::0;66127:67:0::2;66220:9;66216:167;66239:12;66235:1;:16;66216:167;;;66273:37;66279:10;66291:18;;66273:5;:37::i;:::-;66346:18;::::0;:25:::2;::::0;66369:1:::2;66346:22;:25::i;:::-;66325:18;:46:::0;66253:3;::::2;::::0;::::2;:::i;:::-;;;;66216:167;;;-1:-1:-1::0;66410:14:0::2;::::0;:32:::2;::::0;66429:12;66410:18:::2;:32::i;:::-;66393:14;:49:::0;66503:10:::2;66485:29;::::0;;;:17:::2;:29;::::0;;;;;:47:::2;::::0;66519:12;66485:33:::2;:47::i;:::-;66471:10;66453:29;::::0;;;:17:::2;:29;::::0;;;;:79;-1:-1:-1;56507:1:0::1;57461:7;:22:::0;65588:952::o;36996:256::-;37093:7;37129:23;37146:5;37129:16;:23::i;:::-;37121:5;:31;37113:87;;;;-1:-1:-1;;;37113:87:0;;14491:2:1;37113:87:0;;;14473:21:1;14530:2;14510:18;;;14503:30;14569:34;14549:18;;;14542:62;-1:-1:-1;;;14620:18:1;;;14613:41;14671:19;;37113:87:0;14289:407:1;37113:87:0;-1:-1:-1;;;;;;37218:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;36996:256::o;61477:191::-;51012:6;;-1:-1:-1;;;;;51012:6:0;17453:10;51159:23;51151:68;;;;-1:-1:-1;;;51151:68:0;;;;;;;:::i;:::-;61564:9:::1;61559:102;61583:10;:17;61579:1;:21;61559:102;;;61645:4;61622:5;:20;61628:10;61639:1;61628:13;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;61622:20:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;61622:20:0;:27;;-1:-1:-1;;61622:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;61602:3;::::1;::::0;::::1;:::i;:::-;;;;61559:102;;;;61477:191:::0;:::o;69053:67::-;51012:6;;-1:-1:-1;;;;;51012:6:0;17453:10;51159:23;51151:68;;;;-1:-1:-1;;;51151:68:0;;;;;;;:::i;:::-;69102:10:::1;:8;:10::i;:::-;69053:67::o:0;60676:106::-;51012:6;;-1:-1:-1;;;;;51012:6:0;17453:10;51159:23;51151:68;;;;-1:-1:-1;;;51151:68:0;;;;;;;:::i;:::-;60751:14:::1;:23:::0;60676:106::o;25816:185::-;25954:39;25971:4;25977:2;25981:7;25954:39;;;;;;;;;;;;:16;:39::i;66583:282::-;53616:7;;-1:-1:-1;;;53616:7:0;;;;53870:9;53862:38;;;;-1:-1:-1;;;53862:38:0;;;;;;;:::i;:::-;56551:1:::1;57149:7;;:19;;57141:63;;;;-1:-1:-1::0;;;57141:63:0::1;;;;;;;:::i;:::-;56551:1;57282:7;:18:::0;66659:9:::2;66655:203;66685:10;66676:20;::::0;;;:8:::2;:20;::::0;;;;:27;66672:31;::::2;66655:203;;;66747:10;66759:20;::::0;;;:8:::2;:20;::::0;;;;:23;;66737:46:::2;::::0;66747:10;66759:20;66780:1;;66759:23;::::2;;;;;:::i;:::-;;;;;;;;;66737:9;:46::i;:::-;66820:19;::::0;:26:::2;::::0;66844:1:::2;66820:23;:26::i;:::-;66798:19;:48:::0;66705:3;::::2;::::0;::::2;:::i;:::-;;;;66655:203;;;-1:-1:-1::0;56507:1:0::1;57461:7;:22:::0;66583:282::o;60425:195::-;51012:6;;-1:-1:-1;;;;;51012:6:0;17453:10;51159:23;51151:68;;;;-1:-1:-1;;;51151:68:0;;;;;;;:::i;:::-;60537:17:::1;:25:::0;;;;60573:24:::1;:39:::0;60425:195::o;37518:233::-;37593:7;37629:30;37416:10;:17;;37328:113;37629:30;37621:5;:38;37613:95;;;;-1:-1:-1;;;37613:95:0;;26121:2:1;37613:95:0;;;26103:21:1;26160:2;26140:18;;;26133:30;26199:34;26179:18;;;26172:62;-1:-1:-1;;;26250:18:1;;;26243:42;26302:19;;37613:95:0;25919:408:1;37613:95:0;37726:10;37737:5;37726:17;;;;;;;;:::i;:::-;;;;;;;;;37719:24;;37518:233;;;:::o;60098:96::-;51012:6;;-1:-1:-1;;;;;51012:6:0;17453:10;51159:23;51151:68;;;;-1:-1:-1;;;51151:68:0;;;;;;;:::i;:::-;60168:9:::1;:18:::0;60098:96::o;62658:714::-;62766:10;62746:16;62754:7;62746;:16::i;:::-;-1:-1:-1;;;;;62746:30:0;;62738:69;;;;-1:-1:-1;;;62738:69:0;;16430:2:1;62738:69:0;;;16412:21:1;16469:2;16449:18;;;16442:30;16508:28;16488:18;;;16481:56;16554:18;;62738:69:0;16228:350:1;62738:69:0;62834:12;;;;;-1:-1:-1;;;;;62834:12:0;62818:69;;;;-1:-1:-1;;;62818:69:0;;;;;;;:::i;:::-;62900:14;62923:4;;62900:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;62947:8:0;;62900:28;;-1:-1:-1;;;62947:12:0;;;;:29;;;62974:2;62963:1;:8;:13;62947:29;62939:61;;;;-1:-1:-1;;;62939:61:0;;25000:2:1;62939:61:0;;;24982:21:1;25039:2;25019:18;;;25012:30;-1:-1:-1;;;25058:18:1;;;25051:49;25117:18;;62939:61:0;24798:343:1;62939:61:0;63055:18;;;;:9;:18;;;;;;;63042:38;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63029:9;63036:1;63029:9;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;63011:125;;;;-1:-1:-1;;;63011:125:0;;28057:2:1;63011:125:0;;;28039:21:1;;;28076:18;;;28069:30;28135:34;28115:18;;;28108:62;28187:18;;63011:125:0;27855:356:1;63011:125:0;63149:12;;63179:17;;63149:48;;-1:-1:-1;;;63149:48:0;;63167:10;63149:48;;;11549:51:1;11616:18;;;11609:34;;;;63149:12:0;;;;-1:-1:-1;;;;;63149:12:0;;:17;;11522:18:1;;63149:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63208:12:0;;63226:19;;63247:17;;-1:-1:-1;;;;;63208:12:0;;;;;;;-1:-1:-1;63208:17:0;;-1:-1:-1;63226:19:0;;;63247:34;;63278:2;;63247:26;;63269:3;63247:21;:26::i;:34::-;63208:74;;-1:-1:-1;;;;;;63208:74:0;;;;;;;-1:-1:-1;;;;;11567:32:1;;;63208:74:0;;;11549:51:1;11616:18;;;11609:34;11522:18;;63208:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63293:18:0;;;;:9;:18;;;;;:30;;-1:-1:-1;63319:4:0;;63293:30;:::i;:::-;;63350:7;63339:25;63359:4;;63339:25;;;;;;;:::i;59636:112::-;51012:6;;-1:-1:-1;;;;;51012:6:0;17453:10;51159:23;51151:68;;;;-1:-1:-1;;;51151:68:0;;;;;;;:::i;:::-;59712:18:::1;:28:::0;;-1:-1:-1;;59712:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;59636:112::o;61161:259::-;51012:6;;-1:-1:-1;;;;;51012:6:0;17453:10;51159:23;51151:68;;;;-1:-1:-1;;;51151:68:0;;;;;;;:::i;:::-;61273:12:::1;::::0;61243:14:::1;::::0;:26:::1;::::0;61262:6;61243:18:::1;:26::i;:::-;:42;;61235:79;;;::::0;-1:-1:-1;;;61235:79:0;;21069:2:1;61235:79:0::1;::::0;::::1;21051:21:1::0;21108:2;21088:18;;;21081:30;-1:-1:-1;;;21127:18:1;;;21120:54;21191:18;;61235:79:0::1;20867:348:1::0;61235:79:0::1;61340:12;::::0;:24:::1;::::0;61357:6;61340:16:::1;:24::i;:::-;61325:12;:39:::0;61389:11:::1;::::0;:23:::1;::::0;61405:6;61389:15:::1;:23::i;:::-;61375:11;:37:::0;-1:-1:-1;61161:259:0:o;68791:127::-;68871:10;68838:7;68865:17;;;:5;:17;;;;;;;;:45;;-1:-1:-1;68901:9:0;;;68791:127::o;68865:45::-;-1:-1:-1;68885:13:0;;;68791:127::o;22791:239::-;22863:7;22899:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22899:16:0;22934:19;22926:73;;;;-1:-1:-1;;;22926:73:0;;20250:2:1;22926:73:0;;;20232:21:1;20289:2;20269:18;;;20262:30;20328:34;20308:18;;;20301:62;-1:-1:-1;;;20379:18:1;;;20372:39;20428:19;;22926:73:0;20048:405:1;58762:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22521:208::-;22593:7;-1:-1:-1;;;;;22621:19:0;;22613:74;;;;-1:-1:-1;;;22613:74:0;;19839:2:1;22613:74:0;;;19821:21:1;19878:2;19858:18;;;19851:30;19917:34;19897:18;;;19890:62;-1:-1:-1;;;19968:18:1;;;19961:40;20018:19;;22613:74:0;19637:406:1;22613:74:0;-1:-1:-1;;;;;;22705:16:0;;;;;:9;:16;;;;;;;22521:208::o;51590:103::-;51012:6;;-1:-1:-1;;;;;51012:6:0;17453:10;51159:23;51151:68;;;;-1:-1:-1;;;51151:68:0;;;;;;;:::i;:::-;51655:30:::1;51682:1;51655:18;:30::i;68953:63::-:0;51012:6;;-1:-1:-1;;;;;51012:6:0;17453:10;51159:23;51151:68;;;;-1:-1:-1;;;51151:68:0;;;;;;;:::i;:::-;69000:8:::1;:6;:8::i;61715:429::-:0;51012:6;;-1:-1:-1;;;;;51012:6:0;17453:10;51159:23;51151:68;;;;-1:-1:-1;;;51151:68:0;;;;;;;:::i;:::-;61843:9:::1;:16;61829:3;:10;:30;61821:62;;;::::0;-1:-1:-1;;;61821:62:0;;26534:2:1;61821:62:0::1;::::0;::::1;26516:21:1::0;26573:2;26553:18;;;26546:30;-1:-1:-1;;;26592:18:1;;;26585:49;26651:18;;61821:62:0::1;26332:343:1::0;61821:62:0::1;61898:9;61894:243;61917:3;:10;61913:1;:14;61894:243;;;61983:11;::::0;61973:21:::1;::::0;58299:5:::1;61973:21;:::i;:::-;61957:9;61967:1;61957:12;;;;;;;;:::i;:::-;;;;;;;:37;;61949:114;;;::::0;;-1:-1:-1;;;61949:114:0;;22133:2:1;61949:114:0::1;::::0;::::1;22115:21:1::0;22152:18;;;22145:30;;;;22211:34;22191:18;;;22184:62;22282:34;22262:18;;;22255:62;22334:19;;61949:114:0::1;21931:428:1::0;61949:114:0::1;62090:8;:16;62099:3;62103:1;62099:6;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;62090:16:0::1;-1:-1:-1::0;;;;;62090:16:0::1;;;;;;;;;;;;62112:9;62122:1;62112:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;62090:35;;::::1;::::0;::::1;::::0;;-1:-1:-1;62090:35:0;;;;;;;::::1;::::0;61929:3;::::1;::::0;::::1;:::i;:::-;;;;61894:243;;59796:98:::0;51012:6;;-1:-1:-1;;;;;51012:6:0;17453:10;51159:23;51151:68;;;;-1:-1:-1;;;51151:68:0;;;;;;;:::i;:::-;59868:8:::1;:18:::0;;;::::1;;;;-1:-1:-1::0;;59868:18:0;;::::1;::::0;;;::::1;::::0;;59796:98::o;23266:104::-;23322:13;23355:7;23348:14;;;;;:::i;24949:155::-;25044:52;17453:10;25077:8;25087;25044:18;:52::i;60252:103::-;51012:6;;-1:-1:-1;;;;;51012:6:0;17453:10;51159:23;51151:68;;;;-1:-1:-1;;;51151:68:0;;;;;;;:::i;:::-;60325:13:::1;:22:::0;60252:103::o;58041:51::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59947:98::-;51012:6;;-1:-1:-1;;;;;51012:6:0;17453:10;51159:23;51151:68;;;;-1:-1:-1;;;51151:68:0;;;;;;;:::i;:::-;60018:10:::1;:19:::0;59947:98::o;69576:465::-;56551:1;57149:7;;:19;;57141:63;;;;-1:-1:-1;;;57141:63:0;;;;;;;:::i;:::-;56551:1;57282:7;:18;69752:41:::1;17453:10:::0;69771:12:::1;69785:7;69752:18;:41::i;:::-;69744:103;;;;-1:-1:-1::0;;;69744:103:0::1;;;;;;;:::i;:::-;69872:20;::::0;-1:-1:-1;;;;;69872:20:0::1;69864:43:::0;69860:113:::1;;69924:20;::::0;:37:::1;::::0;-1:-1:-1;;;69924:37:0;;-1:-1:-1;;;;;10803:15:1;;;69924:37:0::1;::::0;::::1;10785:34:1::0;10855:15;;;10835:18;;;10828:43;69924:20:0;;::::1;::::0;:27:::1;::::0;10720:18:1;;69924:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;69860:113;69985:48;70009:4;70015:2;70019:7;70028:4;69985:23;:48::i;:::-;-1:-1:-1::0;;56507:1:0;57461:7;:22;-1:-1:-1;;69576:465:0:o;64615:764::-;53616:7;;-1:-1:-1;;;53616:7:0;;;;53870:9;53862:38;;;;-1:-1:-1;;;53862:38:0;;;;;;;:::i;:::-;56551:1:::1;57149:7;;:19;;57141:63;;;;-1:-1:-1::0;;;57141:63:0::1;;;;;;;:::i;:::-;56551:1;57282:7;:18:::0;64720:12:::2;::::0;;;::::2;-1:-1:-1::0;;;;;64720:12:0::2;64704:69;;;;-1:-1:-1::0;;;64704:69:0::2;;;;;;;:::i;:::-;64792:18;::::0;::::2;;:24;;:18:::0;:24:::2;64784:52;;;::::0;-1:-1:-1;;;64784:52:0;;15729:2:1;64784:52:0::2;::::0;::::2;15711:21:1::0;15768:2;15748:18;;;15741:30;-1:-1:-1;;;15787:18:1;;;15780:45;15842:18;;64784:52:0::2;15527:339:1::0;64784:52:0::2;64900:13;::::0;64863:15:::2;::::0;:33:::2;::::0;64883:12;64863:19:::2;:33::i;:::-;:50;;64855:103;;;::::0;-1:-1:-1;;;64855:103:0;;20660:2:1;64855:103:0::2;::::0;::::2;20642:21:1::0;20699:2;20679:18;;;20672:30;20738:34;20718:18;;;20711:62;-1:-1:-1;;;20789:18:1;;;20782:38;20837:19;;64855:103:0::2;20458:404:1::0;64855:103:0::2;64969:12;;;;;;;;;-1:-1:-1::0;;;;;64969:12:0::2;-1:-1:-1::0;;;;;64969:17:0::2;;64987:10;64999:28;65016:10;;64999:12;:16;;:28;;;;:::i;:::-;64969:59;::::0;-1:-1:-1;;;;;;64969:59:0::2;::::0;;;;;;-1:-1:-1;;;;;11567:32:1;;;64969:59:0::2;::::0;::::2;11549:51:1::0;11616:18;;;11609:34;11522:18;;64969:59:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;65039:12:0::2;::::0;65057:19:::2;::::0;65095:10:::2;::::0;-1:-1:-1;;;;;65039:12:0;;;::::2;::::0;::::2;::::0;-1:-1:-1;65039:17:0::2;::::0;-1:-1:-1;65057:19:0;::::2;::::0;65078:45:::2;::::0;65120:2:::2;::::0;65078:37:::2;::::0;65111:3:::2;::::0;65078:28:::2;::::0;:12;;:16:::2;:28::i;:::-;:32:::0;::::2;:37::i;:45::-;65039:85;::::0;-1:-1:-1;;;;;;65039:85:0::2;::::0;;;;;;-1:-1:-1;;;;;11567:32:1;;;65039:85:0::2;::::0;::::2;11549:51:1::0;11616:18;;;11609:34;11522:18;;65039:85:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;65139:9;65135:167;65158:12;65154:1;:16;65135:167;;;65192:37;65198:10;65210:18;;65192:5;:37::i;:::-;65265:18;::::0;:25:::2;::::0;65288:1:::2;65265:22;:25::i;:::-;65244:18;:46:::0;65172:3;::::2;::::0;::::2;:::i;:::-;;;;65135:167;;;-1:-1:-1::0;65330:15:0::2;::::0;:33:::2;::::0;65350:12;65330:19:::2;:33::i;:::-;65312:15;:51:::0;-1:-1:-1;56507:1:0::1;57461:7;:22:::0;64615:764::o;67840:393::-;27975:4;27999:16;;;:7;:16;;;;;;67914:13;;-1:-1:-1;;;;;27999:16:0;67940:77;;;;-1:-1:-1;;;67940:77:0;;24182:2:1;67940:77:0;;;24164:21:1;24221:2;24201:18;;;24194:30;24260:34;24240:18;;;24233:62;-1:-1:-1;;;24311:18:1;;;24304:45;24366:19;;67940:77:0;23980:411:1;67940:77:0;68033:8;;;;;;;68028:198;;68089:8;68099:19;:8;:17;:19::i;:::-;68072:47;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68058:62;;67840:393;;;:::o;68028:198::-;68184:7;68193:19;:8;:17;:19::i;68028:198::-;67840:393;;;:::o;62215:195::-;51012:6;;-1:-1:-1;;;;;51012:6:0;17453:10;51159:23;51151:68;;;;-1:-1:-1;;;51151:68:0;;;;;;;:::i;:::-;62313:12:::1;:27:::0;;-1:-1:-1;;;;;;62313:27:0::1;::::0;-1:-1:-1;;;;;62313:27:0;;::::1;;;::::0;;62351:20:::1;:51:::0;;-1:-1:-1;;;;;;62351:51:0::1;::::0;;;::::1;;::::0;;62215:195::o;68280:464::-;68336:16;68365:18;68386:17;68396:6;68386:9;:17::i;:::-;68365:38;-1:-1:-1;68420:15:0;68416:313;;68459:16;;;68473:1;68459:16;;;;;;;;;;;-1:-1:-1;68452:23:0;68280:464;-1:-1:-1;;;68280:464:0:o;68416:313::-;68505:25;68547:10;68533:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68533:25:0;;68505:53;;68577:9;68573:118;68596:10;68592:1;:14;68573:118;;;68645:30;68665:6;68673:1;68645:19;:30::i;:::-;68631:8;68640:1;68631:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;68608:3;;;;:::i;:::-;;;;68573:118;;68416:313;68354:390;68280:464;;;:::o;67366:410::-;51012:6;;-1:-1:-1;;;;;51012:6:0;17453:10;51159:23;51151:68;;;;-1:-1:-1;;;51151:68:0;;;;;;;:::i;:::-;67469:19:::1;67507:9:::0;67503:266:::1;67526:9;:16;67522:1;:20;67503:266;;;67574:9;67584:1;67574:12;;;;;;;;:::i;:::-;;;;;;;67590:8;67574:24;67570:176;;;67618:14:::0;::::1;::::0;::::1;:::i;:::-;;;;67570:176;;;67689:41;67699:3;67703:11;67699:16;;;;;;;;:::i;:::-;;;;;;;67717:9;67727:1;67717:12;;;;;;;;:::i;67689:41::-;67544:3:::0;::::1;::::0;::::1;:::i;:::-;;;;67503:266;;;;67458:318;67366:410:::0;;:::o;60841:264::-;51012:6;;-1:-1:-1;;;;;51012:6:0;17453:10;51159:23;51151:68;;;;-1:-1:-1;;;51151:68:0;;;;;;;:::i;:::-;60955:13:::1;::::0;60924:15:::1;::::0;:27:::1;::::0;60944:6;60924:19:::1;:27::i;:::-;:44;;60916:81;;;::::0;-1:-1:-1;;;60916:81:0;;21069:2:1;60916:81:0::1;::::0;::::1;21051:21:1::0;21108:2;21088:18;;;21081:30;-1:-1:-1;;;21127:18:1;;;21120:54;21191:18;;60916:81:0::1;20867:348:1::0;60916:81:0::1;61024:13;::::0;:25:::1;::::0;61042:6;61024:17:::1;:25::i;:::-;61008:13;:41:::0;61074:11:::1;::::0;:23:::1;::::0;61090:6;61074:15:::1;:23::i;62465:153::-:0;51012:6;;-1:-1:-1;;;;;51012:6:0;17453:10;51159:23;51151:68;;;;-1:-1:-1;;;51151:68:0;;;;;;;:::i;:::-;62557:20;;::::1;::::0;:8:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;62588:14:0;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;58790:22::-:0;;;;;;;:::i;51848:201::-;51012:6;;-1:-1:-1;;;;;51012:6:0;17453:10;51159:23;51151:68;;;;-1:-1:-1;;;51151:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51937:22:0;::::1;51929:73;;;::::0;-1:-1:-1;;;51929:73:0;;15322:2:1;51929:73:0::1;::::0;::::1;15304:21:1::0;15361:2;15341:18;;;15334:30;15400:34;15380:18;;;15373:62;-1:-1:-1;;;15451:18:1;;;15444:36;15497:19;;51929:73:0::1;15120:402:1::0;51929:73:0::1;52013:28;52032:8;52013:18;:28::i;:::-;51848:201:::0;:::o;64321:246::-;51012:6;;-1:-1:-1;;;;;51012:6:0;17453:10;51159:23;51151:68;;;;-1:-1:-1;;;51151:68:0;;;;;;;:::i;:::-;64417:21:::1;64457:18:::0;;::::1;;64449:69;;;::::0;-1:-1:-1;;;64449:69:0;;27650:2:1;64449:69:0::1;::::0;::::1;27632:21:1::0;27689:2;27669:18;;;27662:30;27728:34;27708:18;;;27701:62;-1:-1:-1;;;27779:18:1;;;27772:36;27825:19;;64449:69:0::1;27448:402:1::0;64449:69:0::1;64529:30;::::0;-1:-1:-1;;;;;64529:21:0;::::1;::::0;:30;::::1;;;::::0;64551:7;;64529:30:::1;::::0;;;64551:7;64529:21;:30;::::1;;;;;;;;;;;;;::::0;::::1;;;;65435:110:::0;51012:6;;-1:-1:-1;;;;;51012:6:0;17453:10;51159:23;51151:68;;;;-1:-1:-1;;;51151:68:0;;;;;;;:::i;:::-;65513:18:::1;:24:::0;65435:110::o;22152:305::-;22254:4;-1:-1:-1;;;;;;22291:40:0;;-1:-1:-1;;;22291:40:0;;:105;;-1:-1:-1;;;;;;;22348:48:0;;-1:-1:-1;;;22348:48:0;22291:105;:158;;;-1:-1:-1;;;;;;;;;;20699:40:0;;;22413:36;20590:157;31892:174;31967:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31967:29:0;-1:-1:-1;;;;;31967:29:0;;;;;;;;:24;;32021:23;31967:24;32021:14;:23::i;:::-;-1:-1:-1;;;;;32012:46:0;;;;;;;;;;;31892:174;;:::o;46843:98::-;46901:7;46928:5;46932:1;46928;:5;:::i;:::-;46921:12;46843:98;-1:-1:-1;;;46843:98:0:o;46444:::-;46502:7;46529:5;46533:1;46529;:5;:::i;28894:110::-;28970:26;28980:2;28984:7;28970:26;;;;;;;;;;;;:9;:26::i;45706:98::-;45764:7;45791:5;45795:1;45791;:5;:::i;28204:348::-;28297:4;27999:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27999:16:0;28314:73;;;;-1:-1:-1;;;28314:73:0;;18302:2:1;28314:73:0;;;18284:21:1;18341:2;18321:18;;;18314:30;18380:34;18360:18;;;18353:62;-1:-1:-1;;;18431:18:1;;;18424:42;18483:19;;28314:73:0;18100:408:1;28314:73:0;28398:13;28414:23;28429:7;28414:14;:23::i;:::-;28398:39;;28467:5;-1:-1:-1;;;;;28456:16:0;:7;-1:-1:-1;;;;;28456:16:0;;:51;;;;28500:7;-1:-1:-1;;;;;28476:31:0;:20;28488:7;28476:11;:20::i;:::-;-1:-1:-1;;;;;28476:31:0;;28456:51;:87;;;-1:-1:-1;;;;;;25296:25:0;;;25272:4;25296:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28511:32;28448:96;28204:348;-1:-1:-1;;;;28204:348:0:o;25406:339::-;25601:41;17453:10;25620:12;17373:98;25601:41;25593:103;;;;-1:-1:-1;;;25593:103:0;;;;;;;:::i;:::-;25709:28;25719:4;25725:2;25729:7;25709:9;:28::i;29888:382::-;-1:-1:-1;;;;;29968:16:0;;29960:61;;;;-1:-1:-1;;;29960:61:0;;21422:2:1;29960:61:0;;;21404:21:1;;;21441:18;;;21434:30;21500:34;21480:18;;;21473:62;21552:18;;29960:61:0;21220:356:1;29960:61:0;27975:4;27999:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27999:16:0;:30;30032:58;;;;-1:-1:-1;;;30032:58:0;;16073:2:1;30032:58:0;;;16055:21:1;16112:2;16092:18;;;16085:30;16151;16131:18;;;16124:58;16199:18;;30032:58:0;15871:352:1;30032:58:0;30103:45;30132:1;30136:2;30140:7;30103:20;:45::i;:::-;-1:-1:-1;;;;;30161:13:0;;;;;;:9;:13;;;;;:18;;30178:1;;30161:13;:18;;30178:1;;30161:18;:::i;:::-;;;;-1:-1:-1;;30190:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30190:21:0;-1:-1:-1;;;;;30190:21:0;;;;;;;;30229:33;;30190:16;;;30229:33;;30190:16;;30229:33;29888:382;;:::o;54604:120::-;53616:7;;-1:-1:-1;;;53616:7:0;;;;54140:41;;;;-1:-1:-1;;;54140:41:0;;14142:2:1;54140:41:0;;;14124:21:1;14181:2;14161:18;;;14154:30;-1:-1:-1;;;14200:18:1;;;14193:50;14260:18;;54140:41:0;13940:344:1;54140:41:0;54663:7:::1;:15:::0;;-1:-1:-1;;;;54663:15:0::1;::::0;;54694:22:::1;17453:10:::0;54703:12:::1;54694:22;::::0;-1:-1:-1;;;;;10529:32:1;;;10511:51;;10499:2;10484:18;54694:22:0::1;;;;;;;54604:120::o:0;46087:98::-;46145:7;46172:5;46176:1;46172;:5;:::i;52209:191::-;52302:6;;;-1:-1:-1;;;;;52319:17:0;;;-1:-1:-1;;;;;;52319:17:0;;;;;;;52352:40;;52302:6;;;52319:17;52302:6;;52352:40;;52283:16;;52352:40;52272:128;52209:191;:::o;54345:118::-;53616:7;;-1:-1:-1;;;53616:7:0;;;;53870:9;53862:38;;;;-1:-1:-1;;;53862:38:0;;;;;;;:::i;:::-;54405:7:::1;:14:::0;;-1:-1:-1;;;;54405:14:0::1;-1:-1:-1::0;;;54405:14:0::1;::::0;;54435:20:::1;54442:12;17453:10:::0;;17373:98;32208:315;32363:8;-1:-1:-1;;;;;32354:17:0;:5;-1:-1:-1;;;;;32354:17:0;;;32346:55;;;;-1:-1:-1;;;32346:55:0;;17948:2:1;32346:55:0;;;17930:21:1;17987:2;17967:18;;;17960:30;18026:27;18006:18;;;17999:55;18071:18;;32346:55:0;17746:349:1;32346:55:0;-1:-1:-1;;;;;32412:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;32412:46:0;;;;;;;;;;32474:41;;12431::1;;;32474::0;;12404:18:1;32474:41:0;;;;;;;32208:315;;;:::o;26072:328::-;26247:41;17453:10;26266:12;17373:98;26247:41;26239:103;;;;-1:-1:-1;;;26239:103:0;;;;;;;:::i;:::-;26353:39;26367:4;26373:2;26377:7;26386:5;26353:13;:39::i;17960:723::-;18016:13;18237:10;18233:53;;-1:-1:-1;;18264:10:0;;;;;;;;;;;;-1:-1:-1;;;18264:10:0;;;;;17960:723::o;18233:53::-;18311:5;18296:12;18352:78;18359:9;;18352:78;;18385:8;;;;:::i;:::-;;-1:-1:-1;18408:10:0;;-1:-1:-1;18416:2:0;18408:10;;:::i;:::-;;;18352:78;;;18440:19;18472:6;18462:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18462:17:0;;18440:39;;18490:154;18497:10;;18490:154;;18524:11;18534:1;18524:11;;:::i;:::-;;-1:-1:-1;18593:10:0;18601:2;18593:5;:10;:::i;:::-;18580:24;;:2;:24;:::i;:::-;18567:39;;18550:6;18557;18550:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;18550:56:0;;;;;;;;-1:-1:-1;18621:11:0;18630:2;18621:11;;:::i;:::-;;;18490:154;;29231:321;29361:18;29367:2;29371:7;29361:5;:18::i;:::-;29412:54;29443:1;29447:2;29451:7;29460:5;29412:22;:54::i;:::-;29390:154;;;;-1:-1:-1;;;29390:154:0;;;;;;;:::i;31196:578::-;31355:4;-1:-1:-1;;;;;31328:31:0;:23;31343:7;31328:14;:23::i;:::-;-1:-1:-1;;;;;31328:31:0;;31320:85;;;;-1:-1:-1;;;31320:85:0;;23772:2:1;31320:85:0;;;23754:21:1;23811:2;23791:18;;;23784:30;23850:34;23830:18;;;23823:62;-1:-1:-1;;;23901:18:1;;;23894:39;23950:19;;31320:85:0;23570:405:1;31320:85:0;-1:-1:-1;;;;;31424:16:0;;31416:65;;;;-1:-1:-1;;;31416:65:0;;17543:2:1;31416:65:0;;;17525:21:1;17582:2;17562:18;;;17555:30;17621:34;17601:18;;;17594:62;-1:-1:-1;;;17672:18:1;;;17665:34;17716:19;;31416:65:0;17341:400:1;31416:65:0;31494:39;31515:4;31521:2;31525:7;31494:20;:39::i;:::-;31598:29;31615:1;31619:7;31598:8;:29::i;:::-;-1:-1:-1;;;;;31640:15:0;;;;;;:9;:15;;;;;:20;;31659:1;;31640:15;:20;;31659:1;;31640:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31671:13:0;;;;;;:9;:13;;;;;:18;;31688:1;;31671:13;:18;;31688:1;;31671:18;:::i;:::-;;;;-1:-1:-1;;31700:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31700:21:0;-1:-1:-1;;;;;31700:21:0;;;;;;;;;31739:27;;31700:16;;31739:27;;;;;;;31196:578;;;:::o;38364:589::-;-1:-1:-1;;;;;38570:18:0;;38566:187;;38605:40;38637:7;39780:10;:17;;39753:24;;;;:15;:24;;;;;:44;;;39808:24;;;;;;;;;;;;39676:164;38605:40;38566:187;;;38675:2;-1:-1:-1;;;;;38667:10:0;:4;-1:-1:-1;;;;;38667:10:0;;38663:90;;38694:47;38727:4;38733:7;38694:32;:47::i;:::-;-1:-1:-1;;;;;38767:16:0;;38763:183;;38800:45;38837:7;38800:36;:45::i;38763:183::-;38873:4;-1:-1:-1;;;;;38867:10:0;:2;-1:-1:-1;;;;;38867:10:0;;38863:83;;38894:40;38922:2;38926:7;38894:27;:40::i;27282:315::-;27439:28;27449:4;27455:2;27459:7;27439:9;:28::i;:::-;27486:48;27509:4;27515:2;27519:7;27528:5;27486:22;:48::i;:::-;27478:111;;;;-1:-1:-1;;;27478:111:0;;;;;;;:::i;33088:799::-;33243:4;-1:-1:-1;;;;;33264:13:0;;9678:20;9726:8;33260:620;;33300:72;;-1:-1:-1;;;33300:72:0;;-1:-1:-1;;;;;33300:36:0;;;;;:72;;17453:10;;33351:4;;33357:7;;33366:5;;33300:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33300:72:0;;;;;;;;-1:-1:-1;;33300:72:0;;;;;;;;;;;;:::i;:::-;;;33296:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33542:13:0;;33538:272;;33585:60;;-1:-1:-1;;;33585:60:0;;;;;;;:::i;33538:272::-;33760:6;33754:13;33745:6;33741:2;33737:15;33730:38;33296:529;-1:-1:-1;;;;;;33423:51:0;-1:-1:-1;;;33423:51:0;;-1:-1:-1;33416:58:0;;33260:620;-1:-1:-1;33864:4:0;33088:799;;;;;;:::o;40467:988::-;40733:22;40783:1;40758:22;40775:4;40758:16;:22::i;:::-;:26;;;;:::i;:::-;40795:18;40816:26;;;:17;:26;;;;;;40733:51;;-1:-1:-1;40949:28:0;;;40945:328;;-1:-1:-1;;;;;41016:18:0;;40994:19;41016:18;;;:12;:18;;;;;;;;:34;;;;;;;;;41067:30;;;;;;:44;;;41184:30;;:17;:30;;;;;:43;;;40945:328;-1:-1:-1;41369:26:0;;;;:17;:26;;;;;;;;41362:33;;;-1:-1:-1;;;;;41413:18:0;;;;;:12;:18;;;;;:34;;;;;;;41406:41;40467:988::o;41750:1079::-;42028:10;:17;42003:22;;42028:21;;42048:1;;42028:21;:::i;:::-;42060:18;42081:24;;;:15;:24;;;;;;42454:10;:26;;42003:46;;-1:-1:-1;42081:24:0;;42003:46;;42454:26;;;;;;:::i;:::-;;;;;;;;;42432:48;;42518:11;42493:10;42504;42493:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;42598:28;;;:15;:28;;;;;;;:41;;;42770:24;;;;;42763:31;42805:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;41821:1008;;;41750:1079;:::o;39254:221::-;39339:14;39356:20;39373:2;39356:16;:20::i;:::-;-1:-1:-1;;;;;39387:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;39432:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;39254:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;603:679;657:5;710:3;703:4;695:6;691:17;687:27;677:55;;728:1;725;718:12;677:55;764:6;751:20;790:4;814:60;830:43;870:2;830:43;:::i;:::-;814:60;:::i;:::-;896:3;920:2;915:3;908:15;948:2;943:3;939:12;932:19;;983:2;975:6;971:15;1035:3;1030:2;1024;1021:1;1017:10;1009:6;1005:23;1001:32;998:41;995:61;;;1052:1;1049;1042:12;995:61;1074:1;1084:169;1098:2;1095:1;1092:9;1084:169;;;1155:23;1174:3;1155:23;:::i;:::-;1143:36;;1199:12;;;;1231;;;;1116:1;1109:9;1084:169;;;-1:-1:-1;1271:5:1;;603:679;-1:-1:-1;;;;;;;603:679:1:o;1287:673::-;1341:5;1394:3;1387:4;1379:6;1375:17;1371:27;1361:55;;1412:1;1409;1402:12;1361:55;1448:6;1435:20;1474:4;1498:60;1514:43;1554:2;1514:43;:::i;1498:60::-;1580:3;1604:2;1599:3;1592:15;1632:2;1627:3;1623:12;1616:19;;1667:2;1659:6;1655:15;1719:3;1714:2;1708;1705:1;1701:10;1693:6;1689:23;1685:32;1682:41;1679:61;;;1736:1;1733;1726:12;1679:61;1758:1;1768:163;1782:2;1779:1;1776:9;1768:163;;;1839:17;;1827:30;;1877:12;;;;1909;;;;1800:1;1793:9;1768:163;;1965:160;2030:20;;2086:13;;2079:21;2069:32;;2059:60;;2115:1;2112;2105:12;2130:221;2173:5;2226:3;2219:4;2211:6;2207:17;2203:27;2193:55;;2244:1;2241;2234:12;2193:55;2266:79;2341:3;2332:6;2319:20;2312:4;2304:6;2300:17;2266:79;:::i;2356:186::-;2415:6;2468:2;2456:9;2447:7;2443:23;2439:32;2436:52;;;2484:1;2481;2474:12;2436:52;2507:29;2526:9;2507:29;:::i;2547:260::-;2615:6;2623;2676:2;2664:9;2655:7;2651:23;2647:32;2644:52;;;2692:1;2689;2682:12;2644:52;2715:29;2734:9;2715:29;:::i;:::-;2705:39;;2763:38;2797:2;2786:9;2782:18;2763:38;:::i;:::-;2753:48;;2547:260;;;;;:::o;2812:328::-;2889:6;2897;2905;2958:2;2946:9;2937:7;2933:23;2929:32;2926:52;;;2974:1;2971;2964:12;2926:52;2997:29;3016:9;2997:29;:::i;:::-;2987:39;;3045:38;3079:2;3068:9;3064:18;3045:38;:::i;:::-;3035:48;;3130:2;3119:9;3115:18;3102:32;3092:42;;2812:328;;;;;:::o;3145:666::-;3240:6;3248;3256;3264;3317:3;3305:9;3296:7;3292:23;3288:33;3285:53;;;3334:1;3331;3324:12;3285:53;3357:29;3376:9;3357:29;:::i;:::-;3347:39;;3405:38;3439:2;3428:9;3424:18;3405:38;:::i;:::-;3395:48;;3490:2;3479:9;3475:18;3462:32;3452:42;;3545:2;3534:9;3530:18;3517:32;3572:18;3564:6;3561:30;3558:50;;;3604:1;3601;3594:12;3558:50;3627:22;;3680:4;3672:13;;3668:27;-1:-1:-1;3658:55:1;;3709:1;3706;3699:12;3658:55;3732:73;3797:7;3792:2;3779:16;3774:2;3770;3766:11;3732:73;:::i;:::-;3722:83;;;3145:666;;;;;;;:::o;3816:422::-;3909:6;3917;3970:2;3958:9;3949:7;3945:23;3941:32;3938:52;;;3986:1;3983;3976:12;3938:52;4009:29;4028:9;4009:29;:::i;:::-;3999:39;;4089:2;4078:9;4074:18;4061:32;4116:18;4108:6;4105:30;4102:50;;;4148:1;4145;4138:12;4102:50;4171:61;4224:7;4215:6;4204:9;4200:22;4171:61;:::i;:::-;4161:71;;;3816:422;;;;;:::o;4243:254::-;4308:6;4316;4369:2;4357:9;4348:7;4344:23;4340:32;4337:52;;;4385:1;4382;4375:12;4337:52;4408:29;4427:9;4408:29;:::i;:::-;4398:39;;4456:35;4487:2;4476:9;4472:18;4456:35;:::i;4502:254::-;4570:6;4578;4631:2;4619:9;4610:7;4606:23;4602:32;4599:52;;;4647:1;4644;4637:12;4599:52;4670:29;4689:9;4670:29;:::i;:::-;4660:39;4746:2;4731:18;;;;4718:32;;-1:-1:-1;;;4502:254:1:o;4761:348::-;4845:6;4898:2;4886:9;4877:7;4873:23;4869:32;4866:52;;;4914:1;4911;4904:12;4866:52;4954:9;4941:23;4987:18;4979:6;4976:30;4973:50;;;5019:1;5016;5009:12;4973:50;5042:61;5095:7;5086:6;5075:9;5071:22;5042:61;:::i;5114:595::-;5232:6;5240;5293:2;5281:9;5272:7;5268:23;5264:32;5261:52;;;5309:1;5306;5299:12;5261:52;5349:9;5336:23;5378:18;5419:2;5411:6;5408:14;5405:34;;;5435:1;5432;5425:12;5405:34;5458:61;5511:7;5502:6;5491:9;5487:22;5458:61;:::i;:::-;5448:71;;5572:2;5561:9;5557:18;5544:32;5528:48;;5601:2;5591:8;5588:16;5585:36;;;5617:1;5614;5607:12;5585:36;;5640:63;5695:7;5684:8;5673:9;5669:24;5640:63;:::i;5714:180::-;5770:6;5823:2;5811:9;5802:7;5798:23;5794:32;5791:52;;;5839:1;5836;5829:12;5791:52;5862:26;5878:9;5862:26;:::i;5899:184::-;5969:6;6022:2;6010:9;6001:7;5997:23;5993:32;5990:52;;;6038:1;6035;6028:12;5990:52;-1:-1:-1;6061:16:1;;5899:184;-1:-1:-1;5899:184:1:o;6088:245::-;6146:6;6199:2;6187:9;6178:7;6174:23;6170:32;6167:52;;;6215:1;6212;6205:12;6167:52;6254:9;6241:23;6273:30;6297:5;6273:30;:::i;6338:249::-;6407:6;6460:2;6448:9;6439:7;6435:23;6431:32;6428:52;;;6476:1;6473;6466:12;6428:52;6508:9;6502:16;6527:30;6551:5;6527:30;:::i;6592:543::-;6680:6;6688;6741:2;6729:9;6720:7;6716:23;6712:32;6709:52;;;6757:1;6754;6747:12;6709:52;6797:9;6784:23;6826:18;6867:2;6859:6;6856:14;6853:34;;;6883:1;6880;6873:12;6853:34;6906:50;6948:7;6939:6;6928:9;6924:22;6906:50;:::i;:::-;6896:60;;7009:2;6998:9;6994:18;6981:32;6965:48;;7038:2;7028:8;7025:16;7022:36;;;7054:1;7051;7044:12;7022:36;;7077:52;7121:7;7110:8;7099:9;7095:24;7077:52;:::i;7140:180::-;7199:6;7252:2;7240:9;7231:7;7227:23;7223:32;7220:52;;;7268:1;7265;7258:12;7220:52;-1:-1:-1;7291:23:1;;7140:180;-1:-1:-1;7140:180:1:o;7325:660::-;7405:6;7413;7421;7474:2;7462:9;7453:7;7449:23;7445:32;7442:52;;;7490:1;7487;7480:12;7442:52;7526:9;7513:23;7503:33;;7587:2;7576:9;7572:18;7559:32;7610:18;7651:2;7643:6;7640:14;7637:34;;;7667:1;7664;7657:12;7637:34;7705:6;7694:9;7690:22;7680:32;;7750:7;7743:4;7739:2;7735:13;7731:27;7721:55;;7772:1;7769;7762:12;7721:55;7812:2;7799:16;7838:2;7830:6;7827:14;7824:34;;;7854:1;7851;7844:12;7824:34;7899:7;7894:2;7885:6;7881:2;7877:15;7873:24;7870:37;7867:57;;;7920:1;7917;7910:12;7867:57;7951:2;7947;7943:11;7933:21;;7973:6;7963:16;;;;;7325:660;;;;;:::o;7990:248::-;8058:6;8066;8119:2;8107:9;8098:7;8094:23;8090:32;8087:52;;;8135:1;8132;8125:12;8087:52;-1:-1:-1;;8158:23:1;;;8228:2;8213:18;;;8200:32;;-1:-1:-1;7990:248:1:o;8243:257::-;8284:3;8322:5;8316:12;8349:6;8344:3;8337:19;8365:63;8421:6;8414:4;8409:3;8405:14;8398:4;8391:5;8387:16;8365:63;:::i;:::-;8482:2;8461:15;-1:-1:-1;;8457:29:1;8448:39;;;;8489:4;8444:50;;8243:257;-1:-1:-1;;8243:257:1:o;8505:985::-;8593:12;;8558:3;;8648:1;8668:18;;;;8721;;;;8748:61;;8802:4;8794:6;8790:17;8780:27;;8748:61;8828:2;8876;8868:6;8865:14;8845:18;8842:38;8839:161;;;8922:10;8917:3;8913:20;8910:1;8903:31;8957:4;8954:1;8947:15;8985:4;8982:1;8975:15;8839:161;9016:18;9043:104;;;;9161:1;9156:328;;;;9009:475;;9043:104;-1:-1:-1;;9076:24:1;;9064:37;;9121:16;;;;-1:-1:-1;9043:104:1;;9156:328;9187:5;9184:1;9177:16;9234:2;9231:1;9221:16;9259:1;9273:165;9287:6;9284:1;9281:13;9273:165;;;9365:14;;9352:11;;;9345:35;9408:16;;;;9302:10;;9273:165;;;9277:3;;9467:6;9462:3;9458:16;9451:23;;9009:475;;;;;;;8505:985;;;;:::o;9495:274::-;9624:3;9662:6;9656:13;9678:53;9724:6;9719:3;9712:4;9704:6;9700:17;9678:53;:::i;:::-;9747:16;;;;;9495:274;-1:-1:-1;;9495:274:1:o;9774:202::-;9904:3;9929:41;9966:3;9958:6;9929:41;:::i;9981:379::-;10157:3;10185:41;10222:3;10214:6;10185:41;:::i;:::-;10255:6;10249:13;10271:52;10316:6;10312:2;10305:4;10297:6;10293:17;10271:52;:::i;:::-;10339:15;;9981:379;-1:-1:-1;;;;9981:379:1:o;10882:488::-;-1:-1:-1;;;;;11151:15:1;;;11133:34;;11203:15;;11198:2;11183:18;;11176:43;11250:2;11235:18;;11228:34;;;11298:3;11293:2;11278:18;;11271:31;;;11076:4;;11319:45;;11344:19;;11336:6;11319:45;:::i;:::-;11311:53;10882:488;-1:-1:-1;;;;;;10882:488:1:o;11654:632::-;11825:2;11877:21;;;11947:13;;11850:18;;;11969:22;;;11796:4;;11825:2;12048:15;;;;12022:2;12007:18;;;11796:4;12091:169;12105:6;12102:1;12099:13;12091:169;;;12166:13;;12154:26;;12235:15;;;;12200:12;;;;12127:1;12120:9;12091:169;;;-1:-1:-1;12277:3:1;;11654:632;-1:-1:-1;;;;;;11654:632:1:o;12935:390::-;13094:2;13083:9;13076:21;13133:6;13128:2;13117:9;13113:18;13106:34;13190:6;13182;13177:2;13166:9;13162:18;13149:48;13246:1;13217:22;;;13241:2;13213:31;;;13206:42;;;;13309:2;13288:15;;;-1:-1:-1;;13284:29:1;13269:45;13265:54;;12935:390;-1:-1:-1;12935:390:1:o;13330:219::-;13479:2;13468:9;13461:21;13442:4;13499:44;13539:2;13528:9;13524:18;13516:6;13499:44;:::i;13554:381::-;13751:2;13740:9;13733:21;13714:4;13777:44;13817:2;13806:9;13802:18;13794:6;13777:44;:::i;:::-;13869:9;13861:6;13857:22;13852:2;13841:9;13837:18;13830:50;13897:32;13922:6;13914;13897:32;:::i;:::-;13889:40;13554:381;-1:-1:-1;;;;;13554:381:1:o;14701:414::-;14903:2;14885:21;;;14942:2;14922:18;;;14915:30;14981:34;14976:2;14961:18;;14954:62;-1:-1:-1;;;15047:2:1;15032:18;;15025:48;15105:3;15090:19;;14701:414::o;18867:340::-;19069:2;19051:21;;;19108:2;19088:18;;;19081:30;-1:-1:-1;;;19142:2:1;19127:18;;19120:46;19198:2;19183:18;;18867:340::o;21581:345::-;21783:2;21765:21;;;21822:2;21802:18;;;21795:30;-1:-1:-1;;;21856:2:1;21841:18;;21834:51;21917:2;21902:18;;21581:345::o;23209:356::-;23411:2;23393:21;;;23430:18;;;23423:30;23489:34;23484:2;23469:18;;23462:62;23556:2;23541:18;;23209:356::o;25146:413::-;25348:2;25330:21;;;25387:2;25367:18;;;25360:30;25426:34;25421:2;25406:18;;25399:62;-1:-1:-1;;;25492:2:1;25477:18;;25470:47;25549:3;25534:19;;25146:413::o;27088:355::-;27290:2;27272:21;;;27329:2;27309:18;;;27302:30;27368:33;27363:2;27348:18;;27341:61;27434:2;27419:18;;27088:355::o;28398:275::-;28469:2;28463:9;28534:2;28515:13;;-1:-1:-1;;28511:27:1;28499:40;;28569:18;28554:34;;28590:22;;;28551:62;28548:88;;;28616:18;;:::i;:::-;28652:2;28645:22;28398:275;;-1:-1:-1;28398:275:1:o;28678:183::-;28738:4;28771:18;28763:6;28760:30;28757:56;;;28793:18;;:::i;:::-;-1:-1:-1;28838:1:1;28834:14;28850:4;28830:25;;28678:183::o;28866:128::-;28906:3;28937:1;28933:6;28930:1;28927:13;28924:39;;;28943:18;;:::i;:::-;-1:-1:-1;28979:9:1;;28866:128::o;28999:120::-;29039:1;29065;29055:35;;29070:18;;:::i;:::-;-1:-1:-1;29104:9:1;;28999:120::o;29124:168::-;29164:7;29230:1;29226;29222:6;29218:14;29215:1;29212:21;29207:1;29200:9;29193:17;29189:45;29186:71;;;29237:18;;:::i;:::-;-1:-1:-1;29277:9:1;;29124:168::o;29297:125::-;29337:4;29365:1;29362;29359:8;29356:34;;;29370:18;;:::i;:::-;-1:-1:-1;29407:9:1;;29297:125::o;29427:258::-;29499:1;29509:113;29523:6;29520:1;29517:13;29509:113;;;29599:11;;;29593:18;29580:11;;;29573:39;29545:2;29538:10;29509:113;;;29640:6;29637:1;29634:13;29631:48;;;-1:-1:-1;;29675:1:1;29657:16;;29650:27;29427:258::o;29690:380::-;29769:1;29765:12;;;;29812;;;29833:61;;29887:4;29879:6;29875:17;29865:27;;29833:61;29940:2;29932:6;29929:14;29909:18;29906:38;29903:161;;;29986:10;29981:3;29977:20;29974:1;29967:31;30021:4;30018:1;30011:15;30049:4;30046:1;30039:15;30075:135;30114:3;-1:-1:-1;;30135:17:1;;30132:43;;;30155:18;;:::i;:::-;-1:-1:-1;30202:1:1;30191:13;;30075:135::o;30215:112::-;30247:1;30273;30263:35;;30278:18;;:::i;:::-;-1:-1:-1;30312:9:1;;30215:112::o;30332:127::-;30393:10;30388:3;30384:20;30381:1;30374:31;30424:4;30421:1;30414:15;30448:4;30445:1;30438:15;30464:127;30525:10;30520:3;30516:20;30513:1;30506:31;30556:4;30553:1;30546:15;30580:4;30577:1;30570:15;30596:127;30657:10;30652:3;30648:20;30645:1;30638:31;30688:4;30685:1;30678:15;30712:4;30709:1;30702:15;30728:127;30789:10;30784:3;30780:20;30777:1;30770:31;30820:4;30817:1;30810:15;30844:4;30841:1;30834:15;30860:127;30921:10;30916:3;30912:20;30909:1;30902:31;30952:4;30949:1;30942:15;30976:4;30973:1;30966:15;30992:131;-1:-1:-1;;;;;;31066:32:1;;31056:43;;31046:71;;31113:1;31110;31103:12

Swarm Source

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