ETH Price: $3,418.72 (-2.33%)
Gas: 11 Gwei

Token

WACK (WACK)
 

Overview

Max Total Supply

26 WACK

Holders

29

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
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:
WACK

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-02-11
*/

// SPDX-License-Identifier: MIT
/*

██╗    ██╗ █████╗  ██████╗██╗  ██╗██╗
██║    ██║██╔══██╗██╔════╝██║ ██╔╝██║
██║ █╗ ██║███████║██║     █████╔╝ ██║
██║███╗██║██╔══██║██║     ██╔═██╗ ╚═╝
╚███╔███╔╝██║  ██║╚██████╗██║  ██╗██╗
 ╚══╝╚══╝ ╚═╝  ╚═╝ ╚═════╝╚═╝  ╚═╝╚═╝
        By Devko.dev#7286                    
*/
// File: @openzeppelin/contracts/utils/Counters.sol


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC1155/utils/ERC1155Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol)

pragma solidity ^0.8.0;



/**
 * @dev _Available since v3.1._
 */
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);
    }
}

// File: @openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Holder.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
contract ERC1155Holder is ERC1155Receiver {
    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(
        address,
        address,
        uint256[] memory,
        uint256[] memory,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155BatchReceived.selector;
    }
}

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

// File: contract.sol


pragma solidity ^0.8.2;


