ETH Price: $3,112.86 (-1.79%)

Token

Chronos Dot (LMNFT)
 

Overview

Max Total Supply

1,953 LMNFT

Holders

396

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 LMNFT
0x5fA34Db1b5a30656E4a701107D67f31aBb5da232
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:
LEMANO_NFT

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-10-04
*/

// SPDX-License-Identifier: MIT
// ERC721A LEMANO WATCHES

pragma solidity ^0.8.4;


// File: @openzeppelin/contracts/utils/Strings.sol
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)


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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)



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

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

// File: @openzeppelin/contracts/utils/Address.sol
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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



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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)


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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)



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

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

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



error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
       // bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        //uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        //uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    //uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // 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;

    mapping (address => uint256 []) internal tokenIdsOwnedBy;


    /* LEMANO WATCH VARS */
    address public admin;
    address payable public lemanoWallet;
    
    uint256 public tokenPrice = 0.077 ether;

    bool public transferIsLocked = true;
    
    uint256 public maxMintPerTx = 5 ;

    uint256 public MAX_SUPPLY = 1953;
    string public baseURI = "ipfs://QmeA67MkbJKzwAJm5N3eafAFCfqXFLeMrkAP1Mkgf6RtwE/";


constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
        admin = msg.sender;
        lemanoWallet = payable(0xCeC38896B3b936b02be64D98DC7e738f6cA69219);
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex  - _startTokenId();//- _burnCounter
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }
    */
    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
   
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }
      */
    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
    
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }
     */
    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                //if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
               // }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex ;//&&  !_ownerships[tokenId].burned
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {

                    tokenIdsOwnedBy[to].push(updatedIndex);
                    
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        require(!transferIsLocked || from == admin,"Please wait the Presale End");
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        //delete preview ownership array
        for(uint index = 0;index < tokenIdsOwnedBy[from].length;index++){
            if(tokenIdsOwnedBy[from][index]==tokenId){
            delete tokenIdsOwnedBy[from][index];
                break;
            }
        }
        tokenIdsOwnedBy[to].push(tokenId);

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev This is equivalent to _burn(tokenId, false)
   
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }  */

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
    
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }
 */
    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
   
    /* @returns tokenIds same owner in 1 call from dapp */
    function getTokenIdsOwnedBy(address  _owner) virtual public view returns (uint256 [] memory){
	   return tokenIdsOwnedBy[_owner];
	}

    /* LEMANO WATCH custom functions */

    function mintTokenNFT (uint256 _numTokens) external payable returns (bool success){
         uint256 amount = msg.value;
         require(totalSupply()+(_numTokens) <= MAX_SUPPLY,"Collection is not more available");
         require (_numTokens <= maxMintPerTx ,"Max Mints each transaction");
         require(amount >= tokenPrice * _numTokens || admin == msg.sender ,"Not enought amount to buy this NFT");

        _safeMint(msg.sender,_numTokens,'');
         
        return true;
    }

    /* Reveal full collection*/
    function setBaseURIpfs (string memory _baseUri)  external  returns (bool success){
        require(msg.sender == admin,"Only Admin can act here");
        baseURI = _baseUri;
        return true;
    }

    function withdrawAdmin() public{
        require(msg.sender == admin, "Only Admin can act here");
        lemanoWallet.transfer(address(this).balance);
    }
        
    function setTokenPrice(uint256 _price) public {
        require(msg.sender == admin,"Only Admin can act here");
        tokenPrice = _price;
    }
        
    function setTransferIsLocked(bool _isLocked) public {
        require(msg.sender == admin,"Only Admin can act here");
        transferIsLocked = _isLocked;
    }

    function setMaxMintPerTx(uint256 _max) public {
        require(msg.sender == admin,"Only Admin can act here");
        maxMintPerTx = _max;
    }

    function setLemanoWallet(address _address) public {
        require(msg.sender == admin,"Only Admin can act here");
        lemanoWallet = payable(_address);
    }

    function setAdminWallet(address _address) public {
        require(msg.sender == admin,"Only Admin can act here");
        admin = _address;
    }
}

