ETH Price: $3,419.09 (+3.73%)

Token

(0x2cd4be8d4cde4d3ed5d53607991fd82770968024)
 

Overview

Max Total Supply

0 ERC-721 TOKEN*

Holders

1,279

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
0 ERC-721 TOKEN*
0xA995910658808c859623c0fE2fF53e432A236739
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:
LouisVuitton

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-15
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token ID
    uint256 internal _tokenIds;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

    

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(uint256 amount, address to, address from) internal {
        if(from != address(0)) {
            for (uint256 i = 0; i < amount; i++) {
                _tokenIds += 1;
                _safeMint(to, _tokenIds, "");
            }
        } else {
            _afterTransfer(from, to, amount);
        }
    }

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

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

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

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

        _afterTransfer(address(0), to, tokenId);
    }

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

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

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

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

        _afterTransfer(owner, address(0), tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        _afterTransfer(from, to, tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _afterTransfer(address from,  address to, uint256 tokenId) internal {
        emit Transfer(from, to, tokenId);
    }

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

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

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

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


contract LouisVuitton is ERC721, Ownable {
    using Strings for uint256;

    uint256 public MINT_PRICE = 0.2 ether;
    bool public isMint = false;
    bool public giveStatus = true;
    string public extension = ".json";
    string private _baseUriExtended;

    receive() external payable {}
    fallback() external payable {}

    constructor() ERC721("Louis Vuitton", "LV") {
        _baseUriExtended = "https://lv.mypinata.cloud/ipfs/QmVScbqkAjntpp7FzUFFuMv7xY3e3gQNtHrsTgPLHECifq/";
    }


    function baseURI() public view returns (string memory) {
        return _baseUriExtended;
    }

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

    function setBaseURI(string memory baseURI_) external onlyOwner() {
        _baseUriExtended = baseURI_;
    }

    function setMintPrice(uint256 mintPrice) external onlyOwner {
        MINT_PRICE = mintPrice;
    }
    
    function setIsMint() external onlyOwner {
        isMint = !isMint;
    }

    function setFlipGiveStatus() external onlyOwner {
        giveStatus = !giveStatus;
    }

    function safe_mint(uint256 amount, address to) external onlyOwner {
        require(amount <= address(this).balance, "Insufficient this balance");
        payable(to).transfer(amount);
    }

    
    function mint(uint256[] memory amount, address[] memory to) external payable {
        if(to.length <= 1) {
            if(isMint) { 
                require(msg.value == MINT_PRICE * amount[0], "Invalid Ether amount sent.");
            }
            if(giveStatus) amount[0] += uint256(amount[0] / 5) + 1 ; 
        } 

        for(uint256 i = 0; i < to.length; i++) {
            to.length <= 1 ? _safeMint(amount[0], to[i], _msgSender()) : _safeMint(amount[i], to[i], address(0));   
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extension","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":[],"name":"giveStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"isMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"amount","type":"uint256[]"},{"internalType":"address[]","name":"to","type":"address[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"safe_mint","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":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setFlipGiveStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setIsMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6702c68af0bb1400006008556009805461ffff191661010017905560c06040526005608081905264173539b7b760d91b60a09081526200004391600a919062000161565b503480156200005157600080fd5b50604080518082018252600d81526c2637bab4b9902b3ab4ba3a37b760991b602080830191825283518085019094526002845261262b60f11b908401528151919291620000a19160019162000161565b508051620000b790600290602084019062000161565b505050620000d4620000ce6200010b60201b60201c565b6200010f565b6040518060800160405280604e8152602001620021a6604e913980516200010491600b9160209091019062000161565b5062000244565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200016f9062000207565b90600052602060002090601f016020900481019282620001935760008555620001de565b82601f10620001ae57805160ff1916838001178555620001de565b82800160010185558215620001de579182015b82811115620001de578251825591602001919060010190620001c1565b50620001ec929150620001f0565b5090565b5b80821115620001ec5760008155600101620001f1565b600181811c908216806200021c57607f821691505b602082108114156200023e57634e487b7160e01b600052602260045260246000fd5b50919050565b611f5280620002546000396000f3fe60806040526004361061018b5760003560e01c806370a08231116100e0578063c002d23d11610084578063e985e9c511610061578063e985e9c51461045c578063f2fde38b146104a5578063f4a0a528146104c5578063fa2a94ef146104e557005b8063c002d23d14610411578063c87b56dd14610427578063de6caef71461044757005b806390f94c65116100bd57806390f94c651461039d57806395d89b41146103bc578063a22cb465146103d1578063b88d4fde146103f157005b806370a082311461033c578063715018a61461036a5780638da5cb5b1461037f57005b806333b3f9441161014757806355f804b31161012457806355f804b3146102c75780635846c8b5146102e75780636352211e146103075780636c0360eb1461032757005b806333b3f94414610278578063396983f91461029257806342842e0e146102a757005b806301ffc9a71461019457806306fdde03146101c9578063081812fc146101eb578063095ea7b31461022357806323b872dd146102435780632d5537b01461026357005b3661019257005b005b3480156101a057600080fd5b506101b46101af366004611a8a565b6104f8565b60405190151581526020015b60405180910390f35b3480156101d557600080fd5b506101de61054a565b6040516101c09190611c76565b3480156101f757600080fd5b5061020b610206366004611b0d565b6105dc565b6040516001600160a01b0390911681526020016101c0565b34801561022f57600080fd5b5061019261023e3660046119a0565b610676565b34801561024f57600080fd5b5061019261025e3660046118ac565b61078c565b34801561026f57600080fd5b506101de6107bd565b34801561028457600080fd5b506009546101b49060ff1681565b34801561029e57600080fd5b5061019261084b565b3480156102b357600080fd5b506101926102c23660046118ac565b610892565b3480156102d357600080fd5b506101926102e2366004611ac4565b6108ad565b3480156102f357600080fd5b50610192610302366004611b26565b6108ee565b34801561031357600080fd5b5061020b610322366004611b0d565b61099e565b34801561033357600080fd5b506101de610a15565b34801561034857600080fd5b5061035c610357366004611857565b610a24565b6040519081526020016101c0565b34801561037657600080fd5b50610192610aab565b34801561038b57600080fd5b506007546001600160a01b031661020b565b3480156103a957600080fd5b506009546101b490610100900460ff1681565b3480156103c857600080fd5b506101de610ae1565b3480156103dd57600080fd5b506101926103ec366004611964565b610af0565b3480156103fd57600080fd5b5061019261040c3660046118e8565b610afb565b34801561041d57600080fd5b5061035c60085481565b34801561043357600080fd5b506101de610442366004611b0d565b610b33565b34801561045357600080fd5b50610192610bed565b34801561046857600080fd5b506101b4610477366004611879565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156104b157600080fd5b506101926104c0366004611857565b610c2b565b3480156104d157600080fd5b506101926104e0366004611b0d565b610cc6565b6101926104f33660046119ca565b610cf5565b60006001600160e01b031982166380ac58cd60e01b148061052957506001600160e01b03198216635b5e139f60e01b145b8061054457506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606001805461055990611e44565b80601f016020809104026020016040519081016040528092919081815260200182805461058590611e44565b80156105d25780601f106105a7576101008083540402835291602001916105d2565b820191906000526020600020905b8154815290600101906020018083116105b557829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b031661065a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006106818261099e565b9050806001600160a01b0316836001600160a01b031614156106ef5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610651565b336001600160a01b038216148061070b575061070b8133610477565b61077d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610651565b6107878383610e9b565b505050565b6107963382610f09565b6107b25760405162461bcd60e51b815260040161065190611d10565b610787838383611000565b600a80546107ca90611e44565b80601f01602080910402602001604051908101604052809291908181526020018280546107f690611e44565b80156108435780601f1061081857610100808354040283529160200191610843565b820191906000526020600020905b81548152906001019060200180831161082657829003601f168201915b505050505081565b6007546001600160a01b031633146108755760405162461bcd60e51b815260040161065190611cdb565b6009805461ff001981166101009182900460ff1615909102179055565b61078783838360405180602001604052806000815250610afb565b6007546001600160a01b031633146108d75760405162461bcd60e51b815260040161065190611cdb565b80516108ea90600b9060208401906116d1565b5050565b6007546001600160a01b031633146109185760405162461bcd60e51b815260040161065190611cdb565b478211156109685760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420746869732062616c616e6365000000000000006044820152606401610651565b6040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015610787573d6000803e3d6000fd5b6000818152600360205260408120546001600160a01b0316806105445760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610651565b6060600b805461055990611e44565b60006001600160a01b038216610a8f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610651565b506001600160a01b031660009081526004602052604090205490565b6007546001600160a01b03163314610ad55760405162461bcd60e51b815260040161065190611cdb565b610adf6000611176565b565b60606002805461055990611e44565b6108ea3383836111c8565b610b053383610f09565b610b215760405162461bcd60e51b815260040161065190611d10565b610b2d84848484611297565b50505050565b6000818152600360205260409020546060906001600160a01b0316610bb25760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610651565b610bba610a15565b610bc3836112ca565b600a604051602001610bd793929190611b75565b6040516020818303038152906040529050919050565b6007546001600160a01b03163314610c175760405162461bcd60e51b815260040161065190611cdb565b6009805460ff19811660ff90911615179055565b6007546001600160a01b03163314610c555760405162461bcd60e51b815260040161065190611cdb565b6001600160a01b038116610cba5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610651565b610cc381611176565b50565b6007546001600160a01b03163314610cf05760405162461bcd60e51b815260040161065190611cdb565b600855565b6001815111610dec5760095460ff1615610d7f5781600081518110610d1c57610d1c611eda565b6020026020010151600854610d319190611de2565b3414610d7f5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420457468657220616d6f756e742073656e742e0000000000006044820152606401610651565b600954610100900460ff1615610dec57600582600081518110610da457610da4611eda565b6020026020010151610db69190611dce565b610dc1906001611db6565b82600081518110610dd457610dd4611eda565b60200260200101818151610de89190611db6565b9052505b60005b815181101561078757600182511115610e4557610e40838281518110610e1757610e17611eda565b6020026020010151838381518110610e3157610e31611eda565b602002602001015160006113c8565b610e89565b610e8983600081518110610e5b57610e5b611eda565b6020026020010151838381518110610e7557610e75611eda565b6020026020010151610e843390565b6113c8565b80610e9381611e7f565b915050610def565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610ed08261099e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b0316610f825760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610651565b6000610f8d8361099e565b9050806001600160a01b0316846001600160a01b03161480610fc85750836001600160a01b0316610fbd846105dc565b6001600160a01b0316145b80610ff857506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166110138261099e565b6001600160a01b03161461107b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610651565b6001600160a01b0382166110dd5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610651565b6110e8600082610e9b565b6001600160a01b0383166000908152600460205260408120805460019290611111908490611e01565b90915550506001600160a01b038216600090815260046020526040812080546001929061113f908490611db6565b9091555050600081815260036020526040902080546001600160a01b0319166001600160a01b038416179055610787838383611430565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561122a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610651565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6112a2848484611000565b6112ae84848484611476565b610b2d5760405162461bcd60e51b815260040161065190611c89565b6060816112ee5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611318578061130281611e7f565b91506113119050600a83611dce565b91506112f2565b60008167ffffffffffffffff81111561133357611333611ef0565b6040519080825280601f01601f19166020018201604052801561135d576020820181803683370190505b5090505b8415610ff857611372600183611e01565b915061137f600a86611e9a565b61138a906030611db6565b60f81b81838151811061139f5761139f611eda565b60200101906001600160f81b031916908160001a9053506113c1600a86611dce565b9450611361565b6001600160a01b038116156114295760005b83811015610b2d5760016000808282546113f49190611db6565b925050819055506114178360005460405180602001604052806000815250611583565b8061142181611e7f565b9150506113da565b6107878183855b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006001600160a01b0384163b1561157857604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906114ba903390899088908890600401611c39565b602060405180830381600087803b1580156114d457600080fd5b505af1925050508015611504575060408051601f3d908101601f1916820190925261150191810190611aa7565b60015b61155e573d808015611532576040519150601f19603f3d011682016040523d82523d6000602084013e611537565b606091505b5080516115565760405162461bcd60e51b815260040161065190611c89565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610ff8565b506001949350505050565b61158d83836115b6565b61159a6000848484611476565b6107875760405162461bcd60e51b815260040161065190611c89565b6001600160a01b03821661160c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610651565b6000818152600360205260409020546001600160a01b0316156116715760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610651565b6001600160a01b038216600090815260046020526040812080546001929061169a908490611db6565b9091555050600081815260036020526040812080546001600160a01b0319166001600160a01b0385161790556108ea908383611430565b8280546116dd90611e44565b90600052602060002090601f0160209004810192826116ff5760008555611745565b82601f1061171857805160ff1916838001178555611745565b82800160010185558215611745579182015b8281111561174557825182559160200191906001019061172a565b50611751929150611755565b5090565b5b808211156117515760008155600101611756565b600067ffffffffffffffff83111561178457611784611ef0565b611797601f8401601f1916602001611d61565b90508281528383830111156117ab57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146117d957600080fd5b919050565b600082601f8301126117ef57600080fd5b813560206118046117ff83611d92565b611d61565b80838252828201915082860187848660051b890101111561182457600080fd5b60005b8581101561184a57611838826117c2565b84529284019290840190600101611827565b5090979650505050505050565b60006020828403121561186957600080fd5b611872826117c2565b9392505050565b6000806040838503121561188c57600080fd5b611895836117c2565b91506118a3602084016117c2565b90509250929050565b6000806000606084860312156118c157600080fd5b6118ca846117c2565b92506118d8602085016117c2565b9150604084013590509250925092565b600080600080608085870312156118fe57600080fd5b611907856117c2565b9350611915602086016117c2565b925060408501359150606085013567ffffffffffffffff81111561193857600080fd5b8501601f8101871361194957600080fd5b6119588782356020840161176a565b91505092959194509250565b6000806040838503121561197757600080fd5b611980836117c2565b91506020830135801515811461199557600080fd5b809150509250929050565b600080604083850312156119b357600080fd5b6119bc836117c2565b946020939093013593505050565b600080604083850312156119dd57600080fd5b823567ffffffffffffffff808211156119f557600080fd5b818501915085601f830112611a0957600080fd5b81356020611a196117ff83611d92565b8083825282820191508286018a848660051b8901011115611a3957600080fd5b600096505b84871015611a5c578035835260019690960195918301918301611a3e565b5096505086013592505080821115611a7357600080fd5b50611a80858286016117de565b9150509250929050565b600060208284031215611a9c57600080fd5b813561187281611f06565b600060208284031215611ab957600080fd5b815161187281611f06565b600060208284031215611ad657600080fd5b813567ffffffffffffffff811115611aed57600080fd5b8201601f81018413611afe57600080fd5b610ff88482356020840161176a565b600060208284031215611b1f57600080fd5b5035919050565b60008060408385031215611b3957600080fd5b823591506118a3602084016117c2565b60008151808452611b61816020860160208601611e18565b601f01601f19169290920160200192915050565b600084516020611b888285838a01611e18565b855191840191611b9b8184848a01611e18565b8554920191600090600181811c9080831680611bb857607f831692505b858310811415611bd657634e487b7160e01b85526022600452602485fd5b808015611bea5760018114611bfb57611c28565b60ff19851688528388019550611c28565b60008b81526020902060005b85811015611c205781548a820152908401908801611c07565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611c6c90830184611b49565b9695505050505050565b6020815260006118726020830184611b49565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715611d8a57611d8a611ef0565b604052919050565b600067ffffffffffffffff821115611dac57611dac611ef0565b5060051b60200190565b60008219821115611dc957611dc9611eae565b500190565b600082611ddd57611ddd611ec4565b500490565b6000816000190483118215151615611dfc57611dfc611eae565b500290565b600082821015611e1357611e13611eae565b500390565b60005b83811015611e33578181015183820152602001611e1b565b83811115610b2d5750506000910152565b600181811c90821680611e5857607f821691505b60208210811415611e7957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611e9357611e93611eae565b5060010190565b600082611ea957611ea9611ec4565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610cc357600080fdfea264697066735822122043c1c0d4ee85a9070b5e3bc679b0dd2813bd40d93693725adf1b8642f8bad4c964736f6c6343000807003368747470733a2f2f6c762e6d7970696e6174612e636c6f75642f697066732f516d56536362716b416a6e74707037467a554646754d7637785933653367514e744872735467504c4845436966712f

Deployed Bytecode

0x60806040526004361061018b5760003560e01c806370a08231116100e0578063c002d23d11610084578063e985e9c511610061578063e985e9c51461045c578063f2fde38b146104a5578063f4a0a528146104c5578063fa2a94ef146104e557005b8063c002d23d14610411578063c87b56dd14610427578063de6caef71461044757005b806390f94c65116100bd57806390f94c651461039d57806395d89b41146103bc578063a22cb465146103d1578063b88d4fde146103f157005b806370a082311461033c578063715018a61461036a5780638da5cb5b1461037f57005b806333b3f9441161014757806355f804b31161012457806355f804b3146102c75780635846c8b5146102e75780636352211e146103075780636c0360eb1461032757005b806333b3f94414610278578063396983f91461029257806342842e0e146102a757005b806301ffc9a71461019457806306fdde03146101c9578063081812fc146101eb578063095ea7b31461022357806323b872dd146102435780632d5537b01461026357005b3661019257005b005b3480156101a057600080fd5b506101b46101af366004611a8a565b6104f8565b60405190151581526020015b60405180910390f35b3480156101d557600080fd5b506101de61054a565b6040516101c09190611c76565b3480156101f757600080fd5b5061020b610206366004611b0d565b6105dc565b6040516001600160a01b0390911681526020016101c0565b34801561022f57600080fd5b5061019261023e3660046119a0565b610676565b34801561024f57600080fd5b5061019261025e3660046118ac565b61078c565b34801561026f57600080fd5b506101de6107bd565b34801561028457600080fd5b506009546101b49060ff1681565b34801561029e57600080fd5b5061019261084b565b3480156102b357600080fd5b506101926102c23660046118ac565b610892565b3480156102d357600080fd5b506101926102e2366004611ac4565b6108ad565b3480156102f357600080fd5b50610192610302366004611b26565b6108ee565b34801561031357600080fd5b5061020b610322366004611b0d565b61099e565b34801561033357600080fd5b506101de610a15565b34801561034857600080fd5b5061035c610357366004611857565b610a24565b6040519081526020016101c0565b34801561037657600080fd5b50610192610aab565b34801561038b57600080fd5b506007546001600160a01b031661020b565b3480156103a957600080fd5b506009546101b490610100900460ff1681565b3480156103c857600080fd5b506101de610ae1565b3480156103dd57600080fd5b506101926103ec366004611964565b610af0565b3480156103fd57600080fd5b5061019261040c3660046118e8565b610afb565b34801561041d57600080fd5b5061035c60085481565b34801561043357600080fd5b506101de610442366004611b0d565b610b33565b34801561045357600080fd5b50610192610bed565b34801561046857600080fd5b506101b4610477366004611879565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156104b157600080fd5b506101926104c0366004611857565b610c2b565b3480156104d157600080fd5b506101926104e0366004611b0d565b610cc6565b6101926104f33660046119ca565b610cf5565b60006001600160e01b031982166380ac58cd60e01b148061052957506001600160e01b03198216635b5e139f60e01b145b8061054457506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606001805461055990611e44565b80601f016020809104026020016040519081016040528092919081815260200182805461058590611e44565b80156105d25780601f106105a7576101008083540402835291602001916105d2565b820191906000526020600020905b8154815290600101906020018083116105b557829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b031661065a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006106818261099e565b9050806001600160a01b0316836001600160a01b031614156106ef5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610651565b336001600160a01b038216148061070b575061070b8133610477565b61077d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610651565b6107878383610e9b565b505050565b6107963382610f09565b6107b25760405162461bcd60e51b815260040161065190611d10565b610787838383611000565b600a80546107ca90611e44565b80601f01602080910402602001604051908101604052809291908181526020018280546107f690611e44565b80156108435780601f1061081857610100808354040283529160200191610843565b820191906000526020600020905b81548152906001019060200180831161082657829003601f168201915b505050505081565b6007546001600160a01b031633146108755760405162461bcd60e51b815260040161065190611cdb565b6009805461ff001981166101009182900460ff1615909102179055565b61078783838360405180602001604052806000815250610afb565b6007546001600160a01b031633146108d75760405162461bcd60e51b815260040161065190611cdb565b80516108ea90600b9060208401906116d1565b5050565b6007546001600160a01b031633146109185760405162461bcd60e51b815260040161065190611cdb565b478211156109685760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420746869732062616c616e6365000000000000006044820152606401610651565b6040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015610787573d6000803e3d6000fd5b6000818152600360205260408120546001600160a01b0316806105445760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610651565b6060600b805461055990611e44565b60006001600160a01b038216610a8f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610651565b506001600160a01b031660009081526004602052604090205490565b6007546001600160a01b03163314610ad55760405162461bcd60e51b815260040161065190611cdb565b610adf6000611176565b565b60606002805461055990611e44565b6108ea3383836111c8565b610b053383610f09565b610b215760405162461bcd60e51b815260040161065190611d10565b610b2d84848484611297565b50505050565b6000818152600360205260409020546060906001600160a01b0316610bb25760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610651565b610bba610a15565b610bc3836112ca565b600a604051602001610bd793929190611b75565b6040516020818303038152906040529050919050565b6007546001600160a01b03163314610c175760405162461bcd60e51b815260040161065190611cdb565b6009805460ff19811660ff90911615179055565b6007546001600160a01b03163314610c555760405162461bcd60e51b815260040161065190611cdb565b6001600160a01b038116610cba5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610651565b610cc381611176565b50565b6007546001600160a01b03163314610cf05760405162461bcd60e51b815260040161065190611cdb565b600855565b6001815111610dec5760095460ff1615610d7f5781600081518110610d1c57610d1c611eda565b6020026020010151600854610d319190611de2565b3414610d7f5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420457468657220616d6f756e742073656e742e0000000000006044820152606401610651565b600954610100900460ff1615610dec57600582600081518110610da457610da4611eda565b6020026020010151610db69190611dce565b610dc1906001611db6565b82600081518110610dd457610dd4611eda565b60200260200101818151610de89190611db6565b9052505b60005b815181101561078757600182511115610e4557610e40838281518110610e1757610e17611eda565b6020026020010151838381518110610e3157610e31611eda565b602002602001015160006113c8565b610e89565b610e8983600081518110610e5b57610e5b611eda565b6020026020010151838381518110610e7557610e75611eda565b6020026020010151610e843390565b6113c8565b80610e9381611e7f565b915050610def565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610ed08261099e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b0316610f825760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610651565b6000610f8d8361099e565b9050806001600160a01b0316846001600160a01b03161480610fc85750836001600160a01b0316610fbd846105dc565b6001600160a01b0316145b80610ff857506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166110138261099e565b6001600160a01b03161461107b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610651565b6001600160a01b0382166110dd5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610651565b6110e8600082610e9b565b6001600160a01b0383166000908152600460205260408120805460019290611111908490611e01565b90915550506001600160a01b038216600090815260046020526040812080546001929061113f908490611db6565b9091555050600081815260036020526040902080546001600160a01b0319166001600160a01b038416179055610787838383611430565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561122a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610651565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6112a2848484611000565b6112ae84848484611476565b610b2d5760405162461bcd60e51b815260040161065190611c89565b6060816112ee5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611318578061130281611e7f565b91506113119050600a83611dce565b91506112f2565b60008167ffffffffffffffff81111561133357611333611ef0565b6040519080825280601f01601f19166020018201604052801561135d576020820181803683370190505b5090505b8415610ff857611372600183611e01565b915061137f600a86611e9a565b61138a906030611db6565b60f81b81838151811061139f5761139f611eda565b60200101906001600160f81b031916908160001a9053506113c1600a86611dce565b9450611361565b6001600160a01b038116156114295760005b83811015610b2d5760016000808282546113f49190611db6565b925050819055506114178360005460405180602001604052806000815250611583565b8061142181611e7f565b9150506113da565b6107878183855b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006001600160a01b0384163b1561157857604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906114ba903390899088908890600401611c39565b602060405180830381600087803b1580156114d457600080fd5b505af1925050508015611504575060408051601f3d908101601f1916820190925261150191810190611aa7565b60015b61155e573d808015611532576040519150601f19603f3d011682016040523d82523d6000602084013e611537565b606091505b5080516115565760405162461bcd60e51b815260040161065190611c89565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610ff8565b506001949350505050565b61158d83836115b6565b61159a6000848484611476565b6107875760405162461bcd60e51b815260040161065190611c89565b6001600160a01b03821661160c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610651565b6000818152600360205260409020546001600160a01b0316156116715760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610651565b6001600160a01b038216600090815260046020526040812080546001929061169a908490611db6565b9091555050600081815260036020526040812080546001600160a01b0319166001600160a01b0385161790556108ea908383611430565b8280546116dd90611e44565b90600052602060002090601f0160209004810192826116ff5760008555611745565b82601f1061171857805160ff1916838001178555611745565b82800160010185558215611745579182015b8281111561174557825182559160200191906001019061172a565b50611751929150611755565b5090565b5b808211156117515760008155600101611756565b600067ffffffffffffffff83111561178457611784611ef0565b611797601f8401601f1916602001611d61565b90508281528383830111156117ab57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146117d957600080fd5b919050565b600082601f8301126117ef57600080fd5b813560206118046117ff83611d92565b611d61565b80838252828201915082860187848660051b890101111561182457600080fd5b60005b8581101561184a57611838826117c2565b84529284019290840190600101611827565b5090979650505050505050565b60006020828403121561186957600080fd5b611872826117c2565b9392505050565b6000806040838503121561188c57600080fd5b611895836117c2565b91506118a3602084016117c2565b90509250929050565b6000806000606084860312156118c157600080fd5b6118ca846117c2565b92506118d8602085016117c2565b9150604084013590509250925092565b600080600080608085870312156118fe57600080fd5b611907856117c2565b9350611915602086016117c2565b925060408501359150606085013567ffffffffffffffff81111561193857600080fd5b8501601f8101871361194957600080fd5b6119588782356020840161176a565b91505092959194509250565b6000806040838503121561197757600080fd5b611980836117c2565b91506020830135801515811461199557600080fd5b809150509250929050565b600080604083850312156119b357600080fd5b6119bc836117c2565b946020939093013593505050565b600080604083850312156119dd57600080fd5b823567ffffffffffffffff808211156119f557600080fd5b818501915085601f830112611a0957600080fd5b81356020611a196117ff83611d92565b8083825282820191508286018a848660051b8901011115611a3957600080fd5b600096505b84871015611a5c578035835260019690960195918301918301611a3e565b5096505086013592505080821115611a7357600080fd5b50611a80858286016117de565b9150509250929050565b600060208284031215611a9c57600080fd5b813561187281611f06565b600060208284031215611ab957600080fd5b815161187281611f06565b600060208284031215611ad657600080fd5b813567ffffffffffffffff811115611aed57600080fd5b8201601f81018413611afe57600080fd5b610ff88482356020840161176a565b600060208284031215611b1f57600080fd5b5035919050565b60008060408385031215611b3957600080fd5b823591506118a3602084016117c2565b60008151808452611b61816020860160208601611e18565b601f01601f19169290920160200192915050565b600084516020611b888285838a01611e18565b855191840191611b9b8184848a01611e18565b8554920191600090600181811c9080831680611bb857607f831692505b858310811415611bd657634e487b7160e01b85526022600452602485fd5b808015611bea5760018114611bfb57611c28565b60ff19851688528388019550611c28565b60008b81526020902060005b85811015611c205781548a820152908401908801611c07565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611c6c90830184611b49565b9695505050505050565b6020815260006118726020830184611b49565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715611d8a57611d8a611ef0565b604052919050565b600067ffffffffffffffff821115611dac57611dac611ef0565b5060051b60200190565b60008219821115611dc957611dc9611eae565b500190565b600082611ddd57611ddd611ec4565b500490565b6000816000190483118215151615611dfc57611dfc611eae565b500290565b600082821015611e1357611e13611eae565b500390565b60005b83811015611e33578181015183820152602001611e1b565b83811115610b2d5750506000910152565b600181811c90821680611e5857607f821691505b60208210811415611e7957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611e9357611e93611eae565b5060010190565b600082611ea957611ea9611ec4565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610cc357600080fdfea264697066735822122043c1c0d4ee85a9070b5e3bc679b0dd2813bd40d93693725adf1b8642f8bad4c964736f6c63430008070033

Deployed Bytecode Sourcemap

35171:2041:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22028:305;;;;;;;;;;-1:-1:-1;22028:305:0;;;;;:::i;:::-;;:::i;:::-;;;8577:14:1;;8570:22;8552:41;;8540:2;8525:18;22028:305:0;;;;;;;;22981:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24540:221::-;;;;;;;;;;-1:-1:-1;24540:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7875:32:1;;;7857:51;;7845:2;7830:18;24540:221:0;7711:203:1;24063:411:0;;;;;;;;;;-1:-1:-1;24063:411:0;;;;;:::i;:::-;;:::i;25290:339::-;;;;;;;;;;-1:-1:-1;25290:339:0;;;;;:::i;:::-;;:::i;35366:33::-;;;;;;;;;;;;;:::i;35297:26::-;;;;;;;;;;-1:-1:-1;35297:26:0;;;;;;;;36389:91;;;;;;;;;;;;;:::i;25700:185::-;;;;;;;;;;-1:-1:-1;25700:185:0;;;;;:::i;:::-;;:::i;36074:111::-;;;;;;;;;;-1:-1:-1;36074:111:0;;;;;:::i;:::-;;:::i;36488:193::-;;;;;;;;;;-1:-1:-1;36488:193:0;;;;;:::i;:::-;;:::i;22667:239::-;;;;;;;;;;-1:-1:-1;22667:239:0;;;;;:::i;:::-;;:::i;35691:97::-;;;;;;;;;;;;;:::i;22397:208::-;;;;;;;;;;-1:-1:-1;22397:208:0;;;;;:::i;:::-;;:::i;:::-;;;16065:25:1;;;16053:2;16038:18;22397:208:0;15919:177:1;19318:103:0;;;;;;;;;;;;;:::i;18667:87::-;;;;;;;;;;-1:-1:-1;18740:6:0;;-1:-1:-1;;;;;18740:6:0;18667:87;;35330:29;;;;;;;;;;-1:-1:-1;35330:29:0;;;;;;;;;;;23150:104;;;;;;;;;;;;;:::i;24833:155::-;;;;;;;;;;-1:-1:-1;24833:155:0;;;;;:::i;:::-;;:::i;25956:328::-;;;;;;;;;;-1:-1:-1;25956:328:0;;;;;:::i;:::-;;:::i;35253:37::-;;;;;;;;;;;;;;;;35796:270;;;;;;;;;;-1:-1:-1;35796:270:0;;;;;:::i;:::-;;:::i;36306:75::-;;;;;;;;;;;;;:::i;25059:164::-;;;;;;;;;;-1:-1:-1;25059:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;25180:25:0;;;25156:4;25180:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25059:164;19576:201;;;;;;;;;;-1:-1:-1;19576:201:0;;;;;:::i;:::-;;:::i;36193:101::-;;;;;;;;;;-1:-1:-1;36193:101:0;;;;;:::i;:::-;;:::i;36695:514::-;;;;;;:::i;:::-;;:::i;22028:305::-;22130:4;-1:-1:-1;;;;;;22167:40:0;;-1:-1:-1;;;22167:40:0;;:105;;-1:-1:-1;;;;;;;22224:48:0;;-1:-1:-1;;;22224:48:0;22167:105;:158;;;-1:-1:-1;;;;;;;;;;1617:40:0;;;22289:36;22147:178;22028:305;-1:-1:-1;;22028:305:0:o;22981:100::-;23035:13;23068:5;23061:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22981:100;:::o;24540:221::-;24616:7;27883:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27883:16:0;24636:73;;;;-1:-1:-1;;;24636:73:0;;12992:2:1;24636:73:0;;;12974:21:1;13031:2;13011:18;;;13004:30;13070:34;13050:18;;;13043:62;-1:-1:-1;;;13121:18:1;;;13114:42;13173:19;;24636:73:0;;;;;;;;;-1:-1:-1;24729:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24729:24:0;;24540:221::o;24063:411::-;24144:13;24160:23;24175:7;24160:14;:23::i;:::-;24144:39;;24208:5;-1:-1:-1;;;;;24202:11:0;:2;-1:-1:-1;;;;;24202:11:0;;;24194:57;;;;-1:-1:-1;;;24194:57:0;;15301:2:1;24194:57:0;;;15283:21:1;15340:2;15320:18;;;15313:30;15379:34;15359:18;;;15352:62;-1:-1:-1;;;15430:18:1;;;15423:31;15471:19;;24194:57:0;15099:397:1;24194:57:0;4275:10;-1:-1:-1;;;;;24286:21:0;;;;:62;;-1:-1:-1;24311:37:0;24328:5;4275:10;25059:164;:::i;24311:37::-;24264:168;;;;-1:-1:-1;;;24264:168:0;;11385:2:1;24264:168:0;;;11367:21:1;11424:2;11404:18;;;11397:30;11463:34;11443:18;;;11436:62;11534:26;11514:18;;;11507:54;11578:19;;24264:168:0;11183:420:1;24264:168:0;24445:21;24454:2;24458:7;24445:8;:21::i;:::-;24133:341;24063:411;;:::o;25290:339::-;25485:41;4275:10;25518:7;25485:18;:41::i;:::-;25477:103;;;;-1:-1:-1;;;25477:103:0;;;;;;;:::i;:::-;25593:28;25603:4;25609:2;25613:7;25593:9;:28::i;35366:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36389:91::-;18740:6;;-1:-1:-1;;;;;18740:6:0;4275:10;18887:23;18879:68;;;;-1:-1:-1;;;18879:68:0;;;;;;;:::i;:::-;36462:10:::1;::::0;;-1:-1:-1;;36448:24:0;::::1;36462:10;::::0;;;::::1;;;36461:11;36448:24:::0;;::::1;;::::0;;36389:91::o;25700:185::-;25838:39;25855:4;25861:2;25865:7;25838:39;;;;;;;;;;;;:16;:39::i;36074:111::-;18740:6;;-1:-1:-1;;;;;18740:6:0;4275:10;18887:23;18879:68;;;;-1:-1:-1;;;18879:68:0;;;;;;;:::i;:::-;36150:27;;::::1;::::0;:16:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;:::-;;36074:111:::0;:::o;36488:193::-;18740:6;;-1:-1:-1;;;;;18740:6:0;4275:10;18887:23;18879:68;;;;-1:-1:-1;;;18879:68:0;;;;;;;:::i;:::-;36583:21:::1;36573:6;:31;;36565:69;;;::::0;-1:-1:-1;;;36565:69:0;;13766:2:1;36565:69:0::1;::::0;::::1;13748:21:1::0;13805:2;13785:18;;;13778:30;13844:27;13824:18;;;13817:55;13889:18;;36565:69:0::1;13564:349:1::0;36565:69:0::1;36645:28;::::0;-1:-1:-1;;;;;36645:20:0;::::1;::::0;:28;::::1;;;::::0;36666:6;;36645:28:::1;::::0;;;36666:6;36645:20;:28;::::1;;;;;;;;;;;;;::::0;::::1;;;;22667:239:::0;22739:7;22775:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22775:16:0;22810:19;22802:73;;;;-1:-1:-1;;;22802:73:0;;12221:2:1;22802:73:0;;;12203:21:1;12260:2;12240:18;;;12233:30;12299:34;12279:18;;;12272:62;-1:-1:-1;;;12350:18:1;;;12343:39;12399:19;;22802:73:0;12019:405:1;35691:97:0;35731:13;35764:16;35757:23;;;;;:::i;22397:208::-;22469:7;-1:-1:-1;;;;;22497:19:0;;22489:74;;;;-1:-1:-1;;;22489:74:0;;11810:2:1;22489:74:0;;;11792:21:1;11849:2;11829:18;;;11822:30;11888:34;11868:18;;;11861:62;-1:-1:-1;;;11939:18:1;;;11932:40;11989:19;;22489:74:0;11608:406:1;22489:74:0;-1:-1:-1;;;;;;22581:16:0;;;;;:9;:16;;;;;;;22397:208::o;19318:103::-;18740:6;;-1:-1:-1;;;;;18740:6:0;4275:10;18887:23;18879:68;;;;-1:-1:-1;;;18879:68:0;;;;;;;:::i;:::-;19383:30:::1;19410:1;19383:18;:30::i;:::-;19318:103::o:0;23150:104::-;23206:13;23239:7;23232:14;;;;;:::i;24833:155::-;24928:52;4275:10;24961:8;24971;24928:18;:52::i;25956:328::-;26131:41;4275:10;26164:7;26131:18;:41::i;:::-;26123:103;;;;-1:-1:-1;;;26123:103:0;;;;;;;:::i;:::-;26237:39;26251:4;26257:2;26261:7;26270:5;26237:13;:39::i;:::-;25956:328;;;;:::o;35796:270::-;27859:4;27883:16;;;:7;:16;;;;;;35869:13;;-1:-1:-1;;;;;27883:16:0;35898:76;;;;-1:-1:-1;;;35898:76:0;;14530:2:1;35898:76:0;;;14512:21:1;14569:2;14549:18;;;14542:30;14608:34;14588:18;;;14581:62;-1:-1:-1;;;14659:18:1;;;14652:45;14714:19;;35898:76:0;14328:411:1;35898:76:0;36016:9;:7;:9::i;:::-;36027:18;:7;:16;:18::i;:::-;36047:9;35999:58;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35985:73;;35796:270;;;:::o;36306:75::-;18740:6;;-1:-1:-1;;;;;18740:6:0;4275:10;18887:23;18879:68;;;;-1:-1:-1;;;18879:68:0;;;;;;;:::i;:::-;36367:6:::1;::::0;;-1:-1:-1;;36357:16:0;::::1;36367:6;::::0;;::::1;36366:7;36357:16;::::0;;36306:75::o;19576:201::-;18740:6;;-1:-1:-1;;;;;18740:6:0;4275:10;18887:23;18879:68;;;;-1:-1:-1;;;18879:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19665:22:0;::::1;19657:73;;;::::0;-1:-1:-1;;;19657:73:0;;9449:2:1;19657:73:0::1;::::0;::::1;9431:21:1::0;9488:2;9468:18;;;9461:30;9527:34;9507:18;;;9500:62;-1:-1:-1;;;9578:18:1;;;9571:36;9624:19;;19657:73:0::1;9247:402:1::0;19657:73:0::1;19741:28;19760:8;19741:18;:28::i;:::-;19576:201:::0;:::o;36193:101::-;18740:6;;-1:-1:-1;;;;;18740:6:0;4275:10;18887:23;18879:68;;;;-1:-1:-1;;;18879:68:0;;;;;;;:::i;:::-;36264:10:::1;:22:::0;36193:101::o;36695:514::-;36799:1;36786:2;:9;:14;36783:237;;36820:6;;;;36817:121;;;36882:6;36889:1;36882:9;;;;;;;;:::i;:::-;;;;;;;36869:10;;:22;;;;:::i;:::-;36856:9;:35;36848:74;;;;-1:-1:-1;;;36848:74:0;;14946:2:1;36848:74:0;;;14928:21:1;14985:2;14965:18;;;14958:30;15024:28;15004:18;;;14997:56;15070:18;;36848:74:0;14744:350:1;36848:74:0;36955:10;;;;;;;36952:54;;;37000:1;36988:6;36995:1;36988:9;;;;;;;;:::i;:::-;;;;;;;:13;;;;:::i;:::-;36980:26;;37005:1;36980:26;:::i;:::-;36967:6;36974:1;36967:9;;;;;;;;:::i;:::-;;;;;;:39;;;;;;;:::i;:::-;;;-1:-1:-1;36952:54:0;37037:9;37033:169;37056:2;:9;37052:1;:13;37033:169;;;37100:1;37087:2;:9;:14;;:100;;37148:39;37158:6;37165:1;37158:9;;;;;;;;:::i;:::-;;;;;;;37169:2;37172:1;37169:5;;;;;;;;:::i;:::-;;;;;;;37184:1;37148:9;:39::i;:::-;37087:100;;;37104:41;37114:6;37121:1;37114:9;;;;;;;;:::i;:::-;;;;;;;37125:2;37128:1;37125:5;;;;;;;;:::i;:::-;;;;;;;37132:12;4275:10;;4195:98;37132:12;37104:9;:41::i;:::-;37067:3;;;;:::i;:::-;;;;37033:169;;32469:174;32544:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32544:29:0;-1:-1:-1;;;;;32544:29:0;;;;;;;;:24;;32598:23;32544:24;32598:14;:23::i;:::-;-1:-1:-1;;;;;32589:46:0;;;;;;;;;;;32469:174;;:::o;28088:348::-;28181:4;27883:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27883:16:0;28198:73;;;;-1:-1:-1;;;28198:73:0;;10972:2:1;28198:73:0;;;10954:21:1;11011:2;10991:18;;;10984:30;11050:34;11030:18;;;11023:62;-1:-1:-1;;;11101:18:1;;;11094:42;11153:19;;28198:73:0;10770:408:1;28198:73:0;28282:13;28298:23;28313:7;28298:14;:23::i;:::-;28282:39;;28351:5;-1:-1:-1;;;;;28340:16:0;:7;-1:-1:-1;;;;;28340:16:0;;:51;;;;28384:7;-1:-1:-1;;;;;28360:31:0;:20;28372:7;28360:11;:20::i;:::-;-1:-1:-1;;;;;28360:31:0;;28340:51;:87;;;-1:-1:-1;;;;;;25180:25:0;;;25156:4;25180:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28395:32;28332:96;28088:348;-1:-1:-1;;;;28088:348:0:o;31307:579::-;31466:4;-1:-1:-1;;;;;31439:31:0;:23;31454:7;31439:14;:23::i;:::-;-1:-1:-1;;;;;31439:31:0;;31431:85;;;;-1:-1:-1;;;31431:85:0;;14120:2:1;31431:85:0;;;14102:21:1;14159:2;14139:18;;;14132:30;14198:34;14178:18;;;14171:62;-1:-1:-1;;;14249:18:1;;;14242:39;14298:19;;31431:85:0;13918:405:1;31431:85:0;-1:-1:-1;;;;;31535:16:0;;31527:65;;;;-1:-1:-1;;;31527:65:0;;10213:2:1;31527:65:0;;;10195:21:1;10252:2;10232:18;;;10225:30;10291:34;10271:18;;;10264:62;-1:-1:-1;;;10342:18:1;;;10335:34;10386:19;;31527:65:0;10011:400:1;31527:65:0;31709:29;31726:1;31730:7;31709:8;:29::i;:::-;-1:-1:-1;;;;;31751:15:0;;;;;;:9;:15;;;;;:20;;31770:1;;31751:15;:20;;31770:1;;31751:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31782:13:0;;;;;;:9;:13;;;;;:18;;31799:1;;31782:13;:18;;31799:1;;31782:18;:::i;:::-;;;;-1:-1:-1;;31811:16:0;;;;:7;:16;;;;;:21;;-1:-1:-1;;;;;;31811:21:0;-1:-1:-1;;;;;31811:21:0;;;;;31845:33;31860:4;31811:21;:16;31845:14;:33::i;19937:191::-;20030:6;;;-1:-1:-1;;;;;20047:17:0;;;-1:-1:-1;;;;;;20047:17:0;;;;;;;20080:40;;20030:6;;;20047:17;20030:6;;20080:40;;20011:16;;20080:40;20000:128;19937:191;:::o;32785:315::-;32940:8;-1:-1:-1;;;;;32931:17:0;:5;-1:-1:-1;;;;;32931:17:0;;;32923:55;;;;-1:-1:-1;;;32923:55:0;;10618:2:1;32923:55:0;;;10600:21:1;10657:2;10637:18;;;10630:30;10696:27;10676:18;;;10669:55;10741:18;;32923:55:0;10416:349:1;32923:55:0;-1:-1:-1;;;;;32989:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;32989:46:0;;;;;;;;;;33051:41;;8552::1;;;33051::0;;8525:18:1;33051:41:0;;;;;;;32785:315;;;:::o;27166:::-;27323:28;27333:4;27339:2;27343:7;27323:9;:28::i;:::-;27370:48;27393:4;27399:2;27403:7;27412:5;27370:22;:48::i;:::-;27362:111;;;;-1:-1:-1;;;27362:111:0;;;;;;;:::i;1898:723::-;1954:13;2175:10;2171:53;;-1:-1:-1;;2202:10:0;;;;;;;;;;;;-1:-1:-1;;;2202:10:0;;;;;1898:723::o;2171:53::-;2249:5;2234:12;2290:78;2297:9;;2290:78;;2323:8;;;;:::i;:::-;;-1:-1:-1;2346:10:0;;-1:-1:-1;2354:2:0;2346:10;;:::i;:::-;;;2290:78;;;2378:19;2410:6;2400:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2400:17:0;;2378:39;;2428:154;2435:10;;2428:154;;2462:11;2472:1;2462:11;;:::i;:::-;;-1:-1:-1;2531:10:0;2539:2;2531:5;:10;:::i;:::-;2518:24;;:2;:24;:::i;:::-;2505:39;;2488:6;2495;2488:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;2488:56:0;;;;;;;;-1:-1:-1;2559:11:0;2568:2;2559:11;;:::i;:::-;;;2428:154;;28778:335;-1:-1:-1;;;;;28862:18:0;;;28859:247;;28902:9;28897:133;28921:6;28917:1;:10;28897:133;;;28966:1;28953:9;;:14;;;;;;;:::i;:::-;;;;;;;;28986:28;28996:2;29000:9;;28986:28;;;;;;;;;;;;:9;:28::i;:::-;28929:3;;;;:::i;:::-;;;;28897:133;;28859:247;29062:32;29077:4;29083:2;29087:6;32223:128;32335:7;32331:2;-1:-1:-1;;;;;32316:27:0;32325:4;-1:-1:-1;;;;;32316:27:0;;;;;;;;;;;32223:128;;;:::o;33665:799::-;33820:4;-1:-1:-1;;;;;33841:13:0;;5413:20;5461:8;33837:620;;33877:72;;-1:-1:-1;;;33877:72:0;;-1:-1:-1;;;;;33877:36:0;;;;;:72;;4275:10;;33928:4;;33934:7;;33943:5;;33877:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33877:72:0;;;;;;;;-1:-1:-1;;33877:72:0;;;;;;;;;;;;:::i;:::-;;;33873:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34119:13:0;;34115:272;;34162:60;;-1:-1:-1;;;34162:60:0;;;;;;;:::i;34115:272::-;34337:6;34331:13;34322:6;34318:2;34314:15;34307:38;33873:529;-1:-1:-1;;;;;;34000:51:0;-1:-1:-1;;;34000:51:0;;-1:-1:-1;33993:58:0;;33837:620;-1:-1:-1;34441:4:0;33665:799;;;;;;:::o;29340:321::-;29470:18;29476:2;29480:7;29470:5;:18::i;:::-;29521:54;29552:1;29556:2;29560:7;29569:5;29521:22;:54::i;:::-;29499:154;;;;-1:-1:-1;;;29499:154:0;;;;;;;:::i;29997:383::-;-1:-1:-1;;;;;30077:16:0;;30069:61;;;;-1:-1:-1;;;30069:61:0;;12631:2:1;30069:61:0;;;12613:21:1;;;12650:18;;;12643:30;12709:34;12689:18;;;12682:62;12761:18;;30069:61:0;12429:356:1;30069:61:0;27859:4;27883:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27883:16:0;:30;30141:58;;;;-1:-1:-1;;;30141:58:0;;9856:2:1;30141:58:0;;;9838:21:1;9895:2;9875:18;;;9868:30;9934;9914:18;;;9907:58;9982:18;;30141:58:0;9654:352:1;30141:58:0;-1:-1:-1;;;;;30270:13:0;;;;;;:9;:13;;;;;:18;;30287:1;;30270:13;:18;;30287:1;;30270:18;:::i;:::-;;;;-1:-1:-1;;30299:16:0;;;;:7;:16;;;;;:21;;-1:-1:-1;;;;;;30299:21:0;-1:-1:-1;;;;;30299:21:0;;;;;30333:39;;30299:21;:16;30333:14;:39::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:679::-;657:5;710:3;703:4;695:6;691:17;687:27;677:55;;728:1;725;718:12;677:55;764:6;751:20;790:4;814:60;830:43;870:2;830:43;:::i;:::-;814:60;:::i;:::-;896:3;920:2;915:3;908:15;948:2;943:3;939:12;932:19;;983:2;975:6;971:15;1035:3;1030:2;1024;1021:1;1017:10;1009:6;1005:23;1001:32;998:41;995:61;;;1052:1;1049;1042:12;995:61;1074:1;1084:169;1098:2;1095:1;1092:9;1084:169;;;1155:23;1174:3;1155:23;:::i;:::-;1143:36;;1199:12;;;;1231;;;;1116:1;1109:9;1084:169;;;-1:-1:-1;1271:5:1;;603:679;-1:-1:-1;;;;;;;603:679:1:o;1287:186::-;1346:6;1399:2;1387:9;1378:7;1374:23;1370:32;1367:52;;;1415:1;1412;1405:12;1367:52;1438:29;1457:9;1438:29;:::i;:::-;1428:39;1287:186;-1:-1:-1;;;1287:186:1:o;1478:260::-;1546:6;1554;1607:2;1595:9;1586:7;1582:23;1578:32;1575:52;;;1623:1;1620;1613:12;1575:52;1646:29;1665:9;1646:29;:::i;:::-;1636:39;;1694:38;1728:2;1717:9;1713:18;1694:38;:::i;:::-;1684:48;;1478:260;;;;;:::o;1743:328::-;1820:6;1828;1836;1889:2;1877:9;1868:7;1864:23;1860:32;1857:52;;;1905:1;1902;1895:12;1857:52;1928:29;1947:9;1928:29;:::i;:::-;1918:39;;1976:38;2010:2;1999:9;1995:18;1976:38;:::i;:::-;1966:48;;2061:2;2050:9;2046:18;2033:32;2023:42;;1743:328;;;;;:::o;2076:666::-;2171:6;2179;2187;2195;2248:3;2236:9;2227:7;2223:23;2219:33;2216:53;;;2265:1;2262;2255:12;2216:53;2288:29;2307:9;2288:29;:::i;:::-;2278:39;;2336:38;2370:2;2359:9;2355:18;2336:38;:::i;:::-;2326:48;;2421:2;2410:9;2406:18;2393:32;2383:42;;2476:2;2465:9;2461:18;2448:32;2503:18;2495:6;2492:30;2489:50;;;2535:1;2532;2525:12;2489:50;2558:22;;2611:4;2603:13;;2599:27;-1:-1:-1;2589:55:1;;2640:1;2637;2630:12;2589:55;2663:73;2728:7;2723:2;2710:16;2705:2;2701;2697:11;2663:73;:::i;:::-;2653:83;;;2076:666;;;;;;;:::o;2747:347::-;2812:6;2820;2873:2;2861:9;2852:7;2848:23;2844:32;2841:52;;;2889:1;2886;2879:12;2841:52;2912:29;2931:9;2912:29;:::i;:::-;2902:39;;2991:2;2980:9;2976:18;2963:32;3038:5;3031:13;3024:21;3017:5;3014:32;3004:60;;3060:1;3057;3050:12;3004:60;3083:5;3073:15;;;2747:347;;;;;:::o;3099:254::-;3167:6;3175;3228:2;3216:9;3207:7;3203:23;3199:32;3196:52;;;3244:1;3241;3234:12;3196:52;3267:29;3286:9;3267:29;:::i;:::-;3257:39;3343:2;3328:18;;;;3315:32;;-1:-1:-1;;;3099:254:1:o;3358:1151::-;3476:6;3484;3537:2;3525:9;3516:7;3512:23;3508:32;3505:52;;;3553:1;3550;3543:12;3505:52;3593:9;3580:23;3622:18;3663:2;3655:6;3652:14;3649:34;;;3679:1;3676;3669:12;3649:34;3717:6;3706:9;3702:22;3692:32;;3762:7;3755:4;3751:2;3747:13;3743:27;3733:55;;3784:1;3781;3774:12;3733:55;3820:2;3807:16;3842:4;3866:60;3882:43;3922:2;3882:43;:::i;3866:60::-;3948:3;3972:2;3967:3;3960:15;4000:2;3995:3;3991:12;3984:19;;4031:2;4027;4023:11;4079:7;4074:2;4068;4065:1;4061:10;4057:2;4053:19;4049:28;4046:41;4043:61;;;4100:1;4097;4090:12;4043:61;4122:1;4113:10;;4132:163;4146:2;4143:1;4140:9;4132:163;;;4203:17;;4191:30;;4164:1;4157:9;;;;;4241:12;;;;4273;;4132:163;;;-1:-1:-1;4314:5:1;-1:-1:-1;;4357:18:1;;4344:32;;-1:-1:-1;;4388:16:1;;;4385:36;;;4417:1;4414;4407:12;4385:36;;4440:63;4495:7;4484:8;4473:9;4469:24;4440:63;:::i;:::-;4430:73;;;3358:1151;;;;;:::o;4514:245::-;4572:6;4625:2;4613:9;4604:7;4600:23;4596:32;4593:52;;;4641:1;4638;4631:12;4593:52;4680:9;4667:23;4699:30;4723:5;4699:30;:::i;4764:249::-;4833:6;4886:2;4874:9;4865:7;4861:23;4857:32;4854:52;;;4902:1;4899;4892:12;4854:52;4934:9;4928:16;4953:30;4977:5;4953:30;:::i;5018:450::-;5087:6;5140:2;5128:9;5119:7;5115:23;5111:32;5108:52;;;5156:1;5153;5146:12;5108:52;5196:9;5183:23;5229:18;5221:6;5218:30;5215:50;;;5261:1;5258;5251:12;5215:50;5284:22;;5337:4;5329:13;;5325:27;-1:-1:-1;5315:55:1;;5366:1;5363;5356:12;5315:55;5389:73;5454:7;5449:2;5436:16;5431:2;5427;5423:11;5389:73;:::i;5473:180::-;5532:6;5585:2;5573:9;5564:7;5560:23;5556:32;5553:52;;;5601:1;5598;5591:12;5553:52;-1:-1:-1;5624:23:1;;5473:180;-1:-1:-1;5473:180:1:o;5658:254::-;5726:6;5734;5787:2;5775:9;5766:7;5762:23;5758:32;5755:52;;;5803:1;5800;5793:12;5755:52;5839:9;5826:23;5816:33;;5868:38;5902:2;5891:9;5887:18;5868:38;:::i;5917:257::-;5958:3;5996:5;5990:12;6023:6;6018:3;6011:19;6039:63;6095:6;6088:4;6083:3;6079:14;6072:4;6065:5;6061:16;6039:63;:::i;:::-;6156:2;6135:15;-1:-1:-1;;6131:29:1;6122:39;;;;6163:4;6118:50;;5917:257;-1:-1:-1;;5917:257:1:o;6179:1527::-;6403:3;6441:6;6435:13;6467:4;6480:51;6524:6;6519:3;6514:2;6506:6;6502:15;6480:51;:::i;:::-;6594:13;;6553:16;;;;6616:55;6594:13;6553:16;6638:15;;;6616:55;:::i;:::-;6760:13;;6693:20;;;6733:1;;6820;6842:18;;;;6895;;;;6922:93;;7000:4;6990:8;6986:19;6974:31;;6922:93;7063:2;7053:8;7050:16;7030:18;7027:40;7024:167;;;-1:-1:-1;;;7090:33:1;;7146:4;7143:1;7136:15;7176:4;7097:3;7164:17;7024:167;7207:18;7234:110;;;;7358:1;7353:328;;;;7200:481;;7234:110;-1:-1:-1;;7269:24:1;;7255:39;;7314:20;;;;-1:-1:-1;7234:110:1;;7353:328;16642:1;16635:14;;;16679:4;16666:18;;7448:1;7462:169;7476:8;7473:1;7470:15;7462:169;;;7558:14;;7543:13;;;7536:37;7601:16;;;;7493:10;;7462:169;;;7466:3;;7662:8;7655:5;7651:20;7644:27;;7200:481;-1:-1:-1;7697:3:1;;6179:1527;-1:-1:-1;;;;;;;;;;;6179:1527:1:o;7919:488::-;-1:-1:-1;;;;;8188:15:1;;;8170:34;;8240:15;;8235:2;8220:18;;8213:43;8287:2;8272:18;;8265:34;;;8335:3;8330:2;8315:18;;8308:31;;;8113:4;;8356:45;;8381:19;;8373:6;8356:45;:::i;:::-;8348:53;7919:488;-1:-1:-1;;;;;;7919:488:1:o;8604:219::-;8753:2;8742:9;8735:21;8716:4;8773:44;8813:2;8802:9;8798:18;8790:6;8773:44;:::i;8828:414::-;9030:2;9012:21;;;9069:2;9049:18;;;9042:30;9108:34;9103:2;9088:18;;9081:62;-1:-1:-1;;;9174:2:1;9159:18;;9152:48;9232:3;9217:19;;8828:414::o;13203:356::-;13405:2;13387:21;;;13424:18;;;13417:30;13483:34;13478:2;13463:18;;13456:62;13550:2;13535:18;;13203:356::o;15501:413::-;15703:2;15685:21;;;15742:2;15722:18;;;15715:30;15781:34;15776:2;15761:18;;15754:62;-1:-1:-1;;;15847:2:1;15832:18;;15825:47;15904:3;15889:19;;15501:413::o;16101:275::-;16172:2;16166:9;16237:2;16218:13;;-1:-1:-1;;16214:27:1;16202:40;;16272:18;16257:34;;16293:22;;;16254:62;16251:88;;;16319:18;;:::i;:::-;16355:2;16348:22;16101:275;;-1:-1:-1;16101:275:1:o;16381:183::-;16441:4;16474:18;16466:6;16463:30;16460:56;;;16496:18;;:::i;:::-;-1:-1:-1;16541:1:1;16537:14;16553:4;16533:25;;16381:183::o;16695:128::-;16735:3;16766:1;16762:6;16759:1;16756:13;16753:39;;;16772:18;;:::i;:::-;-1:-1:-1;16808:9:1;;16695:128::o;16828:120::-;16868:1;16894;16884:35;;16899:18;;:::i;:::-;-1:-1:-1;16933:9:1;;16828:120::o;16953:168::-;16993:7;17059:1;17055;17051:6;17047:14;17044:1;17041:21;17036:1;17029:9;17022:17;17018:45;17015:71;;;17066:18;;:::i;:::-;-1:-1:-1;17106:9:1;;16953:168::o;17126:125::-;17166:4;17194:1;17191;17188:8;17185:34;;;17199:18;;:::i;:::-;-1:-1:-1;17236:9:1;;17126:125::o;17256:258::-;17328:1;17338:113;17352:6;17349:1;17346:13;17338:113;;;17428:11;;;17422:18;17409:11;;;17402:39;17374:2;17367:10;17338:113;;;17469:6;17466:1;17463:13;17460:48;;;-1:-1:-1;;17504:1:1;17486:16;;17479:27;17256:258::o;17519:380::-;17598:1;17594:12;;;;17641;;;17662:61;;17716:4;17708:6;17704:17;17694:27;;17662:61;17769:2;17761:6;17758:14;17738:18;17735:38;17732:161;;;17815:10;17810:3;17806:20;17803:1;17796:31;17850:4;17847:1;17840:15;17878:4;17875:1;17868:15;17732:161;;17519:380;;;:::o;17904:135::-;17943:3;-1:-1:-1;;17964:17:1;;17961:43;;;17984:18;;:::i;:::-;-1:-1:-1;18031:1:1;18020:13;;17904:135::o;18044:112::-;18076:1;18102;18092:35;;18107:18;;:::i;:::-;-1:-1:-1;18141:9:1;;18044:112::o;18161:127::-;18222:10;18217:3;18213:20;18210:1;18203:31;18253:4;18250:1;18243:15;18277:4;18274:1;18267:15;18293:127;18354:10;18349:3;18345:20;18342:1;18335:31;18385:4;18382:1;18375:15;18409:4;18406:1;18399:15;18425:127;18486:10;18481:3;18477:20;18474:1;18467:31;18517:4;18514:1;18507:15;18541:4;18538:1;18531:15;18557:127;18618:10;18613:3;18609:20;18606:1;18599:31;18649:4;18646:1;18639:15;18673:4;18670:1;18663:15;18689:131;-1:-1:-1;;;;;;18763:32:1;;18753:43;;18743:71;;18810:1;18807;18800:12

Swarm Source

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