contract WACK is ERC721, ERC1155Holder, Ownable {
    using Counters for Counters.Counter;
    mapping(uint256 => uint256) public tokenIds;
    using Strings for uint256;
    string private _tokenBaseURI = "https://gateway.pinata.cloud/ipfs/QmbHhnkMmeZ3WPNnZoHr5YqAyHApPhPaAEJth4qqPdAQvk/";
    uint256 public WACK_MAX = 26;
    uint256 public WACK_PRICE = 0.15 ether;
    mapping(address => bool) public WHITELIST;
    bool public mintLive;
    bool public mintWLLive;
    Counters.Counter public _tokensMinted;

    constructor() ERC721("WACK", "WACK") {
        WHITELIST[0xd12BF6b7D7F4D8F8BDe032CD6CDd06aF298A8F7f] = true;
        WHITELIST[0xF1c77f664a05ba2Cb11B00a9583Fec8b85a0d5c2] = true;
        WHITELIST[0x874fd599ea7b6c34FA5DAfd8d08Da89Da0A61B7f] = true;
        WHITELIST[0xA9263191b5cAfcc0BE2C8F72245124472F3C9082] = true;
        WHITELIST[0xc29e526E7F60C9941E8086197c05944f21d85Eb6] = true;
        WHITELIST[0x5C854cd12bf090A604d6f526FaA5Fe07F29Fdb29] = true;
        WHITELIST[0x84C885ceD0010564F6E729A2553A06153B18B917] = true;
        WHITELIST[0x3A8B8d1d156477BF6Fd20f248eF8b2f1d03fB251] = true;
        WHITELIST[0x700e1C20FbB2a273f7dec0Cec6333F99B9141ed3] = true;
        WHITELIST[0x8983ad6D63D7AB3701D74E1E72Fd9DaDF113F3F9] = true;
        WHITELIST[0xD1d6c35052f2c21d3B5652B2C1F50b075E51D842] = true;
        WHITELIST[0x54D031E6e03b4Dc8f8BB318FA5410c46aF063bfD] = true;
        WHITELIST[0xFC8723d8278D470Db2768455b5CB6a876Dd76755] = true;
        WHITELIST[0x76Fb3c5ABe51698f18eB8Cf34B0e6f079Aa273CF] = true;
        WHITELIST[0x5A6fE598c161923d355cb82B4323299894Fab15F] = true;
        WHITELIST[0x85C385dA631F7CF7436304480040d2F36B791336] = true;
        WHITELIST[0xf941F9b6A5ad002C1f40e09510d6a298B0880651] = true;
        WHITELIST[0x87a4Fa61CBF1BEB104a66e096da26229c636efb5] = true;
        WHITELIST[0x60dA1A6e343Ae0269e86395f7fccCd77F6824b67] = true;
        WHITELIST[0x08c3d4a4fE4e28F4ea0402fcCF35D5B81E8f1EC8] = true;
        WHITELIST[0xBAaEac4Dd925D0BA9CD608Dbe3C390e6E4fa2816] = true;
        WHITELIST[0xeA5BF3c40d34AA3397F5306FF7e9A34943cB61E6] = true;
        WHITELIST[0x85400bd71e1a94802E6C9eaD32a6F79b74B6D787] = true;
        WHITELIST[0xf958C5EB003C527488E887605aB55fD76B6B9e88] = true;
        WHITELIST[0xcd5F8Ab0C26639F8fAf89a0D373cD1e7AB18d6eE] = true;
        WHITELIST[0xa949697af62155768Cf95A074738930CB9Cd497C] = true;

        tokenIds[37113267255361574183604483851777514579287633297905833288271730518549422145537] = 174;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730517449910517761] = 173;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730516350398889985] = 172;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730515250887262209] = 171;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730514151375634433] = 170;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730513051864006657] = 169;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730511952352378881] = 168;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730510852840751105] = 167;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730509753329123329] = 166;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730508653817495553] = 165;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730507554305867777] = 164;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730506454794240001] = 163;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730505355282612225] = 162;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730504255770984449] = 161;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730503156259356673] = 160;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730502056747728897] = 159;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730500957236101121] = 158;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730499857724473345] = 157;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730498758212845569] = 156;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730497658701217793] = 155;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730496559189590017] = 154;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730495459677962241] = 153;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730494360166334465] = 152;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730493260654706689] = 151;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730492161143078913] = 150;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730491061631451137] = 149;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730489962119823361] = 148;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730488862608195585] = 147;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730487763096567809] = 146;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730486663584940033] = 145;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730485564073312257] = 144;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730484464561684481] = 143;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730483365050056705] = 142;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730482265538428929] = 141;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730481166026801153] = 140;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730480066515173377] = 139;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730478967003545601] = 138;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730477867491917825] = 137;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730476767980290049] = 136;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730475668468662273] = 135;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730474568957034497] = 134;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730473469445406721] = 133;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730472369933778945] = 132;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730471270422151169] = 131;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730470170910523393] = 130;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730469071398895617] = 129;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730467971887267841] = 128;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730466872375640065] = 127;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730465772864012289] = 126;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730464673352384513] = 125;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730463573840756737] = 124;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730462474329128961] = 123;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730461374817501185] = 122;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730460275305873409] = 121;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730459175794245633] = 120;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730458076282617857] = 119;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730456976770990081] = 118;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730455877259362305] = 117;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730454777747734529] = 116;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730453678236106753] = 115;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730452578724478977] = 114;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730451479212851201] = 113;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730450379701223425] = 112;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730449280189595649] = 111;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730448180677967873] = 110;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730447081166340097] = 109;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730445981654712321] = 108;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730444882143084545] = 107;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730443782631456769] = 106;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730442683119828993] = 105;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730441583608201217] = 104;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730440484096573441] = 103;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730439384584945665] = 102;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730438285073317889] = 101;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730437185561690113] = 100;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730436086050062337] = 99;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730434986538434561] = 98;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730433887026806785] = 97;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730432787515179009] = 96;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730431688003551233] = 95;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730430588491923457] = 94;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730429488980295681] = 93;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730428389468667905] = 92;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730427289957040129] = 91;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730426190445412353] = 90;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730425090933784577] = 89;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730423991422156801] = 88;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730422891910529025] = 87;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730421792398901249] = 86;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730420692887273473] = 85;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730419593375645697] = 84;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730418493864017921] = 83;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730417394352390145] = 82;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730416294840762369] = 81;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730415195329134593] = 80;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730414095817506817] = 79;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730412996305879041] = 78;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730411896794251265] = 77;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730410797282623489] = 76;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730409697770995713] = 75;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730408598259367937] = 74;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730407498747740161] = 73;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730406399236112385] = 72;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730405299724484609] = 71;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730404200212856833] = 70;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730403100701229057] = 69;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730402001189601281] = 68;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730400901677973505] = 67;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730399802166345729] = 66;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730398702654717953] = 65;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730397603143090177] = 64;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730396503631462401] = 63;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730395404119834625] = 62;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730394304608206849] = 61;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730393205096579073] = 60;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730392105584951297] = 59;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730382209980301313] = 58;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730381110468673537] = 57;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730380010957045761] = 56;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730378911445417985] = 55;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730377811933790209] = 54;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730376712422162433] = 53;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730375612910534657] = 52;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730374513398906881] = 51;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730373413887279105] = 50;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730372314375651329] = 49;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730371214864023553] = 48;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730370115352395777] = 47;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730369015840768001] = 46;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730367916329140225] = 45;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730366816817512449] = 44;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730365717305884673] = 43;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730364617794256897] = 42;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730363518282629121] = 41;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730362418771001345] = 40;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730361319259373569] = 39;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730360219747745793] = 38;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730359120236118017] = 37;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730358020724490241] = 36;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730356921212862465] = 35;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730355821701234689] = 34;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730354722189606913] = 33;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730353622677979137] = 32;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730352523166351361] = 30;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730351423654723585] = 31;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730350324143095809] = 29;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730349224631468033] = 28;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730348125119840257] = 27;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730347025608212481] = 26;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730345926096584705] = 25;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730344826584956929] = 24;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730343727073329153] = 23;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730342627561701377] = 22;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730341528050073601] = 21;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730340428538445825] = 20;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730339329026818049] = 19;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730338229515190273] = 18;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730337130003562497] = 16;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730334930980306945] = 17;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730333831468679169] = 15;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730332731957051393] = 14;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730331632445423617] = 13;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730330532933795841] = 12;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730329433422168065] = 11;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730328333910540289] = 10;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730327234398912513] = 9;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730326134887284737] = 8;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730325035375656961] = 7;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730323935864029185] = 6;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730322836352401409] = 5;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730321736840773633] = 4;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730320637329145857] = 3;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730319537817518081] = 2;
        tokenIds[37113267255361574183604483851777514579287633297905833288271730318438305890305] = 1;
    }

    function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC1155Receiver) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    function changeId(uint256 oldId, uint256 newId) external onlyOwner {
            tokenIds[oldId] = newId;
    }

    function onERC1155Received(address, address from, uint256 id, uint256, bytes calldata) public override returns (bytes4) {
        require(msg.sender == 0x495f947276749Ce646f68AC8c248420045cb7b5e, "INVALID_NFT_CONTRACT");
        require(tokenIds[id] > 0, "INVALID_NFT_ID");
        _safeMint(from, tokenIds[id]);
        return this.onERC1155Received.selector;
    }

    function withdraw() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function mint() external payable {
        require(mintLive, "MINT_CLOSED");
        require(_tokensMinted.current() + 1 <= WACK_MAX, "EXCEED_MAX");
        require(WACK_PRICE <= msg.value, "INSUFFICIENT_ETH");
        _tokensMinted.increment();
        _safeMint(msg.sender, _tokensMinted.current() + 174);
    }

    function mintWL() external payable {
        require(mintWLLive, "MINT_CLOSED");
        require(_tokensMinted.current() + 1 <= WACK_MAX, "EXCEED_MAX");
        require(WHITELIST[msg.sender], "NOT_WHITLISED");
        require(WACK_PRICE <= msg.value, "INSUFFICIENT_ETH");
        _tokensMinted.increment();
        _safeMint(msg.sender, _tokensMinted.current() + 174);
    }

    function togglePublicMintStatus() external onlyOwner {
        mintLive = !mintLive;
    }

    function toggleWLMintStatus() external onlyOwner {
        mintWLLive = !mintWLLive;
    }

    function setPrice(uint256 newPrice) external onlyOwner {
        WACK_PRICE = newPrice;
    }

    function setBaseURI(string calldata URI) external onlyOwner {
        _tokenBaseURI = URI;
    }

    function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) {
        require(_exists(tokenId), "Cannot query non-existent token");
        return string(abi.encodePacked(_tokenBaseURI, tokenId.toString()));
    }

    function totalSupply() public view returns (uint256) {
        return _tokensMinted.current();
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"WACK_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WACK_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"WHITELIST","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokensMinted","outputs":[{"internalType":"uint256","name":"_value","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":[{"internalType":"uint256","name":"oldId","type":"uint256"},{"internalType":"uint256","name":"newId","type":"uint256"}],"name":"changeId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintWL","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintWLLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","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":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePublicMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWLMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

61010060405260516080818152906200402660a03980516200002a9160089160209091019062001de5565b50601a600955670214e8348c4f0000600a553480156200004957600080fd5b506040805180820182526004808252635741434b60e01b602080840182815285518087019096529285528401528151919291620000899160009162001de5565b5080516200009f90600190602084019062001de5565b505050620000bc620000b662001d8f60201b60201c565b62001d93565b7f195ec6021ade80101dadd27570348cbf6e16124d50ae7686c47d9e241c493e438054600160ff1991821681179092557f5e5492321319e2611bc22aca9d9001a580c9995730ab1a3fbdc9e3ffd4f1273780548216831790557f46f770465af9c8b375b7ad4393f67e3e5583f1688678c87067dd590d19f4935c80548216831790557f584550ebeffbcbd1cf2bf59ab6c82a34f529b37f2163b88c348615c1514e179780548216831790557fca16a0db3aa649a873c9a0f493028de76f5c18f9373b9fd5f0fe3da14be7a6cd80548216831790557fc6ed5ec69452abaa47bbb3333605d909e1cc8b0ef0401bb8f260f5f80298609980548216831790557f4fc56d8d3809ad4b10fc4177cd57d28a6b255ac29622c9e7c09bbafa41a42fe280548216831790557f78b1cfae859d111dadde11e4933f90d345e86efc3a33040e7bee5c018aa2b32180548216831790557f77b6e02e672b20640df418b3f627a9d35d4f7f254af4ef3c80894a45eacdc5a980548216831790557fd5a993fb16193ceb993c905c05fe79a7795e3caadd18356e765610354b0635c180548216831790557faa91ddade7cd4185389639431f90a7a74bab1596dcd39cbadc0da30bf9975d0a80548216831790557f680277f7ca96b2eda31d2a5a8e40c00b33390e350dffe096e04a8add3361e27480548216831790557f35c30ad03b2deeaeb9e6b4f49ef1c83c871f7366989b26eb5646ef34675a1cd680548216831790557e1e0d782786872c756904e1f48e2dd2398c30ede1b90b7b5e0f94a13c5e05b580548216831790557f1d61fee9bc3f721e6726b878d2b828d6facb50eddfec8fa9be99aadb9748c2bc80548216831790557fad715145581b285dbc4d776be02bd3a42ff6579ed45d5156d4eee93d06b614cb80548216831790557f2173f203e98e23f0aa369a9688854a4ac8690a7bc9b9fd174b2ebd6171d9320c80548216831790557f72355f0f4a7ce23c11ab9a3779e7fd343db6c0d18e8433059dfcce274e0a7c9180548216831790557f1b5606033a6b96176a97fed9ed40def363ae676995b3eb1855165eca5ef7526280548216831790557f50c33f9a0e0501aea51973fcf4a6d6b82d9451183c79840159e7b1038029a37380548216831790557f4d489f6b1a9f7284af82ad7b9dded0683340bfe87de166f8e4491b2dcb7a519a80548216831790557feb4b045df41bdd206980a553370be215b1aaf48f46b67b18c3944e8e2deec19b80548216831790557fdc28a64a8cd0dae8006d47a9e28512dfbe3dd1a6403910fcf20cb726c511569b80548216831790557f6d1771e6cff18c41ab5fe50161caf810f037770330a624db644a8b7410f97bf480548216831790557fbb5a2fc816acaebf97570f5b1f1f1599cb5c0a33245c4ffcb5bf7de5f60baf9580548216831790557f4a59b1560a069f09bbda9955476535d781ff56e09dba12fd141a02c86ab21ddc8054909116821790556007602081815260ae7f4f17cf3fed45015d9d41a223c2a1d1925edac0275bed512d7940f74637be37a05560ad7f6bd35b945e93764596dd79c140ff330f4e867a409418178a66ebd8861b7851925560ac7f7eccedf2c4058ed8e9e6855feb6e2c723b1bddb9d14b9ce12d9cbc7145e36b005560ab7fd6dd77a62fa8937b53f643f80e5ab35c9ecbc0f29b1276af83b790d9202bcef05560aa7f236dd1c74fd308f522874500e09930f1d90c49e84e32bb236eccf2fed862dc845560a97f9fa370374271650eb47ab927964937cb05987fb1b53164f0780ebec51a3d0e655560a87f5dc6579933d2a82e3a1c79753ee88a5a30ec2de82f5e79d44e148afbd2277f8e5560a77f9f639e7721665372b5cd85e5c7f2999f75fc5a8afdd429cedfddeef67f96be0f5560a67fcfc9551fec3c4809ab7b6d516f5f89bf4ab8631ce135b8d068b9c6c483fdbd735560a57f5a57213987818eee270ebc480a476aef0833805e696e9e3765945e33d1fe2eca5560a47f4ed7ea4f0ebd28103f61343f689e57f1b8d7c35531d825ec2228d0aa78917e345560a37f5a937cbed69398887dd7d00b82d1833c39a62e77343e52dc7ba55596ed4872a65560a27f913feb4ca0b06d776e86fb22428697d15023bbbb5caf05089a397c00960727165560a17fb38bb152eedd37eecd8db24879e610106db095d8de582163d6ef2d267fd386a75560a07f944eb6cec3aae1240154e94359141b7ca91adfa191d91aa88748fc7d142a59ce55609f7f9c579400d4fcf8964446b633411606286212335cb8e550bc1d6ba8143a8e714f55609e7f8551551fd94f6ef85099dbd381dc40a808dbc12a774cefde1c82ab57582c60e555609d7f5a0362d2531e8a16a5ece3f875d085957a4ae6b3edb4d0b1cea9d68470e5759055609c7f9dfb737de52f8a7ffbdf5512fa6dcb7316c0372ea916dbe2b0662ed432023a1855609b7fe8137f64f1091bdafee3cf37719ece7c56e6fceab3f3d1ef404c006ea439420d55609a7f08412976e625a9686b1dd979b5de6f79b2581b322d5d3c19942bece9b712db715560997ff85c05c6ac4ed9db30b8db5badb9b2a1dcefc3882a1f709e2835be7902483d4f5560987fbbc8ecef50c62f96b737f2be678bd002f70dcffcf29c49bf313c70549ee2634e5560977f0ac1a27e0ada0cd02c3eb08d709c952b671ccc6a4b0d6f91b71e13f05fbe6e1f5560967fd480de8ab7e6d56c58c2fe87db2f00a2ebb1ca8032e0f8addd016863f7f9708c5560957f33b9daba3fcc461b2e5d3bda81d64f4c4a91976bd44389aa91fda87599d2c67d5560947f7403e2ca57509544215d742182211506e58de25d6cf282486f88fe5e1f4fafc95560937fc9bdfc5b8483c6f6595dc098600957d4c6c5b1453cca877f1466f931bcae94245560927fd7c8103b59ef5d30bee5265bd3daa5c966b0027aa669bc29be99ba16989afd325560917f95599834ee548a76512741f776fdb5b23d45f8d14fcf578017cc1d7a6f8c08075560907f05a6920bc40c0d1b7d1fa187cfd1e4ad11f8e289457b0585f2b52d744ba521b955608f7ffa4859f37f93bf38d87c3573200269f8a4a19572dc6251682c666844ae57bb5555608e7f0129761ada89cece64556ba59fa6e76800b58a419199d6fcb3b7f45972b8601d55608d7fe51cf46f993412ab40d8f30976fdcc881977bdc282bf23b6e14c27d8a4de123155608c7fc76b8dc74ee61b36c0ddde6a6d74fcb562b7285eebd7635d2e1d1f5f52df630555608b7fab75ded308c15e78c46a1be469cb72f025514055a64495394aea53b03c7d10f355608a7f424cceaee77733112c2efed84a32be644a809d4084bc5b5e9460e70cc4a5ecb55560897f2a54dfd3288fef601d58ff9da9957d6e51b81d2cc762b58bf61ab760a2d31c975560887faa03d89397a816c7256e7258e420bce62f6ed6f58786617d58357c04ea3557065560877f5fc74fd63bca83edec597b55a02c2cd792df28e8f6aa7d6c6d041f14ee9f78a55560867fc75b4cb108f657002c9209a4c14e62e3ce39832a906674f42deb691f6ef4100e5560857fb51bb02c49874e132a745dcd12aaf8881d7a01e59df07e5513125d7d0ecdabf45560847fe7126ab3716f34c2f77bba288af73ddf17a4d5bee82d0ac1d2025c4726517ad45560837f992a012783a3091684191ac24a725799c5753c66e0277bc8fa993302e1d5410d5560827fca6b118262d65936dc2d79121340c05249ef2e7c4364bbeedbf4d34df338b7795560817fac5f3361644d72afc2ad559f57e3cc37a42f50fdc59ea19c51706c3256f291b25560807f6ddf86b5c4e364ab46a292177096fd33efb5472b72efa890ec2f0b9911954c4055607f7f1938d433d23d3c6fd80cb1c5109e80d01e065c06892cfca96e4fcacf108bef5b55607e7f86cee46259d81091c4bae5c95ff052e2473b868be09edcd8c8a2c4817dbdaf6755607d7f41537323db7cd559bb34eb317a5fff6b34d3df774b59bf011ee0f61e6f91d14755607c7f7efa211f92d9a3d2746fd0f6c7f200c507b86a61fea28939b7664e94e9160f8855607b7fd42ae61929bbb62e1429cc15d13e2e91670ae1b5f0b07e6f17c8f6858a1ee0ff55607a7f9b4e68b68328e8b12e835ad5c06bfcc8b23d76cdc6116c87f5b0f2f63821a5525560797fae07924bd74a062b98bc57febebcd4bd47888d78a87d26c7fcda159089d5ebb85560787f34b0c36ed67aabf21f2c4042275dd441998ae0f9ad9bbc7bf5c09fa085b5af775560777eefdc6f9cff164a38ff7df8280902790a4723917b64c3fde5457ae4aeed3c725560767fa3b265e6a4f73ed0ed0ac2a73fdf55aa60dfc81111afb1a83dc0088bd266ad305560757fb760a2e0f0834c6693798a06ff471f20253c4daaae6015064db04531fab6a1d15560747f54b29c0bb534becf2ec615b52389f6ddca5523cf4c3e8d233ff9e4807d6187ba5560737ff01171a72a5dfa46527cb51fa6ddc4a3c828c0ea7214be03e37a0d27dd63ceb65560727fd755bb170e51de95ac6f177d7c312de48ceee0f6fc88ae8e0780995976d438305560717fcd50c154eae27d9c84ac74a608a1265bbb08f84b6417dc2e8f8f6a4097990bac5560707f9baa7c8c01e13cbb2a2844af543237bf45a6ba8e9c871bed1bbf516e41a3daa355606f7f3bc319eb3c5733b00f49ee357a8eb2df023edf620607731daa17c49a12ddeb3155606e7f3f35fca0f172e5deb133c3f1f85bb5fdb69ad0d7f9f6bc7a2ebc3c5874ca370455606d7f664441d7a41dabaae9eeee751499fb736096976a60f2af3154487dfe2cbeaec055606c7f2172577fdc2a60d65b0ec3e53d012ff264838da856765b7d118d33e3c820c1df55606b7f7554cdc280162933657e915309c0c859f7379873457dccdae419c2ac659c983855606a7f64dcb653ee31b904b9b0f437cf139d5aeb544280f10c3ebb7a89102568c3da565560697f63d9f374bdf0d73662991199a45750d9a214eb5c2dfc51e4a2b68e6e7870d0335560687f3b73cc811f4d5126f0e0b77f20dfcc3a4568939fa4e3f5823641bb58f4b8d9af5560677f61b2e10fa1f661035cabbbed4d1763f6d33cd17de55222523db9bf78c6852df65560667f3609646efa1d8e32598d902dc1dc3b51433c12913b60b9c0fb14d07ba9be890e5560657f863ae60a9eead4a1fd22c438b6996c2bc5e294dca48b323dacae9de9a19759815560647fe4a264736ee7507aef61ac9d1bd277142272bf03f39662bb28e4ff1a5efc5f505560637f1e6b486fa2b8a25d73b51421a770e9f6d5083cc0699e7c7418da6f1d65b676f55560627fd69d4cebbaf48229983a2f41ef9de80812b9f953683a59ec9a1bf11c69b026fe5560617f9d57f804825690c86bf1545490383a3a20749805d074af19e8738c866537d33b5560607f04ef80483a50f6dd4ee7e82fcdfc8d7d0459b43b98a5b8e3faea407b926dbff455605f7f60bc1745a6adc42075b6aa519a67071f198793b02cc3ff129a5fb80346778e9255605e7fff6f3564941c1c673a6b468e852302107819cb2302fa6d80205d6ef15930847d55605d7f60a2e9d50fbda48ce6d004e0e46b8c7d63ee075734d45306e94d37507cf2dc9855605c7f3168daa161fdcc23b87907afd7c64319c6bfc25f5b5b138c610e1d7b5c2e7f6355605b7f5247f6c94413b7bbacbd843b63cd8f2836dc6b7d1872c68ff5c2886482770e2455605a7f8808b3fb4a9138dafce942f537b86ddd8ff7615b12e3b23f10eae21f4bad81d35560597ff85d1b61834cdb1e6a5c3dafaa4745fc7d6ebfe27ac85869cb57bdc7833f6b975560587f81c666fcd1498a8a419c1df747807dc7f92f956be91c4675bbbe53331d5d4fd45560577f033af4045cde243dd312eb0cd06ecee3552a68cbc4313dcdfc9403edac90c5cf5560567fcc5459fc5df82c2554be69fbefaf123e4bea2ba93329b47807e84334c6eaec935560557f35d7fa6230be674f3ac91f305989fab09e8af5ac486dbd117e954dff43a78b525560547f6fda0d4b1c572dd223b09c2e5cd8cdc65c7fbbccdccab5a35432fdf46eb918e05560537f55985636643e2b37e285ca7537333d62eaa21ad2a75732b5d2a52fc2623fab495560527f51c70099177d704b383b5092346b202041be97e5bdd9e7e7a0a685386e5893ed5560517f7caf220497e98598e57d971c3b441f0d3529e0fc4d9788e60e56e1cc6c8a86075560507f6304518c2ee27889ad4395543905720cc3a169ce5e3d2fffd03fd508a00f93dc55604f7f96710f33d32f0b22135eec91c1309f58e951fdb76a4bdcc506cc41f0385451e755604e7fcde241e2d8866f9fc65c260f4d914fed72c5f9235fcc8aa56db89e8259f035f055604d7f867a6ee4f440a1efd6ee9cf91ec01c7192617c5eaf990d5be4cf4df99d5a293d55604c7f65930c06368887d70b2d7b1de03f41de152e8584e0eac062e4105600263da75955604b7f8bed715a076e8d48bb298baa1b0ee4dc924609cf07f780afcf5607f21a5c336455604a7f016e278100e510eb3b3241abe87e007112ab4980dfa724f7d0a04a1bdfa56ee55560497fa360078b3dccb71bd4643e6af1a848df9f262a6dfb5bf67c480c1703abf55f085560487fa55fa10e24f09f992e582a22472c119976e7332c1fa87b1326bc3179ef52b3065560477f5e3c6b19b8b2fa6a474b61f33afbfdeb23c2bddeeca85bdd58be40bc30c829095560467fa146fd04b5d670c9641254a8a81a1bb9b43ad932c18a5c42dc0de5358ffcf18e5560457ff22e35d90cb158907f35a9247b0df1e6ddc1abf1c233777ccf8d75bfbebb37c15560447f1e2d6a5b0724797767a2cb44beee3e1177d2b3617e968f4dc52f46fe15458d1f5560437f0c688e1c0554c1981f6f494429454643d3dea01c64316bcf6e1e8ae20e5440525560427f3b8113b027045efe5fbb796b3ee23cfdf1f17b8316fc7cce50b29935940bc4495560417f77db839a5d46450346988a14ce5fbcb3eb62c0c7909efa8029f723c24e6db4285560407fc769a7997a04f5cc4a453d72e869919b4d3b2bd6f669810b6f258eb4e12cd80255603f7ff709d7af5a95972ad86900b28154157bd848141f7c853546b20012ff94795e3055603e7fc8e616760bd0d6b26fa19479df43ae379afe1fdfdbe2d300b823174e55784a6355603d7ff1ee3d2a02df45459941e12ca234e56a785db572271e0424ca084868f6446f4b55603c7f8bf2777a3711432035dc8087eab9d19f228fb71e4b541397302b6b3f112621f655603b7fbd29d55864f1b407fd7cb5d0b1008b5dfa513742f260248dbaa921250386e81255603a7f37c7f355fa556db96a226b95928cd4e6c4d086fd68dd98c4ac796ced1fd57abb5560397f60f485995e2a019fd57eebed9a6ae79ec1eb926f420f06c8e5379de0b20e3c1b5560387fb1eeb18c8ce0d3c41dc37c299390abb9c9c56c4aeb0ab372cd5a549fb5720a3e5560377ff69715b739c48d8d4088f2c1a43f3e8136fcbc3270e39c842255b3f380fe4ffa5560367f6b1f9d3e1a0f05d2b18254aa8c405c001256c81925dd8d1b1774c3e944db72725560357f3e2cb3c304d7c924ce929e159dafef1de0091560792f8932712730c071643d815560347f47f5cef00eda5b8ec4c564497ceaf45ef9a204192ca6681df6b9a6a0d34341375560337fce1f803621040c6c265e0d539a03046fb00ed502c1cd89f1beff8dcebdf7768a5560327f8f4908de3143556d371d40c83b1fc8ebb5028ae697313441a8eb695b4e9d61865560317fa06a490957c3ea4ea8e07881653285a49502d9406394382420ca74a208d9dfd45560307f7bf75687f09fac27dc1e0a44885c9e0ab095c0d4342fcf1b686df3df7e5e68c855602f7f57f6cc35562f6d49b545ecc1ac5d04ace733c2d845be57e7f1444dfe41d9822555602e7fac87a3e139fe3f5113131559f36f7fccfdd24a01cd4c30f6edb4aa05f4a2fd2255602d7f6b6da5648b70b946e0f913e72e028f739b931e61093cd698dba047b3af80879c55602c7f1e92b2af6c7130bdef40d11da913b0fc20afa5361a632116e40e9ab8ba16b77f55602b7f0ab4b5fa86630fe86fbf54100e7293a8a0c37ab6394adf548ca53f93442e04c955602a7f6b9f0c79ac3b19f6a6877279288564259abcf1f4c4ff52e8adf8aced52923aeb5560297fe025d74afe484ba17c9499715094ffa4f76ce32aae69aea7193f8871891dedb85560287f58eeee0f91d6b33e49ee79925ef760cad556f0810d29d9d5e3198793266babe15560277ffcf9449761af9a67e379d76740d6a9207abd6a3bff6722891cb925a99d5033a75560267febbd44ed1270df002116dba847c867110f186471908dba2bab3efc79ff5cd7d45560257f66dbc2775b3a6b5a3927bae4cbb072b1377a3a6cdf2061b8de247d8c7c6906c45560247f947d2f50d6f0c1cdb451ae137b265ffe14cabf6b6b7ea608f09feb466e3c5b275560237f392a0183a3df703331064553efa35b8555839144bc0a99df8023d734fe6b175e5560227fa69b65515ec305f7b616372baef93419855b7b51cc3814cc5a456874bfcbcbdf5560217f6903c1528bfd01d86646e9afa29a0e86cce72fdf79b1700a301b6674dda173f7557f3499d286126d2a58f3d069091b5988126b762fbb74feec06cabf8f6db92aaa7c55601e7f2b95ec20d5e84f75ff0f05d282aa3e503b5e1eb8c2a05893a392afa09d35536455601f7f2ff4ec404fc1d16f23ac78536f5709a6a202328133f72114ee704857c364641055601d7faf79e9f87ef19c78799576d190db6212e48a3f617b9271cfeec6fe094fecf0f855601c7f9cc59958b485d8ddcc72a8f60854428d92996ecd5a766e15296f9f346002c77655601b7f7feadfe3e3f74d93559de53acfdfb450b8506ff8a305c6a2efe7e0531288822a55601a7f3325bb12bbd86ee43b9664dde09fe32b30fd0c7335571b009ed3370a232250655560197f580ed90c111d133951ac2318632477286fc0736ec6361efbb9653839e571496a5560187fd7c1059edd6da8eb0b3204a033b7fbf9841481a5503fd7aa490dd592cb669ace5560177f29bbc00a6b2b5a2c8a2bf02e7a67c4c65347d4ec85fb0fc71ff83d0ea0fefe1a5560167fa0d5177b3a9f083dbb86243b0f109bce52dc47f68a28789706f9817e6c283e255560157f6b32f6ff2d6d46d01f30c6a51886962a132758e53eea446df7020358ca3056de5560147f8a018fc56f1aed7e398af0f5f2cf1162d92597ace8ac85dfe5df164f4eaed3515560137fabf7362918a7eab2282007cf8a12b7c2d0676081ca1c81bf68b4e1c5af58692c5560127fc2c2c72c1c57f4de3229626e415d1b4859667e3ec9211c7b65374e83292726795560107f7e8ea3e8063bd89d2be5a3fb0b1a1ded0a4461920c2c11aa4f9bc996d1e1ef495560117fa9dd401d2b0188ae7333eb24bdd92ffd42d0d1f92a3212b857bcb39bfd65948b55600f7f70043b4a22eadfeeed42fffd795622248e63e54b3a90069f351b6bf370412c3455600e7fd2c42ecd582a43d85ccf61bcf122d8c6019029dbe8e7b21d66c3046b5817d90155600d7f4e80faae28779339b51f60bea7ee6d396244ab2850d80979c83b4c4923347fd555600c7f956fa1a3d058c1e2a55a6bd380afba82d50d3cef06dd617e6ffb67110987da4e55600b7fa3c11d0b0eafb12e395aaf544ae61aa06ea657857ce6fbd0f06851d30cf7173755600a7fb7a9ea6e94dfa286743c7b20f59de28d03ab70011e020879e0a5a62d277f45455560097fd33b5febbfccd510147b8a7098901a1fd5f1e4495a0f0c0be656de6c9827847f5560087f6e744d0adee97f9592811ee593fb90c4b79072b8584a7884514bbc1713c210b1557fb0ce2281abfe3ca810553909a49a1f50d0007d5af420ade5cdd4eba829d0880f5560067f4664b307db2618f2ee2912587ee8e5ee477add5a7df0c09f9ddc035547f84dc65560057ff04d907c042781078a14942b728f17a49f1ad9b6a6e7aafdbbca9dd2cb8edef25560047f04c5faf3816eea014b8701fd76f73c7c4c3c7c027a16f763dbc0da5e3f38225b5560037f92983f8dfb38a831d518c859a2a1a345e5d554380982fad9bcc4adfc67e21b595560027fbe6f44bfcd4416a332efb343dc883a854e0532fcfc1d1eefe4e0a59905cee792557f520d5d67c1c64fdccede0fcbf7a3e4648dfd45940000000000002b00000000016000527f42d0582366b73b4588c8f4af5815efca2204b8678d093e0ec74f09553c5807f15562001ec8565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462001df39062001e8b565b90600052602060002090601f01602090048101928262001e17576000855562001e62565b82601f1062001e3257805160ff191683800117855562001e62565b8280016001018555821562001e62579182015b8281111562001e6257825182559160200191906001019062001e45565b5062001e7092915062001e74565b5090565b5b8082111562001e70576000815560010162001e75565b600181811c9082168062001ea057607f821691505b6020821081141562001ec257634e487b7160e01b600052602260045260246000fd5b50919050565b61214e8062001ed86000396000f3fe6080604052600436106101fd5760003560e01c806391b7f5ed1161010d578063bc197c81116100a0578063d58778d61161006f578063d58778d61461058b578063e8656fcc146105b8578063e985e9c5146105d2578063f23a6e611461061b578063f2fde38b1461063b57600080fd5b8063bc197c81146104ee578063bc1c864c14610533578063c87b56dd14610563578063cecd67001461058357600080fd5b8063a22cb465116100dc578063a22cb46514610483578063a819a68e146104a3578063b600ab22146104b9578063b88d4fde146104ce57600080fd5b806391b7f5ed1461042357806395d89b411461044357806397f5ec67146104585780639e4283be1461046d57600080fd5b806342842e0e116101905780636352211e1161015f5780636352211e1461039957806370a08231146103b9578063715018a6146103d95780638d6f5df6146103ee5780638da5cb5b1461040557600080fd5b806342842e0e1461031a5780634db1c7b21461033a5780634f2ca1bc1461035a57806355f804b31461037957600080fd5b80631249c58b116101cc5780631249c58b146102ba57806318160ddd146102c257806323b872dd146102e55780633ccfd60b1461030557600080fd5b806301ffc9a71461020957806306fdde031461023e578063081812fc14610260578063095ea7b31461029857600080fd5b3661020457005b600080fd5b34801561021557600080fd5b50610229610224366004611cd2565b61065b565b60405190151581526020015b60405180910390f35b34801561024a57600080fd5b5061025361066c565b6040516102359190611eb5565b34801561026c57600080fd5b5061028061027b366004611d4e565b6106fe565b6040516001600160a01b039091168152602001610235565b3480156102a457600080fd5b506102b86102b3366004611ca8565b610798565b005b6102b86108ae565b3480156102ce57600080fd5b506102d76109ac565b604051908152602001610235565b3480156102f157600080fd5b506102b8610300366004611b50565b6109bc565b34801561031157600080fd5b506102b86109ed565b34801561032657600080fd5b506102b8610335366004611b50565b610a46565b34801561034657600080fd5b506102b8610355366004611d67565b610a61565b34801561036657600080fd5b50600c5461022990610100900460ff1681565b34801561038557600080fd5b506102b8610394366004611d0c565b610a9d565b3480156103a557600080fd5b506102806103b4366004611d4e565b610ad3565b3480156103c557600080fd5b506102d76103d4366004611a51565b610b4a565b3480156103e557600080fd5b506102b8610bd1565b3480156103fa57600080fd5b50600d546102d79081565b34801561041157600080fd5b506006546001600160a01b0316610280565b34801561042f57600080fd5b506102b861043e366004611d4e565b610c05565b34801561044f57600080fd5b50610253610c34565b34801561046457600080fd5b506102b8610c43565b34801561047957600080fd5b506102d7600a5481565b34801561048f57600080fd5b506102b861049e366004611c6c565b610c81565b3480156104af57600080fd5b506102d760095481565b3480156104c557600080fd5b506102b8610c90565b3480156104da57600080fd5b506102b86104e9366004611b8c565b610cd7565b3480156104fa57600080fd5b5061051a610509366004611aa6565b63bc197c8160e01b95945050505050565b6040516001600160e01b03199091168152602001610235565b34801561053f57600080fd5b5061022961054e366004611a51565b600b6020526000908152604090205460ff1681565b34801561056f57600080fd5b5061025361057e366004611d4e565b610d0f565b6102b8610da8565b34801561059757600080fd5b506102d76105a6366004611d4e565b60076020526000908152604090205481565b3480156105c457600080fd5b50600c546102299060ff1681565b3480156105de57600080fd5b506102296105ed366004611a73565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561062757600080fd5b5061051a610636366004611bf4565b610e88565b34801561064757600080fd5b506102b8610656366004611a51565b610f5d565b600061066682610ff5565b92915050565b60606000805461067b90612040565b80601f01602080910402602001604051908101604052809291908181526020018280546106a790612040565b80156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661077c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006107a382610ad3565b9050806001600160a01b0316836001600160a01b031614156108115760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610773565b336001600160a01b038216148061082d575061082d81336105ed565b61089f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610773565b6108a9838361101a565b505050565b600c5460ff166108ee5760405162461bcd60e51b815260206004820152600b60248201526a1352539517d0d313d4d15160aa1b6044820152606401610773565b600954600d546108ff906001611fd1565b111561093a5760405162461bcd60e51b815260206004820152600a60248201526908ab0868a8a88be9a82b60b31b6044820152606401610773565b34600a54111561097f5760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b6044820152606401610773565b61098d600d80546001019055565b6109aa3361099a600d5490565b6109a59060ae611fd1565b611088565b565b60006109b7600d5490565b905090565b6109c633826110a2565b6109e25760405162461bcd60e51b815260040161077390611f4f565b6108a9838383611199565b6006546001600160a01b03163314610a175760405162461bcd60e51b815260040161077390611f1a565b60405133904780156108fc02916000818181858888f19350505050158015610a43573d6000803e3d6000fd5b50565b6108a983838360405180602001604052806000815250610cd7565b6006546001600160a01b03163314610a8b5760405162461bcd60e51b815260040161077390611f1a565b60009182526007602052604090912055565b6006546001600160a01b03163314610ac75760405162461bcd60e51b815260040161077390611f1a565b6108a96008838361185d565b6000818152600260205260408120546001600160a01b0316806106665760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610773565b60006001600160a01b038216610bb55760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610773565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610bfb5760405162461bcd60e51b815260040161077390611f1a565b6109aa6000611339565b6006546001600160a01b03163314610c2f5760405162461bcd60e51b815260040161077390611f1a565b600a55565b60606001805461067b90612040565b6006546001600160a01b03163314610c6d5760405162461bcd60e51b815260040161077390611f1a565b600c805460ff19811660ff90911615179055565b610c8c33838361138b565b5050565b6006546001600160a01b03163314610cba5760405162461bcd60e51b815260040161077390611f1a565b600c805461ff001981166101009182900460ff1615909102179055565b610ce133836110a2565b610cfd5760405162461bcd60e51b815260040161077390611f4f565b610d098484848461145a565b50505050565b6000818152600260205260409020546060906001600160a01b0316610d765760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e006044820152606401610773565b6008610d818361148d565b604051602001610d92929190611dd1565b6040516020818303038152906040529050919050565b600c54610100900460ff16610ded5760405162461bcd60e51b815260206004820152600b60248201526a1352539517d0d313d4d15160aa1b6044820152606401610773565b600954600d54610dfe906001611fd1565b1115610e395760405162461bcd60e51b815260206004820152600a60248201526908ab0868a8a88be9a82b60b31b6044820152606401610773565b336000908152600b602052604090205460ff1661093a5760405162461bcd60e51b815260206004820152600d60248201526c1393d517d5d21255131254d151609a1b6044820152606401610773565b600073495f947276749ce646f68ac8c248420045cb7b5e3314610ee45760405162461bcd60e51b81526020600482015260146024820152731253959053125117d3919517d0d3d395149050d560621b6044820152606401610773565b600085815260076020526040902054610f305760405162461bcd60e51b815260206004820152600e60248201526d1253959053125117d3919517d25160921b6044820152606401610773565b600085815260076020526040902054610f4a908790611088565b5063f23a6e6160e01b9695505050505050565b6006546001600160a01b03163314610f875760405162461bcd60e51b815260040161077390611f1a565b6001600160a01b038116610fec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610773565b610a4381611339565b60006001600160e01b03198216630271189760e51b148061066657506106668261158b565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061104f82610ad3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610c8c8282604051806020016040528060008152506115db565b6000818152600260205260408120546001600160a01b031661111b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610773565b600061112683610ad3565b9050806001600160a01b0316846001600160a01b031614806111615750836001600160a01b0316611156846106fe565b6001600160a01b0316145b8061119157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166111ac82610ad3565b6001600160a01b0316146112145760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610773565b6001600160a01b0382166112765760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610773565b61128160008261101a565b6001600160a01b03831660009081526003602052604081208054600192906112aa908490611ffd565b90915550506001600160a01b03821660009081526003602052604081208054600192906112d8908490611fd1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156113ed5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610773565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611465848484611199565b6114718484848461160e565b610d095760405162461bcd60e51b815260040161077390611ec8565b6060816114b15750506040805180820190915260018152600360fc1b602082015290565b8160005b81156114db57806114c58161207b565b91506114d49050600a83611fe9565b91506114b5565b60008167ffffffffffffffff8111156114f6576114f66120ec565b6040519080825280601f01601f191660200182016040528015611520576020820181803683370190505b5090505b841561119157611535600183611ffd565b9150611542600a86612096565b61154d906030611fd1565b60f81b818381518110611562576115626120d6565b60200101906001600160f81b031916908160001a905350611584600a86611fe9565b9450611524565b60006001600160e01b031982166380ac58cd60e01b14806115bc57506001600160e01b03198216635b5e139f60e01b145b8061066657506301ffc9a760e01b6001600160e01b0319831614610666565b6115e5838361171b565b6115f2600084848461160e565b6108a95760405162461bcd60e51b815260040161077390611ec8565b60006001600160a01b0384163b1561171057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611652903390899088908890600401611e78565b602060405180830381600087803b15801561166c57600080fd5b505af192505050801561169c575060408051601f3d908101601f1916820190925261169991810190611cef565b60015b6116f6573d8080156116ca576040519150601f19603f3d011682016040523d82523d6000602084013e6116cf565b606091505b5080516116ee5760405162461bcd60e51b815260040161077390611ec8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611191565b506001949350505050565b6001600160a01b0382166117715760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610773565b6000818152600260205260409020546001600160a01b0316156117d65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610773565b6001600160a01b03821660009081526003602052604081208054600192906117ff908490611fd1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461186990612040565b90600052602060002090601f01602090048101928261188b57600085556118d1565b82601f106118a45782800160ff198235161785556118d1565b828001600101855582156118d1579182015b828111156118d15782358255916020019190600101906118b6565b506118dd9291506118e1565b5090565b5b808211156118dd57600081556001016118e2565b80356001600160a01b038116811461190d57600080fd5b919050565b600082601f83011261192357600080fd5b8135602067ffffffffffffffff82111561193f5761193f6120ec565b8160051b61194e828201611fa0565b83815282810190868401838801850189101561196957600080fd5b600093505b8584101561198c57803583526001939093019291840191840161196e565b50979650505050505050565b60008083601f8401126119aa57600080fd5b50813567ffffffffffffffff8111156119c257600080fd5b6020830191508360208285010111156119da57600080fd5b9250929050565b600082601f8301126119f257600080fd5b813567ffffffffffffffff811115611a0c57611a0c6120ec565b611a1f601f8201601f1916602001611fa0565b818152846020838601011115611a3457600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215611a6357600080fd5b611a6c826118f6565b9392505050565b60008060408385031215611a8657600080fd5b611a8f836118f6565b9150611a9d602084016118f6565b90509250929050565b600080600080600060a08688031215611abe57600080fd5b611ac7866118f6565b9450611ad5602087016118f6565b9350604086013567ffffffffffffffff80821115611af257600080fd5b611afe89838a01611912565b94506060880135915080821115611b1457600080fd5b611b2089838a01611912565b93506080880135915080821115611b3657600080fd5b50611b43888289016119e1565b9150509295509295909350565b600080600060608486031215611b6557600080fd5b611b6e846118f6565b9250611b7c602085016118f6565b9150604084013590509250925092565b60008060008060808587031215611ba257600080fd5b611bab856118f6565b9350611bb9602086016118f6565b925060408501359150606085013567ffffffffffffffff811115611bdc57600080fd5b611be8878288016119e1565b91505092959194509250565b60008060008060008060a08789031215611c0d57600080fd5b611c16876118f6565b9550611c24602088016118f6565b94506040870135935060608701359250608087013567ffffffffffffffff811115611c4e57600080fd5b611c5a89828a01611998565b979a9699509497509295939492505050565b60008060408385031215611c7f57600080fd5b611c88836118f6565b915060208301358015158114611c9d57600080fd5b809150509250929050565b60008060408385031215611cbb57600080fd5b611cc4836118f6565b946020939093013593505050565b600060208284031215611ce457600080fd5b8135611a6c81612102565b600060208284031215611d0157600080fd5b8151611a6c81612102565b60008060208385031215611d1f57600080fd5b823567ffffffffffffffff811115611d3657600080fd5b611d4285828601611998565b90969095509350505050565b600060208284031215611d6057600080fd5b5035919050565b60008060408385031215611d7a57600080fd5b50508035926020909101359150565b60008151808452611da1816020860160208601612014565b601f01601f19169290920160200192915050565b60008151611dc7818560208601612014565b9290920192915050565b600080845481600182811c915080831680611ded57607f831692505b6020808410821415611e0d57634e487b7160e01b86526022600452602486fd5b818015611e215760018114611e3257611e5f565b60ff19861689528489019650611e5f565b60008b81526020902060005b86811015611e575781548b820152908501908301611e3e565b505084890196505b505050505050611e6f8185611db5565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611eab90830184611d89565b9695505050505050565b602081526000611a6c6020830184611d89565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715611fc957611fc96120ec565b604052919050565b60008219821115611fe457611fe46120aa565b500190565b600082611ff857611ff86120c0565b500490565b60008282101561200f5761200f6120aa565b500390565b60005b8381101561202f578181015183820152602001612017565b83811115610d095750506000910152565b600181811c9082168061205457607f821691505b6020821081141561207557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561208f5761208f6120aa565b5060010190565b6000826120a5576120a56120c0565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610a4357600080fdfea2646970667358221220796dbf920db422f046f39db51ac736b249e48f3895cfadc7e611c291f014b4a564736f6c6343000807003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d6248686e6b4d6d655a3357504e6e5a6f487235597141794841705068506141454a746834717150644151766b2f

Deployed Bytecode

0x6080604052600436106101fd5760003560e01c806391b7f5ed1161010d578063bc197c81116100a0578063d58778d61161006f578063d58778d61461058b578063e8656fcc146105b8578063e985e9c5146105d2578063f23a6e611461061b578063f2fde38b1461063b57600080fd5b8063bc197c81146104ee578063bc1c864c14610533578063c87b56dd14610563578063cecd67001461058357600080fd5b8063a22cb465116100dc578063a22cb46514610483578063a819a68e146104a3578063b600ab22146104b9578063b88d4fde146104ce57600080fd5b806391b7f5ed1461042357806395d89b411461044357806397f5ec67146104585780639e4283be1461046d57600080fd5b806342842e0e116101905780636352211e1161015f5780636352211e1461039957806370a08231146103b9578063715018a6146103d95780638d6f5df6146103ee5780638da5cb5b1461040557600080fd5b806342842e0e1461031a5780634db1c7b21461033a5780634f2ca1bc1461035a57806355f804b31461037957600080fd5b80631249c58b116101cc5780631249c58b146102ba57806318160ddd146102c257806323b872dd146102e55780633ccfd60b1461030557600080fd5b806301ffc9a71461020957806306fdde031461023e578063081812fc14610260578063095ea7b31461029857600080fd5b3661020457005b600080fd5b34801561021557600080fd5b50610229610224366004611cd2565b61065b565b60405190151581526020015b60405180910390f35b34801561024a57600080fd5b5061025361066c565b6040516102359190611eb5565b34801561026c57600080fd5b5061028061027b366004611d4e565b6106fe565b6040516001600160a01b039091168152602001610235565b3480156102a457600080fd5b506102b86102b3366004611ca8565b610798565b005b6102b86108ae565b3480156102ce57600080fd5b506102d76109ac565b604051908152602001610235565b3480156102f157600080fd5b506102b8610300366004611b50565b6109bc565b34801561031157600080fd5b506102b86109ed565b34801561032657600080fd5b506102b8610335366004611b50565b610a46565b34801561034657600080fd5b506102b8610355366004611d67565b610a61565b34801561036657600080fd5b50600c5461022990610100900460ff1681565b34801561038557600080fd5b506102b8610394366004611d0c565b610a9d565b3480156103a557600080fd5b506102806103b4366004611d4e565b610ad3565b3480156103c557600080fd5b506102d76103d4366004611a51565b610b4a565b3480156103e557600080fd5b506102b8610bd1565b3480156103fa57600080fd5b50600d546102d79081565b34801561041157600080fd5b506006546001600160a01b0316610280565b34801561042f57600080fd5b506102b861043e366004611d4e565b610c05565b34801561044f57600080fd5b50610253610c34565b34801561046457600080fd5b506102b8610c43565b34801561047957600080fd5b506102d7600a5481565b34801561048f57600080fd5b506102b861049e366004611c6c565b610c81565b3480156104af57600080fd5b506102d760095481565b3480156104c557600080fd5b506102b8610c90565b3480156104da57600080fd5b506102b86104e9366004611b8c565b610cd7565b3480156104fa57600080fd5b5061051a610509366004611aa6565b63bc197c8160e01b95945050505050565b6040516001600160e01b03199091168152602001610235565b34801561053f57600080fd5b5061022961054e366004611a51565b600b6020526000908152604090205460ff1681565b34801561056f57600080fd5b5061025361057e366004611d4e565b610d0f565b6102b8610da8565b34801561059757600080fd5b506102d76105a6366004611d4e565b60076020526000908152604090205481565b3480156105c457600080fd5b50600c546102299060ff1681565b3480156105de57600080fd5b506102296105ed366004611a73565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561062757600080fd5b5061051a610636366004611bf4565b610e88565b34801561064757600080fd5b506102b8610656366004611a51565b610f5d565b600061066682610ff5565b92915050565b60606000805461067b90612040565b80601f01602080910402602001604051908101604052809291908181526020018280546106a790612040565b80156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661077c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006107a382610ad3565b9050806001600160a01b0316836001600160a01b031614156108115760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610773565b336001600160a01b038216148061082d575061082d81336105ed565b61089f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610773565b6108a9838361101a565b505050565b600c5460ff166108ee5760405162461bcd60e51b815260206004820152600b60248201526a1352539517d0d313d4d15160aa1b6044820152606401610773565b600954600d546108ff906001611fd1565b111561093a5760405162461bcd60e51b815260206004820152600a60248201526908ab0868a8a88be9a82b60b31b6044820152606401610773565b34600a54111561097f5760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b6044820152606401610773565b61098d600d80546001019055565b6109aa3361099a600d5490565b6109a59060ae611fd1565b611088565b565b60006109b7600d5490565b905090565b6109c633826110a2565b6109e25760405162461bcd60e51b815260040161077390611f4f565b6108a9838383611199565b6006546001600160a01b03163314610a175760405162461bcd60e51b815260040161077390611f1a565b60405133904780156108fc02916000818181858888f19350505050158015610a43573d6000803e3d6000fd5b50565b6108a983838360405180602001604052806000815250610cd7565b6006546001600160a01b03163314610a8b5760405162461bcd60e51b815260040161077390611f1a565b60009182526007602052604090912055565b6006546001600160a01b03163314610ac75760405162461bcd60e51b815260040161077390611f1a565b6108a96008838361185d565b6000818152600260205260408120546001600160a01b0316806106665760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610773565b60006001600160a01b038216610bb55760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610773565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610bfb5760405162461bcd60e51b815260040161077390611f1a565b6109aa6000611339565b6006546001600160a01b03163314610c2f5760405162461bcd60e51b815260040161077390611f1a565b600a55565b60606001805461067b90612040565b6006546001600160a01b03163314610c6d5760405162461bcd60e51b815260040161077390611f1a565b600c805460ff19811660ff90911615179055565b610c8c33838361138b565b5050565b6006546001600160a01b03163314610cba5760405162461bcd60e51b815260040161077390611f1a565b600c805461ff001981166101009182900460ff1615909102179055565b610ce133836110a2565b610cfd5760405162461bcd60e51b815260040161077390611f4f565b610d098484848461145a565b50505050565b6000818152600260205260409020546060906001600160a01b0316610d765760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e006044820152606401610773565b6008610d818361148d565b604051602001610d92929190611dd1565b6040516020818303038152906040529050919050565b600c54610100900460ff16610ded5760405162461bcd60e51b815260206004820152600b60248201526a1352539517d0d313d4d15160aa1b6044820152606401610773565b600954600d54610dfe906001611fd1565b1115610e395760405162461bcd60e51b815260206004820152600a60248201526908ab0868a8a88be9a82b60b31b6044820152606401610773565b336000908152600b602052604090205460ff1661093a5760405162461bcd60e51b815260206004820152600d60248201526c1393d517d5d21255131254d151609a1b6044820152606401610773565b600073495f947276749ce646f68ac8c248420045cb7b5e3314610ee45760405162461bcd60e51b81526020600482015260146024820152731253959053125117d3919517d0d3d395149050d560621b6044820152606401610773565b600085815260076020526040902054610f305760405162461bcd60e51b815260206004820152600e60248201526d1253959053125117d3919517d25160921b6044820152606401610773565b600085815260076020526040902054610f4a908790611088565b5063f23a6e6160e01b9695505050505050565b6006546001600160a01b03163314610f875760405162461bcd60e51b815260040161077390611f1a565b6001600160a01b038116610fec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610773565b610a4381611339565b60006001600160e01b03198216630271189760e51b148061066657506106668261158b565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061104f82610ad3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610c8c8282604051806020016040528060008152506115db565b6000818152600260205260408120546001600160a01b031661111b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610773565b600061112683610ad3565b9050806001600160a01b0316846001600160a01b031614806111615750836001600160a01b0316611156846106fe565b6001600160a01b0316145b8061119157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166111ac82610ad3565b6001600160a01b0316146112145760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610773565b6001600160a01b0382166112765760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610773565b61128160008261101a565b6001600160a01b03831660009081526003602052604081208054600192906112aa908490611ffd565b90915550506001600160a01b03821660009081526003602052604081208054600192906112d8908490611fd1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156113ed5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610773565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611465848484611199565b6114718484848461160e565b610d095760405162461bcd60e51b815260040161077390611ec8565b6060816114b15750506040805180820190915260018152600360fc1b602082015290565b8160005b81156114db57806114c58161207b565b91506114d49050600a83611fe9565b91506114b5565b60008167ffffffffffffffff8111156114f6576114f66120ec565b6040519080825280601f01601f191660200182016040528015611520576020820181803683370190505b5090505b841561119157611535600183611ffd565b9150611542600a86612096565b61154d906030611fd1565b60f81b818381518110611562576115626120d6565b60200101906001600160f81b031916908160001a905350611584600a86611fe9565b9450611524565b60006001600160e01b031982166380ac58cd60e01b14806115bc57506001600160e01b03198216635b5e139f60e01b145b8061066657506301ffc9a760e01b6001600160e01b0319831614610666565b6115e5838361171b565b6115f2600084848461160e565b6108a95760405162461bcd60e51b815260040161077390611ec8565b60006001600160a01b0384163b1561171057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611652903390899088908890600401611e78565b602060405180830381600087803b15801561166c57600080fd5b505af192505050801561169c575060408051601f3d908101601f1916820190925261169991810190611cef565b60015b6116f6573d8080156116ca576040519150601f19603f3d011682016040523d82523d6000602084013e6116cf565b606091505b5080516116ee5760405162461bcd60e51b815260040161077390611ec8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611191565b506001949350505050565b6001600160a01b0382166117715760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610773565b6000818152600260205260409020546001600160a01b0316156117d65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610773565b6001600160a01b03821660009081526003602052604081208054600192906117ff908490611fd1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461186990612040565b90600052602060002090601f01602090048101928261188b57600085556118d1565b82601f106118a45782800160ff198235161785556118d1565b828001600101855582156118d1579182015b828111156118d15782358255916020019190600101906118b6565b506118dd9291506118e1565b5090565b5b808211156118dd57600081556001016118e2565b80356001600160a01b038116811461190d57600080fd5b919050565b600082601f83011261192357600080fd5b8135602067ffffffffffffffff82111561193f5761193f6120ec565b8160051b61194e828201611fa0565b83815282810190868401838801850189101561196957600080fd5b600093505b8584101561198c57803583526001939093019291840191840161196e565b50979650505050505050565b60008083601f8401126119aa57600080fd5b50813567ffffffffffffffff8111156119c257600080fd5b6020830191508360208285010111156119da57600080fd5b9250929050565b600082601f8301126119f257600080fd5b813567ffffffffffffffff811115611a0c57611a0c6120ec565b611a1f601f8201601f1916602001611fa0565b818152846020838601011115611a3457600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215611a6357600080fd5b611a6c826118f6565b9392505050565b60008060408385031215611a8657600080fd5b611a8f836118f6565b9150611a9d602084016118f6565b90509250929050565b600080600080600060a08688031215611abe57600080fd5b611ac7866118f6565b9450611ad5602087016118f6565b9350604086013567ffffffffffffffff80821115611af257600080fd5b611afe89838a01611912565b94506060880135915080821115611b1457600080fd5b611b2089838a01611912565b93506080880135915080821115611b3657600080fd5b50611b43888289016119e1565b9150509295509295909350565b600080600060608486031215611b6557600080fd5b611b6e846118f6565b9250611b7c602085016118f6565b9150604084013590509250925092565b60008060008060808587031215611ba257600080fd5b611bab856118f6565b9350611bb9602086016118f6565b925060408501359150606085013567ffffffffffffffff811115611bdc57600080fd5b611be8878288016119e1565b91505092959194509250565b60008060008060008060a08789031215611c0d57600080fd5b611c16876118f6565b9550611c24602088016118f6565b94506040870135935060608701359250608087013567ffffffffffffffff811115611c4e57600080fd5b611c5a89828a01611998565b979a9699509497509295939492505050565b60008060408385031215611c7f57600080fd5b611c88836118f6565b915060208301358015158114611c9d57600080fd5b809150509250929050565b60008060408385031215611cbb57600080fd5b611cc4836118f6565b946020939093013593505050565b600060208284031215611ce457600080fd5b8135611a6c81612102565b600060208284031215611d0157600080fd5b8151611a6c81612102565b60008060208385031215611d1f57600080fd5b823567ffffffffffffffff811115611d3657600080fd5b611d4285828601611998565b90969095509350505050565b600060208284031215611d6057600080fd5b5035919050565b60008060408385031215611d7a57600080fd5b50508035926020909101359150565b60008151808452611da1816020860160208601612014565b601f01601f19169290920160200192915050565b60008151611dc7818560208601612014565b9290920192915050565b600080845481600182811c915080831680611ded57607f831692505b6020808410821415611e0d57634e487b7160e01b86526022600452602486fd5b818015611e215760018114611e3257611e5f565b60ff19861689528489019650611e5f565b60008b81526020902060005b86811015611e575781548b820152908501908301611e3e565b505084890196505b505050505050611e6f8185611db5565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611eab90830184611d89565b9695505050505050565b602081526000611a6c6020830184611d89565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715611fc957611fc96120ec565b604052919050565b60008219821115611fe457611fe46120aa565b500190565b600082611ff857611ff86120c0565b500490565b60008282101561200f5761200f6120aa565b500390565b60005b8381101561202f578181015183820152602001612017565b83811115610d095750506000910152565b600181811c9082168061205457607f821691505b6020821081141561207557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561208f5761208f6120aa565b5060010190565b6000826120a5576120a56120c0565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610a4357600080fdfea2646970667358221220796dbf920db422f046f39db51ac736b249e48f3895cfadc7e611c291f014b4a564736f6c63430008070033

Deployed Bytecode Sourcemap

42262:22733:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62681:170;;;;;;;;;;-1:-1:-1;62681:170:0;;;;;:::i;:::-;;:::i;:::-;;;9251:14:1;;9244:22;9226:41;;9214:2;9199:18;62681:170:0;;;;;;;;30711:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32270:221::-;;;;;;;;;;-1:-1:-1;32270:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8549:32:1;;;8531:51;;8519:2;8504:18;32270:221:0;8385:203:1;31793:411:0;;;;;;;;;;-1:-1:-1;31793:411:0;;;;;:::i;:::-;;:::i;:::-;;63476:319;;;:::i;64853:102::-;;;;;;;;;;;;;:::i;:::-;;;18239:25:1;;;18227:2;18212:18;64853:102:0;18093:177:1;33020:339:0;;;;;;;;;;-1:-1:-1;33020:339:0;;;;;:::i;:::-;;:::i;63359:109::-;;;;;;;;;;;;;:::i;33430:185::-;;;;;;;;;;-1:-1:-1;33430:185:0;;;;;:::i;:::-;;:::i;62859:113::-;;;;;;;;;;-1:-1:-1;62859:113:0;;;;;:::i;:::-;;:::i;42717:22::-;;;;;;;;;;-1:-1:-1;42717:22:0;;;;;;;;;;;64495:98;;;;;;;;;;-1:-1:-1;64495:98:0;;;;;:::i;:::-;;:::i;30405:239::-;;;;;;;;;;-1:-1:-1;30405:239:0;;;;;:::i;:::-;;:::i;30135:208::-;;;;;;;;;;-1:-1:-1;30135:208:0;;;;;:::i;:::-;;:::i;6885:103::-;;;;;;;;;;;;;:::i;42746:37::-;;;;;;;;;;-1:-1:-1;42746:37:0;;;;;;6234:87;;;;;;;;;;-1:-1:-1;6307:6:0;;-1:-1:-1;;;;;6307:6:0;6234:87;;64392:95;;;;;;;;;;-1:-1:-1;64392:95:0;;;;;:::i;:::-;;:::i;30880:104::-;;;;;;;;;;;;;:::i;64192:92::-;;;;;;;;;;;;;:::i;42597:38::-;;;;;;;;;;;;;;;;32563:155;;;;;;;;;;-1:-1:-1;32563:155:0;;;;;:::i;:::-;;:::i;42562:28::-;;;;;;;;;;;;;;;;64292:92;;;;;;;;;;;;;:::i;33686:328::-;;;;;;;;;;-1:-1:-1;33686:328:0;;;;;:::i;:::-;;:::i;22437:255::-;;;;;;;;;;-1:-1:-1;22437:255:0;;;;;:::i;:::-;-1:-1:-1;;;22437:255:0;;;;;;;;;;;-1:-1:-1;;;;;;9440:33:1;;;9422:52;;9410:2;9395:18;22437:255:0;9278:202:1;42642:41:0;;;;;;;;;;-1:-1:-1;42642:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;64601:244;;;;;;;;;;-1:-1:-1;64601:244:0;;;;;:::i;:::-;;:::i;63803:381::-;;;:::i;42359:43::-;;;;;;;;;;-1:-1:-1;42359:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;42690:20;;;;;;;;;;-1:-1:-1;42690:20:0;;;;;;;;32789:164;;;;;;;;;;-1:-1:-1;32789:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;32910:25:0;;;32886:4;32910:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;32789:164;62980:371;;;;;;;;;;-1:-1:-1;62980:371:0;;;;;:::i;:::-;;:::i;7143:201::-;;;;;;;;;;-1:-1:-1;7143:201:0;;;;;:::i;:::-;;:::i;62681:170::-;62783:4;62807:36;62831:11;62807:23;:36::i;:::-;62800:43;62681:170;-1:-1:-1;;62681:170:0:o;30711:100::-;30765:13;30798:5;30791:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30711:100;:::o;32270:221::-;32346:7;35613:16;;;:7;:16;;;;;;-1:-1:-1;;;;;35613:16:0;32366:73;;;;-1:-1:-1;;;32366:73:0;;15247:2:1;32366:73:0;;;15229:21:1;15286:2;15266:18;;;15259:30;15325:34;15305:18;;;15298:62;-1:-1:-1;;;15376:18:1;;;15369:42;15428:19;;32366:73:0;;;;;;;;;-1:-1:-1;32459:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;32459:24:0;;32270:221::o;31793:411::-;31874:13;31890:23;31905:7;31890:14;:23::i;:::-;31874:39;;31938:5;-1:-1:-1;;;;;31932:11:0;:2;-1:-1:-1;;;;;31932:11:0;;;31924:57;;;;-1:-1:-1;;;31924:57:0;;16791:2:1;31924:57:0;;;16773:21:1;16830:2;16810:18;;;16803:30;16869:34;16849:18;;;16842:62;-1:-1:-1;;;16920:18:1;;;16913:31;16961:19;;31924:57:0;16589:397:1;31924:57:0;5038:10;-1:-1:-1;;;;;32016:21:0;;;;:62;;-1:-1:-1;32041:37:0;32058:5;5038:10;32789:164;:::i;32041:37::-;31994:168;;;;-1:-1:-1;;;31994:168:0;;13640:2:1;31994:168:0;;;13622:21:1;13679:2;13659:18;;;13652:30;13718:34;13698:18;;;13691:62;13789:26;13769:18;;;13762:54;13833:19;;31994:168:0;13438:420:1;31994:168:0;32175:21;32184:2;32188:7;32175:8;:21::i;:::-;31863:341;31793:411;;:::o;63476:319::-;63528:8;;;;63520:32;;;;-1:-1:-1;;;63520:32:0;;11443:2:1;63520:32:0;;;11425:21:1;11482:2;11462:18;;;11455:30;-1:-1:-1;;;11501:18:1;;;11494:41;11552:18;;63520:32:0;11241:335:1;63520:32:0;63602:8;;63571:13;1654:14;63571:27;;63597:1;63571:27;:::i;:::-;:39;;63563:62;;;;-1:-1:-1;;;63563:62:0;;17193:2:1;63563:62:0;;;17175:21:1;17232:2;17212:18;;;17205:30;-1:-1:-1;;;17251:18:1;;;17244:40;17301:18;;63563:62:0;16991:334:1;63563:62:0;63658:9;63644:10;;:23;;63636:52;;;;-1:-1:-1;;;63636:52:0;;17950:2:1;63636:52:0;;;17932:21:1;17989:2;17969:18;;;17962:30;-1:-1:-1;;;18008:18:1;;;18001:46;18064:18;;63636:52:0;17748:340:1;63636:52:0;63699:25;:13;1773:19;;1791:1;1773:19;;;1684:127;63699:25;63735:52;63745:10;63757:23;:13;1654:14;;1562:114;63757:23;:29;;63783:3;63757:29;:::i;:::-;63735:9;:52::i;:::-;63476:319::o;64853:102::-;64897:7;64924:23;:13;1654:14;;1562:114;64924:23;64917:30;;64853:102;:::o;33020:339::-;33215:41;5038:10;33248:7;33215:18;:41::i;:::-;33207:103;;;;-1:-1:-1;;;33207:103:0;;;;;;;:::i;:::-;33323:28;33333:4;33339:2;33343:7;33323:9;:28::i;63359:109::-;6307:6;;-1:-1:-1;;;;;6307:6:0;5038:10;6454:23;6446:68;;;;-1:-1:-1;;;6446:68:0;;;;;;;:::i;:::-;63409:51:::1;::::0;63417:10:::1;::::0;63438:21:::1;63409:51:::0;::::1;;;::::0;::::1;::::0;;;63438:21;63417:10;63409:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;63359:109::o:0;33430:185::-;33568:39;33585:4;33591:2;33595:7;33568:39;;;;;;;;;;;;:16;:39::i;62859:113::-;6307:6;;-1:-1:-1;;;;;6307:6:0;5038:10;6454:23;6446:68;;;;-1:-1:-1;;;6446:68:0;;;;;;;:::i;:::-;62941:15:::1;::::0;;;:8:::1;:15;::::0;;;;;:23;62859:113::o;64495:98::-;6307:6;;-1:-1:-1;;;;;6307:6:0;5038:10;6454:23;6446:68;;;;-1:-1:-1;;;6446:68:0;;;;;;;:::i;:::-;64566:19:::1;:13;64582:3:::0;;64566:19:::1;:::i;30405:239::-:0;30477:7;30513:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30513:16:0;30548:19;30540:73;;;;-1:-1:-1;;;30540:73:0;;14476:2:1;30540:73:0;;;14458:21:1;14515:2;14495:18;;;14488:30;14554:34;14534:18;;;14527:62;-1:-1:-1;;;14605:18:1;;;14598:39;14654:19;;30540:73:0;14274:405:1;30135:208:0;30207:7;-1:-1:-1;;;;;30235:19:0;;30227:74;;;;-1:-1:-1;;;30227:74:0;;14065:2:1;30227:74:0;;;14047:21:1;14104:2;14084:18;;;14077:30;14143:34;14123:18;;;14116:62;-1:-1:-1;;;14194:18:1;;;14187:40;14244:19;;30227:74:0;13863:406:1;30227:74:0;-1:-1:-1;;;;;;30319:16:0;;;;;:9;:16;;;;;;;30135:208::o;6885:103::-;6307:6;;-1:-1:-1;;;;;6307:6:0;5038:10;6454:23;6446:68;;;;-1:-1:-1;;;6446:68:0;;;;;;;:::i;:::-;6950:30:::1;6977:1;6950:18;:30::i;64392:95::-:0;6307:6;;-1:-1:-1;;;;;6307:6:0;5038:10;6454:23;6446:68;;;;-1:-1:-1;;;6446:68:0;;;;;;;:::i;:::-;64458:10:::1;:21:::0;64392:95::o;30880:104::-;30936:13;30969:7;30962:14;;;;;:::i;64192:92::-;6307:6;;-1:-1:-1;;;;;6307:6:0;5038:10;6454:23;6446:68;;;;-1:-1:-1;;;6446:68:0;;;;;;;:::i;:::-;64268:8:::1;::::0;;-1:-1:-1;;64256:20:0;::::1;64268:8;::::0;;::::1;64267:9;64256:20;::::0;;64192:92::o;32563:155::-;32658:52;5038:10;32691:8;32701;32658:18;:52::i;:::-;32563:155;;:::o;64292:92::-;6307:6;;-1:-1:-1;;;;;6307:6:0;5038:10;6454:23;6446:68;;;;-1:-1:-1;;;6446:68:0;;;;;;;:::i;:::-;64366:10:::1;::::0;;-1:-1:-1;;64352:24:0;::::1;64366:10;::::0;;;::::1;;;64365:11;64352:24:::0;;::::1;;::::0;;64292:92::o;33686:328::-;33861:41;5038:10;33894:7;33861:18;:41::i;:::-;33853:103;;;;-1:-1:-1;;;33853:103:0;;;;;;;:::i;:::-;33967:39;33981:4;33987:2;33991:7;34000:5;33967:13;:39::i;:::-;33686:328;;;;:::o;64601:244::-;35589:4;35613:16;;;:7;:16;;;;;;64674:13;;-1:-1:-1;;;;;35613:16:0;64700:60;;;;-1:-1:-1;;;64700:60:0;;16431:2:1;64700:60:0;;;16413:21:1;16470:2;16450:18;;;16443:30;16509:33;16489:18;;;16482:61;16560:18;;64700:60:0;16229:355:1;64700:60:0;64802:13;64817:18;:7;:16;:18::i;:::-;64785:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64771:66;;64601:244;;;:::o;63803:381::-;63857:10;;;;;;;63849:34;;;;-1:-1:-1;;;63849:34:0;;11443:2:1;63849:34:0;;;11425:21:1;11482:2;11462:18;;;11455:30;-1:-1:-1;;;11501:18:1;;;11494:41;11552:18;;63849:34:0;11241:335:1;63849:34:0;63933:8;;63902:13;1654:14;63902:27;;63928:1;63902:27;:::i;:::-;:39;;63894:62;;;;-1:-1:-1;;;63894:62:0;;17193:2:1;63894:62:0;;;17175:21:1;17232:2;17212:18;;;17205:30;-1:-1:-1;;;17251:18:1;;;17244:40;17301:18;;63894:62:0;16991:334:1;63894:62:0;63985:10;63975:21;;;;:9;:21;;;;;;;;63967:47;;;;-1:-1:-1;;;63967:47:0;;12955:2:1;63967:47:0;;;12937:21:1;12994:2;12974:18;;;12967:30;-1:-1:-1;;;13013:18:1;;;13006:43;13066:18;;63967:47:0;12753:337:1;62980:371:0;63092:6;63133:42;63119:10;:56;63111:89;;;;-1:-1:-1;;;63111:89:0;;10330:2:1;63111:89:0;;;10312:21:1;10369:2;10349:18;;;10342:30;-1:-1:-1;;;10388:18:1;;;10381:50;10448:18;;63111:89:0;10128:344:1;63111:89:0;63234:1;63219:12;;;:8;:12;;;;;;63211:43;;;;-1:-1:-1;;;63211:43:0;;13297:2:1;63211:43:0;;;13279:21:1;13336:2;13316:18;;;13309:30;-1:-1:-1;;;13355:18:1;;;13348:44;13409:18;;63211:43:0;13095:338:1;63211:43:0;63281:12;;;;:8;:12;;;;;;63265:29;;63275:4;;63265:9;:29::i;:::-;-1:-1:-1;;;;62980:371:0;;;;;;;;:::o;7143:201::-;6307:6;;-1:-1:-1;;;;;6307:6:0;5038:10;6454:23;6446:68;;;;-1:-1:-1;;;6446:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7232:22:0;::::1;7224:73;;;::::0;-1:-1:-1;;;7224:73:0;;10679:2:1;7224:73:0::1;::::0;::::1;10661:21:1::0;10718:2;10698:18;;;10691:30;10757:34;10737:18;;;10730:62;-1:-1:-1;;;10808:18:1;;;10801:36;10854:19;;7224:73:0::1;10477:402:1::0;7224:73:0::1;7308:28;7327:8;7308:18;:28::i;21699:223::-:0;21801:4;-1:-1:-1;;;;;;21825:49:0;;-1:-1:-1;;;21825:49:0;;:89;;;21878:36;21902:11;21878:23;:36::i;39506:174::-;39581:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;39581:29:0;-1:-1:-1;;;;;39581:29:0;;;;;;;;:24;;39635:23;39581:24;39635:14;:23::i;:::-;-1:-1:-1;;;;;39626:46:0;;;;;;;;;;;39506:174;;:::o;36508:110::-;36584:26;36594:2;36598:7;36584:26;;;;;;;;;;;;:9;:26::i;35818:348::-;35911:4;35613:16;;;:7;:16;;;;;;-1:-1:-1;;;;;35613:16:0;35928:73;;;;-1:-1:-1;;;35928:73:0;;12542:2:1;35928:73:0;;;12524:21:1;12581:2;12561:18;;;12554:30;12620:34;12600:18;;;12593:62;-1:-1:-1;;;12671:18:1;;;12664:42;12723:19;;35928:73:0;12340:408:1;35928:73:0;36012:13;36028:23;36043:7;36028:14;:23::i;:::-;36012:39;;36081:5;-1:-1:-1;;;;;36070:16:0;:7;-1:-1:-1;;;;;36070:16:0;;:51;;;;36114:7;-1:-1:-1;;;;;36090:31:0;:20;36102:7;36090:11;:20::i;:::-;-1:-1:-1;;;;;36090:31:0;;36070:51;:87;;;-1:-1:-1;;;;;;32910:25:0;;;32886:4;32910:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;36125:32;36062:96;35818:348;-1:-1:-1;;;;35818:348:0:o;38810:578::-;38969:4;-1:-1:-1;;;;;38942:31:0;:23;38957:7;38942:14;:23::i;:::-;-1:-1:-1;;;;;38942:31:0;;38934:85;;;;-1:-1:-1;;;38934:85:0;;16021:2:1;38934:85:0;;;16003:21:1;16060:2;16040:18;;;16033:30;16099:34;16079:18;;;16072:62;-1:-1:-1;;;16150:18:1;;;16143:39;16199:19;;38934:85:0;15819:405:1;38934:85:0;-1:-1:-1;;;;;39038:16:0;;39030:65;;;;-1:-1:-1;;;39030:65:0;;11783:2:1;39030:65:0;;;11765:21:1;11822:2;11802:18;;;11795:30;11861:34;11841:18;;;11834:62;-1:-1:-1;;;11912:18:1;;;11905:34;11956:19;;39030:65:0;11581:400:1;39030:65:0;39212:29;39229:1;39233:7;39212:8;:29::i;:::-;-1:-1:-1;;;;;39254:15:0;;;;;;:9;:15;;;;;:20;;39273:1;;39254:15;:20;;39273:1;;39254:20;:::i;:::-;;;;-1:-1:-1;;;;;;;39285:13:0;;;;;;:9;:13;;;;;:18;;39302:1;;39285:13;:18;;39302:1;;39285:18;:::i;:::-;;;;-1:-1:-1;;39314:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;39314:21:0;-1:-1:-1;;;;;39314:21:0;;;;;;;;;39353:27;;39314:16;;39353:27;;;;;;;38810:578;;;:::o;7504:191::-;7597:6;;;-1:-1:-1;;;;;7614:17:0;;;-1:-1:-1;;;;;;7614:17:0;;;;;;;7647:40;;7597:6;;;7614:17;7597:6;;7647:40;;7578:16;;7647:40;7567:128;7504:191;:::o;39822:315::-;39977:8;-1:-1:-1;;;;;39968:17:0;:5;-1:-1:-1;;;;;39968:17:0;;;39960:55;;;;-1:-1:-1;;;39960:55:0;;12188:2:1;39960:55:0;;;12170:21:1;12227:2;12207:18;;;12200:30;12266:27;12246:18;;;12239:55;12311:18;;39960:55:0;11986:349:1;39960:55:0;-1:-1:-1;;;;;40026:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;40026:46:0;;;;;;;;;;40088:41;;9226::1;;;40088::0;;9199:18:1;40088:41:0;;;;;;;39822:315;;;:::o;34896:::-;35053:28;35063:4;35069:2;35073:7;35053:9;:28::i;:::-;35100:48;35123:4;35129:2;35133:7;35142:5;35100:22;:48::i;:::-;35092:111;;;;-1:-1:-1;;;35092:111:0;;;;;;;:::i;2520:723::-;2576:13;2797:10;2793:53;;-1:-1:-1;;2824:10:0;;;;;;;;;;;;-1:-1:-1;;;2824:10:0;;;;;2520:723::o;2793:53::-;2871:5;2856:12;2912:78;2919:9;;2912:78;;2945:8;;;;:::i;:::-;;-1:-1:-1;2968:10:0;;-1:-1:-1;2976:2:0;2968:10;;:::i;:::-;;;2912:78;;;3000:19;3032:6;3022:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3022:17:0;;3000:39;;3050:154;3057:10;;3050:154;;3084:11;3094:1;3084:11;;:::i;:::-;;-1:-1:-1;3153:10:0;3161:2;3153:5;:10;:::i;:::-;3140:24;;:2;:24;:::i;:::-;3127:39;;3110:6;3117;3110:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;3110:56:0;;;;;;;;-1:-1:-1;3181:11:0;3190:2;3181:11;;:::i;:::-;;;3050:154;;29766:305;29868:4;-1:-1:-1;;;;;;29905:40:0;;-1:-1:-1;;;29905:40:0;;:105;;-1:-1:-1;;;;;;;29962:48:0;;-1:-1:-1;;;29962:48:0;29905:105;:158;;;-1:-1:-1;;;;;;;;;;21281:40:0;;;30027:36;21172:157;36845:321;36975:18;36981:2;36985:7;36975:5;:18::i;:::-;37026:54;37057:1;37061:2;37065:7;37074:5;37026:22;:54::i;:::-;37004:154;;;;-1:-1:-1;;;37004:154:0;;;;;;;:::i;40702:799::-;40857:4;-1:-1:-1;;;;;40878:13:0;;8845:20;8893:8;40874:620;;40914:72;;-1:-1:-1;;;40914:72:0;;-1:-1:-1;;;;;40914:36:0;;;;;:72;;5038:10;;40965:4;;40971:7;;40980:5;;40914:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40914:72:0;;;;;;;;-1:-1:-1;;40914:72:0;;;;;;;;;;;;:::i;:::-;;;40910:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41156:13:0;;41152:272;;41199:60;;-1:-1:-1;;;41199:60:0;;;;;;;:::i;41152:272::-;41374:6;41368:13;41359:6;41355:2;41351:15;41344:38;40910:529;-1:-1:-1;;;;;;41037:51:0;-1:-1:-1;;;41037:51:0;;-1:-1:-1;41030:58:0;;40874:620;-1:-1:-1;41478:4:0;40702:799;;;;;;:::o;37502:382::-;-1:-1:-1;;;;;37582:16:0;;37574:61;;;;-1:-1:-1;;;37574:61:0;;14886:2:1;37574:61:0;;;14868:21:1;;;14905:18;;;14898:30;14964:34;14944:18;;;14937:62;15016:18;;37574:61:0;14684:356:1;37574:61:0;35589:4;35613:16;;;:7;:16;;;;;;-1:-1:-1;;;;;35613:16:0;:30;37646:58;;;;-1:-1:-1;;;37646:58:0;;11086:2:1;37646:58:0;;;11068:21:1;11125:2;11105:18;;;11098:30;11164;11144:18;;;11137:58;11212:18;;37646:58:0;10884:352:1;37646:58:0;-1:-1:-1;;;;;37775:13:0;;;;;;:9;:13;;;;;:18;;37792:1;;37775:13;:18;;37792:1;;37775:18;:::i;:::-;;;;-1:-1:-1;;37804:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;37804:21:0;-1:-1:-1;;;;;37804:21:0;;;;;;;;37843:33;;37804:16;;;37843:33;;37804:16;;37843:33;37502:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:723::-;246:5;299:3;292:4;284:6;280:17;276:27;266:55;;317:1;314;307:12;266:55;353:6;340:20;379:4;402:18;398:2;395:26;392:52;;;424:18;;:::i;:::-;470:2;467:1;463:10;493:28;517:2;513;509:11;493:28;:::i;:::-;555:15;;;586:12;;;;618:15;;;652;;;648:24;;645:33;-1:-1:-1;642:53:1;;;691:1;688;681:12;642:53;713:1;704:10;;723:163;737:2;734:1;731:9;723:163;;;794:17;;782:30;;755:1;748:9;;;;;832:12;;;;864;;723:163;;;-1:-1:-1;904:5:1;192:723;-1:-1:-1;;;;;;;192:723:1:o;920:347::-;971:8;981:6;1035:3;1028:4;1020:6;1016:17;1012:27;1002:55;;1053:1;1050;1043:12;1002:55;-1:-1:-1;1076:20:1;;1119:18;1108:30;;1105:50;;;1151:1;1148;1141:12;1105:50;1188:4;1180:6;1176:17;1164:29;;1240:3;1233:4;1224:6;1216;1212:19;1208:30;1205:39;1202:59;;;1257:1;1254;1247:12;1202:59;920:347;;;;;:::o;1272:530::-;1314:5;1367:3;1360:4;1352:6;1348:17;1344:27;1334:55;;1385:1;1382;1375:12;1334:55;1421:6;1408:20;1447:18;1443:2;1440:26;1437:52;;;1469:18;;:::i;:::-;1513:55;1556:2;1537:13;;-1:-1:-1;;1533:27:1;1562:4;1529:38;1513:55;:::i;:::-;1593:2;1584:7;1577:19;1639:3;1632:4;1627:2;1619:6;1615:15;1611:26;1608:35;1605:55;;;1656:1;1653;1646:12;1605:55;1721:2;1714:4;1706:6;1702:17;1695:4;1686:7;1682:18;1669:55;1769:1;1744:16;;;1762:4;1740:27;1733:38;;;;1748:7;1272:530;-1:-1:-1;;;1272:530:1:o;1807:186::-;1866:6;1919:2;1907:9;1898:7;1894:23;1890:32;1887:52;;;1935:1;1932;1925:12;1887:52;1958:29;1977:9;1958:29;:::i;:::-;1948:39;1807:186;-1:-1:-1;;;1807:186:1:o;1998:260::-;2066:6;2074;2127:2;2115:9;2106:7;2102:23;2098:32;2095:52;;;2143:1;2140;2133:12;2095:52;2166:29;2185:9;2166:29;:::i;:::-;2156:39;;2214:38;2248:2;2237:9;2233:18;2214:38;:::i;:::-;2204:48;;1998:260;;;;;:::o;2263:943::-;2417:6;2425;2433;2441;2449;2502:3;2490:9;2481:7;2477:23;2473:33;2470:53;;;2519:1;2516;2509:12;2470:53;2542:29;2561:9;2542:29;:::i;:::-;2532:39;;2590:38;2624:2;2613:9;2609:18;2590:38;:::i;:::-;2580:48;;2679:2;2668:9;2664:18;2651:32;2702:18;2743:2;2735:6;2732:14;2729:34;;;2759:1;2756;2749:12;2729:34;2782:61;2835:7;2826:6;2815:9;2811:22;2782:61;:::i;:::-;2772:71;;2896:2;2885:9;2881:18;2868:32;2852:48;;2925:2;2915:8;2912:16;2909:36;;;2941:1;2938;2931:12;2909:36;2964:63;3019:7;3008:8;2997:9;2993:24;2964:63;:::i;:::-;2954:73;;3080:3;3069:9;3065:19;3052:33;3036:49;;3110:2;3100:8;3097:16;3094:36;;;3126:1;3123;3116:12;3094:36;;3149:51;3192:7;3181:8;3170:9;3166:24;3149:51;:::i;:::-;3139:61;;;2263:943;;;;;;;;:::o;3211:328::-;3288:6;3296;3304;3357:2;3345:9;3336:7;3332:23;3328:32;3325:52;;;3373:1;3370;3363:12;3325:52;3396:29;3415:9;3396:29;:::i;:::-;3386:39;;3444:38;3478:2;3467:9;3463:18;3444:38;:::i;:::-;3434:48;;3529:2;3518:9;3514:18;3501:32;3491:42;;3211:328;;;;;:::o;3544:537::-;3639:6;3647;3655;3663;3716:3;3704:9;3695:7;3691:23;3687:33;3684:53;;;3733:1;3730;3723:12;3684:53;3756:29;3775:9;3756:29;:::i;:::-;3746:39;;3804:38;3838:2;3827:9;3823:18;3804:38;:::i;:::-;3794:48;;3889:2;3878:9;3874:18;3861:32;3851:42;;3944:2;3933:9;3929:18;3916:32;3971:18;3963:6;3960:30;3957:50;;;4003:1;4000;3993:12;3957:50;4026:49;4067:7;4058:6;4047:9;4043:22;4026:49;:::i;:::-;4016:59;;;3544:537;;;;;;;:::o;4086:695::-;4192:6;4200;4208;4216;4224;4232;4285:3;4273:9;4264:7;4260:23;4256:33;4253:53;;;4302:1;4299;4292:12;4253:53;4325:29;4344:9;4325:29;:::i;:::-;4315:39;;4373:38;4407:2;4396:9;4392:18;4373:38;:::i;:::-;4363:48;;4458:2;4447:9;4443:18;4430:32;4420:42;;4509:2;4498:9;4494:18;4481:32;4471:42;;4564:3;4553:9;4549:19;4536:33;4592:18;4584:6;4581:30;4578:50;;;4624:1;4621;4614:12;4578:50;4663:58;4713:7;4704:6;4693:9;4689:22;4663:58;:::i;:::-;4086:695;;;;-1:-1:-1;4086:695:1;;-1:-1:-1;4086:695:1;;4740:8;;4086:695;-1:-1:-1;;;4086:695:1:o;4786:347::-;4851:6;4859;4912:2;4900:9;4891:7;4887:23;4883:32;4880:52;;;4928:1;4925;4918:12;4880:52;4951:29;4970:9;4951:29;:::i;:::-;4941:39;;5030:2;5019:9;5015:18;5002:32;5077:5;5070:13;5063:21;5056:5;5053:32;5043:60;;5099:1;5096;5089:12;5043:60;5122:5;5112:15;;;4786:347;;;;;:::o;5138:254::-;5206:6;5214;5267:2;5255:9;5246:7;5242:23;5238:32;5235:52;;;5283:1;5280;5273:12;5235:52;5306:29;5325:9;5306:29;:::i;:::-;5296:39;5382:2;5367:18;;;;5354:32;;-1:-1:-1;;;5138:254:1:o;5397:245::-;5455:6;5508:2;5496:9;5487:7;5483:23;5479:32;5476:52;;;5524:1;5521;5514:12;5476:52;5563:9;5550:23;5582:30;5606:5;5582:30;:::i;5647:249::-;5716:6;5769:2;5757:9;5748:7;5744:23;5740:32;5737:52;;;5785:1;5782;5775:12;5737:52;5817:9;5811:16;5836:30;5860:5;5836:30;:::i;5901:410::-;5972:6;5980;6033:2;6021:9;6012:7;6008:23;6004:32;6001:52;;;6049:1;6046;6039:12;6001:52;6089:9;6076:23;6122:18;6114:6;6111:30;6108:50;;;6154:1;6151;6144:12;6108:50;6193:58;6243:7;6234:6;6223:9;6219:22;6193:58;:::i;:::-;6270:8;;6167:84;;-1:-1:-1;5901:410:1;-1:-1:-1;;;;5901:410:1:o;6316:180::-;6375:6;6428:2;6416:9;6407:7;6403:23;6399:32;6396:52;;;6444:1;6441;6434:12;6396:52;-1:-1:-1;6467:23:1;;6316:180;-1:-1:-1;6316:180:1:o;6501:248::-;6569:6;6577;6630:2;6618:9;6609:7;6605:23;6601:32;6598:52;;;6646:1;6643;6636:12;6598:52;-1:-1:-1;;6669:23:1;;;6739:2;6724:18;;;6711:32;;-1:-1:-1;6501:248:1:o;6754:257::-;6795:3;6833:5;6827:12;6860:6;6855:3;6848:19;6876:63;6932:6;6925:4;6920:3;6916:14;6909:4;6902:5;6898:16;6876:63;:::i;:::-;6993:2;6972:15;-1:-1:-1;;6968:29:1;6959:39;;;;7000:4;6955:50;;6754:257;-1:-1:-1;;6754:257:1:o;7016:185::-;7058:3;7096:5;7090:12;7111:52;7156:6;7151:3;7144:4;7137:5;7133:16;7111:52;:::i;:::-;7179:16;;;;;7016:185;-1:-1:-1;;7016:185:1:o;7206:1174::-;7382:3;7411:1;7444:6;7438:13;7474:3;7496:1;7524:9;7520:2;7516:18;7506:28;;7584:2;7573:9;7569:18;7606;7596:61;;7650:4;7642:6;7638:17;7628:27;;7596:61;7676:2;7724;7716:6;7713:14;7693:18;7690:38;7687:165;;;-1:-1:-1;;;7751:33:1;;7807:4;7804:1;7797:15;7837:4;7758:3;7825:17;7687:165;7868:18;7895:104;;;;8013:1;8008:320;;;;7861:467;;7895:104;-1:-1:-1;;7928:24:1;;7916:37;;7973:16;;;;-1:-1:-1;7895:104:1;;8008:320;18628:1;18621:14;;;18665:4;18652:18;;8103:1;8117:165;8131:6;8128:1;8125:13;8117:165;;;8209:14;;8196:11;;;8189:35;8252:16;;;;8146:10;;8117:165;;;8121:3;;8311:6;8306:3;8302:16;8295:23;;7861:467;;;;;;;8344:30;8370:3;8362:6;8344:30;:::i;:::-;8337:37;7206:1174;-1:-1:-1;;;;;7206:1174:1:o;8593:488::-;-1:-1:-1;;;;;8862:15:1;;;8844:34;;8914:15;;8909:2;8894:18;;8887:43;8961:2;8946:18;;8939:34;;;9009:3;9004:2;8989:18;;8982:31;;;8787:4;;9030:45;;9055:19;;9047:6;9030:45;:::i;:::-;9022:53;8593:488;-1:-1:-1;;;;;;8593:488:1:o;9485:219::-;9634:2;9623:9;9616:21;9597:4;9654:44;9694:2;9683:9;9679:18;9671:6;9654:44;:::i;9709:414::-;9911:2;9893:21;;;9950:2;9930:18;;;9923:30;9989:34;9984:2;9969:18;;9962:62;-1:-1:-1;;;10055:2:1;10040:18;;10033:48;10113:3;10098:19;;9709:414::o;15458:356::-;15660:2;15642:21;;;15679:18;;;15672:30;15738:34;15733:2;15718:18;;15711:62;15805:2;15790:18;;15458:356::o;17330:413::-;17532:2;17514:21;;;17571:2;17551:18;;;17544:30;17610:34;17605:2;17590:18;;17583:62;-1:-1:-1;;;17676:2:1;17661:18;;17654:47;17733:3;17718:19;;17330:413::o;18275:275::-;18346:2;18340:9;18411:2;18392:13;;-1:-1:-1;;18388:27:1;18376:40;;18446:18;18431:34;;18467:22;;;18428:62;18425:88;;;18493:18;;:::i;:::-;18529:2;18522:22;18275:275;;-1:-1:-1;18275:275:1:o;18681:128::-;18721:3;18752:1;18748:6;18745:1;18742:13;18739:39;;;18758:18;;:::i;:::-;-1:-1:-1;18794:9:1;;18681:128::o;18814:120::-;18854:1;18880;18870:35;;18885:18;;:::i;:::-;-1:-1:-1;18919:9:1;;18814:120::o;18939:125::-;18979:4;19007:1;19004;19001:8;18998:34;;;19012:18;;:::i;:::-;-1:-1:-1;19049:9:1;;18939:125::o;19069:258::-;19141:1;19151:113;19165:6;19162:1;19159:13;19151:113;;;19241:11;;;19235:18;19222:11;;;19215:39;19187:2;19180:10;19151:113;;;19282:6;19279:1;19276:13;19273:48;;;-1:-1:-1;;19317:1:1;19299:16;;19292:27;19069:258::o;19332:380::-;19411:1;19407:12;;;;19454;;;19475:61;;19529:4;19521:6;19517:17;19507:27;;19475:61;19582:2;19574:6;19571:14;19551:18;19548:38;19545:161;;;19628:10;19623:3;19619:20;19616:1;19609:31;19663:4;19660:1;19653:15;19691:4;19688:1;19681:15;19545:161;;19332:380;;;:::o;19717:135::-;19756:3;-1:-1:-1;;19777:17:1;;19774:43;;;19797:18;;:::i;:::-;-1:-1:-1;19844:1:1;19833:13;;19717:135::o;19857:112::-;19889:1;19915;19905:35;;19920:18;;:::i;:::-;-1:-1:-1;19954:9:1;;19857:112::o;19974:127::-;20035:10;20030:3;20026:20;20023:1;20016:31;20066:4;20063:1;20056:15;20090:4;20087:1;20080:15;20106:127;20167:10;20162:3;20158:20;20155:1;20148:31;20198:4;20195:1;20188:15;20222:4;20219:1;20212:15;20238:127;20299:10;20294:3;20290:20;20287:1;20280:31;20330:4;20327:1;20320:15;20354:4;20351:1;20344:15;20370:127;20431:10;20426:3;20422:20;20419:1;20412:31;20462:4;20459:1;20452:15;20486:4;20483:1;20476:15;20502:131;-1:-1:-1;;;;;;20576:32:1;;20566:43;;20556:71;;20623:1;20620;20613:12

Swarm Source

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