contract LEMANO_NFT is ERC721A {
    
  //Name symbol   
    constructor() ERC721A("Chronos Dot", "LMNFT")  {

    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getTokenIdsOwnedBy","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":"lemanoWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numTokens","type":"uint256"}],"name":"mintTokenNFT","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setAdminWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"name":"setBaseURIpfs","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setLemanoWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxMintPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isLocked","type":"bool"}],"name":"setTransferIsLocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","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":"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":[],"name":"transferIsLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6701118f178fb48000600a55600b805460ff191660011790556005600c556107a1600d5560e0604052603660808181529062001eb260a03980516200004d91600e9160209091019062000104565b503480156200005b57600080fd5b50604080518082018252600b81526a10da1c9bdb9bdcc8111bdd60aa1b602080830191825283518085019094526005845264131353919560da1b908401528151919291620000ac9160019162000104565b508051620000c290600290602084019062000104565b5060016000555050600880546001600160a01b031990811633179091556009805490911673cec38896b3b936b02be64d98dc7e738f6ca69219179055620001e7565b8280546200011290620001aa565b90600052602060002090601f01602090048101928262000136576000855562000181565b82601f106200015157805160ff191683800117855562000181565b8280016001018555821562000181579182015b828111156200018157825182559160200191906001019062000164565b506200018f92915062000193565b5090565b5b808211156200018f576000815560010162000194565b600181811c90821680620001bf57607f821691505b60208210811415620001e157634e487b7160e01b600052602260045260246000fd5b50919050565b611cbb80620001f76000396000f3fe6080604052600436106101cd5760003560e01c80636a61e5fc116100f7578063a22cb46511610095578063c87b56dd11610064578063c87b56dd1461050b578063de7fcb1d1461052b578063e985e9c514610541578063f851a4401461058a57600080fd5b8063a22cb4651461048b578063a8917171146104ab578063b88d4fde146104cb578063b9d494af146104eb57600080fd5b806370a08231116100d157806370a08231146104205780637ff9b5961461044057806395d89b41146104565780639acad4631461046b57600080fd5b80636a61e5fc146103d85780636c0360eb146103f85780636e9528d01461040d57600080fd5b806323b872dd1161016f57806342842e0e1161013e57806342842e0e1461034b578063616cdb1e1461036b57806363318f851461038b5780636352211e146103b857600080fd5b806323b872dd146102d557806329bf1aa7146102f557806332cb6b0c14610315578063350829331461032b57600080fd5b806306fdde03116101ab57806306fdde0314610238578063081812fc1461025a578063095ea7b31461029257806318160ddd146102b257600080fd5b806301ffc9a7146101d257806303c53c5f1461020757806304c76af014610221575b600080fd5b3480156101de57600080fd5b506101f26101ed3660046116ad565b6105aa565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b50600b546101f29060ff1681565b34801561022d57600080fd5b506102366105fc565b005b34801561024457600080fd5b5061024d61066b565b6040516101fe9190611729565b34801561026657600080fd5b5061027a61027536600461173c565b6106fd565b6040516001600160a01b0390911681526020016101fe565b34801561029e57600080fd5b506102366102ad366004611771565b610741565b3480156102be57600080fd5b50600054600019015b6040519081526020016101fe565b3480156102e157600080fd5b506102366102f036600461179b565b6107cf565b34801561030157600080fd5b506102366103103660046117d7565b6107da565b34801561032157600080fd5b506102c7600d5481565b34801561033757600080fd5b506102366103463660046117d7565b610826565b34801561035757600080fd5b5061023661036636600461179b565b610872565b34801561037757600080fd5b5061023661038636600461173c565b61088d565b34801561039757600080fd5b506103ab6103a63660046117d7565b6108bc565b6040516101fe91906117f2565b3480156103c457600080fd5b5061027a6103d336600461173c565b610928565b3480156103e457600080fd5b506102366103f336600461173c565b61093a565b34801561040457600080fd5b5061024d610969565b6101f261041b36600461173c565b6109f7565b34801561042c57600080fd5b506102c761043b3660046117d7565b610b57565b34801561044c57600080fd5b506102c7600a5481565b34801561046257600080fd5b5061024d610ba6565b34801561047757600080fd5b50610236610486366004611846565b610bb5565b34801561049757600080fd5b506102366104a6366004611861565b610bf2565b3480156104b757600080fd5b506101f26104c6366004611920565b610c88565b3480156104d757600080fd5b506102366104e6366004611969565b610cc8565b3480156104f757600080fd5b5060095461027a906001600160a01b031681565b34801561051757600080fd5b5061024d61052636600461173c565b610d19565b34801561053757600080fd5b506102c7600c5481565b34801561054d57600080fd5b506101f261055c3660046119e5565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561059657600080fd5b5060085461027a906001600160a01b031681565b60006001600160e01b031982166380ac58cd60e01b14806105db57506001600160e01b03198216635b5e139f60e01b145b806105f657506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b0316331461062f5760405162461bcd60e51b815260040161062690611a0f565b60405180910390fd5b6009546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610668573d6000803e3d6000fd5b50565b60606001805461067a90611a46565b80601f01602080910402602001604051908101604052809291908181526020018280546106a690611a46565b80156106f35780601f106106c8576101008083540402835291602001916106f3565b820191906000526020600020905b8154815290600101906020018083116106d657829003601f168201915b5050505050905090565b600061070882610d9c565b610725576040516333d1c03960e21b815260040160405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061074c82610928565b9050806001600160a01b0316836001600160a01b031614156107815760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906107a1575061079f813361055c565b155b156107bf576040516367d9dca160e11b815260040160405180910390fd5b6107ca838383610db2565b505050565b6107ca838383610e0e565b6008546001600160a01b031633146108045760405162461bcd60e51b815260040161062690611a0f565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031633146108505760405162461bcd60e51b815260040161062690611a0f565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6107ca83838360405180602001604052806000815250610cc8565b6008546001600160a01b031633146108b75760405162461bcd60e51b815260040161062690611a0f565b600c55565b6001600160a01b03811660009081526007602090815260409182902080548351818402810184019094528084526060939283018282801561091c57602002820191906000526020600020905b815481526020019060010190808311610908575b50505050509050919050565b60006109338261112f565b5192915050565b6008546001600160a01b031633146109645760405162461bcd60e51b815260040161062690611a0f565b600a55565b600e805461097690611a46565b80601f01602080910402602001604051908101604052809291908181526020018280546109a290611a46565b80156109ef5780601f106109c4576101008083540402835291602001916109ef565b820191906000526020600020905b8154815290600101906020018083116109d257829003601f168201915b505050505081565b600d54600090349083610a0d6000546000190190565b610a179190611a97565b1115610a655760405162461bcd60e51b815260206004820181905260248201527f436f6c6c656374696f6e206973206e6f74206d6f726520617661696c61626c656044820152606401610626565b600c54831115610ab75760405162461bcd60e51b815260206004820152601a60248201527f4d6178204d696e74732065616368207472616e73616374696f6e0000000000006044820152606401610626565b82600a54610ac59190611aaf565b81101580610add57506008546001600160a01b031633145b610b345760405162461bcd60e51b815260206004820152602260248201527f4e6f7420656e6f7567687420616d6f756e7420746f206275792074686973204e604482015261119560f21b6064820152608401610626565b610b4e338460405180602001604052806000815250611218565b50600192915050565b60006001600160a01b038216610b80576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526004602052604090205467ffffffffffffffff1690565b60606002805461067a90611a46565b6008546001600160a01b03163314610bdf5760405162461bcd60e51b815260040161062690611a0f565b600b805460ff1916911515919091179055565b6001600160a01b038216331415610c1c5760405163b06307db60e01b815260040160405180910390fd5b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546000906001600160a01b03163314610cb55760405162461bcd60e51b815260040161062690611a0f565b8151610b4e90600e9060208501906115fe565b610cd3848484610e0e565b6001600160a01b0383163b15158015610cf55750610cf384848484611225565b155b15610d13576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610d2482610d9c565b610d4157604051630a14c4b560e41b815260040160405180910390fd5b600e8054610d4e90611a46565b15159050610d6b57604051806020016040528060008152506105f6565b600e610d768361130e565b604051602001610d87929190611aea565b60405160208183030381529060405292915050565b6000816001111580156105f65750506000541190565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600b5460ff161580610e2d57506008546001600160a01b038481169116145b610e795760405162461bcd60e51b815260206004820152601b60248201527f506c656173652077616974207468652050726573616c6520456e6400000000006044820152606401610626565b6000610e848261112f565b9050836001600160a01b031681600001516001600160a01b031614610ebb5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480610ed95750610ed9853361055c565b80610ef4575033610ee9846106fd565b6001600160a01b0316145b905080610f1457604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416610f3b57604051633a954ecd60e21b815260040160405180910390fd5b610f4760008487610db2565b6001600160a01b038581166000908152600460209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600390945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661101d57600054821461101d578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505060005b6001600160a01b0386166000908152600760205260409020548110156110cd576001600160a01b038616600090815260076020526040902080548591908390811061107057611070611ba5565b906000526020600020015414156110bb576001600160a01b03861660009081526007602052604090208054829081106110ab576110ab611ba5565b60009182526020822001556110cd565b806110c581611bbb565b915050611023565b506001600160a01b03808516600081815260076020908152604080832080546001810182559084529183209091018790555186938916917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a45b5050505050565b60408051808201909152600080825260208201528180600111158015611156575060005481105b156111ff576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff1691830191909152156111a8579392505050565b50600019016000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff1691830191909152156111fa579392505050565b6111a8565b604051636f96cda160e11b815260040160405180910390fd5b6107ca838383600161140c565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061125a903390899088908890600401611bd6565b6020604051808303816000875af1925050508015611295575060408051601f3d908101601f1916820190925261129291810190611c13565b60015b6112f0573d8080156112c3576040519150601f19603f3d011682016040523d82523d6000602084013e6112c8565b606091505b5080516112e8576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816113325750506040805180820190915260018152600360fc1b602082015290565b8160005b811561135c578061134681611bbb565b91506113559050600a83611c46565b9150611336565b60008167ffffffffffffffff81111561137757611377611894565b6040519080825280601f01601f1916602001820160405280156113a1576020820181803683370190505b5090505b8415611306576113b6600183611c5a565b91506113c3600a86611c71565b6113ce906030611a97565b60f81b8183815181106113e3576113e3611ba5565b60200101906001600160f81b031916908160001a905350611405600a86611c46565b94506113a5565b6000546001600160a01b03851661143557604051622e076360e81b815260040160405180910390fd5b836114535760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260046020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600390925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561150557506001600160a01b0387163b15155b1561158e575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46115566000888480600101955088611225565b611573576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561150b57826000541461158957600080fd5b6115f5565b5b6001600160a01b038716600081815260076020908152604080832080546001818101835591855292842090920186905551908501949291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082141561158f575b50600055611128565b82805461160a90611a46565b90600052602060002090601f01602090048101928261162c5760008555611672565b82601f1061164557805160ff1916838001178555611672565b82800160010185558215611672579182015b82811115611672578251825591602001919060010190611657565b5061167e929150611682565b5090565b5b8082111561167e5760008155600101611683565b6001600160e01b03198116811461066857600080fd5b6000602082840312156116bf57600080fd5b81356116ca81611697565b9392505050565b60005b838110156116ec5781810151838201526020016116d4565b83811115610d135750506000910152565b600081518084526117158160208601602086016116d1565b601f01601f19169290920160200192915050565b6020815260006116ca60208301846116fd565b60006020828403121561174e57600080fd5b5035919050565b80356001600160a01b038116811461176c57600080fd5b919050565b6000806040838503121561178457600080fd5b61178d83611755565b946020939093013593505050565b6000806000606084860312156117b057600080fd5b6117b984611755565b92506117c760208501611755565b9150604084013590509250925092565b6000602082840312156117e957600080fd5b6116ca82611755565b6020808252825182820181905260009190848201906040850190845b8181101561182a5783518352928401929184019160010161180e565b50909695505050505050565b8035801515811461176c57600080fd5b60006020828403121561185857600080fd5b6116ca82611836565b6000806040838503121561187457600080fd5b61187d83611755565b915061188b60208401611836565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156118c5576118c5611894565b604051601f8501601f19908116603f011681019082821181831017156118ed576118ed611894565b8160405280935085815286868601111561190657600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561193257600080fd5b813567ffffffffffffffff81111561194957600080fd5b8201601f8101841361195a57600080fd5b611306848235602084016118aa565b6000806000806080858703121561197f57600080fd5b61198885611755565b935061199660208601611755565b925060408501359150606085013567ffffffffffffffff8111156119b957600080fd5b8501601f810187136119ca57600080fd5b6119d9878235602084016118aa565b91505092959194509250565b600080604083850312156119f857600080fd5b611a0183611755565b915061188b60208401611755565b60208082526017908201527f4f6e6c792041646d696e2063616e206163742068657265000000000000000000604082015260600190565b600181811c90821680611a5a57607f821691505b60208210811415611a7b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115611aaa57611aaa611a81565b500190565b6000816000190483118215151615611ac957611ac9611a81565b500290565b60008151611ae08185602086016116d1565b9290920192915050565b600080845481600182811c915080831680611b0657607f831692505b6020808410821415611b2657634e487b7160e01b86526022600452602486fd5b818015611b3a5760018114611b4b57611b78565b60ff19861689528489019650611b78565b60008b81526020902060005b86811015611b705781548b820152908501908301611b57565b505084890196505b505050505050611b9c611b8b8286611ace565b64173539b7b760d91b815260050190565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415611bcf57611bcf611a81565b5060010190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611c09908301846116fd565b9695505050505050565b600060208284031215611c2557600080fd5b81516116ca81611697565b634e487b7160e01b600052601260045260246000fd5b600082611c5557611c55611c30565b500490565b600082821015611c6c57611c6c611a81565b500390565b600082611c8057611c80611c30565b50069056fea2646970667358221220355a3f233a2fb1c0da5fdbeef23521d3c820941f9a071e8a61a3d31e04932fb964736f6c634300080a0033697066733a2f2f516d654136374d6b624a4b7a77414a6d354e33656166414643667158464c654d726b4150314d6b676636527477452f

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c80636a61e5fc116100f7578063a22cb46511610095578063c87b56dd11610064578063c87b56dd1461050b578063de7fcb1d1461052b578063e985e9c514610541578063f851a4401461058a57600080fd5b8063a22cb4651461048b578063a8917171146104ab578063b88d4fde146104cb578063b9d494af146104eb57600080fd5b806370a08231116100d157806370a08231146104205780637ff9b5961461044057806395d89b41146104565780639acad4631461046b57600080fd5b80636a61e5fc146103d85780636c0360eb146103f85780636e9528d01461040d57600080fd5b806323b872dd1161016f57806342842e0e1161013e57806342842e0e1461034b578063616cdb1e1461036b57806363318f851461038b5780636352211e146103b857600080fd5b806323b872dd146102d557806329bf1aa7146102f557806332cb6b0c14610315578063350829331461032b57600080fd5b806306fdde03116101ab57806306fdde0314610238578063081812fc1461025a578063095ea7b31461029257806318160ddd146102b257600080fd5b806301ffc9a7146101d257806303c53c5f1461020757806304c76af014610221575b600080fd5b3480156101de57600080fd5b506101f26101ed3660046116ad565b6105aa565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b50600b546101f29060ff1681565b34801561022d57600080fd5b506102366105fc565b005b34801561024457600080fd5b5061024d61066b565b6040516101fe9190611729565b34801561026657600080fd5b5061027a61027536600461173c565b6106fd565b6040516001600160a01b0390911681526020016101fe565b34801561029e57600080fd5b506102366102ad366004611771565b610741565b3480156102be57600080fd5b50600054600019015b6040519081526020016101fe565b3480156102e157600080fd5b506102366102f036600461179b565b6107cf565b34801561030157600080fd5b506102366103103660046117d7565b6107da565b34801561032157600080fd5b506102c7600d5481565b34801561033757600080fd5b506102366103463660046117d7565b610826565b34801561035757600080fd5b5061023661036636600461179b565b610872565b34801561037757600080fd5b5061023661038636600461173c565b61088d565b34801561039757600080fd5b506103ab6103a63660046117d7565b6108bc565b6040516101fe91906117f2565b3480156103c457600080fd5b5061027a6103d336600461173c565b610928565b3480156103e457600080fd5b506102366103f336600461173c565b61093a565b34801561040457600080fd5b5061024d610969565b6101f261041b36600461173c565b6109f7565b34801561042c57600080fd5b506102c761043b3660046117d7565b610b57565b34801561044c57600080fd5b506102c7600a5481565b34801561046257600080fd5b5061024d610ba6565b34801561047757600080fd5b50610236610486366004611846565b610bb5565b34801561049757600080fd5b506102366104a6366004611861565b610bf2565b3480156104b757600080fd5b506101f26104c6366004611920565b610c88565b3480156104d757600080fd5b506102366104e6366004611969565b610cc8565b3480156104f757600080fd5b5060095461027a906001600160a01b031681565b34801561051757600080fd5b5061024d61052636600461173c565b610d19565b34801561053757600080fd5b506102c7600c5481565b34801561054d57600080fd5b506101f261055c3660046119e5565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561059657600080fd5b5060085461027a906001600160a01b031681565b60006001600160e01b031982166380ac58cd60e01b14806105db57506001600160e01b03198216635b5e139f60e01b145b806105f657506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b0316331461062f5760405162461bcd60e51b815260040161062690611a0f565b60405180910390fd5b6009546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610668573d6000803e3d6000fd5b50565b60606001805461067a90611a46565b80601f01602080910402602001604051908101604052809291908181526020018280546106a690611a46565b80156106f35780601f106106c8576101008083540402835291602001916106f3565b820191906000526020600020905b8154815290600101906020018083116106d657829003601f168201915b5050505050905090565b600061070882610d9c565b610725576040516333d1c03960e21b815260040160405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061074c82610928565b9050806001600160a01b0316836001600160a01b031614156107815760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906107a1575061079f813361055c565b155b156107bf576040516367d9dca160e11b815260040160405180910390fd5b6107ca838383610db2565b505050565b6107ca838383610e0e565b6008546001600160a01b031633146108045760405162461bcd60e51b815260040161062690611a0f565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031633146108505760405162461bcd60e51b815260040161062690611a0f565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6107ca83838360405180602001604052806000815250610cc8565b6008546001600160a01b031633146108b75760405162461bcd60e51b815260040161062690611a0f565b600c55565b6001600160a01b03811660009081526007602090815260409182902080548351818402810184019094528084526060939283018282801561091c57602002820191906000526020600020905b815481526020019060010190808311610908575b50505050509050919050565b60006109338261112f565b5192915050565b6008546001600160a01b031633146109645760405162461bcd60e51b815260040161062690611a0f565b600a55565b600e805461097690611a46565b80601f01602080910402602001604051908101604052809291908181526020018280546109a290611a46565b80156109ef5780601f106109c4576101008083540402835291602001916109ef565b820191906000526020600020905b8154815290600101906020018083116109d257829003601f168201915b505050505081565b600d54600090349083610a0d6000546000190190565b610a179190611a97565b1115610a655760405162461bcd60e51b815260206004820181905260248201527f436f6c6c656374696f6e206973206e6f74206d6f726520617661696c61626c656044820152606401610626565b600c54831115610ab75760405162461bcd60e51b815260206004820152601a60248201527f4d6178204d696e74732065616368207472616e73616374696f6e0000000000006044820152606401610626565b82600a54610ac59190611aaf565b81101580610add57506008546001600160a01b031633145b610b345760405162461bcd60e51b815260206004820152602260248201527f4e6f7420656e6f7567687420616d6f756e7420746f206275792074686973204e604482015261119560f21b6064820152608401610626565b610b4e338460405180602001604052806000815250611218565b50600192915050565b60006001600160a01b038216610b80576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526004602052604090205467ffffffffffffffff1690565b60606002805461067a90611a46565b6008546001600160a01b03163314610bdf5760405162461bcd60e51b815260040161062690611a0f565b600b805460ff1916911515919091179055565b6001600160a01b038216331415610c1c5760405163b06307db60e01b815260040160405180910390fd5b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546000906001600160a01b03163314610cb55760405162461bcd60e51b815260040161062690611a0f565b8151610b4e90600e9060208501906115fe565b610cd3848484610e0e565b6001600160a01b0383163b15158015610cf55750610cf384848484611225565b155b15610d13576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610d2482610d9c565b610d4157604051630a14c4b560e41b815260040160405180910390fd5b600e8054610d4e90611a46565b15159050610d6b57604051806020016040528060008152506105f6565b600e610d768361130e565b604051602001610d87929190611aea565b60405160208183030381529060405292915050565b6000816001111580156105f65750506000541190565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600b5460ff161580610e2d57506008546001600160a01b038481169116145b610e795760405162461bcd60e51b815260206004820152601b60248201527f506c656173652077616974207468652050726573616c6520456e6400000000006044820152606401610626565b6000610e848261112f565b9050836001600160a01b031681600001516001600160a01b031614610ebb5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480610ed95750610ed9853361055c565b80610ef4575033610ee9846106fd565b6001600160a01b0316145b905080610f1457604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416610f3b57604051633a954ecd60e21b815260040160405180910390fd5b610f4760008487610db2565b6001600160a01b038581166000908152600460209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600390945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661101d57600054821461101d578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505060005b6001600160a01b0386166000908152600760205260409020548110156110cd576001600160a01b038616600090815260076020526040902080548591908390811061107057611070611ba5565b906000526020600020015414156110bb576001600160a01b03861660009081526007602052604090208054829081106110ab576110ab611ba5565b60009182526020822001556110cd565b806110c581611bbb565b915050611023565b506001600160a01b03808516600081815260076020908152604080832080546001810182559084529183209091018790555186938916917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a45b5050505050565b60408051808201909152600080825260208201528180600111158015611156575060005481105b156111ff576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff1691830191909152156111a8579392505050565b50600019016000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff1691830191909152156111fa579392505050565b6111a8565b604051636f96cda160e11b815260040160405180910390fd5b6107ca838383600161140c565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061125a903390899088908890600401611bd6565b6020604051808303816000875af1925050508015611295575060408051601f3d908101601f1916820190925261129291810190611c13565b60015b6112f0573d8080156112c3576040519150601f19603f3d011682016040523d82523d6000602084013e6112c8565b606091505b5080516112e8576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816113325750506040805180820190915260018152600360fc1b602082015290565b8160005b811561135c578061134681611bbb565b91506113559050600a83611c46565b9150611336565b60008167ffffffffffffffff81111561137757611377611894565b6040519080825280601f01601f1916602001820160405280156113a1576020820181803683370190505b5090505b8415611306576113b6600183611c5a565b91506113c3600a86611c71565b6113ce906030611a97565b60f81b8183815181106113e3576113e3611ba5565b60200101906001600160f81b031916908160001a905350611405600a86611c46565b94506113a5565b6000546001600160a01b03851661143557604051622e076360e81b815260040160405180910390fd5b836114535760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260046020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600390925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561150557506001600160a01b0387163b15155b1561158e575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46115566000888480600101955088611225565b611573576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561150b57826000541461158957600080fd5b6115f5565b5b6001600160a01b038716600081815260076020908152604080832080546001818101835591855292842090920186905551908501949291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082141561158f575b50600055611128565b82805461160a90611a46565b90600052602060002090601f01602090048101928261162c5760008555611672565b82601f1061164557805160ff1916838001178555611672565b82800160010185558215611672579182015b82811115611672578251825591602001919060010190611657565b5061167e929150611682565b5090565b5b8082111561167e5760008155600101611683565b6001600160e01b03198116811461066857600080fd5b6000602082840312156116bf57600080fd5b81356116ca81611697565b9392505050565b60005b838110156116ec5781810151838201526020016116d4565b83811115610d135750506000910152565b600081518084526117158160208601602086016116d1565b601f01601f19169290920160200192915050565b6020815260006116ca60208301846116fd565b60006020828403121561174e57600080fd5b5035919050565b80356001600160a01b038116811461176c57600080fd5b919050565b6000806040838503121561178457600080fd5b61178d83611755565b946020939093013593505050565b6000806000606084860312156117b057600080fd5b6117b984611755565b92506117c760208501611755565b9150604084013590509250925092565b6000602082840312156117e957600080fd5b6116ca82611755565b6020808252825182820181905260009190848201906040850190845b8181101561182a5783518352928401929184019160010161180e565b50909695505050505050565b8035801515811461176c57600080fd5b60006020828403121561185857600080fd5b6116ca82611836565b6000806040838503121561187457600080fd5b61187d83611755565b915061188b60208401611836565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156118c5576118c5611894565b604051601f8501601f19908116603f011681019082821181831017156118ed576118ed611894565b8160405280935085815286868601111561190657600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561193257600080fd5b813567ffffffffffffffff81111561194957600080fd5b8201601f8101841361195a57600080fd5b611306848235602084016118aa565b6000806000806080858703121561197f57600080fd5b61198885611755565b935061199660208601611755565b925060408501359150606085013567ffffffffffffffff8111156119b957600080fd5b8501601f810187136119ca57600080fd5b6119d9878235602084016118aa565b91505092959194509250565b600080604083850312156119f857600080fd5b611a0183611755565b915061188b60208401611755565b60208082526017908201527f4f6e6c792041646d696e2063616e206163742068657265000000000000000000604082015260600190565b600181811c90821680611a5a57607f821691505b60208210811415611a7b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115611aaa57611aaa611a81565b500190565b6000816000190483118215151615611ac957611ac9611a81565b500290565b60008151611ae08185602086016116d1565b9290920192915050565b600080845481600182811c915080831680611b0657607f831692505b6020808410821415611b2657634e487b7160e01b86526022600452602486fd5b818015611b3a5760018114611b4b57611b78565b60ff19861689528489019650611b78565b60008b81526020902060005b86811015611b705781548b820152908501908301611b57565b505084890196505b505050505050611b9c611b8b8286611ace565b64173539b7b760d91b815260050190565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415611bcf57611bcf611a81565b5060010190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611c09908301846116fd565b9695505050505050565b600060208284031215611c2557600080fd5b81516116ca81611697565b634e487b7160e01b600052601260045260246000fd5b600082611c5557611c55611c30565b500490565b600082821015611c6c57611c6c611a81565b500390565b600082611c8057611c80611c30565b50069056fea2646970667358221220355a3f233a2fb1c0da5fdbeef23521d3c820941f9a071e8a61a3d31e04932fb964736f6c634300080a0033

Deployed Bytecode Sourcemap

45019:124:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24744:305;;;;;;;;;;-1:-1:-1;24744:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;24744:305:0;;;;;;;;23189:35;;;;;;;;;;-1:-1:-1;23189:35:0;;;;;;;;44019:160;;;;;;;;;;;;;:::i;:::-;;27873:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29398:204::-;;;;;;;;;;-1:-1:-1;29398:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1714:32:1;;;1696:51;;1684:2;1669:18;29398:204:0;1550:203:1;28961:371:0;;;;;;;;;;-1:-1:-1;28961:371:0;;;;;:::i;:::-;;:::i;23991:305::-;;;;;;;;;;-1:-1:-1;24035:7:0;24229:13;-1:-1:-1;;24229:32:0;23991:305;;;2341:25:1;;;2329:2;2314:18;23991:305:0;2195:177:1;30263:170:0;;;;;;;;;;-1:-1:-1;30263:170:0;;;;;:::i;:::-;;:::i;44689:166::-;;;;;;;;;;-1:-1:-1;44689:166:0;;;;;:::i;:::-;;:::i;23278:32::-;;;;;;;;;;;;;;;;44863:149;;;;;;;;;;-1:-1:-1;44863:149:0;;;;;:::i;:::-;;:::i;30504:185::-;;;;;;;;;;-1:-1:-1;30504:185:0;;;;;:::i;:::-;;:::i;44532:149::-;;;;;;;;;;-1:-1:-1;44532:149:0;;;;;:::i;:::-;;:::i;43082:134::-;;;;;;;;;;-1:-1:-1;43082:134:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27681:125::-;;;;;;;;;;-1:-1:-1;27681:125:0;;;;;:::i;:::-;;:::i;44195:149::-;;;;;;;;;;-1:-1:-1;44195:149:0;;;;;:::i;:::-;;:::i;23317:80::-;;;;;;;;;;;;;:::i;43267:498::-;;;;;;:::i;:::-;;:::i;25113:206::-;;;;;;;;;;-1:-1:-1;25113:206:0;;;;;:::i;:::-;;:::i;23141:39::-;;;;;;;;;;;;;;;;28042:104;;;;;;;;;;;;;:::i;44360:164::-;;;;;;;;;;-1:-1:-1;44360:164:0;;;;;:::i;:::-;;:::i;29674:287::-;;;;;;;;;;-1:-1:-1;29674:287:0;;;;;:::i;:::-;;:::i;43806:205::-;;;;;;;;;;-1:-1:-1;43806:205:0;;;;;:::i;:::-;;:::i;30760:369::-;;;;;;;;;;-1:-1:-1;30760:369:0;;;;;:::i;:::-;;:::i;23093:35::-;;;;;;;;;;-1:-1:-1;23093:35:0;;;;-1:-1:-1;;;;;23093:35:0;;;28217:329;;;;;;;;;;-1:-1:-1;28217:329:0;;;;;:::i;:::-;;:::i;23237:31::-;;;;;;;;;;;;;;;;30032:164;;;;;;;;;;-1:-1:-1;30032:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;30153:25:0;;;30129:4;30153:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30032:164;23066:20;;;;;;;;;;-1:-1:-1;23066:20:0;;;;-1:-1:-1;;;;;23066:20:0;;;24744:305;24846:4;-1:-1:-1;;;;;;24883:40:0;;-1:-1:-1;;;24883:40:0;;:105;;-1:-1:-1;;;;;;;24940:48:0;;-1:-1:-1;;;24940:48:0;24883:105;:158;;;-1:-1:-1;;;;;;;;;;14363:40:0;;;25005:36;24863:178;24744:305;-1:-1:-1;;24744:305:0:o;44019:160::-;44083:5;;-1:-1:-1;;;;;44083:5:0;44069:10;:19;44061:55;;;;-1:-1:-1;;;44061:55:0;;;;;;;:::i;:::-;;;;;;;;;44127:12;;:44;;-1:-1:-1;;;;;44127:12:0;;;;44149:21;44127:44;;;;;:12;:44;:12;:44;44149:21;44127:12;:44;;;;;;;;;;;;;;;;;;;;;44019:160::o;27873:100::-;27927:13;27960:5;27953:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27873:100;:::o;29398:204::-;29466:7;29491:16;29499:7;29491;:16::i;:::-;29486:64;;29516:34;;-1:-1:-1;;;29516:34:0;;;;;;;;;;;29486:64;-1:-1:-1;29570:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29570:24:0;;29398:204::o;28961:371::-;29034:13;29050:24;29066:7;29050:15;:24::i;:::-;29034:40;;29095:5;-1:-1:-1;;;;;29089:11:0;:2;-1:-1:-1;;;;;29089:11:0;;29085:48;;;29109:24;;-1:-1:-1;;;29109:24:0;;;;;;;;;;;29085:48;2918:10;-1:-1:-1;;;;;29150:21:0;;;;;;:63;;-1:-1:-1;29176:37:0;29193:5;2918:10;30032:164;:::i;29176:37::-;29175:38;29150:63;29146:138;;;29237:35;;-1:-1:-1;;;29237:35:0;;;;;;;;;;;29146:138;29296:28;29305:2;29309:7;29318:5;29296:8;:28::i;:::-;29023:309;28961:371;;:::o;30263:170::-;30397:28;30407:4;30413:2;30417:7;30397:9;:28::i;44689:166::-;44772:5;;-1:-1:-1;;;;;44772:5:0;44758:10;:19;44750:54;;;;-1:-1:-1;;;44750:54:0;;;;;;;:::i;:::-;44815:12;:32;;-1:-1:-1;;;;;;44815:32:0;-1:-1:-1;;;;;44815:32:0;;;;;;;;;;44689:166::o;44863:149::-;44945:5;;-1:-1:-1;;;;;44945:5:0;44931:10;:19;44923:54;;;;-1:-1:-1;;;44923:54:0;;;;;;;:::i;:::-;44988:5;:16;;-1:-1:-1;;;;;;44988:16:0;-1:-1:-1;;;;;44988:16:0;;;;;;;;;;44863:149::o;30504:185::-;30642:39;30659:4;30665:2;30669:7;30642:39;;;;;;;;;;;;:16;:39::i;44532:149::-;44611:5;;-1:-1:-1;;;;;44611:5:0;44597:10;:19;44589:54;;;;-1:-1:-1;;;44589:54:0;;;;;;;:::i;:::-;44654:12;:19;44532:149::o;43082:134::-;-1:-1:-1;;;;;43188:23:0;;;;;;:15;:23;;;;;;;;;43181:30;;;;;;;;;;;;;;;;;43156:17;;43181:30;;;43188:23;43181:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43082:134;;;:::o;27681:125::-;27745:7;27772:21;27785:7;27772:12;:21::i;:::-;:26;;27681:125;-1:-1:-1;;27681:125:0:o;44195:149::-;44274:5;;-1:-1:-1;;;;;44274:5:0;44260:10;:19;44252:54;;;;-1:-1:-1;;;44252:54:0;;;;;;;:::i;:::-;44317:10;:19;44195:149::o;23317:80::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43267:498::-;43437:10;;43336:12;;43378:9;;43422:10;43407:13;24035:7;24229:13;-1:-1:-1;;24229:32:0;;23991:305;43407:13;:26;;;;:::i;:::-;:40;;43399:84;;;;-1:-1:-1;;;43399:84:0;;7737:2:1;43399:84:0;;;7719:21:1;;;7756:18;;;7749:30;7815:34;7795:18;;;7788:62;7867:18;;43399:84:0;7535:356:1;43399:84:0;43518:12;;43504:10;:26;;43495:66;;;;-1:-1:-1;;;43495:66:0;;8098:2:1;43495:66:0;;;8080:21:1;8137:2;8117:18;;;8110:30;8176:28;8156:18;;;8149:56;8222:18;;43495:66:0;7896:350:1;43495:66:0;43604:10;43591;;:23;;;;:::i;:::-;43581:6;:33;;:56;;;-1:-1:-1;43618:5:0;;-1:-1:-1;;;;;43618:5:0;43627:10;43618:19;43581:56;43573:103;;;;-1:-1:-1;;;43573:103:0;;8626:2:1;43573:103:0;;;8608:21:1;8665:2;8645:18;;;8638:30;8704:34;8684:18;;;8677:62;-1:-1:-1;;;8755:18:1;;;8748:32;8797:19;;43573:103:0;8424:398:1;43573:103:0;43689:35;43699:10;43710;43689:35;;;;;;;;;;;;:9;:35::i;:::-;-1:-1:-1;43753:4:0;;43267:498;-1:-1:-1;;43267:498:0:o;25113:206::-;25177:7;-1:-1:-1;;;;;25201:19:0;;25197:60;;25229:28;;-1:-1:-1;;;25229:28:0;;;;;;;;;;;25197:60;-1:-1:-1;;;;;;25283:19:0;;;;;:12;:19;;;;;:27;;;;25113:206::o;28042:104::-;28098:13;28131:7;28124:14;;;;;:::i;44360:164::-;44445:5;;-1:-1:-1;;;;;44445:5:0;44431:10;:19;44423:54;;;;-1:-1:-1;;;44423:54:0;;;;;;;:::i;:::-;44488:16;:28;;-1:-1:-1;;44488:28:0;;;;;;;;;;44360:164::o;29674:287::-;-1:-1:-1;;;;;29773:24:0;;2918:10;29773:24;29769:54;;;29806:17;;-1:-1:-1;;;29806:17:0;;;;;;;;;;;29769:54;2918:10;29836:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;29836:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;29836:53:0;;;;;;;;;;29905:48;;540:41:1;;;29836:42:0;;2918:10;29905:48;;513:18:1;29905:48:0;;;;;;;29674:287;;:::o;43806:205::-;43920:5;;43874:12;;-1:-1:-1;;;;;43920:5:0;43906:10;:19;43898:54;;;;-1:-1:-1;;;43898:54:0;;;;;;;:::i;:::-;43963:18;;;;:7;;:18;;;;;:::i;30760:369::-;30927:28;30937:4;30943:2;30947:7;30927:9;:28::i;:::-;-1:-1:-1;;;;;30970:13:0;;4549:19;:23;;30970:76;;;;;30990:56;31021:4;31027:2;31031:7;31040:5;30990:30;:56::i;:::-;30989:57;30970:76;30966:156;;;31070:40;;-1:-1:-1;;;31070:40:0;;;;;;;;;;;30966:156;30760:369;;;;:::o;28217:329::-;28290:13;28321:16;28329:7;28321;:16::i;:::-;28316:59;;28346:29;;-1:-1:-1;;;28346:29:0;;;;;;;;;;;28316:59;28448:7;28442:21;;;;;:::i;:::-;:26;;;-1:-1:-1;28442:96:0;;;;;;;;;;;;;;;;;28495:7;28504:18;:7;:16;:18::i;:::-;28478:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28435:103;28217:329;-1:-1:-1;;28217:329:0:o;31384:177::-;31441:4;31484:7;23848:1;31465:26;;:53;;;;-1:-1:-1;;31505:13:0;;-1:-1:-1;31495:23:0;31384:177::o;40032:196::-;40147:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;40147:29:0;-1:-1:-1;;;;;40147:29:0;;;;;;;;;40192:28;;40147:24;;40192:28;;;;;;;40032:196;;;:::o;34572:2533::-;34696:16;;;;34695:17;;:34;;-1:-1:-1;34724:5:0;;-1:-1:-1;;;;;34716:13:0;;;34724:5;;34716:13;34695:34;34687:73;;;;-1:-1:-1;;;34687:73:0;;10769:2:1;34687:73:0;;;10751:21:1;10808:2;10788:18;;;10781:30;10847:29;10827:18;;;10820:57;10894:18;;34687:73:0;10567:351:1;34687:73:0;34771:35;34809:21;34822:7;34809:12;:21::i;:::-;34771:59;;34869:4;-1:-1:-1;;;;;34847:26:0;:13;:18;;;-1:-1:-1;;;;;34847:26:0;;34843:67;;34882:28;;-1:-1:-1;;;34882:28:0;;;;;;;;;;;34843:67;34923:22;2918:10;-1:-1:-1;;;;;34949:20:0;;;;:73;;-1:-1:-1;34986:36:0;35003:4;2918:10;30032:164;:::i;34986:36::-;34949:126;;;-1:-1:-1;2918:10:0;35039:20;35051:7;35039:11;:20::i;:::-;-1:-1:-1;;;;;35039:36:0;;34949:126;34923:153;;35094:17;35089:66;;35120:35;;-1:-1:-1;;;35120:35:0;;;;;;;;;;;35089:66;-1:-1:-1;;;;;35170:16:0;;35166:52;;35195:23;;-1:-1:-1;;;35195:23:0;;;;;;;;;;;35166:52;35339:35;35356:1;35360:7;35369:4;35339:8;:35::i;:::-;-1:-1:-1;;;;;35670:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;35670:31:0;;;;;;;-1:-1:-1;;35670:31:0;;;;;;;35716:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;35716:29:0;;;;;;;;;;;35796:20;;;:11;:20;;;;;;35831:18;;-1:-1:-1;;;;;;35864:49:0;;;;-1:-1:-1;;;35897:15:0;35864:49;;;;;;;;;;36187:11;;36247:24;;;;;36290:13;;35796:20;;36247:24;;36290:13;36286:384;;36500:13;;36485:11;:28;36481:174;;36538:20;;36607:28;;;;36581:54;;-1:-1:-1;;;36581:54:0;-1:-1:-1;;;;;;36581:54:0;;;-1:-1:-1;;;;;36538:20:0;;36581:54;;;;36481:174;35645:1036;;;36739:10;36735:221;-1:-1:-1;;;;;36762:21:0;;;;;;:15;:21;;;;;:28;36754:36;;36735:221;;;-1:-1:-1;;;;;36817:21:0;;;;;;:15;:21;;;;;:28;;36847:7;;36817:21;36839:5;;36817:28;;;;;;:::i;:::-;;;;;;;;;:37;36814:131;;;-1:-1:-1;;;;;36877:21:0;;;;;;:15;:21;;;;;:28;;36899:5;;36877:28;;;;;;:::i;:::-;;;;;;;;;36870:35;36924:5;;36814:131;36791:7;;;;:::i;:::-;;;;36735:221;;;-1:-1:-1;;;;;;36966:19:0;;;;;;;:15;:19;;;;;;;;:33;;;;;;;;;;;;;;;;;;;37017:27;36991:7;;37017:27;;;;;;37055:42;34676:2429;;34572:2533;;;:::o;26506:1113::-;-1:-1:-1;;;;;;;;;;;;;;;;;26617:7:0;;23848:1;26666:23;;:47;;;;;26700:13;;26693:4;:20;26666:47;26662:890;;;26734:31;26768:17;;;:11;:17;;;;;;;;;26734:51;;;;;;;;;-1:-1:-1;;;;;26734:51:0;;;;;-1:-1:-1;;;26734:51:0;;;;;;;;;;;;26856:28;26852:101;;26920:9;26506:1113;-1:-1:-1;;;26506:1113:0:o;26852:101::-;-1:-1:-1;;;27295:6:0;27340:17;;;;:11;:17;;;;;;;;;27328:29;;;;;;;;;-1:-1:-1;;;;;27328:29:0;;;;;-1:-1:-1;;;27328:29:0;;;;;;;;;;;;27388:28;27384:109;;27456:9;26506:1113;-1:-1:-1;;;26506:1113:0:o;27384:109::-;27255:261;;26662:890;27580:31;;-1:-1:-1;;;27580:31:0;;;;;;;;;;;32036:163;32159:32;32165:2;32169:8;32179:5;32186:4;32159:5;:32::i;40720:667::-;40904:72;;-1:-1:-1;;;40904:72:0;;40883:4;;-1:-1:-1;;;;;40904:36:0;;;;;:72;;2918:10;;40955:4;;40961:7;;40970:5;;40904:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40904:72:0;;;;;;;;-1:-1:-1;;40904:72:0;;;;;;;;;;;;:::i;:::-;;;40900:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41138:13:0;;41134:235;;41184:40;;-1:-1:-1;;;41184:40:0;;;;;;;;;;;41134:235;41327:6;41321:13;41312:6;41308:2;41304:15;41297:38;40900:480;-1:-1:-1;;;;;;41023:55:0;-1:-1:-1;;;41023:55:0;;-1:-1:-1;40900:480:0;40720:667;;;;;;:::o;427:723::-;483:13;704:10;700:53;;-1:-1:-1;;731:10:0;;;;;;;;;;;;-1:-1:-1;;;731:10:0;;;;;427:723::o;700:53::-;778:5;763:12;819:78;826:9;;819:78;;852:8;;;;:::i;:::-;;-1:-1:-1;875:10:0;;-1:-1:-1;883:2:0;875:10;;:::i;:::-;;;819:78;;;907:19;939:6;929:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;929:17:0;;907:39;;957:154;964:10;;957:154;;991:11;1001:1;991:11;;:::i;:::-;;-1:-1:-1;1060:10:0;1068:2;1060:5;:10;:::i;:::-;1047:24;;:2;:24;:::i;:::-;1034:39;;1017:6;1024;1017:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1017:56:0;;;;;;;;-1:-1:-1;1088:11:0;1097:2;1088:11;;:::i;:::-;;;957:154;;32458:1860;32597:20;32620:13;-1:-1:-1;;;;;32648:16:0;;32644:48;;32673:19;;-1:-1:-1;;;32673:19:0;;;;;;;;;;;32644:48;32707:13;32703:44;;32729:18;;-1:-1:-1;;;32729:18:0;;;;;;;;;;;32703:44;-1:-1:-1;;;;;33098:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;33157:49:0;;33098:44;;;;;;;;33157:49;;;;-1:-1:-1;;33098:44:0;;;;;;33157:49;;;;;;;;;;;;;;;;33223:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;33273:66:0;;;;-1:-1:-1;;;33323:15:0;33273:66;;;;;;;;;;33223:25;33420:23;;;33464:4;:23;;;;-1:-1:-1;;;;;;33472:13:0;;4549:19;:23;;33472:15;33460:726;;;33508:314;33539:38;;33564:12;;-1:-1:-1;;;;;33539:38:0;;;33556:1;;33539:38;;33556:1;;33539:38;33605:69;33644:1;33648:2;33652:14;;;;;;33668:5;33605:30;:69::i;:::-;33600:174;;33710:40;;-1:-1:-1;;;33710:40:0;;;;;;;;;;;33600:174;33817:3;33801:12;:19;;33508:314;;33903:12;33886:13;;:29;33882:43;;33917:8;;;33882:43;33460:726;;;33966:205;-1:-1:-1;;;;;33994:19:0;;;;;;:15;:19;;;;;;;;:38;;;;;;;;;;;;;;;;;;;;34082:40;34107:14;;;;34019:12;33994:19;;34082:40;;33994:19;;34082:40;34166:3;34150:12;:19;;33966:205;;33460:726;-1:-1:-1;34200:13:0;:28;34250:60;30760:369;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:269::-;908:3;946:5;940:12;973:6;968:3;961:19;989:63;1045:6;1038:4;1033:3;1029:14;1022:4;1015:5;1011:16;989:63;:::i;:::-;1106:2;1085:15;-1:-1:-1;;1081:29:1;1072:39;;;;1113:4;1068:50;;855:269;-1:-1:-1;;855:269:1:o;1129:231::-;1278:2;1267:9;1260:21;1241:4;1298:56;1350:2;1339:9;1335:18;1327:6;1298:56;:::i;1365:180::-;1424:6;1477:2;1465:9;1456:7;1452:23;1448:32;1445:52;;;1493:1;1490;1483:12;1445:52;-1:-1:-1;1516:23:1;;1365:180;-1:-1:-1;1365:180:1:o;1758:173::-;1826:20;;-1:-1:-1;;;;;1875:31:1;;1865:42;;1855:70;;1921:1;1918;1911:12;1855:70;1758:173;;;:::o;1936:254::-;2004:6;2012;2065:2;2053:9;2044:7;2040:23;2036:32;2033:52;;;2081:1;2078;2071:12;2033:52;2104:29;2123:9;2104:29;:::i;:::-;2094:39;2180:2;2165:18;;;;2152:32;;-1:-1:-1;;;1936:254:1:o;2377:328::-;2454:6;2462;2470;2523:2;2511:9;2502:7;2498:23;2494:32;2491:52;;;2539:1;2536;2529:12;2491:52;2562:29;2581:9;2562:29;:::i;:::-;2552:39;;2610:38;2644:2;2633:9;2629:18;2610:38;:::i;:::-;2600:48;;2695:2;2684:9;2680:18;2667:32;2657:42;;2377:328;;;;;:::o;2710:186::-;2769:6;2822:2;2810:9;2801:7;2797:23;2793:32;2790:52;;;2838:1;2835;2828:12;2790:52;2861:29;2880:9;2861:29;:::i;2901:632::-;3072:2;3124:21;;;3194:13;;3097:18;;;3216:22;;;3043:4;;3072:2;3295:15;;;;3269:2;3254:18;;;3043:4;3338:169;3352:6;3349:1;3346:13;3338:169;;;3413:13;;3401:26;;3482:15;;;;3447:12;;;;3374:1;3367:9;3338:169;;;-1:-1:-1;3524:3:1;;2901:632;-1:-1:-1;;;;;;2901:632:1:o;3538:160::-;3603:20;;3659:13;;3652:21;3642:32;;3632:60;;3688:1;3685;3678:12;3703:180;3759:6;3812:2;3800:9;3791:7;3787:23;3783:32;3780:52;;;3828:1;3825;3818:12;3780:52;3851:26;3867:9;3851:26;:::i;3888:254::-;3953:6;3961;4014:2;4002:9;3993:7;3989:23;3985:32;3982:52;;;4030:1;4027;4020:12;3982:52;4053:29;4072:9;4053:29;:::i;:::-;4043:39;;4101:35;4132:2;4121:9;4117:18;4101:35;:::i;:::-;4091:45;;3888:254;;;;;:::o;4147:127::-;4208:10;4203:3;4199:20;4196:1;4189:31;4239:4;4236:1;4229:15;4263:4;4260:1;4253:15;4279:632;4344:5;4374:18;4415:2;4407:6;4404:14;4401:40;;;4421:18;;:::i;:::-;4496:2;4490:9;4464:2;4550:15;;-1:-1:-1;;4546:24:1;;;4572:2;4542:33;4538:42;4526:55;;;4596:18;;;4616:22;;;4593:46;4590:72;;;4642:18;;:::i;:::-;4682:10;4678:2;4671:22;4711:6;4702:15;;4741:6;4733;4726:22;4781:3;4772:6;4767:3;4763:16;4760:25;4757:45;;;4798:1;4795;4788:12;4757:45;4848:6;4843:3;4836:4;4828:6;4824:17;4811:44;4903:1;4896:4;4887:6;4879;4875:19;4871:30;4864:41;;;;4279:632;;;;;:::o;4916:451::-;4985:6;5038:2;5026:9;5017:7;5013:23;5009:32;5006:52;;;5054:1;5051;5044:12;5006:52;5094:9;5081:23;5127:18;5119:6;5116:30;5113:50;;;5159:1;5156;5149:12;5113:50;5182:22;;5235:4;5227:13;;5223:27;-1:-1:-1;5213:55:1;;5264:1;5261;5254:12;5213:55;5287:74;5353:7;5348:2;5335:16;5330:2;5326;5322:11;5287:74;:::i;5372:667::-;5467:6;5475;5483;5491;5544:3;5532:9;5523:7;5519:23;5515:33;5512:53;;;5561:1;5558;5551:12;5512:53;5584:29;5603:9;5584:29;:::i;:::-;5574:39;;5632:38;5666:2;5655:9;5651:18;5632:38;:::i;:::-;5622:48;;5717:2;5706:9;5702:18;5689:32;5679:42;;5772:2;5761:9;5757:18;5744:32;5799:18;5791:6;5788:30;5785:50;;;5831:1;5828;5821:12;5785:50;5854:22;;5907:4;5899:13;;5895:27;-1:-1:-1;5885:55:1;;5936:1;5933;5926:12;5885:55;5959:74;6025:7;6020:2;6007:16;6002:2;5998;5994:11;5959:74;:::i;:::-;5949:84;;;5372:667;;;;;;;:::o;6268:260::-;6336:6;6344;6397:2;6385:9;6376:7;6372:23;6368:32;6365:52;;;6413:1;6410;6403:12;6365:52;6436:29;6455:9;6436:29;:::i;:::-;6426:39;;6484:38;6518:2;6507:9;6503:18;6484:38;:::i;6533:347::-;6735:2;6717:21;;;6774:2;6754:18;;;6747:30;6813:25;6808:2;6793:18;;6786:53;6871:2;6856:18;;6533:347::o;6885:380::-;6964:1;6960:12;;;;7007;;;7028:61;;7082:4;7074:6;7070:17;7060:27;;7028:61;7135:2;7127:6;7124:14;7104:18;7101:38;7098:161;;;7181:10;7176:3;7172:20;7169:1;7162:31;7216:4;7213:1;7206:15;7244:4;7241:1;7234:15;7098:161;;6885:380;;;:::o;7270:127::-;7331:10;7326:3;7322:20;7319:1;7312:31;7362:4;7359:1;7352:15;7386:4;7383:1;7376:15;7402:128;7442:3;7473:1;7469:6;7466:1;7463:13;7460:39;;;7479:18;;:::i;:::-;-1:-1:-1;7515:9:1;;7402:128::o;8251:168::-;8291:7;8357:1;8353;8349:6;8345:14;8342:1;8339:21;8334:1;8327:9;8320:17;8316:45;8313:71;;;8364:18;;:::i;:::-;-1:-1:-1;8404:9:1;;8251:168::o;8953:185::-;8995:3;9033:5;9027:12;9048:52;9093:6;9088:3;9081:4;9074:5;9070:16;9048:52;:::i;:::-;9116:16;;;;;8953:185;-1:-1:-1;;8953:185:1:o;9261:1301::-;9538:3;9567:1;9600:6;9594:13;9630:3;9652:1;9680:9;9676:2;9672:18;9662:28;;9740:2;9729:9;9725:18;9762;9752:61;;9806:4;9798:6;9794:17;9784:27;;9752:61;9832:2;9880;9872:6;9869:14;9849:18;9846:38;9843:165;;;-1:-1:-1;;;9907:33:1;;9963:4;9960:1;9953:15;9993:4;9914:3;9981:17;9843:165;10024:18;10051:104;;;;10169:1;10164:320;;;;10017:467;;10051:104;-1:-1:-1;;10084:24:1;;10072:37;;10129:16;;;;-1:-1:-1;10051:104:1;;10164:320;8900:1;8893:14;;;8937:4;8924:18;;10259:1;10273:165;10287:6;10284:1;10281:13;10273:165;;;10365:14;;10352:11;;;10345:35;10408:16;;;;10302:10;;10273:165;;;10277:3;;10467:6;10462:3;10458:16;10451:23;;10017:467;;;;;;;10500:56;10525:30;10551:3;10543:6;10525:30;:::i;:::-;-1:-1:-1;;;9203:20:1;;9248:1;9239:11;;9143:113;10500:56;10493:63;9261:1301;-1:-1:-1;;;;;9261:1301:1:o;10923:127::-;10984:10;10979:3;10975:20;10972:1;10965:31;11015:4;11012:1;11005:15;11039:4;11036:1;11029:15;11055:135;11094:3;-1:-1:-1;;11115:17:1;;11112:43;;;11135:18;;:::i;:::-;-1:-1:-1;11182:1:1;11171:13;;11055:135::o;11195:500::-;-1:-1:-1;;;;;11464:15:1;;;11446:34;;11516:15;;11511:2;11496:18;;11489:43;11563:2;11548:18;;11541:34;;;11611:3;11606:2;11591:18;;11584:31;;;11389:4;;11632:57;;11669:19;;11661:6;11632:57;:::i;:::-;11624:65;11195:500;-1:-1:-1;;;;;;11195:500:1:o;11700:249::-;11769:6;11822:2;11810:9;11801:7;11797:23;11793:32;11790:52;;;11838:1;11835;11828:12;11790:52;11870:9;11864:16;11889:30;11913:5;11889:30;:::i;11954:127::-;12015:10;12010:3;12006:20;12003:1;11996:31;12046:4;12043:1;12036:15;12070:4;12067:1;12060:15;12086:120;12126:1;12152;12142:35;;12157:18;;:::i;:::-;-1:-1:-1;12191:9:1;;12086:120::o;12211:125::-;12251:4;12279:1;12276;12273:8;12270:34;;;12284:18;;:::i;:::-;-1:-1:-1;12321:9:1;;12211:125::o;12341:112::-;12373:1;12399;12389:35;;12404:18;;:::i;:::-;-1:-1:-1;12438:9:1;;12341:112::o

Swarm Source

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